Author: ngn
Date: Sun Apr 22 12:04:53 2012
New Revision: 1328861
URL: http://svn.apache.org/viewvc?rev=1328861&view=rev
Log:
Implement web socket support for Tomcat 7.0.27
Also generalizes the web socket code in general which should
make it easier to adapt for future implementations
Added:
mina/vysper/trunk/examples/embedded-war/src/main/resources/log4j.properties
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
- copied, changed from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/Outbound.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
- copied, changed from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
- copied, changed from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
- copied, changed from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
- copied, changed from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
- copied, changed from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java
Removed:
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java
Modified:
mina/vysper/trunk/examples/embedded-war/pom.xml
mina/vysper/trunk/examples/embedded-war/src/main/webapp/WEB-INF/web.xml
mina/vysper/trunk/pom.xml
mina/vysper/trunk/server/extensions/websockets/pom.xml
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
Modified: mina/vysper/trunk/examples/embedded-war/pom.xml
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/examples/embedded-war/pom.xml?rev=1328861&r1=1328860&r2=1328861&view=diff
==============================================================================
--- mina/vysper/trunk/examples/embedded-war/pom.xml (original)
+++ mina/vysper/trunk/examples/embedded-war/pom.xml Sun Apr 22 12:04:53 2012
@@ -35,7 +35,7 @@
<artifactId>vysper-core</artifactId>
</dependency>
-<!--
+<!--
Only works when deployed on Jetty.
<dependency>
<groupId>org.apache.vysper.extensions</groupId>
@@ -57,6 +57,26 @@
</dependency>
-->
+<!--
+ Only works when deployed on Tomcat 7.0.27 or later
+ <dependency>
+ <groupId>org.apache.vysper.extensions</groupId>
+ <artifactId>vysper-websockets</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-catalina</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-coyote</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ -->
+
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
Added:
mina/vysper/trunk/examples/embedded-war/src/main/resources/log4j.properties
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/examples/embedded-war/src/main/resources/log4j.properties?rev=1328861&view=auto
==============================================================================
--- mina/vysper/trunk/examples/embedded-war/src/main/resources/log4j.properties
(added)
+++ mina/vysper/trunk/examples/embedded-war/src/main/resources/log4j.properties
Sun Apr 22 12:04:53 2012
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+log4j.rootLogger=debug, C
+
+log4j.logger.org.apache.vysper.mina.XmppIoHandlerAdapter=WARN,C
+log4j.logger.org.apache.mina.filter.executor.ExecutorFilter=WARN,C
+log4j.logger.org.apache.http=DEBUG
+
+
+log4j.appender.C=org.apache.log4j.ConsoleAppender
+log4j.appender.C.layout=org.apache.log4j.PatternLayout
+log4j.appender.C.layout.ConversionPattern=%m%n
+
Modified:
mina/vysper/trunk/examples/embedded-war/src/main/webapp/WEB-INF/web.xml
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/examples/embedded-war/src/main/webapp/WEB-INF/web.xml?rev=1328861&r1=1328860&r2=1328861&view=diff
==============================================================================
--- mina/vysper/trunk/examples/embedded-war/src/main/webapp/WEB-INF/web.xml
(original)
+++ mina/vysper/trunk/examples/embedded-war/src/main/webapp/WEB-INF/web.xml Sun
Apr 22 12:04:53 2012
@@ -24,11 +24,11 @@
<listener-class>org.apache.vysper.xmpp.exemples.embeddedwar.VysperListener</listener-class>
</listener>
-<!--
+<!--
Only works when deployed on Jetty.
<servlet>
<servlet-name>WebSocket Servlet</servlet-name>
-
<servlet-class>org.apache.vysper.xmpp.extension.websockets.XmppWebSocketServlet</servlet-class>
+
<servlet-class>org.apache.vysper.xmpp.extension.websockets.JettyXmppWebSocketServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
@@ -36,6 +36,20 @@
<url-pattern>/ws</url-pattern>
</servlet-mapping>
-->
+
+<!--
+ Only works when deployed on Tomcat 7.0.27 or later.
+ <servlet>
+ <servlet-name>WebSocket Servlet</servlet-name>
+
<servlet-class>org.apache.vysper.xmpp.extension.websockets.TomcatXmppWebSocketServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>WebSocket Servlet</servlet-name>
+ <url-pattern>/ws</url-pattern>
+ </servlet-mapping>
+ -->
+
<servlet>
<servlet-name>Status</servlet-name>
<servlet-class>org.apache.vysper.xmpp.exemples.embeddedwar.StatusServlet</servlet-class>
Modified: mina/vysper/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/pom.xml?rev=1328861&r1=1328860&r2=1328861&view=diff
==============================================================================
--- mina/vysper/trunk/pom.xml (original)
+++ mina/vysper/trunk/pom.xml Sun Apr 22 12:04:53 2012
@@ -230,6 +230,18 @@
<version>8.1.3.v20120416</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-catalina</artifactId>
+ <version>7.0.27</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-coyote</artifactId>
+ <version>7.0.27</version>
+ </dependency>
+
<!-- Test dependencies -->
<dependency>
<groupId>junit</groupId>
Modified: mina/vysper/trunk/server/extensions/websockets/pom.xml
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/pom.xml?rev=1328861&r1=1328860&r2=1328861&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/pom.xml (original)
+++ mina/vysper/trunk/server/extensions/websockets/pom.xml Sun Apr 22 12:04:53
2012
@@ -39,11 +39,25 @@
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
+ <optional>true</optional>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-catalina</artifactId>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-coyote</artifactId>
+ <optional>true</optional>
</dependency>
<!-- Test dependencies -->
Added:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java?rev=1328861&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
(added)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocket.java
Sun Apr 22 12:04:53 2012
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import java.io.IOException;
+
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.eclipse.jetty.websocket.WebSocket;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Specialized {@link SessionContext} for Jetty Websocket endpoints.
+ *
+ * @author The Apache MINA Project ([email protected])
+ */
+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);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void onOpen(Connection outbound) {
+ LOG.info("WebSocket client connected");
+ this.outbound = outbound;
+
+ sessionContext.onOpen();
+ }
+
+
+ public void onMessage(String data) {
+ LOG.info("< " + data);
+ sessionContext.onMessage(data);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void onClose(int closeCode, String message) {
+ LOG.info("WebSocket client disconnected with Code " + closeCode + "
with " + message);
+
+ sessionContext.onClose();
+ }
+
+ public void write(String xml) throws IOException {
+ LOG.info("> " + xml);
+ outbound.sendMessage(xml);
+ }
+}
Copied:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
(from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java)
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java?p2=mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java&p1=mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java&r1=1328860&r2=1328861&rev=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServlet.java
Sun Apr 22 12:04:53 2012
@@ -31,60 +31,60 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Servlet for initiating websocket connections. Only support in Jetty.
+ * 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
+ * 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 ([email protected])
*/
-public class XmppWebSocketServlet extends WebSocketServlet {
-
+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(XmppWebSocketServlet.class);
-
+ 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;
-
- public XmppWebSocketServlet() {
+
+ public JettyXmppWebSocketServlet() {
// default cstr needed
}
-
- public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
+
+ public JettyXmppWebSocketServlet(ServerRuntimeContext
serverRuntimeContext) {
this.serverRuntimeContext = serverRuntimeContext;
}
-
+
/**
* {@inheritDoc}
*/
@Override
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 + "\"");
}
- }
+ }
}
/**
* {@inheritDoc}
- *
+ *
* 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)) {
- WebSocketBackedSessionContext sessionContext = new
WebSocketBackedSessionContext(serverRuntimeContext);
+ JettyXmppWebSocket sessionContext = new
JettyXmppWebSocket(serverRuntimeContext);
return sessionContext;
} else {
LOG.warn("Unsupported WebSocket sub protocol, must be \"xmpp\"");
Added:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/Outbound.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/Outbound.java?rev=1328861&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/Outbound.java
(added)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/Outbound.java
Sun Apr 22 12:04:53 2012
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import java.io.IOException;
+
+
+/**
+ * Generalized outbound web socket
+ *
+ * @author The Apache MINA Project ([email protected])
+ */
+public interface Outbound {
+
+ void write(String data) throws IOException;
+}
Added:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java?rev=1328861&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
(added)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocket.java
Sun Apr 22 12:04:53 2012
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+
+import org.apache.catalina.websocket.MessageInbound;
+import org.apache.catalina.websocket.WsOutbound;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Specialized {@link SessionContext} for Jetty Websocket endpoints.
+ *
+ * @author The Apache MINA Project ([email protected])
+ */
+public class TomcatXmppWebSocket extends MessageInbound implements Outbound {
+
+ private final static Logger LOG =
LoggerFactory.getLogger(TomcatXmppWebSocket.class);
+
+ private WebSocketBackedSessionContext sessionContext;
+ private WsOutbound outbound;
+
+ public TomcatXmppWebSocket(ServerRuntimeContext serverRuntimeContext) {
+ this.sessionContext = new
WebSocketBackedSessionContext(serverRuntimeContext, this);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void onOpen(WsOutbound outbound) {
+ LOG.info("WebSocket client connected");
+ this.outbound = outbound;
+
+ sessionContext.onOpen();
+ }
+
+ @Override
+ protected void onBinaryMessage(ByteBuffer message) throws IOException {
+ throw new UnsupportedOperationException(
+ "Binary message not supported.");
+ }
+
+ @Override
+ protected void onTextMessage(CharBuffer message) throws IOException {
+ String data = message.toString();
+ LOG.info("< " + data);
+ sessionContext.onMessage(data);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void onClose(int closeCode, String message) {
+ LOG.info("WebSocket client disconnected with Code " + closeCode + "
with " + message);
+
+ sessionContext.onClose();
+ }
+
+ public void write(String xml) throws IOException {
+ LOG.info("> " + xml);
+ CharBuffer buffer = CharBuffer.wrap(xml);
+ outbound.writeTextMessage(buffer);
+ }
+}
Copied:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
(from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java)
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java?p2=mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java&p1=mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java&r1=1328860&r2=1328861&rev=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServlet.java
Sun Apr 22 12:04:53 2012
@@ -19,76 +19,84 @@
*/
package org.apache.vysper.xmpp.extension.websockets;
+import java.util.List;
+
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
+import org.apache.catalina.websocket.StreamInbound;
+import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.eclipse.jetty.websocket.WebSocket;
-import org.eclipse.jetty.websocket.WebSocketServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Servlet for initiating websocket connections. Only support in Jetty.
+ * 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
+ * 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 ([email protected])
*/
-public class XmppWebSocketServlet extends WebSocketServlet {
-
+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(XmppWebSocketServlet.class);
-
- private static final long serialVersionUID = 197413099255392883L;
+ 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;
-
- public XmppWebSocketServlet() {
+
+ public TomcatXmppWebSocketServlet() {
// default cstr needed
}
-
- public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
+
+ public TomcatXmppWebSocketServlet(ServerRuntimeContext
serverRuntimeContext) {
this.serverRuntimeContext = serverRuntimeContext;
}
-
+
/**
* {@inheritDoc}
*/
@Override
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 + "\"");
}
- }
+ }
+ }
+
+ @Override
+ protected String selectSubProtocol(List<String> subProtocols) {
+ return SUB_PROTOCOL;
}
/**
* {@inheritDoc}
- *
+ *
* 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)) {
- WebSocketBackedSessionContext sessionContext = new
WebSocketBackedSessionContext(serverRuntimeContext);
+ @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\"");
- return null;
- }
+ //} else {
+ // LOG.warn("Unsupported websocket sub protocol, must be \"xmpp\",
but was \"" + subProtocol + "\"");
+ // return null;
+ //}
}
}
Modified:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java?rev=1328861&r1=1328860&r2=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketBackedSessionContext.java
Sun Apr 22 12:04:53 2012
@@ -41,9 +41,6 @@ import org.apache.vysper.xmpp.server.Ses
import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.writer.StanzaWriter;
-import org.eclipse.jetty.websocket.WebSocket;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
/**
@@ -51,19 +48,19 @@ import org.xml.sax.SAXException;
*
* @author The Apache MINA Project ([email protected])
*/
-public class WebSocketBackedSessionContext extends AbstractSessionContext
implements WebSocket, XMLElementListener, StanzaWriter, WebSocket.OnTextMessage
{
+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 final static Logger LOG =
LoggerFactory.getLogger(WebSocketBackedSessionContext.class);
-
- private Connection outbound;
private NonBlockingXMLReader xmlReader = new DefaultNonBlockingXMLReader();
- private boolean closed = false;
+ private Outbound outbound;
- public WebSocketBackedSessionContext(ServerRuntimeContext
serverRuntimeContext) {
+ public WebSocketBackedSessionContext(ServerRuntimeContext
serverRuntimeContext, Outbound outbound) {
super(serverRuntimeContext, new SessionStateHolder());
+
+ this.outbound = outbound;
+
XMPPContentHandler contentHandler = new XMPPContentHandler(new
StanzaBuilderFactory());
contentHandler.setListener(this);
@@ -105,65 +102,52 @@ public class WebSocketBackedSessionConte
/**
* {@inheritDoc}
*/
- public void onOpen(Connection outbound) {
- LOG.info("WebSocket client connected");
- this.outbound = outbound;
+ public void element(XMLElement element) {
+ // on parsed stanzas
+
serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext,
this, (Stanza) element, sessionStateHolder);
+ }
+ public void onOpen() {
// set to encrypted to skip TLS
sessionStateHolder.setState(SessionState.ENCRYPTED);
}
-
public void onMessage(String data) {
- LOG.info("< " + data);
- try {
- xmlReader.parse(IoBuffer.wrap(data.getBytes(CHARSET.name())),
CHARSET_DECODER);
- } catch (IOException e) {
- // should never happen since we read from a string
- throw new RuntimeException(e);
- } catch (SAXException e) {
- Stanza errorStanza =
ServerErrorResponses.getStreamError(StreamErrorCondition.XML_NOT_WELL_FORMED,
- getXMLLang(), "Stanza not well-formed", null);
- write(errorStanza);
- endSession(SessionTerminationCause.STREAM_ERROR);
- }
+ try {
+ xmlReader.parse(IoBuffer.wrap(data.getBytes(CHARSET.name())),
CHARSET_DECODER);
+ } catch (IOException e) {
+ // should never happen since we read from a string
+ throw new RuntimeException(e);
+ } catch (SAXException e) {
+ Stanza errorStanza =
ServerErrorResponses.getStreamError(StreamErrorCondition.XML_NOT_WELL_FORMED,
+ getXMLLang(), "Stanza not well-formed", null);
+ write(errorStanza);
+ endSession(SessionTerminationCause.STREAM_ERROR);
+ }
}
- /**
- * {@inheritDoc}
- */
- public void onClose(int closeCode, String message) {
- LOG.info("WebSocket client disconnected with Code " + closeCode + "
with " + message);
+ public void onClose() {
endSession(SessionTerminationCause.CONNECTION_ABORT);
}
/**
* {@inheritDoc}
*/
- public void element(XMLElement element) {
- // on parsed stanzas
-
serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext,
this, (Stanza) element, sessionStateHolder);
- }
-
- /**
- * {@inheritDoc}
- */
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())) {
// stream:stream and stream:features comes at the same time, split
them
- send(renderer.getOpeningElement());
- send(renderer.getElementContent());
+ write(renderer.getOpeningElement());
+ write(renderer.getElementContent());
} else {
- send(renderer.getComplete());
+ write(renderer.getComplete());
}
}
- private void send(String xml) {
+ private void write(String xml) {
try {
- LOG.info("> " + xml);
- outbound.sendMessage(xml);
+ outbound.write(xml);
} catch (IOException e) {
// communication with client broken, close session
endSession(SessionTerminationCause.CONNECTION_ABORT);
@@ -175,6 +159,5 @@ public class WebSocketBackedSessionConte
*/
public void close() {
// TODO how to handle?
- closed = true;
}
}
Modified:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java?rev=1328861&r1=1328860&r2=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebSocketEndpoint.java
Sun Apr 22 12:04:53 2012
@@ -66,7 +66,7 @@ public class WebSocketEndpoint implement
}
/**
- * Set the port on which the endpoint will listen for incoming traffic.
+ * Set the port on which the endpoint will listen for incoming traffic.
* Defaults to 8080.
* @param port The TCP/IP listener port
*/
@@ -77,7 +77,7 @@ public class WebSocketEndpoint implement
/**
* Configures the SSL keystore
* <p>
- * Required if SSL is enabled. Also, setting the keystore password is
+ * Required if SSL is enabled. Also, setting the keystore password is
* required.
* @param keystorePath The path to the Java keystore
* @param password The password for the Java keystore
@@ -100,14 +100,14 @@ public class WebSocketEndpoint implement
/**
* Determines the context URI where the websocket transport will be
accessible.
- * The default is as 'root context' under '/'.
+ * The default is as 'root context' under '/'.
* @param contextPath
*/
public void setContextPath(String contextPath) {
if (contextPath == null) contextPath = "/";
this.contextPath = contextPath;
}
-
+
/**
* create a basic Jetty server including a connector on the configured port
* override in subclass to create a different kind of setup or to reuse an
existing instance
@@ -132,31 +132,31 @@ public class WebSocketEndpoint implement
}
/**
- * create handler for XMPP over websockets.
+ * create handler for XMPP over websockets.
* for a different handler setup, override in a subclass.
* for more than one handler, add them to a
org.eclipse.jetty.server.handler.ContextHandlerCollection
- * and return the collection
+ * and return the collection
* @return
*/
protected Handler createHandler() {
ServletContextHandler servletContext = new
ServletContextHandler(ServletContextHandler.SESSIONS);
servletContext.setContextPath(contextPath);
- XmppWebSocketServlet wsServlet = new
XmppWebSocketServlet(serverRuntimeContext);
+ JettyXmppWebSocketServlet wsServlet = new
JettyXmppWebSocketServlet(serverRuntimeContext);
servletContext.addServlet(new ServletHolder(wsServlet), "/ws");
-
+
return servletContext;
}
-
+
/**
* {@inheritDoc}
- *
+ *
* @throws RuntimeException a wrapper of the possible {@link
java.lang.Exception} that Jetty can throw at start-up
*/
public void start() throws IOException {
server = createJettyServer();
Handler wsHandler = createHandler();
-
+
Handler existingHandler = server.getHandler();
if(existingHandler != null && existingHandler instanceof
HandlerCollection) {
((HandlerCollection)existingHandler).addHandler(wsHandler);
Modified:
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java?rev=1328861&r1=1328860&r2=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServlet.java
Sun Apr 22 12:04:53 2012
@@ -19,76 +19,22 @@
*/
package org.apache.vysper.xmpp.extension.websockets;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.eclipse.jetty.websocket.WebSocket;
-import org.eclipse.jetty.websocket.WebSocketServlet;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
/**
- * Servlet for initiating websocket connections. Only support in 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".
- * </p>
+ * @deprecated
+ * @see JettyXmppWebSocketServlet
*
* @author The Apache MINA Project ([email protected])
*/
-public class XmppWebSocketServlet extends WebSocketServlet {
-
- /**
- * 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(XmppWebSocketServlet.class);
-
- private static final long serialVersionUID = 197413099255392883L;
- private static final String SUB_PROTOCOL = "xmpp";
-
- private ServerRuntimeContext serverRuntimeContext;
-
- public XmppWebSocketServlet() {
- // default cstr needed
- }
-
- public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
- this.serverRuntimeContext = serverRuntimeContext;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- 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 + "\"");
- }
- }
- }
+public class XmppWebSocketServlet extends JettyXmppWebSocketServlet {
- /**
- * {@inheritDoc}
- *
- * 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)) {
- WebSocketBackedSessionContext sessionContext = new
WebSocketBackedSessionContext(serverRuntimeContext);
- return sessionContext;
- } else {
- LOG.warn("Unsupported WebSocket sub protocol, must be \"xmpp\"");
- return null;
- }
- }
+ public XmppWebSocketServlet() {
+ super();
+ }
+
+ public XmppWebSocketServlet(ServerRuntimeContext serverRuntimeContext) {
+ super(serverRuntimeContext);
+ }
}
Copied:
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
(from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java)
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java?p2=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java&p1=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java&r1=1328860&r2=1328861&rev=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketServletTest.java
Sun Apr 22 12:04:53 2012
@@ -33,37 +33,37 @@ import org.mockito.Mockito;
*
* @author The Apache MINA Project ([email protected])
*/
-public class XmppWebSocketServletTest {
+public class JettyXmppWebSocketServletTest {
private ServerRuntimeContext serverRuntimeContext =
Mockito.mock(ServerRuntimeContext.class);
@Test
public void doWebSocketConnectWithDefaultCstr() throws ServletException {
ServletContext servletContext = Mockito.mock(ServletContext.class);
-
Mockito.when(servletContext.getAttribute(XmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
-
+
Mockito.when(servletContext.getAttribute(JettyXmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
+
ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
-
- XmppWebSocketServlet servlet = new XmppWebSocketServlet();
+
+ JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet();
servlet.init(servletConfig);
-
+
WebSocket webSocket = servlet.doWebSocketConnect(null, "xmpp");
- Assert.assertTrue(webSocket instanceof WebSocketBackedSessionContext);
+ Assert.assertTrue(webSocket instanceof JettyXmppWebSocket);
}
@Test
public void doWebSocketConnectWithDirectCstr() throws ServletException {
- XmppWebSocketServlet servlet = new
XmppWebSocketServlet(serverRuntimeContext);
-
+ JettyXmppWebSocketServlet servlet = new
JettyXmppWebSocketServlet(serverRuntimeContext);
+
WebSocket webSocket = servlet.doWebSocketConnect(null, "xmpp");
- Assert.assertTrue(webSocket instanceof WebSocketBackedSessionContext);
+ Assert.assertTrue(webSocket instanceof JettyXmppWebSocket);
}
@Test
public void doWebSocketConnectWithInvalidSubprotocl() throws
ServletException {
- XmppWebSocketServlet servlet = new
XmppWebSocketServlet(serverRuntimeContext);
-
+ JettyXmppWebSocketServlet servlet = new
JettyXmppWebSocketServlet(serverRuntimeContext);
+
WebSocket webSocket = servlet.doWebSocketConnect(null, "dummy");
Assert.assertNull(webSocket);
}
@@ -71,12 +71,12 @@ public class XmppWebSocketServletTest {
@Test(expected=RuntimeException.class)
public void doWebSocketConnectMissingAttribute() throws ServletException {
ServletContext servletContext = Mockito.mock(ServletContext.class);
-
+
ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
-
- XmppWebSocketServlet servlet = new XmppWebSocketServlet();
+
+ JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet();
servlet.init(servletConfig);
}
-
+
}
Copied:
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
(from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java)
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java?p2=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java&p1=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java&r1=1328860&r2=1328861&rev=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/JettyXmppWebSocketTest.java
Sun Apr 22 12:04:53 2012
@@ -36,7 +36,7 @@ import org.mockito.Mockito;
*
* @author The Apache MINA Project ([email protected])
*/
-public class XmppWebSocketBackedSessionContextTest {
+public class JettyXmppWebSocketTest {
private StanzaProcessor stanzaProcessor =
Mockito.mock(StanzaProcessor.class);
private ServerRuntimeContext serverRuntimeContext =
Mockito.mock(ServerRuntimeContext.class);
@@ -49,7 +49,7 @@ public class XmppWebSocketBackedSessionC
@Test
public void onMessage() {
- WebSocketBackedSessionContext context = new
WebSocketBackedSessionContext(serverRuntimeContext);
+ JettyXmppWebSocket context = new
JettyXmppWebSocket(serverRuntimeContext);
context.onMessage("<test></test>");
Stanza expected = new StanzaBuilder("test").build();
@@ -58,11 +58,10 @@ public class XmppWebSocketBackedSessionC
@Test
public void write() throws IOException {
- WebSocketBackedSessionContext context = new
WebSocketBackedSessionContext(serverRuntimeContext);
+ JettyXmppWebSocket context = new
JettyXmppWebSocket(serverRuntimeContext);
context.onOpen(outbound);
- Stanza stanza = new StanzaBuilder("test").build();
- context.write(stanza);
+ context.write("<test></test>");
Mockito.verify(outbound).sendMessage("<test></test>");
}
Copied:
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
(from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java)
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java?p2=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java&p1=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java&r1=1328860&r2=1328861&rev=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketServletTest.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketServletTest.java
Sun Apr 22 12:04:53 2012
@@ -23,9 +23,10 @@ import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import org.apache.catalina.websocket.StreamInbound;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
-import org.eclipse.jetty.websocket.WebSocket;
import org.junit.Assert;
+import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
@@ -33,50 +34,51 @@ import org.mockito.Mockito;
*
* @author The Apache MINA Project ([email protected])
*/
-public class XmppWebSocketServletTest {
+public class TomcatXmppWebSocketServletTest {
private ServerRuntimeContext serverRuntimeContext =
Mockito.mock(ServerRuntimeContext.class);
@Test
public void doWebSocketConnectWithDefaultCstr() throws ServletException {
ServletContext servletContext = Mockito.mock(ServletContext.class);
-
Mockito.when(servletContext.getAttribute(XmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
-
+
Mockito.when(servletContext.getAttribute(JettyXmppWebSocketServlet.SERVER_RUNTIME_CONTEXT_ATTRIBUTE)).thenReturn(serverRuntimeContext);
+
ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
-
- XmppWebSocketServlet servlet = new XmppWebSocketServlet();
+
+ TomcatXmppWebSocketServlet servlet = new TomcatXmppWebSocketServlet();
servlet.init(servletConfig);
-
- WebSocket webSocket = servlet.doWebSocketConnect(null, "xmpp");
- Assert.assertTrue(webSocket instanceof WebSocketBackedSessionContext);
+
+ StreamInbound webSocket = servlet.createWebSocketInbound("xmpp");
+ Assert.assertTrue(webSocket instanceof TomcatXmppWebSocket);
}
@Test
public void doWebSocketConnectWithDirectCstr() throws ServletException {
- XmppWebSocketServlet servlet = new
XmppWebSocketServlet(serverRuntimeContext);
-
- WebSocket webSocket = servlet.doWebSocketConnect(null, "xmpp");
- Assert.assertTrue(webSocket instanceof WebSocketBackedSessionContext);
+ TomcatXmppWebSocketServlet servlet = new
TomcatXmppWebSocketServlet(serverRuntimeContext);
+
+ StreamInbound webSocket = servlet.createWebSocketInbound("xmpp");
+ Assert.assertTrue(webSocket instanceof TomcatXmppWebSocket);
}
@Test
+ @Ignore("sub protocol check temporarily disabled for Tomcat")
public void doWebSocketConnectWithInvalidSubprotocl() throws
ServletException {
- XmppWebSocketServlet servlet = new
XmppWebSocketServlet(serverRuntimeContext);
-
- WebSocket webSocket = servlet.doWebSocketConnect(null, "dummy");
+ TomcatXmppWebSocketServlet servlet = new
TomcatXmppWebSocketServlet(serverRuntimeContext);
+
+ StreamInbound webSocket = servlet.createWebSocketInbound("dummy");
Assert.assertNull(webSocket);
}
@Test(expected=RuntimeException.class)
public void doWebSocketConnectMissingAttribute() throws ServletException {
ServletContext servletContext = Mockito.mock(ServletContext.class);
-
+
ServletConfig servletConfig = Mockito.mock(ServletConfig.class);
Mockito.when(servletConfig.getServletContext()).thenReturn(servletContext);
-
- XmppWebSocketServlet servlet = new XmppWebSocketServlet();
+
+ JettyXmppWebSocketServlet servlet = new JettyXmppWebSocketServlet();
servlet.init(servletConfig);
}
-
+
}
Copied:
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
(from r1328860,
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java)
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java?p2=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java&p1=mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java&r1=1328860&r2=1328861&rev=1328861&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/XmppWebSocketBackedSessionContextTest.java
(original)
+++
mina/vysper/trunk/server/extensions/websockets/src/test/java/org/apache/vysper/xmpp/extension/websockets/TomcatXmppWebSocketTest.java
Sun Apr 22 12:04:53 2012
@@ -20,14 +20,15 @@
package org.apache.vysper.xmpp.extension.websockets;
import java.io.IOException;
+import java.nio.CharBuffer;
+import org.apache.catalina.websocket.WsOutbound;
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.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;
@@ -36,11 +37,11 @@ import org.mockito.Mockito;
*
* @author The Apache MINA Project ([email protected])
*/
-public class XmppWebSocketBackedSessionContextTest {
+public class TomcatXmppWebSocketTest {
private StanzaProcessor stanzaProcessor =
Mockito.mock(StanzaProcessor.class);
private ServerRuntimeContext serverRuntimeContext =
Mockito.mock(ServerRuntimeContext.class);
- private Connection outbound = Mockito.mock(Connection.class);
+ private WsOutbound outbound = Mockito.mock(WsOutbound.class);
@Before
public void before() {
@@ -48,9 +49,9 @@ public class XmppWebSocketBackedSessionC
}
@Test
- public void onMessage() {
- WebSocketBackedSessionContext context = new
WebSocketBackedSessionContext(serverRuntimeContext);
- context.onMessage("<test></test>");
+ public void onMessage() throws IOException {
+ TomcatXmppWebSocket context = new
TomcatXmppWebSocket(serverRuntimeContext);
+ 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));
@@ -58,13 +59,12 @@ public class XmppWebSocketBackedSessionC
@Test
public void write() throws IOException {
- WebSocketBackedSessionContext context = new
WebSocketBackedSessionContext(serverRuntimeContext);
+ TomcatXmppWebSocket context = new
TomcatXmppWebSocket(serverRuntimeContext);
context.onOpen(outbound);
- Stanza stanza = new StanzaBuilder("test").build();
- context.write(stanza);
+ context.write("<test></test>");
- Mockito.verify(outbound).sendMessage("<test></test>");
+
Mockito.verify(outbound).writeTextMessage(CharBuffer.wrap("<test></test>"));
}
}