Added in the ability to name classloaders in Tomcat
authorfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Fri, 17 Aug 2007 21:49:50 +0000 (21:49 +0000)
committerfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Fri, 17 Aug 2007 21:49:50 +0000 (21:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@567156 13f79535-47bb-0310-9956-ffa450edef68

build.xml
java/org/apache/catalina/loader/NamedClassLoader.java [new file with mode: 0644]
java/org/apache/catalina/loader/StandardClassLoader.java
java/org/apache/catalina/loader/WebappClassLoader.java
java/org/apache/catalina/loader/WebappLoader.java
java/org/apache/catalina/startup/Bootstrap.java

index c3ec2c7..67187b9 100644 (file)
--- a/build.xml
+++ b/build.xml
         <include name="org/apache/catalina/security/SecurityClassLoad.class" />
         <include name="org/apache/naming/JndiPermission.class" />
         <include name="org/apache/tomcat/util/compat/*" />
+        <include name="org/apache/catalina/loader/NamedClassLoader.class" />
         <!-- Javadoc and i18n exclusions -->
         <exclude name="**/package.html" />
         <exclude name="**/LocalStrings_*" />
         <exclude name="org/apache/catalina/launcher/**" />
         <exclude name="org/apache/catalina/storeconfig/**" />
         <exclude name="org/apache/naming/factory/webservices/**" />
+        <exclude name="org/apache/catalina/loader/NamedClassLoader.class" />
       </fileset>
     </jar>
     
diff --git a/java/org/apache/catalina/loader/NamedClassLoader.java b/java/org/apache/catalina/loader/NamedClassLoader.java
new file mode 100644 (file)
index 0000000..ba86377
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one or more\r
+ * contributor license agreements.  See the NOTICE file distributed with\r
+ * this work for additional information regarding copyright ownership.\r
+ * The ASF licenses this file to You under the Apache License, Version 2.0\r
+ * (the "License"); you may not use this file except in compliance with\r
+ * the License.  You may obtain a copy of the License at\r
+ * \r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package org.apache.catalina.loader;\r
+/**\r
+ * \r
+ * An interface to be able to able to have named classloader.\r
+ * Useful when distributing data through AOP or byte code injection\r
+ * To be able to map loaders between two instances to make sure the data\r
+ * gets loaded through the correct loader on the other node.\r
+ * @author Filip Hanik\r
+ * \r
+ */\r
+public interface NamedClassLoader {\r
+    \r
+    /**\r
+     * returns the name of this class loader\r
+     * @return String\r
+     */\r
+    public String getName();\r
+    \r
+    /**\r
+     * Sets the name of this class loader\r
+     * @param name String\r
+     */\r
+    public void setName(String name);\r
+    \r
+}
\ No newline at end of file
index 7af0570..175d618 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.catalina.loader;
 import java.net.URL;
 import java.net.URLClassLoader;
 
+
 /**
  * Subclass implementation of <b>java.net.URLClassLoader</b>. There are no
  * functional differences between this class and <b>java.net.URLClassLoader</b>.
@@ -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;
+    }
+    
+    
 
 }
 
index dbc2865..d32a780 100644 (file)
@@ -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.
  * <p>
@@ -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
 
index 1734f4b..f4f73d2 100644 (file)
@@ -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);
         }
-
     }
+    
 
 
     /**
index b775f0a..6a2d623 100644 (file)
@@ -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;