Author: remm Date: Mon Nov 23 17:23:59 2015 New Revision: 1715897 URL: http://svn.apache.org/viewvc?rev=1715897&view=rev Log: Extract Context.bind and unbind to an interface to make the CL bind cleaner for the upgrade code (including using a PA if needed).
Added: tomcat/tc8.0.x/trunk/java/org/apache/tomcat/ContextBind.java - copied unchanged from r1715866, tomcat/trunk/java/org/apache/tomcat/ContextBind.java Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/Context.java tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/Context.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/Context.java?rev=1715897&r1=1715896&r2=1715897&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/Context.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/Context.java Mon Nov 23 17:23:59 2015 @@ -29,6 +29,7 @@ import javax.servlet.ServletSecurityElem import javax.servlet.descriptor.JspConfigDescriptor; import org.apache.catalina.deploy.NamingResourcesImpl; +import org.apache.tomcat.ContextBind; import org.apache.tomcat.InstanceManager; import org.apache.tomcat.JarScanner; import org.apache.tomcat.util.descriptor.web.ApplicationParameter; @@ -57,7 +58,7 @@ import org.apache.tomcat.util.http.Cooki * * @author Craig R. McClanahan */ -public interface Context extends Container { +public interface Context extends Container, ContextBind { // ----------------------------------------------------- Manifest Constants @@ -1610,45 +1611,6 @@ public interface Context extends Contain public Map<String, String> findPreDestroyMethods(); /** - * Change the current thread context class loader to the web application - * class loader. If no web application class loader is defined, or if the - * current thread is already using the web application class loader then no - * change will be made. If the class loader is changed and a - * {@link ThreadBindingListener} is configured then - * {@link ThreadBindingListener#bind()} will be called after the change has - * been made. - * - * @param usePrivilegedAction - * Should a {@link java.security.PrivilegedAction} be used when - * obtaining the current thread context class loader and setting - * the new one? - * @param originalClassLoader - * The current class loader if known to save this method having to - * look it up - * - * @return If the class loader has been changed by the method it will return - * the thread context class loader in use when the method was - * called. If no change was made then this method returns null. - */ - public ClassLoader bind(boolean usePrivilegedAction, ClassLoader originalClassLoader); - - /** - * Restore the current thread context class loader to the original class - * loader in used before {@link #bind(boolean, ClassLoader)} was called. If - * no original class loader is passed to this method then no change will be - * made. If the class loader is changed and a {@link ThreadBindingListener} - * is configured then {@link ThreadBindingListener#unbind()} will be called - * before the change is made. - * - * @param usePrivilegedAction - * Should a {@link java.security.PrivilegedAction} be used when - * setting the current thread context class loader? - * @param originalClassLoader - * The class loader to restore as the thread context class loader - */ - public void unbind(boolean usePrivilegedAction, ClassLoader originalClassLoader); - - /** * Obtain the token necessary for operations on the associated JNDI naming * context. */ Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java?rev=1715897&r1=1715896&r2=1715897&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/Request.java Mon Nov 23 17:23:59 2015 @@ -1892,7 +1892,7 @@ public class Request throw new ServletException(e); } UpgradeToken upgradeToken = new UpgradeToken(handler, - getContext().getLoader().getClassLoader(), instanceManager); + getContext(), instanceManager); coyoteRequest.action(ActionCode.UPGRADE, upgradeToken); Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1715897&r1=1715896&r2=1715897&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/AbstractProtocol.java Mon Nov 23 17:23:59 2015 @@ -702,14 +702,11 @@ public abstract class AbstractProtocol<S if (upgradeToken.getInstanceManager() == null) { httpUpgradeHandler.init((WebConnection) processor); } else { - Thread thread = Thread.currentThread(); - // Set context class loader environment for user class call - ClassLoader originalClassLoader = thread.getContextClassLoader(); + ClassLoader oldCL = upgradeToken.getContextBind().bind(false, null); try { - thread.setContextClassLoader(upgradeToken.getApplicationClassLoader()); httpUpgradeHandler.init((WebConnection) processor); } finally { - thread.setContextClassLoader(originalClassLoader); + upgradeToken.getContextBind().unbind(false, oldCL); } } } @@ -764,15 +761,12 @@ public abstract class AbstractProtocol<S if (instanceManager == null) { httpUpgradeHandler.destroy(); } else { - Thread thread = Thread.currentThread(); - // Set context class loader environment for user class call - ClassLoader originalClassLoader = thread.getContextClassLoader(); + ClassLoader oldCL = upgradeToken.getContextBind().bind(false, null); try { - thread.setContextClassLoader(upgradeToken.getApplicationClassLoader()); httpUpgradeHandler.destroy(); instanceManager.destroyInstance(httpUpgradeHandler); } finally { - thread.setContextClassLoader(originalClassLoader); + upgradeToken.getContextBind().unbind(false, oldCL); } } } else { Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java?rev=1715897&r1=1715896&r2=1715897&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/UpgradeToken.java Mon Nov 23 17:23:59 2015 @@ -19,6 +19,7 @@ package org.apache.coyote; import javax.servlet.http.HttpUpgradeHandler; +import org.apache.tomcat.ContextBind; import org.apache.tomcat.InstanceManager; /** @@ -26,19 +27,19 @@ import org.apache.tomcat.InstanceManager */ public final class UpgradeToken { - private final ClassLoader applicationClassLoader; + private final ContextBind contextBind; private final HttpUpgradeHandler httpUpgradeHandler; private final InstanceManager instanceManager; public UpgradeToken(HttpUpgradeHandler httpUpgradeHandler, - ClassLoader applicationClassLoader, InstanceManager instanceManager) { - this.applicationClassLoader = applicationClassLoader; + ContextBind contextBind, InstanceManager instanceManager) { + this.contextBind = contextBind; this.httpUpgradeHandler = httpUpgradeHandler; this.instanceManager = instanceManager; } - public final ClassLoader getApplicationClassLoader() { - return applicationClassLoader; + public final ContextBind getContextBind() { + return contextBind; } public final HttpUpgradeHandler getHttpUpgradeHandler() { Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1715897&r1=1715896&r2=1715897&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Mon Nov 23 17:23:59 2015 @@ -58,6 +58,14 @@ </fix> </changelog> </subection> + <subsection name="Coyote"> + <changelog> + <fix> + Improve upgrade context classloader handling by using Context.bind and + unbind. (remm) + </fix> + </changelog> + </subsection> <subsection name="Cluster"> <changelog> <fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org