[jboss-svn-commits] JBL Code SVN: r20920 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Jul 5 09:55:56 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-07-05 09:55:56 -0400 (Sat, 05 Jul 2008)
New Revision: 20920

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java
Log:
JBRULES-1667 Internal Models are not being resolved from the RuleBase CompositeClassLoader
-now iterate each classloader's parent in the array calling Class.forName on it
-We keep a separate, unique, parent map for this as it's likely many share the same parent.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java	2008-07-05 13:01:38 UTC (rev 20919)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java	2008-07-05 13:55:56 UTC (rev 20920)
@@ -4,25 +4,45 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class CompositePackageClassLoader extends ClassLoader implements DroolsClassLoader  {
+public class CompositePackageClassLoader extends ClassLoader
+    implements
+    DroolsClassLoader {
 
     private final List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
+    private final List<ClassLoader> parents      = new ArrayList<ClassLoader>();
 
     public CompositePackageClassLoader(final ClassLoader parentClassLoader) {
         super( parentClassLoader );
+        this.parents.add( getParent() );
     }
 
     public void addClassLoader(final ClassLoader classLoader) {
+        // don't add duplicate classloaders;
+        for ( final ClassLoader cl : this.classLoaders ) {
+            if ( cl == classLoader ) {
+                return;
+            }
+        }
         this.classLoaders.add( classLoader );
+
+        // we need to record parents for fast finding in a unique list
+        ClassLoader parent = classLoader.getParent();
+        for ( final ClassLoader cl : this.parents ) {
+            if ( cl == parent ) {
+                return;
+            }
+        }
+        this.parents.add( parent );
+
     }
 
     public void removeClassLoader(final ClassLoader classLoader) {
-        classLoaders.remove(classLoader);
+        classLoaders.remove( classLoader );
     }
 
     public Class fastFindClass(final String name) {
         for ( final ClassLoader classLoader : this.classLoaders ) {
-            final Class clazz = ((DroolsClassLoader)classLoader).fastFindClass( name );
+            final Class clazz = ((DroolsClassLoader) classLoader).fastFindClass( name );
             if ( clazz != null ) {
                 return clazz;
             }
@@ -39,33 +59,42 @@
      */
     protected synchronized Class loadClass(final String name,
                                            final boolean resolve) throws ClassNotFoundException {
-        Class clazz = findLoadedClass( name );
+        Class cls = findLoadedClass( name );
 
-        if ( clazz == null ) {
-            clazz = fastFindClass( name );
+        if ( cls == null ) {
+            cls = fastFindClass( name );
 
-            if ( clazz == null ) {
+            if ( cls == null ) {
+                // now check all parents
+                for ( final ClassLoader parent : this.parents ) {
+                    try {
+                        // due to this bug http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=2a9a78e4393c5e678a2c80f90c1?bug_id=6434149
+                        cls = Class.forName( name,
+                                             true,
+                                             parent );
+                    } catch ( ClassNotFoundException e ) {
+                        // swallow
+                    }
+                    if ( cls != null ) {
+                        break;
+                    }
+                }
 
-                final ClassLoader parent = getParent();
-                if ( parent != null ) {
-                    clazz = Class.forName( name,
-                                           true,
-                                           parent );
-                } else {
+                if ( cls == null ) {
                     return null;
                 }
             }
         }
 
         if ( resolve ) {
-            resolveClass( clazz );
+            resolveClass( cls );
         }
 
-        return clazz;
+        return cls;
     }
 
     public InputStream getResourceAsStream(final String name) {
-        InputStream stream =  super.getResourceAsStream( name );
+        InputStream stream = super.getResourceAsStream( name );
 
         for ( final ClassLoader classLoader : this.classLoaders ) {
             stream = classLoader.getResourceAsStream( name );




More information about the jboss-svn-commits mailing list