From dev-return-69524-apmail-geronimo-dev-archive=geronimo.apache.org@geronimo.apache.org Wed Nov 12 18:53:10 2008 Return-Path: Delivered-To: apmail-geronimo-dev-archive@www.apache.org Received: (qmail 41673 invoked from network); 12 Nov 2008 18:53:10 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 12 Nov 2008 18:53:10 -0000 Received: (qmail 28544 invoked by uid 500); 12 Nov 2008 18:53:14 -0000 Delivered-To: apmail-geronimo-dev-archive@geronimo.apache.org Received: (qmail 28484 invoked by uid 500); 12 Nov 2008 18:53:13 -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 28473 invoked by uid 99); 12 Nov 2008 18:53:13 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Nov 2008 10:53:13 -0800 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [98.136.44.58] (HELO smtp103.prem.mail.sp1.yahoo.com) (98.136.44.58) by apache.org (qpsmtpd/0.29) with SMTP; Wed, 12 Nov 2008 18:51:52 +0000 Received: (qmail 15117 invoked from network); 12 Nov 2008 18:51:35 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Received:X-YMail-OSG:X-Yahoo-Newman-Property:Message-Id:From:To:In-Reply-To:Content-Type:Content-Transfer-Encoding:Mime-Version:Subject:Date:References:X-Mailer; b=DNm/Omynd5WDyKdP3JgEo+d0fd/fVoZMGf6oeX+newzBGMeXU/D5FMQ8yZ6S54zfMysQlTNVeWc2EpFgboNaC1LX/wbXieJFpQ7kqr28eguuCcw4o3IKSyvpB9rNi0yvbUn0f5NJ52vgO+s4A/n39jMWsbf+Gk/QmYBaHwjFAvI= ; Received: from unknown (HELO ?10.11.55.41?) (david_jencks@63.105.20.225 with plain) by smtp103.prem.mail.sp1.yahoo.com with SMTP; 12 Nov 2008 18:51:27 -0000 X-YMail-OSG: CUM93JgVM1m_vShC..BOHcuolKSrToFttahLA4HldP8McDPWsa72TzFan1_A15ECKjQ2wuMQjm5liZe0jF_ipysHcaFQw1RHTiOQksc_IiqBd0gvDiUyffGD5jJBMG906SxyxXtXC4j7UCyaXuCx_vzYrxdzry8Cu3A04UgvqC3wvWAqIQhrZGSCPLc- X-Yahoo-Newman-Property: ymail-3 Message-Id: From: David Jencks To: dev@geronimo.apache.org In-Reply-To: <9D655D83-C146-42FC-87BD-04003E3BCDF8@optusnet.com.au> Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v929.2) Subject: Re: svn commit: r712326 - in /geronimo/server/trunk: framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/ framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/config/ framework/modules/geronimo Date: Wed, 12 Nov 2008 10:51:23 -0800 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> <73a75e430811111242r68be09f0pd9e5e7ceb225400e@mail.gmail.com> <491A0284.3010507@earthlink.net> <9D655D83-C146-42FC-87BD-04003E3BCDF8@optusnet.com.au> X-Mailer: Apple Mail (2.929.2) X-Virus-Checked: Checked by ClamAV on apache.org On Nov 12, 2008, at 2:06 AM, Gianny Damour wrote: > On 12/11/2008, at 9:09 AM, Joe Bohn wrote: > >> I'm confused and perhaps concerned about this change as well. >> >> First, I notice that we're still using OpenEJB 3.1-SNAPSHOT and >> apparently this is changing enough that we required new SNAPSHOTS >> published. However, I also see the OpenEJB 3.1 was released on >> 10/23. So, why is there still an OpenEJB 3.1-SNAPSHOT and why is it >> still changing such that we needed to have it published again? >> >> Second, assuming OpenEJB 3.1-SNAPSHOT is really a continuation of >> the 3.1 branch (ie. 3.1.*-SNAPSHOT) then I'm also concerned that we >> are making changes that leaves us dependent on yet another OpenEJB >> release. We are hoping for a mid-December Geronimo 2.2 release. >> I'm not sure that it is very likely we will get an OpenEJB 3.1.* >> release out prior to that deadline. >> >> How critical is this change for our 2.2 release? Could it perhaps >> be reverted and reintroduced after we release 2.2? I didn't see >> any mention of this feature in our discussions of functions that we >> were trying to include in 2.2. > > private classes can also be configured via scripts. So, we do not > really need a XML configuration style for them. I will revert the > private-class element change w/o any intention to reintroduce it > after 2.2. Could you explain your thinking here? I would prefer that any classloader configuration available through scripting also be available through xml. I have no problem with changing schemas in 2.2. In other words so far I'm in favor of keeping the xml private classes element in 2.2. thanks david jencks > > > Thanks, > Gianny > > >> >> Joe >> >> >> >> >> Jason Warner wrote: >>> 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 >>> >> > 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. >>> + >>> + >>> + >>> >> type="sys:emptyType" >>> 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 @@ >>> >>> >>> >>> + >>> >>> >> xmlns="http://geronimo.apache.org/xml/ns/naming-1.2 >>> "> >>> 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 >> >