geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jason Warner" <jaw...@gmail.com>
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 20:42:24 GMT
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(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> wrote:

>
>
> On Tue, Nov 11, 2008 at 8:44 AM, Gianny Damour <
> 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> 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> wrote:
>>>>>> Author: gdamour
>>>>>> Date: Fri Nov  7 16:40:08 2008
>>>>>> New Revision: 712326
>>>>>>
>>>>>> URL: 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 = 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 = 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 = 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, source.getURLs(),
>>>>>> deepCopyParents(source.parents), source.inverseClassLoading,
>>>>>> source.hiddenClasses, source.nonOverridableClasses);
>>>>>> +        this(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 = 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