This is an automated email from the ASF dual-hosted git repository. ralaoui pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mina-vysper.git
The following commit(s) were added to refs/heads/master by this push: new cc0188c Remove getStanzaProcessor from the ServerRuntimeContext cc0188c is described below commit cc0188cd02508415d0cb93f60a78f33e90774b81 Author: Réda Housni Alaoui <reda.housniala...@gmail.com> AuthorDate: Sun Aug 25 13:04:17 2019 +0200 Remove getStanzaProcessor from the ServerRuntimeContext --- .../xmpp/exemples/embeddedwar/VysperListener.java | 4 +- .../vysper/mina/MinaBackedSessionContext.java | 7 +-- .../java/org/apache/vysper/mina/TCPEndpoint.java | 13 +++-- .../apache/vysper/mina/XmppIoHandlerAdapter.java | 16 +++--- ...pringCompatibleDefaultServerRuntimeContext.java | 4 +- .../vysper/stanzasession/StanzaSessionContext.java | 10 ++-- .../vysper/stanzasession/StanzaSessionFactory.java | 9 +++- .../vysper/xmpp/protocol/StanzaProcessor.java | 6 +-- .../vysper/xmpp/server/AbstractSessionContext.java | 15 +++--- .../xmpp/server/DefaultServerRuntimeContext.java | 22 ++------ .../org/apache/vysper/xmpp/server/Endpoint.java | 4 ++ .../vysper/xmpp/server/ServerRuntimeContext.java | 2 - .../org/apache/vysper/xmpp/server/XMPPServer.java | 18 ++++++- .../server/s2s/DefaultXMPPServerConnector.java | 13 +++-- .../s2s/DefaultXMPPServerConnectorRegistry.java | 10 +++- .../stanzasession/StanzaSessionTestCase.java | 5 +- .../vysper/xmpp/server/TestSessionContext.java | 22 ++++---- ...DefaultXMPPServerConnectorRegistryTestCase.java | 15 ++++-- .../extension/websockets/JettyXmppWebSocket.java | 8 +-- .../websockets/JettyXmppWebSocketServlet.java | 44 ++++++++++----- .../extension/websockets/TomcatXmppWebSocket.java | 5 +- .../websockets/TomcatXmppWebSocketServlet.java | 62 ++++++++++++++-------- .../websockets/WebSocketBackedSessionContext.java | 19 +++++-- .../extension/websockets/WebSocketEndpoint.java | 10 +++- .../extension/websockets/XmppWebSocketServlet.java | 5 +- .../websockets/JettyXmppWebSocketServletTest.java | 7 ++- .../websockets/JettyXmppWebSocketTest.java | 15 +++--- .../websockets/TomcatXmppWebSocketServletTest.java | 9 ++-- .../websockets/TomcatXmppWebSocketTest.java | 15 +++--- .../extension/xep0045_muc/TestSessionContext.java | 22 ++++---- .../xep0060_pubsub/TestSessionContext.java | 22 ++++---- .../xep0124/BoshBackedSessionContext.java | 6 ++- .../xmpp/extension/xep0124/BoshEndpoint.java | 12 ++++- .../vysper/xmpp/extension/xep0124/BoshHandler.java | 11 +++- .../vysper/xmpp/extension/xep0124/BoshServlet.java | 7 +-- .../xep0124/BoshBackedSessionContextTest.java | 16 +++--- .../xmpp/extension/xep0124/BoshHandlerTest.java | 5 +- 37 files changed, 314 insertions(+), 181 deletions(-) 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.xep0054_vcardtemp.VcardTempModul 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 @@ public class VysperListener implements ServletContextListener { 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 @@ public class VysperListener implements ServletContextListener { // 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.core.session.IoSession; 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 @@ public class MinaBackedSessionContext extends AbstractSessionContext implements 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.filter.executor.OrderedThreadPoolExecutor; 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 @@ import org.apache.vysper.xmpp.server.ServerRuntimeContext; public class TCPEndpoint implements Endpoint { private ServerRuntimeContext serverRuntimeContext; + + private StanzaProcessor stanzaProcessor; private int port = 5222; @@ -59,7 +62,12 @@ public class TCPEndpoint implements Endpoint { 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 @@ public class TCPEndpoint implements Endpoint { 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.session.IoSession; 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.Logger; 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 (d...@mina.apache.org) @@ -54,10 +56,12 @@ public class XmppIoHandlerAdapter implements IoHandler { 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 @@ public class XmppIoHandlerAdapter implements IoHandler { 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 @@ public class XmppIoHandlerAdapter implements IoHandler { 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 @@ public class XmppIoHandlerAdapter implements IoHandler { @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.DeliveryFailureStrategy; 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 class SpringCompatibleDefaultServerRuntimeContext extends DefaultServerRu 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.LinkedList; 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 @@ import org.apache.vysper.xmpp.writer.StanzaWriter; 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 class StanzaSessionContext extends AbstractSessionContext implements Stan } 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 @@ import org.apache.vysper.xmpp.server.SessionState; 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 class StanzaSessionFactory implements Endpoint { 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 @@ public class StanzaSessionFactory implements Endpoint { 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 @@ public interface StanzaProcessor { /** * 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 java.util.Map; 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 @@ import org.slf4j.LoggerFactory; */ 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 @@ public abstract class AbstractSessionContext implements SessionContext { 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 @@ public abstract class AbstractSessionContext implements SessionContext { || 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 @@ public class DefaultServerRuntimeContext implements ServerRuntimeContext, Module // 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 @@ public class DefaultServerRuntimeContext implements ServerRuntimeContext, Module 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 class DefaultServerRuntimeContext implements ServerRuntimeContext, Module } 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 @@ public class DefaultServerRuntimeContext implements ServerRuntimeContext, Module 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 @@ import java.io.IOException; 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 @@ public interface ServerRuntimeContext { 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.extension.xep0160_offline_storage.OfflineS 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 @@ public class XMPPServer { private String serverDomain; private DefaultServerRuntimeContext serverRuntimeContext; + + private StanzaProcessor stanzaProcessor; private StorageProviderRegistry storageProviderRegistry; @@ -193,7 +197,9 @@ public class XMPPServer { 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 @@ public class XMPPServer { 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 class XMPPServer { 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.ResponseStanzaContainer; 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 @@ public class DefaultXMPPServerConnector implements XmppPingListener, XMPPServerC private final ServerRuntimeContext serverRuntimeContext; private final StanzaRelay stanzaRelay; + + private final StanzaProcessor stanzaProcessor; private MinaBackedSessionContext sessionContext; @@ -108,9 +111,11 @@ public class DefaultXMPPServerConnector implements XmppPingListener, XMPPServerC 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 @@ public class DefaultXMPPServerConnector implements XmppPingListener, XMPPServerC return; } - serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, sessionContext, stanza, + stanzaProcessor.processStanza(serverRuntimeContext, sessionContext, stanza, sessionStateHolder); } } @@ -301,7 +306,7 @@ public class DefaultXMPPServerConnector implements XmppPingListener, XMPPServerC 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.StanzaRelay; 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 @@ public class DefaultXMPPServerConnectorRegistry implements XMPPServerConnectorRe 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 @@ public class DefaultXMPPServerConnectorRegistry implements XMPPServerConnectorRe 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.Entity; 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 @@ public class StanzaSessionTestCase extends TestCase { 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.RecordingStanzaRelay; 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 class TestSessionContext extends AbstractSessionContext implements Stanza } 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 @@ public class DefaultXMPPServerConnectorRegistryTestCase { @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 @@ public class DefaultXMPPServerConnectorRegistryTestCase { @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 @@ public class DefaultXMPPServerConnectorRegistryTestCase { @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 @@ public class DefaultXMPPServerConnectorRegistryTestCase { @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 @@ public class DefaultXMPPServerConnectorRegistryTestCase { @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 @@ package org.apache.vysper.xmpp.extension.websockets; 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 @@ import org.slf4j.LoggerFactory; */ 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 @@ public class JettyXmppWebSocket implements WebSocket, WebSocket.OnTextMessage, O 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.ServletContextListener; 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 @@ import org.slf4j.LoggerFactory; /** * 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 (d...@mina.apache.org) @@ -43,23 +46,28 @@ import org.slf4j.LoggerFactory; 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 class JettyXmppWebSocketServlet extends WebSocketServlet { 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 @@ public class JettyXmppWebSocketServlet extends WebSocketServlet { /** * {@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 java.nio.CharBuffer; 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 @@ public class TomcatXmppWebSocket extends MessageInbound implements Outbound { 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 javax.servlet.ServletException; 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 (d...@mina.apache.org) @@ -44,23 +46,26 @@ import org.slf4j.LoggerFactory; 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 class TomcatXmppWebSocketServlet extends WebSocketServlet { 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 @@ public class TomcatXmppWebSocketServlet extends WebSocketServlet { /** * {@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.NonBlockingXMLReader; 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 @@ import org.xml.sax.SAXException; 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 class WebSocketBackedSessionContext extends AbstractSessionContext implem */ 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 @@ public class WebSocketBackedSessionContext extends AbstractSessionContext implem 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 class WebSocketBackedSessionContext extends AbstractSessionContext implem 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 @@ package org.apache.vysper.xmpp.extension.websockets; 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 @@ public class WebSocketEndpoint implements Endpoint { protected final static Logger logger = LoggerFactory.getLogger(WebSocketEndpoint.class); protected ServerRuntimeContext serverRuntimeContext; + + private StanzaProcessor stanzaProcessor; protected int port = 8080; @@ -65,6 +68,11 @@ public class WebSocketEndpoint implements Endpoint { 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 @@ public class WebSocketEndpoint implements Endpoint { 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 @@ public class XmppWebSocketServlet extends JettyXmppWebSocketServlet { 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.ServletConfig; 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 @@ import org.mockito.Mockito; 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 @@ public class JettyXmppWebSocketServletTest { @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 @@ public class JettyXmppWebSocketServletTest { @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.server.SessionContext; 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 @@ import org.mockito.Mockito; 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 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.ServletContext; 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 @@ import org.mockito.Mockito; 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 @@ public class TomcatXmppWebSocketServletTest { @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 @@ public class TomcatXmppWebSocketServletTest { @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.ServerRuntimeContext; 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 @@ import org.mockito.Mockito; 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 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.RecordingStanzaRelay; 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 class TestSessionContext extends AbstractSessionContext implements Stanza } 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.RecordingStanzaRelay; 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 class TestSessionContext extends AbstractSessionContext implements Stanza } 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.commons.lang.StringUtils; 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 @@ public class BoshBackedSessionContext extends AbstractSessionContext implements /** * 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 @@ package org.apache.vysper.xmpp.extension.xep0124; 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 @@ public class BoshEndpoint implements Endpoint { 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 @@ public class BoshEndpoint implements Endpoint { this.serverRuntimeContext = serverRuntimeContext; } + @Override + public void setStanzaProcessor(StanzaProcessor stanzaProcessor) { + this.stanzaProcessor = stanzaProcessor; + } + /** * Setter for the listen port * @param port @@ -175,7 +183,7 @@ public class BoshEndpoint implements Endpoint { 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 @@ package org.apache.vysper.xmpp.extension.xep0124; 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 @@ public class BoshHandler implements ServerRuntimeContextService { 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 class BoshHandler implements ServerRuntimeContextService { 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 @@ public class BoshHandler implements ServerRuntimeContextService { 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 @@ public class BoshServlet extends HttpServlet { /** * 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 javax.servlet.http.HttpServletRequest; 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 @@ public class BoshBackedSessionContextTest { private ServerRuntimeContext serverRuntimeContext; + private StanzaProcessor stanzaProcessor; + private InactivityChecker inactivityChecker; @Before @@ -58,6 +61,7 @@ public class BoshBackedSessionContextTest { 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 @@ public class BoshBackedSessionContextTest { 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 @@ public class BoshBackedSessionContextTest { @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 @@ public class BoshBackedSessionContextTest { @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 @@ public class BoshBackedSessionContextTest { // 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 @@ public class BoshBackedSessionContextTest { 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 @@ public class BoshBackedSessionContextTest { 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 @@ public class BoshHandlerTest { private IMocksControl mocksControl; private ServerRuntimeContext serverRuntimeContext; + private StanzaProcessor stanzaProcessor; private BoshHandler boshHandler; @@ -65,8 +66,10 @@ public class BoshHandlerTest { 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 @@ public class BoshHandlerTest { 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());