Return-Path: Delivered-To: apmail-geronimo-dev-archive@www.apache.org Received: (qmail 22643 invoked from network); 11 Nov 2008 20:43:16 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 11 Nov 2008 20:43:16 -0000 Received: (qmail 43069 invoked by uid 500); 11 Nov 2008 20:43:19 -0000 Delivered-To: apmail-geronimo-dev-archive@geronimo.apache.org Received: (qmail 43007 invoked by uid 500); 11 Nov 2008 20:43:19 -0000 Mailing-List: contact dev-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list dev@geronimo.apache.org Received: (qmail 42996 invoked by uid 99); 11 Nov 2008 20:43:19 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 11 Nov 2008 12:43:19 -0800 X-ASF-Spam-Status: No, hits=3.5 required=10.0 tests=HTML_MESSAGE,SPF_PASS,WEIRD_PORT X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of jaw981@gmail.com designates 74.125.46.28 as permitted sender) Received: from [74.125.46.28] (HELO yw-out-2324.google.com) (74.125.46.28) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 11 Nov 2008 20:41:43 +0000 Received: by yw-out-2324.google.com with SMTP id 2so136498ywt.85 for ; Tue, 11 Nov 2008 12:42:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:in-reply-to:mime-version:content-type:references; bh=Mvhz8UHSLH3THtJ60uEbcbf65skShePV/UFG1GTI6WQ=; b=NM+b4qbEQ5HxldOAE9FegUUvq0q5aZT51kYueEPSurNwTJZiF4itUuksrM0qkasLZg Ul82JL6b8ancNo6qxoPTXujc4fJNwoXWnsHbLiTtmnFd/pVglrUT1cFoNZZ1M5qWqOc7 qWLGBB2B5+Z41BbmBdXkxdrSESWktNXx+sugU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version :content-type:references; b=O4yc79w6b7v4wfvFkwYYO9uqPm/5HsZ9odK8zD5/0QOMUp45JMAgsLalIkK9k9gT+f nO9RcU37hlWVASe86iF+kTPQUo/cwTEoEXm3Op/T8AuTi3QN4skiP1l8hAGkRyRk6g1V 2KFC0IJpqd7+RC6XZVmkXAe12lD2HIuBzng1g= Received: by 10.151.106.7 with SMTP id i7mr12611926ybm.147.1226436144735; Tue, 11 Nov 2008 12:42:24 -0800 (PST) Received: by 10.151.26.11 with HTTP; Tue, 11 Nov 2008 12:42:24 -0800 (PST) Message-ID: <73a75e430811111242r68be09f0pd9e5e7ceb225400e@mail.gmail.com> Date: Tue, 11 Nov 2008 15:42:24 -0500 From: "Jason Warner" To: dev@geronimo.apache.org 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 In-Reply-To: <73a75e430811110846k342bb781x7a69d7829f32fd22@mail.gmail.com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_51145_23491154.1226436144727" References: <73a75e430811100851i241ee786p52c563932f0d84ce@mail.gmail.com> <5eb405c70811101217i61876bcdi23061cab004f96f4@mail.gmail.com> <3E4EFB39-094A-415D-927E-38CFB86E66E0@yahoo.com> <955DB48F-C6A4-4E71-8B8F-40431E38CFD8@optusnet.com.au> <73a75e430811110846k342bb781x7a69d7829f32fd22@mail.gmail.com> X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_51145_23491154.1226436144727 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline I believe this change is causing failures in both the geronimo testsuite and tck. For an example of this, try running the concurrent-testsuite. The test will hang indefinitely and viewing the output logs in geronimo.home/testsuite/target/geronimo-logs will show the following error being outputted repeatedly. Could this be related to the new openejb snapshot? java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: can't parse argument number at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205) at java.util.concurrent.FutureTask.get(FutureTask.java:80) at org.apache.openejb.util.Memoizer.compute(Memoizer.java:53) at org.apache.openejb.util.Logger.formatMessage(Logger.java:185) at org.apache.openejb.util.Logger.info(Logger.java:354) at org.apache.openejb.core.transaction.JtaTransactionPolicy.suspendTransaction(JtaTransactionPolicy.java:242) at org.apache.openejb.core.transaction.TxBeanManaged.(TxBeanManaged.java:34) at org.apache.openejb.core.transaction.JtaTransactionPolicyFactory.createTransactionPolicy(JtaTransactionPolicyFactory.java:48) at org.apache.openejb.core.transaction.EjbTransactionUtil.createTransactionPolicy(EjbTransactionUtil.java:55) at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:200) at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:169) at org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:238) at org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:129) at org.apache.openejb.server.ejbd.EjbDaemon.processEjbRequest(EjbDaemon.java:196) at org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:149) at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:71) at org.apache.openejb.server.ejbd.KeepAliveServer$Session.service(KeepAliveServer.java:213) at org.apache.openejb.server.ejbd.KeepAliveServer.service(KeepAliveServer.java:233) at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:66) at org.apache.openejb.server.ServicePool$2.run(ServicePool.java:91) at org.apache.openejb.server.ServicePool$3.run(ServicePool.java:120) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) at java.lang.Thread.run(Thread.java:613) Caused by: java.lang.IllegalArgumentException: can't parse argument number at java.text.MessageFormat.makeFormat(MessageFormat.java:1330) at java.text.MessageFormat.applyPattern(MessageFormat.java:450) at java.text.MessageFormat.(MessageFormat.java:350) at org.apache.openejb.util.Logger$4.compute(Logger.java:108) at org.apache.openejb.util.Logger$4.compute(Logger.java:107) at org.apache.openejb.util.Memoizer$1.call(Memoizer.java:42) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:123) at org.apache.openejb.util.Memoizer.compute(Memoizer.java:49) ... 21 more On Tue, Nov 11, 2008 at 11:46 AM, Jason Warner wrote: > > > 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 >>>> wrote: >>>> >>>>> Hi Jason, >>>>> >>>>> I updated the openejb-jee module >>>>> (openejb/trunk/openejb3/container/openejb-jee) in order to support the >>>>> new >>>>> private-classes element. Should I manually deploy a new snapshot? >>>>> Sorry, I >>>>> do not remember the policy. >>>>> >>>>> Thanks, >>>>> Gianny >>>>> >>>>> On 11/11/2008, at 3:51 AM, Jason Warner wrote: >>>>> >>>>> Hi Gianny, >>>>>> >>>>>> I'm having trouble building trunk due to an error[1] that seems >>>>>> related to >>>>>> this addition. Any thoughts? >>>>>> >>>>>> Thanks! >>>>>> >>>>>> [1] >>>>>> [severity=ERROR,message=unexpected element >>>>>> (uri:"http://geronimo.apache.org/xml/ns/deployment-1.2", >>>>>> local:"private-classes"). Expected elements are >>>>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}inverse- >>>>>> classloading>,<{http://geronimo.apache.org/xml/ns/deployment-1.2 >>>>>> }hidden-classes>, >>>>>> >>>>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}non- >>>>>> overridable-classes>,<{http://geronimo.apache.org/xml/ns/ >>>>>> deployment-1.2}moduleId>, >>>>>> >>>>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress- >>>>>> default-environment>,<{http://geronimo.apache.org/xml/ns/ >>>>>> deployment-1.2}dependencies>,locator=[node=null,object=null,url=null,line=19,col=27,offset=-1]] >>>>>> [INFO] >>>>>> >>>>>> ------------------------------------------------------------------------ >>>>>> [ERROR] BUILD ERROR >>>>>> [INFO] >>>>>> >>>>>> ------------------------------------------------------------------------ >>>>>> [INFO] could not package plugin >>>>>> >>>>>> Embedded error: Failed parsing descriptors for module: >>>>>> >>>>>> /Users/jason/trunk/plugins/mejb/geronimo-mejb/target/geronimo-mejb-2.2-SNAPSHOT.jar >>>>>> unexpected element >>>>>> (uri:"http://geronimo.apache.org/xml/ns/deployment-1.2", >>>>>> local:"private-classes"). Expected elements are >>>>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}inverse- >>>>>> classloading>,<{http://geronimo.apache.org/xml/ns/deployment-1.2 >>>>>> }hidden-classes>, >>>>>> >>>>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}non- >>>>>> overridable-classes>,<{http://geronimo.apache.org/xml/ns/ >>>>>> deployment-1.2}moduleId>, >>>>>> >>>>>> <{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress- >>>>>> default-environment>,<{http://geronimo.apache.org/xml/ns/ >>>>>> deployment-1.2}dependencies> >>>>>> >>>>>> >>>>>> On Fri, Nov 7, 2008 at 7:40 PM, 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 >>>>>> 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 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 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 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 hiddenClassesSet = >>>>>> environment.getHiddenClasses(); >>>>>> - String[] hiddenClasses = hiddenClassesSet.toArray(new >>>>>> String[hiddenClassesSet.size()]); >>>>>> - >>>>>> // we need to propagate the non-overrideable classes from parents >>>>>> - LinkedHashSet nonOverridableSet = new >>>>>> LinkedHashSet(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 visitedClassLoaders) throws >>>>>> ClassNotFoundException, MalformedURLException { >>>>>> + protected synchronized Class loadClassInternal(String name, >>>>>> boolean resolve, List 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 visitedClassLoaders) throws >>>>>> ClassNotFoundException { >>>>>> + private synchronized Class checkParents(String name, boolean >>>>>> resolve, List 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 classPrefixes; >>>>>> + private final Set resourcePrefixes; >>>>>> + >>>>>> + public ClassLoadingRule() { >>>>>> + classPrefixes = new HashSet(); >>>>>> + resourcePrefixes = new HashSet(); >>>>>> + } >>>>>> + >>>>>> + public Set 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 classPrefixes) { >>>>>> + this.classPrefixes.addAll(classPrefixes); >>>>>> + >>>>>> + Set resources = toResources(classPrefixes); >>>>>> + resourcePrefixes.addAll(resources); >>>>>> + } >>>>>> + >>>>>> + public void setClassPrefixes(Set classPrefixes) { >>>>>> + this.classPrefixes.clear(); >>>>>> + resourcePrefixes.clear(); >>>>>> + addClassPrefixes(classPrefixes); >>>>>> + } >>>>>> + >>>>>> + public void merge(ClassLoadingRule classLoadingRuleToMerge) { >>>>>> + addClassPrefixes(classLoadingRuleToMerge.classPrefixes); >>>>>> + } >>>>>> + >>>>>> + protected Set toResources(Set classPrefixes) { >>>>>> + Set resources = new HashSet(); >>>>>> + for (String className : classPrefixes) { >>>>>> + resources.add(className.replace('.', '/')); >>>>>> + } >>>>>> + return resources; >>>>>> + } >>>>>> + >>>>>> + protected boolean isMatching(Set 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 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 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 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 toFilters(ClassFilterType filterType) >>>>>> { >>>>>> + Set filters = new HashSet(); >>>>>> + 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 @@ >>>>>> >>>>>> >>>>>> >>>>>> + >>>>> + type="sys:classFilterType" minOccurs="0"> >>>>>> + >>>>>> + >>>>>> + 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. >>>>>> + >>>>>> + >>>>>> + >>>>>> >>>>> minOccurs="0"> >>>>>> >>>>>> >>>>>> 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 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 @@ >>>>>> >>>>>> >>>>>> >>>>>> + >>>>>> >>>>>> >>>>>> appclient_dep_resref_single_client.jar >>>>>> @@ -89,6 +90,7 @@ >>>>>> >>>>>> >>>>>> >>>>>> + >>>>>> >>>>>> >>>>> xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2"> >>>>>> >>>>>> @@ -100,6 +102,7 @@ >>>>>> >>>>>> >>>>>> >>>>>> + >>>>>> >>>>>> >>>>>> url/URL >>>>>> @@ -126,6 +129,7 @@ >>>>>> >>>>>> >>>>>> >>>>>> + >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> 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 @@ >>>>>> >>>>>> >>>>>> >>>>>> + >>>>>> >>>>>> >>>>>> appclient_ejb_1_ejb.jar >>>>>> @@ -46,6 +47,7 @@ >>>>>> >>>>>> >>>>>> >>>>> >>>>> > > > -- > ~Jason Warner > -- ~Jason Warner ------=_Part_51145_23491154.1226436144727 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline I believe this change is causing failures in both the geronimo testsuite and tck.  For an example of this, try running the concurrent-testsuite.  The test will hang indefinitely and viewing the output logs in geronimo.home/testsuite/target/geronimo-logs will show the following error being outputted repeatedly.  Could this be related to the new openejb snapshot?

java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: can't parse argument number
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205)
    at java.util.concurrent.FutureTask.get(FutureTask.java:80)
    at org.apache.openejb.util.Memoizer.compute(Memoizer.java:53)
    at org.apache.openejb.util.Logger.formatMessage(Logger.java:185)
    at org.apache.openejb.util.Logger.info(Logger.java:354)
    at org.apache.openejb.core.transaction.JtaTransactionPolicy.suspendTransaction(JtaTransactionPolicy.java:242)
    at org.apache.openejb.core.transaction.TxBeanManaged.<init>(TxBeanManaged.java:34)
    at org.apache.openejb.core.transaction.JtaTransactionPolicyFactory.createTransactionPolicy(JtaTransactionPolicyFactory.java:48)
    at org.apache.openejb.core.transaction.EjbTransactionUtil.createTransactionPolicy(EjbTransactionUtil.java:55)
    at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:200)
    at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:169)
    at org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:238)
    at org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:129)
    at org.apache.openejb.server.ejbd.EjbDaemon.processEjbRequest(EjbDaemon.java:196)
    at org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:149)
    at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:71)
    at org.apache.openejb.server.ejbd.KeepAliveServer$Session.service(KeepAliveServer.java:213)
    at org.apache.openejb.server.ejbd.KeepAliveServer.service(KeepAliveServer.java:233)
    at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:66)
    at org.apache.openejb.server.ServicePool$2.run(ServicePool.java:91)
    at org.apache.openejb.server.ServicePool$3.run(ServicePool.java:120)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
    at java.lang.Thread.run(Thread.java:613)
Caused by: java.lang.IllegalArgumentException: can't parse argument number
    at java.text.MessageFormat.makeFormat(MessageFormat.java:1330)
    at java.text.MessageFormat.applyPattern(MessageFormat.java:450)
    at java.text.MessageFormat.<init>(MessageFormat.java:350)
    at org.apache.openejb.util.Logger$4.compute(Logger.java:108)
    at org.apache.openejb.util.Logger$4.compute(Logger.java:107)
    at org.apache.openejb.util.Memoizer$1.call(Memoizer.java:42)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
    at java.util.concurrent.FutureTask.run(FutureTask.java:123)
    at org.apache.openejb.util.Memoizer.compute(Memoizer.java:49)
    ... 21 more


On Tue, Nov 11, 2008 at 11:46 AM, Jason Warner <jaw981@gmail.com> wrote:


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-classloading>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}hidden-classes>,

<{http://geronimo.apache.org/xml/ns/deployment-1.2}non-overridable-classes>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}moduleId>,

<{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress-default-environment>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}dependencies>,locator=[node=null,object=null,url=null,line=19,col=27,offset=-1]]
[INFO]
------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO]
------------------------------------------------------------------------
[INFO] could not package plugin

Embedded error: Failed parsing descriptors for module:
/Users/jason/trunk/plugins/mejb/geronimo-mejb/target/geronimo-mejb-2.2-SNAPSHOT.jar
unexpected element
(uri:"http://geronimo.apache.org/xml/ns/deployment-1.2",
local:"private-classes"). Expected elements are
<{http://geronimo.apache.org/xml/ns/deployment-1.2}inverse-classloading>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}hidden-classes>,

<{http://geronimo.apache.org/xml/ns/deployment-1.2}non-overridable-classes>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}moduleId>,

<{http://geronimo.apache.org/xml/ns/deployment-1.2}suppress-default-environment>,<{http://geronimo.apache.org/xml/ns/deployment-1.2}dependencies>


On Fri, Nov 7, 2008 at 7:40 PM, <gdamour@apache.org> wrote:
Author: gdamour
Date: Fri Nov  7 16:40:08 2008
New Revision: 712326

URL: http://svn.apache.org/viewvc?rev=712326&view=rev
Log:
Add private-classes element which allows specific classes to be hidden
from all child configurations. In effect, they are private to the
configuration.

(GERONIMO-4403) Provide a mechanism to hide specific classes  of a
configuration to all its children

Added:

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java

geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java

geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
Modified:

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java

geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java

geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java

geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd

geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml

geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml

geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/assembly_1_result.xml

geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/gbean_1_result.xml

geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/servlet_1_result.xml

geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/transport_1_result.xml

geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/transport_2_result.xml

geronimo/server/trunk/plugins/jetty/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ClassLoaderTest.java

geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java

Modified:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/JarFileClassLoader.java
Fri Nov  7 16:40:08 2008
@@ -16,25 +16,25 @@
*/
package org.apache.geronimo.kernel.classloader;

-import java.io.IOException;
import java.io.File;
-import java.net.URL;
+import java.io.IOException;
import java.net.URI;
+import java.net.URL;
import java.net.URLClassLoader;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.CodeSource;
import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.security.cert.Certificate;
-import java.util.Collection;
import java.util.Enumeration;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import org.apache.geronimo.kernel.config.MultiParentClassLoader;
import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;

/**
* The JarFileClassLoader that loads classes and resources from a list of
JarFiles.  This method is simmilar to URLClassLoader
@@ -78,8 +78,8 @@
     addURLs(urls);
 }

-    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader
parent, boolean inverseClassLoading, String[] hiddenClasses, String[]
nonOverridableClasses) {
-        super(id, EMPTY_URLS, parent, inverseClassLoading, hiddenClasses,
nonOverridableClasses);
+    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader
parent, ClassLoadingRules classLoadingRules) {
+        super(id, EMPTY_URLS, parent, classLoadingRules);
     this.acc = AccessController.getContext();
     addURLs(urls);
 }
@@ -96,14 +96,8 @@
     addURLs(urls);
 }

-    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader[]
parents, boolean inverseClassLoading, Collection hiddenClasses, Collection
nonOverridableClasses) {
-        super(id, EMPTY_URLS, parents, inverseClassLoading,
hiddenClasses, nonOverridableClasses);
-        this.acc = AccessController.getContext();
-        addURLs(urls);
-    }
-
-    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader[]
parents, boolean inverseClassLoading, String[] hiddenClasses, String[]
nonOverridableClasses) {
-        super(id, EMPTY_URLS, parents, inverseClassLoading,
hiddenClasses, nonOverridableClasses);
+    public JarFileClassLoader(Artifact id, URL[] urls, ClassLoader[]
parents, ClassLoadingRules classLoadingRules) {
+        super(id, EMPTY_URLS, parents, classLoadingRules);
     this.acc = AccessController.getContext();
     addURLs(urls);
 }

Added:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java?rev=712326&view=auto

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
(added)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoader.java
Fri Nov  7 16:40:08 2008
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.kernel.config;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.SecureClassLoader;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;
+
+import sun.misc.CompoundEnumeration;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class ChildrenConfigurationClassLoader extends SecureClassLoader {
+
+    private final ClassLoadingRules rules;
+
+    public ChildrenConfigurationClassLoader(ClassLoader parent,
ClassLoadingRules rules) {
+        super(parent);
+        if (null == rules) {
+            throw new IllegalArgumentException("rules is required");
+        }
+        this.rules = rules;
+    }
+
+    public Class<?> loadClass(String name, List<ClassLoader>
visitedClassLoaders) throws ClassNotFoundException {
+        return loadClass(name, false, visitedClassLoaders);
+    }
+
+    protected synchronized Class<?> loadClass(String name, boolean
resolve) throws ClassNotFoundException {
+        return loadClass(name, resolve, Collections.EMPTY_LIST);
+    }
+
+    protected synchronized Class<?> loadClass(String name, boolean
resolve, List<ClassLoader> visitedClassLoaders)
+            throws ClassNotFoundException {
+        ClassLoadingRule privateRule = rules.getPrivateRule();
+        ClassLoader parent = getParent();
+        if (privateRule.isFilteredClass(name)) {
+            throw new ClassNotFoundException(name + " is hidden by
classloader " + parent);
+        }
+
+        if (parent instanceof MultiParentClassLoader) {
+            try {
+                return ((MultiParentClassLoader)
parent).loadClassInternal(name, resolve, visitedClassLoaders);
+            } catch (MalformedURLException e) {
+            }
+        }
+        return super.loadClass(name, resolve);
+    }
+
+    public URL getResource(String name) {
+        ClassLoadingRule privateRule = rules.getPrivateRule();
+        if (privateRule.isFilteredResource(name)) {
+            return null;
+        }
+        return super.getResource(name);
+    }
+
+    public Enumeration<URL> getResources(String name) throws IOException
{
+        ClassLoadingRule privateRule = rules.getPrivateRule();
+        if (privateRule.isFilteredResource(name)) {
+            return new CompoundEnumeration(new Enumeration[0]);
+        }
+        return super.getResources(name);
+    }
+
+}

Modified:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/Configuration.java
Fri Nov  7 16:40:08 2008
@@ -25,6 +25,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
@@ -32,13 +33,10 @@
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
-import java.util.HashSet;

import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;

-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.apache.geronimo.gbean.AbstractName;
import org.apache.geronimo.gbean.AbstractNameQuery;
import org.apache.geronimo.gbean.GBeanData;
@@ -51,10 +49,14 @@
import org.apache.geronimo.kernel.Naming;
import org.apache.geronimo.kernel.classloader.JarFileClassLoader;
import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;
import org.apache.geronimo.kernel.repository.Dependency;
import org.apache.geronimo.kernel.repository.Environment;
import org.apache.geronimo.kernel.repository.ImportType;
import org.apache.geronimo.kernel.repository.MissingDependencyException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

/**
* A Configuration represents a collection of runnable services that can
be
@@ -170,6 +172,11 @@
 private final MultiParentClassLoader configurationClassLoader;

 /**
+     * The ClassLoader used by children configurations.
+     */
+    private final ClassLoader childrenConfigurationClassLoader;
+
+    /**
  * The relative class path (URI) of this configuation.
  */
 private final LinkedHashSet<String> classPath;
@@ -204,6 +211,7 @@
     classPath = null;
     configurationResolver = null;
     configurationClassLoader = null;
+        childrenConfigurationClassLoader = null;
     naming = null;
 }

@@ -266,6 +274,9 @@
         // Build the configuration class loader
         //
         configurationClassLoader =
createConfigurationClasssLoader(parents, environment, classPath);
+
+            ClassLoadingRules rules = environment.getClassLoadingRules();
+            childrenConfigurationClassLoader = new
ChildrenConfigurationClassLoader(configurationClassLoader, rules);

         //
         // Get all service parents in depth first order
@@ -333,22 +344,19 @@
         parentClassLoaders = new ClassLoader[classParents.size()];
         for (ListIterator iterator = classParents.listIterator();
iterator.hasNext();) {
             Configuration configuration = (Configuration)
iterator.next();
-                parentClassLoaders[iterator.previousIndex()] =
configuration.getConfigurationClassLoader();
+                parentClassLoaders[iterator.previousIndex()] =
configuration.childrenConfigurationClassLoader;
         }
     }

-        // hidden classes
-        Set<String> hiddenClassesSet = environment.getHiddenClasses();
-        String[] hiddenClasses = hiddenClassesSet.toArray(new
String[hiddenClassesSet.size()]);
-
     // we need to propagate the non-overrideable classes from parents
-        LinkedHashSet<String> nonOverridableSet = new
LinkedHashSet<String>(environment.getNonOverrideableClasses());
+        ClassLoadingRules classLoadingRules =
environment.getClassLoadingRules();
+        ClassLoadingRule nonOverrideableRule =
classLoadingRules.getNonOverrideableRule();
     for (Configuration parent : classParents) {
-
         Environment parentEnvironment = parent.getEnvironment();
-
nonOverridableSet.addAll(parentEnvironment.getNonOverrideableClasses());
+            ClassLoadingRules parentClassLoadingRules =
parentEnvironment.getClassLoadingRules();
+            ClassLoadingRule parentNonOverrideableRule =
parentClassLoadingRules.getNonOverrideableRule();
+            nonOverrideableRule.merge(parentNonOverrideableRule);
     }
-        String[] nonOverridableClasses = nonOverridableSet.toArray(new
String[nonOverridableSet.size()]);

     if (log.isDebugEnabled()) {
         StringBuffer buf = new StringBuffer("ClassLoader structure for
configuration ").append(id).append("\n");
@@ -377,16 +385,12 @@
         return new JarFileClassLoader(environment.getConfigId(),
                 urls,
                 parentClassLoaders,
-                    environment.isInverseClassLoading(),
-                    hiddenClasses,
-                    nonOverridableClasses);
+                    classLoadingRules);
     } else {
         return new MultiParentClassLoader(environment.getConfigId(),
                 urls,
                 parentClassLoaders,
-                    environment.isInverseClassLoading(),
-                    hiddenClasses,
-                    nonOverridableClasses);
+                    classLoadingRules);
     }
 }


Modified:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
Fri Nov  7 16:40:08 2008
@@ -27,7 +27,6 @@
import java.net.URLClassLoader;
import java.net.URLStreamHandlerFactory;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
@@ -36,11 +35,13 @@
import java.util.Map;
import java.util.Set;

-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.apache.geronimo.kernel.classloader.UnionEnumeration;
import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;
import org.apache.geronimo.kernel.util.ClassLoaderRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

/**
* A MultiParentClassLoader is a simple extension of the URLClassLoader
that simply changes the single parent class
@@ -57,11 +58,7 @@

 private final Artifact id;
 private final ClassLoader[] parents;
-    private final boolean inverseClassLoading;
-    private final String[] hiddenClasses;
-    private final String[] nonOverridableClasses;
-    private final String[] hiddenResources;
-    private final String[] nonOverridableResources;
+    private final ClassLoadingRules classLoadingRules;
 private boolean destroyed = false;

 // I used this pattern as its temporary and with the static final we
get compile time
@@ -102,12 +99,9 @@
 public MultiParentClassLoader(Artifact id, URL[] urls) {
     super(urls);
     this.id = id;
+
     parents = new ClassLoader[]{ClassLoader.getSystemClassLoader()};
-        inverseClassLoading = false;
-        hiddenClasses = new String[0];
-        nonOverridableClasses = new String[0];
-        hiddenResources = new String[0];
-        nonOverridableResources = new String[0];
+        classLoadingRules = new ClassLoadingRules();
     ClassLoaderRegistry.add(this);
 }

@@ -123,8 +117,8 @@
     this(id, urls, new ClassLoader[]{parent});
 }

-    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader
parent, boolean inverseClassLoading, String[] hiddenClasses, String[]
nonOverridableClasses) {
-        this(id, urls, new ClassLoader[]{parent}, inverseClassLoading,
hiddenClasses, nonOverridableClasses);
+    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader
parent, ClassLoadingRules classLoadingRules) {
+        this(id, urls, new ClassLoader[]{parent}, classLoadingRules);
 }

 /**
@@ -151,32 +145,21 @@
     super(urls);
     this.id = id;
     this.parents = copyParents(parents);
-        inverseClassLoading = false;
-        hiddenClasses = new String[0];
-        nonOverridableClasses = new String[0];
-        hiddenResources = new String[0];
-        nonOverridableResources = new String[0];
-        ClassLoaderRegistry.add(this);
-    }

-    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader[]
parents, boolean inverseClassLoading, Collection hiddenClasses, Collection
nonOverridableClasses) {
-        this(id, urls, parents, inverseClassLoading, (String[])
hiddenClasses.toArray(new String[hiddenClasses.size()]), (String[])
nonOverridableClasses.toArray(new String[nonOverridableClasses.size()]));
+        classLoadingRules = new ClassLoadingRules();
+        ClassLoaderRegistry.add(this);
 }

-    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader[]
parents, boolean inverseClassLoading, String[] hiddenClasses, String[]
nonOverridableClasses) {
+    public MultiParentClassLoader(Artifact id, URL[] urls, ClassLoader[]
parents, ClassLoadingRules classLoadingRules) {
     super(urls);
     this.id = id;
     this.parents = copyParents(parents);
-        this.inverseClassLoading = inverseClassLoading;
-        this.hiddenClasses = hiddenClasses;
-        this.nonOverridableClasses = nonOverridableClasses;
-        hiddenResources = toResources(hiddenClasses);
-        nonOverridableResources = toResources(nonOverridableClasses);
+        this.classLoadingRules = classLoadingRules;
     ClassLoaderRegistry.add(this);
 }

 public MultiParentClassLoader(MultiParentClassLoader source) {
-        this(source.id, source.getURLs(),
deepCopyParents(source.parents), source.inverseClassLoading,
source.hiddenClasses, source.nonOverridableClasses);
+        this(source.id, source.getURLs(),
deepCopyParents(source.parents), source.classLoadingRules);
 }

 static ClassLoader copy(ClassLoader source) {
@@ -193,15 +176,6 @@
     return MultiParentClassLoader.copy(this);
 }

-    private String[] toResources(String[] classes) {
-        String[] resources = new String[classes.length];
-        for (int i = 0; i < classes.length; i++) {
-            String className = classes[i];
-            resources[i] = className.replace('.', '/');
-        }
-        return resources;
-    }
-
 /**
  * Creates a named class loader as a child of the specified parents and
using the specified URLStreamHandlerFactory
  * for accessing the urls..
@@ -215,11 +189,8 @@
     super(urls, null, factory);
     this.id = id;
     this.parents = copyParents(parents);
-        inverseClassLoading = false;
-        hiddenClasses = new String[0];
-        nonOverridableClasses = new String[0];
-        hiddenResources = new String[0];
-        nonOverridableResources = new String[0];
+
+        classLoadingRules = new ClassLoadingRules();
     ClassLoaderRegistry.add(this);
 }

@@ -320,7 +291,7 @@
     //
     // if we are using inverse class loading, check local urls first
     //
-        if (inverseClassLoading && !isDestroyed() &&
!isNonOverridableClass(name)) {
+        if (classLoadingRules.isInverseClassLoading() && !isDestroyed()
&& !isNonOverridableClass(name)) {
         try {
             Class clazz = findClass(name);
             return resolveClass(clazz, resolve);
@@ -404,7 +375,7 @@
     //
     // if we are using inverse class loading, check local urls first
     //
-        if (inverseClassLoading && !isDestroyed() &&
!isNonOverridableClass(name)) {
+        if (classLoadingRules.isInverseClassLoading() && !isDestroyed()
&& !isNonOverridableClass(name)) {
         try {
             Class clazz = findClass(name);
             return resolveClass(clazz, resolve);
@@ -453,7 +424,7 @@
  * @return
  * @throws ClassNotFoundException
  */
-    protected synchronized Class<?> loadClassInternal(String name,
boolean resolve, LinkedList<ClassLoader> visitedClassLoaders) throws
ClassNotFoundException, MalformedURLException {
+    protected synchronized Class<?> loadClassInternal(String name,
boolean resolve, List<ClassLoader> visitedClassLoaders) throws
ClassNotFoundException, MalformedURLException {
     //
     // Check if class is in the loaded classes cache
     //
@@ -500,7 +471,7 @@
  * @return
  * @throws ClassNotFoundException
  */
-    private synchronized Class<?> checkParents(String name, boolean
resolve, LinkedList<ClassLoader> visitedClassLoaders) throws
ClassNotFoundException {
+    private synchronized Class<?> checkParents(String name, boolean
resolve, List<ClassLoader> visitedClassLoaders) throws
ClassNotFoundException {
     for (ClassLoader parent : parents) {
         if (!visitedClassLoaders.contains(parent)) {
             visitedClassLoaders.add(parent);  // Track that we've been
here before
@@ -508,6 +479,9 @@
                    if (parent instanceof MultiParentClassLoader) {
                            Class clazz = ((MultiParentClassLoader)
parent).loadClassInternal(name, resolve, visitedClassLoaders);
                            if (clazz != null) return
resolveClass(clazz, resolve);
+                       } else if (parent instanceof
ChildrenConfigurationClassLoader) {
+                        Class clazz = ((ChildrenConfigurationClassLoader)
parent).loadClass(name, visitedClassLoaders);
+                        if (clazz != null) return resolveClass(clazz,
resolve);
                    } else {
                            return parent.loadClass(name);
                    }
@@ -523,21 +497,13 @@
 }

 private boolean isNonOverridableClass(String name) {
-        for (String nonOverridableClass : nonOverridableClasses) {
-            if (name.startsWith(nonOverridableClass)) {
-                return true;
-            }
-        }
-        return false;
+        ClassLoadingRule nonOverrideableRule =
classLoadingRules.getNonOverrideableRule();
+        return nonOverrideableRule.isFilteredClass(name);
 }

 private boolean isHiddenClass(String name) {
-        for (String hiddenClass : hiddenClasses) {
-            if (name.startsWith(hiddenClass)) {
-                return true;
-            }
-        }
-        return false;
+        ClassLoadingRule hiddenRule = classLoadingRules.getHiddenRule();
+        return hiddenRule.isFilteredClass(name);
 }

 private Class resolveClass(Class clazz, boolean resolve) {
@@ -555,7 +521,7 @@
     //
     // if we are using inverse class loading, check local urls first
     //
-        if (inverseClassLoading && !isDestroyed() &&
!isNonOverridableResource(name)) {
+        if (classLoadingRules.isInverseClassLoading() && !isDestroyed()
&& !isNonOverridableResource(name)) {
         URL url = findResource(name);
         if (url != null) {
             return url;
@@ -606,7 +572,7 @@
         return;
     }
     knownClassloaders.add(this);
-        if (inverseClassLoading && !isNonOverridableResource(name)) {
+        if (classLoadingRules.isInverseClassLoading() &&
!isNonOverridableResource(name)) {
         enumerations.add(internalfindResources(name));
     }
     if (!isHiddenResource(name)) {
@@ -621,7 +587,7 @@
             }
         }
     }
-        if (!inverseClassLoading) {
+        if (!classLoadingRules.isInverseClassLoading()) {
         enumerations.add(internalfindResources(name));
     }
 }
@@ -631,21 +597,13 @@
 }

 private boolean isNonOverridableResource(String name) {
-        for (String nonOverridableResource : nonOverridableResources) {
-            if (name.startsWith(nonOverridableResource)) {
-                return true;
-            }
-        }
-        return false;
+        ClassLoadingRule nonOverrideableRule =
classLoadingRules.getNonOverrideableRule();
+        return nonOverrideableRule.isFilteredResource(name);
 }

 private boolean isHiddenResource(String name) {
-        for (String hiddenResource : hiddenResources) {
-            if (name.startsWith(hiddenResource)) {
-                return true;
-            }
-        }
-        return false;
+        ClassLoadingRule hiddenRule = classLoadingRules.getHiddenRule();
+        return hiddenRule.isFilteredResource(name);
 }

 public String toString() {

Added:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java?rev=712326&view=auto

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
(added)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRule.java
Fri Nov  7 16:40:08 2008
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.kernel.repository;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class ClassLoadingRule implements Serializable {
+    private final Set<String> classPrefixes;
+    private final Set<String> resourcePrefixes;
+
+    public ClassLoadingRule() {
+        classPrefixes = new HashSet<String>();
+        resourcePrefixes = new HashSet<String>();
+    }
+
+    public Set<String> getClassPrefixes() {
+        return classPrefixes;
+    }
+
+    public boolean isFilteredClass(String name) {
+        return isMatching(classPrefixes, name);
+    }
+
+    public boolean isFilteredResource(String name) {
+        return isMatching(resourcePrefixes, name);
+    }
+
+    public void addClassPrefixes(Set<String> classPrefixes) {
+        this.classPrefixes.addAll(classPrefixes);
+
+        Set<String> resources = toResources(classPrefixes);
+        resourcePrefixes.addAll(resources);
+    }
+
+    public void setClassPrefixes(Set<String> classPrefixes) {
+        this.classPrefixes.clear();
+        resourcePrefixes.clear();
+        addClassPrefixes(classPrefixes);
+    }
+
+    public void merge(ClassLoadingRule classLoadingRuleToMerge) {
+        addClassPrefixes(classLoadingRuleToMerge.classPrefixes);
+    }
+
+    protected Set<String> toResources(Set<String> classPrefixes) {
+        Set<String> resources = new HashSet<String>();
+        for (String className : classPrefixes) {
+            resources.add(className.replace('.', '/'));
+        }
+        return resources;
+    }
+
+    protected boolean isMatching(Set<String> prefixes, String name) {
+        for (String prefix : prefixes) {
+            if (name.startsWith(prefix)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}
\ No newline at end of file

Added:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java?rev=712326&view=auto

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
(added)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/ClassLoadingRules.java
Fri Nov  7 16:40:08 2008
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.kernel.repository;
+
+import java.io.Serializable;
+
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class ClassLoadingRules implements Serializable {
+    private final ClassLoadingRule hiddenRule;
+    private final ClassLoadingRule nonOverrideableRule;
+    private final ClassLoadingRule privateRule;
+    private boolean inverseClassLoading;
+
+    public ClassLoadingRules() {
+        hiddenRule = new ClassLoadingRule();
+        nonOverrideableRule = new ClassLoadingRule();
+        privateRule = new ClassLoadingRule();
+    }
+
+    public ClassLoadingRule getHiddenRule() {
+        return hiddenRule;
+    }
+
+    public ClassLoadingRule getNonOverrideableRule() {
+        return nonOverrideableRule;
+    }
+
+    public ClassLoadingRule getPrivateRule() {
+        return privateRule;
+    }
+
+    public boolean isInverseClassLoading() {
+        return inverseClassLoading;
+    }
+
+    public void setInverseClassLoading(boolean inverseClassLoading) {
+        this.inverseClassLoading = inverseClassLoading;
+    }
+
+    public void merge(ClassLoadingRules classLoadingRulesToMerge) {
+        if (inverseClassLoading) {
+            return;
+        }
+        inverseClassLoading =
classLoadingRulesToMerge.inverseClassLoading;
+
+        hiddenRule.merge(classLoadingRulesToMerge.hiddenRule);
+
nonOverrideableRule.merge(classLoadingRulesToMerge.nonOverrideableRule);
+        privateRule.merge(classLoadingRulesToMerge.privateRule);
+    }
+
+}

Modified:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/DefaultArtifactResolver.java
Fri Nov  7 16:40:08 2008
@@ -179,7 +179,7 @@
         }

         Environment environment = configuration.getEnvironment();
-            if (environment.isInverseClassLoading()) {
+            if
(environment.getClassLoadingRules().isInverseClassLoading()) {
             // Search dependencies of the configuration before
searching the parents
             Artifact artifact =
getArtifactVersion(configuration.getDependencies(), working);
             if (artifact != null) {

Modified:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
Fri Nov  7 16:40:08 2008
@@ -18,14 +18,12 @@
package org.apache.geronimo.kernel.repository;

import java.io.Serializable;
+import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.List;
import java.util.Collections;
-import java.util.ArrayList;
import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;

/**
* holds the data from the EnvironmentType xml while it is being resolved,
transitively closed, etc.
@@ -36,29 +34,25 @@
 private static final long serialVersionUID = 7075760873629376317L;

 private Artifact configId;
-
 private final LinkedHashSet dependencies = new LinkedHashSet();
-
-    private final Set hiddenClasses = new HashSet();
-    private final Set nonOverrideableClasses = new HashSet();
-
-    private boolean inverseClassLoading;
+    private final ClassLoadingRules classLoadingRules;
 private boolean suppressDefaultEnvironment;

 public Environment() {
+        classLoadingRules = new ClassLoadingRules();
 }

 public Environment(Artifact configId) {
     this.configId = configId;
+
+        classLoadingRules = new ClassLoadingRules();
 }

 public Environment(Environment environment) {
-        this.configId = environment.getConfigId();
-        this.dependencies.addAll(environment.dependencies);
-        this.hiddenClasses.addAll(environment.getHiddenClasses());
-
this.nonOverrideableClasses.addAll(environment.getNonOverrideableClasses());
-        this.inverseClassLoading = environment.isInverseClassLoading();
-        this.suppressDefaultEnvironment =
environment.isSuppressDefaultEnvironment();
+        configId = environment.getConfigId();
+        dependencies.addAll(environment.dependencies);
+        suppressDefaultEnvironment =
environment.isSuppressDefaultEnvironment();
+        classLoadingRules = environment.classLoadingRules;
 }

 public Artifact getConfigId() {
@@ -100,46 +94,8 @@
     addDependencies(dependencies);
 }

-    /**
-     * todo: I should be documented so it's not completely unclear what
kind of
-     * elements I hold.
-     */
-    public Set getHiddenClasses() {
-        return hiddenClasses;
-    }
-
-    public void addHiddenClasses(Collection hiddenClasses) {
-        this.hiddenClasses.addAll(hiddenClasses);
-    }
-
-    public void setHiddenClasses(Collection hiddenClasses) {
-        this.hiddenClasses.clear();
-        addHiddenClasses(hiddenClasses);
-    }
-
-    /**
-     * todo: I should be documented so it's not completely unclear what
kind of
-     * elements I hold.
-     */
-    public Set getNonOverrideableClasses() {
-        return nonOverrideableClasses;
-    }
-
-    public void addNonOverrideableClasses(Collection
nonOverrideableClasses) {
-        this.nonOverrideableClasses.addAll(nonOverrideableClasses);
-    }
-
-    public void setNonOverrideableClasses(Collection
nonOverrideableClasses) {
-        this.nonOverrideableClasses.clear();
-        addNonOverrideableClasses(nonOverrideableClasses);
-    }
-
-    public boolean isInverseClassLoading() {
-        return inverseClassLoading;
-    }
-
-    public void setInverseClassLoading(boolean inverseClassLoading) {
-        this.inverseClassLoading = inverseClassLoading;
+    public ClassLoadingRules getClassLoadingRules() {
+        return classLoadingRules;
 }

 public boolean isSuppressDefaultEnvironment() {

Added:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java?rev=712326&view=auto

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
(added)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/ChildrenConfigurationClassLoaderTest.java
Fri Nov  7 16:40:08 2008
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.kernel.config;
+
+import java.util.Collections;
+
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class ChildrenConfigurationClassLoaderTest extends TestCase {
+
+    private String privateResourceName;
+    private String privateResourceClass;
+    private ChildrenConfigurationClassLoader classLoader;
+    private ClassLoadingRules rules;
+
+    @Override
+    protected void setUp() throws Exception {
+        rules = new ClassLoadingRules();
+        privateResourceClass =
ChildrenConfigurationClassLoaderTest.class.getName();
+        privateResourceName = privateResourceClass.replace(".", "/") +
".class";
+
+        classLoader = new
ChildrenConfigurationClassLoader(ChildrenConfigurationClassLoaderTest.class.getClassLoader(),
rules);
+    }
+
+    public void testLoadClassThrowsCNFEForHiddenClass() throws Exception
{
+        classLoader.loadClass(privateResourceClass);
+
+        addPrivateConfiguration();
+
+        try {
+            classLoader.loadClass(privateResourceClass);
+            fail();
+        } catch (ClassNotFoundException e) {
+        }
+    }
+
+    public void testGetResourceReturnsNullForHiddenClass() throws
Exception {
+        assertNotNull(classLoader.getResource(privateResourceName));
+        addPrivateConfiguration();
+        assertNull(classLoader.getResource(privateResourceName));
+    }
+
+    public void testGetResourcesReturnsEmptyEnumForHiddenClass() throws
Exception {
+
assertTrue(classLoader.getResources(privateResourceName).hasMoreElements());
+        addPrivateConfiguration();
+
assertFalse(classLoader.getResources(privateResourceName).hasMoreElements());
+    }
+
+    private void addPrivateConfiguration() {
+        ClassLoadingRule rule = rules.getPrivateRule();
+
rule.addClassPrefixes(Collections.singleton(privateResourceClass));
+    }
+
+}

Modified:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
Fri Nov  7 16:40:08 2008
@@ -26,6 +26,7 @@
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.JarEntry;
+import java.util.Collections;
import java.util.Enumeration;

import junit.framework.TestCase;
@@ -35,6 +36,8 @@
import net.sf.cglib.core.Predicate;
import net.sf.cglib.core.DefaultGeneratorStrategy;
import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;

/**
* @version $Rev$ $Date$
@@ -141,7 +144,9 @@
     Class clazz = cl.loadClass(CLASS_NAME);
     assertSame(parentCl, clazz.getClassLoader());

-        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
parentCl, true, new String[0], new String[0]);
+        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
+        classLoadingRules.setInverseClassLoading(true);
+        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
parentCl, classLoadingRules);
     clazz = cl.loadClass(CLASS_NAME);
     assertSame(cl, clazz.getClassLoader());
 }
@@ -154,7 +159,10 @@
     Class clazz = cl.loadClass(CLASS_NAME);
     assertSame(parentCl, clazz.getClassLoader());

-        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
parentCl, false, new String[] {CLASS_NAME}, new String[0]);
+        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
+        ClassLoadingRule classLoadingRule =
classLoadingRules.getHiddenRule();
+
classLoadingRule.addClassPrefixes(Collections.singleton(CLASS_NAME));
+        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
parentCl, classLoadingRules);
     clazz = cl.loadClass(CLASS_NAME);
     assertSame(cl, clazz.getClassLoader());
 }
@@ -167,7 +175,11 @@
     Class clazz = cl.loadClass(CLASS_NAME);
     assertSame(parentCl, clazz.getClassLoader());

-        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
parentCl, true, new String[0], new String[] {CLASS_NAME});
+        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
+        classLoadingRules.setInverseClassLoading(true);
+        ClassLoadingRule classLoadingRule =
classLoadingRules.getNonOverrideableRule();
+
classLoadingRule.addClassPrefixes(Collections.singleton(CLASS_NAME));
+        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()},
parentCl, classLoadingRules);
     clazz = cl.loadClass(CLASS_NAME);
     assertSame(parentCl, clazz.getClassLoader());
 }

Added:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java?rev=712326&view=auto

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
(added)
+++
geronimo/server/trunk/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/kernel/repository/ClassLoadingRuleTest.java
Fri Nov  7 16:40:08 2008
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.kernel.repository;
+
+import java.util.Collections;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class ClassLoadingRuleTest extends TestCase {
+    private static final String FILTERED_PREFIX = "org.apache.geronimo";
+    private static final String FILTERED_RESOURCE_PREFIX =
"org/apache/geronimo";
+
+    private ClassLoadingRule rule;
+
+    @Override
+    protected void setUp() throws Exception {
+        rule = new ClassLoadingRule();
+        Set<String> filter = Collections.singleton(FILTERED_PREFIX);
+        rule.addClassPrefixes(filter);
+    }
+
+    public void testIsFilteredClass() throws Exception {
+        assertTrue(rule.isFilteredClass(FILTERED_PREFIX + ".mock"));
+    }
+
+    public void testIsNotFilteredClass() throws Exception {
+        assertFalse(rule.isFilteredClass("mock"));
+    }
+
+    public void testIsFilteredResource() throws Exception {
+        assertTrue(rule.isFilteredResource(FILTERED_RESOURCE_PREFIX +
"/mock"));
+    }
+
+    public void testIsNotFilteredResource() throws Exception {
+        assertFalse(rule.isFilteredResource("mock"));
+    }
+
+    public void testMerge() throws Exception {
+        ClassLoadingRule ruleToMerge = new ClassLoadingRule();
+        String mergedFilteredPrefix = "geronimo";
+        Set<String> filter = Collections.singleton(mergedFilteredPrefix);
+        ruleToMerge.addClassPrefixes(filter);
+
+        rule.merge(ruleToMerge);
+
+        assertTrue(rule.isFilteredClass(mergedFilteredPrefix + ".mock"));
+        assertTrue(rule.isFilteredResource(mergedFilteredPrefix +
"/mock"));
+    }
+
+    public void testSetClassPrefixResetState() throws Exception {
+        String newFilteredPrefix = "geronimo";
+        Set<String> filter = Collections.singleton(newFilteredPrefix);
+        rule.setClassPrefixes(filter);
+
+        assertTrue(rule.isFilteredClass(newFilteredPrefix + ".mock"));
+        assertTrue(rule.isFilteredResource(newFilteredPrefix + "/mock"));
+
+        assertFalse(rule.isFilteredClass(FILTERED_PREFIX + ".mock"));
+        assertFalse(rule.isFilteredResource(FILTERED_PREFIX + "/mock"));
+    }
+
+}

Added:
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java?rev=712326&view=auto

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
(added)
+++
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtil.java
Fri Nov  7 16:40:08 2008
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.deployment.service;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.geronimo.deployment.xbeans.ClassFilterType;
+import org.apache.geronimo.deployment.xbeans.EnvironmentType;
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public final class ClassLoadingRulesUtil {
+
+    private ClassLoadingRulesUtil() {
+    }
+
+    public static void configureRules(ClassLoadingRules
classLoadingRules, EnvironmentType environmentType) {
+
classLoadingRules.setInverseClassLoading(environmentType.isSetInverseClassloading());
+
+        if (null != environmentType.getHiddenClasses()) {
+            ClassLoadingRule hiddenRule =
classLoadingRules.getHiddenRule();
+
hiddenRule.setClassPrefixes(toFilters(environmentType.getHiddenClasses()));
+        }
+
+        if (null != environmentType.getNonOverridableClasses()) {
+            ClassLoadingRule nonOverrideableRule =
classLoadingRules.getNonOverrideableRule();
+
nonOverrideableRule.setClassPrefixes(toFilters(environmentType.getNonOverridableClasses()));
+        }
+
+        if (null != environmentType.getPrivateClasses()) {
+            ClassLoadingRule privateRule =
classLoadingRules.getPrivateRule();
+
privateRule.setClassPrefixes(toFilters(environmentType.getPrivateClasses()));
+        }
+    }
+
+    private static Set<String> toFilters(ClassFilterType filterType) {
+        Set<String> filters = new HashSet<String>();
+        if (null != filterType) {
+            String[] filterArray = filterType.getFilterArray();
+            for (String filter : filterArray) {
+                filter = filter.trim();
+                filters.add(filter);
+            }
+        }
+        return filters;
+    }
+
+}

Modified:
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EnvironmentBuilder.java
Fri Nov  7 16:40:08 2008
@@ -38,6 +38,8 @@
import org.apache.geronimo.deployment.xbeans.ImportType;
import org.apache.geronimo.deployment.xbeans.DependencyType;
import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;
import org.apache.geronimo.kernel.repository.Dependency;
import org.apache.geronimo.kernel.repository.Environment;
import org.apache.xmlbeans.XmlException;
@@ -63,10 +65,9 @@
             LinkedHashSet dependencies =
toDependencies(dependencyArray);
             environment.setDependencies(dependencies);
         }
-
environment.setInverseClassLoading(environmentType.isSetInverseClassloading());

environment.setSuppressDefaultEnvironment(environmentType.isSetSuppressDefaultEnvironment());
-
environment.setHiddenClasses(toFilters(environmentType.getHiddenClasses()));
-
environment.setNonOverrideableClasses(toFilters(environmentType.getNonOverridableClasses()));
+
+
ClassLoadingRulesUtil.configureRules(environment.getClassLoadingRules(),
environmentType);
     }

     return environment;
@@ -79,10 +80,11 @@

environment.setConfigId(additionalEnvironment.getConfigId());
         }

environment.addDependencies(additionalEnvironment.getDependencies());
-
environment.setInverseClassLoading(environment.isInverseClassLoading() ||
additionalEnvironment.isInverseClassLoading());

environment.setSuppressDefaultEnvironment(environment.isSuppressDefaultEnvironment()
|| additionalEnvironment.isSuppressDefaultEnvironment());
-
environment.addHiddenClasses(additionalEnvironment.getHiddenClasses());
-
environment.addNonOverrideableClasses(additionalEnvironment.getNonOverrideableClasses());
+
+            ClassLoadingRules classLoadingRules =
environment.getClassLoadingRules();
+            ClassLoadingRules additionalClassLoadingRules =
additionalEnvironment.getClassLoadingRules();
+            classLoadingRules.merge(additionalClassLoadingRules);
     }
 }

@@ -105,14 +107,25 @@
     DependencyType[] dependencyTypes = (DependencyType[])
dependencies.toArray(new DependencyType[dependencies.size()]);
     DependenciesType dependenciesType =
environmentType.addNewDependencies();
     dependenciesType.setDependencyArray(dependencyTypes);
-        if (environment.isInverseClassLoading()) {
+
+        ClassLoadingRules classLoadingRules =
environment.getClassLoadingRules();
+        if (classLoadingRules.isInverseClassLoading()) {
         environmentType.addNewInverseClassloading();
     }
+
     if (environment.isSuppressDefaultEnvironment()) {
         environmentType.addNewSuppressDefaultEnvironment();
     }
-
environmentType.setHiddenClasses(toFilterType(environment.getHiddenClasses()));
-
environmentType.setNonOverridableClasses(toFilterType(environment.getNonOverrideableClasses()));
+
+        ClassLoadingRule classLoadingRule =
classLoadingRules.getHiddenRule();
+
environmentType.setHiddenClasses(toFilterType(classLoadingRule.getClassPrefixes()));
+
+        classLoadingRule = classLoadingRules.getNonOverrideableRule();
+
environmentType.setNonOverridableClasses(toFilterType(classLoadingRule.getClassPrefixes()));
+
+        classLoadingRule = classLoadingRules.getPrivateRule();
+
environmentType.setPrivateClasses(toFilterType(classLoadingRule.getClassPrefixes()));
+
     return environmentType;
 }


Modified:
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/xsd/geronimo-module-1.2.xsd
Fri Nov  7 16:40:08 2008
@@ -204,6 +204,21 @@
                 </xs:documentation>
             </xs:annotation>
         </xs:element>
+            <xs:element name="private-classes"
+                type="sys:classFilterType" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>
+                        A list of classes which will only be loaded from
the
+                        ClassLoader of this module or from parent
ClassLoaders.
+
+                        This is used to prevent children configurations
to see
+                        specific classes from its parents. The same
effect can
+                        be achieved by using hidden-classes. However,
+                        private-classes is the preferred approach to hide
+                        specific classes from all children
configurations.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
         <xs:element name="inverse-classloading" type="sys:emptyType"
             minOccurs="0">
             <xs:annotation>

Added:
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java?rev=712326&view=auto

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
(added)
+++
geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ClassLoadingRulesUtilTest.java
Fri Nov  7 16:40:08 2008
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.deployment.service;
+
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.apache.geronimo.deployment.xbeans.ClassFilterType;
+import org.apache.geronimo.deployment.xbeans.EmptyType;
+import org.apache.geronimo.deployment.xbeans.EnvironmentType;
+import org.apache.geronimo.kernel.repository.ClassLoadingRule;
+import org.apache.geronimo.kernel.repository.ClassLoadingRules;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class ClassLoadingRulesUtilTest extends TestCase {
+
+    public void testConfiguration() throws Exception {
+        EnvironmentType environmentType =
EnvironmentType.Factory.newInstance();
+
environmentType.setInverseClassloading(EmptyType.Factory.newInstance());
+        environmentType.setHiddenClasses(newFilter("hidden"));
+
environmentType.setNonOverridableClasses(newFilter("nonOverrideable"));
+        environmentType.setPrivateClasses(newFilter("private"));
+
+        ClassLoadingRules classLoadingRules = new ClassLoadingRules();
+        ClassLoadingRulesUtil.configureRules(classLoadingRules,
environmentType);
+
+        assertTrue(classLoadingRules.isInverseClassLoading());
+        assertPrefix(classLoadingRules.getHiddenRule(), "hidden");
+        assertPrefix(classLoadingRules.getNonOverrideableRule(),
"nonOverrideable");
+        assertPrefix(classLoadingRules.getPrivateRule(), "private");
+    }
+
+    private void assertPrefix(ClassLoadingRule classLoadingRule, String
filter) {
+        Set<String> classPrefixes = classLoadingRule.getClassPrefixes();
+        assertEquals(1, classPrefixes.size());
+        assertTrue(classPrefixes.contains(filter));
+    }
+
+    private ClassFilterType newFilter(String filter) {
+        ClassFilterType hiddenClasses =
ClassFilterType.Factory.newInstance();
+        hiddenClasses.addFilter(filter);
+        return hiddenClasses;
+    }
+
+}

Modified:
geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_dep_1_result.xml
Fri Nov  7 16:40:08 2008
@@ -44,6 +44,7 @@
 </dep:dependencies>
 <dep:hidden-classes/>
 <dep:non-overridable-classes/>
+    <dep:private-classes/>
</dep:environment>
<module>
 <java>appclient_dep_resref_single_client.jar</java>
@@ -89,6 +90,7 @@
     </dep:dependencies>
     <dep:hidden-classes/>
     <dep:non-overridable-classes/>
+        <dep:private-classes/>
   </dep:client-environment>
   <dep:server-environment
xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2">
     <dep:moduleId>
@@ -100,6 +102,7 @@
     <dep:dependencies/>
     <dep:hidden-classes/>
     <dep:non-overridable-classes/>
+        <dep:private-classes/>
   </dep:server-environment>
   <resource-ref xmlns="http://geronimo.apache.org/xml/ns/naming-1.2">
     <ref-name>url/URL</ref-name>
@@ -126,6 +129,7 @@
         <dep:dependencies/>
         <dep:hidden-classes/>
         <dep:non-overridable-classes/>
+            <dep:private-classes/>
         <dep:suppress-default-environment/>
       </dep:environment>
       <resourceadapter>

Modified:
geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml?rev=712326&r1=712325&r2=712326&view=diff

==============================================================================
---
geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
(original)
+++
geronimo/server/trunk/framework/modules/geronimo-upgrade/src/test/resources/appclient_ejb_1_result.xml
Fri Nov  7 16:40:08 2008
@@ -32,6 +32,7 @@
 </dep:dependencies>
 <dep:hidden-classes/>
 <dep:non-overridable-classes/>
+    <dep:private-classes/>
</dep:environment>
<module>
 <ejb>appclient_ejb_1_ejb.jar</ejb>
@@ -46,6 +47,7 @@
     <dep:dependencies/>
     <dep:hidden-classes/>
 



--
~Jason Warner



--
~Jason Warner
------=_Part_51145_23491154.1226436144727--