geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jason Warner" <jaw...@gmail.com>
Subject Re: svn commit: r712326 - in /geronimo/server/trunk: framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/ framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ framework/modules/geronimo
Date Mon, 10 Nov 2008 16:51:02 GMT
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