private StanzaHandler getIQHandler()

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;
    }