Return-Path: Delivered-To: apmail-tomcat-dev-archive@www.apache.org Received: (qmail 76767 invoked from network); 22 Apr 2010 13:08:46 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 22 Apr 2010 13:08:46 -0000 Received: (qmail 47144 invoked by uid 500); 22 Apr 2010 13:08:45 -0000 Delivered-To: apmail-tomcat-dev-archive@tomcat.apache.org Received: (qmail 46990 invoked by uid 500); 22 Apr 2010 13:08:44 -0000 Mailing-List: contact dev-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Developers List" Delivered-To: mailing list dev@tomcat.apache.org Received: (qmail 46981 invoked by uid 99); 22 Apr 2010 13:08:44 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 22 Apr 2010 13:08:44 +0000 X-ASF-Spam-Status: No, hits=-1359.8 required=10.0 tests=ALL_TRUSTED,AWL X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 22 Apr 2010 13:08:43 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 929D423889B8; Thu, 22 Apr 2010 13:08:01 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r936823 - in /tomcat/trunk: java/org/apache/catalina/loader/WebappClassLoader.java java/org/apache/catalina/loader/WebappLoader.java java/org/apache/catalina/loader/mbeans-descriptors.xml webapps/docs/config/loader.xml Date: Thu, 22 Apr 2010 13:08:01 -0000 To: dev@tomcat.apache.org From: rjung@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100422130801.929D423889B8@eris.apache.org> Author: rjung Date: Thu Apr 22 13:08:01 2010 New Revision: 936823 URL: http://svn.apache.org/viewvc?rev=936823&view=rev Log: Add property "searchExternalFirst" to WebappLoader: if set the external repositories will be searched before the WEB-INF ones. Default (false) is unchanged behaviour. Expose the new property via JMX and document it.. Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java tomcat/trunk/java/org/apache/catalina/loader/mbeans-descriptors.xml tomcat/trunk/webapps/docs/config/loader.xml Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=936823&r1=936822&r2=936823&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Thu Apr 22 13:08:01 2010 @@ -410,6 +410,11 @@ public class WebappClassLoader protected boolean hasExternalRepositories = false; /** + * Search external repositories first + */ + protected boolean searchExternalFirst = false; + + /** * need conversion for properties files */ protected boolean needConvert = false; @@ -535,7 +540,21 @@ public class WebappClassLoader this.antiJARLocking = antiJARLocking; } - + /** + * @return Returns the searchExternalFirst. + */ + public boolean getSearchExternalFirst() { + return searchExternalFirst; + } + + /** + * @param searchExternalFirst Whether external repositories should be searched first + */ + public void setSearchExternalFirst(boolean searchExternalFirst) { + this.searchExternalFirst = searchExternalFirst; + } + + /** * If there is a Java SecurityManager create a read FilePermission * or JndiPermission for the file directory path. @@ -1065,22 +1084,37 @@ public class WebappClassLoader try { if (log.isTraceEnabled()) log.trace(" findClassInternal(" + name + ")"); - try { - clazz = findClassInternal(name); - } catch(ClassNotFoundException cnfe) { - if (!hasExternalRepositories) { - throw cnfe; - } - } catch(AccessControlException ace) { - log.warn("WebappClassLoader.findClassInternal(" + name - + ") security exception: " + ace.getMessage(), ace); - throw new ClassNotFoundException(name, ace); - } catch (RuntimeException e) { - if (log.isTraceEnabled()) - log.trace(" -->RuntimeException Rethrown", e); - throw e; + if (hasExternalRepositories && searchExternalFirst) { + try { + clazz = super.findClass(name); + } catch(AccessControlException ace) { + log.warn("WebappClassLoader.findClassInternal(" + name + + ") security exception: " + ace.getMessage(), ace); + throw new ClassNotFoundException(name, ace); + } catch (RuntimeException e) { + if (log.isTraceEnabled()) + log.trace(" -->RuntimeException Rethrown", e); + throw e; + } } - if ((clazz == null) && hasExternalRepositories) { + if ((clazz == null)) { + try { + clazz = findClassInternal(name); + } catch(ClassNotFoundException cnfe) { + if (!hasExternalRepositories || searchExternalFirst) { + throw cnfe; + } + } catch(AccessControlException ace) { + log.warn("WebappClassLoader.findClassInternal(" + name + + ") security exception: " + ace.getMessage(), ace); + throw new ClassNotFoundException(name, ace); + } catch (RuntimeException e) { + if (log.isTraceEnabled()) + log.trace(" -->RuntimeException Rethrown", e); + throw e; + } + } + if ((clazz == null) && hasExternalRepositories && !searchExternalFirst) { try { clazz = super.findClass(name); } catch(AccessControlException ace) { @@ -1138,21 +1172,26 @@ public class WebappClassLoader URL url = null; - ResourceEntry entry = resourceEntries.get(name); - if (entry == null) { - if (securityManager != null) { - PrivilegedAction dp = - new PrivilegedFindResourceByName(name, name); - entry = AccessController.doPrivileged(dp); - } else { - entry = findResourceInternal(name, name); + if (hasExternalRepositories && searchExternalFirst) + url = super.findResource(name); + + if (url == null) { + ResourceEntry entry = resourceEntries.get(name); + if (entry == null) { + if (securityManager != null) { + PrivilegedAction dp = + new PrivilegedFindResourceByName(name, name); + entry = AccessController.doPrivileged(dp); + } else { + entry = findResourceInternal(name, name); + } + } + if (entry != null) { + url = entry.source; } - } - if (entry != null) { - url = entry.source; } - if ((url == null) && hasExternalRepositories) + if ((url == null) && hasExternalRepositories && !searchExternalFirst) url = super.findResource(name); if (log.isDebugEnabled()) { @@ -1188,6 +1227,16 @@ public class WebappClassLoader int i; + // Adding the results of a call to the superclass + if (hasExternalRepositories && searchExternalFirst) { + + Enumeration otherResourcePaths = super.findResources(name); + + while (otherResourcePaths.hasMoreElements()) { + result.addElement(otherResourcePaths.nextElement()); + } + + } // Looking at the repositories for (i = 0; i < repositoriesLength; i++) { try { @@ -1223,7 +1272,7 @@ public class WebappClassLoader } // Adding the results of a call to the superclass - if (hasExternalRepositories) { + if (hasExternalRepositories && !searchExternalFirst) { Enumeration otherResourcePaths = super.findResources(name); @@ -3178,4 +3227,3 @@ public class WebappClassLoader } - Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java?rev=936823&r1=936822&r2=936823&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java Thu Apr 22 13:08:01 2010 @@ -196,6 +196,12 @@ public class WebappLoader extends Lifecy private ArrayList loaderRepositories = null; + /** + * Whether we should search the external repositories first + */ + private boolean searchExternalFirst = false; + + // ------------------------------------------------------------- Properties @@ -331,6 +337,23 @@ public class WebappLoader extends Lifecy } + /** + * @return Returns searchExternalFirst. + */ + public boolean getSearchExternalFirst() { + return searchExternalFirst; + } + + /** + * @param searchExternalFirst Whether external repositories should be searched first + */ + public void setSearchExternalFirst(boolean searchExternalFirst) { + this.searchExternalFirst = searchExternalFirst; + if (classLoader != null) { + classLoader.setSearchExternalFirst(searchExternalFirst); + } + } + // --------------------------------------------------------- Public Methods @@ -589,6 +612,7 @@ public class WebappLoader extends Lifecy classLoader = createClassLoader(); classLoader.setResources(container.getResources()); classLoader.setDelegate(this.delegate); + classLoader.setSearchExternalFirst(searchExternalFirst); if (container instanceof StandardContext) { classLoader.setAntiJARLocking( ((StandardContext) container).getAntiJARLocking()); Modified: tomcat/trunk/java/org/apache/catalina/loader/mbeans-descriptors.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/mbeans-descriptors.xml?rev=936823&r1=936822&r2=936823&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/mbeans-descriptors.xml (original) +++ tomcat/trunk/java/org/apache/catalina/loader/mbeans-descriptors.xml Thu Apr 22 13:08:01 2010 @@ -38,6 +38,10 @@ description="The reloadable flag for this Loader" type="boolean"/> + + @@ -133,6 +137,10 @@ description="The antiJARLocking flag for this Loader" type="boolean"/> + + Modified: tomcat/trunk/webapps/docs/config/loader.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/loader.xml?rev=936823&r1=936822&r2=936823&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/config/loader.xml (original) +++ tomcat/trunk/webapps/docs/config/loader.xml Thu Apr 22 13:08:01 2010 @@ -130,6 +130,12 @@ org.apache.catalina.loader.WebappClassLoader.

+ +

Set to true if you want repositories outside + of WEB-INF/classes and WEB-INF/lib to + be searched first. Default value is false.

+
+ --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org For additional commands, e-mail: dev-help@tomcat.apache.org