407708 - HttpUpgradeHandler must support injection
This commit is contained in:
parent
215d2e2095
commit
73bee3af4b
|
@ -18,19 +18,11 @@
|
|||
|
||||
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.ServletHolder;
|
||||
import org.eclipse.jetty.webapp.WebAppContext;
|
||||
|
||||
/**
|
||||
* WebAppDecoratorWrapper
|
||||
* AnnotationDecorator
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
@ -53,99 +45,6 @@ public class AnnotationDecorator implements Decorator
|
|||
_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:
|
||||
* <ul>
|
||||
|
@ -161,4 +60,17 @@ public class AnnotationDecorator implements Decorator
|
|||
{
|
||||
_introspector.introspect(o.getClass());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object decorate(Object o)
|
||||
{
|
||||
introspect(o);
|
||||
return o;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy(Object o)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ public class PostConstructAnnotationHandler extends AbstractIntrospectableAnnota
|
|||
public void doHandle(Class clazz)
|
||||
{
|
||||
//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();
|
||||
for (int i=0; i<methods.length; i++)
|
||||
|
|
|
@ -43,7 +43,7 @@ public class PreDestroyAnnotationHandler extends AbstractIntrospectableAnnotatio
|
|||
public void doHandle(Class clazz)
|
||||
{
|
||||
//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();
|
||||
for (int i=0; i<methods.length; i++)
|
||||
|
|
|
@ -57,7 +57,7 @@ public class ResourceAnnotationHandler extends AbstractIntrospectableAnnotationH
|
|||
*/
|
||||
public void doHandle(Class<?> clazz)
|
||||
{
|
||||
if (Util.isServletType(clazz))
|
||||
if (Util.supportsResourceInjection(clazz))
|
||||
{
|
||||
handleClass(clazz);
|
||||
|
||||
|
|
|
@ -69,6 +69,42 @@ public class Util
|
|||
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)
|
||||
{
|
||||
boolean result = false;
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
|
||||
package org.eclipse.jetty.plus.annotation;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import org.eclipse.jetty.servlet.ServletHolder;
|
||||
|
||||
/**
|
||||
|
@ -57,8 +55,10 @@ public class RunAs
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param holder
|
||||
*/
|
||||
public void setRunAs (ServletHolder holder)
|
||||
throws ServletException
|
||||
{
|
||||
if (holder == null)
|
||||
return;
|
||||
|
|
|
@ -52,7 +52,6 @@ public class RunAsCollection
|
|||
}
|
||||
|
||||
public RunAs getRunAs (Object o)
|
||||
throws ServletException
|
||||
{
|
||||
if (o==null)
|
||||
return null;
|
||||
|
@ -61,7 +60,6 @@ public class RunAsCollection
|
|||
}
|
||||
|
||||
public void setRunAs(Object o)
|
||||
throws ServletException
|
||||
{
|
||||
if (o == null)
|
||||
return;
|
||||
|
|
|
@ -18,24 +18,18 @@
|
|||
|
||||
package org.eclipse.jetty.plus.webapp;
|
||||
|
||||
import java.util.EventListener;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.Servlet;
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import org.eclipse.jetty.plus.annotation.InjectionCollection;
|
||||
import org.eclipse.jetty.plus.annotation.LifeCycleCallbackCollection;
|
||||
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.ServletHolder;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.eclipse.jetty.webapp.WebAppContext;
|
||||
|
||||
/**
|
||||
* WebAppDecorator
|
||||
* PlusDecorator
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
@ -50,83 +44,7 @@ public class PlusDecorator implements Decorator
|
|||
_context = context;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* @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
|
||||
public Object decorate (Object o)
|
||||
{
|
||||
|
||||
RunAsCollection runAses = (RunAsCollection)_context.getAttribute(RunAsCollection.RUNAS_COLLECTION);
|
||||
|
@ -146,12 +64,13 @@ public class PlusDecorator implements Decorator
|
|||
}
|
||||
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);
|
||||
if (callbacks != null)
|
||||
|
|
|
@ -2218,7 +2218,23 @@ public class Request implements HttpServletRequest
|
|||
@Override
|
||||
public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
if (getContext() == 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2131,13 +2131,9 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
|
|||
{
|
||||
try
|
||||
{
|
||||
return clazz.newInstance();
|
||||
return createInstance(clazz);
|
||||
}
|
||||
catch (InstantiationException e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
}
|
||||
|
@ -2180,6 +2176,13 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
|
|||
{
|
||||
return _enabled;
|
||||
}
|
||||
|
||||
|
||||
public <T> T createInstance (Class<T> clazz) throws Exception
|
||||
{
|
||||
T o = clazz.newInstance();
|
||||
return o;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@ import javax.servlet.SessionTrackingMode;
|
|||
import javax.servlet.descriptor.JspConfigDescriptor;
|
||||
import javax.servlet.descriptor.JspPropertyGroupDescriptor;
|
||||
import javax.servlet.descriptor.TaglibDescriptor;
|
||||
import javax.servlet.http.HttpUpgradeHandler;
|
||||
|
||||
import org.eclipse.jetty.security.ConstraintAware;
|
||||
import org.eclipse.jetty.security.ConstraintMapping;
|
||||
|
@ -265,10 +266,10 @@ public class ServletContextHandler extends ContextHandler
|
|||
Decorator decorator = _decorators.get(i);
|
||||
if (_servletHandler.getFilters()!=null)
|
||||
for (FilterHolder holder:_servletHandler.getFilters())
|
||||
decorator.decorateFilterHolder(holder);
|
||||
decorator.decorate(holder);
|
||||
if(_servletHandler.getServlets()!=null)
|
||||
for (ServletHolder holder:_servletHandler.getServlets())
|
||||
decorator.decorateServletHolder(holder);
|
||||
decorator.decorate(holder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -521,14 +522,14 @@ public class ServletContextHandler extends ContextHandler
|
|||
void destroyServlet(Servlet servlet)
|
||||
{
|
||||
for (Decorator decorator : _decorators)
|
||||
decorator.destroyServletInstance(servlet);
|
||||
decorator.destroy(servlet);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
void destroyFilter(Filter filter)
|
||||
{
|
||||
for (Decorator decorator : _decorators)
|
||||
decorator.destroyFilterInstance(filter);
|
||||
decorator.destroy(filter);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -1082,19 +1083,10 @@ public class ServletContextHandler extends ContextHandler
|
|||
{
|
||||
try
|
||||
{
|
||||
T f = c.newInstance();
|
||||
for (int i=_decorators.size()-1; i>=0; i--)
|
||||
{
|
||||
Decorator decorator = _decorators.get(i);
|
||||
f=decorator.decorateFilterInstance(f);
|
||||
}
|
||||
T f = createInstance(c);
|
||||
return f;
|
||||
}
|
||||
catch (InstantiationException e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
}
|
||||
|
@ -1106,24 +1098,30 @@ public class ServletContextHandler extends ContextHandler
|
|||
{
|
||||
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--)
|
||||
{
|
||||
Decorator decorator = _decorators.get(i);
|
||||
s=decorator.decorateServletInstance(s);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
catch (InstantiationException e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
o=decorator.decorate(o);
|
||||
}
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
|
||||
{
|
||||
|
@ -1253,19 +1251,9 @@ public class ServletContextHandler extends ContextHandler
|
|||
{
|
||||
try
|
||||
{
|
||||
T l = super.createListener(clazz);
|
||||
|
||||
for (int i=_decorators.size()-1; i>=0; i--)
|
||||
{
|
||||
Decorator decorator = _decorators.get(i);
|
||||
l=decorator.decorateListenerInstance(l);
|
||||
}
|
||||
T l = createInstance(clazz);
|
||||
return l;
|
||||
}
|
||||
catch(ServletException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new ServletException(e);
|
||||
|
@ -1307,15 +1295,7 @@ public class ServletContextHandler extends ContextHandler
|
|||
*/
|
||||
public interface Decorator
|
||||
{
|
||||
<T extends Filter> T decorateFilterInstance(T filter) throws ServletException;
|
||||
<T extends Servlet> T decorateServletInstance(T servlet) throws ServletException;
|
||||
<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);
|
||||
<T> T decorate (T o);
|
||||
void destroy (Object o);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue