package nl.topicus.konijn.xmpp.modules.bind;
import nl.topicus.konijn.xmpp.util.CustomResourceRegistry;
import org.apache.vysper.xml.fragment.XMLElement;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.stanza.IQStanza;
import org.apache.vysper.xmpp.stanza.IQStanzaType;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
/**
* handles bind requests
*
* @author Joost Limburg
*/
public class CustomBindIQHandler extends DefaultIQHandler {
@Override
protected boolean verifyInnerElement(Stanza stanza) {
return verifyInnerNamespace(stanza,
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_BIND)
&& (verifyInnerElementWorker(stanza, "bind") || verifyInnerElementWorker(
stanza, "unbind"));
}
@Override
protected Stanza handleSet(IQStanza stanza,
ServerRuntimeContext serverRuntimeContext,
SessionContext sessionContext) {
String resourceId = null;
boolean binding = true;
for (XMLElement xe : stanza.getInnerElements()) {
if (xe.getName().equals("bind")) {
binding = true;
for (XMLElement xb : xe.getInnerElements()) {
if (xb.getName().equals("resource")) {
resourceId = xb.getInnerText().getText();
}
}
} else if (xe.getName().equals("unbind")) {
binding = false;
for (XMLElement xb : xe.getInnerElements()) {
if (xb.getName().equals("resource")) {
resourceId = xb.getInnerText().getText();
}
}
}
}
if (binding) {
((CustomResourceRegistry) serverRuntimeContext
.getResourceRegistry()).bindSession(resourceId,
sessionContext);
} else {
serverRuntimeContext.getPresenceCache().remove(stanza.getFrom());
// ((CustomResourceRegistry) serverRuntimeContext
// .getResourceRegistry()).unbindResource(resourceId);
}
Entity entity = new EntityImpl(sessionContext.getInitiatingEntity(),
resourceId);
StanzaBuilder stanzaBuilder = StanzaBuilder
.createIQStanza(null, null, IQStanzaType.RESULT, stanza.getID())
.startInnerElement(binding ? "bind" : "unbind",
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_BIND)
.startInnerElement("jid",
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_BIND)
.addText(entity.getFullQualifiedName()).endInnerElement()
.endInnerElement();
return stanzaBuilder.build();
}
}