[jboss-cvs] JBossAS SVN: r63176 - branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon May 21 19:13:35 EDT 2007


Author: scott.stark at jboss.org
Date: 2007-05-21 19:13:35 -0400 (Mon, 21 May 2007)
New Revision: 63176

Modified:
   branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java
Log:
JBCTS-591, Generate iiop stubs dynamically for any name ending in _Stub.

Modified: branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java
===================================================================
--- branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java	2007-05-21 16:26:06 UTC (rev 63175)
+++ branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java	2007-05-21 23:13:35 UTC (rev 63176)
@@ -23,11 +23,12 @@
 
 import org.apache.catalina.loader.WebappClassLoader;
 import org.jboss.logging.Logger;
+import org.jboss.proxy.compiler.IIOPStubCompiler;
 
 /**
- * Subclass the tomcat web app class loader to override the filter method
- * to exclude classes which cannot be override by the web app due to their
- * use in the tomcat web container/integration.
+ * Subclass the tomcat web app class loader to override the filter method to
+ * exclude classes which cannot be override by the web app due to their use in
+ * the tomcat web container/integration.
  * 
  * @author Scott.Stark at jboss.org
  * @version $Revision: 57206 $
@@ -35,10 +36,9 @@
 public class WebAppClassLoader extends WebappClassLoader
 {
    static Logger log = Logger.getLogger(WebAppClassLoader.class);
-   private String[] filteredPackages = {
-      "org.apache.commons.logging"
-   };
 
+   private String[] filteredPackages = { "org.apache.commons.logging" };
+
    public WebAppClassLoader()
    {
    }
@@ -52,37 +52,120 @@
    {
       return filteredPackages;
    }
+
    public void setFilteredPackages(String[] pkgs)
    {
       this.filteredPackages = pkgs;
    }
 
    /**
+    * Generate iiop stubs dynamically for any name ending in _Stub.
+    */
+   @Override
+   public Class findClass(String name) throws ClassNotFoundException
+   {
+      boolean trace = log.isTraceEnabled();
+      if (trace)
+      {
+         log.trace("findClass(" + name + ") called");
+      }
+      if (name.endsWith("_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);
+
+            // 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);
+
+            Class intf = super.loadClass(interfaceName);
+            if (trace)
+            {
+               log.trace("loaded class " + interfaceName);
+            }
+
+            try
+            {
+               byte[] code = IIOPStubCompiler.compile(intf, name);
+
+               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);
+         }
+      }
+      else
+      {
+         return super.findClass(name);
+      }
+   }
+
+   /**
     * Overriden to filter out classes in the packages listed in the
     * filteredPackages settings.
     * 
     * @param name
     * @return true if the class should be loaded from the parent class loader,
-    *    false if it can be loaded from this class loader.
-    */ 
+    *         false if it can be loaded from this class loader.
+    */
    protected boolean filter(String name)
    {
       boolean excludeClass = super.filter(name);
-      if( excludeClass == false )
+      if (excludeClass == false)
       {
          // Check class against our filtered packages
          int length = filteredPackages != null ? filteredPackages.length : 0;
-         for(int n = 0; n < length; n ++)
+         for (int n = 0; n < length; n++)
          {
             String pkg = filteredPackages[n];
-            if( name.startsWith(pkg) )
+            if (name.startsWith(pkg))
             {
                excludeClass = true;
                break;
             }
          }
       }
-      log.trace("filter name="+name+", exclude="+excludeClass);
+      log.trace("filter name=" + name + ", exclude=" + excludeClass);
       return excludeClass;
    }
 }




More information about the jboss-cvs-commits mailing list