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