From d10de87e09fe3dcdec315d667e736522cda86bda Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Wed, 12 Oct 2016 12:07:08 -0700 Subject: [PATCH] Issue #207 - javax.websocket.DeploymentException thrown at addEndpoint now --- .../jsr356/server/ServerContainer.java | 47 +++++++++++++++++++ .../server/DeploymentExceptionTest.java | 3 +- 2 files changed, 49 insertions(+), 1 deletion(-) 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 5437e59bdfa..aded955b9e6 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 @@ -19,6 +19,7 @@ package org.eclipse.jetty.websocket.jsr356.server; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -157,10 +158,56 @@ public class ServerContainer extends ClientContainer implements javax.websocket. private void addEndpointMapping(ServerEndpointConfig config) throws DeploymentException { + assertIsValidEndpoint(config); + JsrCreator creator = new JsrCreator(this, config, webSocketServerFactory.getExtensionFactory()); mappedCreator.addMapping(new UriTemplatePathSpec(config.getPath()), creator); } + private void assertIsValidEndpoint(ServerEndpointConfig config) throws DeploymentException + { + EndpointFunctions endpointFunctions = null; + try + { + // Test that endpoint can be instantiated + Object endpoint = config.getEndpointClass().newInstance(); + + // Establish an EndpointFunctions to test validity of Endpoint declaration + AvailableEncoders availableEncoders = new AvailableEncoders(config); + AvailableDecoders availableDecoders = new AvailableDecoders(config); + Map pathParameters = new HashMap<>(); + endpointFunctions = newJsrEndpointFunction(endpoint, availableEncoders, availableDecoders, pathParameters, config); + endpointFunctions.start(); // this should trigger an exception if endpoint is invalid. + } + catch (InstantiationException e) + { + throw new DeploymentException("Unable to instantiate new instance of endpoint: " + config.getEndpointClass().getName(), e); + } + catch (IllegalAccessException e) + { + throw new DeploymentException("Unable access endpoint: " + config.getEndpointClass().getName(), e); + } + catch (Exception e) + { + throw new DeploymentException("Unable add endpoint: " + config.getEndpointClass().getName(), e); + } + finally + { + if (endpointFunctions != null) + { + try + { + // Dispose of EndpointFunctions + endpointFunctions.stop(); + } + catch (Exception ignore) + { + // ignore + } + } + } + } + @Override public EndpointFunctions newJsrEndpointFunction(Object endpoint, AvailableEncoders availableEncoders, diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DeploymentExceptionTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DeploymentExceptionTest.java index c138f8400c4..80c6dc4096c 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DeploymentExceptionTest.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DeploymentExceptionTest.java @@ -36,6 +36,7 @@ import org.eclipse.jetty.websocket.jsr356.server.samples.InvalidOpenIntSocket; import org.eclipse.jetty.websocket.jsr356.server.samples.InvalidOpenSessionIntSocket; import org.eclipse.jetty.websocket.server.MappedWebSocketCreator; import org.eclipse.jetty.websocket.server.WebSocketServerFactory; +import org.eclipse.jetty.websocket.server.WebSocketUpgradeHandlerWrapper; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -81,7 +82,7 @@ public class DeploymentExceptionTest @Test public void testDeploy_InvalidSignature() throws Exception { - MappedWebSocketCreator creator = new DummyCreator(); + MappedWebSocketCreator creator = new WebSocketUpgradeHandlerWrapper(); WebSocketServerFactory serverFactory = new WebSocketServerFactory(); Executor executor = new QueuedThreadPool(); ServerContainer container = new ServerContainer(creator, serverFactory, executor);