[jboss-cvs] JBossAS SVN: r67446 - trunk/tomcat/src/main/org/jboss/web/tomcat/service.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Nov 26 13:05:21 EST 2007


Author: sguilhen at redhat.com
Date: 2007-11-26 13:05:21 -0500 (Mon, 26 Nov 2007)
New Revision: 67446

Modified:
   trunk/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java
Log:
JBCTS-671: modified the findClass(String className) to only dynamicaly generate stubs if they can't be located using super.findClass().



Modified: trunk/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java
===================================================================
--- trunk/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java	2007-11-26 17:13:51 UTC (rev 67445)
+++ trunk/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java	2007-11-26 18:05:21 UTC (rev 67446)
@@ -39,7 +39,8 @@
 {
    static Logger log = Logger.getLogger(WebAppClassLoader.class);
 
-   private String[] filteredPackages = { "org.apache.commons.logging" };
+   private String[] filteredPackages =
+   {"org.apache.commons.logging"};
 
    public WebAppClassLoader()
    {
@@ -60,92 +61,91 @@
       this.filteredPackages = pkgs;
    }
 
+   /*
+    * (non-Javadoc)
+    * @see org.apache.catalina.loader.WebappClassLoader#addURL(java.net.URL)
+    */
    @Override
    public void addURL(URL url)
    {
       super.addURL(url);
    }
-   
-   /**
-    * Generate iiop stubs dynamically for any name ending in _Stub.
+
+   /*
+    * (non-Javadoc)
+    * @see org.apache.catalina.loader.WebappClassLoader#findClass(java.lang.String)
     */
    @Override
    public Class findClass(String name) throws ClassNotFoundException
    {
       boolean trace = log.isTraceEnabled();
       if (trace)
+         log.trace("findClass(" + name + ") called");
+
+      try
       {
-         log.trace("findClass(" + name + ") called");
+         return super.findClass(name);
       }
-      if (name.endsWith("_Stub"))
+      catch (ClassNotFoundException cnfe)
       {
+         // try to dynamically generate the class if it is a stub
          int start = name.lastIndexOf('.') + 1;
-         if (name.charAt(start) == '_')
-         {
-            String pkg = name.substring(0, start);
-            String interfaceName = pkg
-                  + name.substring(start + 1, name.length() - 5);
+         if (name.charAt(start) == '_' && name.endsWith("_Stub"))
+            return generateStub(name);
+         throw cnfe;
+      }
+   }
 
-            // This is a workaround for a problem in the RMI/IIOP
-            // stub loading code in SUN JDK 1.4.x, which prepends
-            // "org.omg.stub." to classes in certain name spaces,
-            // such as "com.sun". This non-compliant behavior
-            // results in failures when deploying SUN example code,
-            // including ECPerf and PetStore, so we remove the prefix.
-            if (interfaceName.startsWith("org.omg.stub.com.sun."))
-               interfaceName = interfaceName.substring(13);
+   /**
+    * <p>
+    * Generate iiop stubs dynamically for any name ending in _Stub.
+    * </p>
+    * 
+    * @param name   a <code>String</code> representing the stub fully-qualified class name.
+    * @return   the <code>Class</code> of the generated stub.
+    * @throws ClassNotFoundException    if the stub class could not be created.
+    */
+   private Class generateStub(String name) throws ClassNotFoundException
+   {
+      boolean trace = log.isTraceEnabled();
+      int start = name.lastIndexOf('.') + 1;
+      String pkg = name.substring(0, start);
+      String interfaceName = pkg + name.substring(start + 1, name.length() - 5);
 
-            Class intf = super.loadClass(interfaceName);
-            if (trace)
-            {
-               log.trace("loaded class " + interfaceName);
-            }
+      // This is a workaround for a problem in the RMI/IIOP
+      // stub loading code in SUN JDK 1.4.x, which prepends
+      // "org.omg.stub." to classes in certain name spaces,
+      // such as "com.sun". This non-compliant behavior
+      // results in failures when deploying SUN example code,
+      // including ECPerf and PetStore, so we remove the prefix.
+      if (interfaceName.startsWith("org.omg.stub.com.sun."))
+         interfaceName = interfaceName.substring(13);
 
-            try
-            {
-               byte[] code = IIOPStubCompiler.compile(intf, name);
+      Class intf = super.loadClass(interfaceName);
+      if (trace)
+         log.trace("loaded class " + interfaceName);
 
-               if (trace)
-               {
-                  log.trace("compiled stub class for " + interfaceName);
-               }
-               Class clz = defineClass(name, code, 0, code.length);
-               if (trace)
-               {
-                  log.trace("defined stub class for " + interfaceName);
-               }
-               resolveClass(clz);
-               try
-               {
-                  clz.newInstance();
-               }
-               catch (Throwable t)
-               {
-                  ClassNotFoundException cnfe = new ClassNotFoundException(
-                        interfaceName, t);
-                  throw cnfe;
-               }
-               if (trace)
-               {
-                  log.trace("resolved stub class for " + interfaceName);
-               }
-               return clz;
-            }
-            catch (RuntimeException e)
-            {
-               log.debug("failed finding class " + name, e);
-               return super.findClass(name);
-            }
-         }
-         else
-         {
-            return super.findClass(name);
-         }
+      byte[] code = IIOPStubCompiler.compile(intf, name);
+      if (trace)
+         log.trace("compiled stub class for " + interfaceName);
+
+      Class clz = super.defineClass(name, code, 0, code.length);
+      if (trace)
+         log.trace("defined stub class for " + interfaceName);
+
+      super.resolveClass(clz);
+      try
+      {
+         clz.newInstance();
       }
-      else
+      catch (Throwable t)
       {
-         return super.findClass(name);
+         ClassNotFoundException cnfe = new ClassNotFoundException(interfaceName, t);
+         throw cnfe;
       }
+      if (trace)
+         log.trace("resolved stub class for " + interfaceName);
+      return clz;
    }
 
    /**




More information about the jboss-cvs-commits mailing list