geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gianny Damour <gianny.dam...@optusnet.com.au>
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 20:02:54 GMT
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/>
>         <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>
> @@ -101,6 +104,7 @@
>         <dep:dependencies/>
>         <dep:hidden-classes/>
>         <dep:non-overridable-classes/>
> +        <dep:private-classes/>
>       </dep:server-environment>
>     </application-client>
>   </module>
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-upgrade/ 
> src/test/resources/assembly_1_result.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/ 
> modules/geronimo-upgrade/src/test/resources/assembly_1_result.xml? 
> rev=712326&r1=712325&r2=712326&view=diff
> ====================================================================== 
> ========
> --- geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/assembly_1_result.xml (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/assembly_1_result.xml Fri Nov  7 16:40:08 2008
> @@ -34,6 +34,7 @@
>         </dep:dependencies>
>         <dep:hidden-classes/>
>         <dep:non-overridable-classes/>
> +        <dep:private-classes/>
>     </dep:environment>
>     <module>
>          
> <java>assembly_compat_standalone_jar_compat12_13_client.jar</java>
> @@ -55,6 +56,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>
> @@ -66,6 +68,7 @@
>                 <dep:dependencies/>
>                 <dep:hidden-classes/>
>                 <dep:non-overridable-classes/>
> +                <dep:private-classes/>
>             </dep:server-environment>
>             <ejb-ref>
>                 <ref-name>ejb/TestBean</ref-name>
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-upgrade/ 
> src/test/resources/gbean_1_result.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/ 
> modules/geronimo-upgrade/src/test/resources/gbean_1_result.xml? 
> rev=712326&r1=712325&r2=712326&view=diff
> ====================================================================== 
> ========
> --- geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/gbean_1_result.xml (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/gbean_1_result.xml Fri Nov  7 16:40:08 2008
> @@ -34,6 +34,7 @@
>     </dep:dependencies>
>     <dep:hidden-classes/>
>     <dep:non-overridable-classes/>
> +    <dep:private-classes/>
>   </dep:environment>
>   <gbean name="hello-realm"  
> class="org.apache.geronimo.security.realm.GenericSecurityRealm">
>     <attribute name="realmName">hello-realm</attribute>
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-upgrade/ 
> src/test/resources/servlet_1_result.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/ 
> modules/geronimo-upgrade/src/test/resources/servlet_1_result.xml? 
> rev=712326&r1=712325&r2=712326&view=diff
> ====================================================================== 
> ========
> --- geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/servlet_1_result.xml (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/servlet_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>
>     <web>servlet_deploy_ejblink_single_web.war</web>
> @@ -46,6 +47,7 @@
>         <dep:dependencies/>
>         <dep:hidden-classes/>
>         <dep:non-overridable-classes/>
> +        <dep:private-classes/>
>       </dep:environment>
>       <ejb-ref>
>         <ref-name>ejb/StatelessBean_ExternalJAR</ref-name>
> @@ -66,6 +68,7 @@
>         <dep:dependencies/>
>         <dep:hidden-classes/>
>         <dep:non-overridable-classes/>
> +        <dep:private-classes/>
>       </dep:environment>
>       <!--YOU MUST INSERT THE ELEMENT <inverse-classloading/> INTO  
> THE ENVIRONMENT ELEMENT FOR THIS MODULE-->
>       <ejb-ref>
> @@ -87,6 +90,7 @@
>           <dep:dependencies/>
>           <dep:hidden-classes/>
>           <dep:non-overridable-classes/>
> +          <dep:private-classes/>
>         </dep:environment>
>       </web-app>
>     </module>
> @@ -103,6 +107,7 @@
>           <dep:dependencies/>
>           <dep:hidden-classes/>
>           <dep:non-overridable-classes/>
> +          <dep:private-classes/>
>         </dep:environment>
>         <!--YOU MUST INSERT THE ELEMENT <inverse-classloading/>  
> INTO THE ENVIRONMENT ELEMENT FOR THIS MODULE-->
>       </web-app>
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-upgrade/ 
> src/test/resources/transport_1_result.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/ 
> modules/geronimo-upgrade/src/test/resources/transport_1_result.xml? 
> rev=712326&r1=712325&r2=712326&view=diff
> ====================================================================== 
> ========
> --- geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/transport_1_result.xml (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/transport_1_result.xml Fri Nov  7 16:40:08 2008
> @@ -34,6 +34,7 @@
>     </dep:dependencies>
>     <dep:hidden-classes/>
>     <dep:non-overridable-classes/>
> +    <dep:private-classes/>
>   </dep:environment>
>   <module>
>     <java>transport_1_client.jar</java>
> @@ -55,6 +56,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>
> @@ -66,6 +68,7 @@
>         <dep:dependencies/>
>         <dep:hidden-classes/>
>         <dep:non-overridable-classes/>
> +        <dep:private-classes/>
>       </dep:server-environment>
>       <ejb-ref>
>         <ref-name>ejb/EJBVehicle</ref-name>
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-upgrade/ 
> src/test/resources/transport_2_result.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/ 
> modules/geronimo-upgrade/src/test/resources/transport_2_result.xml? 
> rev=712326&r1=712325&r2=712326&view=diff
> ====================================================================== 
> ========
> --- geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/transport_2_result.xml (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-upgrade/src/ 
> test/resources/transport_2_result.xml Fri Nov  7 16:40:08 2008
> @@ -34,6 +34,7 @@
>     </dep:dependencies>
>     <dep:hidden-classes/>
>     <dep:non-overridable-classes/>
> +    <dep:private-classes/>
>   </dep:environment>
>  </application>
>
>
> Modified: geronimo/server/trunk/plugins/jetty/geronimo-jetty6/src/ 
> test/java/org/apache/geronimo/jetty6/ClassLoaderTest.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/ 
> jetty/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ 
> ClassLoaderTest.java?rev=712326&r1=712325&r2=712326&view=diff
> ====================================================================== 
> ========
> --- geronimo/server/trunk/plugins/jetty/geronimo-jetty6/src/test/ 
> java/org/apache/geronimo/jetty6/ClassLoaderTest.java (original)
> +++ geronimo/server/trunk/plugins/jetty/geronimo-jetty6/src/test/ 
> java/org/apache/geronimo/jetty6/ClassLoaderTest.java Fri Nov  7  
> 16:40:08 2008
> @@ -19,11 +19,15 @@
>
>  import java.io.File;
>  import java.net.URL;
> +import java.util.Collections;
> +import java.util.HashSet;
> +import java.util.Set;
>
>  import org.apache.geronimo.testsupport.TestSupport;
>
>  import org.apache.geronimo.kernel.config.MultiParentClassLoader;
>  import org.apache.geronimo.kernel.repository.Artifact;
> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>
>  /**
>  * Tests loading various classes (as classes and URL resources)  
> with different
> @@ -33,16 +37,34 @@
>  * @version $Rev$ $Date$
>  */
>  public class ClassLoaderTest extends TestSupport {
> +    private static final Set<String> HIDDEN;
> +    private static final Set<String> NON_OVERRIDABLE;
> +
> +    static {
> +        HIDDEN = new HashSet<String>();
> +        HIDDEN.add("org.apache.geronimo");
> +        HIDDEN.add("org.mortbay");
> +        HIDDEN.add("org.xml");
> +        HIDDEN.add("org.w3c");
> +
> +        NON_OVERRIDABLE = new HashSet<String>();
> +        NON_OVERRIDABLE.add("java.");
> +        NON_OVERRIDABLE.add("javax.");
> +    }
> +
>     Artifact configId = new Artifact("foo", "bar", "1", "car");
>     ClassLoader cl;
>     URL[] urls;
> -    private static final String[] HIDDEN = {"org.apache.geronimo",  
> "org.mortbay", "org.xml", "org.w3c"};
> -    private static final String[] NON_OVERRIDABLE = {"java.",  
> "javax."};
> +    private ClassLoadingRules classLoadingRules;
>
>     public void setUp() throws Exception {
>         super.setUp();
>         URL url = new File(BASEDIR, "src/test/resources/deployables/ 
> cltest/").toURL();
>         urls = new URL[]{url};
> +
> +        classLoadingRules = new ClassLoadingRules();
> +        classLoadingRules.getHiddenRule().setClassPrefixes(HIDDEN );
> +        classLoadingRules.getNonOverrideableRule().setClassPrefixes 
> (NON_OVERRIDABLE);
>     }
>
>     //todo: try more restricted prefixed besides javax.*
> @@ -52,7 +74,7 @@
>      * parent ClassLoader.  This should work.
>      */
>     public void testFalseNonexistantJavaxClass() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), false, HIDDEN, NON_OVERRIDABLE);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         try {
>             cl.loadClass("javax.foo.Foo");
>         } catch(ClassNotFoundException e) {
> @@ -65,7 +87,8 @@
>      * parent ClassLoader.  This should work.
>      */
>     public void testTrueNonexistantJavaxClass() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), true, HIDDEN, NON_OVERRIDABLE);
> +        classLoadingRules.setInverseClassLoading(true);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         try {
>             cl.loadClass("javax.foo.Foo");
>         } catch(ClassNotFoundException e) {
> @@ -79,7 +102,7 @@
>      * This should always load the parent's copy.
>      */
>     public void testFalseExistantJavaxClass() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), false, HIDDEN, NON_OVERRIDABLE);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         try {
>             Class cls = cl.loadClass("javax.servlet.Servlet");
>             assertTrue("Loaded wrong class first; expected to find  
> parent CL's copy of javax.servlet.Servlet",cls.getDeclaredMethods 
> ().length > 0);
> @@ -94,7 +117,8 @@
>      * This should always load the parent's copy.
>      */
>     public void testTrueExistantJavaxClass() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), true, HIDDEN, NON_OVERRIDABLE);
> +        classLoadingRules.setInverseClassLoading(true);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         try {
>             Class cls = cl.loadClass("javax.servlet.Servlet");
>             assertTrue("Loaded wrong class first; expected to find  
> parent CL's copy of javax.servlet.Servlet",cls.getDeclaredMethods 
> ().length > 0);
> @@ -111,7 +135,7 @@
>      * copy when the contextPriorityClassLoader is set to true.
>      */
>     public void xtestFalseExistantNonJavaxClass() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), false, HIDDEN, NON_OVERRIDABLE);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         try {
>             Class cls = cl.loadClass("mx4j.MBeanDescription");
>             assertTrue("Should not have overriden parent CL  
> definition of class mx4j.MBeanDescription", cls.getDeclaredMethods 
> ().length > 0);
> @@ -128,7 +152,8 @@
>      * the contextPriorityClassLoader is set to true (as here).
>      */
>     public void xtestTrueExistantNonJavaxClass() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), true, HIDDEN, NON_OVERRIDABLE);
> +        classLoadingRules.setInverseClassLoading(true);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         try {
>             Class cls = cl.loadClass("mx4j.MBeanDescription");
>             assertTrue("Should be able to override a class that is  
> not in java.*, javax.*, etc.", cls.getDeclaredMethods().length == 0);
> @@ -142,7 +167,7 @@
>      * parent ClassLoader.  This should work.
>      */
>     public void testFalseNonexistantJavaxResource() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), false, HIDDEN, NON_OVERRIDABLE);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         URL url = cl.getResource("javax/foo/Foo.class");
>         if(url == null) {
>             fail("Should be able to load a javax.* class that is  
> not defined by my parent CL");
> @@ -155,7 +180,8 @@
>      * parent ClassLoader.  This should work.
>      */
>     public void testTrueNonexistantJavaxResource() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), true, HIDDEN, NON_OVERRIDABLE);
> +        classLoadingRules.setInverseClassLoading(true);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         URL url = cl.getResource("javax/foo/Foo.class");
>         if(url == null) {
>             fail("Should be able to load a javax.* class that is  
> not defined by my parent CL");
> @@ -169,7 +195,7 @@
>      * This should always load the parent's copy.
>      */
>     public void testFalseExistantJavaxResource() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), false, HIDDEN, NON_OVERRIDABLE);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         URL url = cl.getResource("javax/servlet/Servlet.class");
>         if(url == null) {
>             fail("Problem with test; expecting to have  
> javax.servlet.* on the ClassPath");
> @@ -183,7 +209,8 @@
>      * This should always load the parent's copy.
>      */
>     public void testTrueExistantJavaxResource() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), true, HIDDEN, NON_OVERRIDABLE);
> +        classLoadingRules.setInverseClassLoading(true);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         URL url = cl.getResource("javax/servlet/Servlet.class");
>         if(url == null) {
>             fail("Problem with test; expecting to have  
> javax.servlet.* on the ClassPath");
> @@ -199,7 +226,7 @@
>      * copy when the contextPriorityClassLoader is set to true.
>      */
>     public void xtestFalseExistantNonJavaxResource() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), false, HIDDEN, NON_OVERRIDABLE);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         URL url = cl.getResource("mx4j/MBeanDescription.class");
>         if(url == null) {
>             fail("Problem with test; expecting to have mx4j.* on  
> the ClassPath");
> @@ -215,7 +242,9 @@
>      * the contextPriorityClassLoader is set to true (as here).
>      */
>     public void testTrueExistantNonJavaxResource() {
> -        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), true, new String[] {}, NON_OVERRIDABLE);
> +        classLoadingRules.setInverseClassLoading(true);
> +        classLoadingRules.getHiddenRule().setClassPrefixes 
> (Collections.EMPTY_SET);
> +        cl = new MultiParentClassLoader(configId, urls, getClass 
> ().getClassLoader(), classLoadingRules);
>         URL url = cl.getResource("mx4j/MBeanDescription.class");
>         if(url == null) {
>             fail("Problem with test; expecting to have mx4j.* on  
> the ClassPath");
>
> Modified: geronimo/server/trunk/plugins/openejb/geronimo-openejb- 
> builder/src/main/java/org/apache/geronimo/openejb/deployment/ 
> XmlUtil.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/ 
> openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/ 
> openejb/deployment/XmlUtil.java? 
> rev=712326&r1=712325&r2=712326&view=diff
> ====================================================================== 
> ========
> --- geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/ 
> src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java  
> (original)
> +++ geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/ 
> src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java  
> Fri Nov  7 16:40:08 2008
> @@ -17,10 +17,26 @@
>  */
>  package org.apache.geronimo.openejb.deployment;
>
> +import java.io.ByteArrayOutputStream;
> +import java.io.File;
> +import java.io.FileOutputStream;
> +import java.io.IOException;
> +import java.util.HashSet;
> +import java.util.List;
> +
> +import javax.xml.bind.JAXBContext;
> +import javax.xml.bind.JAXBElement;
> +import javax.xml.bind.JAXBException;
> +import javax.xml.bind.Marshaller;
> +import javax.xml.bind.ValidationEvent;
> +import javax.xml.namespace.QName;
> +
>  import org.apache.geronimo.common.DeploymentException;
>  import org.apache.geronimo.deployment.service.EnvironmentBuilder;
>  import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
>  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.openejb.xbeans.ejbjar.OpenejbEjbJarDocument;
> @@ -37,24 +53,11 @@
>  import org.apache.openejb.jee.oejb2.EnvironmentType;
>  import org.apache.openejb.jee.oejb2.GeronimoEjbJarType;
>  import org.apache.openejb.jee.oejb2.ImportType;
> -import org.apache.openejb.jee.oejb2.JaxbOpenejbJar2;
>  import org.apache.xmlbeans.XmlCursor;
>  import org.apache.xmlbeans.XmlDocumentProperties;
>  import org.apache.xmlbeans.XmlException;
>  import org.apache.xmlbeans.XmlObject;
>
> -import javax.xml.bind.JAXBContext;
> -import javax.xml.bind.JAXBElement;
> -import javax.xml.bind.JAXBException;
> -import javax.xml.bind.Marshaller;
> -import javax.xml.bind.ValidationEvent;
> -import javax.xml.namespace.QName;
> -import java.io.ByteArrayOutputStream;
> -import java.io.File;
> -import java.io.FileOutputStream;
> -import java.io.InputStream;
> -import java.io.IOException;
> -
>  public final class XmlUtil {
>     public static final QName OPENEJBJAR_QNAME =  
> OpenejbEjbJarDocument.type.getDocumentElementName();
>     private static final QName CMP_VERSION = new QName 
> (SchemaConversionUtils.J2EE_NAMESPACE, "cmp-version");
> @@ -159,13 +162,22 @@
>                     environment.addDependency(dependency);
>                 }
>             }
> -            environment.setInverseClassLoading 
> (environmentType.isInverseClassloading());
> +
>             environment.setSuppressDefaultEnvironment 
> (environmentType.isSuppressDefaultEnvironment());
> +
> +            ClassLoadingRules classLoadingRules =  
> environment.getClassLoadingRules();
> +            classLoadingRules.setInverseClassLoading 
> (environmentType.isInverseClassloading());
> +
>             if (environmentType.getHiddenClasses() != null) {
> -                environment.setHiddenClasses 
> (environmentType.getHiddenClasses().getFilter());
> +                ClassLoadingRule hiddenRule =  
> classLoadingRules.getHiddenRule();
> +                List<String> filter =  
> environmentType.getHiddenClasses().getFilter();
> +                hiddenRule.setClassPrefixes(new HashSet<String> 
> (filter));
>             }
> +
>             if (environmentType.getNonOverridableClasses() != null) {
> -                environment.setNonOverrideableClasses 
> (environmentType.getNonOverridableClasses().getFilter());
> +                ClassLoadingRule nonOverrideableRule =  
> classLoadingRules.getNonOverrideableRule();
> +                List<String> filter =  
> environmentType.getNonOverridableClasses().getFilter();
> +                nonOverrideableRule.setClassPrefixes(new  
> HashSet<String>(filter));
>             }
>         }
>         if (!environment.isSuppressDefaultEnvironment()) {
>
>
>
>
>
> -- 
> ~Jason Warner


Mime
View raw message