407708 - HttpUpgradeHandler must support injection

This commit is contained in:
Jan Bartel 2013-05-13 17:47:53 +10:00
parent 215d2e2095
commit 73bee3af4b
11 changed files with 117 additions and 253 deletions

View File

@ -18,19 +18,11 @@
package org.eclipse.jetty.annotations; package org.eclipse.jetty.annotations;
import java.util.EventListener;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler.Decorator; import org.eclipse.jetty.servlet.ServletContextHandler.Decorator;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
/** /**
* WebAppDecoratorWrapper * AnnotationDecorator
* *
* *
*/ */
@ -53,99 +45,6 @@ public class AnnotationDecorator implements Decorator
_introspector.registerHandler(new ServletSecurityAnnotationHandler(context)); _introspector.registerHandler(new ServletSecurityAnnotationHandler(context));
} }
/* ------------------------------------------------------------ */
/**
* @param filter
* @throws ServletException
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateFilterHolder(org.eclipse.jetty.servlet.FilterHolder)
*/
public void decorateFilterHolder(FilterHolder filter) throws ServletException
{
}
/* ------------------------------------------------------------ */
/**
* @param <T>
* @param filter
* @return the decorated filter
* @throws ServletException
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateFilterInstance(javax.servlet.Filter)
*/
public <T extends Filter> T decorateFilterInstance(T filter) throws ServletException
{
introspect(filter);
return filter;
}
/* ------------------------------------------------------------ */
/**
* @param <T>
* @param listener
* @return the decorated event listener instance
* @throws ServletException
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateListenerInstance(java.util.EventListener)
*/
public <T extends EventListener> T decorateListenerInstance(T listener) throws ServletException
{
introspect(listener);
return listener;
}
/* ------------------------------------------------------------ */
/**
* @param servlet
* @throws ServletException
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateServletHolder(org.eclipse.jetty.servlet.ServletHolder)
*/
public void decorateServletHolder(ServletHolder servlet) throws ServletException
{
}
/* ------------------------------------------------------------ */
/**
* @param <T>
* @param servlet
* @return the decorated servlet instance
* @throws ServletException
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateServletInstance(javax.servlet.Servlet)
*/
public <T extends Servlet> T decorateServletInstance(T servlet) throws ServletException
{
introspect(servlet);
return servlet;
}
/* ------------------------------------------------------------ */
/**
* @param f
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#destroyFilterInstance(javax.servlet.Filter)
*/
public void destroyFilterInstance(Filter f)
{
}
/* ------------------------------------------------------------ */
/**
* @param s
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#destroyServletInstance(javax.servlet.Servlet)
*/
public void destroyServletInstance(Servlet s)
{
}
/* ------------------------------------------------------------ */
/**
* @param f
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#destroyListenerInstance(java.util.EventListener)
*/
public void destroyListenerInstance(EventListener f)
{
}
/** /**
* Look for annotations that can be discovered with introspection: * Look for annotations that can be discovered with introspection:
* <ul> * <ul>
@ -161,4 +60,17 @@ public class AnnotationDecorator implements Decorator
{ {
_introspector.introspect(o.getClass()); _introspector.introspect(o.getClass());
} }
@Override
public Object decorate(Object o)
{
introspect(o);
return o;
}
@Override
public void destroy(Object o)
{
}
} }

View File

@ -44,7 +44,7 @@ public class PostConstructAnnotationHandler extends AbstractIntrospectableAnnota
public void doHandle(Class clazz) public void doHandle(Class clazz)
{ {
//Check that the PostConstruct is on a class that we're interested in //Check that the PostConstruct is on a class that we're interested in
if (Util.isServletType(clazz)) if (Util.supportsPostConstructPreDestroy(clazz))
{ {
Method[] methods = clazz.getDeclaredMethods(); Method[] methods = clazz.getDeclaredMethods();
for (int i=0; i<methods.length; i++) for (int i=0; i<methods.length; i++)

View File

@ -43,7 +43,7 @@ public class PreDestroyAnnotationHandler extends AbstractIntrospectableAnnotatio
public void doHandle(Class clazz) public void doHandle(Class clazz)
{ {
//Check that the PreDestroy is on a class that we're interested in //Check that the PreDestroy is on a class that we're interested in
if (Util.isServletType(clazz)) if (Util.supportsPostConstructPreDestroy(clazz))
{ {
Method[] methods = clazz.getDeclaredMethods(); Method[] methods = clazz.getDeclaredMethods();
for (int i=0; i<methods.length; i++) for (int i=0; i<methods.length; i++)

View File

@ -57,7 +57,7 @@ public class ResourceAnnotationHandler extends AbstractIntrospectableAnnotationH
*/ */
public void doHandle(Class<?> clazz) public void doHandle(Class<?> clazz)
{ {
if (Util.isServletType(clazz)) if (Util.supportsResourceInjection(clazz))
{ {
handleClass(clazz); handleClass(clazz);

View File

@ -69,6 +69,42 @@ public class Util
return isServlet; return isServlet;
} }
public static boolean supportsResourceInjection (Class c)
{
if (javax.servlet.Servlet.class.isAssignableFrom(c) ||
javax.servlet.Filter.class.isAssignableFrom(c) ||
javax.servlet.ServletContextListener.class.isAssignableFrom(c) ||
javax.servlet.ServletContextAttributeListener.class.isAssignableFrom(c) ||
javax.servlet.ServletRequestListener.class.isAssignableFrom(c) ||
javax.servlet.ServletRequestAttributeListener.class.isAssignableFrom(c) ||
javax.servlet.http.HttpSessionListener.class.isAssignableFrom(c) ||
javax.servlet.http.HttpSessionAttributeListener.class.isAssignableFrom(c) ||
javax.servlet.AsyncListener.class.isAssignableFrom(c) ||
javax.servlet.http.HttpUpgradeHandler.class.isAssignableFrom(null))
return true;
return false;
}
public static boolean supportsPostConstructPreDestroy (Class c)
{
if (javax.servlet.Servlet.class.isAssignableFrom(c) ||
javax.servlet.Filter.class.isAssignableFrom(c) ||
javax.servlet.ServletContextListener.class.isAssignableFrom(c) ||
javax.servlet.ServletContextAttributeListener.class.isAssignableFrom(c) ||
javax.servlet.ServletRequestListener.class.isAssignableFrom(c) ||
javax.servlet.ServletRequestAttributeListener.class.isAssignableFrom(c) ||
javax.servlet.http.HttpSessionListener.class.isAssignableFrom(c) ||
javax.servlet.http.HttpSessionAttributeListener.class.isAssignableFrom(c) ||
javax.servlet.AsyncListener.class.isAssignableFrom(c) ||
javax.servlet.http.HttpUpgradeHandler.class.isAssignableFrom(null))
return true;
return false;
}
public static boolean isEnvEntryType (Class type) public static boolean isEnvEntryType (Class type)
{ {
boolean result = false; boolean result = false;

View File

@ -18,8 +18,6 @@
package org.eclipse.jetty.plus.annotation; package org.eclipse.jetty.plus.annotation;
import javax.servlet.ServletException;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
/** /**
@ -57,8 +55,10 @@ public class RunAs
} }
/**
* @param holder
*/
public void setRunAs (ServletHolder holder) public void setRunAs (ServletHolder holder)
throws ServletException
{ {
if (holder == null) if (holder == null)
return; return;

View File

@ -52,7 +52,6 @@ public class RunAsCollection
} }
public RunAs getRunAs (Object o) public RunAs getRunAs (Object o)
throws ServletException
{ {
if (o==null) if (o==null)
return null; return null;
@ -61,7 +60,6 @@ public class RunAsCollection
} }
public void setRunAs(Object o) public void setRunAs(Object o)
throws ServletException
{ {
if (o == null) if (o == null)
return; return;

View File

@ -18,24 +18,18 @@
package org.eclipse.jetty.plus.webapp; package org.eclipse.jetty.plus.webapp;
import java.util.EventListener;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import org.eclipse.jetty.plus.annotation.InjectionCollection; import org.eclipse.jetty.plus.annotation.InjectionCollection;
import org.eclipse.jetty.plus.annotation.LifeCycleCallbackCollection; import org.eclipse.jetty.plus.annotation.LifeCycleCallbackCollection;
import org.eclipse.jetty.plus.annotation.RunAsCollection; import org.eclipse.jetty.plus.annotation.RunAsCollection;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler.Decorator; import org.eclipse.jetty.servlet.ServletContextHandler.Decorator;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
/** /**
* WebAppDecorator * PlusDecorator
* *
* *
*/ */
@ -50,83 +44,7 @@ public class PlusDecorator implements Decorator
_context = context; _context = context;
} }
/* ------------------------------------------------------------ */ public Object decorate (Object o)
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateFilterHolder(org.eclipse.jetty.servlet.FilterHolder)
*/
public void decorateFilterHolder(FilterHolder filter) throws ServletException
{
}
/* ------------------------------------------------------------ */
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateFilterInstance(javax.servlet.Filter)
*/
public <T extends Filter> T decorateFilterInstance(T filter) throws ServletException
{
decorate(filter);
return filter;
}
/* ------------------------------------------------------------ */
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateListenerInstance(java.util.EventListener)
*/
public <T extends EventListener> T decorateListenerInstance(T listener) throws ServletException
{
decorate(listener);
return listener;
}
/* ------------------------------------------------------------ */
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateServletHolder(org.eclipse.jetty.servlet.ServletHolder)
*/
public void decorateServletHolder(ServletHolder holder) throws ServletException
{
decorate(holder);
}
/* ------------------------------------------------------------ */
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#decorateServletInstance(javax.servlet.Servlet)
*/
public <T extends Servlet> T decorateServletInstance(T servlet) throws ServletException
{
decorate(servlet);
return servlet;
}
/* ------------------------------------------------------------ */
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#destroyFilterInstance(javax.servlet.Filter)
*/
public void destroyFilterInstance(Filter f)
{
destroy(f);
}
/* ------------------------------------------------------------ */
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#destroyServletInstance(javax.servlet.Servlet)
*/
public void destroyServletInstance(Servlet s)
{
destroy(s);
}
/**
* @see org.eclipse.jetty.servlet.ServletContextHandler.Decorator#destroyListenerInstance(java.util.EventListener)
*/
public void destroyListenerInstance(EventListener l)
{
destroy(l);
}
protected void decorate (Object o)
throws ServletException
{ {
RunAsCollection runAses = (RunAsCollection)_context.getAttribute(RunAsCollection.RUNAS_COLLECTION); RunAsCollection runAses = (RunAsCollection)_context.getAttribute(RunAsCollection.RUNAS_COLLECTION);
@ -146,12 +64,13 @@ public class PlusDecorator implements Decorator
} }
catch (Exception e) catch (Exception e)
{ {
throw new ServletException(e); throw new RuntimeException(e);
} }
} }
return o;
} }
protected void destroy (Object o) public void destroy (Object o)
{ {
LifeCycleCallbackCollection callbacks = (LifeCycleCallbackCollection)_context.getAttribute(LifeCycleCallbackCollection.LIFECYCLE_CALLBACK_COLLECTION); LifeCycleCallbackCollection callbacks = (LifeCycleCallbackCollection)_context.getAttribute(LifeCycleCallbackCollection.LIFECYCLE_CALLBACK_COLLECTION);
if (callbacks != null) if (callbacks != null)

View File

@ -2218,7 +2218,23 @@ public class Request implements HttpServletRequest
@Override @Override
public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException
{ {
// TODO Auto-generated method stub if (getContext() == null)
return null; throw new ServletException ("Unable to instantiate "+handlerClass);
try
{
//Instantiate an instance and inject it
T h = getContext().createInstance(handlerClass);
//TODO handle the rest of the upgrade process
return h;
}
catch (Exception e)
{
if (e instanceof ServletException)
throw (ServletException)e;
throw new ServletException(e);
}
} }
} }

View File

@ -2131,13 +2131,9 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
{ {
try try
{ {
return clazz.newInstance(); return createInstance(clazz);
} }
catch (InstantiationException e) catch (Exception e)
{
throw new ServletException(e);
}
catch (IllegalAccessException e)
{ {
throw new ServletException(e); throw new ServletException(e);
} }
@ -2180,6 +2176,13 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
{ {
return _enabled; return _enabled;
} }
public <T> T createInstance (Class<T> clazz) throws Exception
{
T o = clazz.newInstance();
return o;
}
} }

View File

@ -46,6 +46,7 @@ import javax.servlet.SessionTrackingMode;
import javax.servlet.descriptor.JspConfigDescriptor; import javax.servlet.descriptor.JspConfigDescriptor;
import javax.servlet.descriptor.JspPropertyGroupDescriptor; import javax.servlet.descriptor.JspPropertyGroupDescriptor;
import javax.servlet.descriptor.TaglibDescriptor; import javax.servlet.descriptor.TaglibDescriptor;
import javax.servlet.http.HttpUpgradeHandler;
import org.eclipse.jetty.security.ConstraintAware; import org.eclipse.jetty.security.ConstraintAware;
import org.eclipse.jetty.security.ConstraintMapping; import org.eclipse.jetty.security.ConstraintMapping;
@ -265,10 +266,10 @@ public class ServletContextHandler extends ContextHandler
Decorator decorator = _decorators.get(i); Decorator decorator = _decorators.get(i);
if (_servletHandler.getFilters()!=null) if (_servletHandler.getFilters()!=null)
for (FilterHolder holder:_servletHandler.getFilters()) for (FilterHolder holder:_servletHandler.getFilters())
decorator.decorateFilterHolder(holder); decorator.decorate(holder);
if(_servletHandler.getServlets()!=null) if(_servletHandler.getServlets()!=null)
for (ServletHolder holder:_servletHandler.getServlets()) for (ServletHolder holder:_servletHandler.getServlets())
decorator.decorateServletHolder(holder); decorator.decorate(holder);
} }
} }
@ -521,14 +522,14 @@ public class ServletContextHandler extends ContextHandler
void destroyServlet(Servlet servlet) void destroyServlet(Servlet servlet)
{ {
for (Decorator decorator : _decorators) for (Decorator decorator : _decorators)
decorator.destroyServletInstance(servlet); decorator.destroy(servlet);
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
void destroyFilter(Filter filter) void destroyFilter(Filter filter)
{ {
for (Decorator decorator : _decorators) for (Decorator decorator : _decorators)
decorator.destroyFilterInstance(filter); decorator.destroy(filter);
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@ -1082,19 +1083,10 @@ public class ServletContextHandler extends ContextHandler
{ {
try try
{ {
T f = c.newInstance(); T f = createInstance(c);
for (int i=_decorators.size()-1; i>=0; i--)
{
Decorator decorator = _decorators.get(i);
f=decorator.decorateFilterInstance(f);
}
return f; return f;
} }
catch (InstantiationException e) catch (Exception e)
{
throw new ServletException(e);
}
catch (IllegalAccessException e)
{ {
throw new ServletException(e); throw new ServletException(e);
} }
@ -1106,24 +1098,30 @@ public class ServletContextHandler extends ContextHandler
{ {
try try
{ {
T s = c.newInstance(); T s = createInstance(c);
return s;
}
catch (Exception e)
{
throw new ServletException(e);
}
}
public <T> T createInstance (Class<T> c) throws Exception
{
T o = super.createInstance(c);
for (int i=_decorators.size()-1; i>=0; i--) for (int i=_decorators.size()-1; i>=0; i--)
{ {
Decorator decorator = _decorators.get(i); Decorator decorator = _decorators.get(i);
s=decorator.decorateServletInstance(s); o=decorator.decorate(o);
}
return s;
}
catch (InstantiationException e)
{
throw new ServletException(e);
}
catch (IllegalAccessException e)
{
throw new ServletException(e);
} }
return o;
} }
@Override @Override
public Set<SessionTrackingMode> getDefaultSessionTrackingModes() public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
{ {
@ -1253,19 +1251,9 @@ public class ServletContextHandler extends ContextHandler
{ {
try try
{ {
T l = super.createListener(clazz); T l = createInstance(clazz);
for (int i=_decorators.size()-1; i>=0; i--)
{
Decorator decorator = _decorators.get(i);
l=decorator.decorateListenerInstance(l);
}
return l; return l;
} }
catch(ServletException e)
{
throw e;
}
catch (Exception e) catch (Exception e)
{ {
throw new ServletException(e); throw new ServletException(e);
@ -1307,15 +1295,7 @@ public class ServletContextHandler extends ContextHandler
*/ */
public interface Decorator public interface Decorator
{ {
<T extends Filter> T decorateFilterInstance(T filter) throws ServletException; <T> T decorate (T o);
<T extends Servlet> T decorateServletInstance(T servlet) throws ServletException; void destroy (Object o);
<T extends EventListener> T decorateListenerInstance(T listener) throws ServletException;
void decorateFilterHolder(FilterHolder filter) throws ServletException;
void decorateServletHolder(ServletHolder servlet) throws ServletException;
void destroyServletInstance(Servlet s);
void destroyFilterInstance(Filter f);
void destroyListenerInstance(EventListener f);
} }
} }