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>"));
     }
 
 }


Reply via email to