Author: markt
Date: Tue Nov 27 14:49:15 2012
New Revision: 1414217

URL: http://svn.apache.org/viewvc?rev=1414217&view=rev
Log:
WebSocket 1.0 implementation part 2 of many
Create the WebSocket servlet and ensure it responds to requests to WebSocket 
endpoints

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
    tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java Tue Nov 27 
14:49:15 2012
@@ -18,7 +18,9 @@ package org.apache.tomcat.websocket;
 
 public class Constants {
 
-    public static final String PACKAGE_NAME = "org.apache.tomcat.websocket";
+    protected static final String PACKAGE_NAME = "org.apache.tomcat.websocket";
+
+    protected static final String SERVLET_NAME = WsServlet.class.getName();
 
     private Constants() {
         // Hide default constructor

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Tue 
Nov 27 14:49:15 2012
@@ -12,4 +12,8 @@
 # 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.
-sci.newInstance.fail=Failed to create an Endpoint instance of type [{0}]
\ No newline at end of file
+sci.newInstance.fail=Failed to create an Endpoint instance of type [{0}]
+serverContainer.endpointDeploy=Endpoint class [{0}] deploying to path [{1}] in 
ServletContext [{2}]
+serverContainer.pojoDeploy=POJO class [{0}] deploying to path [{1}] in 
ServletContext [{2}]
+serverContainer.servletContextMismatch=Attempted to register a POJO annotated 
for WebSocket at path [{0}] in the ServletContext with context path [{1}] when 
the WebSocket ServerContainer is allocated to the ServletContext with context 
path [{2}]
+serverContainer.servletContextMissing=No ServletContext was specified
\ No newline at end of file

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java Tue 
Nov 27 14:49:15 2012
@@ -18,12 +18,17 @@ package org.apache.tomcat.websocket;
 
 import java.util.Map;
 import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
 
+import javax.servlet.ServletContext;
+import javax.servlet.ServletRegistration;
 import javax.websocket.DeploymentException;
 import javax.websocket.Endpoint;
 import javax.websocket.ServerContainer;
 import javax.websocket.ServerEndpointConfiguration;
 
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -42,6 +47,8 @@ public class ServerContainerImpl extends
     private static StringManager sm = StringManager.getManager(
             Constants.PACKAGE_NAME);
 
+    protected Log log = LogFactory.getLog(ServerContainerImpl.class);
+
 
     /**
      * Intended to be used by implementations of {@link
@@ -64,28 +71,47 @@ public class ServerContainerImpl extends
     }
 
 
+    private volatile ServletContext servletContext = null;
+
+    private Map<String, Class<? extends Endpoint>> endpointMap =
+            new ConcurrentHashMap<>();
+
+    private Map<String, Class<?>> pojoMap = new ConcurrentHashMap<>();
+
+
     private ServerContainerImpl() {
         // Hide default constructor
     }
 
 
+    public void setServletContext(ServletContext servletContext) {
+        this.servletContext = servletContext;
+    }
+
+
     @Override
     public void publishServer(Class<? extends Endpoint> clazz)
             throws DeploymentException {
 
+        Endpoint ep = null;
         try {
-            Endpoint ep = clazz.newInstance();
-            ServerEndpointConfiguration config =
-                    (ServerEndpointConfiguration) 
ep.getEndpointConfiguration();
-            String path = Util.getServletMappingPath(config.getPath());
-
-            // TODO Replace following debug code with something useful.
-            System.out.println("Class [" + clazz.getName() +
-                    "] deployed to path [" + path + "]");
+            ep = clazz.newInstance();
         } catch (InstantiationException | IllegalAccessException e) {
             throw new DeploymentException(
                     sm.getString("sci.newInstance.fail", clazz.getName()), e);
         }
+
+        ServerEndpointConfiguration config =
+                (ServerEndpointConfiguration) ep.getEndpointConfiguration();
+        String path = Util.getServletMappingPath(config.getPath());
+
+        if (log.isDebugEnabled()) {
+            log.debug(sm.getString("serverContainer.endpointDeploy",
+                    clazz.getName(), path, servletContext.getContextPath()));
+        }
+
+        endpointMap.put(path.substring(0, path.length() - 2), clazz);
+        addWsServletMapping(path);
     }
 
 
@@ -94,12 +120,44 @@ public class ServerContainerImpl extends
      * plain old java objects (POJOs) that have been annotated as WebSocket
      * endpoints.
      *
-     * @param pojo
-     * @param path
+     * @param pojo  The annotated POJO
+     * @param ctxt  The ServletContext the endpoint is to be published in
+     * @param path  The path at which the endpoint is to be published
      */
-    public void publishServer(Class<?> pojo, String path) {
-        // TODO Replace following debug code with something useful.
-        System.out.println("Class [" + pojo.getName() +
-                "] deployed to path [" + path + "]");
+    public void publishServer(Class<?> pojo, ServletContext ctxt, String path) 
{
+        if (ctxt == null) {
+            throw new IllegalArgumentException(
+                    sm.getString("serverContainer.servletContextMissing"));
+        }
+
+        // Set the ServletContext if it hasn't already been set
+        if (servletContext == null) {
+            servletContext = ctxt;
+        } else if (ctxt != servletContext) {
+            // Should never happen
+            throw new IllegalStateException(sm.getString(
+                    "serverContainer.servletContextMismatch", path,
+                    servletContext.getContextPath(), ctxt.getContextPath()));
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug(sm.getString("serverContainer.pojoDeploy", 
pojo.getName(),
+                    path, servletContext.getContextPath()));
+        }
+
+        pojoMap.put(path.substring(0, path.length() - 2), pojo);
+        addWsServletMapping(path);
+    }
+
+
+    private void addWsServletMapping(String mapping) {
+        ServletRegistration sr =
+                servletContext.getServletRegistration(Constants.SERVLET_NAME);
+        if (sr == null) {
+            sr = servletContext.addServlet(Constants.SERVLET_NAME,
+                    WsServlet.class);
+        }
+
+        sr.addMapping(mapping);
     }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java Tue Nov 27 
14:49:15 2012
@@ -35,16 +35,20 @@ public class WsSci implements ServletCon
     @Override
     public void onStartup(Set<Class<?>> clazzes, ServletContext ctx)
             throws ServletException {
+
+        // Need to configure the ServletContext in all cases
+        ServerContainerImpl sc = ServerContainerImpl.getServerContainer();
+        sc.setServletContext(ctx);
+
         if (clazzes == null || clazzes.size() == 0) {
             return;
         }
-        ServerContainerImpl sc = ServerContainerImpl.getServerContainer();
 
         for (Class<?> clazz : clazzes) {
             WebSocketEndpoint anotation =
                     clazz.getAnnotation(WebSocketEndpoint.class);
             String mappingPath = Util.getServletMappingPath(anotation.value());
-            sc.publishServer(clazz, mappingPath);
+            sc.publishServer(clazz, ctx, mappingPath);
         }
     }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java Tue Nov 27 
14:49:15 2012
@@ -16,6 +16,22 @@
  */
 package org.apache.tomcat.websocket;
 
-public class WsServlet {
+import java.io.IOException;
 
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class WsServlet extends HttpServlet {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+            throws ServletException, IOException {
+
+        resp.setContentType("text/plain");
+        resp.getWriter().print("TODO: Implement HTTP Upgrade");
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to