geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Jencks <david_jen...@yahoo.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 Mon, 10 Nov 2008 22:33:19 GMT

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- 
>>> classloading>,<{http://geronimo.apache.org/xml/ns/ 
>>> deployment-1.2}hidden-classes>,
>>>
>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}non-overridable- 
>>> classes>,<{http://geronimo.apache.org/xml/ns/ 
>>> deployment-1.2}moduleId>,
>>>
>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress- 
>>> 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- 
>>> classloading>,<{http://geronimo.apache.org/xml/ns/ 
>>> deployment-1.2}hidden-classes>,
>>>
>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}non-overridable- 
>>> classes>,<{http://geronimo.apache.org/xml/ns/ 
>>> deployment-1.2}moduleId>,
>>>
>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress- 
>>> 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/>
>>>       <dep:non-overridable-classes/>
>>> +        <dep:private-classes/>
>>>     </dep:environment>
>>>     <cmp-connection-factory>
>>>       <resource-link>jdbc/DB1</resource-link>
>>> @@ -90,6 +92,7 @@
>>>       </dep:dependencies>
>>>       <dep:hidden-classes/>
>>>
>>
>> ...
>>
>> [Message clipped]


Mime
View raw message