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 Tue, 11 Nov 2008 16:46:03 GMT
On Tue, Nov 11, 2008 at 8:44 AM, Gianny Damour <
gianny.damour@optusnet.com.au> wrote:

> Hi,
>
> David B published OpenEJB artifacts for me as I lost my Apache private key
> and I can't remember my account password... The build is not fixed.
>

I committed some depencies.xml changes that fix the build.  Thanks for
handling the snapshot.

>
> As pointed out by David J the change is backward compatible and I decided
> to keep the same namespace due to this reason. As I did not change the
> namespace, I also did not change the XSD file name. Thinking more about it,
> I now think that it would be better to change the file name as suggested by
> David. Something like geronimo-module-1.2.1.xsd. I will make this change.
>
> Thanks,
> Gianny
>
>
> On 11/11/2008, at 9:33 AM, David Jencks wrote:
>
>
>> On Nov 10, 2008, at 12:17 PM, Jarek Gawor wrote:
>>
>>  Hi,
>>>
>>> We've had discussions about changing existing/published schemas before
>>> but I can't find any specific decisions/conclusions on it. Does
>>> anybody remember what was the conclusion of these discussions? I
>>> thought we were not supposed to change the existing/published schemas
>>> and this commit changes the geronimo-module-1.2.xsd file.
>>>
>>
>> The (probably undocumented) policy has been to change the schema version
>> number in the file name whenever it changes, and also the uri identifying
>> the namespace.  This causes a lot of headaches and namespace conversion code
>> updates.  I think we should consider _not_ changing at least the namespace
>> uri when, as here, the schema updates don't break backward compatibility.  I
>> believe I once saw some discussion that indicated that frequent namespace
>> changes were generally a bad idea..... wish I knew where it was.
>>
>> thanks
>> david jencks
>>
>>
>>>
>>> Jarek
>>>
>>> On Mon, Nov 10, 2008 at 3:02 PM, Gianny Damour
>>> <gianny.damour@optusnet.com.au> wrote:
>>>
>>>> Hi Jason,
>>>>
>>>> I updated the openejb-jee module
>>>> (openejb/trunk/openejb3/container/openejb-jee) in order to support the
>>>> new
>>>> private-classes element. Should I manually deploy a new snapshot? Sorry,
>>>> I
>>>> do not remember the policy.
>>>>
>>>> Thanks,
>>>> Gianny
>>>>
>>>> On 11/11/2008, at 3:51 AM, Jason Warner wrote:
>>>>
>>>>  Hi Gianny,
>>>>>
>>>>> I'm having trouble building trunk due to an error[1] that seems related
>>>>> to
>>>>> this addition.  Any thoughts?
>>>>>
>>>>> Thanks!
>>>>>
>>>>> [1]
>>>>> [severity=ERROR,message=unexpected element
>>>>> (uri:"http://geronimo.apache.org/xml/ns/deployment-1.2",
>>>>> local:"private-classes"). Expected elements are
>>>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}inverse-<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-<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}suppress-<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-<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}suppress-<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/>
>>>>>
>>>>
>>>>


-- 
~Jason Warner

Mime
View raw message