Author: remm Date: Fri Nov 6 12:14:21 2015 New Revision: 1712952 URL: http://svn.apache.org/viewvc?rev=1712952&view=rev Log: Add an instance manager field to the token, it's safer than going through the bindings, and it can be used to determine if it needs the CL environment.
Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/UpgradeToken.java tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1712952&r1=1712951&r2=1712952&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Fri Nov 6 12:14:21 2015 @@ -84,6 +84,7 @@ import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.InstanceManager; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.ByteChunk; @@ -1844,17 +1845,20 @@ public class Request implements HttpServ public <T extends HttpUpgradeHandler> T upgrade( Class<T> httpUpgradeHandlerClass) throws java.io.IOException, ServletException { T handler; + InstanceManager instanceManager = null; try { // Do not go through the instance manager for internal Tomcat classes since they don't need injection if (InternalHttpUpgradeHandler.class.isAssignableFrom(httpUpgradeHandlerClass)) { handler = (T) httpUpgradeHandlerClass.newInstance(); } else { - handler = (T) getContext().getInstanceManager().newInstance(httpUpgradeHandlerClass); + instanceManager = getContext().getInstanceManager(); + handler = (T) instanceManager.newInstance(httpUpgradeHandlerClass); } } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NamingException e) { throw new ServletException(e); } - UpgradeToken upgradeToken = new UpgradeToken(handler, getContext().getLoader().getClassLoader()); + UpgradeToken upgradeToken = new UpgradeToken(handler, + getContext().getLoader().getClassLoader(), instanceManager); coyoteRequest.action(ActionCode.UPGRADE, upgradeToken); Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1712952&r1=1712951&r2=1712952&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Fri Nov 6 12:14:21 2015 @@ -35,9 +35,8 @@ import javax.management.ObjectName; import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.WebConnection; -import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; import org.apache.juli.logging.Log; -import org.apache.tomcat.InstanceManagerBindings; +import org.apache.tomcat.InstanceManager; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.collections.SynchronizedStack; import org.apache.tomcat.util.modeler.Registry; @@ -759,7 +758,7 @@ public abstract class AbstractProtocol<S // This cast should be safe. If it fails the error // handling for the surrounding try/catch will deal with // it. - if (httpUpgradeHandler instanceof InternalHttpUpgradeHandler) { + if (upgradeToken.getInstanceManager() == null) { httpUpgradeHandler.init((WebConnection) processor); } else { Thread thread = Thread.currentThread(); @@ -811,7 +810,8 @@ public abstract class AbstractProtocol<S if (processor.isUpgrade()) { UpgradeToken upgradeToken = processor.getUpgradeToken(); HttpUpgradeHandler httpUpgradeHandler = upgradeToken.getHttpUpgradeHandler(); - if (httpUpgradeHandler instanceof InternalHttpUpgradeHandler) { + InstanceManager instanceManager = upgradeToken.getInstanceManager(); + if (instanceManager == null) { httpUpgradeHandler.destroy(); } else { Thread thread = Thread.currentThread(); @@ -820,8 +820,7 @@ public abstract class AbstractProtocol<S try { thread.setContextClassLoader(upgradeToken.getApplicationClassLoader()); httpUpgradeHandler.destroy(); - InstanceManagerBindings.get(upgradeToken.getApplicationClassLoader()) - .destroyInstance(httpUpgradeHandler); + instanceManager.destroyInstance(httpUpgradeHandler); } finally { thread.setContextClassLoader(originalClassLoader); } Modified: tomcat/trunk/java/org/apache/coyote/UpgradeToken.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/UpgradeToken.java?rev=1712952&r1=1712951&r2=1712952&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/UpgradeToken.java (original) +++ tomcat/trunk/java/org/apache/coyote/UpgradeToken.java Fri Nov 6 12:14:21 2015 @@ -19,6 +19,8 @@ package org.apache.coyote; import javax.servlet.http.HttpUpgradeHandler; +import org.apache.tomcat.InstanceManager; + /** * Token used during the upgrade process. */ @@ -26,11 +28,13 @@ public final class UpgradeToken { private final ClassLoader applicationClassLoader; private final HttpUpgradeHandler httpUpgradeHandler; + private final InstanceManager instanceManager; public UpgradeToken(HttpUpgradeHandler httpUpgradeHandler, - ClassLoader applicationClassLoader) { + ClassLoader applicationClassLoader, InstanceManager instanceManager) { this.applicationClassLoader = applicationClassLoader; this.httpUpgradeHandler = httpUpgradeHandler; + this.instanceManager = instanceManager; } public final ClassLoader getApplicationClassLoader() { @@ -41,4 +45,8 @@ public final class UpgradeToken { return httpUpgradeHandler; } + public final InstanceManager getInstanceManager() { + return instanceManager; + } + } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1712952&r1=1712951&r2=1712952&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Fri Nov 6 12:14:21 2015 @@ -1021,7 +1021,7 @@ public class Http11Processor extends Abs upgradeProtocol.getInternalUpgradeHandler( getAdapter(), cloneRequest(request)); UpgradeToken upgradeToken = new UpgradeToken( - upgradeHandler, Http11Processor.class.getClassLoader()); + upgradeHandler, Http11Processor.class.getClassLoader(), null); action(ActionCode.UPGRADE, upgradeToken); return SocketState.UPGRADING; } Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java?rev=1712952&r1=1712951&r2=1712952&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java Fri Nov 6 12:14:21 2015 @@ -25,7 +25,6 @@ import javax.servlet.ServletOutputStream import org.apache.coyote.UpgradeToken; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; -import org.apache.tomcat.InstanceManagerBindings; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.SocketStatus; @@ -79,12 +78,7 @@ public class UpgradeProcessorInternal ex @Override public void close() throws Exception { - try { - internalHttpUpgradeHandler.destroy(); - } finally { - InstanceManagerBindings.get(getUpgradeToken().getApplicationClassLoader()) - .destroyInstance(internalHttpUpgradeHandler); - } + internalHttpUpgradeHandler.destroy(); } Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java?rev=1712952&r1=1712951&r2=1712952&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2Protocol.java Fri Nov 6 12:14:21 2015 @@ -73,7 +73,7 @@ public class Http2Protocol implements Up @Override public Processor getProcessor(SocketWrapperBase<?> socketWrapper, Adapter adapter) { UpgradeProcessorInternal processor = new UpgradeProcessorInternal(socketWrapper, null, - new UpgradeToken(getInternalUpgradeHandler(adapter, null), Http2Protocol.class.getClassLoader())); + new UpgradeToken(getInternalUpgradeHandler(adapter, null), Http2Protocol.class.getClassLoader(), null)); return processor; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org