You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/08/22 19:02:12 UTC
cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader WebappLoader.java
costin 2002/08/22 10:02:12
Modified: catalina/src/share/org/apache/catalina/loader
WebappLoader.java
Log:
Switch to commons-logging.
While looking at the code, it seems one thread per webapp is used to
find updates - that doesn't scale very well. A single thread should
be used for all webapps.
Also looking at the code, the MANIFEST stuff is interesting but it
would be nice to make it more generic. I'm planning to try to merge
some of this code into discovery, and allow more flexibility in
finding jars and resolving dependencies. The code would be perfect
for ant and other projects.
I added a bit of code to support the case when the parent loader
is not a URLClassLoader - i.e. if we start from ant. Any classloader
that has a getClassPath method can be used. Now compiling jsps when
started from ant should work/
Revision Changes Path
1.2 +68 -33 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java
Index: WebappLoader.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- WebappLoader.java 18 Jul 2002 16:48:03 -0000 1.1
+++ WebappLoader.java 22 Aug 2002 17:02:12 -0000 1.2
@@ -75,6 +75,7 @@
import java.io.FilePermission;
import java.io.OutputStream;
import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
@@ -146,11 +147,8 @@
* @param parent The parent class loader
*/
public WebappLoader(ClassLoader parent) {
-
-
super();
this.parentClassLoader = parent;
-
}
@@ -483,8 +481,8 @@
*/
public void addRepository(String repository) {
- if (debug >= 1)
- log(sm.getString("webappLoader.addRepository", repository));
+ if (log.isDebugEnabled())
+ log.debug(sm.getString("webappLoader.addRepository", repository));
for (int i = 0; i < repositories.length; i++) {
if (repository.equals(repositories[i]))
@@ -601,8 +599,8 @@
if (started)
throw new LifecycleException
(sm.getString("webappLoader.alreadyStarted"));
- if (debug >= 1)
- log(sm.getString("webappLoader.starting"));
+ if (log.isDebugEnabled())
+ log.debug(sm.getString("webappLoader.starting"));
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
@@ -644,6 +642,7 @@
((ClassLoader) classLoader, this.container.getResources());
} catch (Throwable t) {
+ log.error( "LifecycleException ", t );
throw new LifecycleException("start: ", t);
}
@@ -652,7 +651,7 @@
// Start our background thread if we are reloadable
if (reloadable) {
- log(sm.getString("webappLoader.reloading"));
+ log.info(sm.getString("webappLoader.reloading"));
try {
threadStart();
} catch (IllegalStateException e) {
@@ -674,8 +673,8 @@
if (!started)
throw new LifecycleException
(sm.getString("webappLoader.notStarted"));
- if (debug >= 1)
- log(sm.getString("webappLoader.stopping"));
+ if (log.isDebugEnabled())
+ log.debug(sm.getString("webappLoader.stopping"));
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
@@ -720,7 +719,7 @@
setReloadable
( ((Boolean) event.getNewValue()).booleanValue() );
} catch (NumberFormatException e) {
- log(sm.getString("webappLoader.reloadable",
+ log.error(sm.getString("webappLoader.reloadable",
event.getNewValue().toString()));
}
}
@@ -743,6 +742,7 @@
if (parentClassLoader == null) {
// Will cause a ClassCast is the class does not extend WCL, but
// this is on purpose (the exception will be caught and rethrown)
+ log.info( "Creating loader with no parent ");
classLoader = (WebappClassLoader) clazz.newInstance();
} else {
Class[] argTypes = { ClassLoader.class };
@@ -941,7 +941,8 @@
if (workDir == null)
return;
- log(sm.getString("webappLoader.deploy", workDir.getAbsolutePath()));
+ if( log.isDebugEnabled())
+ log.debug(sm.getString("webappLoader.deploy", workDir.getAbsolutePath()));
DirContext resources = container.getResources();
@@ -979,7 +980,8 @@
}
- log(sm.getString("webappLoader.classDeploy", classesPath,
+ if(log.isDebugEnabled())
+ log.debug(sm.getString("webappLoader.classDeploy", classesPath,
classRepository.getAbsolutePath()));
@@ -1035,7 +1037,8 @@
// impossible to update it or remove it at runtime)
File destFile = new File(destDir, binding.getName());
- log(sm.getString("webappLoader.jarDeploy", filename,
+ if( log.isDebugEnabled())
+ log.debug(sm.getString("webappLoader.jarDeploy", filename,
destFile.getAbsolutePath()));
Resource jarResource = (Resource) binding.getObject();
@@ -1082,8 +1085,20 @@
int layers = 0;
int n = 0;
while ((layers < 3) && (loader != null)) {
- if (!(loader instanceof URLClassLoader))
+ if (!(loader instanceof URLClassLoader)) {
+ String cp=getClasspath( loader );
+ if( cp==null ) {
+ log.info( "Unknown loader " + loader + " " + loader.getClass());
+ break;
+ } else {
+ if (n > 0)
+ classpath.append(File.pathSeparator);
+ classpath.append(cp);
+ n++;
+ }
break;
+ //continue;
+ }
URL repositories[] =
((URLClassLoader) loader).getURLs();
for (int i = 0; i < repositories.length; i++) {
@@ -1114,6 +1129,24 @@
}
+ // try to extract the classpath from a loader that is not URLClassLoader
+ private String getClasspath( ClassLoader loader ) {
+ try {
+ Method m=loader.getClass().getMethod("getClasspath", new Class[] {});
+ if( log.isTraceEnabled())
+ log.trace("getClasspath " + m );
+ if( m==null ) return null;
+ Object o=m.invoke( loader, new Object[] {} );
+ if( log.isDebugEnabled() )
+ log.debug("gotClasspath " + o);
+ if( o instanceof String )
+ return (String)o;
+ return null;
+ } catch( Exception ex ) {
+ log.info("getClasspath ", ex);
+ }
+ return null;
+ }
/**
* Copy directory.
@@ -1217,8 +1250,9 @@
(sm.getString("webappLoader.notContext"));
// Start the background thread
- if (debug >= 1)
- log(" Starting background thread");
+ if (log.isDebugEnabled())
+ log.debug(" Starting background thread");
+ // XXX ONE TREAD PER WEBAPP IS _WRONG_ - IT DOESN'T SCALE
threadDone = false;
threadName = "WebappLoader[" + container.getName() + "]";
thread = new Thread(this, threadName);
@@ -1237,8 +1271,8 @@
if (thread == null)
return;
- if (debug >= 1)
- log(" Stopping background thread");
+ if (log.isDebugEnabled())
+ log.debug(" Stopping background thread");
threadDone = true;
thread.interrupt();
try {
@@ -1267,14 +1301,14 @@
((WebappClassLoader) classLoader).findAvailable();
Extension required[] =
((WebappClassLoader) classLoader).findRequired();
- if (debug >= 1)
- log("Optional Packages: available=" +
+ if (log.isDebugEnabled())
+ log.debug("Optional Packages: available=" +
available.length + ", required=" +
required.length);
for (int i = 0; i < required.length; i++) {
- if (debug >= 1)
- log("Checking for required package " + required[i]);
+ if (log.isDebugEnabled())
+ log.debug("Checking for required package " + required[i]);
boolean found = false;
for (int j = 0; j < available.length; j++) {
if (available[j].isCompatibleWith(required[i])) {
@@ -1300,8 +1334,8 @@
*/
public void run() {
- if (debug >= 1)
- log("BACKGROUND THREAD Starting");
+ if (log.isDebugEnabled())
+ log.debug("BACKGROUND THREAD Starting");
// Loop until the termination semaphore is set
while (!threadDone) {
@@ -1317,7 +1351,7 @@
if (!classLoader.modified())
continue;
} catch (Exception e) {
- log(sm.getString("webappLoader.failModifiedCheck"), e);
+ log.error(sm.getString("webappLoader.failModifiedCheck"), e);
continue;
}
@@ -1327,8 +1361,8 @@
}
- if (debug >= 1)
- log("BACKGROUND THREAD Stopping");
+ if (log.isDebugEnabled())
+ log.debug("BACKGROUND THREAD Stopping");
}
@@ -1355,7 +1389,8 @@
}
-
+ private static org.apache.commons.logging.Log log=
+ org.apache.commons.logging.LogFactory.getLog( WebappLoader.class );
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>