From 8d8507a0820e4ee82ae28685ad83e0b77c722912 Mon Sep 17 00:00:00 2001 From: markt Date: Sun, 3 Oct 2010 20:53:49 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49937 Use InstanceManager to create AsyncListeners so annotations are processed. Based on a patch by David Jencks. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1004047 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/catalina/core/AsyncContextImpl.java | 34 ++++++++++++++++++++-- webapps/docs/changelog.xml | 7 ++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/java/org/apache/catalina/core/AsyncContextImpl.java b/java/org/apache/catalina/core/AsyncContextImpl.java index a5fad2f01..065139c38 100644 --- a/java/org/apache/catalina/core/AsyncContextImpl.java +++ b/java/org/apache/catalina/core/AsyncContextImpl.java @@ -17,12 +17,16 @@ package org.apache.catalina.core; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import javax.naming.NamingException; import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; @@ -42,6 +46,7 @@ import org.apache.coyote.ActionCode; import org.apache.coyote.RequestInfo; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.InstanceManager; /** * * @author fhanik @@ -59,8 +64,8 @@ public class AsyncContextImpl implements AsyncContext { private Context context = null; private long timeout = -1; private AsyncEvent event = null; - private Request request; + private volatile InstanceManager instanceManager; public AsyncContextImpl(Request request) { if (log.isDebugEnabled()) { @@ -203,18 +208,29 @@ public class AsyncContextImpl implements AsyncContext { listeners.add(wrapper); } + @SuppressWarnings("unchecked") @Override public T createListener(Class clazz) throws ServletException { T listener = null; try { - listener = clazz.newInstance(); + listener = (T) getInstanceManager().newInstance(clazz.getName(), + clazz.getClassLoader()); } catch (InstantiationException e) { ServletException se = new ServletException(e); throw se; } catch (IllegalAccessException e) { ServletException se = new ServletException(e); throw se; + } catch (InvocationTargetException e) { + ServletException se = new ServletException(e); + throw se; + } catch (NamingException e) { + ServletException se = new ServletException(e); + throw se; + } catch (ClassNotFoundException e) { + ServletException se = new ServletException(e); + throw se; } return listener; } @@ -374,6 +390,20 @@ public class AsyncContextImpl implements AsyncContext { } } + private InstanceManager getInstanceManager() { + if (instanceManager == null) { + if (context instanceof StandardContext) { + instanceManager = ((StandardContext)context).getInstanceManager(); + } else { + instanceManager = new DefaultInstanceManager(null, + new HashMap>(), + context, + getClass().getClassLoader()); + } + } + return instanceManager; + } + private static class DebugException extends Exception { private static final long serialVersionUID = 1L; } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index e52e06eef..f3ca3fd9c 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -41,7 +41,12 @@ 49922: Don't add filter twice to filter chain if the - filter matches more than one URL pattern and/or Servlet name. + filter matches more than one URL pattern and/or Servlet name. (markt) + + + 49937: Use an InstanceManager when creating an AsyncListener + through the AsyncContext to ensure annotations are processed. Based on a + patch by David Jencks. (markt) -- 2.11.0