Copied: tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java (from r1701767, tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java&p1=tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java&r1=1701767&r2=1701793&rev=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Tue Sep 8 12:49:24 2015 @@ -131,11 +131,11 @@ import org.apache.tomcat.util.res.String * @author Remy Maucherat * @author Craig R. McClanahan */ -public class WebappClassLoader extends URLClassLoader +public abstract class WebappClassLoaderBase extends URLClassLoader implements Lifecycle, InstrumentableClassLoader { - private static final org.apache.juli.logging.Log log= - org.apache.juli.logging.LogFactory.getLog( WebappClassLoader.class ); + private static final org.apache.juli.logging.Log log = + org.apache.juli.logging.LogFactory.getLog(WebappClassLoaderBase.class); private static final Charset CHARSET_UTF8 = Charset.forName("UTF-8"); /** @@ -239,7 +239,7 @@ public class WebappClassLoader extends U * Construct a new ClassLoader with no defined repositories and no * parent ClassLoader. */ - public WebappClassLoader() { + public WebappClassLoaderBase() { super(new URL[0]); @@ -274,7 +274,7 @@ public class WebappClassLoader extends U * * @param parent Our parent class loader */ - public WebappClassLoader(ClassLoader parent) { + public WebappClassLoaderBase(ClassLoader parent) { super(new URL[0], parent); @@ -527,9 +527,9 @@ public class WebappClassLoader extends U /** * If an HttpClient keep-alive timer thread has been started by this web * application and is still running, should Tomcat change the context class - * loader from the current {@link WebappClassLoader} to - * {@link WebappClassLoader#parent} to prevent a memory leak? Note that the - * keep-alive timer thread will stop on its own once the keep-alives all + * loader from the current {@link WebappClassLoaderBase} to + * {@link WebappClassLoaderBase#parent} to prevent a memory leak? Note that + * the keep-alive timer thread will stop on its own once the keep-alives all * expire however, on a busy system that might not happen for some time. */ private boolean clearReferencesHttpClientKeepAliveThread = true; @@ -912,62 +912,37 @@ public class WebappClassLoader extends U } - /** - * Returns a copy of this class loader without any class file - * transformers. This is a tool often used by Java Persistence API - * providers to inspect entity classes in the absence of any - * instrumentation, something that can't be guaranteed within the - * context of a {@link ClassFileTransformer}'s - * {@link ClassFileTransformer#transform(ClassLoader, String, Class, - * ProtectionDomain, byte[]) transform} method. - * <p> - * The returned class loader's resource cache will have been cleared - * so that classes already instrumented will not be retained or - * returned. - * - * @return the transformer-free copy of this class loader. - */ - @Override - public WebappClassLoader copyWithoutTransformers() { - - WebappClassLoader result = new WebappClassLoader(this.parent); - - result.antiJARLocking = this.antiJARLocking; - result.resources = this.resources; - result.files = this.files; - result.delegate = this.delegate; - result.lastJarAccessed = this.lastJarAccessed; - result.repositories = this.repositories; - result.jarPath = this.jarPath; - result.loaderDir = this.loaderDir; - result.canonicalLoaderDir = this.canonicalLoaderDir; - result.clearReferencesStatic = this.clearReferencesStatic; - result.clearReferencesStopThreads = this.clearReferencesStopThreads; - result.clearReferencesStopTimerThreads = this.clearReferencesStopTimerThreads; - result.clearReferencesLogFactoryRelease = this.clearReferencesLogFactoryRelease; - result.clearReferencesHttpClientKeepAliveThread = this.clearReferencesHttpClientKeepAliveThread; - result.repositoryURLs = this.repositoryURLs.clone(); - result.jarFiles = this.jarFiles.clone(); - result.jarRealFiles = this.jarRealFiles.clone(); - result.jarNames = this.jarNames.clone(); - result.lastModifiedDates = this.lastModifiedDates.clone(); - result.paths = this.paths.clone(); - result.notFoundResources.putAll(this.notFoundResources); - result.permissionList.addAll(this.permissionList); - result.loaderPC.putAll(this.loaderPC); - result.contextName = this.contextName; - result.hasExternalRepositories = this.hasExternalRepositories; - result.searchExternalFirst = this.searchExternalFirst; - - try { - result.start(); - } catch (LifecycleException e) { - throw new IllegalStateException(e); - } - - return result; + + protected void copyStateWithoutTransformers(WebappClassLoaderBase base) { + base.antiJARLocking = this.antiJARLocking; + base.resources = this.resources; + base.files = this.files; + base.delegate = this.delegate; + base.lastJarAccessed = this.lastJarAccessed; + base.repositories = this.repositories; + base.jarPath = this.jarPath; + base.loaderDir = this.loaderDir; + base.canonicalLoaderDir = this.canonicalLoaderDir; + base.clearReferencesStatic = this.clearReferencesStatic; + base.clearReferencesStopThreads = this.clearReferencesStopThreads; + base.clearReferencesStopTimerThreads = this.clearReferencesStopTimerThreads; + base.clearReferencesLogFactoryRelease = this.clearReferencesLogFactoryRelease; + base.clearReferencesHttpClientKeepAliveThread = this.clearReferencesHttpClientKeepAliveThread; + base.repositoryURLs = this.repositoryURLs.clone(); + base.jarFiles = this.jarFiles.clone(); + base.jarRealFiles = this.jarRealFiles.clone(); + base.jarNames = this.jarNames.clone(); + base.lastModifiedDates = this.lastModifiedDates.clone(); + base.paths = this.paths.clone(); + base.notFoundResources.putAll(this.notFoundResources); + base.permissionList.addAll(this.permissionList); + base.loaderPC.putAll(this.loaderPC); + base.contextName = this.contextName; + base.hasExternalRepositories = this.hasExternalRepositories; + base.searchExternalFirst = this.searchExternalFirst; } + /** * Add a new repository to the set of places this ClassLoader can look for * classes to be loaded. @@ -1235,14 +1210,12 @@ public class WebappClassLoader extends U @Override public String toString() { - StringBuilder sb = new StringBuilder("WebappClassLoader\r\n"); - sb.append(" context: "); + StringBuilder sb = new StringBuilder(this.getClass().getSimpleName()); + sb.append("\r\n context: "); sb.append(contextName); - sb.append("\r\n"); - sb.append(" delegate: "); + sb.append("\r\n delegate: "); sb.append(delegate); - sb.append("\r\n"); - sb.append(" repositories:\r\n"); + sb.append("\r\n repositories:\r\n"); if (repositories != null) { for (int i = 0; i < repositories.length; i++) { sb.append(" "); @@ -1335,7 +1308,7 @@ public class WebappClassLoader extends U } catch(ClassNotFoundException cnfe) { // Ignore - will search internal repositories next } catch(AccessControlException ace) { - log.warn("WebappClassLoader.findClassInternal(" + name + log.warn("WebappClassLoaderBase.findClassInternal(" + name + ") security exception: " + ace.getMessage(), ace); throw new ClassNotFoundException(name, ace); } catch (RuntimeException e) { @@ -1352,7 +1325,7 @@ public class WebappClassLoader extends U throw cnfe; } } catch(AccessControlException ace) { - log.warn("WebappClassLoader.findClassInternal(" + name + log.warn("WebappClassLoaderBase.findClassInternal(" + name + ") security exception: " + ace.getMessage(), ace); throw new ClassNotFoundException(name, ace); } catch (RuntimeException e) { @@ -1365,7 +1338,7 @@ public class WebappClassLoader extends U try { clazz = super.findClass(name); } catch(AccessControlException ace) { - log.warn("WebappClassLoader.findClassInternal(" + name + log.warn("WebappClassLoaderBase.findClassInternal(" + name + ") security exception: " + ace.getMessage(), ace); throw new ClassNotFoundException(name, ace); } catch (RuntimeException e) { @@ -1863,7 +1836,7 @@ public class WebappClassLoader extends U /** * Get the Permissions for a CodeSource. If this instance - * of WebappClassLoader is for a web application context, + * of WebappClassLoaderBase is for a web application context, * add read FilePermission or JndiPermissions for the base * directory (if unpacked), * the context URL, and jar file resources. @@ -2366,7 +2339,7 @@ public class WebappClassLoader extends U instance.getClass().getName() + " because the referenced object was of type " + valueClass.getName() + - " which was not loaded by this WebappClassLoader."); + " which was not loaded by this web application class loader."); } } else { field.set(instance, null);
Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappLoader.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappLoader.java?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappLoader.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappLoader.java Tue Sep 8 12:49:24 2015 @@ -122,7 +122,7 @@ public class WebappLoader extends Lifecy /** * The class loader being managed by this Loader component. */ - private WebappClassLoader classLoader = null; + private WebappClassLoaderBase classLoader = null; /** @@ -147,7 +147,7 @@ public class WebappLoader extends Lifecy /** * The Java class name of the ClassLoader implementation to be used. - * This class should extend WebappClassLoader, otherwise, a different + * This class should extend WebappClassLoaderBase, otherwise, a different * loader implementation must be used. */ private String loaderClass = @@ -715,11 +715,11 @@ public class WebappLoader extends Lifecy /** * Create associated classLoader. */ - private WebappClassLoader createClassLoader() + private WebappClassLoaderBase createClassLoader() throws Exception { Class<?> clazz = Class.forName(loaderClass); - WebappClassLoader classLoader = null; + WebappClassLoaderBase classLoader = null; if (parentClassLoader == null) { parentClassLoader = container.getParentClassLoader(); @@ -727,7 +727,7 @@ public class WebappLoader extends Lifecy Class<?>[] argTypes = { ClassLoader.class }; Object[] args = { parentClassLoader }; Constructor<?> constr = clazz.getConstructor(argTypes); - classLoader = (WebappClassLoader) constr.newInstance(args); + classLoader = (WebappClassLoaderBase) constr.newInstance(args); return classLoader; Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java Tue Sep 8 12:49:24 2015 @@ -105,7 +105,7 @@ public final class SecurityClassLoad { final String basePackage = "org.apache.catalina.loader."; loader.loadClass (basePackage + - "WebappClassLoader$PrivilegedFindResourceByName"); + "WebappClassLoaderBase$PrivilegedFindResourceByName"); } Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/InstrumentableClassLoader.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/InstrumentableClassLoader.java?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/InstrumentableClassLoader.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/InstrumentableClassLoader.java Tue Sep 8 12:49:24 2015 @@ -23,14 +23,14 @@ import java.lang.instrument.ClassFileTra * {@link ClassFileTransformer}s. These transformers can instrument * (or weave) the byte code of classes loaded through this class loader * to alter their behavior. Currently only - * {@link org.apache.catalina.loader.WebappClassLoader} implements this + * {@link org.apache.catalina.loader.WebappClassLoaderBase} implements this * interface. This allows web application frameworks or JPA providers * bundled with a web application to instrument web application classes * as necessary. * <p> * You should always program against the methods of this interface * (whether using reflection or otherwise). The methods in - * {@code WebappClassLoader} are protected by the default security + * {@code WebappClassLoaderBase} are protected by the default security * manager if one is in use. * * @since 8.0, 7.0.64 Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderMemoryLeak.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderMemoryLeak.java?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderMemoryLeak.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderMemoryLeak.java Tue Sep 8 12:49:24 2015 @@ -72,7 +72,7 @@ public class TestWebappClassLoaderMemory /* * Get the set of current threads as an array. - * Copied from WebappClassLoader + * Copied from WebappClassLoaderBase */ private Thread[] getThreads() { // Get the current thread group Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderThreadLocalMemoryLeak.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderThreadLocalMemoryLeak.java?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderThreadLocalMemoryLeak.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderThreadLocalMemoryLeak.java Tue Sep 8 12:49:24 2015 @@ -80,14 +80,14 @@ public class TestWebappClassLoaderThread LogValidationFilter f = new LogValidationFilter( "The web application [] created a ThreadLocal with key of"); LogManager.getLogManager().getLogger( - "org.apache.catalina.loader.WebappClassLoader").setFilter(f); + "org.apache.catalina.loader.WebappClassLoaderBase").setFilter(f); // Need to force loading of all web application classes via the web // application class loader loadClass("TesterCounter", - (WebappClassLoader) ctx.getLoader().getClassLoader()); + (WebappClassLoaderBase) ctx.getLoader().getClassLoader()); loadClass("TesterLeakingServlet1", - (WebappClassLoader) ctx.getLoader().getClassLoader()); + (WebappClassLoaderBase) ctx.getLoader().getClassLoader()); // This will trigger the ThreadLocal creation int rc = getUrl("http://localhost:" + getPort() + "/leak1", @@ -136,16 +136,16 @@ public class TestWebappClassLoaderThread LogValidationFilter f = new LogValidationFilter( "The web application [] created a ThreadLocal with key of"); LogManager.getLogManager().getLogger( - "org.apache.catalina.loader.WebappClassLoader").setFilter(f); + "org.apache.catalina.loader.WebappClassLoaderBase").setFilter(f); // Need to force loading of all web application classes via the web // application class loader loadClass("TesterCounter", - (WebappClassLoader) ctx.getLoader().getClassLoader()); + (WebappClassLoaderBase) ctx.getLoader().getClassLoader()); loadClass("TesterThreadScopedHolder", - (WebappClassLoader) ctx.getLoader().getClassLoader()); + (WebappClassLoaderBase) ctx.getLoader().getClassLoader()); loadClass("TesterLeakingServlet2", - (WebappClassLoader) ctx.getLoader().getClassLoader()); + (WebappClassLoaderBase) ctx.getLoader().getClassLoader()); // This will trigger the ThreadLocal creation int rc = getUrl("http://localhost:" + getPort() + "/leak2", @@ -180,7 +180,7 @@ public class TestWebappClassLoaderThread * * This method assumes that all classes are in the current package. */ - private void loadClass(String name, WebappClassLoader cl) throws Exception { + private void loadClass(String name, WebappClassLoaderBase cl) throws Exception { InputStream is = cl.getResourceAsStream( "org/apache/tomcat/unittest/" + name + ".class"); Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderWeaving.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderWeaving.java?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderWeaving.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/loader/TestWebappClassLoaderWeaving.java Tue Sep 8 12:49:24 2015 @@ -69,7 +69,7 @@ public class TestWebappClassLoaderWeavin private Tomcat tomcat; private Context context; - private WebappClassLoader loader; + private WebappClassLoaderBase loader; @Before @Override @@ -83,9 +83,9 @@ public class TestWebappClassLoaderWeavin ClassLoader loader = this.context.getLoader().getClassLoader(); assertNotNull("The class loader should not be null.", loader); - assertSame("The class loader is not correct.", WebappClassLoader.class, loader.getClass()); + assertSame("The class loader is not correct.", WebappClassLoaderBase.class, loader.getClass()); - this.loader = (WebappClassLoader) loader; + this.loader = (WebappClassLoaderBase) loader; } @@ -250,7 +250,7 @@ public class TestWebappClassLoaderWeavin result = invokeDoMethodOnClass(this.loader, "TesterUnweavedClass"); assertEquals("The second result is not correct.", "Hello, Weaver #2!", result); - WebappClassLoader copiedLoader = this.loader.copyWithoutTransformers(); + WebappClassLoader copiedLoader = (WebappClassLoader) this.loader.copyWithoutTransformers(); result = invokeDoMethodOnClass(copiedLoader, "TesterNeverWeavedClass"); assertEquals("The third result is not correct.", "This will never be weaved.", result); @@ -309,7 +309,7 @@ public class TestWebappClassLoaderWeavin } - private static String invokeDoMethodOnClass(WebappClassLoader loader, String className) + private static String invokeDoMethodOnClass(WebappClassLoaderBase loader, String className) throws Exception { Class<?> c = loader.findClass("org.apache.catalina.loader." + className); Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestTomcatClassLoader.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestTomcatClassLoader.java?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestTomcatClassLoader.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestTomcatClassLoader.java Tue Sep 8 12:49:24 2015 @@ -31,7 +31,7 @@ import static org.junit.Assert.assertEqu import org.junit.Test; import org.apache.catalina.Context; -import org.apache.catalina.loader.WebappClassLoader; +import org.apache.catalina.loader.WebappClassLoaderBase; import org.apache.tomcat.util.buf.ByteChunk; public class TestTomcatClassLoader extends TomcatBaseTest { @@ -98,7 +98,7 @@ public class TestTomcatClassLoader exten out.print("SYSTEM,"); } else if (custom == cl) { out.print("CUSTOM,"); - } else if (cl instanceof WebappClassLoader) { + } else if (cl instanceof WebappClassLoaderBase) { out.print("WEBAPP,"); } else { out.print("OTHER,"); Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/loader.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/loader.xml?rev=1701793&r1=1701792&r2=1701793&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/config/loader.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/config/loader.xml Tue Sep 8 12:49:24 2015 @@ -125,7 +125,7 @@ implementation class to use. If not specified, the default value is <code>org.apache.catalina.loader.WebappClassLoader</code>. Custom <strong>loaderClass</strong> implementations must extend - <code>org.apache.catalina.loader.WebappClassLoader</code>.</p> + <code>org.apache.catalina.loader.WebappClassLoaderBase</code>.</p> </attribute> <attribute name="searchExternalFirst" required="false"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org