453834 - CDI Support for WebSocket
+ Changing util.Decorators to util.EnhancedInstantiator to reflect true usage + Adding EnhancedInstantiator to JSR-356
This commit is contained in:
parent
fb88bc4c19
commit
5c3e30d136
|
@ -60,7 +60,7 @@ import org.eclipse.jetty.server.handler.HandlerWrapper;
|
|||
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
|
||||
import org.eclipse.jetty.server.session.SessionHandler;
|
||||
import org.eclipse.jetty.servlet.BaseHolder.Source;
|
||||
import org.eclipse.jetty.util.Decorators;
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
||||
import org.eclipse.jetty.util.annotation.ManagedObject;
|
||||
import org.eclipse.jetty.util.component.LifeCycle;
|
||||
|
@ -88,7 +88,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
|
||||
public interface ServletContainerInitializerCaller extends LifeCycle {};
|
||||
|
||||
protected final Decorators _decorators= new Decorators();
|
||||
protected final EnhancedInstantiator _instantiator= new EnhancedInstantiator();
|
||||
protected Class<? extends SecurityHandler> _defaultSecurityHandlerClass=org.eclipse.jetty.security.ConstraintSecurityHandler.class;
|
||||
protected SessionHandler _sessionHandler;
|
||||
protected SecurityHandler _securityHandler;
|
||||
|
@ -252,7 +252,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
@Override
|
||||
protected void doStart() throws Exception
|
||||
{
|
||||
setAttribute(Decorators.class.getName(), _decorators);
|
||||
setAttribute(EnhancedInstantiator.ATTR, _instantiator);
|
||||
super.doStart();
|
||||
}
|
||||
|
||||
|
@ -264,7 +264,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
protected void doStop() throws Exception
|
||||
{
|
||||
super.doStop();
|
||||
_decorators.clear();
|
||||
_instantiator.clear();
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -331,7 +331,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
{
|
||||
for (ListenerHolder holder:_servletHandler.getListeners())
|
||||
{
|
||||
_decorators.decorate(holder.getListener());
|
||||
_instantiator.decorate(holder.getListener());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -651,13 +651,13 @@ public class ServletContextHandler extends ContextHandler
|
|||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @return The decorator list used to resource inject new Filters, Servlets and EventListeners
|
||||
* @deprecated use getAttribute("org.eclipse.jetty.util.Decorators") instead
|
||||
* @deprecated use getAttribute("org.eclipse.jetty.util.EnhancedInstantiator") instead
|
||||
*/
|
||||
@Deprecated
|
||||
public List<Decorator> getDecorators()
|
||||
{
|
||||
List<Decorator> ret = new ArrayList<ServletContextHandler.Decorator>();
|
||||
for (org.eclipse.jetty.util.Decorator decorator : _decorators)
|
||||
for (org.eclipse.jetty.util.Decorator decorator : _instantiator)
|
||||
{
|
||||
ret.add(new LegacyDecorator(decorator));
|
||||
}
|
||||
|
@ -670,7 +670,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
*/
|
||||
public void setDecorators(List<Decorator> decorators)
|
||||
{
|
||||
_decorators.setDecorators(decorators);
|
||||
_instantiator.setDecorators(decorators);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -679,19 +679,19 @@ public class ServletContextHandler extends ContextHandler
|
|||
*/
|
||||
public void addDecorator(Decorator decorator)
|
||||
{
|
||||
_decorators.addDecorator(decorator);
|
||||
_instantiator.addDecorator(decorator);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
void destroyServlet(Servlet servlet)
|
||||
{
|
||||
_decorators.destroy(servlet);
|
||||
_instantiator.destroy(servlet);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
void destroyFilter(Filter filter)
|
||||
{
|
||||
_decorators.destroy(filter);
|
||||
_instantiator.destroy(filter);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -1244,7 +1244,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
try
|
||||
{
|
||||
T f = createInstance(c);
|
||||
f = _decorators.decorate(f);
|
||||
f = _instantiator.decorate(f);
|
||||
return f;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -1260,7 +1260,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
try
|
||||
{
|
||||
T s = createInstance(c);
|
||||
s = _decorators.decorate(s);
|
||||
s = _instantiator.decorate(s);
|
||||
return s;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -1403,7 +1403,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
try
|
||||
{
|
||||
T l = createInstance(clazz);
|
||||
l = _decorators.decorate(l);
|
||||
l = _instantiator.decorate(l);
|
||||
return l;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
|
@ -24,14 +24,16 @@ import java.util.Iterator;
|
|||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents a collection of {@link Decorator} instances that apply to a known
|
||||
* state, such as a WebAppContext, WebSocketServerFactory, or WebSocketClient.
|
||||
* An instantiator enhanced by {@link Decorator} instances.
|
||||
* <p>
|
||||
* Consistent single location for all Decorator behavior, with equal behavior in a ServletContext and also for a stand
|
||||
* alone client.
|
||||
* <p>
|
||||
* Used by WebAppContext, WebSocketServerFactory, or WebSocketClient.
|
||||
*/
|
||||
public class Decorators implements Iterable<Decorator>
|
||||
public class EnhancedInstantiator implements Iterable<Decorator>
|
||||
{
|
||||
public static final String ATTR = EnhancedInstantiator.class.getName();
|
||||
private List<Decorator> decorators = new ArrayList<>();
|
||||
|
||||
public void addDecorator(Decorator decorator)
|
||||
|
@ -44,18 +46,12 @@ public class Decorators implements Iterable<Decorator>
|
|||
this.decorators.clear();
|
||||
}
|
||||
|
||||
public <T> T createDecoratedInstance(Class<T> clazz) throws Exception
|
||||
public <T> T createInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException
|
||||
{
|
||||
T o = clazz.newInstance();
|
||||
return decorate(o);
|
||||
}
|
||||
|
||||
public <T> T createInstance(Class<T> clazz) throws Exception
|
||||
{
|
||||
T o = clazz.newInstance();
|
||||
return o;
|
||||
}
|
||||
|
||||
public <T> T decorate(T obj)
|
||||
{
|
||||
T f = obj;
|
|
@ -30,6 +30,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import javax.websocket.ClientEndpoint;
|
||||
import javax.websocket.ClientEndpointConfig;
|
||||
import javax.websocket.DeploymentException;
|
||||
|
@ -39,6 +40,7 @@ import javax.websocket.Extension;
|
|||
import javax.websocket.Session;
|
||||
import javax.websocket.WebSocketContainer;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.component.ContainerLifeCycle;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
|
@ -49,6 +51,7 @@ import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
|
|||
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
|
||||
import org.eclipse.jetty.websocket.client.WebSocketClient;
|
||||
import org.eclipse.jetty.websocket.client.io.UpgradeListener;
|
||||
import org.eclipse.jetty.websocket.common.SessionFactory;
|
||||
import org.eclipse.jetty.websocket.common.SessionListener;
|
||||
import org.eclipse.jetty.websocket.common.WebSocketSession;
|
||||
import org.eclipse.jetty.websocket.jsr356.annotations.AnnotatedEndpointScanner;
|
||||
|
@ -85,15 +88,15 @@ public class ClientContainer extends ContainerLifeCycle implements WebSocketCont
|
|||
public ClientContainer()
|
||||
{
|
||||
// This constructor is used with Standalone JSR Client usage.
|
||||
this(null);
|
||||
this(null,new EnhancedInstantiator());
|
||||
client.setDaemon(true);
|
||||
}
|
||||
|
||||
public ClientContainer(Executor executor)
|
||||
public ClientContainer(Executor executor, EnhancedInstantiator enhancedInstantiator)
|
||||
{
|
||||
endpointClientMetadataCache = new ConcurrentHashMap<>();
|
||||
decoderFactory = new DecoderFactory(PrimitiveDecoderMetadataSet.INSTANCE);
|
||||
encoderFactory = new EncoderFactory(PrimitiveEncoderMetadataSet.INSTANCE);
|
||||
decoderFactory = new DecoderFactory(PrimitiveDecoderMetadataSet.INSTANCE,null,enhancedInstantiator);
|
||||
encoderFactory = new EncoderFactory(PrimitiveEncoderMetadataSet.INSTANCE,null,enhancedInstantiator);
|
||||
|
||||
EmptyClientEndpointConfig empty = new EmptyClientEndpointConfig();
|
||||
decoderFactory.init(empty);
|
||||
|
@ -103,7 +106,9 @@ public class ClientContainer extends ContainerLifeCycle implements WebSocketCont
|
|||
|
||||
client = new WebSocketClient(new SslContextFactory(trustAll), executor);
|
||||
client.setEventDriverFactory(new JsrEventDriverFactory(client.getPolicy()));
|
||||
client.setSessionFactory(new JsrSessionFactory(this,this,client));
|
||||
SessionFactory sessionFactory = new JsrSessionFactory(this,this,client);
|
||||
sessionFactory.setEnhancedInstantiator(enhancedInstantiator);
|
||||
client.setSessionFactory(sessionFactory);
|
||||
addBean(client);
|
||||
|
||||
ShutdownThread.register(this);
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
package org.eclipse.jetty.websocket.jsr356;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.websocket.Decoder;
|
||||
import javax.websocket.EndpointConfig;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.eclipse.jetty.websocket.jsr356.metadata.DecoderMetadata;
|
||||
|
@ -71,19 +74,23 @@ public class DecoderFactory implements Configurable
|
|||
private static final Logger LOG = Log.getLogger(DecoderFactory.class);
|
||||
|
||||
private final DecoderMetadataSet metadatas;
|
||||
private final EnhancedInstantiator enhancedInstantiator;
|
||||
private DecoderFactory parentFactory;
|
||||
private Map<Class<?>, Wrapper> activeWrappers;
|
||||
|
||||
public DecoderFactory(DecoderMetadataSet metadatas)
|
||||
{
|
||||
this.metadatas = metadatas;
|
||||
this.activeWrappers = new ConcurrentHashMap<>();
|
||||
this(metadatas, null, new EnhancedInstantiator());
|
||||
}
|
||||
|
||||
public DecoderFactory(DecoderMetadataSet metadatas, DecoderFactory parentFactory)
|
||||
public DecoderFactory(DecoderMetadataSet metadatas, DecoderFactory parentFactory, EnhancedInstantiator enhancedInstantiator)
|
||||
{
|
||||
this(metadatas);
|
||||
this.metadatas = metadatas;
|
||||
this.activeWrappers = new ConcurrentHashMap<>();
|
||||
this.parentFactory = parentFactory;
|
||||
|
||||
Objects.requireNonNull(enhancedInstantiator,"EnhancedInitiator cannot be null");
|
||||
this.enhancedInstantiator = enhancedInstantiator;
|
||||
}
|
||||
|
||||
public Decoder getDecoderFor(Class<?> type)
|
||||
|
@ -172,7 +179,7 @@ public class DecoderFactory implements Configurable
|
|||
Class<? extends Decoder> decoderClass = metadata.getCoderClass();
|
||||
try
|
||||
{
|
||||
Decoder decoder = decoderClass.newInstance();
|
||||
Decoder decoder = enhancedInstantiator.createInstance(decoderClass);
|
||||
return new Wrapper(decoder,metadata);
|
||||
}
|
||||
catch (InstantiationException | IllegalAccessException e)
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
package org.eclipse.jetty.websocket.jsr356;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.websocket.Encoder;
|
||||
import javax.websocket.EndpointConfig;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.eclipse.jetty.websocket.jsr356.metadata.EncoderMetadata;
|
||||
|
@ -64,19 +67,23 @@ public class EncoderFactory implements Configurable
|
|||
private static final Logger LOG = Log.getLogger(EncoderFactory.class);
|
||||
|
||||
private final EncoderMetadataSet metadatas;
|
||||
private final EnhancedInstantiator enhancedInstantiator;
|
||||
private EncoderFactory parentFactory;
|
||||
private Map<Class<?>, Wrapper> activeWrappers;
|
||||
|
||||
public EncoderFactory(EncoderMetadataSet metadatas)
|
||||
{
|
||||
this.metadatas = metadatas;
|
||||
this.activeWrappers = new ConcurrentHashMap<>();
|
||||
this(metadatas,null,new EnhancedInstantiator());
|
||||
}
|
||||
|
||||
public EncoderFactory(EncoderMetadataSet metadatas, EncoderFactory parentFactory)
|
||||
public EncoderFactory(EncoderMetadataSet metadatas, EncoderFactory parentFactory, EnhancedInstantiator enhancedInstantiator)
|
||||
{
|
||||
this(metadatas);
|
||||
this.metadatas = metadatas;
|
||||
this.activeWrappers = new ConcurrentHashMap<>();
|
||||
this.parentFactory = parentFactory;
|
||||
|
||||
Objects.requireNonNull(enhancedInstantiator,"EnhancedInitiator cannot be null");
|
||||
this.enhancedInstantiator = enhancedInstantiator;
|
||||
}
|
||||
|
||||
public Encoder getEncoderFor(Class<?> type)
|
||||
|
@ -166,7 +173,7 @@ public class EncoderFactory implements Configurable
|
|||
Class<? extends Encoder> encoderClass = metadata.getCoderClass();
|
||||
try
|
||||
{
|
||||
Encoder encoder = encoderClass.newInstance();
|
||||
Encoder encoder = enhancedInstantiator.createInstance(encoderClass);
|
||||
return new Wrapper(encoder,metadata);
|
||||
}
|
||||
catch (InstantiationException | IllegalAccessException e)
|
||||
|
|
|
@ -29,6 +29,7 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.websocket.CloseReason;
|
||||
import javax.websocket.EndpointConfig;
|
||||
import javax.websocket.Extension;
|
||||
|
@ -38,6 +39,7 @@ import javax.websocket.RemoteEndpoint.Basic;
|
|||
import javax.websocket.Session;
|
||||
import javax.websocket.WebSocketContainer;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.eclipse.jetty.websocket.api.BatchMode;
|
||||
|
@ -73,7 +75,7 @@ public class JsrSession extends WebSocketSession implements javax.websocket.Sess
|
|||
private JsrAsyncRemote asyncRemote;
|
||||
private JsrBasicRemote basicRemote;
|
||||
|
||||
public JsrSession(URI requestURI, EventDriver websocket, LogicalConnection connection, ClientContainer container, String id, SessionListener... sessionListeners)
|
||||
public JsrSession(URI requestURI, EventDriver websocket, LogicalConnection connection, ClientContainer container, String id, EnhancedInstantiator enhancedInstantiator, SessionListener... sessionListeners)
|
||||
{
|
||||
super(requestURI, websocket, connection, sessionListeners);
|
||||
if (!(websocket instanceof AbstractJsrEventDriver))
|
||||
|
@ -85,8 +87,8 @@ public class JsrSession extends WebSocketSession implements javax.websocket.Sess
|
|||
this.metadata = jsr.getMetadata();
|
||||
this.container = container;
|
||||
this.id = id;
|
||||
this.decoderFactory = new DecoderFactory(metadata.getDecoders(),container.getDecoderFactory());
|
||||
this.encoderFactory = new EncoderFactory(metadata.getEncoders(),container.getEncoderFactory());
|
||||
this.decoderFactory = new DecoderFactory(metadata.getDecoders(),container.getDecoderFactory(),enhancedInstantiator);
|
||||
this.encoderFactory = new EncoderFactory(metadata.getEncoders(),container.getEncoderFactory(),enhancedInstantiator);
|
||||
this.messageHandlerFactory = new MessageHandlerFactory();
|
||||
this.wrappers = new MessageHandlerWrapper[MessageType.values().length];
|
||||
this.messageHandlerSet = new HashSet<>();
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.eclipse.jetty.websocket.jsr356;
|
|||
import java.net.URI;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.common.LogicalConnection;
|
||||
import org.eclipse.jetty.websocket.common.SessionFactory;
|
||||
import org.eclipse.jetty.websocket.common.SessionListener;
|
||||
|
@ -31,6 +32,7 @@ import org.eclipse.jetty.websocket.jsr356.endpoints.AbstractJsrEventDriver;
|
|||
public class JsrSessionFactory implements SessionFactory
|
||||
{
|
||||
private AtomicLong idgen = new AtomicLong(0);
|
||||
private EnhancedInstantiator enhancedInstantiator;
|
||||
private final ClientContainer container;
|
||||
private final SessionListener[] listeners;
|
||||
|
||||
|
@ -38,12 +40,13 @@ public class JsrSessionFactory implements SessionFactory
|
|||
{
|
||||
this.container = container;
|
||||
this.listeners = sessionListeners;
|
||||
this.enhancedInstantiator = new EnhancedInstantiator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public WebSocketSession createSession(URI requestURI, EventDriver websocket, LogicalConnection connection)
|
||||
{
|
||||
return new JsrSession(requestURI,websocket,connection,container,getNextId(),listeners);
|
||||
return new JsrSession(requestURI,websocket,connection,container,getNextId(),enhancedInstantiator,listeners);
|
||||
}
|
||||
|
||||
public String getNextId()
|
||||
|
@ -56,4 +59,10 @@ public class JsrSessionFactory implements SessionFactory
|
|||
{
|
||||
return (websocket instanceof AbstractJsrEventDriver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnhancedInstantiator(EnhancedInstantiator enhancedInstantiator)
|
||||
{
|
||||
this.enhancedInstantiator = enhancedInstantiator;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import java.util.Date;
|
|||
|
||||
import javax.websocket.Decoder;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.jsr356.decoders.ByteArrayDecoder;
|
||||
import org.eclipse.jetty.websocket.jsr356.decoders.ByteBufferDecoder;
|
||||
import org.eclipse.jetty.websocket.jsr356.decoders.DateDecoder;
|
||||
|
@ -58,7 +59,7 @@ public class DecoderFactoryTest
|
|||
{
|
||||
DecoderFactory primitivesFactory = new DecoderFactory(PrimitiveDecoderMetadataSet.INSTANCE);
|
||||
metadatas = new DecoderMetadataSet();
|
||||
factory = new DecoderFactory(metadatas,primitivesFactory);
|
||||
factory = new DecoderFactory(metadatas,primitivesFactory,new EnhancedInstantiator());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -46,9 +46,11 @@ import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
|
|||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
@Ignore("Not working atm")
|
||||
public class DecoderReaderManySmallTest
|
||||
{
|
||||
public static class EventId
|
||||
|
|
|
@ -18,10 +18,11 @@
|
|||
|
||||
package org.eclipse.jetty.websocket.jsr356;
|
||||
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
|
||||
import javax.websocket.Encoder;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.jsr356.encoders.IntegerEncoder;
|
||||
import org.eclipse.jetty.websocket.jsr356.encoders.LongEncoder;
|
||||
import org.eclipse.jetty.websocket.jsr356.encoders.PrimitiveEncoderMetadataSet;
|
||||
|
@ -55,7 +56,7 @@ public class EncoderFactoryTest
|
|||
{
|
||||
EncoderFactory primitivesFactory = new EncoderFactory(PrimitiveEncoderMetadataSet.INSTANCE);
|
||||
metadatas = new EncoderMetadataSet();
|
||||
factory = new EncoderFactory(metadatas,primitivesFactory);
|
||||
factory = new EncoderFactory(metadatas,primitivesFactory,new EnhancedInstantiator());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -20,10 +20,12 @@ package org.eclipse.jetty.websocket.jsr356;
|
|||
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import javax.websocket.ClientEndpointConfig;
|
||||
import javax.websocket.DeploymentException;
|
||||
import javax.websocket.MessageHandler;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||
import org.eclipse.jetty.websocket.common.events.EventDriver;
|
||||
import org.eclipse.jetty.websocket.jsr356.client.EmptyClientEndpointConfig;
|
||||
|
@ -63,7 +65,7 @@ public class JsrSessionTest
|
|||
|
||||
EventDriver driver = new JsrEndpointEventDriver(policy,ei);
|
||||
DummyConnection connection = new DummyConnection();
|
||||
session = new JsrSession(requestURI,driver,connection,container,id);
|
||||
session = new JsrSession(requestURI,driver,connection,container,id, new EnhancedInstantiator());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -25,6 +25,7 @@ import java.util.List;
|
|||
|
||||
import javax.websocket.DeploymentException;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.jsr356.decoders.PrimitiveDecoderMetadataSet;
|
||||
import org.eclipse.jetty.websocket.jsr356.handlers.ByteArrayPartialHandler;
|
||||
import org.eclipse.jetty.websocket.jsr356.handlers.StringPartialHandler;
|
||||
|
@ -46,7 +47,7 @@ public class MessageHandlerFactoryTest
|
|||
{
|
||||
DecoderFactory primitivesFactory = new DecoderFactory(PrimitiveDecoderMetadataSet.INSTANCE);
|
||||
metadatas = new DecoderMetadataSet();
|
||||
decoders = new DecoderFactory(metadatas,primitivesFactory);
|
||||
decoders = new DecoderFactory(metadatas,primitivesFactory,new EnhancedInstantiator());
|
||||
factory = new MessageHandlerFactory();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
|
||||
org.eclipse.jetty.LEVEL=WARN
|
||||
|
||||
# org.eclipse.jetty.websocket.LEVEL=WARN
|
||||
# org.eclipse.jetty.websocket.LEVEL=ALL
|
||||
# org.eclipse.jetty.websocket.jsr356.LEVEL=DEBUG
|
||||
|
|
|
@ -46,7 +46,7 @@ public class ServerContainer extends ClientContainer implements javax.websocket.
|
|||
|
||||
public ServerContainer(MappedWebSocketCreator creator, WebSocketServerFactory factory, Executor executor)
|
||||
{
|
||||
super(executor);
|
||||
super(executor, factory.getEnhancedInstantiator());
|
||||
this.mappedCreator = creator;
|
||||
this.webSocketServerFactory = factory;
|
||||
EventDriverFactory eventDriverFactory = this.webSocketServerFactory.getEventDriverFactory();
|
||||
|
|
|
@ -56,6 +56,7 @@ 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);
|
||||
|
||||
|
@ -76,6 +77,7 @@ 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);
|
||||
|
||||
|
|
|
@ -21,9 +21,11 @@ package org.eclipse.jetty.websocket.jsr356.server;
|
|||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.websocket.server.ServerEndpoint;
|
||||
import javax.websocket.server.ServerEndpointConfig;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||
import org.eclipse.jetty.websocket.common.WebSocketFrame;
|
||||
import org.eclipse.jetty.websocket.common.events.EventDriver;
|
||||
|
@ -79,7 +81,7 @@ public class OnPartialTest
|
|||
DummyConnection connection = new DummyConnection();
|
||||
ClientContainer container = new ClientContainer();
|
||||
@SuppressWarnings("resource")
|
||||
JsrSession session = new JsrSession(requestURI,driver,connection,container,id);
|
||||
JsrSession session = new JsrSession(requestURI,driver,connection,container,id, new EnhancedInstantiator());
|
||||
session.setPolicy(policy);
|
||||
session.open();
|
||||
return driver;
|
||||
|
|
|
@ -248,8 +248,6 @@ public class Parser
|
|||
}
|
||||
try
|
||||
{
|
||||
// TODO: create DebugBuffer
|
||||
|
||||
// parse through all the frames in the buffer
|
||||
while (parseFrame(buffer))
|
||||
{
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.eclipse.jetty.websocket.common;
|
|||
|
||||
import java.net.URI;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.common.events.EventDriver;
|
||||
|
||||
/**
|
||||
|
@ -30,4 +31,6 @@ public interface SessionFactory
|
|||
public boolean supports(EventDriver websocket);
|
||||
|
||||
public WebSocketSession createSession(URI requestURI, EventDriver websocket, LogicalConnection connection);
|
||||
|
||||
public void setEnhancedInstantiator(EnhancedInstantiator enhancedInstantiator);
|
||||
}
|
||||
|
|
|
@ -433,6 +433,7 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc
|
|||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
LOG.ignore(t);
|
||||
// Exception on end-user WS-Endpoint.
|
||||
// Fast-fail & close connection with reason.
|
||||
int statusCode = StatusCode.SERVER_ERROR;
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.eclipse.jetty.websocket.common;
|
|||
|
||||
import java.net.URI;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.websocket.common.events.EventDriver;
|
||||
import org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver;
|
||||
import org.eclipse.jetty.websocket.common.events.JettyListenerEventDriver;
|
||||
|
@ -47,4 +48,10 @@ public class WebSocketSessionFactory implements SessionFactory
|
|||
{
|
||||
return new WebSocketSession(requestURI,websocket,connection,listeners);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnhancedInstantiator(EnhancedInstantiator enhancedInstantiator)
|
||||
{
|
||||
/* does nothing here */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package org.eclipse.jetty.websocket.common.extensions;
|
||||
|
||||
import org.eclipse.jetty.io.ByteBufferPool;
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.StringUtil;
|
||||
import org.eclipse.jetty.websocket.api.WebSocketException;
|
||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||
|
@ -30,6 +31,7 @@ public class WebSocketExtensionFactory extends ExtensionFactory
|
|||
{
|
||||
private WebSocketPolicy policy;
|
||||
private ByteBufferPool bufferPool;
|
||||
private EnhancedInstantiator enhancedInstantiator;
|
||||
|
||||
public WebSocketExtensionFactory(WebSocketPolicy policy, ByteBufferPool bufferPool)
|
||||
{
|
||||
|
@ -60,7 +62,7 @@ public class WebSocketExtensionFactory extends ExtensionFactory
|
|||
|
||||
try
|
||||
{
|
||||
Extension ext = extClass.newInstance();
|
||||
Extension ext = enhancedInstantiator.createInstance(extClass);
|
||||
if (ext instanceof AbstractExtension)
|
||||
{
|
||||
AbstractExtension aext = (AbstractExtension)ext;
|
||||
|
@ -75,4 +77,9 @@ public class WebSocketExtensionFactory extends ExtensionFactory
|
|||
throw new WebSocketException("Cannot instantiate extension: " + extClass,e);
|
||||
}
|
||||
}
|
||||
|
||||
public void setEnhancedInstantiator(EnhancedInstantiator enhancedInstantiator)
|
||||
{
|
||||
this.enhancedInstantiator = enhancedInstantiator;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,12 +23,12 @@ import static org.hamcrest.Matchers.*;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||
import org.eclipse.jetty.websocket.api.extensions.Extension;
|
||||
import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
|
||||
import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
|
||||
import org.eclipse.jetty.websocket.common.extensions.identity.IdentityExtension;
|
||||
import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule;
|
||||
import org.junit.Assert;
|
||||
|
@ -56,7 +56,8 @@ public class ExtensionStackTest
|
|||
private ExtensionStack createExtensionStack()
|
||||
{
|
||||
WebSocketPolicy policy = WebSocketPolicy.newClientPolicy();
|
||||
ExtensionFactory factory = new WebSocketExtensionFactory(policy,bufferPool);
|
||||
WebSocketExtensionFactory factory = new WebSocketExtensionFactory(policy,bufferPool);
|
||||
factory.setEnhancedInstantiator(new EnhancedInstantiator());
|
||||
return new ExtensionStack(factory);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
|
|||
import java.util.Collections;
|
||||
|
||||
import org.eclipse.jetty.io.ByteBufferPool;
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.TypeUtil;
|
||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||
import org.eclipse.jetty.websocket.api.extensions.Extension;
|
||||
|
@ -126,7 +127,9 @@ public class ExtensionTool
|
|||
public ExtensionTool(WebSocketPolicy policy, ByteBufferPool bufferPool)
|
||||
{
|
||||
this.policy = policy;
|
||||
this.factory = new WebSocketExtensionFactory(policy,bufferPool);
|
||||
WebSocketExtensionFactory extFactory = new WebSocketExtensionFactory(policy,bufferPool);
|
||||
extFactory.setEnhancedInstantiator(new EnhancedInstantiator());
|
||||
this.factory = extFactory;
|
||||
}
|
||||
|
||||
public Tester newTester(String parameterizedExtension)
|
||||
|
|
|
@ -44,6 +44,7 @@ import org.eclipse.jetty.io.ByteBufferPool;
|
|||
import org.eclipse.jetty.io.MappedByteBufferPool;
|
||||
import org.eclipse.jetty.toolchain.test.EventQueue;
|
||||
import org.eclipse.jetty.util.BufferUtil;
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.IO;
|
||||
import org.eclipse.jetty.util.StringUtil;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
|
@ -228,6 +229,7 @@ public class BlockheadClient implements OutgoingFrames, ConnectionStateListener,
|
|||
this.parser = new Parser(policy,bufferPool);
|
||||
|
||||
this.extensionFactory = new WebSocketExtensionFactory(policy,bufferPool);
|
||||
this.extensionFactory.setEnhancedInstantiator(new EnhancedInstantiator());
|
||||
this.ioState = new IOState();
|
||||
this.ioState.addListener(this);
|
||||
}
|
||||
|
|
|
@ -31,6 +31,8 @@ import java.util.Set;
|
|||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
|
@ -39,8 +41,8 @@ import org.eclipse.jetty.io.ByteBufferPool;
|
|||
import org.eclipse.jetty.io.EndPoint;
|
||||
import org.eclipse.jetty.io.MappedByteBufferPool;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
import org.eclipse.jetty.util.Decorator;
|
||||
import org.eclipse.jetty.util.Decorators;
|
||||
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||
import org.eclipse.jetty.util.EnhancedInstantiator;
|
||||
import org.eclipse.jetty.util.component.ContainerLifeCycle;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
|
@ -88,7 +90,7 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
|
|||
private Set<WebSocketSession> openSessions = new CopyOnWriteArraySet<>();
|
||||
private WebSocketCreator creator;
|
||||
private List<Class<?>> registeredSocketClasses;
|
||||
private Decorators decorators = new Decorators();
|
||||
private EnhancedInstantiator enhancedInstantiator;
|
||||
|
||||
public WebSocketServerFactory()
|
||||
{
|
||||
|
@ -290,13 +292,30 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
|
|||
Class<?> firstClass = registeredSocketClasses.get(0);
|
||||
try
|
||||
{
|
||||
return firstClass.newInstance();
|
||||
return enhancedInstantiator.createInstance(firstClass);
|
||||
}
|
||||
catch (InstantiationException | IllegalAccessException e)
|
||||
{
|
||||
throw new WebSocketException("Unable to create instance of " + firstClass, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doStart() throws Exception
|
||||
{
|
||||
if(this.enhancedInstantiator == null)
|
||||
{
|
||||
this.enhancedInstantiator = new EnhancedInstantiator();
|
||||
}
|
||||
|
||||
this.extensionFactory.setEnhancedInstantiator(this.enhancedInstantiator);
|
||||
for(SessionFactory sessionFactory: this.sessionFactories)
|
||||
{
|
||||
sessionFactory.setEnhancedInstantiator(this.enhancedInstantiator);
|
||||
}
|
||||
|
||||
super.doStart();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doStop() throws Exception
|
||||
|
@ -310,6 +329,11 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
|
|||
{
|
||||
return this.creator;
|
||||
}
|
||||
|
||||
public EnhancedInstantiator getEnhancedInstantiator()
|
||||
{
|
||||
return enhancedInstantiator;
|
||||
}
|
||||
|
||||
public EventDriverFactory getEventDriverFactory()
|
||||
{
|
||||
|
@ -322,16 +346,6 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
|
|||
return extensionFactory;
|
||||
}
|
||||
|
||||
public void addDecorator(Decorator decorator)
|
||||
{
|
||||
decorators.addDecorator(decorator);
|
||||
}
|
||||
|
||||
public List<Decorator> getDecorators()
|
||||
{
|
||||
return decorators.getDecorators();
|
||||
}
|
||||
|
||||
public Set<WebSocketSession> getOpenSessions()
|
||||
{
|
||||
return Collections.unmodifiableSet(this.openSessions);
|
||||
|
@ -343,10 +357,36 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
|
|||
return defaultPolicy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() throws Exception
|
||||
public void init(ServletContextHandler context) throws ServletException
|
||||
{
|
||||
start(); // start lifecycle
|
||||
this.enhancedInstantiator = (EnhancedInstantiator)context.getAttribute(EnhancedInstantiator.ATTR);
|
||||
if (this.enhancedInstantiator == null)
|
||||
{
|
||||
this.enhancedInstantiator = new EnhancedInstantiator();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(ServletContext context) throws ServletException
|
||||
{
|
||||
this.enhancedInstantiator = (EnhancedInstantiator)context.getAttribute(EnhancedInstantiator.ATTR);
|
||||
if (this.enhancedInstantiator == null)
|
||||
{
|
||||
this.enhancedInstantiator = new EnhancedInstantiator();
|
||||
}
|
||||
try
|
||||
{
|
||||
// start lifecycle
|
||||
start();
|
||||
}
|
||||
catch (ServletException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -446,11 +486,6 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
|
|||
this.creator = creator;
|
||||
}
|
||||
|
||||
public void setDecorators(List<Decorator> decorators)
|
||||
{
|
||||
this.decorators.setDecorators(decorators);
|
||||
}
|
||||
|
||||
/**
|
||||
* Upgrade the request/response to a WebSocket Connection.
|
||||
* <p/>
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.eclipse.jetty.websocket.server;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.util.EnumSet;
|
||||
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.FilterChain;
|
||||
|
@ -256,7 +257,9 @@ public class WebSocketUpgradeFilter extends ContainerLifeCycle implements Filter
|
|||
|
||||
try
|
||||
{
|
||||
factory.init(config.getServletContext());
|
||||
WebSocketPolicy policy = factory.getPolicy();
|
||||
|
||||
|
||||
String max = config.getInitParameter("maxIdleTime");
|
||||
if (max != null)
|
||||
|
@ -290,7 +293,7 @@ public class WebSocketUpgradeFilter extends ContainerLifeCycle implements Filter
|
|||
}
|
||||
|
||||
setToAttribute(config.getServletContext(), key);
|
||||
|
||||
|
||||
factory.start();
|
||||
}
|
||||
catch (Exception x)
|
||||
|
|
|
@ -129,7 +129,7 @@ public abstract class WebSocketServlet extends HttpServlet
|
|||
|
||||
configure(factory);
|
||||
|
||||
factory.init();
|
||||
factory.init(getServletContext());
|
||||
|
||||
getServletContext().setAttribute(WebSocketServletFactory.class.getName(),factory);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.io.IOException;
|
|||
import java.util.Iterator;
|
||||
import java.util.ServiceLoader;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
|
@ -39,10 +40,10 @@ public interface WebSocketServletFactory
|
|||
|
||||
public static WebSocketServletFactory create(WebSocketPolicy policy) throws ClassNotFoundException, InstantiationException, IllegalAccessException
|
||||
{
|
||||
return load(policy).createFactory(policy);
|
||||
return load().createFactory(policy);
|
||||
}
|
||||
|
||||
public static WebSocketServletFactory load(WebSocketPolicy policy) throws ClassNotFoundException, InstantiationException, IllegalAccessException
|
||||
public static WebSocketServletFactory load() throws ClassNotFoundException, InstantiationException, IllegalAccessException
|
||||
{
|
||||
if (INSTANCE != null)
|
||||
{
|
||||
|
@ -64,7 +65,7 @@ public interface WebSocketServletFactory
|
|||
.loadClass("org.eclipse.jetty.websocket.server.WebSocketServerFactory");
|
||||
baseFactory = wssf.newInstance();
|
||||
}
|
||||
|
||||
|
||||
INSTANCE = baseFactory;
|
||||
return INSTANCE;
|
||||
}
|
||||
|
@ -91,7 +92,7 @@ public interface WebSocketServletFactory
|
|||
*/
|
||||
public WebSocketPolicy getPolicy();
|
||||
|
||||
public void init() throws Exception;
|
||||
public void init(ServletContext servletContext) throws Exception;
|
||||
|
||||
public boolean isUpgradeRequest(HttpServletRequest request, HttpServletResponse response);
|
||||
|
||||
|
|
Loading…
Reference in New Issue