Class IQDiscoItemsHandler
- java.lang.Object
-
- org.jivesoftware.openfire.container.BasicModule
-
- org.jivesoftware.openfire.handler.IQHandler
-
- org.jivesoftware.openfire.disco.IQDiscoItemsHandler
-
- All Implemented Interfaces:
ChannelHandler
,ClusterEventListener
,Module
,ServerFeaturesProvider
,UserItemsProvider
public class IQDiscoItemsHandler extends IQHandler implements ServerFeaturesProvider, ClusterEventListener, UserItemsProvider
IQDiscoItemsHandler is responsible for handling disco#items requests. This class holds a map with the main entities and the associated DiscoItemsProvider. We are considering the host of the recipient JIDs as main entities. It's the DiscoItemsProvider responsibility to provide the items associated with the JID's name together with any possible requested node.For example, let's have in the entities map the following entries: "localhost" and "conference.localhost". Associated with each entry we have different DiscoItemsProvider. Now we receive a disco#items request for the following JID: "room@conference.localhost" which is a disco request for a MUC room. So IQDiscoItemsHandler will look for the DiscoItemsProvider associated with the JID's host which in this case is "conference.localhost". Once we have located the provider we will delegate to the provider the responsibility to provide the items specific to the JID's name which in this case is "room". Depending on the implementation, the items could be the list of existing occupants if that information is publicly available. Finally, after we have collected all the items provided by the provider we will add them to the reply. On the other hand, if no provider was found or the provider has no information for the requested name/node then a not-found error will be returned.
Publishing of client items is still not supported.
- Author:
- Gaston Dombiak
-
-
Field Summary
Fields Modifier and Type Field Description static String
NAMESPACE_DISCO_ITEMS
-
Fields inherited from class org.jivesoftware.openfire.handler.IQHandler
deliverer, sessionManager
-
-
Constructor Summary
Constructors Constructor Description IQDiscoItemsHandler()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addComponentItem(String jid, String name)
Registers a new disco item for a component.void
addComponentItem(String jid, String node, String name)
Registers a new disco item for a component.void
addServerItemsProvider(ServerItemsProvider provider)
Adds the items provided by the new service that implements the ServerItemsProvider interface.void
addUserItemsProvider(UserItemsProvider provider)
Adds the items provided by the new service that implements the UserItemsProvider interface.Iterator<String>
getFeatures()
Returns an Iterator (of String) with the supported features by the server.IQHandlerInfo
getInfo()
Returns the handler information to help generically handle IQ packets.List<DiscoItem>
getServerItems()
Returns all server items.Iterator<org.dom4j.Element>
getUserItems(String name, org.xmpp.packet.JID senderJID)
Returns an Iterator (of Element) with the target entity's items or null if none.org.xmpp.packet.IQ
handleIQ(org.xmpp.packet.IQ packet)
Handles the received IQ packet.void
initialize(XMPPServer server)
Initializes the basic module.void
joinedCluster()
Notification event indicating that this JVM is now part of a cluster.void
joinedCluster(byte[] nodeID)
Notification event indicating that another JVM is now part of a cluster.void
leftCluster()
Notification event indicating that this JVM is no longer part of the cluster.void
leftCluster(byte[] nodeID)
Notification event indicating that another JVM is no longer part of the cluster.void
markedAsSeniorClusterMember()
Notification event indicating that this JVM is now the senior cluster member.Optional<org.xmpp.packet.IQ>
processNoSuchUserCheck(org.xmpp.packet.IQ stanza)
XEP-0030 Section 8 contradict RFC 6121 8.5.1.void
removeComponentItem(String jid)
Removes a disco item for a component that has been removed from the server.protected void
removeProvider(String name)
Removes the DiscoItemsProvider related to a given entity.void
removeServerItemsProvider(ServerItemsProvider provider)
Removes the provided items as a service of the service.void
removeServerNodeInfoProvider(String node)
Removes the DiscoItemsProvider to use when a disco#items packet is sent to the server itself and the specified node.void
removeUserItemsProvider(UserItemsProvider provider)
Removes the UserItemsProviderprotected void
setProvider(String name, DiscoItemsProvider provider)
Sets that a given DiscoItemsProvider will provide the items related to a given entity.void
setServerNodeInfoProvider(String node, DiscoItemsProvider provider)
Sets the DiscoItemsProvider to use when a disco#items packet is sent to the server itself and the specified node.void
start()
Starts the basic module.-
Methods inherited from class org.jivesoftware.openfire.handler.IQHandler
performNoSuchUserCheck, process
-
Methods inherited from class org.jivesoftware.openfire.container.BasicModule
destroy, getName, stop
-
-
-
-
Field Detail
-
NAMESPACE_DISCO_ITEMS
public static final String NAMESPACE_DISCO_ITEMS
- See Also:
- Constant Field Values
-
-
Method Detail
-
getInfo
public IQHandlerInfo getInfo()
Description copied from class:IQHandler
Returns the handler information to help generically handle IQ packets. IQHandlers that aren't local server iq handlers (e.g. chatbots, transports, etc) returnnull
.
-
processNoSuchUserCheck
public Optional<org.xmpp.packet.IQ> processNoSuchUserCheck(org.xmpp.packet.IQ stanza)
XEP-0030 Section 8 contradict RFC 6121 8.5.1. "No Such User" in its definition on how the server must respond to a request made against a non-existing user. This method overrides the default implementation of RFC 6121's definition (from the super class) with that of XEP-0030:The following rules apply to the handling of service discovery requests sent to bare JIDs: [...] In response to a disco#items request, the server MUST return an empty result set if: [...] The target entity does not exist (no matter if the request specifies a node or not).
- Overrides:
processNoSuchUserCheck
in classIQHandler
- See Also:
- XEP-0030 8 "Security Considerations", RFC 6121 8.5.1. "No Such User", OF-880
-
handleIQ
public org.xmpp.packet.IQ handleIQ(org.xmpp.packet.IQ packet)
Description copied from class:IQHandler
Handles the received IQ packet.
-
setProvider
protected void setProvider(String name, DiscoItemsProvider provider)
Sets that a given DiscoItemsProvider will provide the items related to a given entity. This message must be used when new modules (e.g. MUC) are implemented and need to provide the items related to them.- Parameters:
name
- the name of the entity.provider
- the DiscoItemsProvider that will provide the entity's items.
-
removeProvider
protected void removeProvider(String name)
Removes the DiscoItemsProvider related to a given entity.- Parameters:
name
- the name of the entity.
-
addServerItemsProvider
public void addServerItemsProvider(ServerItemsProvider provider)
Adds the items provided by the new service that implements the ServerItemsProvider interface. This information will be used whenever a disco for items is made against the server (i.e. the packet's target is the server). Example of item is: <item jid='conference.localhost' name='Public chatrooms'/>- Parameters:
provider
- the ServerItemsProvider that provides new server items.
-
removeServerItemsProvider
public void removeServerItemsProvider(ServerItemsProvider provider)
Removes the provided items as a service of the service.- Parameters:
provider
- The provider that is being removed.
-
addUserItemsProvider
public void addUserItemsProvider(UserItemsProvider provider)
Adds the items provided by the new service that implements the UserItemsProvider interface. This information will be used whenever a disco for items is made against users of the server.- Parameters:
provider
- the UserItemsProvider that provides new user items.
-
removeUserItemsProvider
public void removeUserItemsProvider(UserItemsProvider provider)
Removes the UserItemsProvider- Parameters:
provider
- the UserItemsProvider that provides new user items.
-
setServerNodeInfoProvider
public void setServerNodeInfoProvider(String node, DiscoItemsProvider provider)
Sets the DiscoItemsProvider to use when a disco#items packet is sent to the server itself and the specified node. For instance, if node matches "http://jabber.org/protocol/offline" then a special DiscoItemsProvider should be use to return information about offline messages.- Parameters:
node
- the node that the provider will handle.provider
- the DiscoItemsProvider that will handle disco#items packets sent with the specified node.
-
removeServerNodeInfoProvider
public void removeServerNodeInfoProvider(String node)
Removes the DiscoItemsProvider to use when a disco#items packet is sent to the server itself and the specified node.- Parameters:
node
- the node that the provider was handling.
-
addComponentItem
public void addComponentItem(String jid, String name)
Registers a new disco item for a component. The jid attribute of the item will match the jid of the component and the name should be the name of the component discovered using disco.- Parameters:
jid
- the jid of the component.name
- the discovered name of the component.
-
addComponentItem
public void addComponentItem(String jid, String node, String name)
Registers a new disco item for a component. The jid attribute of the item will match the jid of the component and the name should be the name of the component discovered using disco.- Parameters:
jid
- the jid of the component.node
- the node that complements the jid address.name
- the discovered name of the component.
-
removeComponentItem
public void removeComponentItem(String jid)
Removes a disco item for a component that has been removed from the server.- Parameters:
jid
- the jid of the component being removed.
-
initialize
public void initialize(XMPPServer server)
Description copied from class:BasicModule
Initializes the basic module.
Inheriting classes that choose to override this method MUST call this initialize() method before accessing BasicModule resources.
- Specified by:
initialize
in interfaceModule
- Overrides:
initialize
in classIQHandler
- Parameters:
server
- the server hosting this module.
-
start
public void start() throws IllegalStateException
Description copied from class:BasicModule
Starts the basic module.
Inheriting classes that choose to override this method MUST call this start() method before accessing BasicModule resources.
- Specified by:
start
in interfaceModule
- Overrides:
start
in classBasicModule
- Throws:
IllegalStateException
- If start is called before initialize successfully returns
-
getFeatures
public Iterator<String> getFeatures()
Description copied from interface:ServerFeaturesProvider
Returns an Iterator (of String) with the supported features by the server. The features to include are the features offered and supported protocols by the SERVER. The idea is that different modules may provide their features that will ultimately be part of the features offered by the server.- Specified by:
getFeatures
in interfaceServerFeaturesProvider
- Returns:
- an Iterator (of String) with the supported features by the server.
-
joinedCluster
public void joinedCluster()
Description copied from interface:ClusterEventListener
Notification event indicating that this JVM is now part of a cluster. At this point theXMPPServer.getNodeID()
holds the new nodeID value.When joining the cluster as the senior cluster member the
ClusterEventListener.markedAsSeniorClusterMember()
event will be sent right after this event.At this point the CacheFactory holds clustered caches. That means that modifications to the caches will be reflected in the cluster. The clustered caches were just obtained from the cluster and no local cached data was automatically moved.
It is generally advisable that implementations of this method:- enrich clustered cache data, by (re)adding data from this JVM/cluster node to relevant caches
- invoke applicable event listeners, to reflect changes in availability of data on other cluster nodes.
- Specified by:
joinedCluster
in interfaceClusterEventListener
-
joinedCluster
public void joinedCluster(byte[] nodeID)
Description copied from interface:ClusterEventListener
Notification event indicating that another JVM is now part of a cluster.At this point the CacheFactory of the new node holds clustered caches. That means that modifications to the caches of this JVM will be reflected in the cluster and in particular in the new node.
- Specified by:
joinedCluster
in interfaceClusterEventListener
- Parameters:
nodeID
- ID of the node that joined the cluster.
-
leftCluster
public void leftCluster()
Description copied from interface:ClusterEventListener
Notification event indicating that this JVM is no longer part of the cluster. This could happen when disabling clustering support, removing the enterprise plugin that provides clustering support or connection to cluster got lost.Moreover, if we were in a "split brain" scenario (ie. separated cluster islands) and the island were this JVM belonged was marked as "old" then all nodes of that island will get the
left cluster event
andjoined cluster events
. That means that caches will be reset and thus will need to be repopulated again with fresh data from this JVM. This also includes the case where this JVM was the senior cluster member and when the islands met again then this JVM stopped being the senior member.At this point the CacheFactory holds local caches. That means that modifications to the caches will only affect this JVM. It is generally advisable that implementations of this method:
- restore relevant caches content, by repopulating the caches with data from this JVM/cluster node
- invoke applicable event listeners, to reflect changes in availability of data on other cluster nodes.
- Specified by:
leftCluster
in interfaceClusterEventListener
-
leftCluster
public void leftCluster(byte[] nodeID)
Description copied from interface:ClusterEventListener
Notification event indicating that another JVM is no longer part of the cluster. This could happen when disabling clustering support, removing the enterprise plugin that provides clustering support or connection to cluster got lost.Moreover, if we were in a "split brain" scenario (ie. separated cluster islands) and the island were the other JVM belonged was marked as "old" then all nodes of that island will get the
left cluster event
andjoined cluster events
. That means that caches will be reset and thus will need to be repopulated again with fresh data from this JVM. This also includes the case where the other JVM was the senior cluster member and when the islands met again then the other JVM stopped being the senior member.At this point the CacheFactory of the leaving node holds local caches. That means that modifications to the caches of this JVM will not affect the leaving node but other cluster members. It is generally advisable that implementations of this method invoke applicable event listeners, to reflect changes in availability of data (related to the node that left). Often, this action is orchestrated by only one of the remaining cluster nodes: the senior member.
- Specified by:
leftCluster
in interfaceClusterEventListener
- Parameters:
nodeID
- ID of the node that is left the cluster.
-
markedAsSeniorClusterMember
public void markedAsSeniorClusterMember()
Description copied from interface:ClusterEventListener
Notification event indicating that this JVM is now the senior cluster member. This could either happen when initially joining the cluster or when the senior cluster member node left the cluster and this JVM was marked as the new senior cluster member.Moreover, in the case of a "split brain" scenario (ie. separated cluster islands) each island will have its own senior cluster member. However, when the islands meet again there could only be one senior cluster member so one of the senior cluster members will stop playing that role. When that happens the JVM no longer playing that role will receive the
ClusterEventListener.leftCluster()
andClusterEventListener.joinedCluster()
events.- Specified by:
markedAsSeniorClusterMember
in interfaceClusterEventListener
-
getUserItems
public Iterator<org.dom4j.Element> getUserItems(String name, org.xmpp.packet.JID senderJID)
Description copied from interface:UserItemsProvider
Returns an Iterator (of Element) with the target entity's items or null if none. Each Element must include a JID attribute and may include the name and node attributes of the entity. In case that the sender of the disco request is not authorized to discover items an UnauthorizedException will be thrown.- Specified by:
getUserItems
in interfaceUserItemsProvider
- Parameters:
name
- the recipient JID's name.senderJID
- the XMPPAddress of user that sent the disco items request.- Returns:
- an Iterator (of Element) with the target entity's items or null if none.
-
-