From: fhanik Date: Fri, 17 Aug 2007 21:49:50 +0000 (+0000) Subject: Added in the ability to name classloaders in Tomcat X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=773f3d4c13244e406e66bf3098c07117171ef532;p=tomcat7.0 Added in the ability to name classloaders in Tomcat git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@567156 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/build.xml b/build.xml index c3ec2c78b..67187b964 100644 --- a/build.xml +++ b/build.xml @@ -182,6 +182,7 @@ + @@ -215,6 +216,7 @@ + diff --git a/java/org/apache/catalina/loader/NamedClassLoader.java b/java/org/apache/catalina/loader/NamedClassLoader.java new file mode 100644 index 000000000..ba86377c4 --- /dev/null +++ b/java/org/apache/catalina/loader/NamedClassLoader.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.catalina.loader; +/** + * + * An interface to be able to able to have named classloader. + * Useful when distributing data through AOP or byte code injection + * To be able to map loaders between two instances to make sure the data + * gets loaded through the correct loader on the other node. + * @author Filip Hanik + * + */ +public interface NamedClassLoader { + + /** + * returns the name of this class loader + * @return String + */ + public String getName(); + + /** + * Sets the name of this class loader + * @param name String + */ + public void setName(String name); + +} \ No newline at end of file diff --git a/java/org/apache/catalina/loader/StandardClassLoader.java b/java/org/apache/catalina/loader/StandardClassLoader.java index 7af05709f..175d61854 100644 --- a/java/org/apache/catalina/loader/StandardClassLoader.java +++ b/java/org/apache/catalina/loader/StandardClassLoader.java @@ -21,6 +21,7 @@ package org.apache.catalina.loader; import java.net.URL; import java.net.URLClassLoader; + /** * Subclass implementation of java.net.URLClassLoader. There are no * functional differences between this class and java.net.URLClassLoader. @@ -32,7 +33,9 @@ import java.net.URLClassLoader; public class StandardClassLoader extends URLClassLoader - implements StandardClassLoaderMBean { + implements StandardClassLoaderMBean, NamedClassLoader { + + protected String name; public StandardClassLoader(URL repositories[]) { super(repositories); @@ -41,6 +44,16 @@ public class StandardClassLoader public StandardClassLoader(URL repositories[], ClassLoader parent) { super(repositories, parent); } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + + } diff --git a/java/org/apache/catalina/loader/WebappClassLoader.java b/java/org/apache/catalina/loader/WebappClassLoader.java index dbc28650e..d32a7800c 100644 --- a/java/org/apache/catalina/loader/WebappClassLoader.java +++ b/java/org/apache/catalina/loader/WebappClassLoader.java @@ -64,6 +64,7 @@ import org.apache.naming.resources.Resource; import org.apache.naming.resources.ResourceAttributes; import org.apache.tomcat.util.IntrospectionUtils; + /** * Specialized web application class loader. *

@@ -103,7 +104,7 @@ import org.apache.tomcat.util.IntrospectionUtils; */ public class WebappClassLoader extends URLClassLoader - implements Reloader, Lifecycle + implements Reloader, Lifecycle, NamedClassLoader { protected static org.apache.juli.logging.Log log= @@ -370,6 +371,11 @@ public class WebappClassLoader */ protected Permission allPermission = new java.security.AllPermission(); + /** + * The name of this classloader + * typically a concatenated string of Engine/Host/Context names + */ + protected String name = null; // ------------------------------------------------------------- Properties @@ -523,6 +529,14 @@ public class WebappClassLoader protected void setParentClassLoader(ClassLoader pcl) { parent = pcl; } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } // ------------------------------------------------------- Reloader Methods diff --git a/java/org/apache/catalina/loader/WebappLoader.java b/java/org/apache/catalina/loader/WebappLoader.java index 1734f4b02..f4f73d2bd 100644 --- a/java/org/apache/catalina/loader/WebappLoader.java +++ b/java/org/apache/catalina/loader/WebappLoader.java @@ -62,6 +62,7 @@ import org.apache.naming.resources.DirContextURLStreamHandler; import org.apache.naming.resources.DirContextURLStreamHandlerFactory; import org.apache.naming.resources.Resource; import org.apache.tomcat.util.modeler.Registry; +import org.apache.catalina.Host; /** @@ -660,7 +661,8 @@ public class WebappLoader ((ClassLoader) classLoader, this.container.getResources()); StandardContext ctx=(StandardContext)container; - Engine eng=(Engine)ctx.getParent().getParent(); + Host host = (Host)ctx.getParent(); + Engine eng=(Engine)host.getParent(); String path = ctx.getPath(); if (path.equals("")) { path = "/"; @@ -670,13 +672,16 @@ public class WebappLoader + path + ",host=" + ctx.getParent().getName()); Registry.getRegistry(null, null) .registerComponent(classLoader, cloname, null); - + + //set the name of the webapp classloader + String clName = eng.getName()+"#"+host.getName()+"#"+ctx.getName(); + classLoader.setName(clName); } catch (Throwable t) { log.error( "LifecycleException ", t ); throw new LifecycleException("start: ", t); } - } + /** diff --git a/java/org/apache/catalina/startup/Bootstrap.java b/java/org/apache/catalina/startup/Bootstrap.java index b775f0aba..6a2d623c5 100644 --- a/java/org/apache/catalina/startup/Bootstrap.java +++ b/java/org/apache/catalina/startup/Bootstrap.java @@ -33,6 +33,7 @@ import javax.management.ObjectName; import org.apache.catalina.security.SecurityClassLoad; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.catalina.loader.NamedClassLoader; /** @@ -172,6 +173,10 @@ public final class Bootstrap { ClassLoader classLoader = ClassLoaderFactory.createClassLoader (locations, types, parent); + + if ( classLoader instanceof NamedClassLoader ) { + ((NamedClassLoader)classLoader).setName(name); + } // Retrieving MBean server MBeanServer mBeanServer = null;