You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2009/04/22 20:52:45 UTC

svn commit: r767617 [2/2] - in /geronimo/sandbox/djencks/framework: buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/ buildsupport/car-maven-plugin/src/test/java/org/apache/geronimo/mavenplugins/car/ configs/jee-specs/ m...

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/ConfigurationClassLoaderExtension.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/ConfigurationClassLoaderExtension.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/ConfigurationClassLoaderExtension.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/ConfigurationClassLoaderExtension.java Wed Apr 22 18:52:43 2009
@@ -22,17 +22,26 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.List;
+import java.util.Enumeration;
+import java.io.IOException;
+
+import org.apache.geronimo.kernel.repository.Artifact;
 
 /**
  *
  * @version $Rev:$ $Date:$
  */
 public interface ConfigurationClassLoaderExtension {
+    
     void addURL(URL url);
 
-    Class<?> loadClassInternal(String name,
-        boolean resolve,
-        List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException, MalformedURLException;
+    Class<?> loadClassInternal(String name, boolean resolve, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException, MalformedURLException;
     
     void destroy();
+
+    URL findResource(String name);
+
+    Enumeration<URL> findResources(String name) throws IOException;
+
+    Artifact getId();
 }

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/DependencySAXHandler.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/DependencySAXHandler.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/DependencySAXHandler.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/DependencySAXHandler.java Wed Apr 22 18:52:43 2009
@@ -33,6 +33,7 @@
  */
 public final class DependencySAXHandler extends DefaultHandler {
     private final GlobalClassLoaderRegister register;
+    private final Artifact docSourceArtifact;
     private StringBuilder currentString = new StringBuilder();
     private boolean dependency;
     private boolean parent;
@@ -43,11 +44,12 @@
     private Artifact child;
     private Set<Artifact> parents;
 
-    public DependencySAXHandler(GlobalClassLoaderRegister register) {
+    public DependencySAXHandler(GlobalClassLoaderRegister register, Artifact docSourceArtifact) {
         if (null == register) {
             throw new IllegalArgumentException("register is required");
         }
         this.register = register;
+        this.docSourceArtifact = docSourceArtifact;
     }
 
     @Override
@@ -86,7 +88,7 @@
                 parent = false;
             } else if (dependency) {
                 Artifact tmp = child == null? getArtifact(): child;
-                register.register(tmp, parents);
+                register.register(tmp, parents, docSourceArtifact);
                 dependency = false;
                 parents = null;
                 child = null;

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoader.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoader.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoader.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoader.java Wed Apr 22 18:52:43 2009
@@ -30,56 +30,64 @@
 import java.util.List;
 import java.util.Set;
 import java.util.Collections;
+import java.util.ArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 
 import org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader;
 import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.classloader.UnionEnumeration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- *
  * @version $Rev: 732599 $ $Date: 2009-01-08 14:36:25 +1100 (Thu, 08 Jan 2009) $
  */
-public class GlobalClassLoader extends URLClassLoader {
+public class GlobalClassLoader extends URLClassLoader implements ConfigurationClassLoaderExtension {
     private static final Logger LOG = LoggerFactory.getLogger(GlobalClassLoader.class);
 
     private final Artifact artifact;
     private final Set<Artifact> dependencies;
     private final CopyOnWriteArraySet<String> resourcesNotFound = new CopyOnWriteArraySet<String>();
-    private ClassLoader[] parents;
+    private ConfigurationClassLoaderExtension[] parents;
 
-    public GlobalClassLoader(Artifact artifact, URL[] urls, ClassLoader[] parents) {
+    public GlobalClassLoader(Artifact artifact, URL[] urls, ConfigurationClassLoaderExtension[] parents) {
         super(urls);
         this.artifact = artifact;
         this.parents = parents;
         dependencies = Collections.emptySet();
     }
 
-    public Artifact getArtifact() {
+    public Artifact getId() {
         return artifact;
     }
-    
-    public Class<?> loadClass(String name, List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException {
+
+    public Class<?> loadClass(String name, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException {
         return loadClass(name, false, visitedClassLoaders);
     }
-    
+
     protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
-        return loadClass(name, resolve, new LinkedList<ClassLoader>());
+        return loadClass(name, resolve, new LinkedList<ConfigurationClassLoaderExtension>());
     }
-    
-    protected synchronized Class<?> loadClass(String name, boolean resolve, List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException {
+
+    protected synchronized Class<?> loadClass(String name, boolean resolve, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException {
         return loadClass(name, resolve, visitedClassLoaders, false);
     }
-    
-    protected synchronized Class<?> loadClassInternal(String name, boolean resolve, List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException, MalformedURLException {
+
+    public void addURL(URL url) {
+        throw new RuntimeException("dont call this");
+    }
+
+    public synchronized Class<?> loadClassInternal(String name, boolean resolve, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException, MalformedURLException {
         return loadClass(name, resolve, visitedClassLoaders, true);
     }
-    
+
+    public void destroy() {
+    }
+
     protected synchronized Class<?> loadClass(String name,
-            boolean resolve,
-            List<ClassLoader> visitedClassLoaders,
-            boolean forParent) throws ClassNotFoundException {
+                                              boolean resolve,
+                                              List<ConfigurationClassLoaderExtension> visitedClassLoaders,
+                                              boolean forParent) throws ClassNotFoundException {
         //
         // Check if class is in the loaded classes cache
         //
@@ -87,7 +95,7 @@
         if (cachedClass != null) {
             return resolveClass(cachedClass, resolve);
         }
-        
+
         if (!forParent) {
             //
             // If this is a java.* or primitive class, use the primordial ClassLoader...
@@ -106,7 +114,7 @@
                 }
             }
         }
-        
+
         //
         // Check parent class loaders
         //
@@ -114,7 +122,7 @@
         if (clazz != null) {
             return resolveClass(clazz, resolve);
         }
-        
+
         //
         // if we are not using inverse class loading, check local urls now
         //
@@ -125,37 +133,39 @@
             clazz = findClass(name);
             return resolveClass(clazz, resolve);
         } catch (ClassNotFoundException ignored) {
+        } catch (NoClassDefFoundError e) {
+            throw new NoClassDefFoundError("Error for class: " + name + " could not find: " + e.getMessage() + " in classLoader: \n" + toString());
         }
-        
+
         if (forParent) {
             return null;
         }
         throw new ClassNotFoundException(name + " in classloader " + this);
     }
-    
-    private synchronized Class<?> checkParents(String name, boolean resolve, List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException {
-        for (ClassLoader parent : parents) {
+
+    private synchronized Class<?> checkParents(String name, boolean resolve, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException {
+        for (ConfigurationClassLoaderExtension parent : parents) {
             if (!visitedClassLoaders.contains(parent)) {
                 visitedClassLoaders.add(parent);  // Track that we've been here before
                 try {
-        	        if (parent instanceof GlobalClassLoader) {
-        	        	Class clazz = ((GlobalClassLoader) parent).loadClassInternal(name, resolve, visitedClassLoaders);
-        	        	if (clazz != null) return resolveClass(clazz, resolve);
-        	        } else if (parent instanceof ChildrenConfigurationClassLoader) {
-                        Class clazz = ((ChildrenConfigurationClassLoader) parent).loadClass(name, visitedClassLoaders);
+//                    if (parent instanceof GlobalClassLoader) {
+                        Class clazz = parent.loadClassInternal(name, resolve, visitedClassLoaders);
                         if (clazz != null) return resolveClass(clazz, resolve);
-        	        } else {
-        	        	return parent.loadClass(name);
-        	        }
-    	    	} catch (ClassNotFoundException cnfe) {
+//                    } else if (parent instanceof ChildrenConfigurationClassLoader) {
+//                        Class clazz = ((ChildrenConfigurationClassLoader) parent).loadClassInternal(name, resolve, visitedClassLoaders);
+//                        if (clazz != null) return resolveClass(clazz, resolve);
+//                    } else {
+//                        return ((ClassLoader)parent).loadClass(name);
+//                    }
+                } catch (ClassNotFoundException cnfe) {
                     // ignore
                 } catch (MalformedURLException me) {
                     LOG.debug("Failed findClass for {}", name, me);
                 }
             }
-    	} 
-     	// To avoid yet another CNFE we'll simply return null and let the caller handle appropriately.
-    	return null;
+        }
+        // To avoid yet another CNFE we'll simply return null and let the caller handle appropriately.
+        return null;
     }
 
     private Class resolveClass(Class clazz, boolean resolve) {
@@ -167,41 +177,33 @@
 
     @Override
     public Enumeration<URL> getResources(String name) throws IOException {
-        Set<URL> foundResources = new HashSet<URL>();
-        
-        for (ClassLoader parent : parents) {
-            Enumeration<URL> urls = parent.getResources(name);
-            while (urls.hasMoreElements()) {
-                URL url = urls.nextElement();
-                foundResources.add(url);
+        List<Enumeration<URL>> urls = new ArrayList<Enumeration<URL>>();
+
+        for (ConfigurationClassLoaderExtension parent : parents) {
+            if (parent instanceof ClassLoader) {
+                urls.add(((ClassLoader)parent).getResources(name));
+            } else {
+                urls.add(parent.findResources(name));
             }
         }
-        
-        Enumeration<URL> urls = findResources(name);
-        while (urls.hasMoreElements()) {
-            URL url = urls.nextElement();
-            foundResources.add(url);
-        }
 
-        final Iterator<URL> iterator = foundResources.iterator();
-        return new Enumeration<URL>() {
-            public boolean hasMoreElements() {
-                return iterator.hasNext();
-            }
+        urls.add(findResources(name));
 
-            public URL nextElement() {
-                return iterator.next();
-            }
-        };
+        return new UnionEnumeration(urls);
     }
-    
+
     public URL getResource(String name) {
         if (resourcesNotFound.contains(name)) {
             return null;
         }
 
-        for (ClassLoader parent : parents) {
-            URL url = parent.getResource(name);
+        for (ConfigurationClassLoaderExtension parent : parents) {
+            URL url = null;
+            if (parent instanceof ClassLoader) {
+                url = ((ClassLoader)parent).getResource(name);
+            } else {
+                url = parent.findResource(name);
+            }
             if (url != null) {
                 return url;
             }
@@ -221,11 +223,31 @@
 
     @Override
     public String toString() {
-        return "GlobalClassLoader [" + artifact + "]";
+        StringBuilder buf = new StringBuilder();
+        toString(buf, "", new HashSet<Artifact>());
+        return buf.toString();
+    }
+
+    protected void toString(StringBuilder buf, String indent, Set<Artifact> known) {
+        if (known.contains(artifact)) {
+            buf.append(indent).append("GlobalClassLoader [").append(artifact).append("] (already listed)\n");
+            return;
+        }
+        buf.append(indent).append("GlobalClassLoader [").append(artifact).append("]\n");
+        known.add(artifact);
+        indent += "  ";
+        for (ConfigurationClassLoaderExtension parent : parents) {
+            if (parent instanceof GlobalClassLoader) {
+                ((GlobalClassLoader) parent).toString(buf, indent, known);
+            } else {
+                buf.append(indent).append(parent).append("\n");
+            }
+
+        }
     }
 
     public Set<Artifact> getDependencies() {
         return dependencies;
     }
-    
+
 }

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderDependencyResolver.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderDependencyResolver.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderDependencyResolver.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderDependencyResolver.java Wed Apr 22 18:52:43 2009
@@ -29,5 +29,5 @@
  * @version $Rev:$ $Date:$
  */
 public interface GlobalClassLoaderDependencyResolver {
-    void resolve(URL url, GlobalClassLoaderRegister register);
+    void resolve(URL url, GlobalClassLoaderRegister register, Artifact docSourceArtifact);
 }

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderRegister.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderRegister.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderRegister.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/GlobalClassLoaderRegister.java Wed Apr 22 18:52:43 2009
@@ -28,15 +28,17 @@
  * @version $Rev:$ $Date:$
  */
 public interface GlobalClassLoaderRegister {
-    void register(GlobalClassLoader classLoader);
+    void register(ConfigurationClassLoaderExtension classLoader);
     
-    void unregister(GlobalClassLoader classLoader);
+    void unregister(ConfigurationClassLoaderExtension classLoader);
 
-    GlobalClassLoader retrieve(Artifact artifact);
+    ConfigurationClassLoaderExtension retrieve(Artifact artifact);
 
-    void register(Artifact child, Set<Artifact> parents);
+    void register(Artifact child, Set<Artifact> parents, Artifact docSourceArtifact);
 
     void unregister(Artifact artifact);
 
     Set<Artifact> getParents(Artifact artifact);
+
+    void cleanClassLoaderRegistry();
 }

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MavenDependencyResolver.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MavenDependencyResolver.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MavenDependencyResolver.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MavenDependencyResolver.java Wed Apr 22 18:52:43 2009
@@ -31,6 +31,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
+import org.apache.geronimo.kernel.repository.Artifact;
 
 /**
  * Given a URL to an artifact in a maven repo, say <base>.jar, attempts to read dependencies out of
@@ -41,11 +42,11 @@
 public class MavenDependencyResolver implements GlobalClassLoaderDependencyResolver {
     private static final Logger log = LoggerFactory.getLogger(MavenDependencyResolver.class);
 
-    public void resolve(URL url, GlobalClassLoaderRegister register) {
+    public void resolve(URL url, GlobalClassLoaderRegister register, Artifact docSourceArtifact) {
         try {
             InputStream in = locateDependencyDeclaration(url);
             try {
-                addDependencies(register, in);
+                addDependencies(register, in, docSourceArtifact);
             } finally {
                 in.close();
             }
@@ -55,11 +56,11 @@
 
     }
 
-    void addDependencies(GlobalClassLoaderRegister register, InputStream dependencyDeclaration) {
+    void addDependencies(GlobalClassLoaderRegister register, InputStream dependencyDeclaration, Artifact docSourceArtifact) {
         SAXParserFactory factory = SAXParserFactory.newInstance();
         try {
             SAXParser parser = factory.newSAXParser();
-            parser.parse(dependencyDeclaration, new DependencySAXHandler(register));
+            parser.parse(dependencyDeclaration, new DependencySAXHandler(register, docSourceArtifact));
         } catch (NullPointerException e) {
             log.error("error parsing " + dependencyDeclaration, e);
         } catch (SAXException e) {

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MultiParentClassLoader2.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MultiParentClassLoader2.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MultiParentClassLoader2.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/MultiParentClassLoader2.java Wed Apr 22 18:52:43 2009
@@ -29,7 +29,6 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -97,13 +96,14 @@
 
     //jars "in" this classloader.  These classloaders cannot affect the visibility of contained classes.  The classloading rule inverseclassloading
     //determines whether the parents or these classloaders are searched first.
-    private final Set<GlobalClassLoader> classloaders;
+    private final Set<ConfigurationClassLoaderExtension> classloaders;
 
     public MultiParentClassLoader2(Artifact id,
-                                   Set<GlobalClassLoader> globalClassLoaders,
+                                   URL[] urls,
+                                   Set<ConfigurationClassLoaderExtension> globalClassLoaders,
                                    ClassLoader[] parents,
                                    ClassLoadingRules classLoadingRules) {
-        super(new URL[0]);
+        super(urls);
         this.id = id;
         this.classloaders = globalClassLoaders;
         this.parents = parents;
@@ -278,7 +278,7 @@
         //
         if (!isHiddenClass(name)) {
             try {
-                LinkedList<ClassLoader> visitedClassLoaders = new LinkedList<ClassLoader>();
+                LinkedList<ConfigurationClassLoaderExtension> visitedClassLoaders = new LinkedList<ConfigurationClassLoaderExtension>();
                 Class clazz = checkParents(name, resolve, visitedClassLoaders);
                 if (clazz != null) return resolveClass(clazz, resolve);
             } catch (ClassNotFoundException cnfe) {
@@ -305,21 +305,25 @@
 
     @Override
     protected Class<?> findClass(String name) throws ClassNotFoundException {
-        LinkedList<ClassLoader> visitedClassLoaders = new LinkedList<ClassLoader>();
+        LinkedList<ConfigurationClassLoaderExtension> visitedClassLoaders = new LinkedList<ConfigurationClassLoaderExtension>();
         return findClass(name, visitedClassLoaders);
     }
 
-    protected Class<?> findClass(String name, List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException {
-        for (GlobalClassLoader classLoader : classloaders) {
+    protected Class<?> findClass(String name, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException {
+        for (ConfigurationClassLoaderExtension classLoader : classloaders) {
             if (!visitedClassLoaders.contains(classLoader)) {
                 visitedClassLoaders.add(classLoader);
                 try {
-                    return classLoader.loadClass(name, visitedClassLoaders);
+                    Class clazz = classLoader.loadClassInternal(name, true, visitedClassLoaders);
+                    if (clazz != null) return clazz;
                 } catch (ClassNotFoundException e) {
+                    //ignore
+                } catch (MalformedURLException e) {
+                    //ignore
                 }
             }
         }
-        throw new ClassNotFoundException();
+        return super.findClass(name);
     }
 
     /**
@@ -333,7 +337,7 @@
      * @return
      * @throws ClassNotFoundException
      */
-    public synchronized Class<?> loadClassInternal(String name, boolean resolve, List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException, MalformedURLException {
+    public synchronized Class<?> loadClassInternal(String name, boolean resolve, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException, MalformedURLException {
         //
         // Check if class is in the loaded classes cache
         //
@@ -380,16 +384,19 @@
      * @return
      * @throws ClassNotFoundException
      */
-    private synchronized Class<?> checkParents(String name, boolean resolve, List<ClassLoader> visitedClassLoaders) throws ClassNotFoundException {
+    private synchronized Class<?> checkParents(String name, boolean resolve, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException {
         for (ClassLoader parent : parents) {
             if (!visitedClassLoaders.contains(parent)) {
-                visitedClassLoaders.add(parent);  // Track that we've been here before
+                //TODO inefficient
+                if (parent instanceof ConfigurationClassLoaderExtension) {
+                    visitedClassLoaders.add((ConfigurationClassLoaderExtension) parent);  // Track that we've been here before
+                }
                 try {
                     if (parent instanceof MultiParentClassLoader2) {
                         Class clazz = ((MultiParentClassLoader2) parent).loadClassInternal(name, resolve, visitedClassLoaders);
                         if (clazz != null) return resolveClass(clazz, resolve);
                     } else if (parent instanceof ChildrenConfigurationClassLoader) {
-                        Class clazz = ((ChildrenConfigurationClassLoader) parent).loadClass(name, visitedClassLoaders);
+                        Class clazz = ((ChildrenConfigurationClassLoader) parent).loadClassInternal(name, resolve, visitedClassLoaders);
                         if (clazz != null) return resolveClass(clazz, resolve);
                     } else {
                         return parent.loadClass(name);
@@ -475,8 +482,12 @@
 
     @Override
     public URL findResource(String name) {
-        for (URLClassLoader classLoader : classloaders) {
-            URL url = classLoader.findResource(name);
+        URL url = super.findResource(name);
+        if (url != null) {
+            return url;
+        }
+        for (ConfigurationClassLoaderExtension classLoader : classloaders) {
+            url = ((ConfigurationClassLoaderExtension)classLoader).findResource(name);
             if (null != url) {
                 return url;
             }
@@ -523,23 +534,12 @@
     }
 
     protected Enumeration<URL> internalfindResources(String name) throws IOException {
-        Set<URL> resources = new HashSet<URL>();
-        for (URLClassLoader classLoader : classloaders) {
-            Enumeration<URL> findResources = classLoader.findResources(name);
-            while (findResources.hasMoreElements()) {
-                resources.add(findResources.nextElement());
-            }
+        List<Enumeration<URL>> urls = new ArrayList<Enumeration<URL>>();
+        urls.add(super.findResources(name));
+        for (ConfigurationClassLoaderExtension classLoader : classloaders) {
+            urls.add(classLoader.findResources(name));
         }
-        final Iterator<URL> iterator = resources.iterator();
-        return new Enumeration<URL>() {
-            public boolean hasMoreElements() {
-                return iterator.hasNext();
-            }
-
-            public URL nextElement() {
-                return iterator.next();
-            }
-        };
+        return new UnionEnumeration<URL>(urls);
     }
 
     private boolean isNonOverridableResource(String name) {

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/OneClassLoaderPerJarClassLoaderBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/OneClassLoaderPerJarClassLoaderBuilder.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/OneClassLoaderPerJarClassLoaderBuilder.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/OneClassLoaderPerJarClassLoaderBuilder.java Wed Apr 22 18:52:43 2009
@@ -26,45 +26,60 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Enumeration;
+import java.io.IOException;
 
 import org.apache.geronimo.kernel.repository.Artifact;
 import org.apache.geronimo.kernel.repository.ClassLoadingRules;
 import org.apache.geronimo.kernel.repository.Environment;
 import org.apache.geronimo.kernel.repository.MissingDependencyException;
 import org.apache.geronimo.kernel.config.ConfigurationResolver;
+import org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader;
+import org.apache.geronimo.kernel.config.ClassLoaderHolder;
 
 /**
- *
  * @version $Rev:$ $Date:$
  */
 public class OneClassLoaderPerJarClassLoaderBuilder {
     public static final GlobalClassLoaderRegister GLOBAL_CL_REGISTER = new BasicGlobalClassLoaderRegister();
 
-    public ClassLoader build(Environment environment,
-            List<ClassLoader> parentClassLoaders,
-            ClassLoadingRules classLoadingRules,
-            LinkedHashMap<Artifact, URL[]> artifactToURL,
-            ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException {
-        Set<GlobalClassLoader> globalClassLoaders = retrieveGlobalClassLoaders(environment.getConfigId(), artifactToURL, configurationResolver);
-        return new MultiParentClassLoader2(environment.getConfigId(),
+    public ClassLoaderHolder build(Environment environment,
+                             List<ClassLoader> parentClassLoaders,
+                             ClassLoadingRules classLoadingRules,
+                             LinkedHashMap<Artifact, URL[]> dependencyUrls,
+                             URL[] resolvedClassPath,
+                             ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException {
+        Set<ConfigurationClassLoaderExtension> globalClassLoaders = retrieveGlobalClassLoaders(environment.getConfigId(), dependencyUrls, configurationResolver);
+        ClassLoader configurationClassLoader = new MultiParentClassLoader2(environment.getConfigId(),
+                resolvedClassPath,
                 globalClassLoaders,
                 parentClassLoaders.toArray(new ClassLoader[parentClassLoaders.size()]),
                 classLoadingRules);
+
+        ClassLoadingRules rules = environment.getClassLoadingRules();
+        ChildrenConfigurationClassLoader childrenConfigurationClassLoader = new ChildrenConfigurationClassLoader(configurationClassLoader, rules);
+        GLOBAL_CL_REGISTER.register(childrenConfigurationClassLoader);
+
+        return new ClassLoaderHolder(configurationClassLoader, childrenConfigurationClassLoader);
+    }
+
+    public static void unregister(ConfigurationClassLoaderExtension classLoader) {
+        GLOBAL_CL_REGISTER.unregister(classLoader);
     }
 
-    protected Set<GlobalClassLoader> retrieveGlobalClassLoaders(Artifact configId, LinkedHashMap<Artifact, URL[]> urls, ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException {
-        Set<GlobalClassLoader> classloaders = new HashSet<GlobalClassLoader>();
+    protected Set<ConfigurationClassLoaderExtension> retrieveGlobalClassLoaders(Artifact configId, LinkedHashMap<Artifact, URL[]> urls, ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException {
+        Set<ConfigurationClassLoaderExtension> classloaders = new HashSet<ConfigurationClassLoaderExtension>();
         URL artifactURL;
         try {
             artifactURL = configurationResolver.resolve(configId).toURL();
-            new MavenDependencyResolver().resolve(artifactURL, GLOBAL_CL_REGISTER);
+            new MavenDependencyResolver().resolve(artifactURL, GLOBAL_CL_REGISTER, configId);
         } catch (MissingDependencyException e) {
             //bootstrap configuration
         }
         for (Map.Entry<Artifact, URL[]> entry : urls.entrySet()) {
             Artifact artifact = entry.getKey();
             URL[] entryURLs = entry.getValue();
-            GlobalClassLoader classLoader;
+            ConfigurationClassLoaderExtension classLoader;
             synchronized (GLOBAL_CL_REGISTER) {
                 classLoader = GLOBAL_CL_REGISTER.retrieve(artifact);
                 if (null == classLoader) {
@@ -76,27 +91,52 @@
         return classloaders;
     }
 
-    protected GlobalClassLoader newGlobalClassLoader(Artifact artifact, URL[] urls, ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException {
+    protected ConfigurationClassLoaderExtension newGlobalClassLoader(Artifact artifact, URL[] urls, ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException {
         Set<Artifact> parents;
         try {
             parents = GLOBAL_CL_REGISTER.getParents(artifact);
         } catch (NullPointerException e) {
             throw new MissingDependencyException("Unregistered artifact", null, artifact);
         }
-        ClassLoader[] classLoaders;
+        ConfigurationClassLoaderExtension[] classLoaders;
         if (parents != null && !parents.isEmpty()) {
-            classLoaders = new ClassLoader[parents.size()];
+            classLoaders = new ConfigurationClassLoaderExtension[parents.size()];
             int i = 0;
-            for (Artifact parent: parents) {
-                GlobalClassLoader cl = GLOBAL_CL_REGISTER.retrieve(parent);
+            for (Artifact parent : parents) {
+                ConfigurationClassLoaderExtension cl = GLOBAL_CL_REGISTER.retrieve(parent);
                 if (cl == null) {
                     URL url = configurationResolver.resolve(parent).toURL();
-                    cl = newGlobalClassLoader(parent, new URL[] {url}, configurationResolver);
+                    cl = newGlobalClassLoader(parent, new URL[]{url}, configurationResolver);
                 }
                 classLoaders[i++] = cl;
             }
         } else {
-            classLoaders = new ClassLoader[] {getClass().getClassLoader()};
+            final ClassLoader root = getClass().getClassLoader();
+            classLoaders = new ConfigurationClassLoaderExtension[]{new ConfigurationClassLoaderExtension() {
+                public void addURL(URL url) {
+                }
+
+                public Class<?> loadClassInternal(String name, boolean resolve, List<ConfigurationClassLoaderExtension> visitedClassLoaders) throws ClassNotFoundException, MalformedURLException {
+                    visitedClassLoaders.add(this);
+                    return root.loadClass(name);
+                }
+
+                public void destroy() {
+                }
+
+                public URL findResource(String name) {
+                    return root.getResource(name);
+                }
+
+                public Enumeration<URL> findResources(String name) throws IOException {
+                    return root.getResources(name);
+                }
+
+                public Artifact getId() {
+                    return null;
+                }
+            }
+            };
         }
         GlobalClassLoader cl = new GlobalClassLoader(artifact, urls, classLoaders);
         GLOBAL_CL_REGISTER.register(cl);

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/classloading/DependencyResolverTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/classloading/DependencyResolverTest.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/classloading/DependencyResolverTest.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/classloading/DependencyResolverTest.java Wed Apr 22 18:52:43 2009
@@ -355,7 +355,7 @@
         MavenDependencyResolver resolver = new MavenDependencyResolver();
         InputStream in = new StringBufferInputStream(DOC);
         BasicGlobalClassLoaderRegister register = new BasicGlobalClassLoaderRegister();
-        resolver.addDependencies(register, in);
+        resolver.addDependencies(register, in, null);
         int size = register.graph.size();
 
     }

Modified: geronimo/sandbox/djencks/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/sharedlib/SharedLib.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/sharedlib/SharedLib.java?rev=767617&r1=767616&r2=767617&view=diff
==============================================================================
--- geronimo/sandbox/djencks/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/sharedlib/SharedLib.java (original)
+++ geronimo/sandbox/djencks/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/sharedlib/SharedLib.java Wed Apr 22 18:52:43 2009
@@ -42,6 +42,7 @@
     }
 
     private SharedLib(ClassLoader classLoader, String[] classesDirs, String[] libDirs, ServerInfo serverInfo) throws MalformedURLException {
+        if (classLoader instanceof MultiParentClassLoader){
         MultiParentClassLoader multiParentClassLoader = (MultiParentClassLoader) classLoader;
         Set currentUrls = new HashSet(Arrays.asList(multiParentClassLoader.getURLs()));
 
@@ -99,6 +100,7 @@
             URL url = (URL) iterator.next();
             multiParentClassLoader.addURL(url);
         }
+        }
     }
 
     public static final GBeanInfo GBEAN_INFO;