Remove getStanzaProcessor from the ServerRuntimeContext
diff --git a/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java b/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java
index 896c0f8..6c65860 100644
--- a/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java
+++ b/examples/embedded-war/src/main/java/org/apache/vysper/xmpp/exemples/embeddedwar/VysperListener.java
@@ -34,6 +34,7 @@
import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
import org.apache.vysper.xmpp.modules.extension.xep0199_xmppping.XmppPingModule;
import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerFeatures;
import org.apache.vysper.xmpp.server.XMPPServer;
@@ -47,7 +48,7 @@
StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
- final AccountManagement accountManagement = (AccountManagement) providerRegistry
+ final AccountManagement accountManagement = providerRegistry
.retrieve(AccountManagement.class);
Entity user1 = EntityImpl.parse("user1@" + domain);
@@ -92,6 +93,7 @@
// Used by the websocket endpoint, if enabled
sce.getServletContext().setAttribute("org.apache.vysper.xmpp.server.ServerRuntimeContext", server.getServerRuntimeContext());
+ sce.getServletContext().setAttribute(StanzaProcessor.class.getCanonicalName(), server.getStanzaProcessor());
sce.getServletContext().setAttribute("vysper", server);
} catch (Exception e) {
e.printStackTrace();
diff --git a/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java b/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
index f74aa43..32c5cbc 100644
--- a/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
+++ b/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
@@ -28,6 +28,7 @@
import org.apache.mina.filter.ssl.SslFilter;
import org.apache.vysper.mina.codec.StanzaWriteInfo;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.AbstractSessionContext;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionState;
@@ -54,9 +55,9 @@
protected CloseFuture closeFuture;
- public MinaBackedSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
- IoSession minaSession) {
- super(serverRuntimeContext, sessionStateHolder);
+ public MinaBackedSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor, SessionStateHolder sessionStateHolder,
+ IoSession minaSession) {
+ super(serverRuntimeContext, stanzaProcessor, sessionStateHolder);
this.minaSession = minaSession;
closeFuture = minaSession.getCloseFuture();
closeFuture.addListener(this);
diff --git a/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java b/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
index 9246f07..3ff021d 100644
--- a/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
+++ b/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
@@ -30,6 +30,7 @@
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.apache.vysper.mina.codec.XMPPProtocolCodecFactory;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.Endpoint;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -40,6 +41,8 @@
public class TCPEndpoint implements Endpoint {
private ServerRuntimeContext serverRuntimeContext;
+
+ private StanzaProcessor stanzaProcessor;
private int port = 5222;
@@ -59,7 +62,12 @@
public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
this.serverRuntimeContext = serverRuntimeContext;
}
-
+
+ @Override
+ public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+ this.stanzaProcessor = stanzaProcessor;
+ }
+
/**
* Returns the configured port if one is provided (non-zero value).
*/
@@ -92,8 +100,7 @@
filterChainBuilder.addLast("executorFilter", new ExecutorFilter(new OrderedThreadPoolExecutor(coreThreadCount, maxThreadCount, threadTimeoutSeconds, TimeUnit.SECONDS)));
acceptor.setFilterChainBuilder(filterChainBuilder);
- XmppIoHandlerAdapter adapter = new XmppIoHandlerAdapter();
- adapter.setServerRuntimeContext(serverRuntimeContext);
+ XmppIoHandlerAdapter adapter = new XmppIoHandlerAdapter(serverRuntimeContext, stanzaProcessor);
acceptor.setHandler(adapter);
acceptor.setReuseAddress(true);
diff --git a/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java b/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
index 23e1cbe..cffa8d4 100644
--- a/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
+++ b/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
@@ -27,9 +27,9 @@
import org.apache.mina.core.write.WriteToClosedSessionException;
import org.apache.mina.filter.FilterEvent;
import org.apache.mina.filter.ssl.SslEvent;
-import org.apache.mina.filter.ssl.SslFilter;
import org.apache.vysper.xml.fragment.XMLText;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
@@ -40,6 +40,8 @@
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXParseException;
+import static java.util.Objects.requireNonNull;
+
/**
* handler for client-to-server sessions
* @author The Apache MINA Project (dev@mina.apache.org)
@@ -54,10 +56,12 @@
final Logger logger = LoggerFactory.getLogger(XmppIoHandlerAdapter.class);
- private ServerRuntimeContext serverRuntimeContext;
+ private final ServerRuntimeContext serverRuntimeContext;
+ private final StanzaProcessor stanzaProcessor;
- public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
+ public XmppIoHandlerAdapter(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
this.serverRuntimeContext = serverRuntimeContext;
+ this.stanzaProcessor = stanzaProcessor;
}
@Override
@@ -79,7 +83,7 @@
SessionStateHolder stateHolder = (SessionStateHolder) ioSession
.getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
- serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, session, stanza, stateHolder);
+ stanzaProcessor.processStanza(serverRuntimeContext, session, stanza, stateHolder);
}
private SessionContext extractSession(IoSession ioSession) {
@@ -102,7 +106,7 @@
SessionContext session = extractSession(ioSession);
SessionStateHolder stateHolder = (SessionStateHolder) ioSession
.getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
- serverRuntimeContext.getStanzaProcessor().processTLSEstablished(session, stateHolder);
+ stanzaProcessor.processTLSEstablished(session, stateHolder);
} else if (event == SslEvent.UNSECURED) {
// TODO
}
@@ -111,7 +115,7 @@
@Override
public void sessionCreated(IoSession ioSession) throws Exception {
SessionStateHolder stateHolder = new SessionStateHolder();
- SessionContext sessionContext = new MinaBackedSessionContext(serverRuntimeContext, stateHolder, ioSession);
+ SessionContext sessionContext = new MinaBackedSessionContext(serverRuntimeContext, stanzaProcessor, stateHolder, ioSession);
ioSession.setAttribute(ATTRIBUTE_VYSPER_SESSION, sessionContext);
ioSession.setAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER, stateHolder);
ioSession.setAttribute(ATTRIBUTE_VYSPER_TERMINATE_REASON, SessionTerminationCause.CLIENT_BYEBYE);
diff --git a/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
index 44876a2..86ddac2 100644
--- a/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
@@ -28,6 +28,7 @@
import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
import org.apache.vysper.xmpp.modules.Module;
import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.AlterableComponentRegistry;
import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
import org.apache.vysper.xmpp.server.ServerFeatures;
@@ -65,8 +66,9 @@
public SpringCompatibleDefaultServerRuntimeContext(Entity serverEntity, ServerFeatures serverFeatures,
List<HandlerDictionary> dictionaries, ResourceRegistry resourceRegistry,
+ StanzaProcessor stanzaProcessor,
AlterableComponentRegistry componentRegistry) {
- super(serverEntity, new StanzaRelayHull(), componentRegistry, resourceRegistry, serverFeatures, dictionaries);
+ super(serverEntity, new StanzaRelayHull(), stanzaProcessor, componentRegistry, resourceRegistry, serverFeatures, dictionaries);
}
public void setStanzaRelay(StanzaRelay stanzaRelay) {
diff --git a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
index 48a6698..007e4f1 100644
--- a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
+++ b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
@@ -23,6 +23,7 @@
import java.util.Queue;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.AbstractSessionContext;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionState;
@@ -38,9 +39,12 @@
public class StanzaSessionContext extends AbstractSessionContext implements StanzaWriter {
protected Queue<Stanza> stanzaQueue = new LinkedList<Stanza>();
+
+ private final StanzaProcessor stanzaProcessor;
- public StanzaSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder) {
- super(serverRuntimeContext, sessionStateHolder);
+ public StanzaSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor, SessionStateHolder sessionStateHolder) {
+ super(serverRuntimeContext, stanzaProcessor, sessionStateHolder);
+ this.stanzaProcessor = stanzaProcessor;
}
public StanzaWriter getResponseWriter() {
@@ -48,7 +52,7 @@
}
public void sendStanzaToServer(Stanza stanza) {
- serverRuntimeContext.getStanzaProcessor().processStanza(getServerRuntimeContext(), this, stanza,
+ stanzaProcessor.processStanza(getServerRuntimeContext(), this, stanza,
sessionStateHolder);
}
diff --git a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java
index 7b09bf5..23b3627 100644
--- a/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java
+++ b/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionFactory.java
@@ -20,6 +20,7 @@
package org.apache.vysper.stanzasession;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.Endpoint;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionState;
@@ -31,6 +32,7 @@
public class StanzaSessionFactory implements Endpoint {
private ServerRuntimeContext serverRuntimeContext;
+ private StanzaProcessor stanzaProcessor;
/**
* returns a new session for the server. the session behaves like a client, but lives within the server JVM
@@ -38,7 +40,7 @@
public StanzaSession createNewSession() {
SessionStateHolder stateHolder = new SessionStateHolder();
stateHolder.setState(SessionState.INITIATED);
- StanzaSessionContext sessionContext = new StanzaSessionContext(serverRuntimeContext, stateHolder);
+ StanzaSessionContext sessionContext = new StanzaSessionContext(serverRuntimeContext, stanzaProcessor, stateHolder);
StanzaSession session = new StanzaSession(sessionContext);
return session;
}
@@ -47,6 +49,11 @@
this.serverRuntimeContext = serverRuntimeContext;
}
+ @Override
+ public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+ this.stanzaProcessor = stanzaProcessor;
+ }
+
public void start() {
// nothing to do
}
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
index 2adc3ba..e7b2952 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaProcessor.java
@@ -33,8 +33,8 @@
/**
* processes a stanza as received from a local session
*/
- public void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
- SessionStateHolder sessionStateHolder);
+ void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
+ SessionStateHolder sessionStateHolder);
- public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder);
+ void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder);
}
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
index ae99cfd..848624e 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
@@ -25,14 +25,13 @@
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.apache.vysper.xmpp.state.resourcebinding.BindException;
import org.apache.vysper.xmpp.uuid.JVMBuiltinUUIDGenerator;
import org.apache.vysper.xmpp.uuid.UUIDGenerator;
import org.apache.vysper.xmpp.writer.StanzaWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* provides default session context behavior
@@ -41,9 +40,9 @@
*/
public abstract class AbstractSessionContext implements SessionContext {
- private static final Logger logger = LoggerFactory.getLogger(AbstractSessionContext.class);
+ protected final ServerRuntimeContext serverRuntimeContext;
- protected ServerRuntimeContext serverRuntimeContext;
+ private final StanzaProcessor stanzaProcessor;
protected String sessionId;
@@ -59,10 +58,12 @@
private boolean serverToServer = false;
- private Map<String, Object> attributeMap = new HashMap<String, Object>();
+ private Map<String, Object> attributeMap = new HashMap<>();
- public AbstractSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder) {
+ public AbstractSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor,
+ SessionStateHolder sessionStateHolder) {
this.serverRuntimeContext = serverRuntimeContext;
+ this.stanzaProcessor = stanzaProcessor;
sessionId = serverRuntimeContext.getNextSessionId();
serverEntity = serverRuntimeContext.getServerEntity();
xmlLang = serverRuntimeContext.getDefaultXMLLang();
@@ -140,7 +141,7 @@
|| terminationCause == SessionTerminationCause.CONNECTION_ABORT) {
if (getState().equals(SessionState.AUTHENTICATED)) {
Stanza unavailableStanza = StanzaBuilder.createUnavailablePresenceStanza(null, terminationCause);
- serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, this, unavailableStanza,
+ stanzaProcessor.processStanza(serverRuntimeContext, this, unavailableStanza,
sessionStateHolder);
}
} else if (terminationCause == SessionTerminationCause.SERVER_SHUTDOWN) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
index 87aac14..a7ff5f7 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
@@ -98,12 +98,6 @@
// basic services the server is using...
/**
- * 'input stream': receives stanzas issued by client sessions to be handled by
- * the server
- */
- private final StanzaProcessor stanzaProcessor;
-
- /**
* 'output stream': receives stanzas issued by a session, which are going to
* other sessions/servers
*/
@@ -141,17 +135,16 @@
private final AlterableComponentRegistry componentRegistry;
private final SimpleEventBus eventBus;
-
+
private final ComponentStanzaProcessorFactory componentStanzaProcessorFactory;
- public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay stanzaRelay,
+ public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay stanzaRelay, StanzaProcessor stanzaProcessor,
AlterableComponentRegistry componentRegistry, ResourceRegistry resourceRegistry,
ServerFeatures serverFeatures, List<HandlerDictionary> dictionaries) {
this.serverEntity = serverEntity;
this.stanzaRelay = stanzaRelay;
- this.stanzaProcessor = new ProtocolWorker(stanzaRelay);
this.componentRegistry = requireNonNull(componentRegistry);
- this.serverConnectorRegistry = new DefaultXMPPServerConnectorRegistry(this, stanzaRelay);
+ this.serverConnectorRegistry = new DefaultXMPPServerConnectorRegistry(this, stanzaRelay, stanzaProcessor);
this.stanzaHandlerLookup = new StanzaHandlerLookup(this);
this.eventBus = new SimpleEventBus();
this.serverFeatures = serverFeatures;
@@ -168,8 +161,8 @@
}
public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay stanzaRelay) {
- this(serverEntity, stanzaRelay, new SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(),
- new ServerFeatures(), Collections.emptyList());
+ this(serverEntity, stanzaRelay, new ProtocolWorker(stanzaRelay), new SimpleComponentRegistry(serverEntity),
+ new DefaultResourceRegistry(), new ServerFeatures(), Collections.emptyList());
}
/**
@@ -203,11 +196,6 @@
return "en_US"; // TODO must be configurable as of RFC3920
}
- @Override
- public StanzaProcessor getStanzaProcessor() {
- return stanzaProcessor;
- }
-
public StanzaRelay getStanzaRelay() {
return stanzaRelay;
}
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java
index 4a1a75c..50f95c0 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/Endpoint.java
@@ -19,6 +19,8 @@
*/
package org.apache.vysper.xmpp.server;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+
import java.io.IOException;
/**
@@ -33,6 +35,8 @@
public interface Endpoint {
void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext);
+
+ void setStanzaProcessor(StanzaProcessor stanzaProcessor);
void start() throws IOException;
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
index 1cebe0d..d73149a 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
@@ -54,8 +54,6 @@
String getDefaultXMLLang();
- StanzaProcessor getStanzaProcessor();
-
ServerFeatures getServerFeatures();
SSLContext getSslContext();
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
index 0176190..f516e0d 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
@@ -47,6 +47,8 @@
import org.apache.vysper.xmpp.modules.roster.RosterModule;
import org.apache.vysper.xmpp.modules.servicediscovery.ServiceDiscoveryModule;
import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.state.resourcebinding.DefaultResourceRegistry;
import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
@@ -69,6 +71,8 @@
private String serverDomain;
private DefaultServerRuntimeContext serverRuntimeContext;
+
+ private StanzaProcessor stanzaProcessor;
private StorageProviderRegistry storageProviderRegistry;
@@ -193,7 +197,9 @@
stanzaRelayBroker.setInternalRelay(internalStanzaRelay);
stanzaRelayBroker.setExternalRelay(externalStanzaRelay);
- serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, stanzaRelayBroker, componentRegistry,
+ stanzaProcessor = new ProtocolWorker(stanzaRelayBroker);
+
+ serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, stanzaRelayBroker, stanzaProcessor, componentRegistry,
resourceRegistry, serverFeatures, dictionaries);
serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
@@ -213,8 +219,14 @@
if (endpoints.size() == 0)
throw new IllegalStateException("server must have at least one endpoint");
+
+ /*
+ 'input stream': receives stanzas issued by client sessions to be handled by
+ the server
+ */
for (Endpoint endpoint : endpoints) {
endpoint.setServerRuntimeContext(serverRuntimeContext);
+ endpoint.setStanzaProcessor(stanzaProcessor);
endpoint.start();
}
}
@@ -260,4 +272,8 @@
public ServerRuntimeContext getServerRuntimeContext() {
return serverRuntimeContext;
}
+
+ public StanzaProcessor getStanzaProcessor(){
+ return stanzaProcessor;
+ }
}
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
index 2047ad1..54aebd4 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
@@ -52,6 +52,7 @@
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.server.SessionState;
@@ -78,6 +79,8 @@
private final ServerRuntimeContext serverRuntimeContext;
private final StanzaRelay stanzaRelay;
+
+ private final StanzaProcessor stanzaProcessor;
private MinaBackedSessionContext sessionContext;
@@ -108,9 +111,11 @@
protected final CountDownLatch authenticatedLatch = new CountDownLatch(1);
public DefaultXMPPServerConnector(Entity remoteServer, ServerRuntimeContext serverRuntimeContext,
- StanzaRelay stanzaRelay, SessionContext dialbackSessionContext,
- SessionStateHolder dialbackSessionStateHolder) {
+ StanzaRelay stanzaRelay, StanzaProcessor stanzaProcessor,
+ SessionContext dialbackSessionContext,
+ SessionStateHolder dialbackSessionStateHolder) {
this.serverRuntimeContext = serverRuntimeContext;
+ this.stanzaProcessor = stanzaProcessor;
this.stanzaRelay = stanzaRelay;
this.remoteServer = remoteServer;
this.dialbackSessionContext = dialbackSessionContext;
@@ -279,7 +284,7 @@
return;
}
- serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, sessionContext, stanza,
+ stanzaProcessor.processStanza(serverRuntimeContext, sessionContext, stanza,
sessionStateHolder);
}
}
@@ -301,7 +306,7 @@
public void handleSessionOpened(IoSession session) {
LOG.info("XMPP server session opened to {}", remoteServer);
- sessionContext = new MinaBackedSessionContext(serverRuntimeContext, sessionStateHolder, session);
+ sessionContext = new MinaBackedSessionContext(serverRuntimeContext, stanzaProcessor, sessionStateHolder, session);
sessionStateHolder.setState(SessionState.INITIATED);
Stanza opener = new ServerResponses().getStreamOpenerForServerConnector(serverRuntimeContext.getServerEntity(),
remoteServer, XMPPVersion.VERSION_1_0, sessionContext);
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
index a463d99..f1694d2 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
@@ -28,6 +28,7 @@
import org.apache.vysper.xmpp.delivery.failure.RemoteServerNotFoundException;
import org.apache.vysper.xmpp.delivery.failure.RemoteServerTimeoutException;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.slf4j.Logger;
@@ -47,10 +48,15 @@
private final Map<Entity, XMPPServerConnector> connectors = new ConcurrentHashMap<>();
private final StanzaRelay stanzaRelay;
+
+ private final StanzaProcessor stanzaProcessor;
- public DefaultXMPPServerConnectorRegistry(ServerRuntimeContext serverRuntimeContext, StanzaRelay stanzaRelay) {
+ public DefaultXMPPServerConnectorRegistry(ServerRuntimeContext serverRuntimeContext,
+ StanzaRelay stanzaRelay,
+ StanzaProcessor stanzaProcessor) {
this.serverRuntimeContext = serverRuntimeContext;
this.stanzaRelay = stanzaRelay;
+ this.stanzaProcessor = stanzaProcessor;
}
/*
@@ -98,7 +104,7 @@
protected XMPPServerConnector createConnector(Entity otherServer, ServerRuntimeContext serverRuntimeContext,
SessionContext dialbackSessionContext, SessionStateHolder dialbackSessionStateHolder) {
- return new DefaultXMPPServerConnector(otherServer, serverRuntimeContext, stanzaRelay, dialbackSessionContext,
+ return new DefaultXMPPServerConnector(otherServer, serverRuntimeContext, stanzaRelay, stanzaProcessor, dialbackSessionContext,
dialbackSessionStateHolder);
}
diff --git a/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java b/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
index e0af08c..73556f6 100644
--- a/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
@@ -28,6 +28,7 @@
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.delivery.StanzaRelayBroker;
import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
import org.apache.vysper.xmpp.server.ServerFeatures;
import org.apache.vysper.xmpp.server.SimpleComponentRegistry;
@@ -56,13 +57,15 @@
dictionaries.add(new org.apache.vysper.xmpp.modules.roster.RosterDictionary());
Entity serverEntity = new EntityImpl(null, "test", null);
+ ProtocolWorker protocolWorker = new ProtocolWorker(relay);
DefaultServerRuntimeContext serverContext = new DefaultServerRuntimeContext(serverEntity,
- relay, new SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(), new ServerFeatures(), dictionaries);
+ relay, protocolWorker, new SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(), new ServerFeatures(), dictionaries);
relay.setServerRuntimeContext(serverContext);
sessionFactory = new StanzaSessionFactory();
sessionFactory.setServerRuntimeContext(serverContext);
+ sessionFactory.setStanzaProcessor(protocolWorker);
}
public void testHandshake() {
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
index a9343f2..6624392 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
@@ -31,6 +31,7 @@
import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.writer.StanzaWriter;
@@ -109,21 +110,20 @@
}
public TestSessionContext(SessionStateHolder sessionStateHolder) {
- super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
- new MemoryStorageProviderRegistry()), sessionStateHolder);
- sessionId = serverRuntimeContext.getNextSessionId();
- xmlLang = "de";
- this.relay = ((DefaultServerRuntimeContext) serverRuntimeContext).getStanzaRelay();
- }
-
- public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaReceiverRelay relay) {
- this(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
- new MemoryStorageProviderRegistry()), sessionStateHolder, relay);
+ this(sessionStateHolder, new RecordingStanzaRelay());
}
public TestSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
StanzaRelay relay) {
- super(serverRuntimeContext, sessionStateHolder);
+ super(serverRuntimeContext, new ProtocolWorker(relay), sessionStateHolder);
+ sessionId = serverRuntimeContext.getNextSessionId();
+ xmlLang = "de";
+ this.relay = relay;
+ }
+
+ public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaRelay relay) {
+ super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), relay,
+ new MemoryStorageProviderRegistry()), new ProtocolWorker(relay), sessionStateHolder);
sessionId = serverRuntimeContext.getNextSessionId();
xmlLang = "de";
this.relay = relay;
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java
index 91ece0a..0b2326d 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistryTestCase.java
@@ -60,7 +60,8 @@
@Test
public void connectorShouldBeReused() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
- DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+ DefaultXMPPServerConnectorRegistry registry =
+ new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
@Override
protected XMPPServerConnector createConnector(Entity otherServer,
ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -83,7 +84,8 @@
@Test
public void dontReuseClosedConnector() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
- DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+ DefaultXMPPServerConnectorRegistry registry =
+ new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
@Override
protected XMPPServerConnector createConnector(Entity otherServer,
ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -104,7 +106,8 @@
@Test
public void dontReuseConnectorToDifferentServers() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
- DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+ DefaultXMPPServerConnectorRegistry registry =
+ new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
@Override
protected XMPPServerConnector createConnector(Entity otherServer,
ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -123,7 +126,8 @@
@Test
public void createDialbackConnector() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
- DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+ DefaultXMPPServerConnectorRegistry registry =
+ new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
@Override
protected XMPPServerConnector createConnector(Entity otherServer,
ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
@@ -143,7 +147,8 @@
@Test
public void close() throws RemoteServerNotFoundException, RemoteServerTimeoutException {
- DefaultXMPPServerConnectorRegistry registry = new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null) {
+ DefaultXMPPServerConnectorRegistry registry =
+ new DefaultXMPPServerConnectorRegistry(serverRuntimeContext, null, null) {
@Override
protected XMPPServerConnector createConnector(Entity otherServer,
ServerRuntimeContext serverRuntimeContext, SessionContext dialbackSessionContext,
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
index 014f0f5..8570a07 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
@@ -21,6 +21,7 @@
import java.io.IOException;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.eclipse.jetty.websocket.WebSocket;
@@ -34,14 +35,14 @@
*/
public class JettyXmppWebSocket implements WebSocket, WebSocket.OnTextMessage, Outbound {
-
private final static Logger LOG = LoggerFactory.getLogger(JettyXmppWebSocket.class);
private WebSocketBackedSessionContext sessionContext;
+
private Connection outbound;
- public JettyXmppWebSocket(ServerRuntimeContext serverRuntimeContext) {
- this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, this);
+ public JettyXmppWebSocket(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
+ this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, stanzaProcessor, this);
}
/**
@@ -54,7 +55,6 @@
sessionContext.onOpen();
}
-
public void onMessage(String data) {
LOG.info("< " + data);
sessionContext.onMessage(data);
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
index 4b77cc3..8fd7edf 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
@@ -24,6 +24,7 @@
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocketServlet;
@@ -33,9 +34,11 @@
/**
* Servlet for initiating websocket connections for Jetty.
* <p>
- * When creating this servlet from web.xml, the Vysper server needs to be started beforehand
- * (e.g. from a {@link ServletContextListener} and the {@link ServerRuntimeContext} needs to be
- * added as an attribute in the {@link ServletContext} with the key "org.apache.vysper.xmpp.server.ServerRuntimeContext".
+ * When creating this servlet from web.xml, the Vysper server needs to be
+ * started beforehand (e.g. from a {@link ServletContextListener} and the
+ * {@link ServerRuntimeContext} needs to be added as an attribute in the
+ * {@link ServletContext} with the key
+ * "org.apache.vysper.xmpp.server.ServerRuntimeContext".
* </p>
*
* @author The Apache MINA Project (dev@mina.apache.org)
@@ -43,23 +46,28 @@
public class JettyXmppWebSocketServlet extends WebSocketServlet {
/**
- * The attribute key for the {@link ServerRuntimeContext} in {@link ServletContext}
+ * The attribute key for the {@link ServerRuntimeContext} in
+ * {@link ServletContext}
*/
public static final String SERVER_RUNTIME_CONTEXT_ATTRIBUTE = "org.apache.vysper.xmpp.server.ServerRuntimeContext";
private final static Logger LOG = LoggerFactory.getLogger(JettyXmppWebSocketServlet.class);
private static final long serialVersionUID = 197413099255392883L;
+
private static final String SUB_PROTOCOL = "xmpp";
private ServerRuntimeContext serverRuntimeContext;
+ private StanzaProcessor stanzaProcessor;
+
public JettyXmppWebSocketServlet() {
// default cstr needed
}
- public JettyXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
+ public JettyXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
this.serverRuntimeContext = serverRuntimeContext;
+ this.stanzaProcessor = stanzaProcessor;
}
/**
@@ -69,10 +77,21 @@
public void init() throws ServletException {
super.init();
- if(serverRuntimeContext == null) {
- serverRuntimeContext = (ServerRuntimeContext) getServletContext().getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
- if(serverRuntimeContext == null) {
- throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \"" + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+ if (serverRuntimeContext == null) {
+ serverRuntimeContext = (ServerRuntimeContext) getServletContext()
+ .getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
+ if (serverRuntimeContext == null) {
+ throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \""
+ + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+ }
+ }
+
+ if (stanzaProcessor == null) {
+ stanzaProcessor = (StanzaProcessor) getServletContext()
+ .getAttribute(StanzaProcessor.class.getCanonicalName());
+ if (stanzaProcessor == null) {
+ throw new RuntimeException("Failed to get Vysper StanzaProcessor from servlet context attribute \""
+ + StanzaProcessor.class.getCanonicalName() + "\"");
}
}
}
@@ -80,11 +99,12 @@
/**
* {@inheritDoc}
*
- * Will return null if the client does not provide the correct websocket sub protocol. "xmpp" is required.
+ * Will return null if the client does not provide the correct websocket sub
+ * protocol. "xmpp" is required.
*/
public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
- if(SUB_PROTOCOL.equals(protocol)) {
- JettyXmppWebSocket sessionContext = new JettyXmppWebSocket(serverRuntimeContext);
+ if (SUB_PROTOCOL.equals(protocol)) {
+ JettyXmppWebSocket sessionContext = new JettyXmppWebSocket(serverRuntimeContext, stanzaProcessor);
return sessionContext;
} else {
LOG.warn("Unsupported WebSocket sub protocol, must be \"xmpp\"");
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
index 4776c09..bb92b82 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
@@ -25,6 +25,7 @@
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.slf4j.Logger;
@@ -42,8 +43,8 @@
private WebSocketBackedSessionContext sessionContext;
private WsOutbound outbound;
- public TomcatXmppWebSocket(ServerRuntimeContext serverRuntimeContext) {
- this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, this);
+ public TomcatXmppWebSocket(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
+ this.sessionContext = new WebSocketBackedSessionContext(serverRuntimeContext, stanzaProcessor, this);
}
/**
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
index ca901ee..c628b9a 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
@@ -27,16 +27,18 @@
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
- * Servlet for initiating websocket connections in Apache Tomcat. Requires Tomcat 7.0.27 or later.
+ * Servlet for initiating websocket connections in Apache Tomcat. Requires
+ * Tomcat 7.0.27 or later.
* <p>
- * When creating this servlet from web.xml, the Vysper server needs to be started beforehand
- * (e.g. from a {@link ServletContextListener} and the {@link ServerRuntimeContext} needs to be
- * added as an attribute in the {@link ServletContext} with the key "org.apache.vysper.xmpp.server.ServerRuntimeContext".
+ * When creating this servlet from web.xml, the Vysper server needs to be
+ * started beforehand (e.g. from a {@link ServletContextListener} and the
+ * {@link ServerRuntimeContext} needs to be added as an attribute in the
+ * {@link ServletContext} with the key
+ * "org.apache.vysper.xmpp.server.ServerRuntimeContext".
* </p>
*
* @author The Apache MINA Project (dev@mina.apache.org)
@@ -44,23 +46,26 @@
public class TomcatXmppWebSocketServlet extends WebSocketServlet {
/**
- * The attribute key for the {@link ServerRuntimeContext} in {@link ServletContext}
+ * The attribute key for the {@link ServerRuntimeContext} in
+ * {@link ServletContext}
*/
public static final String SERVER_RUNTIME_CONTEXT_ATTRIBUTE = "org.apache.vysper.xmpp.server.ServerRuntimeContext";
- private final static Logger LOG = LoggerFactory.getLogger(TomcatXmppWebSocketServlet.class);
-
private static final long serialVersionUID = 197413099255392884L;
+
private static final String SUB_PROTOCOL = "xmpp";
private ServerRuntimeContext serverRuntimeContext;
+ private StanzaProcessor stanzaProcessor;
+
public TomcatXmppWebSocketServlet() {
// default cstr needed
}
- public TomcatXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
+ public TomcatXmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
this.serverRuntimeContext = serverRuntimeContext;
+ this.stanzaProcessor = stanzaProcessor;
}
/**
@@ -70,10 +75,21 @@
public void init() throws ServletException {
super.init();
- if(serverRuntimeContext == null) {
- serverRuntimeContext = (ServerRuntimeContext) getServletContext().getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
- if(serverRuntimeContext == null) {
- throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \"" + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+ if (serverRuntimeContext == null) {
+ serverRuntimeContext = (ServerRuntimeContext) getServletContext()
+ .getAttribute(SERVER_RUNTIME_CONTEXT_ATTRIBUTE);
+ if (serverRuntimeContext == null) {
+ throw new RuntimeException("Failed to get Vysper ServerRuntimeContext from servlet context attribute \""
+ + SERVER_RUNTIME_CONTEXT_ATTRIBUTE + "\"");
+ }
+ }
+
+ if (stanzaProcessor == null) {
+ stanzaProcessor = (StanzaProcessor) getServletContext()
+ .getAttribute(StanzaProcessor.class.getCanonicalName());
+ if (stanzaProcessor == null) {
+ throw new RuntimeException("Failed to get Vysper StanzaProcessor from servlet context attribute \""
+ + StanzaProcessor.class.getCanonicalName() + "\"");
}
}
}
@@ -86,17 +102,19 @@
/**
* {@inheritDoc}
*
- * Will return null if the client does not provide the correct websocket sub protocol. "xmpp" is required.
+ * Will return null if the client does not provide the correct websocket sub
+ * protocol. "xmpp" is required.
*/
@Override
protected StreamInbound createWebSocketInbound(String subProtocol) {
// TODO subProtocol is always null on Tomcat 7.0.27, reactivate check when fixed
- //if (SUB_PROTOCOL.equals(subProtocol)) {
- TomcatXmppWebSocket sessionContext = new TomcatXmppWebSocket(serverRuntimeContext);
- return sessionContext;
- //} else {
- // LOG.warn("Unsupported websocket sub protocol, must be \"xmpp\", but was \"" + subProtocol + "\"");
- // return null;
- //}
+ // if (SUB_PROTOCOL.equals(subProtocol)) {
+ TomcatXmppWebSocket sessionContext = new TomcatXmppWebSocket(serverRuntimeContext, stanzaProcessor);
+ return sessionContext;
+ // } else {
+ // LOG.warn("Unsupported websocket sub protocol, must be \"xmpp\", but was \"" +
+ // subProtocol + "\"");
+ // return null;
+ // }
}
}
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
index dfe781a..c96c446 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
@@ -33,6 +33,7 @@
import org.apache.vysper.xml.sax.impl.DefaultNonBlockingXMLReader;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
import org.apache.vysper.xmpp.server.AbstractSessionContext;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -51,13 +52,19 @@
public class WebSocketBackedSessionContext extends AbstractSessionContext implements XMLElementListener, StanzaWriter {
private final static Charset CHARSET = Charset.forName("UTF-8");
+
private final static CharsetDecoder CHARSET_DECODER = CHARSET.newDecoder();
private NonBlockingXMLReader xmlReader = new DefaultNonBlockingXMLReader();
+
+ private final StanzaProcessor stanzaProcessor;
+
private Outbound outbound;
- public WebSocketBackedSessionContext(ServerRuntimeContext serverRuntimeContext, Outbound outbound) {
- super(serverRuntimeContext, new SessionStateHolder());
+ public WebSocketBackedSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor,
+ Outbound outbound) {
+ super(serverRuntimeContext, stanzaProcessor, new SessionStateHolder());
+ this.stanzaProcessor = stanzaProcessor;
this.outbound = outbound;
@@ -104,7 +111,8 @@
*/
public void element(XMLElement element) {
// on parsed stanzas
- serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, this, (Stanza) element, sessionStateHolder);
+ stanzaProcessor.processStanza(serverRuntimeContext, this, (Stanza) element,
+ sessionStateHolder);
}
public void onOpen() {
@@ -120,7 +128,7 @@
throw new RuntimeException(e);
} catch (SAXException e) {
Stanza errorStanza = ServerErrorResponses.getStreamError(StreamErrorCondition.XML_NOT_WELL_FORMED,
- getXMLLang(), "Stanza not well-formed", null);
+ getXMLLang(), "Stanza not well-formed", null);
write(errorStanza);
endSession(SessionTerminationCause.STREAM_ERROR);
}
@@ -136,7 +144,8 @@
public void write(Stanza stanza) {
// handle stream open
Renderer renderer = new Renderer(stanza);
- if("stream".equals(stanza.getName()) && NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS.equals(stanza.getNamespaceURI())) {
+ if ("stream".equals(stanza.getName())
+ && NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS.equals(stanza.getNamespaceURI())) {
// stream:stream and stream:features comes at the same time, split them
write(renderer.getOpeningElement());
write(renderer.getElementContent());
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
index b8b59f1..b4b0473 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
@@ -21,6 +21,7 @@
import java.io.IOException;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.Endpoint;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.eclipse.jetty.server.Connector;
@@ -45,6 +46,8 @@
protected final static Logger logger = LoggerFactory.getLogger(WebSocketEndpoint.class);
protected ServerRuntimeContext serverRuntimeContext;
+
+ private StanzaProcessor stanzaProcessor;
protected int port = 8080;
@@ -65,6 +68,11 @@
this.serverRuntimeContext = serverRuntimeContext;
}
+ @Override
+ public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+ this.stanzaProcessor = stanzaProcessor;
+ }
+
/**
* Set the port on which the endpoint will listen for incoming traffic.
* Defaults to 8080.
@@ -142,7 +150,7 @@
ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
servletContext.setContextPath(contextPath);
- JettyXmppWebSocketServlet wsServlet = new JettyXmppWebSocketServlet(serverRuntimeContext);
+ JettyXmppWebSocketServlet wsServlet = new JettyXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
servletContext.addServlet(new ServletHolder(wsServlet), "/ws");
return servletContext;
diff --git a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
index 9e7a60d..5376983 100644
--- a/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
+++ b/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
@@ -19,6 +19,7 @@
*/
package org.apache.vysper.xmpp.extension.websockets;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -34,7 +35,7 @@
super();
}
- public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
- super(serverRuntimeContext);
+ public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
+ super(serverRuntimeContext, stanzaProcessor);
}
}
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
index de61107..3c8b7f9 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
@@ -23,6 +23,7 @@
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.eclipse.jetty.websocket.WebSocket;
import org.junit.Assert;
@@ -36,11 +37,13 @@
public class JettyXmppWebSocketServletTest {
private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+ private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
@Test
public void doWebSocketConnectWithDefaultCstr() throws ServletException {
ServletContext servletContext = Mockito.mock(ServletContext.class);
Mockito.when(servletContext.getAttribute(JettyXmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
+ Mockito.when(servletContext.getAttribute(StanzaProcessor.class.getCanonicalName())).thenReturn(stanzaProcessor);
ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
@@ -54,7 +57,7 @@
@Test
public void doWebSocketConnectWithDirectCstr() throws ServletException {
- JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext);
+ JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
WebSocket webSocket = servlet.doWebSocketConnect(null, "xmpp");
Assert.assertTrue(webSocket instanceof JettyXmppWebSocket);
@@ -62,7 +65,7 @@
@Test
public void doWebSocketConnectWithInvalidSubprotocl() throws ServletException {
- JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext);
+ JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
WebSocket webSocket = servlet.doWebSocketConnect(null, "dummy");
Assert.assertNull(webSocket);
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
index 7473b0f..868456c 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
@@ -28,7 +28,6 @@
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.eclipse.jetty.websocket.WebSocket.Connection;
-import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
@@ -39,26 +38,24 @@
public class JettyXmppWebSocketTest {
private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
- private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
- private Connection outbound = Mockito.mock(Connection.class);
- @Before
- public void before() {
- Mockito.when(serverRuntimeContext.getStanzaProcessor()).thenReturn(stanzaProcessor);
- }
+ private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
+ private Connection outbound = Mockito.mock(Connection.class);
@Test
public void onMessage() {
- JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext);
+ JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext, stanzaProcessor);
context.onMessage("<test></test>");
Stanza expected = new StanzaBuilder("test").build();
- Mockito.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext), Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
+ Mockito.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext),
+ Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
}
@Test
public void write() throws IOException {
- JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext);
+ JettyXmppWebSocket context = new JettyXmppWebSocket(serverRuntimeContext, stanzaProcessor);
context.onOpen(outbound);
context.write("<test></test>");
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
index 0244f88..5c42a89 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
@@ -24,6 +24,7 @@
import javax.servlet.ServletException;
import org.apache.catalina.websocket.StreamInbound;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.junit.Assert;
import org.junit.Ignore;
@@ -37,12 +38,14 @@
public class TomcatXmppWebSocketServletTest {
private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+ private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
@Test
public void doWebSocketConnectWithDefaultCstr() throws ServletException {
ServletContext servletContext = Mockito.mock(ServletContext.class);
Mockito.when(servletContext.getAttribute(JettyXmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
-
+ Mockito.when(servletContext.getAttribute(StanzaProcessor.class.getCanonicalName())).thenReturn(stanzaProcessor);
+
ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
@@ -55,7 +58,7 @@
@Test
public void doWebSocketConnectWithDirectCstr() throws ServletException {
- TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext);
+ TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
StreamInbound webSocket = servlet.createWebSocketInbound("xmpp");
Assert.assertTrue(webSocket instanceof TomcatXmppWebSocket);
@@ -64,7 +67,7 @@
@Test
@Ignore("sub protocol check temporarily disabled for Tomcat")
public void doWebSocketConnectWithInvalidSubprotocl() throws ServletException {
- TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext);
+ TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet(serverRuntimeContext, stanzaProcessor);
StreamInbound webSocket = servlet.createWebSocketInbound("dummy");
Assert.assertNull(webSocket);
diff --git a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
index f09756a..ac19a8b 100644
--- a/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
+++ b/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
@@ -29,7 +29,6 @@
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
-import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
@@ -40,26 +39,24 @@
public class TomcatXmppWebSocketTest {
private StanzaProcessor stanzaProcessor = Mockito.mock(StanzaProcessor.class);
- private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
- private WsOutbound outbound = Mockito.mock(WsOutbound.class);
- @Before
- public void before() {
- Mockito.when(serverRuntimeContext.getStanzaProcessor()).thenReturn(stanzaProcessor);
- }
+ private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+
+ private WsOutbound outbound = Mockito.mock(WsOutbound.class);
@Test
public void onMessage() throws IOException {
- TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext);
+ TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext, stanzaProcessor);
context.onTextMessage(CharBuffer.wrap("<test></test>"));
Stanza expected = new StanzaBuilder("test").build();
- Mockito.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext), Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
+ Mockito.verify(stanzaProcessor).processStanza(Mockito.eq(serverRuntimeContext),
+ Mockito.any(SessionContext.class), Mockito.eq(expected), Mockito.any(SessionStateHolder.class));
}
@Test
public void write() throws IOException {
- TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext);
+ TomcatXmppWebSocket context = new TomcatXmppWebSocket(serverRuntimeContext, stanzaProcessor);
context.onOpen(outbound);
context.write("<test></test>");
diff --git a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java
index a751e2d..eb30a76 100644
--- a/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java
+++ b/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java
@@ -31,6 +31,7 @@
import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
import org.apache.vysper.xmpp.server.AbstractSessionContext;
import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
@@ -113,21 +114,20 @@
}
public TestSessionContext(SessionStateHolder sessionStateHolder) {
- super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
- new MemoryStorageProviderRegistry()), sessionStateHolder);
- sessionId = serverRuntimeContext.getNextSessionId();
- xmlLang = "de";
- this.relay = ((DefaultServerRuntimeContext) serverRuntimeContext).getStanzaRelay();
- }
-
- public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaReceiverRelay relay) {
- this(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
- new MemoryStorageProviderRegistry()), sessionStateHolder, relay);
+ this(sessionStateHolder, new RecordingStanzaRelay());
}
public TestSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
StanzaRelay relay) {
- super(serverRuntimeContext, sessionStateHolder);
+ super(serverRuntimeContext, new ProtocolWorker(relay), sessionStateHolder);
+ sessionId = serverRuntimeContext.getNextSessionId();
+ xmlLang = "de";
+ this.relay = relay;
+ }
+
+ public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaRelay relay) {
+ super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), relay,
+ new MemoryStorageProviderRegistry()), new ProtocolWorker(relay), sessionStateHolder);
sessionId = serverRuntimeContext.getNextSessionId();
xmlLang = "de";
this.relay = relay;
diff --git a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java
index 084c807..aeab842 100644
--- a/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java
+++ b/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java
@@ -31,6 +31,7 @@
import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.protocol.ProtocolWorker;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
import org.apache.vysper.xmpp.server.AbstractSessionContext;
import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
@@ -113,21 +114,20 @@
}
public TestSessionContext(SessionStateHolder sessionStateHolder) {
- super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
- new MemoryStorageProviderRegistry()), sessionStateHolder);
- sessionId = serverRuntimeContext.getNextSessionId();
- xmlLang = "de";
- this.relay = ((DefaultServerRuntimeContext) serverRuntimeContext).getStanzaRelay();
- }
-
- public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaReceiverRelay relay) {
- this(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay(),
- new MemoryStorageProviderRegistry()), sessionStateHolder, relay);
+ this(sessionStateHolder, new RecordingStanzaRelay());
}
public TestSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder,
StanzaRelay relay) {
- super(serverRuntimeContext, sessionStateHolder);
+ super(serverRuntimeContext, new ProtocolWorker(relay), sessionStateHolder);
+ sessionId = serverRuntimeContext.getNextSessionId();
+ xmlLang = "de";
+ this.relay = relay;
+ }
+
+ public TestSessionContext(SessionStateHolder sessionStateHolder, StanzaRelay relay) {
+ super(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), relay,
+ new MemoryStorageProviderRegistry()), new ProtocolWorker(relay), sessionStateHolder);
sessionId = serverRuntimeContext.getNextSessionId();
xmlLang = "de";
this.relay = relay;
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
index 25547db..f281d96 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
@@ -39,6 +39,7 @@
import org.apache.vysper.xml.fragment.Renderer;
import org.apache.vysper.xml.fragment.XMLElement;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.AbstractSessionContext;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionState;
@@ -144,10 +145,11 @@
/**
* Creates a new context for a session
* @param serverRuntimeContext
+ * @param stanzaProcessor
* @param inactivityChecker
*/
- public BoshBackedSessionContext(ServerRuntimeContext serverRuntimeContext, BoshHandler boshHandler, InactivityChecker inactivityChecker) {
- super(serverRuntimeContext, new SessionStateHolder());
+ public BoshBackedSessionContext(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor, BoshHandler boshHandler, InactivityChecker inactivityChecker) {
+ super(serverRuntimeContext, stanzaProcessor, new SessionStateHolder());
// in BOSH we jump directly to the encrypted state
sessionStateHolder.setState(SessionState.ENCRYPTED);
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
index 7c78f80..c303d01 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
@@ -22,6 +22,7 @@
import java.io.IOException;
import java.util.List;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.Endpoint;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.eclipse.jetty.server.Connector;
@@ -48,7 +49,9 @@
protected final static Logger logger = LoggerFactory.getLogger(BoshEndpoint.class);
protected ServerRuntimeContext serverRuntimeContext;
-
+
+ private StanzaProcessor stanzaProcessor;
+
protected int port = 8080;
protected Server server;
@@ -67,6 +70,11 @@
this.serverRuntimeContext = serverRuntimeContext;
}
+ @Override
+ public void setStanzaProcessor(StanzaProcessor stanzaProcessor) {
+ this.stanzaProcessor = stanzaProcessor;
+ }
+
/**
* Setter for the listen port
* @param port
@@ -175,7 +183,7 @@
boshContext.setContextPath(contextPath);
BoshServlet boshServlet = new BoshServlet();
- boshServlet.setServerRuntimeContext(serverRuntimeContext);
+ boshServlet.inject(serverRuntimeContext, stanzaProcessor);
boshServlet.setAccessControlAllowOrigin(accessControlAllowOrigin);
boshContext.addServlet(new ServletHolder(boshServlet), "/");
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
index 87eb7e8..847eea4 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
@@ -22,6 +22,7 @@
import org.apache.vysper.xml.fragment.XMLElement;
import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionState;
import org.apache.vysper.xmpp.server.response.ServerResponses;
@@ -51,6 +52,8 @@
private static final Logger LOGGER = LoggerFactory.getLogger(BoshHandler.class);
private ServerRuntimeContext serverRuntimeContext;
+
+ private StanzaProcessor stanzaProcessor;
private Map<String, BoshBackedSessionContext> sessions;
@@ -85,9 +88,13 @@
public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
this.serverRuntimeContext = serverRuntimeContext;
}
+
+ public void setStanzaProcessor(StanzaProcessor stanzaProcessor){
+ this.stanzaProcessor = stanzaProcessor;
+ }
protected BoshBackedSessionContext createSessionContext() {
- return new BoshBackedSessionContext(serverRuntimeContext, this, inactivityChecker);
+ return new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, this, inactivityChecker);
}
/**
@@ -225,7 +232,7 @@
stanza = new Stanza(element.getNamespaceURI(), element.getName(), element.getNamespacePrefix(),
element.getAttributes(), element.getInnerFragments());
}
- serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, session, stanza,
+ stanzaProcessor.processStanza(serverRuntimeContext, session, stanza,
session.getStateHolder());
}
diff --git a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java
index e594309..9f71369 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshServlet.java
@@ -19,6 +19,7 @@
*/
package org.apache.vysper.xmpp.extension.xep0124;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -76,14 +77,14 @@
/**
* Setter for the {@link ServerRuntimeContext}
* @param serverRuntimeContext
+ * @param stanzaProcessor
*/
- public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
+ public void inject(ServerRuntimeContext serverRuntimeContext, StanzaProcessor stanzaProcessor) {
boshHandler.setServerRuntimeContext(serverRuntimeContext);
+ boshHandler.setStanzaProcessor(stanzaProcessor);
serverRuntimeContext.registerServerRuntimeContextService(boshHandler);
}
-
-
public List<String> getAccessControlAllowOrigin() {
return accessControlAllowOrigin;
}
diff --git a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java
index 750f4ca..b8a8c69 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java
@@ -34,6 +34,7 @@
import org.apache.commons.lang.StringUtils;
import org.apache.vysper.xml.fragment.Renderer;
import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.easymock.Capture;
@@ -51,6 +52,8 @@
private ServerRuntimeContext serverRuntimeContext;
+ private StanzaProcessor stanzaProcessor;
+
private InactivityChecker inactivityChecker;
@Before
@@ -58,6 +61,7 @@
mocksControl = createControl();
boshHandler = mocksControl.createMock(BoshHandler.class);
serverRuntimeContext = mocksControl.createMock(ServerRuntimeContext.class);
+ stanzaProcessor = mocksControl.createMock(StanzaProcessor.class);
expect(serverRuntimeContext.getNextSessionId()).andReturn("123");
expect(serverRuntimeContext.getServerEntity()).andReturn(new EntityImpl(null, "vysper.org", null));
expect(serverRuntimeContext.getDefaultXMLLang()).andReturn("en");
@@ -87,7 +91,7 @@
httpServletRequest.setAttribute(eq(BOSH_RESPONSE_ATTRIBUTE), EasyMock.<BoshResponse> capture(captured));
mocksControl.replay();
- BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+ BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
Stanza body = BoshStanzaUtils.EMPTY_BOSH_RESPONSE;
boshBackedSessionContext.insertRequest(new BoshRequest(httpServletRequest, body, 1L));
boshBackedSessionContext.writeBoshResponse(body);
@@ -101,7 +105,7 @@
@Test
public void testSetBoshVersion1() {
mocksControl.replay();
- BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+ BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
boshBackedSessionContext.setBoshVersion("1.8");
assertEquals("1.8", boshBackedSessionContext.getBoshVersion());
mocksControl.verify();
@@ -110,7 +114,7 @@
@Test
public void testSetBoshVersion2() {
mocksControl.replay();
- BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+ BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
boshBackedSessionContext.setBoshVersion("2.0");
assertEquals("1.9", boshBackedSessionContext.getBoshVersion());
mocksControl.verify();
@@ -146,7 +150,7 @@
// write0
mocksControl.replay();
- BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+ BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
boshBackedSessionContext.insertRequest(br);
listenerCaptured.getValue().onTimeout(asyncEvent);
@@ -192,7 +196,7 @@
httpServletRequest1.setAttribute(eq(BOSH_RESPONSE_ATTRIBUTE), EasyMock.<BoshResponse> capture(captured));
mocksControl.replay();
- BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, null, inactivityChecker);
+ BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
boshBackedSessionContext.setHold(2);
// consecutive writes with RID 1 and 2
@@ -233,7 +237,7 @@
mocksControl.replay();
BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(
- serverRuntimeContext, null, inactivityChecker);
+ serverRuntimeContext, stanzaProcessor, null, inactivityChecker);
boshBackedSessionContext.writeBoshResponse(body); // queued for merging
boshBackedSessionContext.writeBoshResponse(body); // queued for merging
boshBackedSessionContext.writeBoshResponse(body); // queued for merging
diff --git a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
index e41f759..e01a829 100644
--- a/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
+++ b/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
@@ -58,6 +58,7 @@
private IMocksControl mocksControl;
private ServerRuntimeContext serverRuntimeContext;
+ private StanzaProcessor stanzaProcessor;
private BoshHandler boshHandler;
@@ -65,8 +66,10 @@
public void setUp() throws Exception {
mocksControl = createControl();
serverRuntimeContext = mocksControl.createMock(ServerRuntimeContext.class);
+ stanzaProcessor = mocksControl.createMock(StanzaProcessor.class);
boshHandler = new BoshHandler();
boshHandler.setServerRuntimeContext(serverRuntimeContext);
+ boshHandler.setStanzaProcessor(stanzaProcessor);
}
@After
@@ -130,8 +133,6 @@
asyncContext.setTimeout(anyLong());
httpServletRequest.setAttribute(eq(BOSH_REQUEST_ATTRIBUTE), EasyMock.<BoshRequest> capture(br));
asyncContext.addListener(EasyMock.<AsyncListener> anyObject());
- StanzaProcessor stanzaProcessor = mocksControl.createMock(StanzaProcessor.class);
- expect(serverRuntimeContext.getStanzaProcessor()).andReturn(stanzaProcessor);
Capture<Stanza> stanzaCaptured = new Capture<Stanza>();
stanzaProcessor.processStanza(eq(serverRuntimeContext), EasyMock.<SessionContext> anyObject(),
EasyMock.<Stanza> capture(stanzaCaptured), EasyMock.<SessionStateHolder> anyObject());