package nl.topicus.konijn.xmpp.util;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityUtils;
import org.apache.vysper.xmpp.delivery.StanzaRelay;
import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
import org.apache.vysper.xmpp.protocol.ProtocolException;
import org.apache.vysper.xmpp.protocol.StanzaHandler;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Custom stanza relay
*
* @author Joost Limburg
*/
public class CustomStanzaRelayBroker implements StanzaRelay {
final Logger LOGGER = LoggerFactory
.getLogger(CustomStanzaRelayBroker.class);
protected StanzaRelay internalRelay;
protected StanzaRelay externalRelay;
protected ServerRuntimeContext serverRuntimeContext;
/**
* a StanzaRelay receiving stanzas which are targeted to server-local JIDs
*/
public void setInternalRelay(StanzaRelay internalRelay) {
this.internalRelay = internalRelay;
}
/**
* a StanzaRelay receiving stanzas which are targeted to JIDs which are
* external to this server
*/
public void setExternalRelay(StanzaRelay externalRelay) {
this.externalRelay = externalRelay;
}
public void setServerRuntimeContext(
ServerRuntimeContext serverRuntimeContext) {
this.serverRuntimeContext = serverRuntimeContext;
}
public void relay(Entity receiver, Stanza stanza,
DeliveryFailureStrategy deliveryFailureStrategy)
throws DeliveryException {
// boolean toServerTLD = receiver == null
// || (!receiver.isNodeSet() && EntityUtils.isAddressingServer(
// receiver, serverRuntimeContext.getServerEnitity()));
boolean toServerTLD = false;
String domain = receiver.getDomain();
if (domain.equalsIgnoreCase("xmpp.platform.violet.net")
|| domain.equalsIgnoreCase("xmpp.objects.violet.net")
|| domain.equalsIgnoreCase("xmpp.applet.violet.net")
|| receiver.getNode().equals("net.violet.platform")) {
toServerTLD = true;
}
boolean toComponent = receiver != null
&& EntityUtils.isAddressingServerComponent(receiver,
serverRuntimeContext.getServerEnitity());
if (toServerTLD) {
System.out.println("Got: " + stanza.getNamespaceURI() + " "+ stanza.getName());
Stanza innerStanza = new Stanza("violet:custom", stanza.getName(),
stanza.getNamespacePrefix(), stanza.getAttributes(),
stanza.getInnerFragments(), stanza.getDeclaredNamespaces());
StanzaHandler handler = serverRuntimeContext.getHandler(innerStanza);
SessionContext context = serverRuntimeContext.getResourceRegistry().getSessionContext(stanza.getFrom().getResource());
try {
System.out.println("Got handler: " + handler.getName());
handler.execute(innerStanza, serverRuntimeContext, false, context, null);
} catch (ProtocolException e) {
e.printStackTrace();
}
return;
}
boolean relayToExternal = serverRuntimeContext.getServerFeatures()
.isRelayingToFederationServers();
if (EntityUtils.isAddressingServer(receiver,
serverRuntimeContext.getServerEnitity())
|| toComponent) {
internalRelay.relay(receiver, stanza, deliveryFailureStrategy);
} else {
if (!relayToExternal)
throw new IllegalStateException(
"this server is not relaying to external currently");
externalRelay.relay(receiver, stanza, deliveryFailureStrategy);
}
}
@Override
public boolean isRelaying() {
// TODO Auto-generated method stub
return false;
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
}