geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Joe Bohn <joe.b...@earthlink.net>
Subject Re: svn commit: r712326 - in /geronimo/server/trunk: framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/ framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ framework/modules/geronimo
Date Tue, 11 Nov 2008 22:09:08 GMT
I'm confused and perhaps concerned about this change as well.

First, I notice that we're still using OpenEJB 3.1-SNAPSHOT and 
apparently this is changing enough that we required new SNAPSHOTS 
published.  However, I also see the OpenEJB 3.1 was released on 10/23. 
So, why is there still an OpenEJB 3.1-SNAPSHOT and why is it still 
changing such that we needed to have it published again?

Second, assuming OpenEJB 3.1-SNAPSHOT is really a continuation of the 
3.1 branch (ie. 3.1.*-SNAPSHOT) then I'm also concerned that we are 
making changes that leaves us dependent on yet another OpenEJB release. 
  We are hoping for a mid-December Geronimo 2.2 release.  I'm not sure 
that it is very likely we will get an OpenEJB 3.1.* release out prior to 
that deadline.

How critical is this change for our 2.2 release?  Could it perhaps be 
reverted and reintroduced after we release 2.2?   I didn't see any 
mention of this feature in our discussions of functions that we were 
trying to include in 2.2.

Joe




Jason Warner wrote:
> I believe this change is causing failures in both the geronimo testsuite 
> and tck.  For an example of this, try running the concurrent-testsuite.  
> The test will hang indefinitely and viewing the output logs in 
> geronimo.home/testsuite/target/geronimo-logs will show the following 
> error being outputted repeatedly.  Could this be related to the new 
> openejb snapshot?
> 
> java.util.concurrent.ExecutionException: 
> java.lang.IllegalArgumentException: can't parse argument number
>     at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205)
>     at java.util.concurrent.FutureTask.get(FutureTask.java:80)
>     at org.apache.openejb.util.Memoizer.compute(Memoizer.java:53)
>     at org.apache.openejb.util.Logger.formatMessage(Logger.java:185)
>     at org.apache.openejb.util.Logger.info 
> <http://org.apache.openejb.util.Logger.info>(Logger.java:354)
>     at 
> org.apache.openejb.core.transaction.JtaTransactionPolicy.suspendTransaction(JtaTransactionPolicy.java:242)
>     at 
> org.apache.openejb.core.transaction.TxBeanManaged.<init>(TxBeanManaged.java:34)
>     at 
> org.apache.openejb.core.transaction.JtaTransactionPolicyFactory.createTransactionPolicy(JtaTransactionPolicyFactory.java:48)
>     at 
> org.apache.openejb.core.transaction.EjbTransactionUtil.createTransactionPolicy(EjbTransactionUtil.java:55)
>     at 
> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:200)
>     at 
> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:169)
>     at 
> org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:238)
>     at 
> org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:129)
>     at 
> org.apache.openejb.server.ejbd.EjbDaemon.processEjbRequest(EjbDaemon.java:196)
>     at org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:149)
>     at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:71)
>     at 
> org.apache.openejb.server.ejbd.KeepAliveServer$Session.service(KeepAliveServer.java:213)
>     at 
> org.apache.openejb.server.ejbd.KeepAliveServer.service(KeepAliveServer.java:233)
>     at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:66)
>     at org.apache.openejb.server.ServicePool$2.run(ServicePool.java:91)
>     at org.apache.openejb.server.ServicePool$3.run(ServicePool.java:120)
>     at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
>     at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
>     at java.lang.Thread.run(Thread.java:613)
> Caused by: java.lang.IllegalArgumentException: can't parse argument number
>     at java.text.MessageFormat.makeFormat(MessageFormat.java:1330)
>     at java.text.MessageFormat.applyPattern(MessageFormat.java:450)
>     at java.text.MessageFormat.<init>(MessageFormat.java:350)
>     at org.apache.openejb.util.Logger$4.compute(Logger.java:108)
>     at org.apache.openejb.util.Logger$4.compute(Logger.java:107)
>     at org.apache.openejb.util.Memoizer$1.call(Memoizer.java:42)
>     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
>     at java.util.concurrent.FutureTask.run(FutureTask.java:123)
>     at org.apache.openejb.util.Memoizer.compute(Memoizer.java:49)
>     ... 21 more
> 
> 
> On Tue, Nov 11, 2008 at 11:46 AM, Jason Warner <jaw981@gmail.com 
> <mailto:jaw981@gmail.com>> wrote:
> 
> 
> 
>     On Tue, Nov 11, 2008 at 8:44 AM, Gianny Damour
>     <gianny.damour@optusnet.com.au
>     <mailto:gianny.damour@optusnet.com.au>> wrote:
> 
>         Hi,
> 
>         David B published OpenEJB artifacts for me as I lost my Apache
>         private key and I can't remember my account password... The
>         build is not fixed.
> 
> 
>     I committed some depencies.xml changes that fix the build.  Thanks
>     for handling the snapshot.
> 
> 
>         As pointed out by David J the change is backward compatible and
>         I decided to keep the same namespace due to this reason. As I
>         did not change the namespace, I also did not change the XSD file
>         name. Thinking more about it, I now think that it would be
>         better to change the file name as suggested by David. Something
>         like geronimo-module-1.2.1.xsd. I will make this change.
> 
>         Thanks,
>         Gianny
> 
> 
>         On 11/11/2008, at 9:33 AM, David Jencks wrote:
> 
> 
>             On Nov 10, 2008, at 12:17 PM, Jarek Gawor wrote:
> 
>                 Hi,
> 
>                 We've had discussions about changing existing/published
>                 schemas before
>                 but I can't find any specific decisions/conclusions on
>                 it. Does
>                 anybody remember what was the conclusion of these
>                 discussions? I
>                 thought we were not supposed to change the
>                 existing/published schemas
>                 and this commit changes the geronimo-module-1.2.xsd file.
> 
> 
>             The (probably undocumented) policy has been to change the
>             schema version number in the file name whenever it changes,
>             and also the uri identifying the namespace.  This causes a
>             lot of headaches and namespace conversion code updates.  I
>             think we should consider _not_ changing at least the
>             namespace uri when, as here, the schema updates don't break
>             backward compatibility.  I believe I once saw some
>             discussion that indicated that frequent namespace changes
>             were generally a bad idea..... wish I knew where it was.
> 
>             thanks
>             david jencks
> 
> 
> 
>                 Jarek
> 
>                 On Mon, Nov 10, 2008 at 3:02 PM, Gianny Damour
>                 <gianny.damour@optusnet.com.au
>                 <mailto:gianny.damour@optusnet.com.au>> wrote:
> 
>                     Hi Jason,
> 
>                     I updated the openejb-jee module
>                     (openejb/trunk/openejb3/container/openejb-jee) in
>                     order to support the new
>                     private-classes element. Should I manually deploy a
>                     new snapshot? Sorry, I
>                     do not remember the policy.
> 
>                     Thanks,
>                     Gianny
> 
>                     On 11/11/2008, at 3:51 AM, Jason Warner wrote:
> 
>                         Hi Gianny,
> 
>                         I'm having trouble building trunk due to an
>                         error[1] that seems related to
>                         this addition.  Any thoughts?
> 
>                         Thanks!
> 
>                         [1]
>                         [severity=ERROR,message=unexpected element
>                         (uri:"http://geronimo.apache.org/xml/ns/deployment-1.2",
>                         local:"private-classes"). Expected elements are
>                         <{http://geronimo.apache.org/xml/ns/deployment-1.2}inverse-
>                         <http://geronimo.apache.org/xml/ns/deployment-1.2%7Dinverse->classloading>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}hidden-classes>,
> 
>                         <{http://geronimo.apache.org/xml/ns/deployment-1.2}non-
>                         <http://geronimo.apache.org/xml/ns/deployment-1.2%7Dnon->overridable-classes>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}moduleId>,
> 
>                         <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress-
>                         <http://geronimo.apache.org/xml/ns/deployment-1.2%7Dsuppress->default-environment>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}dependencies>,locator=[node=null,object=null,url=null,line=19,col=27,offset=-1]]
>                         [INFO]
>                         ------------------------------------------------------------------------
>                         [ERROR] BUILD ERROR
>                         [INFO]
>                         ------------------------------------------------------------------------
>                         [INFO] could not package plugin
> 
>                         Embedded error: Failed parsing descriptors for
>                         module:
>                         /Users/jason/trunk/plugins/mejb/geronimo-mejb/target/geronimo-mejb-2.2-SNAPSHOT.jar
>                         unexpected element
>                         (uri:"http://geronimo.apache.org/xml/ns/deployment-1.2",
>                         local:"private-classes"). Expected elements are
>                         <{http://geronimo.apache.org/xml/ns/deployment-1.2}inverse-
>                         <http://geronimo.apache.org/xml/ns/deployment-1.2%7Dinverse->classloading>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}hidden-classes>,
> 
>                         <{http://geronimo.apache.org/xml/ns/deployment-1.2}non-
>                         <http://geronimo.apache.org/xml/ns/deployment-1.2%7Dnon->overridable-classes>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}moduleId>,
> 
>                         <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress-
>                         <http://geronimo.apache.org/xml/ns/deployment-1.2%7Dsuppress->default-environment>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}dependencies>
> 
> 
>                         On Fri, Nov 7, 2008 at 7:40 PM,
>                         <gdamour@apache.org <mailto:gdamour@apache.org>>
>                         wrote:
>                         Author: gdamour
>                         Date: Fri Nov  7 16:40:08 2008
>                         New Revision: 712326
> 
>                         URL:
>                         http://svn.apache.org/viewvc?rev=712326&view=rev
>                         <http://svn.apache.org/viewvc?rev=712326&view=rev>
>                         Log:
>                         Add private-classes element which allows
>                         specific classes to be hidden
>                         from all child configurations. In effect, they
>                         are private to the
>                         configuration.
> 
>                         (GERONIMO-4403) Provide a mechanism to hide
>                         specific classes  of a
>                         configuration to all its children
> 
>                         Added:
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>                         Modified:
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
> 
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
> 
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
> 
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
> 
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/assembly_1_result.xml
> 
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/gbean_1_result.xml
> 
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/servlet_1_result.xml
> 
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/transport_1_result.xml
> 
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/transport_2_result.xml
> 
>                         geronimo/server/trunk/plugins/jetty/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ClassLoaderTest.java
> 
>                         geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -16,25 +16,25 @@
>                         */
>                         package org.apache.geronimo.kernel.classloader;
> 
>                         -import java.io.IOException;
>                         import java.io.File;
>                         -import java.net.URL;
>                         +import java.io.IOException;
>                         import java.net.URI;
>                         +import java.net.URL;
>                         import java.net.URLClassLoader;
>                         import java.security.AccessControlContext;
>                         import java.security.AccessController;
>                         import java.security.CodeSource;
>                         import java.security.PrivilegedAction;
>                         -import java.security.PrivilegedExceptionAction;
>                         import java.security.PrivilegedActionException;
>                         +import java.security.PrivilegedExceptionAction;
>                         import java.security.cert.Certificate;
>                         -import java.util.Collection;
>                         import java.util.Enumeration;
>                         import java.util.jar.Attributes;
>                         import java.util.jar.Manifest;
> 
>                         import
>                         org.apache.geronimo.kernel.config.MultiParentClassLoader;
>                         import
>                         org.apache.geronimo.kernel.repository.Artifact;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
> 
>                         /**
>                         * The JarFileClassLoader that loads classes and
>                         resources from a list of
>                         JarFiles.  This method is simmilar to URLClassLoader
>                         @@ -78,8 +78,8 @@
>                              addURLs(urls);
>                          }
> 
>                         -    public JarFileClassLoader(Artifact id,
>                         URL[] urls, ClassLoader
>                         parent, boolean inverseClassLoading, String[]
>                         hiddenClasses, String[]
>                         nonOverridableClasses) {
>                         -        super(id, EMPTY_URLS, parent,
>                         inverseClassLoading, hiddenClasses,
>                         nonOverridableClasses);
>                         +    public JarFileClassLoader(Artifact id,
>                         URL[] urls, ClassLoader
>                         parent, ClassLoadingRules classLoadingRules) {
>                         +        super(id, EMPTY_URLS, parent,
>                         classLoadingRules);
>                              this.acc = AccessController.getContext();
>                              addURLs(urls);
>                          }
>                         @@ -96,14 +96,8 @@
>                              addURLs(urls);
>                          }
> 
>                         -    public JarFileClassLoader(Artifact id,
>                         URL[] urls, ClassLoader[]
>                         parents, boolean inverseClassLoading, Collection
>                         hiddenClasses, Collection
>                         nonOverridableClasses) {
>                         -        super(id, EMPTY_URLS, parents,
>                         inverseClassLoading,
>                         hiddenClasses, nonOverridableClasses);
>                         -        this.acc = AccessController.getContext();
>                         -        addURLs(urls);
>                         -    }
>                         -
>                         -    public JarFileClassLoader(Artifact id,
>                         URL[] urls, ClassLoader[]
>                         parents, boolean inverseClassLoading, String[]
>                         hiddenClasses, String[]
>                         nonOverridableClasses) {
>                         -        super(id, EMPTY_URLS, parents,
>                         inverseClassLoading,
>                         hiddenClasses, nonOverridableClasses);
>                         +    public JarFileClassLoader(Artifact id,
>                         URL[] urls, ClassLoader[]
>                         parents, ClassLoadingRules classLoadingRules) {
>                         +        super(id, EMPTY_URLS, parents,
>                         classLoadingRules);
>                              this.acc = AccessController.getContext();
>                              addURLs(urls);
>                          }
> 
>                         Added:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java?rev=712326&view=auto
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
>                         (added)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -0,0 +1,92 @@
>                         +/*
>                         + * Licensed to the Apache Software Foundation
>                         (ASF) under one
>                         + * or more contributor license agreements.  See
>                         the NOTICE file
>                         + * distributed with this work for additional
>                         information
>                         + * regarding copyright ownership.  The ASF
>                         licenses this file
>                         + * to you under the Apache License, Version 2.0
>                         (the
>                         + * "License"); you may not use this file except
>                         in compliance
>                         + * with the License.  You may obtain a copy of
>                         the License at
>                         + *
>                         + *  http://www.apache.org/licenses/LICENSE-2.0
>                         + *
>                         + * Unless required by applicable law or agreed
>                         to in writing,
>                         + * software distributed under the License is
>                         distributed on an
>                         + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>                         CONDITIONS OF ANY
>                         + * KIND, either express or implied.  See the
>                         License for the
>                         + * specific language governing permissions and
>                         limitations
>                         + * under the License.
>                         + */
>                         +
>                         +package org.apache.geronimo.kernel.config;
>                         +
>                         +import java.io.IOException;
>                         +import java.net.MalformedURLException;
>                         +import java.net.URL;
>                         +import java.security.SecureClassLoader;
>                         +import java.util.Collections;
>                         +import java.util.Enumeration;
>                         +import java.util.List;
>                         +
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
>                         +
>                         +import sun.misc.CompoundEnumeration;
>                         +
>                         +/**
>                         + *
>                         + * @version $Rev:$ $Date:$
>                         + */
>                         +public class ChildrenConfigurationClassLoader
>                         extends SecureClassLoader {
>                         +
>                         +    private final ClassLoadingRules rules;
>                         +
>                         +    public
>                         ChildrenConfigurationClassLoader(ClassLoader parent,
>                         ClassLoadingRules rules) {
>                         +        super(parent);
>                         +        if (null == rules) {
>                         +            throw new
>                         IllegalArgumentException("rules is required");
>                         +        }
>                         +        this.rules = rules;
>                         +    }
>                         +
>                         +    public Class<?> loadClass(String name,
>                         List<ClassLoader>
>                         visitedClassLoaders) throws ClassNotFoundException {
>                         +        return loadClass(name, false,
>                         visitedClassLoaders);
>                         +    }
>                         +
>                         +    protected synchronized Class<?>
>                         loadClass(String name, boolean
>                         resolve) throws ClassNotFoundException {
>                         +        return loadClass(name, resolve,
>                         Collections.EMPTY_LIST);
>                         +    }
>                         +
>                         +    protected synchronized Class<?>
>                         loadClass(String name, boolean
>                         resolve, List<ClassLoader> visitedClassLoaders)
>                         +            throws ClassNotFoundException {
>                         +        ClassLoadingRule privateRule =
>                         rules.getPrivateRule();
>                         +        ClassLoader parent = getParent();
>                         +        if (privateRule.isFilteredClass(name)) {
>                         +            throw new
>                         ClassNotFoundException(name + " is hidden by
>                         classloader " + parent);
>                         +        }
>                         +
>                         +        if (parent instanceof
>                         MultiParentClassLoader) {
>                         +            try {
>                         +                return ((MultiParentClassLoader)
>                         parent).loadClassInternal(name, resolve,
>                         visitedClassLoaders);
>                         +            } catch (MalformedURLException e) {
>                         +            }
>                         +        }
>                         +        return super.loadClass(name, resolve);
>                         +    }
>                         +
>                         +    public URL getResource(String name) {
>                         +        ClassLoadingRule privateRule =
>                         rules.getPrivateRule();
>                         +        if (privateRule.isFilteredResource(name)) {
>                         +            return null;
>                         +        }
>                         +        return super.getResource(name);
>                         +    }
>                         +
>                         +    public Enumeration<URL> getResources(String
>                         name) throws IOException
>                         {
>                         +        ClassLoadingRule privateRule =
>                         rules.getPrivateRule();
>                         +        if (privateRule.isFilteredResource(name)) {
>                         +            return new CompoundEnumeration(new
>                         Enumeration[0]);
>                         +        }
>                         +        return super.getResources(name);
>                         +    }
>                         +
>                         +}
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -25,6 +25,7 @@
>                         import java.util.Collection;
>                         import java.util.Collections;
>                         import java.util.HashMap;
>                         +import java.util.HashSet;
>                         import java.util.Iterator;
>                         import java.util.LinkedHashMap;
>                         import java.util.LinkedHashSet;
>                         @@ -32,13 +33,10 @@
>                         import java.util.ListIterator;
>                         import java.util.Map;
>                         import java.util.Set;
>                         -import java.util.HashSet;
> 
>                         import
>                         javax.management.MalformedObjectNameException;
>                         import javax.management.ObjectName;
> 
>                         -import org.slf4j.Logger;
>                         -import org.slf4j.LoggerFactory;
>                         import org.apache.geronimo.gbean.AbstractName;
>                         import org.apache.geronimo.gbean.AbstractNameQuery;
>                         import org.apache.geronimo.gbean.GBeanData;
>                         @@ -51,10 +49,14 @@
>                         import org.apache.geronimo.kernel.Naming;
>                         import
>                         org.apache.geronimo.kernel.classloader.JarFileClassLoader;
>                         import
>                         org.apache.geronimo.kernel.repository.Artifact;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
>                         import
>                         org.apache.geronimo.kernel.repository.Dependency;
>                         import
>                         org.apache.geronimo.kernel.repository.Environment;
>                         import
>                         org.apache.geronimo.kernel.repository.ImportType;
>                         import
>                         org.apache.geronimo.kernel.repository.MissingDependencyException;
>                         +import org.slf4j.Logger;
>                         +import org.slf4j.LoggerFactory;
> 
>                         /**
>                         * A Configuration represents a collection of
>                         runnable services that can
>                         be
>                         @@ -170,6 +172,11 @@
>                          private final MultiParentClassLoader
>                         configurationClassLoader;
> 
>                          /**
>                         +     * The ClassLoader used by children
>                         configurations.
>                         +     */
>                         +    private final ClassLoader
>                         childrenConfigurationClassLoader;
>                         +
>                         +    /**
>                           * The relative class path (URI) of this
>                         configuation.
>                           */
>                          private final LinkedHashSet<String> classPath;
>                         @@ -204,6 +211,7 @@
>                              classPath = null;
>                              configurationResolver = null;
>                              configurationClassLoader = null;
>                         +        childrenConfigurationClassLoader = null;
>                              naming = null;
>                          }
> 
>                         @@ -266,6 +274,9 @@
>                                  // Build the configuration class loader
>                                  //
>                                  configurationClassLoader =
>                         createConfigurationClasssLoader(parents,
>                         environment, classPath);
>                         +
>                         +            ClassLoadingRules rules =
>                         environment.getClassLoadingRules();
>                         +            childrenConfigurationClassLoader = new
>                         ChildrenConfigurationClassLoader(configurationClassLoader,
>                         rules);
> 
>                                  //
>                                  // Get all service parents in depth
>                         first order
>                         @@ -333,22 +344,19 @@
>                                  parentClassLoaders = new
>                         ClassLoader[classParents.size()];
>                                  for (ListIterator iterator =
>                         classParents.listIterator();
>                         iterator.hasNext();) {
>                                      Configuration configuration =
>                         (Configuration)
>                         iterator.next();
>                         -              
>                          parentClassLoaders[iterator.previousIndex()] =
>                         configuration.getConfigurationClassLoader();
>                         +              
>                          parentClassLoaders[iterator.previousIndex()] =
>                         configuration.childrenConfigurationClassLoader;
>                                  }
>                              }
> 
>                         -        // hidden classes
>                         -        Set<String> hiddenClassesSet =
>                         environment.getHiddenClasses();
>                         -        String[] hiddenClasses =
>                         hiddenClassesSet.toArray(new
>                         String[hiddenClassesSet.size()]);
>                         -
>                              // we need to propagate the
>                         non-overrideable classes from parents
>                         -        LinkedHashSet<String> nonOverridableSet
>                         = new
>                         LinkedHashSet<String>(environment.getNonOverrideableClasses());
>                         +        ClassLoadingRules classLoadingRules =
>                         environment.getClassLoadingRules();
>                         +        ClassLoadingRule nonOverrideableRule =
>                         classLoadingRules.getNonOverrideableRule();
>                              for (Configuration parent : classParents) {
>                         -
>                                  Environment parentEnvironment =
>                         parent.getEnvironment();
>                         -
>                         nonOverridableSet.addAll(parentEnvironment.getNonOverrideableClasses());
>                         +            ClassLoadingRules
>                         parentClassLoadingRules =
>                         parentEnvironment.getClassLoadingRules();
>                         +            ClassLoadingRule
>                         parentNonOverrideableRule =
>                         parentClassLoadingRules.getNonOverrideableRule();
>                         +          
>                          nonOverrideableRule.merge(parentNonOverrideableRule);
>                              }
>                         -        String[] nonOverridableClasses =
>                         nonOverridableSet.toArray(new
>                         String[nonOverridableSet.size()]);
> 
>                              if (log.isDebugEnabled()) {
>                                  StringBuffer buf = new
>                         StringBuffer("ClassLoader structure for
>                         configuration ").append(id).append("\n");
>                         @@ -377,16 +385,12 @@
>                                  return new
>                         JarFileClassLoader(environment.getConfigId(),
>                                          urls,
>                                          parentClassLoaders,
>                         -                  
>                          environment.isInverseClassLoading(),
>                         -                    hiddenClasses,
>                         -                    nonOverridableClasses);
>                         +                    classLoadingRules);
>                              } else {
>                                  return new
>                         MultiParentClassLoader(environment.getConfigId(),
>                                          urls,
>                                          parentClassLoaders,
>                         -                  
>                          environment.isInverseClassLoading(),
>                         -                    hiddenClasses,
>                         -                    nonOverridableClasses);
>                         +                    classLoadingRules);
>                              }
>                          }
> 
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -27,7 +27,6 @@
>                         import java.net.URLClassLoader;
>                         import java.net.URLStreamHandlerFactory;
>                         import java.util.ArrayList;
>                         -import java.util.Collection;
>                         import java.util.Collections;
>                         import java.util.Enumeration;
>                         import java.util.HashSet;
>                         @@ -36,11 +35,13 @@
>                         import java.util.Map;
>                         import java.util.Set;
> 
>                         -import org.slf4j.Logger;
>                         -import org.slf4j.LoggerFactory;
>                         import
>                         org.apache.geronimo.kernel.classloader.UnionEnumeration;
>                         import
>                         org.apache.geronimo.kernel.repository.Artifact;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
>                         import
>                         org.apache.geronimo.kernel.util.ClassLoaderRegistry;
>                         +import org.slf4j.Logger;
>                         +import org.slf4j.LoggerFactory;
> 
>                         /**
>                         * A MultiParentClassLoader is a simple extension
>                         of the URLClassLoader
>                         that simply changes the single parent class
>                         @@ -57,11 +58,7 @@
> 
>                          private final Artifact id;
>                          private final ClassLoader[] parents;
>                         -    private final boolean inverseClassLoading;
>                         -    private final String[] hiddenClasses;
>                         -    private final String[] nonOverridableClasses;
>                         -    private final String[] hiddenResources;
>                         -    private final String[] nonOverridableResources;
>                         +    private final ClassLoadingRules
>                         classLoadingRules;
>                          private boolean destroyed = false;
> 
>                          // I used this pattern as its temporary and
>                         with the static final we
>                         get compile time
>                         @@ -102,12 +99,9 @@
>                          public MultiParentClassLoader(Artifact id,
>                         URL[] urls) {
>                              super(urls);
>                              this.id <http://this.id> = id;
>                         +
>                              parents = new
>                         ClassLoader[]{ClassLoader.getSystemClassLoader()};
>                         -        inverseClassLoading = false;
>                         -        hiddenClasses = new String[0];
>                         -        nonOverridableClasses = new String[0];
>                         -        hiddenResources = new String[0];
>                         -        nonOverridableResources = new String[0];
>                         +        classLoadingRules = new
>                         ClassLoadingRules();
>                              ClassLoaderRegistry.add(this);
>                          }
> 
>                         @@ -123,8 +117,8 @@
>                              this(id, urls, new ClassLoader[]{parent});
>                          }
> 
>                         -    public MultiParentClassLoader(Artifact id,
>                         URL[] urls, ClassLoader
>                         parent, boolean inverseClassLoading, String[]
>                         hiddenClasses, String[]
>                         nonOverridableClasses) {
>                         -        this(id, urls, new
>                         ClassLoader[]{parent}, inverseClassLoading,
>                         hiddenClasses, nonOverridableClasses);
>                         +    public MultiParentClassLoader(Artifact id,
>                         URL[] urls, ClassLoader
>                         parent, ClassLoadingRules classLoadingRules) {
>                         +        this(id, urls, new
>                         ClassLoader[]{parent}, classLoadingRules);
>                          }
> 
>                          /**
>                         @@ -151,32 +145,21 @@
>                              super(urls);
>                              this.id <http://this.id> = id;
>                              this.parents = copyParents(parents);
>                         -        inverseClassLoading = false;
>                         -        hiddenClasses = new String[0];
>                         -        nonOverridableClasses = new String[0];
>                         -        hiddenResources = new String[0];
>                         -        nonOverridableResources = new String[0];
>                         -        ClassLoaderRegistry.add(this);
>                         -    }
> 
>                         -    public MultiParentClassLoader(Artifact id,
>                         URL[] urls, ClassLoader[]
>                         parents, boolean inverseClassLoading, Collection
>                         hiddenClasses, Collection
>                         nonOverridableClasses) {
>                         -        this(id, urls, parents,
>                         inverseClassLoading, (String[])
>                         hiddenClasses.toArray(new
>                         String[hiddenClasses.size()]), (String[])
>                         nonOverridableClasses.toArray(new
>                         String[nonOverridableClasses.size()]));
>                         +        classLoadingRules = new
>                         ClassLoadingRules();
>                         +        ClassLoaderRegistry.add(this);
>                          }
> 
>                         -    public MultiParentClassLoader(Artifact id,
>                         URL[] urls, ClassLoader[]
>                         parents, boolean inverseClassLoading, String[]
>                         hiddenClasses, String[]
>                         nonOverridableClasses) {
>                         +    public MultiParentClassLoader(Artifact id,
>                         URL[] urls, ClassLoader[]
>                         parents, ClassLoadingRules classLoadingRules) {
>                              super(urls);
>                              this.id <http://this.id> = id;
>                              this.parents = copyParents(parents);
>                         -        this.inverseClassLoading =
>                         inverseClassLoading;
>                         -        this.hiddenClasses = hiddenClasses;
>                         -        this.nonOverridableClasses =
>                         nonOverridableClasses;
>                         -        hiddenResources =
>                         toResources(hiddenClasses);
>                         -        nonOverridableResources =
>                         toResources(nonOverridableClasses);
>                         +        this.classLoadingRules = classLoadingRules;
>                              ClassLoaderRegistry.add(this);
>                          }
> 
>                          public
>                         MultiParentClassLoader(MultiParentClassLoader
>                         source) {
>                         -        this(source.id <http://source.id>,
>                         source.getURLs(),
>                         deepCopyParents(source.parents),
>                         source.inverseClassLoading,
>                         source.hiddenClasses, source.nonOverridableClasses);
>                         +        this(source.id <http://source.id>,
>                         source.getURLs(),
>                         deepCopyParents(source.parents),
>                         source.classLoadingRules);
>                          }
> 
>                          static ClassLoader copy(ClassLoader source) {
>                         @@ -193,15 +176,6 @@
>                              return MultiParentClassLoader.copy(this);
>                          }
> 
>                         -    private String[] toResources(String[]
>                         classes) {
>                         -        String[] resources = new
>                         String[classes.length];
>                         -        for (int i = 0; i < classes.length; i++) {
>                         -            String className = classes[i];
>                         -            resources[i] =
>                         className.replace('.', '/');
>                         -        }
>                         -        return resources;
>                         -    }
>                         -
>                          /**
>                           * Creates a named class loader as a child of
>                         the specified parents and
>                         using the specified URLStreamHandlerFactory
>                           * for accessing the urls..
>                         @@ -215,11 +189,8 @@
>                              super(urls, null, factory);
>                              this.id <http://this.id> = id;
>                              this.parents = copyParents(parents);
>                         -        inverseClassLoading = false;
>                         -        hiddenClasses = new String[0];
>                         -        nonOverridableClasses = new String[0];
>                         -        hiddenResources = new String[0];
>                         -        nonOverridableResources = new String[0];
>                         +
>                         +        classLoadingRules = new
>                         ClassLoadingRules();
>                              ClassLoaderRegistry.add(this);
>                          }
> 
>                         @@ -320,7 +291,7 @@
>                              //
>                              // if we are using inverse class loading,
>                         check local urls first
>                              //
>                         -        if (inverseClassLoading &&
>                         !isDestroyed() &&
>                         !isNonOverridableClass(name)) {
>                         +        if
>                         (classLoadingRules.isInverseClassLoading() &&
>                         !isDestroyed()
>                         && !isNonOverridableClass(name)) {
>                                  try {
>                                      Class clazz = findClass(name);
>                                      return resolveClass(clazz, resolve);
>                         @@ -404,7 +375,7 @@
>                              //
>                              // if we are using inverse class loading,
>                         check local urls first
>                              //
>                         -        if (inverseClassLoading &&
>                         !isDestroyed() &&
>                         !isNonOverridableClass(name)) {
>                         +        if
>                         (classLoadingRules.isInverseClassLoading() &&
>                         !isDestroyed()
>                         && !isNonOverridableClass(name)) {
>                                  try {
>                                      Class clazz = findClass(name);
>                                      return resolveClass(clazz, resolve);
>                         @@ -453,7 +424,7 @@
>                           * @return
>                           * @throws ClassNotFoundException
>                           */
>                         -    protected synchronized Class<?>
>                         loadClassInternal(String name,
>                         boolean resolve, LinkedList<ClassLoader>
>                         visitedClassLoaders) throws
>                         ClassNotFoundException, MalformedURLException {
>                         +    protected synchronized Class<?>
>                         loadClassInternal(String name,
>                         boolean resolve, List<ClassLoader>
>                         visitedClassLoaders) throws
>                         ClassNotFoundException, MalformedURLException {
>                              //
>                              // Check if class is in the loaded classes
>                         cache
>                              //
>                         @@ -500,7 +471,7 @@
>                           * @return
>                           * @throws ClassNotFoundException
>                           */
>                         -    private synchronized Class<?>
>                         checkParents(String name, boolean
>                         resolve, LinkedList<ClassLoader>
>                         visitedClassLoaders) throws
>                         ClassNotFoundException {
>                         +    private synchronized Class<?>
>                         checkParents(String name, boolean
>                         resolve, List<ClassLoader> visitedClassLoaders)
>                         throws
>                         ClassNotFoundException {
>                              for (ClassLoader parent : parents) {
>                                  if
>                         (!visitedClassLoaders.contains(parent)) {
>                                      visitedClassLoaders.add(parent);
>                          // Track that we've been
>                         here before
>                         @@ -508,6 +479,9 @@
>                                             if (parent instanceof
>                         MultiParentClassLoader) {
>                                                     Class clazz =
>                         ((MultiParentClassLoader)
>                         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);
>                                             }
>                         @@ -523,21 +497,13 @@
>                          }
> 
>                          private boolean isNonOverridableClass(String
>                         name) {
>                         -        for (String nonOverridableClass :
>                         nonOverridableClasses) {
>                         -            if
>                         (name.startsWith(nonOverridableClass)) {
>                         -                return true;
>                         -            }
>                         -        }
>                         -        return false;
>                         +        ClassLoadingRule nonOverrideableRule =
>                         classLoadingRules.getNonOverrideableRule();
>                         +        return
>                         nonOverrideableRule.isFilteredClass(name);
>                          }
> 
>                          private boolean isHiddenClass(String name) {
>                         -        for (String hiddenClass : hiddenClasses) {
>                         -            if (name.startsWith(hiddenClass)) {
>                         -                return true;
>                         -            }
>                         -        }
>                         -        return false;
>                         +        ClassLoadingRule hiddenRule =
>                         classLoadingRules.getHiddenRule();
>                         +        return hiddenRule.isFilteredClass(name);
>                          }
> 
>                          private Class resolveClass(Class clazz, boolean
>                         resolve) {
>                         @@ -555,7 +521,7 @@
>                              //
>                              // if we are using inverse class loading,
>                         check local urls first
>                              //
>                         -        if (inverseClassLoading &&
>                         !isDestroyed() &&
>                         !isNonOverridableResource(name)) {
>                         +        if
>                         (classLoadingRules.isInverseClassLoading() &&
>                         !isDestroyed()
>                         && !isNonOverridableResource(name)) {
>                                  URL url = findResource(name);
>                                  if (url != null) {
>                                      return url;
>                         @@ -606,7 +572,7 @@
>                                  return;
>                              }
>                              knownClassloaders.add(this);
>                         -        if (inverseClassLoading &&
>                         !isNonOverridableResource(name)) {
>                         +        if
>                         (classLoadingRules.isInverseClassLoading() &&
>                         !isNonOverridableResource(name)) {
>                                
>                          enumerations.add(internalfindResources(name));
>                              }
>                              if (!isHiddenResource(name)) {
>                         @@ -621,7 +587,7 @@
>                                      }
>                                  }
>                              }
>                         -        if (!inverseClassLoading) {
>                         +        if
>                         (!classLoadingRules.isInverseClassLoading()) {
>                                
>                          enumerations.add(internalfindResources(name));
>                              }
>                          }
>                         @@ -631,21 +597,13 @@
>                          }
> 
>                          private boolean isNonOverridableResource(String
>                         name) {
>                         -        for (String nonOverridableResource :
>                         nonOverridableResources) {
>                         -            if
>                         (name.startsWith(nonOverridableResource)) {
>                         -                return true;
>                         -            }
>                         -        }
>                         -        return false;
>                         +        ClassLoadingRule nonOverrideableRule =
>                         classLoadingRules.getNonOverrideableRule();
>                         +        return
>                         nonOverrideableRule.isFilteredResource(name);
>                          }
> 
>                          private boolean isHiddenResource(String name) {
>                         -        for (String hiddenResource :
>                         hiddenResources) {
>                         -            if (name.startsWith(hiddenResource)) {
>                         -                return true;
>                         -            }
>                         -        }
>                         -        return false;
>                         +        ClassLoadingRule hiddenRule =
>                         classLoadingRules.getHiddenRule();
>                         +        return hiddenRule.isFilteredResource(name);
>                          }
> 
>                          public String toString() {
> 
>                         Added:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java?rev=712326&view=auto
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
>                         (added)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -0,0 +1,85 @@
>                         +/*
>                         + * Licensed to the Apache Software Foundation
>                         (ASF) under one
>                         + * or more contributor license agreements.  See
>                         the NOTICE file
>                         + * distributed with this work for additional
>                         information
>                         + * regarding copyright ownership.  The ASF
>                         licenses this file
>                         + * to you under the Apache License, Version 2.0
>                         (the
>                         + * "License"); you may not use this file except
>                         in compliance
>                         + * with the License.  You may obtain a copy of
>                         the License at
>                         + *
>                         + *  http://www.apache.org/licenses/LICENSE-2.0
>                         + *
>                         + * Unless required by applicable law or agreed
>                         to in writing,
>                         + * software distributed under the License is
>                         distributed on an
>                         + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>                         CONDITIONS OF ANY
>                         + * KIND, either express or implied.  See the
>                         License for the
>                         + * specific language governing permissions and
>                         limitations
>                         + * under the License.
>                         + */
>                         +
>                         +package org.apache.geronimo.kernel.repository;
>                         +
>                         +import java.io.Serializable;
>                         +import java.util.HashSet;
>                         +import java.util.Set;
>                         +
>                         +/**
>                         + *
>                         + * @version $Rev:$ $Date:$
>                         + */
>                         +public class ClassLoadingRule implements
>                         Serializable {
>                         +    private final Set<String> classPrefixes;
>                         +    private final Set<String> resourcePrefixes;
>                         +
>                         +    public ClassLoadingRule() {
>                         +        classPrefixes = new HashSet<String>();
>                         +        resourcePrefixes = new HashSet<String>();
>                         +    }
>                         +
>                         +    public Set<String> getClassPrefixes() {
>                         +        return classPrefixes;
>                         +    }
>                         +
>                         +    public boolean isFilteredClass(String name) {
>                         +        return isMatching(classPrefixes, name);
>                         +    }
>                         +
>                         +    public boolean isFilteredResource(String
>                         name) {
>                         +        return isMatching(resourcePrefixes, name);
>                         +    }
>                         +
>                         +    public void addClassPrefixes(Set<String>
>                         classPrefixes) {
>                         +        this.classPrefixes.addAll(classPrefixes);
>                         +
>                         +        Set<String> resources =
>                         toResources(classPrefixes);
>                         +        resourcePrefixes.addAll(resources);
>                         +    }
>                         +
>                         +    public void setClassPrefixes(Set<String>
>                         classPrefixes) {
>                         +        this.classPrefixes.clear();
>                         +        resourcePrefixes.clear();
>                         +        addClassPrefixes(classPrefixes);
>                         +    }
>                         +
>                         +    public void merge(ClassLoadingRule
>                         classLoadingRuleToMerge) {
>                         +      
>                          addClassPrefixes(classLoadingRuleToMerge.classPrefixes);
>                         +    }
>                         +
>                         +    protected Set<String>
>                         toResources(Set<String> classPrefixes) {
>                         +        Set<String> resources = new
>                         HashSet<String>();
>                         +        for (String className : classPrefixes) {
>                         +          
>                          resources.add(className.replace('.', '/'));
>                         +        }
>                         +        return resources;
>                         +    }
>                         +
>                         +    protected boolean isMatching(Set<String>
>                         prefixes, String name) {
>                         +        for (String prefix : prefixes) {
>                         +            if (name.startsWith(prefix)) {
>                         +                return true;
>                         +            }
>                         +        }
>                         +        return false;
>                         +    }
>                         +
>                         +}
>                         \ No newline at end of file
> 
>                         Added:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java?rev=712326&view=auto
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
>                         (added)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -0,0 +1,72 @@
>                         +/*
>                         + * Licensed to the Apache Software Foundation
>                         (ASF) under one
>                         + * or more contributor license agreements.  See
>                         the NOTICE file
>                         + * distributed with this work for additional
>                         information
>                         + * regarding copyright ownership.  The ASF
>                         licenses this file
>                         + * to you under the Apache License, Version 2.0
>                         (the
>                         + * "License"); you may not use this file except
>                         in compliance
>                         + * with the License.  You may obtain a copy of
>                         the License at
>                         + *
>                         + *  http://www.apache.org/licenses/LICENSE-2.0
>                         + *
>                         + * Unless required by applicable law or agreed
>                         to in writing,
>                         + * software distributed under the License is
>                         distributed on an
>                         + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>                         CONDITIONS OF ANY
>                         + * KIND, either express or implied.  See the
>                         License for the
>                         + * specific language governing permissions and
>                         limitations
>                         + * under the License.
>                         + */
>                         +
>                         +package org.apache.geronimo.kernel.repository;
>                         +
>                         +import java.io.Serializable;
>                         +
>                         +
>                         +/**
>                         + *
>                         + * @version $Rev:$ $Date:$
>                         + */
>                         +public class ClassLoadingRules implements
>                         Serializable {
>                         +    private final ClassLoadingRule hiddenRule;
>                         +    private final ClassLoadingRule
>                         nonOverrideableRule;
>                         +    private final ClassLoadingRule privateRule;
>                         +    private boolean inverseClassLoading;
>                         +
>                         +    public ClassLoadingRules() {
>                         +        hiddenRule = new ClassLoadingRule();
>                         +        nonOverrideableRule = new
>                         ClassLoadingRule();
>                         +        privateRule = new ClassLoadingRule();
>                         +    }
>                         +
>                         +    public ClassLoadingRule getHiddenRule() {
>                         +        return hiddenRule;
>                         +    }
>                         +
>                         +    public ClassLoadingRule
>                         getNonOverrideableRule() {
>                         +        return nonOverrideableRule;
>                         +    }
>                         +
>                         +    public ClassLoadingRule getPrivateRule() {
>                         +        return privateRule;
>                         +    }
>                         +
>                         +    public boolean isInverseClassLoading() {
>                         +        return inverseClassLoading;
>                         +    }
>                         +
>                         +    public void setInverseClassLoading(boolean
>                         inverseClassLoading) {
>                         +        this.inverseClassLoading =
>                         inverseClassLoading;
>                         +    }
>                         +
>                         +    public void merge(ClassLoadingRules
>                         classLoadingRulesToMerge) {
>                         +        if (inverseClassLoading) {
>                         +            return;
>                         +        }
>                         +        inverseClassLoading =
>                         classLoadingRulesToMerge.inverseClassLoading;
>                         +
>                         +      
>                          hiddenRule.merge(classLoadingRulesToMerge.hiddenRule);
>                         +
>                         nonOverrideableRule.merge(classLoadingRulesToMerge.nonOverrideableRule);
>                         +      
>                          privateRule.merge(classLoadingRulesToMerge.privateRule);
>                         +    }
>                         +
>                         +}
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -179,7 +179,7 @@
>                                  }
> 
>                                  Environment environment =
>                         configuration.getEnvironment();
>                         -            if
>                         (environment.isInverseClassLoading()) {
>                         +            if
>                         (environment.getClassLoadingRules().isInverseClassLoading())
>                         {
>                                      // Search dependencies of the
>                         configuration before
>                         searching the parents
>                                      Artifact artifact =
>                         getArtifactVersion(configuration.getDependencies(),
>                         working);
>                                      if (artifact != null) {
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -18,14 +18,12 @@
>                         package org.apache.geronimo.kernel.repository;
> 
>                         import java.io.Serializable;
>                         +import java.util.ArrayList;
>                         import java.util.Collection;
>                         -import java.util.HashSet;
>                         -import java.util.LinkedHashSet;
>                         -import java.util.Set;
>                         -import java.util.List;
>                         import java.util.Collections;
>                         -import java.util.ArrayList;
>                         import java.util.Iterator;
>                         +import java.util.LinkedHashSet;
>                         +import java.util.List;
> 
>                         /**
>                         * holds the data from the EnvironmentType xml
>                         while it is being resolved,
>                         transitively closed, etc.
>                         @@ -36,29 +34,25 @@
>                          private static final long serialVersionUID =
>                         7075760873629376317L;
> 
>                          private Artifact configId;
>                         -
>                          private final LinkedHashSet dependencies = new
>                         LinkedHashSet();
>                         -
>                         -    private final Set hiddenClasses = new
>                         HashSet();
>                         -    private final Set nonOverrideableClasses =
>                         new HashSet();
>                         -
>                         -    private boolean inverseClassLoading;
>                         +    private final ClassLoadingRules
>                         classLoadingRules;
>                          private boolean suppressDefaultEnvironment;
> 
>                          public Environment() {
>                         +        classLoadingRules = new
>                         ClassLoadingRules();
>                          }
> 
>                          public Environment(Artifact configId) {
>                              this.configId = configId;
>                         +
>                         +        classLoadingRules = new
>                         ClassLoadingRules();
>                          }
> 
>                          public Environment(Environment environment) {
>                         -        this.configId = environment.getConfigId();
>                         -      
>                          this.dependencies.addAll(environment.dependencies);
>                         -      
>                          this.hiddenClasses.addAll(environment.getHiddenClasses());
>                         -
>                         this.nonOverrideableClasses.addAll(environment.getNonOverrideableClasses());
>                         -        this.inverseClassLoading =
>                         environment.isInverseClassLoading();
>                         -        this.suppressDefaultEnvironment =
>                         environment.isSuppressDefaultEnvironment();
>                         +        configId = environment.getConfigId();
>                         +      
>                          dependencies.addAll(environment.dependencies);
>                         +        suppressDefaultEnvironment =
>                         environment.isSuppressDefaultEnvironment();
>                         +        classLoadingRules =
>                         environment.classLoadingRules;
>                          }
> 
>                          public Artifact getConfigId() {
>                         @@ -100,46 +94,8 @@
>                              addDependencies(dependencies);
>                          }
> 
>                         -    /**
>                         -     * todo: I should be documented so it's not
>                         completely unclear what
>                         kind of
>                         -     * elements I hold.
>                         -     */
>                         -    public Set getHiddenClasses() {
>                         -        return hiddenClasses;
>                         -    }
>                         -
>                         -    public void addHiddenClasses(Collection
>                         hiddenClasses) {
>                         -        this.hiddenClasses.addAll(hiddenClasses);
>                         -    }
>                         -
>                         -    public void setHiddenClasses(Collection
>                         hiddenClasses) {
>                         -        this.hiddenClasses.clear();
>                         -        addHiddenClasses(hiddenClasses);
>                         -    }
>                         -
>                         -    /**
>                         -     * todo: I should be documented so it's not
>                         completely unclear what
>                         kind of
>                         -     * elements I hold.
>                         -     */
>                         -    public Set getNonOverrideableClasses() {
>                         -        return nonOverrideableClasses;
>                         -    }
>                         -
>                         -    public void
>                         addNonOverrideableClasses(Collection
>                         nonOverrideableClasses) {
>                         -      
>                          this.nonOverrideableClasses.addAll(nonOverrideableClasses);
>                         -    }
>                         -
>                         -    public void
>                         setNonOverrideableClasses(Collection
>                         nonOverrideableClasses) {
>                         -        this.nonOverrideableClasses.clear();
>                         -      
>                          addNonOverrideableClasses(nonOverrideableClasses);
>                         -    }
>                         -
>                         -    public boolean isInverseClassLoading() {
>                         -        return inverseClassLoading;
>                         -    }
>                         -
>                         -    public void setInverseClassLoading(boolean
>                         inverseClassLoading) {
>                         -        this.inverseClassLoading =
>                         inverseClassLoading;
>                         +    public ClassLoadingRules
>                         getClassLoadingRules() {
>                         +        return classLoadingRules;
>                          }
> 
>                          public boolean isSuppressDefaultEnvironment() {
> 
>                         Added:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java?rev=712326&view=auto
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
>                         (added)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -0,0 +1,78 @@
>                         +/*
>                         + * Licensed to the Apache Software Foundation
>                         (ASF) under one
>                         + * or more contributor license agreements.  See
>                         the NOTICE file
>                         + * distributed with this work for additional
>                         information
>                         + * regarding copyright ownership.  The ASF
>                         licenses this file
>                         + * to you under the Apache License, Version 2.0
>                         (the
>                         + * "License"); you may not use this file except
>                         in compliance
>                         + * with the License.  You may obtain a copy of
>                         the License at
>                         + *
>                         + *  http://www.apache.org/licenses/LICENSE-2.0
>                         + *
>                         + * Unless required by applicable law or agreed
>                         to in writing,
>                         + * software distributed under the License is
>                         distributed on an
>                         + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>                         CONDITIONS OF ANY
>                         + * KIND, either express or implied.  See the
>                         License for the
>                         + * specific language governing permissions and
>                         limitations
>                         + * under the License.
>                         + */
>                         +
>                         +package org.apache.geronimo.kernel.config;
>                         +
>                         +import java.util.Collections;
>                         +
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
>                         +
>                         +import junit.framework.TestCase;
>                         +
>                         +/**
>                         + *
>                         + * @version $Rev:$ $Date:$
>                         + */
>                         +public class
>                         ChildrenConfigurationClassLoaderTest extends
>                         TestCase {
>                         +
>                         +    private String privateResourceName;
>                         +    private String privateResourceClass;
>                         +    private ChildrenConfigurationClassLoader
>                         classLoader;
>                         +    private ClassLoadingRules rules;
>                         +
>                         +    @Override
>                         +    protected void setUp() throws Exception {
>                         +        rules = new ClassLoadingRules();
>                         +        privateResourceClass =
>                         ChildrenConfigurationClassLoaderTest.class.getName();
>                         +        privateResourceName =
>                         privateResourceClass.replace(".", "/") +
>                         ".class";
>                         +
>                         +        classLoader = new
>                         ChildrenConfigurationClassLoader(ChildrenConfigurationClassLoaderTest.class.getClassLoader(),
>                         rules);
>                         +    }
>                         +
>                         +    public void
>                         testLoadClassThrowsCNFEForHiddenClass() throws
>                         Exception
>                         {
>                         +      
>                          classLoader.loadClass(privateResourceClass);
>                         +
>                         +        addPrivateConfiguration();
>                         +
>                         +        try {
>                         +          
>                          classLoader.loadClass(privateResourceClass);
>                         +            fail();
>                         +        } catch (ClassNotFoundException e) {
>                         +        }
>                         +    }
>                         +
>                         +    public void
>                         testGetResourceReturnsNullForHiddenClass() throws
>                         Exception {
>                         +      
>                          assertNotNull(classLoader.getResource(privateResourceName));
>                         +        addPrivateConfiguration();
>                         +      
>                          assertNull(classLoader.getResource(privateResourceName));
>                         +    }
>                         +
>                         +    public void
>                         testGetResourcesReturnsEmptyEnumForHiddenClass()
>                         throws
>                         Exception {
>                         +
>                         assertTrue(classLoader.getResources(privateResourceName).hasMoreElements());
>                         +        addPrivateConfiguration();
>                         +
>                         assertFalse(classLoader.getResources(privateResourceName).hasMoreElements());
>                         +    }
>                         +
>                         +    private void addPrivateConfiguration() {
>                         +        ClassLoadingRule rule =
>                         rules.getPrivateRule();
>                         +
>                         rule.addClassPrefixes(Collections.singleton(privateResourceClass));
>                         +    }
>                         +
>                         +}
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -26,6 +26,7 @@
>                         import java.util.jar.JarFile;
>                         import java.util.jar.JarOutputStream;
>                         import java.util.jar.JarEntry;
>                         +import java.util.Collections;
>                         import java.util.Enumeration;
> 
>                         import junit.framework.TestCase;
>                         @@ -35,6 +36,8 @@
>                         import net.sf.cglib.core.Predicate;
>                         import net.sf.cglib.core.DefaultGeneratorStrategy;
>                         import
>                         org.apache.geronimo.kernel.repository.Artifact;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
> 
>                         /**
>                         * @version $Rev$ $Date$
>                         @@ -141,7 +144,9 @@
>                              Class clazz = cl.loadClass(CLASS_NAME);
>                              assertSame(parentCl, clazz.getClassLoader());
> 
>                         -        cl = new MultiParentClassLoader(NAME,
>                         new URL[]{myJar.toURL()},
>                         parentCl, true, new String[0], new String[0]);
>                         +        ClassLoadingRules classLoadingRules =
>                         new ClassLoadingRules();
>                         +      
>                          classLoadingRules.setInverseClassLoading(true);
>                         +        cl = new MultiParentClassLoader(NAME,
>                         new URL[]{myJar.toURL()},
>                         parentCl, classLoadingRules);
>                              clazz = cl.loadClass(CLASS_NAME);
>                              assertSame(cl, clazz.getClassLoader());
>                          }
>                         @@ -154,7 +159,10 @@
>                              Class clazz = cl.loadClass(CLASS_NAME);
>                              assertSame(parentCl, clazz.getClassLoader());
> 
>                         -        cl = new MultiParentClassLoader(NAME,
>                         new URL[]{myJar.toURL()},
>                         parentCl, false, new String[] {CLASS_NAME}, new
>                         String[0]);
>                         +        ClassLoadingRules classLoadingRules =
>                         new ClassLoadingRules();
>                         +        ClassLoadingRule classLoadingRule =
>                         classLoadingRules.getHiddenRule();
>                         +
>                         classLoadingRule.addClassPrefixes(Collections.singleton(CLASS_NAME));
>                         +        cl = new MultiParentClassLoader(NAME,
>                         new URL[]{myJar.toURL()},
>                         parentCl, classLoadingRules);
>                              clazz = cl.loadClass(CLASS_NAME);
>                              assertSame(cl, clazz.getClassLoader());
>                          }
>                         @@ -167,7 +175,11 @@
>                              Class clazz = cl.loadClass(CLASS_NAME);
>                              assertSame(parentCl, clazz.getClassLoader());
> 
>                         -        cl = new MultiParentClassLoader(NAME,
>                         new URL[]{myJar.toURL()},
>                         parentCl, true, new String[0], new String[]
>                         {CLASS_NAME});
>                         +        ClassLoadingRules classLoadingRules =
>                         new ClassLoadingRules();
>                         +      
>                          classLoadingRules.setInverseClassLoading(true);
>                         +        ClassLoadingRule classLoadingRule =
>                         classLoadingRules.getNonOverrideableRule();
>                         +
>                         classLoadingRule.addClassPrefixes(Collections.singleton(CLASS_NAME));
>                         +        cl = new MultiParentClassLoader(NAME,
>                         new URL[]{myJar.toURL()},
>                         parentCl, classLoadingRules);
>                              clazz = cl.loadClass(CLASS_NAME);
>                              assertSame(parentCl, clazz.getClassLoader());
>                          }
> 
>                         Added:
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java?rev=712326&view=auto
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
>                         (added)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -0,0 +1,84 @@
>                         +/*
>                         + * Licensed to the Apache Software Foundation
>                         (ASF) under one
>                         + * or more contributor license agreements.  See
>                         the NOTICE file
>                         + * distributed with this work for additional
>                         information
>                         + * regarding copyright ownership.  The ASF
>                         licenses this file
>                         + * to you under the Apache License, Version 2.0
>                         (the
>                         + * "License"); you may not use this file except
>                         in compliance
>                         + * with the License.  You may obtain a copy of
>                         the License at
>                         + *
>                         + *  http://www.apache.org/licenses/LICENSE-2.0
>                         + *
>                         + * Unless required by applicable law or agreed
>                         to in writing,
>                         + * software distributed under the License is
>                         distributed on an
>                         + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>                         CONDITIONS OF ANY
>                         + * KIND, either express or implied.  See the
>                         License for the
>                         + * specific language governing permissions and
>                         limitations
>                         + * under the License.
>                         + */
>                         +
>                         +package org.apache.geronimo.kernel.repository;
>                         +
>                         +import java.util.Collections;
>                         +import java.util.Set;
>                         +
>                         +import junit.framework.TestCase;
>                         +
>                         +/**
>                         + *
>                         + * @version $Rev:$ $Date:$
>                         + */
>                         +public class ClassLoadingRuleTest extends
>                         TestCase {
>                         +    private static final String FILTERED_PREFIX
>                         = "org.apache.geronimo";
>                         +    private static final String
>                         FILTERED_RESOURCE_PREFIX =
>                         "org/apache/geronimo";
>                         +
>                         +    private ClassLoadingRule rule;
>                         +
>                         +    @Override
>                         +    protected void setUp() throws Exception {
>                         +        rule = new ClassLoadingRule();
>                         +        Set<String> filter =
>                         Collections.singleton(FILTERED_PREFIX);
>                         +        rule.addClassPrefixes(filter);
>                         +    }
>                         +
>                         +    public void testIsFilteredClass() throws
>                         Exception {
>                         +      
>                          assertTrue(rule.isFilteredClass(FILTERED_PREFIX
>                         + ".mock"));
>                         +    }
>                         +
>                         +    public void testIsNotFilteredClass() throws
>                         Exception {
>                         +        assertFalse(rule.isFilteredClass("mock"));
>                         +    }
>                         +
>                         +    public void testIsFilteredResource() throws
>                         Exception {
>                         +      
>                          assertTrue(rule.isFilteredResource(FILTERED_RESOURCE_PREFIX
>                         +
>                         "/mock"));
>                         +    }
>                         +
>                         +    public void testIsNotFilteredResource()
>                         throws Exception {
>                         +      
>                          assertFalse(rule.isFilteredResource("mock"));
>                         +    }
>                         +
>                         +    public void testMerge() throws Exception {
>                         +        ClassLoadingRule ruleToMerge = new
>                         ClassLoadingRule();
>                         +        String mergedFilteredPrefix = "geronimo";
>                         +        Set<String> filter =
>                         Collections.singleton(mergedFilteredPrefix);
>                         +        ruleToMerge.addClassPrefixes(filter);
>                         +
>                         +        rule.merge(ruleToMerge);
>                         +
>                         +      
>                          assertTrue(rule.isFilteredClass(mergedFilteredPrefix
>                         + ".mock"));
>                         +      
>                          assertTrue(rule.isFilteredResource(mergedFilteredPrefix
>                         +
>                         "/mock"));
>                         +    }
>                         +
>                         +    public void testSetClassPrefixResetState()
>                         throws Exception {
>                         +        String newFilteredPrefix = "geronimo";
>                         +        Set<String> filter =
>                         Collections.singleton(newFilteredPrefix);
>                         +        rule.setClassPrefixes(filter);
>                         +
>                         +      
>                          assertTrue(rule.isFilteredClass(newFilteredPrefix
>                         + ".mock"));
>                         +      
>                          assertTrue(rule.isFilteredResource(newFilteredPrefix
>                         + "/mock"));
>                         +
>                         +      
>                          assertFalse(rule.isFilteredClass(FILTERED_PREFIX
>                         + ".mock"));
>                         +      
>                          assertFalse(rule.isFilteredResource(FILTERED_PREFIX
>                         + "/mock"));
>                         +    }
>                         +
>                         +}
> 
>                         Added:
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java?rev=712326&view=auto
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
>                         (added)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -0,0 +1,70 @@
>                         +/*
>                         + * Licensed to the Apache Software Foundation
>                         (ASF) under one
>                         + * or more contributor license agreements.  See
>                         the NOTICE file
>                         + * distributed with this work for additional
>                         information
>                         + * regarding copyright ownership.  The ASF
>                         licenses this file
>                         + * to you under the Apache License, Version 2.0
>                         (the
>                         + * "License"); you may not use this file except
>                         in compliance
>                         + * with the License.  You may obtain a copy of
>                         the License at
>                         + *
>                         + *  http://www.apache.org/licenses/LICENSE-2.0
>                         + *
>                         + * Unless required by applicable law or agreed
>                         to in writing,
>                         + * software distributed under the License is
>                         distributed on an
>                         + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>                         CONDITIONS OF ANY
>                         + * KIND, either express or implied.  See the
>                         License for the
>                         + * specific language governing permissions and
>                         limitations
>                         + * under the License.
>                         + */
>                         +
>                         +package org.apache.geronimo.deployment.service;
>                         +
>                         +import java.util.HashSet;
>                         +import java.util.Set;
>                         +
>                         +import
>                         org.apache.geronimo.deployment.xbeans.ClassFilterType;
>                         +import
>                         org.apache.geronimo.deployment.xbeans.EnvironmentType;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
>                         +
>                         +/**
>                         + *
>                         + * @version $Rev:$ $Date:$
>                         + */
>                         +public final class ClassLoadingRulesUtil {
>                         +
>                         +    private ClassLoadingRulesUtil() {
>                         +    }
>                         +
>                         +    public static void
>                         configureRules(ClassLoadingRules
>                         classLoadingRules, EnvironmentType
>                         environmentType) {
>                         +
>                         classLoadingRules.setInverseClassLoading(environmentType.isSetInverseClassloading());
>                         +
>                         +        if (null !=
>                         environmentType.getHiddenClasses()) {
>                         +            ClassLoadingRule hiddenRule =
>                         classLoadingRules.getHiddenRule();
>                         +
>                         hiddenRule.setClassPrefixes(toFilters(environmentType.getHiddenClasses()));
>                         +        }
>                         +
>                         +        if (null !=
>                         environmentType.getNonOverridableClasses()) {
>                         +            ClassLoadingRule nonOverrideableRule =
>                         classLoadingRules.getNonOverrideableRule();
>                         +
>                         nonOverrideableRule.setClassPrefixes(toFilters(environmentType.getNonOverridableClasses()));
>                         +        }
>                         +
>                         +        if (null !=
>                         environmentType.getPrivateClasses()) {
>                         +            ClassLoadingRule privateRule =
>                         classLoadingRules.getPrivateRule();
>                         +
>                         privateRule.setClassPrefixes(toFilters(environmentType.getPrivateClasses()));
>                         +        }
>                         +    }
>                         +
>                         +    private static Set<String>
>                         toFilters(ClassFilterType filterType) {
>                         +        Set<String> filters = new
>                         HashSet<String>();
>                         +        if (null != filterType) {
>                         +            String[] filterArray =
>                         filterType.getFilterArray();
>                         +            for (String filter : filterArray) {
>                         +                filter = filter.trim();
>                         +                filters.add(filter);
>                         +            }
>                         +        }
>                         +        return filters;
>                         +    }
>                         +
>                         +}
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -38,6 +38,8 @@
>                         import
>                         org.apache.geronimo.deployment.xbeans.ImportType;
>                         import
>                         org.apache.geronimo.deployment.xbeans.DependencyType;
>                         import
>                         org.apache.geronimo.kernel.repository.Artifact;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
>                         import
>                         org.apache.geronimo.kernel.repository.Dependency;
>                         import
>                         org.apache.geronimo.kernel.repository.Environment;
>                         import org.apache.xmlbeans.XmlException;
>                         @@ -63,10 +65,9 @@
>                                      LinkedHashSet dependencies =
>                         toDependencies(dependencyArray);
>                                    
>                          environment.setDependencies(dependencies);
>                                  }
>                         -
>                         environment.setInverseClassLoading(environmentType.isSetInverseClassloading());
> 
>                         environment.setSuppressDefaultEnvironment(environmentType.isSetSuppressDefaultEnvironment());
>                         -
>                         environment.setHiddenClasses(toFilters(environmentType.getHiddenClasses()));
>                         -
>                         environment.setNonOverrideableClasses(toFilters(environmentType.getNonOverridableClasses()));
>                         +
>                         +
>                         ClassLoadingRulesUtil.configureRules(environment.getClassLoadingRules(),
>                         environmentType);
>                              }
> 
>                              return environment;
>                         @@ -79,10 +80,11 @@
> 
>                         environment.setConfigId(additionalEnvironment.getConfigId());
>                                  }
> 
>                         environment.addDependencies(additionalEnvironment.getDependencies());
>                         -
>                         environment.setInverseClassLoading(environment.isInverseClassLoading()
>                         ||
>                         additionalEnvironment.isInverseClassLoading());
> 
>                         environment.setSuppressDefaultEnvironment(environment.isSuppressDefaultEnvironment()
>                         ||
>                         additionalEnvironment.isSuppressDefaultEnvironment());
>                         -
>                         environment.addHiddenClasses(additionalEnvironment.getHiddenClasses());
>                         -
>                         environment.addNonOverrideableClasses(additionalEnvironment.getNonOverrideableClasses());
>                         +
>                         +            ClassLoadingRules classLoadingRules =
>                         environment.getClassLoadingRules();
>                         +            ClassLoadingRules
>                         additionalClassLoadingRules =
>                         additionalEnvironment.getClassLoadingRules();
>                         +          
>                          classLoadingRules.merge(additionalClassLoadingRules);
>                              }
>                          }
> 
>                         @@ -105,14 +107,25 @@
>                              DependencyType[] dependencyTypes =
>                         (DependencyType[])
>                         dependencies.toArray(new
>                         DependencyType[dependencies.size()]);
>                              DependenciesType dependenciesType =
>                         environmentType.addNewDependencies();
>                            
>                          dependenciesType.setDependencyArray(dependencyTypes);
>                         -        if (environment.isInverseClassLoading()) {
>                         +
>                         +        ClassLoadingRules classLoadingRules =
>                         environment.getClassLoadingRules();
>                         +        if
>                         (classLoadingRules.isInverseClassLoading()) {
>                                
>                          environmentType.addNewInverseClassloading();
>                              }
>                         +
>                              if
>                         (environment.isSuppressDefaultEnvironment()) {
>                                
>                          environmentType.addNewSuppressDefaultEnvironment();
>                              }
>                         -
>                         environmentType.setHiddenClasses(toFilterType(environment.getHiddenClasses()));
>                         -
>                         environmentType.setNonOverridableClasses(toFilterType(environment.getNonOverrideableClasses()));
>                         +
>                         +        ClassLoadingRule classLoadingRule =
>                         classLoadingRules.getHiddenRule();
>                         +
>                         environmentType.setHiddenClasses(toFilterType(classLoadingRule.getClassPrefixes()));
>                         +
>                         +        classLoadingRule =
>                         classLoadingRules.getNonOverrideableRule();
>                         +
>                         environmentType.setNonOverridableClasses(toFilterType(classLoadingRule.getClassPrefixes()));
>                         +
>                         +        classLoadingRule =
>                         classLoadingRules.getPrivateRule();
>                         +
>                         environmentType.setPrivateClasses(toFilterType(classLoadingRule.getClassPrefixes()));
>                         +
>                              return environmentType;
>                          }
> 
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
>                         Fri Nov  7 16:40:08 2008
>                         @@ -204,6 +204,21 @@
>                                          </xs:documentation>
>                                      </xs:annotation>
>                                  </xs:element>
>                         +            <xs:element name="private-classes"
>                         +                type="sys:classFilterType"
>                         minOccurs="0">
>                         +                <xs:annotation>
>                         +                    <xs:documentation>
>                         +                        A list of classes which
>                         will only be loaded from
>                         the
>                         +                        ClassLoader of this
>                         module or from parent
>                         ClassLoaders.
>                         +
>                         +                        This is used to prevent
>                         children configurations
>                         to see
>                         +                        specific classes from
>                         its parents. The same
>                         effect can
>                         +                        be achieved by using
>                         hidden-classes. However,
>                         +                        private-classes is the
>                         preferred approach to hide
>                         +                        specific classes from
>                         all children
>                         configurations.
>                         +                    </xs:documentation>
>                         +                </xs:annotation>
>                         +            </xs:element>
>                                  <xs:element name="inverse-classloading"
>                         type="sys:emptyType"
>                                      minOccurs="0">
>                                      <xs:annotation>
> 
>                         Added:
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java?rev=712326&view=auto
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>                         (added)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>                         Fri Nov  7 16:40:08 2008
>                         @@ -0,0 +1,66 @@
>                         +/*
>                         + * Licensed to the Apache Software Foundation
>                         (ASF) under one
>                         + * or more contributor license agreements.  See
>                         the NOTICE file
>                         + * distributed with this work for additional
>                         information
>                         + * regarding copyright ownership.  The ASF
>                         licenses this file
>                         + * to you under the Apache License, Version 2.0
>                         (the
>                         + * "License"); you may not use this file except
>                         in compliance
>                         + * with the License.  You may obtain a copy of
>                         the License at
>                         + *
>                         + *  http://www.apache.org/licenses/LICENSE-2.0
>                         + *
>                         + * Unless required by applicable law or agreed
>                         to in writing,
>                         + * software distributed under the License is
>                         distributed on an
>                         + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>                         CONDITIONS OF ANY
>                         + * KIND, either express or implied.  See the
>                         License for the
>                         + * specific language governing permissions and
>                         limitations
>                         + * under the License.
>                         + */
>                         +
>                         +package org.apache.geronimo.deployment.service;
>                         +
>                         +import java.util.Set;
>                         +
>                         +import junit.framework.TestCase;
>                         +
>                         +import
>                         org.apache.geronimo.deployment.xbeans.ClassFilterType;
>                         +import
>                         org.apache.geronimo.deployment.xbeans.EmptyType;
>                         +import
>                         org.apache.geronimo.deployment.xbeans.EnvironmentType;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRule;
>                         +import
>                         org.apache.geronimo.kernel.repository.ClassLoadingRules;
>                         +
>                         +/**
>                         + *
>                         + * @version $Rev:$ $Date:$
>                         + */
>                         +public class ClassLoadingRulesUtilTest extends
>                         TestCase {
>                         +
>                         +    public void testConfiguration() throws
>                         Exception {
>                         +        EnvironmentType environmentType =
>                         EnvironmentType.Factory.newInstance();
>                         +
>                         environmentType.setInverseClassloading(EmptyType.Factory.newInstance());
>                         +      
>                          environmentType.setHiddenClasses(newFilter("hidden"));
>                         +
>                         environmentType.setNonOverridableClasses(newFilter("nonOverrideable"));
>                         +      
>                          environmentType.setPrivateClasses(newFilter("private"));
>                         +
>                         +        ClassLoadingRules classLoadingRules =
>                         new ClassLoadingRules();
>                         +      
>                          ClassLoadingRulesUtil.configureRules(classLoadingRules,
>                         environmentType);
>                         +
>                         +      
>                          assertTrue(classLoadingRules.isInverseClassLoading());
>                         +      
>                          assertPrefix(classLoadingRules.getHiddenRule(),
>                         "hidden");
>                         +      
>                          assertPrefix(classLoadingRules.getNonOverrideableRule(),
>                         "nonOverrideable");
>                         +      
>                          assertPrefix(classLoadingRules.getPrivateRule(),
>                         "private");
>                         +    }
>                         +
>                         +    private void assertPrefix(ClassLoadingRule
>                         classLoadingRule, String
>                         filter) {
>                         +        Set<String> classPrefixes =
>                         classLoadingRule.getClassPrefixes();
>                         +        assertEquals(1, classPrefixes.size());
>                         +        assertTrue(classPrefixes.contains(filter));
>                         +    }
>                         +
>                         +    private ClassFilterType newFilter(String
>                         filter) {
>                         +        ClassFilterType hiddenClasses =
>                         ClassFilterType.Factory.newInstance();
>                         +        hiddenClasses.addFilter(filter);
>                         +        return hiddenClasses;
>                         +    }
>                         +
>                         +}
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
>                         Fri Nov  7 16:40:08 2008
>                         @@ -44,6 +44,7 @@
>                          </dep:dependencies>
>                          <dep:hidden-classes/>
>                          <dep:non-overridable-classes/>
>                         +    <dep:private-classes/>
>                         </dep:environment>
>                         <module>
>                          <java>appclient_dep_resref_single_client.jar</java>
>                         @@ -89,6 +90,7 @@
>                              </dep:dependencies>
>                              <dep:hidden-classes/>
>                              <dep:non-overridable-classes/>
>                         +        <dep:private-classes/>
>                            </dep:client-environment>
>                            <dep:server-environment
>                         xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2">
>                              <dep:moduleId>
>                         @@ -100,6 +102,7 @@
>                              <dep:dependencies/>
>                              <dep:hidden-classes/>
>                              <dep:non-overridable-classes/>
>                         +        <dep:private-classes/>
>                            </dep:server-environment>
>                            <resource-ref
>                         xmlns="http://geronimo.apache.org/xml/ns/naming-1.2">
>                              <ref-name>url/URL</ref-name>
>                         @@ -126,6 +129,7 @@
>                                  <dep:dependencies/>
>                                  <dep:hidden-classes/>
>                                  <dep:non-overridable-classes/>
>                         +            <dep:private-classes/>
>                                  <dep:suppress-default-environment/>
>                                </dep:environment>
>                                <resourceadapter>
> 
>                         Modified:
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
>                         URL:
>                         http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml?rev=712326&r1=712325&r2=712326&view=diff
> 
>                         ==============================================================================
>                         ---
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
>                         (original)
>                         +++
>                         geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
>                         Fri Nov  7 16:40:08 2008
>                         @@ -32,6 +32,7 @@
>                          </dep:dependencies>
>                          <dep:hidden-classes/>
>                          <dep:non-overridable-classes/>
>                         +    <dep:private-classes/>
>                         </dep:environment>
>                         <module>
>                          <ejb>appclient_ejb_1_ejb.jar</ejb>
>                         @@ -46,6 +47,7 @@
>                              <dep:dependencies/>
>                              <dep:hidden-classes/>
>                           
> 
> 
> 
> 
>     -- 
>     ~Jason Warner
> 
> 
> 
> 
> -- 
> ~Jason Warner


Mime
View raw message