Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 6532 invoked from network); 10 Apr 2009 18:35:45 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 10 Apr 2009 18:35:45 -0000 Received: (qmail 75094 invoked by uid 500); 10 Apr 2009 18:35:44 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 75025 invoked by uid 500); 10 Apr 2009 18:35:44 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 74999 invoked by uid 99); 10 Apr 2009 18:35:44 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Apr 2009 18:35:44 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Apr 2009 18:35:38 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 11E0823889CF; Fri, 10 Apr 2009 18:35:17 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r763999 [2/4] - in /geronimo/sandbox/djencks/framework: buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/ buildsupport/car-maven-plugin/src/main/resources/META-INF/plexus/ buildsupport/car-maven-plugin/src/te... Date: Fri, 10 Apr 2009 18:35:12 -0000 To: scm@geronimo.apache.org From: djencks@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090410183517.11E0823889CF@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: geronimo/sandbox/djencks/framework/configs/jsr88-deploymentfactory/src/main/history/dependencies.xml URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/configs/jsr88-deploymentfactory/src/main/history/dependencies.xml?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/configs/jsr88-deploymentfactory/src/main/history/dependencies.xml (original) +++ geronimo/sandbox/djencks/framework/configs/jsr88-deploymentfactory/src/main/history/dependencies.xml Fri Apr 10 18:35:10 2009 @@ -7,73 +7,78 @@ car - javax.xml.bind - jaxb-api + org.apache.geronimo.framework + geronimo-common jar - commons-jexl - commons-jexl + org.apache.geronimo.framework + geronimo-kernel jar - org.apache.geronimo.framework - geronimo-plugin + org.slf4j + slf4j-log4j12 jar - org.apache.geronimo.framework - geronimo-deploy-jsr88-bootstrapper + org.slf4j + slf4j-api jar - org.apache.xbean - xbean-reflect + log4j + log4j jar - org.codehaus.woodstox - wstx-asl + org.apache.geronimo.framework + geronimo-logging jar - org.apache.geronimo.framework - geronimo-common + asm + asm jar - org.apache.geronimo.specs - geronimo-activation_1.1_spec + asm + asm-commons jar - org.codehaus.plexus - plexus-component-api + cglib + cglib-nodep jar - org.apache.geronimo.framework - geronimo-deploy-jsr88 + org.apache.xbean + xbean-reflect jar - org.apache.geronimo.framework - geronimo-deploy-config + com.thoughtworks.xstream + xstream jar - org.codehaus.plexus - plexus-utils + xpp3 + xpp3_min jar - org.apache.geronimo.specs - geronimo-stax-api_1.0_spec + org.apache.geronimo.framework + geronimo-crypto jar - asm - asm + org.apache.geronimo.framework + geronimo-system + jar + + + org.apache.geronimo.framework + geronimo-cli jar @@ -82,63 +87,63 @@ jar - com.thoughtworks.xstream - xstream + commons-jexl + commons-jexl jar - asm - asm-commons + org.slf4j + jul-to-slf4j jar - log4j - log4j + javax.xml.bind + jaxb-api jar - com.sun.xml.bind - jaxb-impl + org.apache.geronimo.specs + geronimo-stax-api_1.0_spec jar - org.codehaus.plexus - plexus-container-default + org.apache.geronimo.framework + geronimo-deploy-jsr88 jar org.apache.geronimo.framework - geronimo-kernel + geronimo-plugin jar - cglib - cglib-nodep + org.codehaus.plexus + plexus-archiver jar - org.apache.geronimo.framework - geronimo-crypto + org.codehaus.plexus + plexus-utils jar - xpp3 - xpp3_min + org.codehaus.plexus + plexus-container-default jar org.codehaus.plexus - plexus-archiver + plexus-component-api jar - org.slf4j - slf4j-api + org.apache.geronimo.framework + geronimo-deploy-config jar org.apache.geronimo.framework - geronimo-system + geronimo-deploy-jsr88-bootstrapper jar @@ -147,8 +152,18 @@ jar - org.apache.geronimo.framework - geronimo-cli + com.sun.xml.bind + jaxb-impl + jar + + + org.codehaus.woodstox + wstx-asl + jar + + + org.apache.geronimo.specs + geronimo-activation_1.1_spec jar Modified: geronimo/sandbox/djencks/framework/configs/online-deployer/src/main/history/dependencies.xml URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/configs/online-deployer/src/main/history/dependencies.xml?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/configs/online-deployer/src/main/history/dependencies.xml (original) +++ geronimo/sandbox/djencks/framework/configs/online-deployer/src/main/history/dependencies.xml Fri Apr 10 18:35:10 2009 @@ -7,63 +7,73 @@ car - javax.xml.bind - jaxb-api + org.apache.geronimo.framework + geronimo-common jar - commons-jexl - commons-jexl + org.apache.geronimo.framework + geronimo-kernel jar - org.apache.geronimo.framework - geronimo-plugin + org.slf4j + slf4j-log4j12 jar - org.apache.xbean - xbean-reflect + org.slf4j + slf4j-api jar - org.codehaus.woodstox - wstx-asl + log4j + log4j jar org.apache.geronimo.framework - geronimo-common + geronimo-logging jar - org.apache.geronimo.specs - geronimo-activation_1.1_spec + asm + asm jar - jline - jline + asm + asm-commons jar - org.codehaus.plexus - plexus-component-api + cglib + cglib-nodep jar - org.codehaus.plexus - plexus-utils + org.apache.xbean + xbean-reflect jar - org.apache.geronimo.specs - geronimo-stax-api_1.0_spec + com.thoughtworks.xstream + xstream jar - asm - asm + xpp3 + xpp3_min + jar + + + org.apache.geronimo.framework + geronimo-system + jar + + + org.apache.geronimo.framework + geronimo-cli jar @@ -72,68 +82,73 @@ jar - com.thoughtworks.xstream - xstream + org.apache.geronimo.framework + geronimo-crypto jar - asm - asm-commons + commons-jexl + commons-jexl jar - log4j - log4j + org.slf4j + jul-to-slf4j jar - org.codehaus.plexus - plexus-container-default + javax.xml.bind + jaxb-api jar - com.sun.xml.bind - jaxb-impl + org.apache.geronimo.specs + geronimo-stax-api_1.0_spec + jar + + + jline + jline jar org.apache.geronimo.framework - geronimo-kernel + geronimo-plugin jar - cglib - cglib-nodep + org.codehaus.plexus + plexus-archiver jar - xpp3 - xpp3_min + org.codehaus.plexus + plexus-utils jar - org.apache.geronimo.framework - geronimo-crypto + org.codehaus.plexus + plexus-container-default jar org.codehaus.plexus - plexus-archiver + plexus-component-api jar - org.slf4j - slf4j-api + com.sun.xml.bind + jaxb-impl jar - org.apache.geronimo.framework - geronimo-system + org.codehaus.woodstox + wstx-asl jar - org.apache.geronimo.framework - geronimo-cli + org.apache.geronimo.specs + geronimo-activation_1.1_spec jar Modified: geronimo/sandbox/djencks/framework/configs/shutdown/src/main/history/dependencies.xml URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/configs/shutdown/src/main/history/dependencies.xml?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/configs/shutdown/src/main/history/dependencies.xml (original) +++ geronimo/sandbox/djencks/framework/configs/shutdown/src/main/history/dependencies.xml Fri Apr 10 18:35:10 2009 @@ -7,158 +7,173 @@ car - javax.xml.bind - jaxb-api + org.apache.geronimo.framework + geronimo-deploy-tool jar - commons-jexl - commons-jexl + org.apache.geronimo.specs + geronimo-javaee-deployment_1.1MR3_spec jar - org.apache.xmlbeans - xmlbeans + org.apache.geronimo.framework + geronimo-service-builder jar org.apache.geronimo.framework - geronimo-plugin + geronimo-deployment jar org.apache.geronimo.framework - geronimo-deploy-tool + geronimo-system jar - org.apache.xbean - xbean-reflect + org.apache.xmlbeans + xmlbeans jar - org.apache.geronimo.framework - geronimo-common + xml-resolver + xml-resolver jar - jline - jline + org.slf4j + slf4j-api jar - org.codehaus.plexus - plexus-component-api + org.apache.geronimo.specs + geronimo-stax-api_1.0_spec jar org.apache.geronimo.framework - geronimo-deploy-config + geronimo-cli jar org.apache.geronimo.framework - geronimo-deploy-jsr88 + geronimo-kernel jar - org.codehaus.plexus - plexus-utils + commons-cli + commons-cli jar - org.apache.geronimo.specs - geronimo-stax-api_1.0_spec + org.apache.geronimo.framework + geronimo-deploy-jsr88 jar - asm - asm + org.apache.geronimo.framework + geronimo-common jar - commons-cli - commons-cli + org.apache.geronimo.framework + geronimo-plugin jar - com.thoughtworks.xstream - xstream + org.codehaus.plexus + plexus-archiver jar - asm - asm-commons + org.codehaus.plexus + plexus-utils jar - log4j - log4j + org.codehaus.plexus + plexus-container-default jar org.codehaus.plexus - plexus-container-default + plexus-component-api jar org.apache.geronimo.framework - geronimo-kernel + geronimo-deploy-config jar - xml-resolver - xml-resolver + jline + jline jar - cglib - cglib-nodep + org.slf4j + slf4j-log4j12 + jar + + + log4j + log4j jar org.apache.geronimo.framework - geronimo-crypto + geronimo-logging jar - xpp3 - xpp3_min + asm + asm jar - org.codehaus.plexus - plexus-archiver + asm + asm-commons jar - org.slf4j - slf4j-api + cglib + cglib-nodep jar - org.apache.geronimo.framework - geronimo-deployment + org.apache.xbean + xbean-reflect jar - org.apache.geronimo.framework - geronimo-system + com.thoughtworks.xstream + xstream jar - org.apache.geronimo.specs - geronimo-javaee-deployment_1.1MR3_spec + xpp3 + xpp3_min jar org.apache.geronimo.framework - geronimo-cli + geronimo-crypto jar - org.apache.geronimo.framework - geronimo-service-builder + commons-jexl + commons-jexl + jar + + + org.slf4j + jul-to-slf4j + jar + + + javax.xml.bind + jaxb-api jar Modified: geronimo/sandbox/djencks/framework/modules/geronimo-core/pom.xml URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-core/pom.xml?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-core/pom.xml (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-core/pom.xml Fri Apr 10 18:35:10 2009 @@ -34,6 +34,12 @@ org.apache.geronimo.framework + geronimo-kernel + ${version} + + + + org.apache.geronimo.framework geronimo-system ${version} @@ -43,6 +49,10 @@ geronimo-management ${version} + + org.apache.geronimo.specs + geronimo-j2ee-management_1.1_spec + Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/pom.xml URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/pom.xml?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/pom.xml (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/pom.xml Fri Apr 10 18:35:10 2009 @@ -33,6 +33,15 @@ + org.slf4j + slf4j-log4j12 + + + org.apache.geronimo.framework + geronimo-logging + ${version} + + asm asm Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/BasicGBeanInfoFactory.java Fri Apr 10 18:35:10 2009 @@ -73,6 +73,8 @@ return (GBeanInfo) method.invoke(null, new Object[]{}); } catch (Exception e) { throw new GBeanInfoFactoryException("Could not get GBeanInfo from class: " + className, e); + } catch (NoClassDefFoundError e) { + throw new GBeanInfoFactoryException("Could not get GBeanInfo from class: " + className, e); } } Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoBuilder.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoBuilder.java?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoBuilder.java (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/GBeanInfoBuilder.java Fri Apr 10 18:35:10 2009 @@ -292,7 +292,12 @@ public void addInterface(Class intf, String[] persistentAttributes, String[] manageableAttributes) { Set persistentNames = new HashSet(Arrays.asList(persistentAttributes)); Set manageableNames = new HashSet(Arrays.asList(manageableAttributes)); - Method[] methods = intf.getMethods(); + Method[] methods = new Method[0]; + try { + methods = intf.getMethods(); + } catch (NoClassDefFoundError e) { + throw (NoClassDefFoundError)new NoClassDefFoundError("could not get methods from interface: " + intf.getName() + " loaded in classLoader: " + intf.getClassLoader()).initCause(e); + } for (int i = 0; i < methods.length; i++) { Method method = methods[i]; if ("java.lang.Object".equals(method.getDeclaringClass().getName())) continue; Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/JarFileClassLoaderFactory.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/JarFileClassLoaderFactory.java?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/JarFileClassLoaderFactory.java (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/JarFileClassLoaderFactory.java Fri Apr 10 18:35:10 2009 @@ -141,13 +141,13 @@ log.debug(buf.toString()); } - if (Boolean.getBoolean("Xorg.apache.geronimo.OneClassLoaderPerJar")) { + if (true || Boolean.getBoolean("Xorg.apache.geronimo.OneClassLoaderPerJar")) { OneClassLoaderPerJarClassLoaderBuilder classLoaderBuilder = new OneClassLoaderPerJarClassLoaderBuilder(); - return classLoaderBuilder.build(environment, parentClassLoaders, classLoadingRules, artifactToURL); + return classLoaderBuilder.build(environment, parentClassLoaders, classLoadingRules, artifactToURL, configurationResolver); } URL[] urls = flattenedURLs(artifactToURL); - + // The JarFileClassLoader was created to address a locking problem seen only on Windows platforms. // It carries with it a slight performance penalty that needs to be addressed. Rather than make // *nix OSes carry this burden we'll engage the JarFileClassLoader for Windows or if the user Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/BasicGlobalClassLoaderRegister.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/BasicGlobalClassLoaderRegister.java?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/BasicGlobalClassLoaderRegister.java (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/classloading/BasicGlobalClassLoaderRegister.java Fri Apr 10 18:35:10 2009 @@ -21,36 +21,79 @@ import java.util.HashMap; import java.util.Map; +import java.util.Set; +import java.util.HashSet; import org.apache.geronimo.kernel.repository.Artifact; /** - * * @version $Rev:$ $Date:$ */ public class BasicGlobalClassLoaderRegister implements GlobalClassLoaderRegister { - protected final Map register; - + + final Map> graph = new HashMap>(); + final Map register; + final Map noVersionRegister; + public BasicGlobalClassLoaderRegister() { register = new HashMap(); + noVersionRegister = new HashMap(); + } + + public void register(Artifact child, Set parents) { + if (child == null) throw new NullPointerException("child required"); + if (parents == null) throw new NullPointerException("parents required"); + Set old = graph.put(child, parents); + if (old != null && !old.equals(parents)) { + HashSet removed = new HashSet(old); + removed.removeAll(parents); + HashSet added = new HashSet(parents); + added.removeAll(parents); + throw new IllegalArgumentException("parents of artifact: " + child + + " changed:\nold: " + old + + "\nnew: " + parents + + "\nremoved: " + removed + + "\n added: " + added); + } + } + + public void unregister(Artifact artifact) { + graph.remove(artifact); } - + + public Set getParents(Artifact artifact) { + Set parents = graph.get(artifact); + if (parents == null) throw new NullPointerException("artifact not known: " + artifact); + return parents; + } + public void register(GlobalClassLoader classLoader) { synchronized (register) { register.put(classLoader.getArtifact(), classLoader); + noVersionRegister.put(strip(classLoader.getArtifact()), classLoader); } } public void unregister(GlobalClassLoader classLoader) { synchronized (register) { register.remove(classLoader.getArtifact()); + register.remove(strip(classLoader.getArtifact())); } } public GlobalClassLoader retrieve(Artifact artifact) { synchronized (register) { - return register.get(artifact); + GlobalClassLoader cl = register.get(artifact); + if (cl == null) { + cl = noVersionRegister.get(strip(artifact)); + } + return cl; } } - + + private Artifact strip(Artifact artifact) { + return new Artifact(artifact.getGroupId(), artifact.getArtifactId(), (String) null, artifact.getType()); + } + + } 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=763999&r1=763998&r2=763999&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 Fri Apr 10 18:35:10 2009 @@ -19,6 +19,7 @@ package org.apache.geronimo.kernel.config.classloading; +import java.util.HashSet; import java.util.Set; import org.apache.geronimo.kernel.repository.Artifact; @@ -31,49 +32,81 @@ * @version $Rev:385718 $ $Date: 2009-02-16 18:23:27 +1100 (Mon, 16 Feb 2009) $ */ public final class DependencySAXHandler extends DefaultHandler { - private final Set dependencies; - private String currentString; + private final GlobalClassLoaderRegister register; + private StringBuilder currentString = new StringBuilder(); private boolean dependency; - private boolean exclusions; + private boolean parent; private String groupId; private String artifactId; - - public DependencySAXHandler(Set dependencies) { - if (null == dependencies) { - throw new IllegalArgumentException("dependencies is required"); + private String version; + private String type; + private Artifact child; + private Set parents; + + public DependencySAXHandler(GlobalClassLoaderRegister register) { + if (null == register) { + throw new IllegalArgumentException("register is required"); } - this.dependencies = dependencies; + this.register = register; } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if (name.equals("dependency")) { - dependency = true; - } else if (name.equals("exclusions")) { - exclusions = true; + if (dependency) { + parent = true; + if (child == null) { + child = getArtifact(); + } + } else { + dependency = true; + parents = new HashSet(); + } } } @Override public void endElement(String uri, String localName, String name) throws SAXException { - if (name.equals("groupId") && dependency && !exclusions) { - groupId = currentString; - } else if (name.equals("artifactId") && dependency && !exclusions) { - artifactId = currentString; + if (name.equals("groupId") && dependency) { + groupId = currentString.toString().trim(); + currentString = new StringBuilder(); + } else if (name.equals("artifactId") && dependency) { + artifactId = currentString.toString().trim(); + currentString = new StringBuilder(); + } else if (name.equals("version") && dependency) { + version = currentString.toString().trim(); + currentString = new StringBuilder(); + } else if (name.equals("type") && dependency) { + type = currentString.toString().trim(); + currentString = new StringBuilder(); } else if (name.equals("dependency")) { - if (null != groupId && null != artifactId) { - dependencies.add(new Artifact(groupId, artifactId, (String) null, null)); + if (parent) { + Artifact tmp = getArtifact(); + parents.add(tmp); + parent = false; + } else if (dependency) { + Artifact tmp = child == null? getArtifact(): child; + register.register(tmp, parents); + dependency = false; + parents = null; + child = null; } - dependency = false; - groupId = null; - artifactId = null; - } else if (name.equals("exclusions")) { - exclusions = false; } } + private Artifact getArtifact() { + Artifact tmp = new Artifact(groupId, artifactId, version, type == null? "jar": type); + groupId = null; + artifactId = null; + version = null; + type = null; + return tmp; + } + @Override public void characters(char[] ch, int start, int length) throws SAXException { - currentString = new String(ch, start, length); + if (dependency) { + currentString.append(ch, start, length); + } } } \ No newline at end of file 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=763999&r1=763998&r2=763999&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 Fri Apr 10 18:35:10 2009 @@ -29,6 +29,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import java.util.Collections; import java.util.concurrent.CopyOnWriteArraySet; import org.apache.geronimo.kernel.config.ChildrenConfigurationClassLoader; @@ -45,11 +46,18 @@ private final Artifact artifact; private final Set dependencies; - private final CopyOnWriteArraySet listeners; - private final CopyOnWriteArraySet resourcesNotFound; - private final CopyOnWriteArraySet flattenedParents; + private final CopyOnWriteArraySet listeners = new CopyOnWriteArraySet(); + private final CopyOnWriteArraySet resourcesNotFound = new CopyOnWriteArraySet(); + private final CopyOnWriteArraySet flattenedParents = new CopyOnWriteArraySet(); private ClassLoader[] parents; - + + public GlobalClassLoader(Artifact artifact, URL[] urls, ClassLoader[] parents) { + super(urls); + this.artifact = artifact; + this.parents = parents; + dependencies = Collections.emptySet(); + } + public GlobalClassLoader(Artifact artifact, URL[] urls, Set dependencies) { super(urls); if (null == dependencies) { @@ -58,9 +66,6 @@ this.artifact = artifact; this.dependencies = dependencies; - listeners = new CopyOnWriteArraySet(); - resourcesNotFound = new CopyOnWriteArraySet(); - flattenedParents = new CopyOnWriteArraySet(); parents = new ClassLoader[] { ClassLoader.getSystemClassLoader() }; } @@ -215,14 +220,14 @@ for (ClassLoader parent : parents) { Enumeration urls = parent.getResources(name); while (urls.hasMoreElements()) { - URL url = (URL) urls.nextElement(); + URL url = urls.nextElement(); foundResources.add(url); } } Enumeration urls = findResources(name); while (urls.hasMoreElements()) { - URL url = (URL) urls.nextElement(); + URL url = urls.nextElement(); foundResources.add(url); } 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=763999&r1=763998&r2=763999&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 Fri Apr 10 18:35:10 2009 @@ -29,5 +29,5 @@ * @version $Rev:$ $Date:$ */ public interface GlobalClassLoaderDependencyResolver { - Set resolve(Artifact artifact, URL[] urls); + void resolve(URL url, GlobalClassLoaderRegister register); } 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=763999&r1=763998&r2=763999&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 Fri Apr 10 18:35:10 2009 @@ -19,6 +19,8 @@ package org.apache.geronimo.kernel.config.classloading; +import java.util.Set; + import org.apache.geronimo.kernel.repository.Artifact; /** @@ -31,4 +33,10 @@ void unregister(GlobalClassLoader classLoader); GlobalClassLoader retrieve(Artifact artifact); + + void register(Artifact child, Set parents); + + void unregister(Artifact artifact); + + Set getParents(Artifact artifact); } 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=763999&r1=763998&r2=763999&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 Fri Apr 10 18:35:10 2009 @@ -20,70 +20,72 @@ package org.apache.geronimo.kernel.config.classloading; import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.apache.geronimo.kernel.repository.Artifact; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; /** - * + * Given a URL to an artifact in a maven repo, say .jar, attempts to read dependencies out of + * the maven pom at .pom and a geronimo specific -additional.xml + * * @version $Rev:$ $Date:$ */ public class MavenDependencyResolver implements GlobalClassLoaderDependencyResolver { + private static final Logger log = LoggerFactory.getLogger(MavenDependencyResolver.class); - public Set resolve(Artifact artifact, URL[] urls) { - if (urls.length != 1) { - return Collections.emptySet(); + public void resolve(URL url, GlobalClassLoaderRegister register) { + try { + InputStream in = locateDependencyDeclaration(url); + try { + addDependencies(register, in); + } finally { + in.close(); + } + } catch (IOException e) { + //ignore } - URL url = urls[0]; - - Set dependencies = new HashSet(); - - URL dependencyDeclaration = locateDependencyDeclaration(url); - addDependencies(dependencies, dependencyDeclaration); - - dependencyDeclaration = locateAdditionalDependencyDeclaration(url); - addDependencies(dependencies, dependencyDeclaration); - - return dependencies; + } - protected void addDependencies(Set dependencies, URL dependencyDeclaration) { + void addDependencies(GlobalClassLoaderRegister register, InputStream dependencyDeclaration) { SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser parser = factory.newSAXParser(); - parser.parse(dependencyDeclaration.openStream(), new DependencySAXHandler(dependencies)); + parser.parse(dependencyDeclaration, new DependencySAXHandler(register)); + } catch (NullPointerException e) { + log.error("error parsing " + dependencyDeclaration, e); } catch (SAXException e) { - e.printStackTrace(); + log.error("error parsing " + dependencyDeclaration, e); } catch (ParserConfigurationException e) { - e.printStackTrace(); + log.error("error parsing " + dependencyDeclaration, e); } catch (IOException e) { + //missing/unreadable file } } - protected URL locateDependencyDeclaration(URL url) { - String urlAsString = url.toString(); - String pomAsString = trimExtension(urlAsString) + ".pom"; - try { - return new URL(pomAsString); - } catch (MalformedURLException e) { - throw new AssertionError(e); - } - } - - protected URL locateAdditionalDependencyDeclaration(URL url) { + protected InputStream locateDependencyDeclaration(URL url) throws IOException { String urlAsString = url.toString(); - String overrideAsString = trimExtension(urlAsString) + "-additional.xml"; + String pomAsString = trimExtension(urlAsString) + ".plugin-metadata"; try { - return new URL(overrideAsString); + try { + return new URL(pomAsString).openStream(); + } catch (IOException e) { + String metadata = trimFile(urlAsString) + "/geronimo-plugin.xml"; + try { + return new URL(metadata).openStream(); + } catch (IOException e1) { + String internalMetadata = urlAsString + "/META-INF/geronimo-plugin.xml"; + return new URL(internalMetadata).openStream(); + } + } } catch (MalformedURLException e) { throw new AssertionError(e); } @@ -93,4 +95,8 @@ return urlAsString.substring(0, urlAsString.lastIndexOf('.')); } + protected String trimFile(String urlAsString) { + return urlAsString.substring(0, urlAsString.lastIndexOf('/')); + } + } 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=763999&r1=763998&r2=763999&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 Fri Apr 10 18:35:10 2009 @@ -55,65 +55,62 @@ */ public class MultiParentClassLoader2 extends URLClassLoader implements ConfigurationClassLoaderExtension { private static final Logger log = LoggerFactory.getLogger(MultiParentClassLoader2.class); + //set up what kind of classloading strategy we will use. - private final Artifact id; - private final ClassLoader[] parents; - private final ClassLoadingRules classLoadingRules; - private boolean destroyed = false; - private Set resourcesNotFound = new HashSet(); - - // I used this pattern as its temporary and with the static final we get compile time + // I used this pattern as its temporary and with the static final we get compile time // optimizations. private final static int classLoaderSearchMode; private final static int ORIGINAL_SEARCH = 1; private final static int OPTIMIZED_SEARCH = 2; private final static boolean LONG_CLASSLOADER_TO_STRING = false; - + static { - // Extract the classLoaderSearchMode if specified. If not, default to "safe". - String mode = System.getProperty("Xorg.apache.geronimo.kernel.config.MPCLSearchOption"); - int runtimeMode = OPTIMIZED_SEARCH; // Default to optimized - String runtimeModeMessage = "Original Classloading"; - if (mode != null) { - if (mode.equals("safe")) { + // Extract the classLoaderSearchMode if specified. If not, default to "safe". + String mode = System.getProperty("Xorg.apache.geronimo.kernel.config.MPCLSearchOption"); + int runtimeMode = OPTIMIZED_SEARCH; // Default to optimized + String runtimeModeMessage = "Original Classloading"; + if (mode != null) { + if (mode.equals("safe")) { runtimeMode = ORIGINAL_SEARCH; runtimeModeMessage = "Safe ClassLoading"; - } else if (mode.equals("optimized")) - runtimeMode = OPTIMIZED_SEARCH; - } - - classLoaderSearchMode = runtimeMode; - LoggerFactory.getLogger(MultiParentClassLoader2.class).info( - "ClassLoading behaviour has changed. The "+runtimeModeMessage+" mode is in effect. If you are experiencing a problem\n"+ - "you can change the behaviour by specifying -DXorg.apache.geronimo.kernel.config.MPCLSearchOption= property. Specify \n"+ - "=\"safe\" to revert to the original behaviour. This is a temporary change until we decide whether or not to make it\n"+ - "permanent for the 2.0 release"); + } else if (mode.equals("optimized")) + runtimeMode = OPTIMIZED_SEARCH; + } + + classLoaderSearchMode = runtimeMode; + LoggerFactory.getLogger(MultiParentClassLoader2.class).info( + "ClassLoading behaviour has changed. The " + runtimeModeMessage + " mode is in effect. If you are experiencing a problem\n" + + "you can change the behaviour by specifying -DXorg.apache.geronimo.kernel.config.MPCLSearchOption= property. Specify \n" + + "=\"safe\" to revert to the original behaviour. This is a temporary change until we decide whether or not to make it\n" + + "permanent for the 2.0 release"); } - + + + private final Artifact id; + //explicit parents, normally MultiParentClassLoader2 instances. These follow the classloading rules so can modify the visibility of + //contained classes. + private final ClassLoader[] parents; + private final ClassLoadingRules classLoadingRules; + private boolean destroyed = false; + private Set resourcesNotFound = new HashSet(); + + //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 classloaders; - + public MultiParentClassLoader2(Artifact id, - Set globalClassLoaders, - ClassLoader[] parents, - ClassLoadingRules classLoadingRules) { + Set globalClassLoaders, + ClassLoader[] parents, + ClassLoadingRules classLoadingRules) { super(new URL[0]); this.id = id; this.classloaders = globalClassLoaders; this.parents = parents; this.classLoadingRules = classLoadingRules; - - addParents(globalClassLoaders); - - ClassLoaderRegistry.add(this); - } - protected void addParents(Set globalClassLoaders) { - for (GlobalClassLoader globalClassLoader : globalClassLoaders) { - for (ClassLoader parent : parents) { - globalClassLoader.addParent(parent); - } - } + + ClassLoaderRegistry.add(this); } /** @@ -140,19 +137,19 @@ } /** - * TODO This method should be removed and replaced with the best classLoading option. Its intent is to + * TODO This method should be removed and replaced with the best classLoading option. Its intent is to * provide a way for folks to switch back to the old classLoader if this fix breaks something. */ protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - if (classLoaderSearchMode == ORIGINAL_SEARCH) - return loadSafeClass(name, resolve); - else - return loadOptimizedClass(name, resolve); + if (classLoaderSearchMode == ORIGINAL_SEARCH) + return loadSafeClass(name, resolve); + else + return loadOptimizedClass(name, resolve); } - + /** * This method executes the old class loading behaviour before optimization. - * + * * @param name * @param resolve * @return @@ -223,22 +220,20 @@ } throw new ClassNotFoundException(name + " in classloader " + id); - } - + } + /** - * * Optimized classloading. - * - * This method is the normal way to resolve class loads. This method recursively calls its parents to resolve + *

+ * This method is the normal way to resolve class loads. This method recursively calls its parents to resolve * classloading requests. Here is the sequence of operations: - * - * 1. Call findLoadedClass to see if we already have this class loaded. - * 2. If this class is a java.* or data primitive class, call the SystemClassLoader. - * 3. If inverse loading and class is not in the non-overridable list, check the local ClassLoader. - * 4. If the class is not a hidden class, search our parents, recursively. Keeping track of which parents have already been called. - * Since MultiParentClassLoaders can appear more than once we do not search an already searched ClassLoader. - * 5. Finally, search this ClassLoader. - * + *

+ * 1. Call findLoadedClass to see if we already have this class loaded. + * 2. If this class is a java.* or data primitive class, call the SystemClassLoader. + * 3. If inverse loading and class is not in the non-overridable list, check the local ClassLoader. + * 4. If the class is not a hidden class, search our parents, recursively. Keeping track of which parents have already been called. + * Since MultiParentClassLoaders can appear more than once we do not search an already searched ClassLoader. + * 5. Finally, search this ClassLoader. */ protected synchronized Class loadOptimizedClass(String name, boolean resolve) throws ClassNotFoundException { @@ -261,7 +256,7 @@ name.equals("double") || name.equals("long")) { try { - return resolveClass(findSystemClass(name), resolve); + return resolveClass(findSystemClass(name), resolve); } catch (ClassNotFoundException cnfe) { // ignore...just being a good citizen. } @@ -277,18 +272,18 @@ } catch (ClassNotFoundException ignored) { } } - + // // Check parent class loaders // if (!isHiddenClass(name)) { - try { - LinkedList visitedClassLoaders = new LinkedList(); + try { + LinkedList visitedClassLoaders = new LinkedList(); Class clazz = checkParents(name, resolve, visitedClassLoaders); if (clazz != null) return resolveClass(clazz, resolve); - } catch (ClassNotFoundException cnfe) { - // ignore - } + } catch (ClassNotFoundException cnfe) { + // ignore + } } // @@ -307,7 +302,7 @@ throw new ClassNotFoundException(name + " in classloader " + id); } - + @Override protected Class findClass(String name) throws ClassNotFoundException { LinkedList visitedClassLoaders = new LinkedList(); @@ -326,13 +321,13 @@ } throw new ClassNotFoundException(); } - + /** * This method is an internal hook that allows us to be performant on Class lookups when multiparent * classloaders are involved. We can bypass certain lookups that have already occurred in the initiating * classloader. Also, we track the classLoaders that are visited by adding them to an already vistied list. * In this way, we can bypass redundant checks for the same class. - * + * * @param name * @param visitedClassLoaders * @return @@ -352,13 +347,13 @@ // if (!isHiddenClass(name)) { try { - Class clazz = checkParents(name, resolve, visitedClassLoaders); - if (clazz != null) return resolveClass(clazz,resolve); + Class clazz = checkParents(name, resolve, visitedClassLoaders); + if (clazz != null) return resolveClass(clazz, resolve); } catch (ClassNotFoundException cnfe) { - // ignore + // ignore } } - + // // if we are not using inverse class loading, check local urls now // @@ -366,7 +361,7 @@ // have alredy checked he parent and the parent didn't have the // class, so we can override now if (!isDestroyed()) { - Class clazz = findClass(name, visitedClassLoaders); + Class clazz = findClass(name, visitedClassLoaders); return resolveClass(clazz, resolve); } @@ -374,12 +369,12 @@ } /** - * In order to optimize the classLoading process and visit a directed set of - * classloaders this internal method for Geronimo MultiParentClassLoaders + * In order to optimize the classLoading process and visit a directed set of + * classloaders this internal method for Geronimo MultiParentClassLoaders * is used. Effectively, as each classloader is visited it is passed a linked * list of classloaders that have already been visited and can safely be skipped. * This method assumes the context of an MPCL and is not for use external to this class. - * + * * @param name * @param visitedClassLoaders * @return @@ -390,24 +385,24 @@ if (!visitedClassLoaders.contains(parent)) { visitedClassLoaders.add(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) { + 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); if (clazz != null) return resolveClass(clazz, resolve); - } else { - return parent.loadClass(name); - } - } catch (ClassNotFoundException cnfe) { + } else { + return 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 boolean isNonOverridableClass(String name) { @@ -488,7 +483,7 @@ } return null; } - + public Enumeration findResources(String name) throws IOException { if (isDestroyed()) { return Collections.enumeration(Collections.EMPTY_SET); @@ -501,7 +496,7 @@ return new UnionEnumeration(enumerations); } - + protected void recursiveFind(Set knownClassloaders, List> enumerations, String name) throws IOException { if (isDestroyed() || knownClassloaders.contains(this)) { return; @@ -546,7 +541,7 @@ } }; } - + private boolean isNonOverridableResource(String name) { ClassLoadingRule nonOverrideableRule = classLoadingRules.getNonOverrideableRule(); return nonOverrideableRule.isFilteredResource(name); @@ -571,7 +566,7 @@ return; } if (childClassLoader instanceof MultiParentClassLoader2) { - for (ClassLoader cl: ((MultiParentClassLoader2)childClassLoader).parents) { + for (ClassLoader cl : ((MultiParentClassLoader2) childClassLoader).parents) { ancestors.add(cl); getAncestorsInternal(ancestors, cl); } @@ -581,7 +576,7 @@ getAncestorsInternal(ancestors, cl); } } - + public String toString() { StringBuilder b = new StringBuilder(); if (LONG_CLASSLOADER_TO_STRING) { @@ -596,14 +591,14 @@ b.append(indent).append("[").append(getClass().getName()).append(" id=").append(id).append("]\n"); b.append(indent).append("urls:\n"); String newIndent = indent + " "; - for (URL url: getURLs()) { + for (URL url : getURLs()) { b.append(newIndent).append(url).append("\n"); } b.append(indent).append("parents:\n"); - for (ClassLoader cl: parents) { + for (ClassLoader cl : parents) { if (cl instanceof MultiParentClassLoader2) { - ((MultiParentClassLoader2)cl).toBuilder(b, newIndent); + ((MultiParentClassLoader2) cl).toBuilder(b, newIndent); } else { b.append(newIndent).append(cl.toString()).append("\n"); } @@ -662,5 +657,5 @@ ClassLoaderRegistry.remove(this); super.finalize(); } - + } 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=763999&r1=763998&r2=763999&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 Fri Apr 10 18:35:10 2009 @@ -20,6 +20,7 @@ package org.apache.geronimo.kernel.config.classloading; import java.net.URL; +import java.net.MalformedURLException; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -29,27 +30,37 @@ 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; /** * * @version $Rev:$ $Date:$ */ public class OneClassLoaderPerJarClassLoaderBuilder { - private static final GlobalClassLoaderRegister GLOBAL_CL_REGISTER = new BasicGlobalClassLoaderRegister(); + public static final GlobalClassLoaderRegister GLOBAL_CL_REGISTER = new BasicGlobalClassLoaderRegister(); public ClassLoader build(Environment environment, List parentClassLoaders, ClassLoadingRules classLoadingRules, - LinkedHashMap artifactToURL) { - Set globalClassLoaders = retrieveGlobalClassLoaders(environment.getConfigId(), artifactToURL); + LinkedHashMap artifactToURL, + ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException { + Set globalClassLoaders = retrieveGlobalClassLoaders(environment.getConfigId(), artifactToURL, configurationResolver); return new MultiParentClassLoader2(environment.getConfigId(), globalClassLoaders, parentClassLoaders.toArray(new ClassLoader[parentClassLoaders.size()]), classLoadingRules); } - protected Set retrieveGlobalClassLoaders(Artifact configId, LinkedHashMap urls) { + protected Set retrieveGlobalClassLoaders(Artifact configId, LinkedHashMap urls, ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException { Set classloaders = new HashSet(); + URL artifactURL; + try { + artifactURL = configurationResolver.resolve(configId).toURL(); + new MavenDependencyResolver().resolve(artifactURL, GLOBAL_CL_REGISTER); + } catch (MissingDependencyException e) { + //bootstrap configuration + } for (Map.Entry entry : urls.entrySet()) { Artifact artifact = entry.getKey(); URL[] entryURLs = entry.getValue(); @@ -57,23 +68,39 @@ synchronized (GLOBAL_CL_REGISTER) { classLoader = GLOBAL_CL_REGISTER.retrieve(artifact); if (null == classLoader) { - classLoader = newGlobalClassLoader(artifact, entryURLs); - GLOBAL_CL_REGISTER.register(classLoader); + classLoader = newGlobalClassLoader(artifact, entryURLs, configurationResolver); } } classloaders.add(classLoader); } - - HierarchyHandler hierarchyHandler = new HierarchyHandler(); - hierarchyHandler.buildHierarchy(classloaders); - return classloaders; } - protected GlobalClassLoader newGlobalClassLoader(Artifact artifact, URL[] urls) { - GlobalClassLoaderDependencyResolver resolver = new MavenDependencyResolver(); - Set dependencies = resolver.resolve(artifact, urls); - return new GlobalClassLoader(artifact, urls, dependencies); + protected GlobalClassLoader newGlobalClassLoader(Artifact artifact, URL[] urls, ConfigurationResolver configurationResolver) throws MissingDependencyException, MalformedURLException { + Set parents; + try { + parents = GLOBAL_CL_REGISTER.getParents(artifact); + } catch (NullPointerException e) { + throw new MissingDependencyException("Unregistered artifact", null, artifact); + } + ClassLoader[] classLoaders; + if (parents != null && !parents.isEmpty()) { + classLoaders = new ClassLoader[parents.size()]; + int i = 0; + for (Artifact parent: parents) { + GlobalClassLoader cl = GLOBAL_CL_REGISTER.retrieve(parent); + if (cl == null) { + URL url = configurationResolver.resolve(parent).toURL(); + cl = newGlobalClassLoader(parent, new URL[] {url}, configurationResolver); + } + classLoaders[i++] = cl; + } + } else { + classLoaders = new ClassLoader[] {getClass().getClassLoader()}; + } + GlobalClassLoader cl = new GlobalClassLoader(artifact, urls, classLoaders); + GLOBAL_CL_REGISTER.register(cl); + return cl; } } Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ImportType.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ImportType.java?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ImportType.java (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ImportType.java Fri Apr 10 18:35:10 2009 @@ -29,12 +29,12 @@ private static final Map typesByName = new HashMap(); // todo this class imples that there are only classes and services... is that true? - public static final ImportType ALL = new ImportType("ALL"); - public static final ImportType CLASSES = new ImportType("CLASSES"); - public static final ImportType SERVICES = new ImportType("SERVICES"); + public static final ImportType ALL = new ImportType("all"); + public static final ImportType CLASSES = new ImportType("classes"); + public static final ImportType SERVICES = new ImportType("services"); public static ImportType getByName(String name) { - ImportType type = (ImportType) typesByName.get(name.toUpperCase()); + ImportType type = (ImportType) typesByName.get(name.toLowerCase()); if (type == null) throw new IllegalStateException("Unknown import type: " + name); return type; } Modified: geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java?rev=763999&r1=763998&r2=763999&view=diff ============================================================================== --- geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java (original) +++ geronimo/sandbox/djencks/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ConfigurationManagerTest.java Fri Apr 10 18:35:10 2009 @@ -671,8 +671,6 @@ assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(artifactManagerData.getAbstractName())); ArtifactManager artifactManager = (ArtifactManager) kernel.getGBean(artifactManagerData.getAbstractName()); - ListableRepository testRepository = new MockRepository(configurations.keySet()); - DefaultArtifactResolver artifactResolver = new DefaultArtifactResolver(artifactManager, testRepository); artifact1 = new Artifact("test", "1", "1.1", "bar"); artifact2 = new Artifact("test", "2", "2.2", "bar"); @@ -712,6 +710,8 @@ configurations.put(artifact3NoVersion, configurationData3newer); } + ListableRepository testRepository = new MockRepository(configurations.keySet()); + DefaultArtifactResolver artifactResolver = new DefaultArtifactResolver(artifactManager, testRepository); configurationManager = new KernelConfigurationManager(kernel, Collections.singleton(configStore),