You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/02/15 20:33:54 UTC

svn commit: r1446738 - in /tomcat/trunk: java/org/apache/tomcat/websocket/pojo/ java/org/apache/tomcat/websocket/server/ test/org/apache/tomcat/websocket/pojo/

Author: markt
Date: Fri Feb 15 19:33:54 2013
New Revision: 1446738

URL: http://svn.apache.org/r1446738
Log:
Complete the plumbing for pathParameters
Reduce repeated parsing of the parameters by calculating them early and passing the parameters around rather than the UriTemplate

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointConfiguration.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/UriTemplate.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/ServerContainerImpl.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java
    tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestUriTemplate.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java Fri Feb 15 19:33:54 2013
@@ -17,6 +17,7 @@
 package org.apache.tomcat.websocket.pojo;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
 
 import javax.websocket.CloseReason;
 import javax.websocket.Endpoint;
@@ -32,7 +33,7 @@ import javax.websocket.Session;
 public class PojoEndpoint extends Endpoint {
 
     private Object pojo;
-    private String pathInfo;
+    private Map<String,String> pathParameters;
     private PojoMethodMapping methodMapping;
 
 
@@ -43,13 +44,13 @@ public class PojoEndpoint extends Endpoi
                 (PojoEndpointConfiguration) endpointConfiguration;
 
         pojo = pec.createPojo();
-        pathInfo = pec.getPathInfo();
+        pathParameters = pec.getPathParameters();
         methodMapping = pec.getMethodMapping();
 
         if (methodMapping.getOnOpen() != null) {
             try {
                 methodMapping.getOnOpen().invoke(pojo,
-                        methodMapping.getOnOpenArgs(pathInfo, session));
+                        methodMapping.getOnOpenArgs(pathParameters, session));
             } catch (IllegalAccessException | IllegalArgumentException
                     | InvocationTargetException e) {
                 // TODO Auto-generated catch block
@@ -57,7 +58,7 @@ public class PojoEndpoint extends Endpoi
             }
         }
         for (MessageHandler mh : methodMapping.getMessageHandlers(pojo,
-                pathInfo, session)) {
+                pathParameters, session)) {
             session.addMessageHandler(mh);
         }
     }
@@ -68,7 +69,7 @@ public class PojoEndpoint extends Endpoi
         if (methodMapping.getOnClose() != null) {
             try {
                 methodMapping.getOnClose().invoke(pojo,
-                        methodMapping.getOnCloseArgs(pathInfo, session));
+                        methodMapping.getOnCloseArgs(pathParameters, session));
             } catch (IllegalAccessException | IllegalArgumentException
                     | InvocationTargetException e) {
                 // TODO Auto-generated catch block
@@ -84,7 +85,7 @@ public class PojoEndpoint extends Endpoi
             try {
                 methodMapping.getOnError().invoke(
                         pojo,
-                        methodMapping.getOnErrorArgs(pathInfo, session,
+                        methodMapping.getOnErrorArgs(pathParameters, session,
                                 throwable));
             } catch (IllegalAccessException | IllegalArgumentException
                     | InvocationTargetException e) {

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointConfiguration.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointConfiguration.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointConfiguration.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointConfiguration.java Fri Feb 15 19:33:54 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.tomcat.websocket.pojo;
 
+import java.util.Map;
+
 import javax.websocket.server.DefaultServerConfiguration;
 
 /**
@@ -28,15 +30,15 @@ public class PojoEndpointConfiguration e
 
     private final Class<?> pojoClass;
     private final PojoMethodMapping methodMapping;
-    private final String pathInfo;
+    private final Map<String,String> pathParameters;
 
 
     public PojoEndpointConfiguration(Class<?> pojoClass,
-            PojoMethodMapping methodMapping, String pathInfo) {
+            PojoMethodMapping methodMapping, Map<String,String> pathParameters) {
         super(PojoEndpoint.class, methodMapping.getWsPath());
         this.pojoClass = pojoClass;
         this.methodMapping = methodMapping;
-        this.pathInfo = pathInfo;
+        this.pathParameters = pathParameters;
     }
 
 
@@ -49,8 +51,8 @@ public class PojoEndpointConfiguration e
     }
 
 
-    public String getPathInfo() {
-        return pathInfo;
+    public Map<String,String> getPathParameters() {
+        return pathParameters;
     }
 
 

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java Fri Feb 15 19:33:54 2013
@@ -19,7 +19,6 @@ package org.apache.tomcat.websocket.pojo
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -50,20 +49,13 @@ public class PojoMethodMapping {
     private final PojoPathParam[] onErrorParams;
     private final Set<MessageMethod> onMessage = new HashSet<>();
     private final String wsPath;
-    private final UriTemplate template;
 
 
-    public PojoMethodMapping(Class<?> clazzPojo, String wsPath,
-            String servletPath) {
+    public PojoMethodMapping(Class<?> clazzPojo, String wsPath) {
         this.wsPath = wsPath;
         Method open = null;
         Method close = null;
         Method error = null;
-        if (wsPath.length() > servletPath.length()) {
-            template = new UriTemplate(wsPath.substring(servletPath.length() - 2));
-        } else {
-            template = null;
-        }
         for (Method method : clazzPojo.getMethods()) {
             if (open == null &&
                     method.getAnnotation(WebSocketOpen.class) != null) {
@@ -75,7 +67,7 @@ public class PojoMethodMapping {
                     method.getAnnotation(WebSocketError.class) != null) {
                 error = method;
             } else if (method.getAnnotation(WebSocketMessage.class) != null) {
-                onMessage.add(new MessageMethod(method, template));
+                onMessage.add(new MessageMethod(method));
             }
         }
         this.onOpen = open;
@@ -97,8 +89,9 @@ public class PojoMethodMapping {
     }
 
 
-    public Object[] getOnOpenArgs(String pathInfo, Session session) {
-        return buildArgs(onOpenParams, template, pathInfo, session, null);
+    public Object[] getOnOpenArgs(Map<String,String> pathParameters,
+            Session session) {
+        return buildArgs(onOpenParams, pathParameters, session, null);
     }
 
 
@@ -107,8 +100,9 @@ public class PojoMethodMapping {
     }
 
 
-    public Object[] getOnCloseArgs(String pathInfo, Session session) {
-        return buildArgs(onCloseParams, template, pathInfo, session, null);
+    public Object[] getOnCloseArgs(Map<String,String> pathParameters,
+            Session session) {
+        return buildArgs(onCloseParams, pathParameters, session, null);
     }
 
 
@@ -117,17 +111,17 @@ public class PojoMethodMapping {
     }
 
 
-    public Object[] getOnErrorArgs(String pathInfo, Session session,
-            Throwable throwable) {
-        return buildArgs(onErrorParams, template, pathInfo, session, throwable);
+    public Object[] getOnErrorArgs(Map<String,String> pathParameters,
+            Session session, Throwable throwable) {
+        return buildArgs(onErrorParams, pathParameters, session, throwable);
     }
 
 
-    public Set<MessageHandler> getMessageHandlers(Object pojo, String pathInfo,
-            Session session) {
+    public Set<MessageHandler> getMessageHandlers(Object pojo,
+            Map<String,String> pathParameters, Session session) {
         Set<MessageHandler> result = new HashSet<>();
         for (MessageMethod messageMethod : onMessage) {
-            result.add(messageMethod.getMessageHandler(pojo, pathInfo, session));
+            result.add(messageMethod.getMessageHandler(pojo, pathParameters, session));
         }
         return result;
     }
@@ -173,15 +167,9 @@ public class PojoMethodMapping {
 
 
     private static Object[] buildArgs(PojoPathParam[] pathParams,
-            UriTemplate template, String pathInfo, Session session,
+            Map<String,String> pathParameters, Session session,
             Throwable throwable) {
         Object[] result = new Object[pathParams.length];
-        Map<String,String> pathValues;
-        if (template != null && pathInfo != null) {
-            pathValues = template.match(pathInfo);
-        } else {
-            pathValues = Collections.EMPTY_MAP;
-        }
         for (int i = 0; i < pathParams.length; i++) {
             Class<?> type = pathParams[i].getType();
             if (type.equals(Session.class)) {
@@ -190,7 +178,7 @@ public class PojoMethodMapping {
                 result[i] = throwable;
             } else {
                 String name = pathParams[i].getName();
-                String value = pathValues.get(name);
+                String value = pathParameters.get(name);
                 if (value == null) {
                     result[i] = null;
                 } else {
@@ -231,7 +219,6 @@ public class PojoMethodMapping {
     private static class MessageMethod {
 
         private final Method m;
-        private final UriTemplate template;
         private int indexString = -1;
         private int indexByteArray = -1;
         private int indexByteBuffer = -1;
@@ -242,9 +229,8 @@ public class PojoMethodMapping {
         private int indexPayload = -1;
 
 
-        public MessageMethod(Method m, UriTemplate template) {
+        public MessageMethod(Method m) {
             this.m = m;
-            this.template = template;
 
             Class<?>[] types = m.getParameterTypes();
             Annotation[][] paramsAnnotations = m.getParameterAnnotations();
@@ -343,21 +329,14 @@ public class PojoMethodMapping {
         }
 
 
-        public MessageHandler getMessageHandler(Object pojo, String pathInfo,
-                Session session) {
+        public MessageHandler getMessageHandler(Object pojo,
+                Map<String,String> pathParameters, Session session) {
             Object[] params = new Object[m.getParameterTypes().length];
 
-            Map<String,String> pathParams;
-            if (template == null) {
-                pathParams = new HashMap<>();
-            } else {
-                pathParams = template.match(pathInfo);
-            }
-
             for (Map.Entry<Integer,PojoPathParam> entry :
                     indexPathParams.entrySet()) {
                 PojoPathParam pathParam = entry.getValue();
-                String valueString = pathParams.get(pathParam.getName());
+                String valueString = pathParameters.get(pathParam.getName());
                 Object value = null;
                 if (valueString != null) {
                     value = coerceToType(pathParam.getType(), valueString);

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/UriTemplate.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/UriTemplate.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/UriTemplate.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/UriTemplate.java Fri Feb 15 19:33:54 2013
@@ -17,6 +17,7 @@
 package org.apache.tomcat.websocket.pojo;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -91,6 +92,6 @@ public class UriTemplate {
             }
             group += 2;
         }
-        return result;
+        return Collections.unmodifiableMap(result);
     }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/ServerContainerImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/ServerContainerImpl.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/ServerContainerImpl.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/ServerContainerImpl.java Fri Feb 15 19:33:54 2013
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket.serv
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
 import java.util.Map;
 import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
@@ -35,6 +36,7 @@ import org.apache.tomcat.websocket.WsSes
 import org.apache.tomcat.websocket.WsWebSocketContainer;
 import org.apache.tomcat.websocket.pojo.PojoEndpointConfiguration;
 import org.apache.tomcat.websocket.pojo.PojoMethodMapping;
+import org.apache.tomcat.websocket.pojo.UriTemplate;
 
 /**
  * Provides a per class loader (i.e. per web application) instance of a
@@ -76,6 +78,8 @@ public class ServerContainerImpl extends
     private volatile ServletContext servletContext = null;
     private Map<String,ServerEndpointConfiguration> configMap =
             new ConcurrentHashMap<>();
+    private Map<String,UriTemplate> templateMap =
+            new ConcurrentHashMap<>();
     private Map<String,Class<?>> pojoMap = new ConcurrentHashMap<>();
     private Map<Class<?>,PojoMethodMapping> pojoMethodMap =
             new ConcurrentHashMap<>();
@@ -139,7 +143,16 @@ public class ServerContainerImpl extends
                     endpointClass.getName(), path,
                     servletContext.getContextPath()));
         }
-        configMap.put(servletPath.substring(0, servletPath.length() - 2), sec);
+
+        // Remove the trailing /* before adding it to the map
+        String mapPath = servletPath.substring(0, servletPath.length() - 2);
+
+        if (path.length() > servletPath.length()) {
+            templateMap.put(mapPath,
+                    new UriTemplate(path.substring(mapPath.length())));
+        }
+
+        configMap.put(mapPath, sec);
         addWsServletMapping(servletPath);
     }
 
@@ -172,11 +185,18 @@ public class ServerContainerImpl extends
             log.debug(sm.getString("serverContainer.pojoDeploy",
                     pojo.getName(), wsPath, servletContext.getContextPath()));
         }
+
         String servletPath = getServletPath(wsPath);
         // Remove the trailing /* before adding it to the map
-        pojoMap.put(servletPath.substring(0, servletPath.length() - 2), pojo);
-        pojoMethodMap.put(pojo,
-                new PojoMethodMapping(pojo, wsPath, servletPath));
+        String mapPath = servletPath.substring(0, servletPath.length() - 2);
+
+        if (wsPath.length() > servletPath.length()) {
+            templateMap.put(mapPath,
+                    new UriTemplate(wsPath.substring(mapPath.length())));
+        }
+
+        pojoMap.put(mapPath, pojo);
+        pojoMethodMap.put(pojo, new PojoMethodMapping(pojo, wsPath));
         addWsServletMapping(servletPath);
     }
 
@@ -193,7 +213,7 @@ public class ServerContainerImpl extends
 
 
     public ServerEndpointConfiguration getServerEndpointConfiguration(
-            String servletPath, String pathInfo) {
+            String servletPath, Map<String,String> pathParameters) {
         ServerEndpointConfiguration sec = configMap.get(servletPath);
         if (sec != null) {
             return sec;
@@ -204,7 +224,7 @@ public class ServerContainerImpl extends
             if (methodMapping != null) {
                 PojoEndpointConfiguration pojoSec =
                         new PojoEndpointConfiguration(pojo, methodMapping,
-                                pathInfo);
+                                pathParameters);
                 return pojoSec;
             }
         }
@@ -213,6 +233,17 @@ public class ServerContainerImpl extends
     }
 
 
+    public Map<String,String> getPathParameters(String servletPath,
+            String pathInfo) {
+        UriTemplate template = templateMap.get(servletPath);
+        if (template == null) {
+            return Collections.EMPTY_MAP;
+        } else {
+            return template.match(pathInfo);
+        }
+    }
+
+
     protected WsWriteTimeout getTimeout() {
         return wsWriteTimeout;
     }

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java Fri Feb 15 19:33:54 2013
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket.serv
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.util.Map;
 
 import javax.servlet.ReadListener;
 import javax.servlet.ServletInputStream;
@@ -53,17 +54,20 @@ public class WsProtocolHandler implement
     private final ServerContainerImpl webSocketContainer;
     private final WsRequest request;
     private final String subProtocol;
+    private final Map<String,String> pathParameters;
 
     private WsSession wsSession;
 
 
     public WsProtocolHandler(Endpoint ep, EndpointConfiguration endpointConfig,
-            ServerContainerImpl wsc, WsRequest request, String subProtocol) {
+            ServerContainerImpl wsc, WsRequest request, String subProtocol,
+            Map<String,String> pathParameters) {
         this.ep = ep;
         this.endpointConfig = endpointConfig;
         this.webSocketContainer = wsc;
         this.request = request;
         this.subProtocol = subProtocol;
+        this.pathParameters = pathParameters;
         applicationClassLoader = Thread.currentThread().getContextClassLoader();
     }
 
@@ -88,9 +92,8 @@ public class WsProtocolHandler implement
         try {
             WsRemoteEndpointServer wsRemoteEndpointServer =
                     new WsRemoteEndpointServer(sos, webSocketContainer);
-            // TODO Replace null with path parameter map
             wsSession = new WsSession(ep, wsRemoteEndpointServer,
-                    webSocketContainer, request, subProtocol, null);
+                    webSocketContainer, request, subProtocol, pathParameters);
             WsFrameServer wsFrame = new WsFrameServer(
                     sis,
                     wsSession);

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java Fri Feb 15 19:33:54 2013
@@ -92,8 +92,10 @@ public class WsServlet extends HttpServl
         }
         // Need an Endpoint instance to progress this further
         ServerContainerImpl sc = ServerContainerImpl.getServerContainer();
+        Map<String,String> pathParameters = sc.getPathParameters(
+                req.getServletPath(),  req.getPathInfo());
         ServerEndpointConfiguration sec = sc.getServerEndpointConfiguration(
-                req.getServletPath(), req.getPathInfo());
+                req.getServletPath(), pathParameters);
         // Origin check
         String origin = req.getHeader("Origin");
         if (!sec.checkOrigin(origin)) {
@@ -136,8 +138,8 @@ public class WsServlet extends HttpServl
             throw new ServletException(e);
         }
         WsRequest wsRequest = createWsRequest(req);
-        HttpUpgradeHandler wsHandler =
-                new WsProtocolHandler(ep, sec, sc, wsRequest, subProtocol);
+        HttpUpgradeHandler wsHandler = new WsProtocolHandler(ep, sec, sc,
+                wsRequest, subProtocol, pathParameters);
         req.upgrade(wsHandler);
     }
 

Modified: tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestUriTemplate.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestUriTemplate.java?rev=1446738&r1=1446737&r2=1446738&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestUriTemplate.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestUriTemplate.java Fri Feb 15 19:33:54 2013
@@ -86,4 +86,13 @@ public class TestUriTemplate {
         Assert.assertTrue(result.containsKey("a"));
         Assert.assertEquals("foo", result.get("a"));
     }
+
+
+    @Test
+    public void testNoParams() throws Exception {
+        UriTemplate t = new UriTemplate("/foo/bar");
+        Map<String,String> result = t.match("/foo/bar");
+
+        Assert.assertEquals(0, result.size());
+    }
 }



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