diff options
author | Joakim Erdfelt | 2015-01-30 22:13:35 +0000 |
---|---|---|
committer | Joakim Erdfelt | 2015-03-12 17:09:52 +0000 |
commit | 87246263b8ae726a61cb9cef20f5d10c1c054458 (patch) | |
tree | d6a6c8950ca999e7a37470e824d233f9351ab264 /jetty-websocket/javax-websocket-server-impl | |
parent | e213c4488ea6ae83d440c5e53920be96187d860f (diff) | |
download | org.eclipse.jetty.project-87246263b8ae726a61cb9cef20f5d10c1c054458.tar.gz org.eclipse.jetty.project-87246263b8ae726a61cb9cef20f5d10c1c054458.tar.xz org.eclipse.jetty.project-87246263b8ae726a61cb9cef20f5d10c1c054458.zip |
453834 - CDI Support for WebSocket
+ Verifying ServletContextHandler behavior of Decorators
+ Marking old ServletContextHandler methods as deprecated
+ Updates to DecoratedObjectFactory
+ Removing customized weld scopes/context (for now)
+ Deferring JSR356 ServerContainer endpoint init
till Container.doStart() to allow weld to init properly first
+ Removing JSR356 BasicServerEndpointConfigurator in favor
of ContainerDefaultEndpointConfigurator
+ Only decorating server endpoints if they were created by
ContainerDefaultEndpointConfigurator, all others are trusted
to be complete and injected already.
Diffstat (limited to 'jetty-websocket/javax-websocket-server-impl')
7 files changed, 74 insertions, 73 deletions
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java index f6ae65b3e3..3dc14762dc 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java +++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java @@ -122,7 +122,7 @@ public class AnnotatedServerEndpointConfig implements ServerEndpointConfig } else { - cfgr = new BasicServerEndpointConfigurator(containerScope); + cfgr = new ContainerDefaultConfigurator(); } } else @@ -144,7 +144,6 @@ public class AnnotatedServerEndpointConfig implements ServerEndpointConfig // Make sure all Configurators obtained are decorated this.configurator = containerScope.getObjectFactory().decorate(cfgr); - } @Override diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java index 28f16ce107..1156917350 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java +++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java @@ -51,7 +51,7 @@ public class BasicServerEndpointConfig implements ServerEndpointConfig this.subprotocols = new ArrayList<>(); this.extensions = new ArrayList<>(); this.userProperties = new HashMap<>(); - this.configurator = new BasicServerEndpointConfigurator(containerScope); + this.configurator = new ContainerDefaultConfigurator(); } public BasicServerEndpointConfig(WebSocketContainerScope containerScope, ServerEndpointConfig copy) @@ -73,7 +73,7 @@ public class BasicServerEndpointConfig implements ServerEndpointConfig } else { - cfgr = new BasicServerEndpointConfigurator(containerScope); + cfgr = new ContainerDefaultConfigurator(); } // Make sure all Configurators obtained are decorated diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfigurator.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfigurator.java deleted file mode 100644 index 71000af8fd..0000000000 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfigurator.java +++ /dev/null @@ -1,57 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2015 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 org.eclipse.jetty.util.DecoratedObjectFactory; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; -import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope; - -/** - * The Basic Configurator - */ -public class BasicServerEndpointConfigurator extends ContainerDefaultConfigurator -{ - private static final Logger LOG = Log.getLogger(BasicServerEndpointConfigurator.class); - private final DecoratedObjectFactory objectFactory; - - public BasicServerEndpointConfigurator(WebSocketContainerScope containerScope) - { - super(); - this.objectFactory = containerScope.getObjectFactory(); - } - - @Override - public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException - { - if (LOG.isDebugEnabled()) - { - LOG.debug(".getEndpointInstance({})",endpointClass); - } - - try - { - return objectFactory.createInstance(endpointClass); - } - catch (IllegalAccessException e) - { - throw new InstantiationException(String.format("%s: %s",e.getClass().getName(),e.getMessage())); - } - } -}
\ No newline at end of file diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ContainerDefaultConfigurator.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ContainerDefaultConfigurator.java index 07d8a26771..4d0168811f 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ContainerDefaultConfigurator.java +++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ContainerDefaultConfigurator.java @@ -35,7 +35,7 @@ import org.eclipse.jetty.websocket.api.util.QuoteUtil; * * @see ServiceLoader behavior of {@link ServerEndpointConfig.Configurator} */ -public class ContainerDefaultConfigurator extends Configurator +public final class ContainerDefaultConfigurator extends Configurator { private static final Logger LOG = Log.getLogger(ContainerDefaultConfigurator.class); private static final String NO_SUBPROTOCOL = ""; 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 93d6659771..1d32ed3f31 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,6 +25,7 @@ import java.util.List; import javax.websocket.Extension; import javax.websocket.Extension.Parameter; import javax.websocket.server.ServerEndpointConfig; +import javax.websocket.server.ServerEndpointConfig.Configurator; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.log.Log; @@ -137,7 +138,13 @@ public class JsrCreator implements WebSocketCreator try { Class<?> endpointClass = config.getEndpointClass(); - Object endpoint = config.getConfigurator().getEndpointInstance(endpointClass); + Configurator configr = config.getConfigurator(); + Object endpoint = configr.getEndpointInstance(endpointClass); + if (configr instanceof ContainerDefaultConfigurator) + { + // default impl always decorates (custom ones do not) + endpoint = containerScope.getObjectFactory().decorate(endpoint); + } PathSpec pathSpec = hsreq.getRequestPathSpec(); if (pathSpec instanceof WebSocketPathSpec) { 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 6955bef201..e1932d2a83 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 @@ -18,6 +18,8 @@ package org.eclipse.jetty.websocket.jsr356.server; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Executor; import javax.websocket.DeploymentException; @@ -43,16 +45,19 @@ public class ServerContainer extends ClientContainer implements javax.websocket. private final MappedWebSocketCreator mappedCreator; private final WebSocketServerFactory webSocketServerFactory; + private List<Class<?>> deferredEndpointClasses; + private List<ServerEndpointConfig> deferredEndpointConfigs; public ServerContainer(MappedWebSocketCreator creator, WebSocketServerFactory factory, Executor executor) { - super(); + super(factory); this.mappedCreator = creator; this.webSocketServerFactory = factory; EventDriverFactory eventDriverFactory = this.webSocketServerFactory.getEventDriverFactory(); eventDriverFactory.addImplementation(new JsrServerEndpointImpl()); eventDriverFactory.addImplementation(new JsrServerExtendsEndpointImpl()); this.webSocketServerFactory.addSessionFactory(new JsrSessionFactory(this,this)); + addBean(webSocketServerFactory); } public EndpointInstance newClientEndpointInstance(Object endpoint, ServerEndpointConfig config, String path) @@ -76,11 +81,22 @@ public class ServerContainer extends ClientContainer implements javax.websocket. @Override public void addEndpoint(Class<?> endpointClass) throws DeploymentException { - ServerEndpointMetadata metadata = getServerEndpointMetadata(endpointClass,null); - addEndpoint(metadata); + if (isStarted() || isStarting()) + { + ServerEndpointMetadata metadata = getServerEndpointMetadata(endpointClass,null); + addEndpoint(metadata); + } + else + { + if (deferredEndpointClasses == null) + { + deferredEndpointClasses = new ArrayList<Class<?>>(); + } + deferredEndpointClasses.add(endpointClass); + } } - public void addEndpoint(ServerEndpointMetadata metadata) throws DeploymentException + private void addEndpoint(ServerEndpointMetadata metadata) throws DeploymentException { JsrCreator creator = new JsrCreator(this,metadata,webSocketServerFactory.getExtensionFactory()); mappedCreator.addMapping(new WebSocketPathSpec(metadata.getPath()),creator); @@ -89,12 +105,50 @@ public class ServerContainer extends ClientContainer implements javax.websocket. @Override public void addEndpoint(ServerEndpointConfig config) throws DeploymentException { - if (LOG.isDebugEnabled()) + if (isStarted() || isStarting()) + { + if (LOG.isDebugEnabled()) + { + LOG.debug("addEndpoint({}) path={} endpoint={}",config,config.getPath(),config.getEndpointClass()); + } + ServerEndpointMetadata metadata = getServerEndpointMetadata(config.getEndpointClass(),config); + addEndpoint(metadata); + } + else + { + if (deferredEndpointConfigs == null) + { + deferredEndpointConfigs = new ArrayList<ServerEndpointConfig>(); + } + deferredEndpointConfigs.add(config); + } + } + + @Override + protected void doStart() throws Exception + { + // Proceed with Normal Startup + super.doStart(); + + // Process Deferred Endpoints + if (deferredEndpointClasses != null) { - LOG.debug("addEndpoint({}) path={} endpoint={}",config,config.getPath(),config.getEndpointClass()); + for (Class<?> endpointClass : deferredEndpointClasses) + { + addEndpoint(endpointClass); + } + } + + if (deferredEndpointConfigs != null) + { + for (ServerEndpointConfig config : deferredEndpointConfigs) + { + addEndpoint(config); + } } - ServerEndpointMetadata metadata = getServerEndpointMetadata(config.getEndpointClass(),config); - addEndpoint(metadata); + + deferredEndpointClasses.clear(); + deferredEndpointConfigs.clear(); } public ServerEndpointMetadata getServerEndpointMetadata(final Class<?> endpoint, final ServerEndpointConfig config) throws DeploymentException diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java index b389ab0f27..76bd63d1bb 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java +++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java @@ -58,7 +58,6 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit WebSocketUpgradeFilter filter = WebSocketUpgradeFilter.configureContext(context); // Create the Jetty ServerContainer implementation - filter.getFactory().init(context); ServerContainer jettyContainer = new ServerContainer(filter,filter.getFactory(),context.getServer().getThreadPool()); context.addBean(jettyContainer); @@ -79,7 +78,6 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit WebSocketUpgradeFilter filter = WebSocketUpgradeFilter.configureContext(context); // Create the Jetty ServerContainer implementation - filter.getFactory().init(context); ServerContainer jettyContainer = new ServerContainer(filter,filter.getFactory(),jettyContext.getServer().getThreadPool()); jettyContext.addBean(jettyContainer); |