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