diff options
author | Joakim Erdfelt | 2013-07-16 23:56:03 +0000 |
---|---|---|
committer | Joakim Erdfelt | 2013-07-16 23:56:03 +0000 |
commit | e69b41e9cdb3c1d10a426adc3a6d474aeaeb2bab (patch) | |
tree | 6c8b5827d5eecc1ce9adadd4ca2fdee1bde44ba5 /jetty-websocket/javax-websocket-server-impl/src | |
parent | ba50e6b053c91928c50cfbcc7d0157445670e51e (diff) | |
download | org.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')
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 @{@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 |