You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@apache.org on 2002/03/01 04:04:44 UTC
cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup HostConfig.java
craigmcc 02/02/28 19:04:44
Modified: catalina/src/share/org/apache/catalina/core
StandardHostDeployer.java
catalina/src/share/org/apache/catalina/servlets
ManagerServlet.java
catalina/src/share/org/apache/catalina/startup
HostConfig.java
Log:
Restore the unpackWARs behavior (but only for WAR files in the appBase
subdirectory) that was broken by previous changes to deployment and the
Manager webapp's servlet. The WAR-expansion logic was refactored from
StandardHostDeployer to HostConfig, which is the only place that requires it.
Applications that are added via the Manager webapp's "/install" or "/deploy"
commands are *not* auto-expanded -- if you want your webapp to run from an
unpacked directory, you should install an unpacked directory.
NOTE: You can also get auto-unpack service by simply dropping a WAR file
into the appBase directory while Tomcat is running - a background thread
will notice this and unpack it in the same way that startup works.
NOTE: As before, any auto-unpacked directory is *never* deleted, because
the user has probably changed things and would be very annoyed if it was
removed.
I'm going to make a pass through the JavaDocs and the documentation files
to make sure that they are all up to date with respect to the actual
functionality.
Revision Changes Path
1.5 +32 -226 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostDeployer.java
Index: StandardHostDeployer.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostDeployer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- StandardHostDeployer.java 27 Feb 2002 01:17:00 -0000 1.4
+++ StandardHostDeployer.java 1 Mar 2002 03:04:43 -0000 1.5
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostDeployer.java,v 1.4 2002/02/27 01:17:00 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2002/02/27 01:17:00 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostDeployer.java,v 1.5 2002/03/01 03:04:43 craigmcc Exp $
+ * $Revision: 1.5 $
+ * $Date: 2002/03/01 03:04:43 $
*
* ====================================================================
*
@@ -94,7 +94,7 @@
* <code>StandardHost</code> implementation class.</p>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2002/02/27 01:17:00 $
+ * @version $Revision: 1.5 $ $Date: 2002/03/01 03:04:43 $
*/
public class StandardHostDeployer implements Deployer {
@@ -206,9 +206,10 @@
* @exception IllegalStateException if the specified context path
* is already attached to an existing web application
* @exception IOException if an input/output error was encountered
- * during install
+ * during installation
*/
- public void install(String contextPath, URL war) throws IOException {
+ public synchronized void install(String contextPath, URL war)
+ throws IOException {
// Validate the format and state of our arguments
if (contextPath == null)
@@ -224,49 +225,23 @@
throw new IllegalArgumentException
(sm.getString("standardHost.warRequired"));
- // Prepare the local variables we will require
+ // Calculate the document base for the new web application
+ host.log(sm.getString("standardHost.installing",
+ contextPath, war.toString()));
String url = war.toString();
String docBase = null;
- host.log(sm.getString("standardHost.installing", contextPath, url));
-
- // Expand a WAR archive into an unpacked directory if needed
- // NOTE: If the user supplies a "jar:file:" URL, assume that
- // they do not want WAR expansion even if unpackWARs is set
- if (host.isUnpackWARs() && !url.startsWith("jar:file:")) {
-
- if (url.startsWith("jar:"))
- docBase = expand(war);
- else if (url.startsWith("file://"))
- docBase = url.substring(7);
- else if (url.startsWith("file:"))
- docBase = url.substring(5);
- else
- throw new IllegalArgumentException
- (sm.getString("standardHost.warURL", url));
-
- // Make sure the document base directory exists and is readable
- File docBaseDir = new File(docBase);
- if (!docBaseDir.exists() || !docBaseDir.isDirectory() ||
- !docBaseDir.canRead())
- throw new IllegalArgumentException
- (sm.getString("standardHost.accessBase", docBase));
-
- } else {
-
- if (url.startsWith("jar:")) {
- url = url.substring(4, url.length() - 2);
- }
- if (url.startsWith("file://"))
- docBase = url.substring(7);
- else if (url.startsWith("file:"))
- docBase = url.substring(5);
- else
- throw new IllegalArgumentException
- (sm.getString("standardHost.warURL", url));
-
+ if (url.startsWith("jar:")) {
+ url = url.substring(4, url.length() - 2);
}
+ if (url.startsWith("file://"))
+ docBase = url.substring(7);
+ else if (url.startsWith("file:"))
+ docBase = url.substring(5);
+ else
+ throw new IllegalArgumentException
+ (sm.getString("standardHost.warURL", url));
- // Install this new web application
+ // Install the new web application
try {
Class clazz = Class.forName(host.getContextClass());
Context context = (Context) clazz.newInstance();
@@ -321,54 +296,26 @@
throw new IllegalArgumentException
(sm.getString("standardHost.configRequired"));
- // Prepare the local variables we will require
+ // Calculate the document base for the new web application (if needed)
String docBase = null; // Optional override for value in config file
-
- // Expand a WAR archive into an unpacked directory if needed
if (war != null) {
-
String url = war.toString();
host.log(sm.getString("standardHost.installingWAR", url));
-
- if (host.isUnpackWARs()) {
-
- // Calculate the document base directory pathname
- if (url.startsWith("jar:"))
- docBase = expand(war);
- else if (url.startsWith("file://"))
- docBase = url.substring(7);
- else if (url.startsWith("file:"))
- docBase = url.substring(5);
- else
- throw new IllegalArgumentException
- (sm.getString("standardHost.warURL", url));
-
- // Make sure the document base directory exists and is readable
- File docBaseDir = new File(docBase);
- if (!docBaseDir.exists() || !docBaseDir.isDirectory() ||
- !docBaseDir.canRead())
- throw new IllegalArgumentException
- (sm.getString("standardHost.accessBase", docBase));
-
- } else {
-
- // Calculate the WAR file absolute pathname
- if (url.startsWith("jar:")) {
- url = url.substring(4, url.length() - 2);
- }
- if (url.startsWith("file://"))
- docBase = url.substring(7);
- else if (url.startsWith("file:"))
- docBase = url.substring(5);
- else
- throw new IllegalArgumentException
- (sm.getString("standardHost.warURL", url));
-
+ // Calculate the WAR file absolute pathname
+ if (url.startsWith("jar:")) {
+ url = url.substring(4, url.length() - 2);
}
+ if (url.startsWith("file://"))
+ docBase = url.substring(7);
+ else if (url.startsWith("file:"))
+ docBase = url.substring(5);
+ else
+ throw new IllegalArgumentException
+ (sm.getString("standardHost.warURL", url));
}
- // Install this new web application
+ // Install the new web application
this.context = null;
this.overrideDocBase = docBase;
InputStream stream = null;
@@ -608,147 +555,6 @@
digester.addRuleSet(namingRuleSet);
}
return (digester);
-
- }
-
-
- /**
- * Expand the WAR file found at the specified URL into an unpacked
- * directory structure, and return the absolute pathname to the expanded
- * directory.
- *
- * @param war URL of the web application archive to be expanded
- * (must start with "jar:")
- *
- * @exception IllegalArgumentException if this is not a "jar:" URL
- * @exception IOException if an input/output error was encountered
- * during expansion
- */
- protected String expand(URL war) throws IOException {
-
- // Calculate the directory name of the expanded directory
- if (host.getDebug() >= 1)
- host.log("expand(" + war.toString() + ")");
- String pathname = war.toString().replace('\\', '/');
- if (pathname.endsWith("!/"))
- pathname = pathname.substring(0, pathname.length() - 2);
- int period = pathname.lastIndexOf('.');
- if (period >= pathname.length() - 4)
- pathname = pathname.substring(0, period);
- int slash = pathname.lastIndexOf('/');
- if (slash >= 0)
- pathname = pathname.substring(slash + 1);
- if (host.getDebug() >= 1)
- host.log(" Proposed directory name: " + pathname);
-
- // Make sure that there is no such directory already existing
- File appBase = new File(host.getAppBase());
- if (!appBase.isAbsolute())
- appBase = new File(System.getProperty("catalina.base"),
- host.getAppBase());
- if (!appBase.exists() || !appBase.isDirectory())
- throw new IOException
- (sm.getString("standardHost.appBase",
- appBase.getAbsolutePath()));
- File docBase = new File(appBase, pathname);
- if (docBase.exists()) {
- // War file is already installed
- return (docBase.getAbsolutePath());
- }
- docBase.mkdir();
- if (host.getDebug() >= 2)
- host.log(" Have created expansion directory " +
- docBase.getAbsolutePath());
-
- // Expand the WAR into the new document base directory
- JarURLConnection juc = (JarURLConnection) war.openConnection();
- juc.setUseCaches(false);
- JarFile jarFile = juc.getJarFile();
- if (host.getDebug() >= 2)
- host.log(" Have opened JAR file successfully");
- Enumeration jarEntries = jarFile.entries();
- if (host.getDebug() >= 2)
- host.log(" Have retrieved entries enumeration");
- while (jarEntries.hasMoreElements()) {
- JarEntry jarEntry = (JarEntry) jarEntries.nextElement();
- String name = jarEntry.getName();
- if (host.getDebug() >= 2)
- host.log(" Am processing entry " + name);
- int last = name.lastIndexOf('/');
- if (last >= 0) {
- File parent = new File(docBase,
- name.substring(0, last));
- if (host.getDebug() >= 2)
- host.log(" Creating parent directory " + parent);
- parent.mkdirs();
- }
- if (name.endsWith("/"))
- continue;
- if (host.getDebug() >= 2)
- host.log(" Creating expanded file " + name);
- InputStream input = jarFile.getInputStream(jarEntry);
- expand(input, docBase, name);
- input.close();
- }
- jarFile.close();
-
- // Return the absolute path to our new document base directory
- return (docBase.getAbsolutePath());
-
- }
-
-
- /**
- * Expand the specified input stream into the specified directory, creating
- * a file named from the specified relative path.
- *
- * @param input InputStream to be copied
- * @param docBase Document base directory into which we are expanding
- * @param name Relative pathname of the file to be created
- *
- * @exception IOException if an input/output error occurs
- */
- protected void expand(InputStream input, File docBase, String name)
- throws IOException {
-
- File file = new File(docBase, name);
- BufferedOutputStream output =
- new BufferedOutputStream(new FileOutputStream(file));
- byte buffer[] = new byte[2048];
- while (true) {
- int n = input.read(buffer);
- if (n <= 0)
- break;
- output.write(buffer, 0, n);
- }
- output.close();
-
- }
-
-
- /**
- * Remove the specified directory and all of its contents.
- *
- * @param dir Directory to be removed
- *
- * @exception IOException if an input/output error occurs
- */
- protected void remove(File dir) throws IOException {
-
- String list[] = dir.list();
- for (int i = 0; i < list.length; i++) {
- File file = new File(dir, list[i]);
- if (file.isDirectory()) {
- remove(file);
- } else {
- if (!file.delete())
- throw new IOException("Cannot delete file " +
- file.getAbsolutePath());
- }
- }
- if (!dir.delete())
- throw new IOException("Cannot delete directory " +
- dir.getAbsolutePath());
}
1.16 +7 -43 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java
Index: ManagerServlet.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- ManagerServlet.java 28 Feb 2002 06:10:55 -0000 1.15
+++ ManagerServlet.java 1 Mar 2002 03:04:44 -0000 1.16
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v 1.15 2002/02/28 06:10:55 craigmcc Exp $
- * $Revision: 1.15 $
- * $Date: 2002/02/28 06:10:55 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v 1.16 2002/03/01 03:04:44 craigmcc Exp $
+ * $Revision: 1.16 $
+ * $Date: 2002/03/01 03:04:44 $
*
* ====================================================================
*
@@ -182,7 +182,7 @@
* </ul>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.15 $ $Date: 2002/02/28 06:10:55 $
+ * @version $Revision: 1.16 $ $Date: 2002/03/01 03:04:44 $
*/
public class ManagerServlet
@@ -453,7 +453,7 @@
return;
}
- // Upload the web application archive to a temporary JAR file
+ // Upload the web application archive to a local WAR file
File tempDir = (File) getServletContext().getAttribute
("javax.servlet.context.tempdir");
File localWar = new File(tempDir, basename + ".war");
@@ -505,35 +505,6 @@
/**
- * Expand the specified input stream into the specified dirctory, creating
- * a file named from the specified relative path.
- *
- * @param istream InputStream to be copied
- * @param docBaseDir Document base directory into which we are expanding
- * @param name Relative pathname of the file to be created
- *
- * @exception IOException if an input/output error occurs
- */
- protected void deployExpand(InputStream istream, File docBaseDir,
- String name) throws IOException {
-
- File file = new File(docBaseDir, name);
- BufferedOutputStream ostream =
- new BufferedOutputStream(new FileOutputStream(file));
- byte buffer[] = new byte[2048];
- while (true) {
- int n = istream.read(buffer);
- if (n <= 0) {
- break;
- }
- ostream.write(buffer, 0, n);
- }
- ostream.close();
-
- }
-
-
- /**
* Install an application for the specified path from the specified
* web application archive.
*
@@ -937,14 +908,7 @@
docBaseDir = new File(appBaseDir, docBase);
}
String docBasePath = docBaseDir.getCanonicalPath();
- boolean ok = false;
- if (docBasePath.startsWith(tempDirPath)) {
- ok = true;
- } else if ((appBasePath != null) &&
- docBasePath.startsWith(appBasePath)) {
- ok = true;
- }
- if (!ok) {
+ if (!docBasePath.startsWith(tempDirPath)) {
writer.println(sm.getString("managerServlet.noDocBase",
displayPath));
return;
@@ -958,7 +922,7 @@
if (docBaseDir.isDirectory()) {
undeployDir(docBaseDir);
} else {
- docBaseDir.delete(); // WAR file
+ docBaseDir.delete(); // Delete the WAR file
}
writer.println(sm.getString("managerServlet.undeployed",
displayPath));
1.17 +195 -14 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/HostConfig.java
Index: HostConfig.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/HostConfig.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- HostConfig.java 1 Feb 2002 19:17:34 -0000 1.16
+++ HostConfig.java 1 Mar 2002 03:04:44 -0000 1.17
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/HostConfig.java,v 1.16 2002/02/01 19:17:34 remm Exp $
- * $Revision: 1.16 $
- * $Date: 2002/02/01 19:17:34 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/HostConfig.java,v 1.17 2002/03/01 03:04:44 craigmcc Exp $
+ * $Revision: 1.17 $
+ * $Date: 2002/03/01 03:04:44 $
*
* ====================================================================
*
@@ -73,6 +73,7 @@
import java.io.InputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
+import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
@@ -101,7 +102,7 @@
*
* @author Craig R. McClanahan
* @author Remy Maucherat
- * @version $Revision: 1.16 $ $Date: 2002/02/01 19:17:34 $
+ * @version $Revision: 1.17 $ $Date: 2002/03/01 03:04:44 $
*/
public class HostConfig
@@ -174,6 +175,13 @@
/**
+ * Should we unpack WAR files when auto-deploying applications in the
+ * <code>appBase</code> directory?
+ */
+ private boolean unpackWARs = false;
+
+
+ /**
* Last modified dates of the web.xml files of the contexts, keyed by
* context name.
*/
@@ -249,6 +257,28 @@
}
+ /**
+ * Return the unpack WARs flag.
+ */
+ public boolean isUnpackWARs() {
+
+ return (this.unpackWARs);
+
+ }
+
+
+ /**
+ * Set the unpack WARs flag.
+ *
+ * @param unpackWARs The new unpack WARs flag
+ */
+ public void setUnpackWARs(boolean unpackWARs) {
+
+ this.unpackWARs = unpackWARs;
+
+ }
+
+
// --------------------------------------------------------- Public Methods
@@ -264,8 +294,10 @@
host = (Host) event.getLifecycle();
if (host instanceof StandardHost) {
int hostDebug = ((StandardHost) host).getDebug();
- if (hostDebug > this.debug)
+ if (hostDebug > this.debug) {
this.debug = hostDebug;
+ }
+ setUnpackWARs(((StandardHost) host).isUnpackWARs());
}
} catch (ClassCastException e) {
log(sm.getString("hostConfig.cce", event.getLifecycle()), e);
@@ -386,15 +418,35 @@
if (host.findChild(contextPath) != null)
continue;
- // Deploy the application in this WAR file
- log(sm.getString("hostConfig.deployJar", files[i]));
- try {
- URL url = new URL("file", null, dir.getCanonicalPath());
- url = new URL("jar:" + url.toString() + "!/");
- ((Deployer) host).install(contextPath, url);
- } catch (Throwable t) {
- log(sm.getString("hostConfig.deployJar.error", files[i]),
- t);
+ if (isUnpackWARs()) {
+
+ // Expand and deploy this application as a directory
+ log(sm.getString("hostConfig.expand", files[i]));
+ try {
+ URL url = new URL("jar:file:" +
+ dir.getCanonicalPath() + "!/");
+ String path = expand(url);
+ url = new URL("file:" + path);
+ ((Deployer) host).install(contextPath, url);
+ } catch (Throwable t) {
+ log(sm.getString("hostConfig.expand.error", files[i]),
+ t);
+ }
+
+ } else {
+
+ // Deploy the application in this WAR file
+ log(sm.getString("hostConfig.deployJar", files[i]));
+ try {
+ URL url = new URL("file", null,
+ dir.getCanonicalPath());
+ url = new URL("jar:" + url.toString() + "!/");
+ ((Deployer) host).install(contextPath, url);
+ } catch (Throwable t) {
+ log(sm.getString("hostConfig.deployJar.error",
+ files[i]), t);
+ }
+
}
}
@@ -512,6 +564,135 @@
}
+
+
+ /**
+ * Expand the WAR file found at the specified URL into an unpacked
+ * directory structure, and return the absolute pathname to the expanded
+ * directory.
+ *
+ * @param war URL of the web application archive to be expanded
+ * (must start with "jar:")
+ *
+ * @exception IllegalArgumentException if this is not a "jar:" URL
+ * @exception IOException if an input/output error was encountered
+ * during expansion
+ */
+ protected String expand(URL war) throws IOException {
+
+ // Calculate the directory name of the expanded directory
+ if (getDebug() >= 1) {
+ log("expand(" + war.toString() + ")");
+ }
+ String pathname = war.toString().replace('\\', '/');
+ if (pathname.endsWith("!/")) {
+ pathname = pathname.substring(0, pathname.length() - 2);
+ }
+ int period = pathname.lastIndexOf('.');
+ if (period >= pathname.length() - 4)
+ pathname = pathname.substring(0, period);
+ int slash = pathname.lastIndexOf('/');
+ if (slash >= 0) {
+ pathname = pathname.substring(slash + 1);
+ }
+ if (getDebug() >= 1) {
+ log(" Proposed directory name: " + pathname);
+ }
+
+ // Make sure that there is no such directory already existing
+ File appBase = new File(host.getAppBase());
+ if (!appBase.isAbsolute()) {
+ appBase = new File(System.getProperty("catalina.base"),
+ host.getAppBase());
+ }
+ if (!appBase.exists() || !appBase.isDirectory()) {
+ throw new IOException
+ (sm.getString("standardHost.appBase",
+ appBase.getAbsolutePath()));
+ }
+ File docBase = new File(appBase, pathname);
+ if (docBase.exists()) {
+ // War file is already installed
+ return (docBase.getAbsolutePath());
+ }
+
+ // Create the new document base directory
+ docBase.mkdir();
+ if (getDebug() >= 2) {
+ log(" Have created expansion directory " +
+ docBase.getAbsolutePath());
+ }
+
+ // Expand the WAR into the new document base directory
+ JarURLConnection juc = (JarURLConnection) war.openConnection();
+ juc.setUseCaches(false);
+ JarFile jarFile = juc.getJarFile();
+ if (getDebug() >= 2) {
+ log(" Have opened JAR file successfully");
+ }
+ Enumeration jarEntries = jarFile.entries();
+ if (getDebug() >= 2) {
+ log(" Have retrieved entries enumeration");
+ }
+ while (jarEntries.hasMoreElements()) {
+ JarEntry jarEntry = (JarEntry) jarEntries.nextElement();
+ String name = jarEntry.getName();
+ if (getDebug() >= 2) {
+ log(" Am processing entry " + name);
+ }
+ int last = name.lastIndexOf('/');
+ if (last >= 0) {
+ File parent = new File(docBase,
+ name.substring(0, last));
+ if (getDebug() >= 2) {
+ log(" Creating parent directory " + parent);
+ }
+ parent.mkdirs();
+ }
+ if (name.endsWith("/")) {
+ continue;
+ }
+ if (getDebug() >= 2) {
+ log(" Creating expanded file " + name);
+ }
+ InputStream input = jarFile.getInputStream(jarEntry);
+ expand(input, docBase, name);
+ input.close();
+ }
+ jarFile.close();
+
+ // Return the absolute path to our new document base directory
+ return (docBase.getAbsolutePath());
+
+ }
+
+
+ /**
+ * Expand the specified input stream into the specified directory, creating
+ * a file named from the specified relative path.
+ *
+ * @param input InputStream to be copied
+ * @param docBase Document base directory into which we are expanding
+ * @param name Relative pathname of the file to be created
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ protected void expand(InputStream input, File docBase, String name)
+ throws IOException {
+
+ File file = new File(docBase, name);
+ BufferedOutputStream output =
+ new BufferedOutputStream(new FileOutputStream(file));
+ byte buffer[] = new byte[2048];
+ while (true) {
+ int n = input.read(buffer);
+ if (n <= 0)
+ break;
+ output.write(buffer, 0, n);
+ }
+ output.close();
+
+ }
/**
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>