Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Erdfelt2013-07-16 23:56:03 +0000
committerJoakim Erdfelt2013-07-16 23:56:03 +0000
commite69b41e9cdb3c1d10a426adc3a6d474aeaeb2bab (patch)
tree6c8b5827d5eecc1ce9adadd4ca2fdee1bde44ba5 /jetty-websocket/javax-websocket-server-impl/src
parentba50e6b053c91928c50cfbcc7d0157445670e51e (diff)
downloadorg.eclipse.jetty.project-e69b41e9cdb3c1d10a426adc3a6d474aeaeb2bab.tar.gz
org.eclipse.jetty.project-e69b41e9cdb3c1d10a426adc3a6d474aeaeb2bab.tar.xz
org.eclipse.jetty.project-e69b41e9cdb3c1d10a426adc3a6d474aeaeb2bab.zip
JSR-356 Adding suppport for @PathParam
Diffstat (limited to 'jetty-websocket/javax-websocket-server-impl/src')
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java16
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java (renamed from jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/EmptyServerEndpointConfig.java)28
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java19
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrHandshakeRequest.java19
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrPathParamId.java (renamed from jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrParamPath.java)6
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrServerEndpointImpl.java17
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java51
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java2
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PrimitiveEchoTest.java2
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java6
10 files changed, 135 insertions, 31 deletions
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java
index 4ea2345f44..5bf6379cf5 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java
@@ -53,19 +53,29 @@ public class AnnotatedServerEndpointMetadata extends AnnotatedEndpointMetadata<S
@Override
public void customizeParamsOnClose(LinkedList<IJsrParamId> params)
{
- params.addFirst(JsrParamPath.INSTANCE);
+ super.customizeParamsOnClose(params);
+ params.addFirst(JsrPathParamId.INSTANCE);
}
@Override
public void customizeParamsOnError(LinkedList<IJsrParamId> params)
{
- params.addFirst(JsrParamPath.INSTANCE);
+ super.customizeParamsOnError(params);
+ params.addFirst(JsrPathParamId.INSTANCE);
}
@Override
public void customizeParamsOnOpen(LinkedList<IJsrParamId> params)
{
- params.addFirst(JsrParamPath.INSTANCE);
+ super.customizeParamsOnOpen(params);
+ params.addFirst(JsrPathParamId.INSTANCE);
+ }
+
+ @Override
+ public void customizeParamsOnMessage(LinkedList<IJsrParamId> params)
+ {
+ super.customizeParamsOnMessage(params);
+ params.addFirst(JsrPathParamId.INSTANCE);
}
@Override
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/EmptyServerEndpointConfig.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java
index 6184c90a8d..c77b01f286 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/EmptyServerEndpointConfig.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java
@@ -28,7 +28,7 @@ import javax.websocket.Encoder;
import javax.websocket.Extension;
import javax.websocket.server.ServerEndpointConfig;
-public class EmptyServerEndpointConfig implements ServerEndpointConfig
+public class BasicServerEndpointConfig implements ServerEndpointConfig
{
private final List<Class<? extends Decoder>> decoders;
private final List<Class<? extends Encoder>> encoders;
@@ -39,11 +39,11 @@ public class EmptyServerEndpointConfig implements ServerEndpointConfig
private final String path;
private Map<String, Object> userProperties;
- public EmptyServerEndpointConfig(Class<?> endpointClass, String path)
+ public BasicServerEndpointConfig(Class<?> endpointClass, String path)
{
this.endpointClass = endpointClass;
this.path = path;
-
+
this.decoders = new ArrayList<>();
this.encoders = new ArrayList<>();
this.subprotocols = new ArrayList<>();
@@ -51,7 +51,27 @@ public class EmptyServerEndpointConfig implements ServerEndpointConfig
this.userProperties = new HashMap<>();
this.configurator = BasicServerEndpointConfigurator.INSTANCE;
}
-
+
+ public BasicServerEndpointConfig(ServerEndpointConfig copy)
+ {
+ this.endpointClass = copy.getEndpointClass();
+ this.path = copy.getPath();
+
+ this.decoders = new ArrayList<>(copy.getDecoders());
+ this.encoders = new ArrayList<>(copy.getEncoders());
+ this.subprotocols = new ArrayList<>(copy.getSubprotocols());
+ this.extensions = new ArrayList<>(copy.getExtensions());
+ this.userProperties = new HashMap<>(copy.getUserProperties());
+ if (copy.getConfigurator() != null)
+ {
+ this.configurator = copy.getConfigurator();
+ }
+ else
+ {
+ this.configurator = BasicServerEndpointConfigurator.INSTANCE;
+ }
+ }
+
@Override
public List<Class<? extends Encoder>> getEncoders()
{
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java
index bbd510c45e..0bde7dab94 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java
@@ -25,9 +25,11 @@ import javax.websocket.server.ServerEndpointConfig;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.websocket.api.UpgradeRequest;
-import org.eclipse.jetty.websocket.api.UpgradeResponse;
import org.eclipse.jetty.websocket.jsr356.endpoints.EndpointInstance;
+import org.eclipse.jetty.websocket.jsr356.server.pathmap.WebSocketPathSpec;
+import org.eclipse.jetty.websocket.server.pathmap.PathSpec;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
public class JsrCreator implements WebSocketCreator
@@ -41,11 +43,11 @@ public class JsrCreator implements WebSocketCreator
}
@Override
- public Object createWebSocket(UpgradeRequest req, UpgradeResponse resp)
+ public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp)
{
JsrHandshakeRequest hsreq = new JsrHandshakeRequest(req);
JsrHandshakeResponse hsresp = new JsrHandshakeResponse(resp);
-
+
ServerEndpointConfig config = metadata.getConfig();
ServerEndpointConfig.Configurator configurator = config.getConfigurator();
@@ -81,6 +83,15 @@ public class JsrCreator implements WebSocketCreator
{
Class<?> endpointClass = config.getEndpointClass();
Object endpoint = config.getConfigurator().getEndpointInstance(endpointClass);
+ PathSpec pathSpec = hsreq.getRequestPathSpec();
+ if (pathSpec instanceof WebSocketPathSpec)
+ {
+ // We have a PathParam path spec
+ WebSocketPathSpec wspathSpec = (WebSocketPathSpec)pathSpec;
+ String requestPath = req.getRequestPath();
+ // Wrap the config with the path spec information
+ config = new PathParamServerEndpointConfig(config,wspathSpec,requestPath);
+ }
return new EndpointInstance(endpoint,config,metadata);
}
catch (InstantiationException e)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrHandshakeRequest.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrHandshakeRequest.java
index f1b0a70681..f004efbf4a 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrHandshakeRequest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrHandshakeRequest.java
@@ -25,13 +25,14 @@ import java.util.Map;
import javax.websocket.server.HandshakeRequest;
-import org.eclipse.jetty.websocket.api.UpgradeRequest;
+import org.eclipse.jetty.websocket.server.pathmap.PathSpec;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
public class JsrHandshakeRequest implements HandshakeRequest
{
- private final UpgradeRequest request;
+ private final ServletUpgradeRequest request;
- public JsrHandshakeRequest(UpgradeRequest req)
+ public JsrHandshakeRequest(ServletUpgradeRequest req)
{
this.request = req;
}
@@ -60,6 +61,11 @@ public class JsrHandshakeRequest implements HandshakeRequest
return request.getQueryString();
}
+ public PathSpec getRequestPathSpec()
+ {
+ return (PathSpec)request.getServletAttribute(PathSpec.class.getName());
+ }
+
@Override
public URI getRequestURI()
{
@@ -69,15 +75,12 @@ public class JsrHandshakeRequest implements HandshakeRequest
@Override
public Principal getUserPrincipal()
{
- // TODO: need to return User Principal
- return null;
+ return request.getUserPrincipal();
}
@Override
public boolean isUserInRole(String role)
{
- // TODO: need to return isUserInRole result
- return false;
+ return request.isUserInRole(role);
}
-
}
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrParamPath.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrPathParamId.java
index d47b8ddd8b..bc7ddacd82 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrParamPath.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrPathParamId.java
@@ -29,14 +29,14 @@ import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
/**
* Param handling for static parameters annotated with &#064;{@link PathParam}
*/
-public class JsrParamPath implements IJsrParamId
+public class JsrPathParamId implements IJsrParamId
{
- public static final IJsrParamId INSTANCE = new JsrParamPath();
+ public static final IJsrParamId INSTANCE = new JsrPathParamId();
@Override
public boolean process(Param param, JsrCallable callable) throws InvalidSignatureException
{
- PathParam pathparam = param.type.getAnnotation(PathParam.class);
+ PathParam pathparam = param.getAnnotation(PathParam.class);
if(pathparam != null)
{
param.bind(Role.PATH_PARAM);
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrServerEndpointImpl.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrServerEndpointImpl.java
index e10995a63c..6020ab4f48 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrServerEndpointImpl.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrServerEndpointImpl.java
@@ -40,11 +40,20 @@ public class JsrServerEndpointImpl implements EventDriverImpl
{
throw new IllegalStateException(String.format("Websocket %s must be an %s",websocket.getClass().getName(),EndpointInstance.class.getName()));
}
-
+
EndpointInstance ei = (EndpointInstance)websocket;
AnnotatedServerEndpointMetadata metadata = (AnnotatedServerEndpointMetadata)ei.getMetadata();
- JsrEvents<ServerEndpoint,ServerEndpointConfig> events = new JsrEvents<>(metadata);
- return new JsrAnnotatedEventDriver(policy,ei,events);
+ JsrEvents<ServerEndpoint, ServerEndpointConfig> events = new JsrEvents<>(metadata);
+ JsrAnnotatedEventDriver driver = new JsrAnnotatedEventDriver(policy,ei,events);
+
+ ServerEndpointConfig config = (ServerEndpointConfig)ei.getConfig();
+ if (config instanceof PathParamServerEndpointConfig)
+ {
+ PathParamServerEndpointConfig ppconfig = (PathParamServerEndpointConfig)config;
+ driver.setRequestParameters(ppconfig.getPathParamMap());
+ }
+
+ return driver;
}
@Override
@@ -60,7 +69,7 @@ public class JsrServerEndpointImpl implements EventDriverImpl
{
return false;
}
-
+
EndpointInstance ei = (EndpointInstance)websocket;
Object endpoint = ei.getEndpoint();
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java
new file mode 100644
index 0000000000..758b6061a1
--- /dev/null
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java
@@ -0,0 +1,51 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356.server;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.websocket.server.ServerEndpointConfig;
+
+import org.eclipse.jetty.websocket.jsr356.server.pathmap.WebSocketPathSpec;
+
+/**
+ * Wrapper for a {@link ServerEndpointConfig} where there PathParm information from the incoming request.
+ */
+public class PathParamServerEndpointConfig extends BasicServerEndpointConfig implements ServerEndpointConfig
+{
+ private final Map<String, String> pathParamMap;
+
+ public PathParamServerEndpointConfig(ServerEndpointConfig config, WebSocketPathSpec pathSpec, String requestPath)
+ {
+ super(config);
+
+ Map<String, String> pathMap = pathSpec.getPathParams(requestPath);
+ pathParamMap = new HashMap<String, String>();
+ if (pathMap != null)
+ {
+ pathParamMap.putAll(pathMap);
+ }
+ }
+
+ public Map<String, String> getPathParamMap()
+ {
+ return pathParamMap;
+ }
+}
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java
index f1b84ab1ca..1fbda6db59 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java
@@ -68,7 +68,7 @@ public class ServerContainer extends ClientContainer implements javax.websocket.
}
else
{
- cec = new EmptyServerEndpointConfig(endpoint.getClass(),path);
+ cec = new BasicServerEndpointConfig(endpoint.getClass(),path);
}
}
return new EndpointInstance(endpoint,cec,metadata);
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PrimitiveEchoTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PrimitiveEchoTest.java
index 10560a59b2..ace2aefdfb 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PrimitiveEchoTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PrimitiveEchoTest.java
@@ -170,10 +170,8 @@ public class PrimitiveEchoTest
EchoCase.add(TESTCASES,ShortObjectTextSocket.class).addMessage(-32001L).expect("-32001");
// PathParam based
- /*
EchoCase.add(TESTCASES,IntParamTextSocket.class).requestPath("/echo/primitives/integer/params/5678")
.addMessage(1234).expect("1234|5678");
- */
}
@BeforeClass
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
index 90ed7fc674..0141b850b6 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
@@ -113,7 +113,9 @@ public class ServerAnnotatedEndpointScanner_GoodSignaturesTest
Field fClose = findFieldRef(AnnotatedServerEndpointMetadata.class,"onClose");
Field fError = findFieldRef(AnnotatedServerEndpointMetadata.class,"onError");
Field fText = findFieldRef(AnnotatedServerEndpointMetadata.class,"onText");
+ Field fTextStream = findFieldRef(AnnotatedServerEndpointMetadata.class,"onTextStream");
Field fBinary = findFieldRef(AnnotatedServerEndpointMetadata.class,"onBinary");
+ Field fBinaryStream = findFieldRef(AnnotatedServerEndpointMetadata.class,"onBinaryStream");
Field fPong = findFieldRef(AnnotatedServerEndpointMetadata.class,"onPong");
// @formatter:off
@@ -152,8 +154,8 @@ public class ServerAnnotatedEndpointScanner_GoodSignaturesTest
// -- Beans
Case.add(data, DateTextSocket.class, fText, Date.class);
// -- Reader Events
- Case.add(data, ReaderParamSocket.class, fText, Reader.class, String.class);
- Case.add(data, StringReturnReaderParamSocket.class, fText, Reader.class, String.class);
+ Case.add(data, ReaderParamSocket.class, fTextStream, Reader.class, String.class);
+ Case.add(data, StringReturnReaderParamSocket.class, fTextStream, Reader.class, String.class);
// -- Binary Events
Case.add(data, BasicBinaryMessageByteBufferSocket.class, fBinary, ByteBuffer.class);
// -- Pong Events

Back to the top