in server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java [109:139]
private StanzaHandler getIQHandler(Stanza stanza) {
StanzaHandler handlerForElement = null;
Entity to = stanza.getTo();
Entity serverEntity = (serverRuntimeContext == null) ? null : serverRuntimeContext.getServerEntity();
boolean isAddressedToServerOrComponent = (to == null || (!to.isNodeSet() && !to.isResourceSet()));
boolean isAddressedToComponent = (to != null) && isAddressedToServerOrComponent && serverEntity != null
&& (!serverEntity.equals(to));
boolean isAddressedToServer = (to == null) || (isAddressedToServerOrComponent && !isAddressedToComponent);
// The following cases must be properly handled:
// 1. IQ disco stanza always handled by disco subsystem, not addressee
// 2. to = someone@vysper.org => relay
// 3. to = vysper.org => service unavailable
// 4. to = component.vysper.org => relay
// if no specialized handler can be identified, return general handler (relay)
StanzaHandler resolvedHandler = null;
if (stanza.getVerifier().subElementsPresentExact(1)) {
XMLElement firstInnerElement = stanza.getFirstInnerElement();
handlerForElement = getHandlerForElement(stanza, firstInnerElement);
if (handlerForElement != null)
resolvedHandler = handlerForElement;
if (resolvedHandler == null && isAddressedToServer && XMPPCoreStanza.getWrapper(stanza) != null)
resolvedHandler = SERVICE_UNAVAILABLE_STANZA_ERROR_HANDLER;
}
if (resolvedHandler == null)
resolvedHandler = iqHandler;
return resolvedHandler;
}