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

On Mon, Nov 10, 2008 at 3:02 PM, Gianny Damour <
gianny.damour@optusnet.com.au> wrote:

> Hi Jason,
>
> I updated the openejb-jee module
> (openejb/trunk/openejb3/container/openejb-jee) in order to support the new
> private-classes element. Should I manually deploy a new snapshot? Sorry, I
> do not remember the policy.
>
> Thanks,
> Gianny
>
>
> On 11/11/2008, at 3:51 AM, Jason Warner wrote:
>
>  Hi Gianny,
>>
>> I'm having trouble building trunk due to an error[1] that seems related to
>> this addition.  Any thoughts?
>>
>> Thanks!
>>
>> [1]
>> [severity=ERROR,message=unexpected element (uri:"http://
>> geronimo.apache.org/xml/ns/deployment-1.2", local:"private-classes").
>> Expected elements are <{http://geronimo.apache.org/xml/
>> ns/deployment-1.2}inverse-classloading>,<{http://
>> geronimo.apache.org/xml/ns/deployment-1.2}hidden-classes<http://geronimo.apache.org/xml/ns/deployment-1.2%7Dhidden-classes>
>> >,
>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}non-overridable-<http://geronimo.apache.org/xml/ns/deployment-1.2%7Dnon-overridable->
>> classes>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}moduleId<http://geronimo.apache.org/xml/ns/deployment-1.2%7DmoduleId>
>> >,
>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress-default-<http://geronimo.apache.org/xml/ns/deployment-1.2%7Dsuppress-default->
>> environment>,<{http://geronimo.apache.org/xml/ns/deployment-1.2
>> }dependencies>,locator=[node=null,object=null,url=null,line=19,col=27,offset=-1]]
>> [INFO]
>> ------------------------------------------------------------------------
>> [ERROR] BUILD ERROR
>> [INFO]
>> ------------------------------------------------------------------------
>> [INFO] could not package plugin
>>
>> Embedded error: Failed parsing descriptors for module:
>> /Users/jason/trunk/plugins/mejb/geronimo-mejb/target/geronimo-mejb-2.2-SNAPSHOT.jar
>> unexpected element (uri:"http://geronimo.apache.org/xml/ns/deployment-1.2",
>> local:"private-classes"). Expected elements are <{
>> http://geronimo.apache.org/xml/ns/deployment-1.2}inverse-<http://geronimo.apache.org/xml/ns/deployment-1.2%7Dinverse->
>> classloading>,<{http://geronimo.apache.org/xml/ns/deployment-1.2
>> }hidden-classes>,
>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}non-overridable-<http://geronimo.apache.org/xml/ns/deployment-1.2%7Dnon-overridable->
>> classes>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}moduleId<http://geronimo.apache.org/xml/ns/deployment-1.2%7DmoduleId>
>> >,
>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress-default-<http://geronimo.apache.org/xml/ns/deployment-1.2%7Dsuppress-default->
>> environment>,<{http://geronimo.apache.org/xml/ns/deployment-1.2
>> }dependencies>
>>
>>
>> On Fri, Nov 7, 2008 at 7:40 PM, <gdamour@apache.org> wrote:
>> Author: gdamour
>> Date: Fri Nov  7 16:40:08 2008
>> New Revision: 712326
>>
>> URL: http://svn.apache.org/viewvc?rev=712326&view=rev
>> Log:
>> Add private-classes element which allows specific classes to be hidden
>> from all child configurations. In effect, they are private to the
>> configuration.
>>
>> (GERONIMO-4403) Provide a mechanism to hide specific classes  of a
>> configuration to all its children
>>
>> Added:
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>> Modified:
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
>>
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
>>
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
>>
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
>>
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/assembly_1_result.xml
>>
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/gbean_1_result.xml
>>
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/servlet_1_result.xml
>>
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/transport_1_result.xml
>>
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/transport_2_result.xml
>>
>> geronimo/server/trunk/plugins/jetty/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ClassLoaderTest.java
>>
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
>> Fri Nov  7 16:40:08 2008
>> @@ -16,25 +16,25 @@
>>  */
>>  package org.apache.geronimo.kernel.classloader;
>>
>> -import java.io.IOException;
>>  import java.io.File;
>> -import java.net.URL;
>> +import java.io.IOException;
>>  import java.net.URI;
>> +import java.net.URL;
>>  import java.net.URLClassLoader;
>>  import java.security.AccessControlContext;
>>  import java.security.AccessController;
>>  import java.security.CodeSource;
>>  import java.security.PrivilegedAction;
>> -import java.security.PrivilegedExceptionAction;
>>  import java.security.PrivilegedActionException;
>> +import java.security.PrivilegedExceptionAction;
>>  import java.security.cert.Certificate;
>> -import java.util.Collection;
>>  import java.util.Enumeration;
>>  import java.util.jar.Attributes;
>>  import java.util.jar.Manifest;
>>
>>  import org.apache.geronimo.kernel.config.MultiParentClassLoader;
>>  import org.apache.geronimo.kernel.repository.Artifact;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>>
>>  /**
>>  * The JarFileClassLoader that loads classes and resources from a list of
>> JarFiles.  This method is simmilar to URLClassLoader
>> @@ -78,8 +78,8 @@
>>        addURLs(urls);
>>    }
>>
>> -    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader
>> parent, boolean inverseClassLoading, String[] hiddenClasses, String[]
>> nonOverridableClasses) {
>> -        super(id, EMPTY_URLS, parent, inverseClassLoading, hiddenClasses,
>> nonOverridableClasses);
>> +    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader
>> parent, ClassLoadingRules classLoadingRules) {
>> +        super(id, EMPTY_URLS, parent, classLoadingRules);
>>        this.acc = AccessController.getContext();
>>        addURLs(urls);
>>    }
>> @@ -96,14 +96,8 @@
>>        addURLs(urls);
>>    }
>>
>> -    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader[]
>> parents, boolean inverseClassLoading, Collection hiddenClasses, Collection
>> nonOverridableClasses) {
>> -        super(id, EMPTY_URLS, parents, inverseClassLoading,
>> hiddenClasses, nonOverridableClasses);
>> -        this.acc = AccessController.getContext();
>> -        addURLs(urls);
>> -    }
>> -
>> -    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader[]
>> parents, boolean inverseClassLoading, String[] hiddenClasses, String[]
>> nonOverridableClasses) {
>> -        super(id, EMPTY_URLS, parents, inverseClassLoading,
>> hiddenClasses, nonOverridableClasses);
>> +    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader[]
>> parents, ClassLoadingRules classLoadingRules) {
>> +        super(id, EMPTY_URLS, parents, classLoadingRules);
>>        this.acc = AccessController.getContext();
>>        addURLs(urls);
>>    }
>>
>> Added:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java?rev=712326&view=auto
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
>> (added)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
>> Fri Nov  7 16:40:08 2008
>> @@ -0,0 +1,92 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *  http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.geronimo.kernel.config;
>> +
>> +import java.io.IOException;
>> +import java.net.MalformedURLException;
>> +import java.net.URL;
>> +import java.security.SecureClassLoader;
>> +import java.util.Collections;
>> +import java.util.Enumeration;
>> +import java.util.List;
>> +
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>> +
>> +import sun.misc.CompoundEnumeration;
>> +
>> +/**
>> + *
>> + * @version $Rev:$ $Date:$
>> + */
>> +public class ChildrenConfigurationClassLoader extends SecureClassLoader {
>> +
>> +    private final ClassLoadingRules rules;
>> +
>> +    public ChildrenConfigurationClassLoader(ClassLoader parent,
>> ClassLoadingRules rules) {
>> +        super(parent);
>> +        if (null == rules) {
>> +            throw new IllegalArgumentException("rules is required");
>> +        }
>> +        this.rules = rules;
>> +    }
>> +
>> +    public Class<?> loadClass(String name, List<ClassLoader>
>> visitedClassLoaders) throws ClassNotFoundException {
>> +        return loadClass(name, false, visitedClassLoaders);
>> +    }
>> +
>> +    protected synchronized Class<?> loadClass(String name, boolean
>> resolve) throws ClassNotFoundException {
>> +        return loadClass(name, resolve, Collections.EMPTY_LIST);
>> +    }
>> +
>> +    protected synchronized Class<?> loadClass(String name, boolean
>> resolve, List<ClassLoader> visitedClassLoaders)
>> +            throws ClassNotFoundException {
>> +        ClassLoadingRule privateRule = rules.getPrivateRule();
>> +        ClassLoader parent = getParent();
>> +        if (privateRule.isFilteredClass(name)) {
>> +            throw new ClassNotFoundException(name + " is hidden by
>> classloader " + parent);
>> +        }
>> +
>> +        if (parent instanceof MultiParentClassLoader) {
>> +            try {
>> +                return ((MultiParentClassLoader)
>> parent).loadClassInternal(name, resolve, visitedClassLoaders);
>> +            } catch (MalformedURLException e) {
>> +            }
>> +        }
>> +        return super.loadClass(name, resolve);
>> +    }
>> +
>> +    public URL getResource(String name) {
>> +        ClassLoadingRule privateRule = rules.getPrivateRule();
>> +        if (privateRule.isFilteredResource(name)) {
>> +            return null;
>> +        }
>> +        return super.getResource(name);
>> +    }
>> +
>> +    public Enumeration<URL> getResources(String name) throws IOException
>> {
>> +        ClassLoadingRule privateRule = rules.getPrivateRule();
>> +        if (privateRule.isFilteredResource(name)) {
>> +            return new CompoundEnumeration(new Enumeration[0]);
>> +        }
>> +        return super.getResources(name);
>> +    }
>> +
>> +}
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
>> Fri Nov  7 16:40:08 2008
>> @@ -25,6 +25,7 @@
>>  import java.util.Collection;
>>  import java.util.Collections;
>>  import java.util.HashMap;
>> +import java.util.HashSet;
>>  import java.util.Iterator;
>>  import java.util.LinkedHashMap;
>>  import java.util.LinkedHashSet;
>> @@ -32,13 +33,10 @@
>>  import java.util.ListIterator;
>>  import java.util.Map;
>>  import java.util.Set;
>> -import java.util.HashSet;
>>
>>  import javax.management.MalformedObjectNameException;
>>  import javax.management.ObjectName;
>>
>> -import org.slf4j.Logger;
>> -import org.slf4j.LoggerFactory;
>>  import org.apache.geronimo.gbean.AbstractName;
>>  import org.apache.geronimo.gbean.AbstractNameQuery;
>>  import org.apache.geronimo.gbean.GBeanData;
>> @@ -51,10 +49,14 @@
>>  import org.apache.geronimo.kernel.Naming;
>>  import org.apache.geronimo.kernel.classloader.JarFileClassLoader;
>>  import org.apache.geronimo.kernel.repository.Artifact;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>>  import org.apache.geronimo.kernel.repository.Dependency;
>>  import org.apache.geronimo.kernel.repository.Environment;
>>  import org.apache.geronimo.kernel.repository.ImportType;
>>  import org.apache.geronimo.kernel.repository.MissingDependencyException;
>> +import org.slf4j.Logger;
>> +import org.slf4j.LoggerFactory;
>>
>>  /**
>>  * A Configuration represents a collection of runnable services that can
>> be
>> @@ -170,6 +172,11 @@
>>    private final MultiParentClassLoader configurationClassLoader;
>>
>>    /**
>> +     * The ClassLoader used by children configurations.
>> +     */
>> +    private final ClassLoader childrenConfigurationClassLoader;
>> +
>> +    /**
>>     * The relative class path (URI) of this configuation.
>>     */
>>    private final LinkedHashSet<String> classPath;
>> @@ -204,6 +211,7 @@
>>        classPath = null;
>>        configurationResolver = null;
>>        configurationClassLoader = null;
>> +        childrenConfigurationClassLoader = null;
>>        naming = null;
>>    }
>>
>> @@ -266,6 +274,9 @@
>>            // Build the configuration class loader
>>            //
>>            configurationClassLoader =
>> createConfigurationClasssLoader(parents, environment, classPath);
>> +
>> +            ClassLoadingRules rules = environment.getClassLoadingRules();
>> +            childrenConfigurationClassLoader = new
>> ChildrenConfigurationClassLoader(configurationClassLoader, rules);
>>
>>            //
>>            // Get all service parents in depth first order
>> @@ -333,22 +344,19 @@
>>            parentClassLoaders = new ClassLoader[classParents.size()];
>>            for (ListIterator iterator = classParents.listIterator();
>> iterator.hasNext();) {
>>                Configuration configuration = (Configuration)
>> iterator.next();
>> -                parentClassLoaders[iterator.previousIndex()] =
>> configuration.getConfigurationClassLoader();
>> +                parentClassLoaders[iterator.previousIndex()] =
>> configuration.childrenConfigurationClassLoader;
>>            }
>>        }
>>
>> -        // hidden classes
>> -        Set<String> hiddenClassesSet = environment.getHiddenClasses();
>> -        String[] hiddenClasses = hiddenClassesSet.toArray(new
>> String[hiddenClassesSet.size()]);
>> -
>>        // we need to propagate the non-overrideable classes from parents
>> -        LinkedHashSet<String> nonOverridableSet = new
>> LinkedHashSet<String>(environment.getNonOverrideableClasses());
>> +        ClassLoadingRules classLoadingRules =
>> environment.getClassLoadingRules();
>> +        ClassLoadingRule nonOverrideableRule =
>> classLoadingRules.getNonOverrideableRule();
>>        for (Configuration parent : classParents) {
>> -
>>            Environment parentEnvironment = parent.getEnvironment();
>> -
>>  nonOverridableSet.addAll(parentEnvironment.getNonOverrideableClasses());
>> +            ClassLoadingRules parentClassLoadingRules =
>> parentEnvironment.getClassLoadingRules();
>> +            ClassLoadingRule parentNonOverrideableRule =
>> parentClassLoadingRules.getNonOverrideableRule();
>> +            nonOverrideableRule.merge(parentNonOverrideableRule);
>>        }
>> -        String[] nonOverridableClasses = nonOverridableSet.toArray(new
>> String[nonOverridableSet.size()]);
>>
>>        if (log.isDebugEnabled()) {
>>            StringBuffer buf = new StringBuffer("ClassLoader structure for
>> configuration ").append(id).append("\n");
>> @@ -377,16 +385,12 @@
>>            return new JarFileClassLoader(environment.getConfigId(),
>>                    urls,
>>                    parentClassLoaders,
>> -                    environment.isInverseClassLoading(),
>> -                    hiddenClasses,
>> -                    nonOverridableClasses);
>> +                    classLoadingRules);
>>        } else {
>>            return new MultiParentClassLoader(environment.getConfigId(),
>>                    urls,
>>                    parentClassLoaders,
>> -                    environment.isInverseClassLoading(),
>> -                    hiddenClasses,
>> -                    nonOverridableClasses);
>> +                    classLoadingRules);
>>        }
>>    }
>>
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
>> Fri Nov  7 16:40:08 2008
>> @@ -27,7 +27,6 @@
>>  import java.net.URLClassLoader;
>>  import java.net.URLStreamHandlerFactory;
>>  import java.util.ArrayList;
>> -import java.util.Collection;
>>  import java.util.Collections;
>>  import java.util.Enumeration;
>>  import java.util.HashSet;
>> @@ -36,11 +35,13 @@
>>  import java.util.Map;
>>  import java.util.Set;
>>
>> -import org.slf4j.Logger;
>> -import org.slf4j.LoggerFactory;
>>  import org.apache.geronimo.kernel.classloader.UnionEnumeration;
>>  import org.apache.geronimo.kernel.repository.Artifact;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>>  import org.apache.geronimo.kernel.util.ClassLoaderRegistry;
>> +import org.slf4j.Logger;
>> +import org.slf4j.LoggerFactory;
>>
>>  /**
>>  * A MultiParentClassLoader is a simple extension of the URLClassLoader
>> that simply changes the single parent class
>> @@ -57,11 +58,7 @@
>>
>>    private final Artifact id;
>>    private final ClassLoader[] parents;
>> -    private final boolean inverseClassLoading;
>> -    private final String[] hiddenClasses;
>> -    private final String[] nonOverridableClasses;
>> -    private final String[] hiddenResources;
>> -    private final String[] nonOverridableResources;
>> +    private final ClassLoadingRules classLoadingRules;
>>    private boolean destroyed = false;
>>
>>    // I used this pattern as its temporary and with the static final we
>> get compile time
>> @@ -102,12 +99,9 @@
>>    public MultiParentClassLoader(Artifact id, URL[] urls) {
>>        super(urls);
>>        this.id = id;
>> +
>>        parents = new ClassLoader[]{ClassLoader.getSystemClassLoader()};
>> -        inverseClassLoading = false;
>> -        hiddenClasses = new String[0];
>> -        nonOverridableClasses = new String[0];
>> -        hiddenResources = new String[0];
>> -        nonOverridableResources = new String[0];
>> +        classLoadingRules = new ClassLoadingRules();
>>        ClassLoaderRegistry.add(this);
>>    }
>>
>> @@ -123,8 +117,8 @@
>>        this(id, urls, new ClassLoader[]{parent});
>>    }
>>
>> -    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader
>> parent, boolean inverseClassLoading, String[] hiddenClasses, String[]
>> nonOverridableClasses) {
>> -        this(id, urls, new ClassLoader[]{parent}, inverseClassLoading,
>> hiddenClasses, nonOverridableClasses);
>> +    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader
>> parent, ClassLoadingRules classLoadingRules) {
>> +        this(id, urls, new ClassLoader[]{parent}, classLoadingRules);
>>    }
>>
>>    /**
>> @@ -151,32 +145,21 @@
>>        super(urls);
>>        this.id = id;
>>        this.parents = copyParents(parents);
>> -        inverseClassLoading = false;
>> -        hiddenClasses = new String[0];
>> -        nonOverridableClasses = new String[0];
>> -        hiddenResources = new String[0];
>> -        nonOverridableResources = new String[0];
>> -        ClassLoaderRegistry.add(this);
>> -    }
>>
>> -    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader[]
>> parents, boolean inverseClassLoading, Collection hiddenClasses, Collection
>> nonOverridableClasses) {
>> -        this(id, urls, parents, inverseClassLoading, (String[])
>> hiddenClasses.toArray(new String[hiddenClasses.size()]), (String[])
>> nonOverridableClasses.toArray(new String[nonOverridableClasses.size()]));
>> +        classLoadingRules = new ClassLoadingRules();
>> +        ClassLoaderRegistry.add(this);
>>    }
>>
>> -    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader[]
>> parents, boolean inverseClassLoading, String[] hiddenClasses, String[]
>> nonOverridableClasses) {
>> +    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader[]
>> parents, ClassLoadingRules classLoadingRules) {
>>        super(urls);
>>        this.id = id;
>>        this.parents = copyParents(parents);
>> -        this.inverseClassLoading = inverseClassLoading;
>> -        this.hiddenClasses = hiddenClasses;
>> -        this.nonOverridableClasses = nonOverridableClasses;
>> -        hiddenResources = toResources(hiddenClasses);
>> -        nonOverridableResources = toResources(nonOverridableClasses);
>> +        this.classLoadingRules = classLoadingRules;
>>        ClassLoaderRegistry.add(this);
>>    }
>>
>>    public MultiParentClassLoader(MultiParentClassLoader source) {
>> -        this(source.id, source.getURLs(),
>> deepCopyParents(source.parents), source.inverseClassLoading,
>> source.hiddenClasses, source.nonOverridableClasses);
>> +        this(source.id, source.getURLs(),
>> deepCopyParents(source.parents), source.classLoadingRules);
>>    }
>>
>>    static ClassLoader copy(ClassLoader source) {
>> @@ -193,15 +176,6 @@
>>        return MultiParentClassLoader.copy(this);
>>    }
>>
>> -    private String[] toResources(String[] classes) {
>> -        String[] resources = new String[classes.length];
>> -        for (int i = 0; i < classes.length; i++) {
>> -            String className = classes[i];
>> -            resources[i] = className.replace('.', '/');
>> -        }
>> -        return resources;
>> -    }
>> -
>>    /**
>>     * Creates a named class loader as a child of the specified parents and
>> using the specified URLStreamHandlerFactory
>>     * for accessing the urls..
>> @@ -215,11 +189,8 @@
>>        super(urls, null, factory);
>>        this.id = id;
>>        this.parents = copyParents(parents);
>> -        inverseClassLoading = false;
>> -        hiddenClasses = new String[0];
>> -        nonOverridableClasses = new String[0];
>> -        hiddenResources = new String[0];
>> -        nonOverridableResources = new String[0];
>> +
>> +        classLoadingRules = new ClassLoadingRules();
>>        ClassLoaderRegistry.add(this);
>>    }
>>
>> @@ -320,7 +291,7 @@
>>        //
>>        // if we are using inverse class loading, check local urls first
>>        //
>> -        if (inverseClassLoading && !isDestroyed() &&
>> !isNonOverridableClass(name)) {
>> +        if (classLoadingRules.isInverseClassLoading() && !isDestroyed()
>> && !isNonOverridableClass(name)) {
>>            try {
>>                Class clazz = findClass(name);
>>                return resolveClass(clazz, resolve);
>> @@ -404,7 +375,7 @@
>>        //
>>        // if we are using inverse class loading, check local urls first
>>        //
>> -        if (inverseClassLoading && !isDestroyed() &&
>> !isNonOverridableClass(name)) {
>> +        if (classLoadingRules.isInverseClassLoading() && !isDestroyed()
>> && !isNonOverridableClass(name)) {
>>            try {
>>                Class clazz = findClass(name);
>>                return resolveClass(clazz, resolve);
>> @@ -453,7 +424,7 @@
>>     * @return
>>     * @throws ClassNotFoundException
>>     */
>> -    protected synchronized Class<?> loadClassInternal(String name,
>> boolean resolve, LinkedList<ClassLoader> visitedClassLoaders) throws
>> ClassNotFoundException, MalformedURLException {
>> +    protected synchronized Class<?> loadClassInternal(String name,
>> boolean resolve, List<ClassLoader> visitedClassLoaders) throws
>> ClassNotFoundException, MalformedURLException {
>>        //
>>        // Check if class is in the loaded classes cache
>>        //
>> @@ -500,7 +471,7 @@
>>     * @return
>>     * @throws ClassNotFoundException
>>     */
>> -    private synchronized Class<?> checkParents(String name, boolean
>> resolve, LinkedList<ClassLoader> visitedClassLoaders) throws
>> ClassNotFoundException {
>> +    private synchronized Class<?> checkParents(String name, boolean
>> resolve, List<ClassLoader> visitedClassLoaders) throws
>> ClassNotFoundException {
>>        for (ClassLoader parent : parents) {
>>            if (!visitedClassLoaders.contains(parent)) {
>>                visitedClassLoaders.add(parent);  // Track that we've been
>> here before
>> @@ -508,6 +479,9 @@
>>                       if (parent instanceof MultiParentClassLoader) {
>>                               Class clazz = ((MultiParentClassLoader)
>> parent).loadClassInternal(name, resolve, visitedClassLoaders);
>>                               if (clazz != null) return
>> resolveClass(clazz, resolve);
>> +                       } else if (parent instanceof
>> ChildrenConfigurationClassLoader) {
>> +                        Class clazz = ((ChildrenConfigurationClassLoader)
>> parent).loadClass(name, visitedClassLoaders);
>> +                        if (clazz != null) return resolveClass(clazz,
>> resolve);
>>                       } else {
>>                               return parent.loadClass(name);
>>                       }
>> @@ -523,21 +497,13 @@
>>    }
>>
>>    private boolean isNonOverridableClass(String name) {
>> -        for (String nonOverridableClass : nonOverridableClasses) {
>> -            if (name.startsWith(nonOverridableClass)) {
>> -                return true;
>> -            }
>> -        }
>> -        return false;
>> +        ClassLoadingRule nonOverrideableRule =
>> classLoadingRules.getNonOverrideableRule();
>> +        return nonOverrideableRule.isFilteredClass(name);
>>    }
>>
>>    private boolean isHiddenClass(String name) {
>> -        for (String hiddenClass : hiddenClasses) {
>> -            if (name.startsWith(hiddenClass)) {
>> -                return true;
>> -            }
>> -        }
>> -        return false;
>> +        ClassLoadingRule hiddenRule = classLoadingRules.getHiddenRule();
>> +        return hiddenRule.isFilteredClass(name);
>>    }
>>
>>    private Class resolveClass(Class clazz, boolean resolve) {
>> @@ -555,7 +521,7 @@
>>        //
>>        // if we are using inverse class loading, check local urls first
>>        //
>> -        if (inverseClassLoading && !isDestroyed() &&
>> !isNonOverridableResource(name)) {
>> +        if (classLoadingRules.isInverseClassLoading() && !isDestroyed()
>> && !isNonOverridableResource(name)) {
>>            URL url = findResource(name);
>>            if (url != null) {
>>                return url;
>> @@ -606,7 +572,7 @@
>>            return;
>>        }
>>        knownClassloaders.add(this);
>> -        if (inverseClassLoading && !isNonOverridableResource(name)) {
>> +        if (classLoadingRules.isInverseClassLoading() &&
>> !isNonOverridableResource(name)) {
>>            enumerations.add(internalfindResources(name));
>>        }
>>        if (!isHiddenResource(name)) {
>> @@ -621,7 +587,7 @@
>>                }
>>            }
>>        }
>> -        if (!inverseClassLoading) {
>> +        if (!classLoadingRules.isInverseClassLoading()) {
>>            enumerations.add(internalfindResources(name));
>>        }
>>    }
>> @@ -631,21 +597,13 @@
>>    }
>>
>>    private boolean isNonOverridableResource(String name) {
>> -        for (String nonOverridableResource : nonOverridableResources) {
>> -            if (name.startsWith(nonOverridableResource)) {
>> -                return true;
>> -            }
>> -        }
>> -        return false;
>> +        ClassLoadingRule nonOverrideableRule =
>> classLoadingRules.getNonOverrideableRule();
>> +        return nonOverrideableRule.isFilteredResource(name);
>>    }
>>
>>    private boolean isHiddenResource(String name) {
>> -        for (String hiddenResource : hiddenResources) {
>> -            if (name.startsWith(hiddenResource)) {
>> -                return true;
>> -            }
>> -        }
>> -        return false;
>> +        ClassLoadingRule hiddenRule = classLoadingRules.getHiddenRule();
>> +        return hiddenRule.isFilteredResource(name);
>>    }
>>
>>    public String toString() {
>>
>> Added:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java?rev=712326&view=auto
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
>> (added)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
>> Fri Nov  7 16:40:08 2008
>> @@ -0,0 +1,85 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *  http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.geronimo.kernel.repository;
>> +
>> +import java.io.Serializable;
>> +import java.util.HashSet;
>> +import java.util.Set;
>> +
>> +/**
>> + *
>> + * @version $Rev:$ $Date:$
>> + */
>> +public class ClassLoadingRule implements Serializable {
>> +    private final Set<String> classPrefixes;
>> +    private final Set<String> resourcePrefixes;
>> +
>> +    public ClassLoadingRule() {
>> +        classPrefixes = new HashSet<String>();
>> +        resourcePrefixes = new HashSet<String>();
>> +    }
>> +
>> +    public Set<String> getClassPrefixes() {
>> +        return classPrefixes;
>> +    }
>> +
>> +    public boolean isFilteredClass(String name) {
>> +        return isMatching(classPrefixes, name);
>> +    }
>> +
>> +    public boolean isFilteredResource(String name) {
>> +        return isMatching(resourcePrefixes, name);
>> +    }
>> +
>> +    public void addClassPrefixes(Set<String> classPrefixes) {
>> +        this.classPrefixes.addAll(classPrefixes);
>> +
>> +        Set<String> resources = toResources(classPrefixes);
>> +        resourcePrefixes.addAll(resources);
>> +    }
>> +
>> +    public void setClassPrefixes(Set<String> classPrefixes) {
>> +        this.classPrefixes.clear();
>> +        resourcePrefixes.clear();
>> +        addClassPrefixes(classPrefixes);
>> +    }
>> +
>> +    public void merge(ClassLoadingRule classLoadingRuleToMerge) {
>> +        addClassPrefixes(classLoadingRuleToMerge.classPrefixes);
>> +    }
>> +
>> +    protected Set<String> toResources(Set<String> classPrefixes) {
>> +        Set<String> resources = new HashSet<String>();
>> +        for (String className : classPrefixes) {
>> +            resources.add(className.replace('.', '/'));
>> +        }
>> +        return resources;
>> +    }
>> +
>> +    protected boolean isMatching(Set<String> prefixes, String name) {
>> +        for (String prefix : prefixes) {
>> +            if (name.startsWith(prefix)) {
>> +                return true;
>> +            }
>> +        }
>> +        return false;
>> +    }
>> +
>> +}
>> \ No newline at end of file
>>
>> Added:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java?rev=712326&view=auto
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
>> (added)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
>> Fri Nov  7 16:40:08 2008
>> @@ -0,0 +1,72 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *  http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.geronimo.kernel.repository;
>> +
>> +import java.io.Serializable;
>> +
>> +
>> +/**
>> + *
>> + * @version $Rev:$ $Date:$
>> + */
>> +public class ClassLoadingRules implements Serializable {
>> +    private final ClassLoadingRule hiddenRule;
>> +    private final ClassLoadingRule nonOverrideableRule;
>> +    private final ClassLoadingRule privateRule;
>> +    private boolean inverseClassLoading;
>> +
>> +    public ClassLoadingRules() {
>> +        hiddenRule = new ClassLoadingRule();
>> +        nonOverrideableRule = new ClassLoadingRule();
>> +        privateRule = new ClassLoadingRule();
>> +    }
>> +
>> +    public ClassLoadingRule getHiddenRule() {
>> +        return hiddenRule;
>> +    }
>> +
>> +    public ClassLoadingRule getNonOverrideableRule() {
>> +        return nonOverrideableRule;
>> +    }
>> +
>> +    public ClassLoadingRule getPrivateRule() {
>> +        return privateRule;
>> +    }
>> +
>> +    public boolean isInverseClassLoading() {
>> +        return inverseClassLoading;
>> +    }
>> +
>> +    public void setInverseClassLoading(boolean inverseClassLoading) {
>> +        this.inverseClassLoading = inverseClassLoading;
>> +    }
>> +
>> +    public void merge(ClassLoadingRules classLoadingRulesToMerge) {
>> +        if (inverseClassLoading) {
>> +            return;
>> +        }
>> +        inverseClassLoading =
>> classLoadingRulesToMerge.inverseClassLoading;
>> +
>> +        hiddenRule.merge(classLoadingRulesToMerge.hiddenRule);
>> +
>>  nonOverrideableRule.merge(classLoadingRulesToMerge.nonOverrideableRule);
>> +        privateRule.merge(classLoadingRulesToMerge.privateRule);
>> +    }
>> +
>> +}
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
>> Fri Nov  7 16:40:08 2008
>> @@ -179,7 +179,7 @@
>>            }
>>
>>            Environment environment = configuration.getEnvironment();
>> -            if (environment.isInverseClassLoading()) {
>> +            if
>> (environment.getClassLoadingRules().isInverseClassLoading()) {
>>                // Search dependencies of the configuration before
>> searching the parents
>>                Artifact artifact =
>> getArtifactVersion(configuration.getDependencies(), working);
>>                if (artifact != null) {
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
>> Fri Nov  7 16:40:08 2008
>> @@ -18,14 +18,12 @@
>>  package org.apache.geronimo.kernel.repository;
>>
>>  import java.io.Serializable;
>> +import java.util.ArrayList;
>>  import java.util.Collection;
>> -import java.util.HashSet;
>> -import java.util.LinkedHashSet;
>> -import java.util.Set;
>> -import java.util.List;
>>  import java.util.Collections;
>> -import java.util.ArrayList;
>>  import java.util.Iterator;
>> +import java.util.LinkedHashSet;
>> +import java.util.List;
>>
>>  /**
>>  * holds the data from the EnvironmentType xml while it is being resolved,
>> transitively closed, etc.
>> @@ -36,29 +34,25 @@
>>    private static final long serialVersionUID = 7075760873629376317L;
>>
>>    private Artifact configId;
>> -
>>    private final LinkedHashSet dependencies = new LinkedHashSet();
>> -
>> -    private final Set hiddenClasses = new HashSet();
>> -    private final Set nonOverrideableClasses = new HashSet();
>> -
>> -    private boolean inverseClassLoading;
>> +    private final ClassLoadingRules classLoadingRules;
>>    private boolean suppressDefaultEnvironment;
>>
>>    public Environment() {
>> +        classLoadingRules = new ClassLoadingRules();
>>    }
>>
>>    public Environment(Artifact configId) {
>>        this.configId = configId;
>> +
>> +        classLoadingRules = new ClassLoadingRules();
>>    }
>>
>>    public Environment(Environment environment) {
>> -        this.configId = environment.getConfigId();
>> -        this.dependencies.addAll(environment.dependencies);
>> -        this.hiddenClasses.addAll(environment.getHiddenClasses());
>> -
>>  this.nonOverrideableClasses.addAll(environment.getNonOverrideableClasses());
>> -        this.inverseClassLoading = environment.isInverseClassLoading();
>> -        this.suppressDefaultEnvironment =
>> environment.isSuppressDefaultEnvironment();
>> +        configId = environment.getConfigId();
>> +        dependencies.addAll(environment.dependencies);
>> +        suppressDefaultEnvironment =
>> environment.isSuppressDefaultEnvironment();
>> +        classLoadingRules = environment.classLoadingRules;
>>    }
>>
>>    public Artifact getConfigId() {
>> @@ -100,46 +94,8 @@
>>        addDependencies(dependencies);
>>    }
>>
>> -    /**
>> -     * todo: I should be documented so it's not completely unclear what
>> kind of
>> -     * elements I hold.
>> -     */
>> -    public Set getHiddenClasses() {
>> -        return hiddenClasses;
>> -    }
>> -
>> -    public void addHiddenClasses(Collection hiddenClasses) {
>> -        this.hiddenClasses.addAll(hiddenClasses);
>> -    }
>> -
>> -    public void setHiddenClasses(Collection hiddenClasses) {
>> -        this.hiddenClasses.clear();
>> -        addHiddenClasses(hiddenClasses);
>> -    }
>> -
>> -    /**
>> -     * todo: I should be documented so it's not completely unclear what
>> kind of
>> -     * elements I hold.
>> -     */
>> -    public Set getNonOverrideableClasses() {
>> -        return nonOverrideableClasses;
>> -    }
>> -
>> -    public void addNonOverrideableClasses(Collection
>> nonOverrideableClasses) {
>> -        this.nonOverrideableClasses.addAll(nonOverrideableClasses);
>> -    }
>> -
>> -    public void setNonOverrideableClasses(Collection
>> nonOverrideableClasses) {
>> -        this.nonOverrideableClasses.clear();
>> -        addNonOverrideableClasses(nonOverrideableClasses);
>> -    }
>> -
>> -    public boolean isInverseClassLoading() {
>> -        return inverseClassLoading;
>> -    }
>> -
>> -    public void setInverseClassLoading(boolean inverseClassLoading) {
>> -        this.inverseClassLoading = inverseClassLoading;
>> +    public ClassLoadingRules getClassLoadingRules() {
>> +        return classLoadingRules;
>>    }
>>
>>    public boolean isSuppressDefaultEnvironment() {
>>
>> Added:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java?rev=712326&view=auto
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
>> (added)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
>> Fri Nov  7 16:40:08 2008
>> @@ -0,0 +1,78 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *  http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.geronimo.kernel.config;
>> +
>> +import java.util.Collections;
>> +
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>> +
>> +import junit.framework.TestCase;
>> +
>> +/**
>> + *
>> + * @version $Rev:$ $Date:$
>> + */
>> +public class ChildrenConfigurationClassLoaderTest extends TestCase {
>> +
>> +    private String privateResourceName;
>> +    private String privateResourceClass;
>> +    private ChildrenConfigurationClassLoader classLoader;
>> +    private ClassLoadingRules rules;
>> +
>> +    @Override
>> +    protected void setUp() throws Exception {
>> +        rules = new ClassLoadingRules();
>> +        privateResourceClass =
>> ChildrenConfigurationClassLoaderTest.class.getName();
>> +        privateResourceName = privateResourceClass.replace(".", "/") +
>> ".class";
>> +
>> +        classLoader = new
>> ChildrenConfigurationClassLoader(ChildrenConfigurationClassLoaderTest.class.getClassLoader(),
>> rules);
>> +    }
>> +
>> +    public void testLoadClassThrowsCNFEForHiddenClass() throws Exception
>> {
>> +        classLoader.loadClass(privateResourceClass);
>> +
>> +        addPrivateConfiguration();
>> +
>> +        try {
>> +            classLoader.loadClass(privateResourceClass);
>> +            fail();
>> +        } catch (ClassNotFoundException e) {
>> +        }
>> +    }
>> +
>> +    public void testGetResourceReturnsNullForHiddenClass() throws
>> Exception {
>> +        assertNotNull(classLoader.getResource(privateResourceName));
>> +        addPrivateConfiguration();
>> +        assertNull(classLoader.getResource(privateResourceName));
>> +    }
>> +
>> +    public void testGetResourcesReturnsEmptyEnumForHiddenClass() throws
>> Exception {
>> +
>>  assertTrue(classLoader.getResources(privateResourceName).hasMoreElements());
>> +        addPrivateConfiguration();
>> +
>>  assertFalse(classLoader.getResources(privateResourceName).hasMoreElements());
>> +    }
>> +
>> +    private void addPrivateConfiguration() {
>> +        ClassLoadingRule rule = rules.getPrivateRule();
>> +
>>  rule.addClassPrefixes(Collections.singleton(privateResourceClass));
>> +    }
>> +
>> +}
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
>> Fri Nov  7 16:40:08 2008
>> @@ -26,6 +26,7 @@
>>  import java.util.jar.JarFile;
>>  import java.util.jar.JarOutputStream;
>>  import java.util.jar.JarEntry;
>> +import java.util.Collections;
>>  import java.util.Enumeration;
>>
>>  import junit.framework.TestCase;
>> @@ -35,6 +36,8 @@
>>  import net.sf.cglib.core.Predicate;
>>  import net.sf.cglib.core.DefaultGeneratorStrategy;
>>  import org.apache.geronimo.kernel.repository.Artifact;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>>
>>  /**
>>  * @version $Rev$ $Date$
>> @@ -141,7 +144,9 @@
>>        Class clazz = cl.loadClass(CLASS_NAME);
>>        assertSame(parentCl, clazz.getClassLoader());
>>
>> -        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
>> parentCl, true, new String[0], new String[0]);
>> +        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
>> +        classLoadingRules.setInverseClassLoading(true);
>> +        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
>> parentCl, classLoadingRules);
>>        clazz = cl.loadClass(CLASS_NAME);
>>        assertSame(cl, clazz.getClassLoader());
>>    }
>> @@ -154,7 +159,10 @@
>>        Class clazz = cl.loadClass(CLASS_NAME);
>>        assertSame(parentCl, clazz.getClassLoader());
>>
>> -        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
>> parentCl, false, new String[] {CLASS_NAME}, new String[0]);
>> +        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
>> +        ClassLoadingRule classLoadingRule =
>> classLoadingRules.getHiddenRule();
>> +
>>  classLoadingRule.addClassPrefixes(Collections.singleton(CLASS_NAME));
>> +        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
>> parentCl, classLoadingRules);
>>        clazz = cl.loadClass(CLASS_NAME);
>>        assertSame(cl, clazz.getClassLoader());
>>    }
>> @@ -167,7 +175,11 @@
>>        Class clazz = cl.loadClass(CLASS_NAME);
>>        assertSame(parentCl, clazz.getClassLoader());
>>
>> -        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
>> parentCl, true, new String[0], new String[] {CLASS_NAME});
>> +        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
>> +        classLoadingRules.setInverseClassLoading(true);
>> +        ClassLoadingRule classLoadingRule =
>> classLoadingRules.getNonOverrideableRule();
>> +
>>  classLoadingRule.addClassPrefixes(Collections.singleton(CLASS_NAME));
>> +        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
>> parentCl, classLoadingRules);
>>        clazz = cl.loadClass(CLASS_NAME);
>>        assertSame(parentCl, clazz.getClassLoader());
>>    }
>>
>> Added:
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java?rev=712326&view=auto
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
>> (added)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
>> Fri Nov  7 16:40:08 2008
>> @@ -0,0 +1,84 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *  http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.geronimo.kernel.repository;
>> +
>> +import java.util.Collections;
>> +import java.util.Set;
>> +
>> +import junit.framework.TestCase;
>> +
>> +/**
>> + *
>> + * @version $Rev:$ $Date:$
>> + */
>> +public class ClassLoadingRuleTest extends TestCase {
>> +    private static final String FILTERED_PREFIX = "org.apache.geronimo";
>> +    private static final String FILTERED_RESOURCE_PREFIX =
>> "org/apache/geronimo";
>> +
>> +    private ClassLoadingRule rule;
>> +
>> +    @Override
>> +    protected void setUp() throws Exception {
>> +        rule = new ClassLoadingRule();
>> +        Set<String> filter = Collections.singleton(FILTERED_PREFIX);
>> +        rule.addClassPrefixes(filter);
>> +    }
>> +
>> +    public void testIsFilteredClass() throws Exception {
>> +        assertTrue(rule.isFilteredClass(FILTERED_PREFIX + ".mock"));
>> +    }
>> +
>> +    public void testIsNotFilteredClass() throws Exception {
>> +        assertFalse(rule.isFilteredClass("mock"));
>> +    }
>> +
>> +    public void testIsFilteredResource() throws Exception {
>> +        assertTrue(rule.isFilteredResource(FILTERED_RESOURCE_PREFIX +
>> "/mock"));
>> +    }
>> +
>> +    public void testIsNotFilteredResource() throws Exception {
>> +        assertFalse(rule.isFilteredResource("mock"));
>> +    }
>> +
>> +    public void testMerge() throws Exception {
>> +        ClassLoadingRule ruleToMerge = new ClassLoadingRule();
>> +        String mergedFilteredPrefix = "geronimo";
>> +        Set<String> filter = Collections.singleton(mergedFilteredPrefix);
>> +        ruleToMerge.addClassPrefixes(filter);
>> +
>> +        rule.merge(ruleToMerge);
>> +
>> +        assertTrue(rule.isFilteredClass(mergedFilteredPrefix + ".mock"));
>> +        assertTrue(rule.isFilteredResource(mergedFilteredPrefix +
>> "/mock"));
>> +    }
>> +
>> +    public void testSetClassPrefixResetState() throws Exception {
>> +        String newFilteredPrefix = "geronimo";
>> +        Set<String> filter = Collections.singleton(newFilteredPrefix);
>> +        rule.setClassPrefixes(filter);
>> +
>> +        assertTrue(rule.isFilteredClass(newFilteredPrefix + ".mock"));
>> +        assertTrue(rule.isFilteredResource(newFilteredPrefix + "/mock"));
>> +
>> +        assertFalse(rule.isFilteredClass(FILTERED_PREFIX + ".mock"));
>> +        assertFalse(rule.isFilteredResource(FILTERED_PREFIX + "/mock"));
>> +    }
>> +
>> +}
>>
>> Added:
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java?rev=712326&view=auto
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
>> (added)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
>> Fri Nov  7 16:40:08 2008
>> @@ -0,0 +1,70 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *  http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.geronimo.deployment.service;
>> +
>> +import java.util.HashSet;
>> +import java.util.Set;
>> +
>> +import org.apache.geronimo.deployment.xbeans.ClassFilterType;
>> +import org.apache.geronimo.deployment.xbeans.EnvironmentType;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>> +
>> +/**
>> + *
>> + * @version $Rev:$ $Date:$
>> + */
>> +public final class ClassLoadingRulesUtil {
>> +
>> +    private ClassLoadingRulesUtil() {
>> +    }
>> +
>> +    public static void configureRules(ClassLoadingRules
>> classLoadingRules, EnvironmentType environmentType) {
>> +
>>  classLoadingRules.setInverseClassLoading(environmentType.isSetInverseClassloading());
>> +
>> +        if (null != environmentType.getHiddenClasses()) {
>> +            ClassLoadingRule hiddenRule =
>> classLoadingRules.getHiddenRule();
>> +
>>  hiddenRule.setClassPrefixes(toFilters(environmentType.getHiddenClasses()));
>> +        }
>> +
>> +        if (null != environmentType.getNonOverridableClasses()) {
>> +            ClassLoadingRule nonOverrideableRule =
>> classLoadingRules.getNonOverrideableRule();
>> +
>>  nonOverrideableRule.setClassPrefixes(toFilters(environmentType.getNonOverridableClasses()));
>> +        }
>> +
>> +        if (null != environmentType.getPrivateClasses()) {
>> +            ClassLoadingRule privateRule =
>> classLoadingRules.getPrivateRule();
>> +
>>  privateRule.setClassPrefixes(toFilters(environmentType.getPrivateClasses()));
>> +        }
>> +    }
>> +
>> +    private static Set<String> toFilters(ClassFilterType filterType) {
>> +        Set<String> filters = new HashSet<String>();
>> +        if (null != filterType) {
>> +            String[] filterArray = filterType.getFilterArray();
>> +            for (String filter : filterArray) {
>> +                filter = filter.trim();
>> +                filters.add(filter);
>> +            }
>> +        }
>> +        return filters;
>> +    }
>> +
>> +}
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
>> Fri Nov  7 16:40:08 2008
>> @@ -38,6 +38,8 @@
>>  import org.apache.geronimo.deployment.xbeans.ImportType;
>>  import org.apache.geronimo.deployment.xbeans.DependencyType;
>>  import org.apache.geronimo.kernel.repository.Artifact;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>>  import org.apache.geronimo.kernel.repository.Dependency;
>>  import org.apache.geronimo.kernel.repository.Environment;
>>  import org.apache.xmlbeans.XmlException;
>> @@ -63,10 +65,9 @@
>>                LinkedHashSet dependencies =
>> toDependencies(dependencyArray);
>>                environment.setDependencies(dependencies);
>>            }
>> -
>>  environment.setInverseClassLoading(environmentType.isSetInverseClassloading());
>>
>>  environment.setSuppressDefaultEnvironment(environmentType.isSetSuppressDefaultEnvironment());
>> -
>>  environment.setHiddenClasses(toFilters(environmentType.getHiddenClasses()));
>> -
>>  environment.setNonOverrideableClasses(toFilters(environmentType.getNonOverridableClasses()));
>> +
>> +
>>  ClassLoadingRulesUtil.configureRules(environment.getClassLoadingRules(),
>> environmentType);
>>        }
>>
>>        return environment;
>> @@ -79,10 +80,11 @@
>>
>>  environment.setConfigId(additionalEnvironment.getConfigId());
>>            }
>>
>>  environment.addDependencies(additionalEnvironment.getDependencies());
>> -
>>  environment.setInverseClassLoading(environment.isInverseClassLoading() ||
>> additionalEnvironment.isInverseClassLoading());
>>
>>  environment.setSuppressDefaultEnvironment(environment.isSuppressDefaultEnvironment()
>> || additionalEnvironment.isSuppressDefaultEnvironment());
>> -
>>  environment.addHiddenClasses(additionalEnvironment.getHiddenClasses());
>> -
>>  environment.addNonOverrideableClasses(additionalEnvironment.getNonOverrideableClasses());
>> +
>> +            ClassLoadingRules classLoadingRules =
>> environment.getClassLoadingRules();
>> +            ClassLoadingRules additionalClassLoadingRules =
>> additionalEnvironment.getClassLoadingRules();
>> +            classLoadingRules.merge(additionalClassLoadingRules);
>>        }
>>    }
>>
>> @@ -105,14 +107,25 @@
>>        DependencyType[] dependencyTypes = (DependencyType[])
>> dependencies.toArray(new DependencyType[dependencies.size()]);
>>        DependenciesType dependenciesType =
>> environmentType.addNewDependencies();
>>        dependenciesType.setDependencyArray(dependencyTypes);
>> -        if (environment.isInverseClassLoading()) {
>> +
>> +        ClassLoadingRules classLoadingRules =
>> environment.getClassLoadingRules();
>> +        if (classLoadingRules.isInverseClassLoading()) {
>>            environmentType.addNewInverseClassloading();
>>        }
>> +
>>        if (environment.isSuppressDefaultEnvironment()) {
>>            environmentType.addNewSuppressDefaultEnvironment();
>>        }
>> -
>>  environmentType.setHiddenClasses(toFilterType(environment.getHiddenClasses()));
>> -
>>  environmentType.setNonOverridableClasses(toFilterType(environment.getNonOverrideableClasses()));
>> +
>> +        ClassLoadingRule classLoadingRule =
>> classLoadingRules.getHiddenRule();
>> +
>>  environmentType.setHiddenClasses(toFilterType(classLoadingRule.getClassPrefixes()));
>> +
>> +        classLoadingRule = classLoadingRules.getNonOverrideableRule();
>> +
>>  environmentType.setNonOverridableClasses(toFilterType(classLoadingRule.getClassPrefixes()));
>> +
>> +        classLoadingRule = classLoadingRules.getPrivateRule();
>> +
>>  environmentType.setPrivateClasses(toFilterType(classLoadingRule.getClassPrefixes()));
>> +
>>        return environmentType;
>>    }
>>
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
>> Fri Nov  7 16:40:08 2008
>> @@ -204,6 +204,21 @@
>>                    </xs:documentation>
>>                </xs:annotation>
>>            </xs:element>
>> +            <xs:element name="private-classes"
>> +                type="sys:classFilterType" minOccurs="0">
>> +                <xs:annotation>
>> +                    <xs:documentation>
>> +                        A list of classes which will only be loaded from
>> the
>> +                        ClassLoader of this module or from parent
>> ClassLoaders.
>> +
>> +                        This is used to prevent children configurations
>> to see
>> +                        specific classes from its parents. The same
>> effect can
>> +                        be achieved by using hidden-classes. However,
>> +                        private-classes is the preferred approach to hide
>> +                        specific classes from all children
>> configurations.
>> +                    </xs:documentation>
>> +                </xs:annotation>
>> +            </xs:element>
>>            <xs:element name="inverse-classloading" type="sys:emptyType"
>>                minOccurs="0">
>>                <xs:annotation>
>>
>> Added:
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java?rev=712326&view=auto
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>> (added)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
>> Fri Nov  7 16:40:08 2008
>> @@ -0,0 +1,66 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *  http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.geronimo.deployment.service;
>> +
>> +import java.util.Set;
>> +
>> +import junit.framework.TestCase;
>> +
>> +import org.apache.geronimo.deployment.xbeans.ClassFilterType;
>> +import org.apache.geronimo.deployment.xbeans.EmptyType;
>> +import org.apache.geronimo.deployment.xbeans.EnvironmentType;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRule;
>> +import org.apache.geronimo.kernel.repository.ClassLoadingRules;
>> +
>> +/**
>> + *
>> + * @version $Rev:$ $Date:$
>> + */
>> +public class ClassLoadingRulesUtilTest extends TestCase {
>> +
>> +    public void testConfiguration() throws Exception {
>> +        EnvironmentType environmentType =
>> EnvironmentType.Factory.newInstance();
>> +
>>  environmentType.setInverseClassloading(EmptyType.Factory.newInstance());
>> +        environmentType.setHiddenClasses(newFilter("hidden"));
>> +
>>  environmentType.setNonOverridableClasses(newFilter("nonOverrideable"));
>> +        environmentType.setPrivateClasses(newFilter("private"));
>> +
>> +        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
>> +        ClassLoadingRulesUtil.configureRules(classLoadingRules,
>> environmentType);
>> +
>> +        assertTrue(classLoadingRules.isInverseClassLoading());
>> +        assertPrefix(classLoadingRules.getHiddenRule(), "hidden");
>> +        assertPrefix(classLoadingRules.getNonOverrideableRule(),
>> "nonOverrideable");
>> +        assertPrefix(classLoadingRules.getPrivateRule(), "private");
>> +    }
>> +
>> +    private void assertPrefix(ClassLoadingRule classLoadingRule, String
>> filter) {
>> +        Set<String> classPrefixes = classLoadingRule.getClassPrefixes();
>> +        assertEquals(1, classPrefixes.size());
>> +        assertTrue(classPrefixes.contains(filter));
>> +    }
>> +
>> +    private ClassFilterType newFilter(String filter) {
>> +        ClassFilterType hiddenClasses =
>> ClassFilterType.Factory.newInstance();
>> +        hiddenClasses.addFilter(filter);
>> +        return hiddenClasses;
>> +    }
>> +
>> +}
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
>> Fri Nov  7 16:40:08 2008
>> @@ -44,6 +44,7 @@
>>    </dep:dependencies>
>>    <dep:hidden-classes/>
>>    <dep:non-overridable-classes/>
>> +    <dep:private-classes/>
>>  </dep:environment>
>>  <module>
>>    <java>appclient_dep_resref_single_client.jar</java>
>> @@ -89,6 +90,7 @@
>>        </dep:dependencies>
>>        <dep:hidden-classes/>
>>        <dep:non-overridable-classes/>
>> +        <dep:private-classes/>
>>      </dep:client-environment>
>>      <dep:server-environment xmlns:dep="http://geronimo.apache.org/
>> xml/ns/deployment-1.2">
>>        <dep:moduleId>
>> @@ -100,6 +102,7 @@
>>        <dep:dependencies/>
>>        <dep:hidden-classes/>
>>        <dep:non-overridable-classes/>
>> +        <dep:private-classes/>
>>      </dep:server-environment>
>>      <resource-ref xmlns="http://geronimo.apache.org/xml/ns/naming-1.2">
>>        <ref-name>url/URL</ref-name>
>> @@ -126,6 +129,7 @@
>>            <dep:dependencies/>
>>            <dep:hidden-classes/>
>>            <dep:non-overridable-classes/>
>> +            <dep:private-classes/>
>>            <dep:suppress-default-environment/>
>>          </dep:environment>
>>          <resourceadapter>
>>
>> Modified:
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
>> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/
>> modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml?rev=712326&r1=712325&r2=712326&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
>> (original)
>> +++
>> geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
>> Fri Nov  7 16:40:08 2008
>> @@ -32,6 +32,7 @@
>>    </dep:dependencies>
>>    <dep:hidden-classes/>
>>    <dep:non-overridable-classes/>
>> +    <dep:private-classes/>
>>  </dep:environment>
>>  <module>
>>    <ejb>appclient_ejb_1_ejb.jar</ejb>
>> @@ -46,6 +47,7 @@
>>        <dep:dependencies/>
>>        <dep:hidden-classes/>
>>        <dep:non-overridable-classes/>
>> +        <dep:private-classes/>
>>      </dep:environment>
>>      <cmp-connection-factory>
>>        <resource-link>jdbc/DB1</resource-link>
>> @@ -90,6 +92,7 @@
>>        </dep:dependencies>
>>        <dep:hidden-classes/>
>>
>
> ...
>
> [Message clipped]




-- 
~Jason Warner

Mime
View raw message