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:30:15 GMT
Isn't there something worse than unclear policy wrong with the process  
in these automated builds if they rely on snapshots getting pushed to  
the apache snapshot repo?

AFAIK the "policy" is that any committer can push a snapshot whenever  
they want to, and not push a snapshot whenever they want to.

I've thought it would be very nice if the automated builds could push  
snapshots if they succeed, but this might be a bit hard to set up  --  
it might involve building twice.

thanks
david jencks

On Nov 10, 2008, at 12:18 PM, Jason Warner wrote:

> To be honest, I don't know what the policy on deploying new  
> snapshots is either.  Hopefully someone who does reads this and  
> enlightens us both.  If we can't get a snapshot published shortly,  
> then we might need to revert these changes until we can unless  
> there's a workaround for getting trunk to build.
>
> 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]
>
>
>
> -- 
> ~Jason Warner


Mime
View raw message