[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