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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org