glenn 01/03/25 19:23:35
Modified: catalina/src/share/org/apache/catalina/servlets
ManagerServlet.java
Log:
Improve webapp unpack WAR file behaviour and enhance manager servlet
Revision Changes Path
1.4 +242 -46
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.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ManagerServlet.java 2001/01/03 02:20:46 1.3
+++ ManagerServlet.java 2001/03/26 03:23:35 1.4
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v
1.3 2001/01/03 02:20:46 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2001/01/03 02:20:46 $
+ * $Header:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v
1.4 2001/03/26 03:23:35 glenn Exp $
+ * $Revision: 1.4 $
+ * $Date: 2001/03/26 03:23:35 $
*
* ====================================================================
*
@@ -78,6 +78,7 @@
import org.apache.catalina.Deployer;
import org.apache.catalina.HttpRequest;
import org.apache.catalina.HttpResponse;
+import org.apache.catalina.Session;
import org.apache.catalina.Wrapper;
import org.apache.catalina.util.StringManager;
@@ -94,19 +95,48 @@
* The following actions and parameters (starting after the servlet path)
* are supported:
* <ul>
- * <li><b>/list</b> - Return a list of the context paths of all currently
- * running web applications in this virtual host.
- * <li><b>/deploy?path=/xxx&war={war-url}</b> - Deploy a new web application
- * attached to context path <code>/xxx</code>, based on the contents of
- * the web application archive found at the specified URL.
+ * <li><b>/install?path=/xxx&war={war-url}</b> - Install and start a new
+ * web application attached to context path <code>/xxx</code>, based
+ * on the contents of the web application archive found at the
+ * specified URL.</li>
+ * <li><b>/list</b> - List the context paths of all currently installed web
+ * applications for this virtual host. Each context will be listed with
+ * the following format <code>path:status:sessions</code>.
+ * Where path is the context path. Status is either running or stopped.
+ * Sessions is the number of active Sessions.</li>
* <li><b>/reload?path=/xxx</b> - Reload the Java classes and resources for
* the application at the specified path, but do not reread the web.xml
- * configuration files.
- * <li><b>/undeploy?path=/xxx</b> - Remove any web application attached to
- * context path <code>/xxx</code> from this virtual host.
+ * configuration files.</li>
+ * <li><b>/remove?path=/xxx</b> - Shutdown and remove the web application
+ * attached to context path <code>/xxx</code> for this virtual host.</li>
+ * <li><b>/sessions?path=/xxx</b> - List session information about the web
+ * application attached to context path <code>/xxx</code> for this
+ * virtual host.</li>
+ * <li><b>/start?path=/xxx</b> - Start the web application attached to
+ * context path <code>/xxx</code> for this virtual host.</li>
+ * <li><b>/stop?path=/xxx</b> - Stop the web application attached to
+ * context path <code>/xxx</code> for this virtual host.</li>
* </ul>
+ * <p>Use <code>path=/</code> for the ROOT context.</p>
+ * <p>The syntax of the URL for a web application archive must conform to one
+ * of the following patterns to be successfully deployed:</p>
+ * <ul>
+ * <li><b>file:/absolute/path/to/a/directory</b> - You can specify the absolute
+ * path of a directory that contains the unpacked version of a web
+ * application. This directory will be attached to the context path you
+ * specify without any changes.</li>
+ * <li><b>jar:file:/absolute/path/to/a/warfile.war!/</b> - You can specify a
+ * URL to a local web application archive file. The syntax must conform to
+ * the rules specified by the <code>JarURLConnection</code> class for a
+ * reference to an entire JAR file.</li>
+ * <li><b>jar:http://hostname:port/path/to/a/warfile.war!/</b> - You can specify
+ * a URL to a remote (HTTP-accessible) web application archive file. The
+ * syntax must conform to the rules specified by the
+ * <code>JarURLConnection</code> class for a reference to an entire
+ * JAR file.</li>
+ * </ul>
* <p>
- * <b>NOTE</b> - Attempting to reload or undeploy the application containing
+ * <b>NOTE</b> - Attempting to reload or remove the application containing
* this servlet itself will not succeed. Therefore, this servlet should
* generally be deployed as a separate web application within the virtual host
* to be managed.
@@ -123,7 +153,7 @@
* </ul>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.3 $ $Date: 2001/01/03 02:20:46 $
+ * @version $Revision: 1.4 $ $Date: 2001/03/26 03:23:35 $
*/
public final class ManagerServlet
@@ -200,14 +230,20 @@
// Process the requested command
if (command == null) {
writer.println(sm.getString("managerServlet.noCommand"));
- } else if (command.equals("/deploy")) {
- deploy(writer, path, war);
+ } else if (command.equals("/install")) {
+ install(writer, path, war);
} else if (command.equals("/list")) {
list(writer);
} else if (command.equals("/reload")) {
reload(writer, path);
- } else if (command.equals("/undeploy")) {
- undeploy(writer, path);
+ } else if (command.equals("/remove")) {
+ remove(writer, path);
+ } else if (command.equals("/sessions")) {
+ sessions(writer, path);
+ } else if (command.equals("/start")) {
+ start(writer, path);
+ } else if (command.equals("/stop")) {
+ stop(writer, path);
} else {
writer.println(sm.getString("managerServlet.unknownCommand",
command));
@@ -260,24 +296,26 @@
/**
- * Deploy an application for the specified path from the specified
+ * Install an application for the specified path from the specified
* web application archive.
*
* @param writer Writer to render results to
- * @param path Context path of the application to be deployed
- * @param war URL of the web application archive to be deployed
+ * @param path Context path of the application to be installed
+ * @param war URL of the web application archive to be installed
*/
- private void deploy(PrintWriter writer, String path, String war) {
+ private void install(PrintWriter writer, String path, String war) {
if (debug >= 1)
- log("deploy: Deploying web application at '" + path +
+ log("install: Installing web application at '" + path +
"' from '" + war + "'");
- if ((path == null) ||
- (!path.startsWith("/") && !path.equals(""))) {
+ if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
writer.println(sm.getString("managerServlet.invalidPath", path));
return;
}
+ String displayPath = path;
+ if( path.equals("/") )
+ path = "";
if ((war == null) ||
(!war.startsWith("file:") && !war.startsWith("jar:"))) {
writer.println(sm.getString("managerServlet.invalidWar", war));
@@ -288,13 +326,13 @@
Context context = deployer.findDeployedApp(path);
if (context != null) {
writer.println(sm.getString("managerServlet.alreadyContext",
- path));
+ displayPath));
return;
}
- deployer.deploy(path, new URL(war));
- writer.println(sm.getString("managerServlet.deployed", path));
+ deployer.install(path, new URL(war));
+ writer.println(sm.getString("managerServlet.installed", displayPath));
} catch (Throwable t) {
- getServletContext().log("ManagerServlet.deploy[" + path + "]", t);
+ getServletContext().log("ManagerServlet.install[" + displayPath + "]", t);
writer.println(sm.getString("managerServlet.exception",
t.toString()));
}
@@ -316,9 +354,25 @@
writer.println(sm.getString("managerServlet.listed",
deployer.getName()));
String contextPaths[] = deployer.findDeployedApps();
- for (int i = 0; i < contextPaths.length; i++)
- writer.println(contextPaths[i]);
-
+ for (int i = 0; i < contextPaths.length; i++) {
+ Context context = deployer.findDeployedApp(contextPaths[i]);
+ String displayPath = contextPaths[i];
+ if( displayPath.equals("") )
+ displayPath = "/";
+ if (context != null ) {
+ if (context.getAvailable()) {
+ writer.println(sm.getString("managerServlet.listitem",
+ displayPath,
+ "running",
+ "" + context.getManager().findSessions().length));
+ } else {
+ writer.println(sm.getString("managerServlet.listitem",
+ displayPath,
+ "stopped",
+ "0"));
+ }
+ }
+ }
}
@@ -333,22 +387,24 @@
if (debug >= 1)
log("restart: Reloading web application at '" + path + "'");
- if ((path == null) ||
- (!path.startsWith("/") && !path.equals(""))) {
+ if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
writer.println(sm.getString("managerServlet.invalidPath", path));
return;
}
+ String displayPath = path;
+ if( path.equals("/") )
+ path = "";
try {
Context context = deployer.findDeployedApp(path);
if (context == null) {
- writer.println(sm.getString("managerServlet.noContext", path));
+ writer.println(sm.getString("managerServlet.noContext", displayPath));
return;
}
context.reload();
- writer.println(sm.getString("managerServlet.reloaded", path));
+ writer.println(sm.getString("managerServlet.reloaded", displayPath));
} catch (Throwable t) {
- getServletContext().log("ManagerServlet.reload[" + path + "]", t);
+ getServletContext().log("ManagerServlet.reload[" + displayPath + "]", t);
writer.println(sm.getString("managerServlet.exception",
t.toString()));
}
@@ -357,36 +413,176 @@
/**
- * Undeploy the web application at the specified context path.
+ * Remove the web application at the specified context path.
*
* @param writer Writer to render to
- * @param path Context path of the application to be undeployed
+ * @param path Context path of the application to be removed
*/
- private void undeploy(PrintWriter writer, String path) {
+ private void remove(PrintWriter writer, String path) {
if (debug >= 1)
- log("undeploy: Undeploying web application at '" + path + "'");
+ log("remove: Removing web application at '" + path + "'");
- if ((path == null) ||
- (!path.startsWith("/") && !path.equals(""))) {
+ if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
writer.println(sm.getString("managerServlet.invalidPath", path));
return;
}
+ String displayPath = path;
+ if( path.equals("/") )
+ path = "";
try {
Context context = deployer.findDeployedApp(path);
if (context == null) {
- writer.println(sm.getString("managerServlet.noContext", path));
+ writer.println(sm.getString("managerServlet.noContext", displayPath));
return;
}
- deployer.undeploy(path);
- writer.println(sm.getString("managerServlet.undeployed", path));
+ deployer.remove(path);
+ writer.println(sm.getString("managerServlet.removed", displayPath));
} catch (Throwable t) {
- getServletContext().log("ManagerServlet.undeploy[" + path + "]",
+ getServletContext().log("ManagerServlet.remove[" + displayPath + "]",
t);
writer.println(sm.getString("managerServlet.exception",
t.toString()));
}
+
+ }
+
+
+ /**
+ * Session information for the web application at the specified context path.
+ * Displays a profile of session MaxInactiveInterval timeouts listing number
+ * of sessions for each 10 minute timeout interval up to 10 hours.
+ *
+ * @param writer Writer to render to
+ * @param path Context path of the application to list session information for
+ */
+ private void sessions(PrintWriter writer, String path) {
+
+ if (debug >= 1)
+ log("sessions: Session information for web application at '" + path +
"'");
+
+ if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
+ writer.println(sm.getString("managerServlet.invalidPath", path));
+ return;
+ }
+ String displayPath = path;
+ if( path.equals("/") )
+ path = "";
+ try {
+ Context context = deployer.findDeployedApp(path);
+ if (context == null) {
+ writer.println(sm.getString("managerServlet.noContext",
displayPath));
+ return;
+ }
+ writer.println(sm.getString("managerServlet.sessions", displayPath));
+ writer.println(sm.getString("managerServlet.sessiondefaultmax",
+ "" + context.getManager().getMaxInactiveInterval()/60));
+ Session [] sessions = context.getManager().findSessions();
+ int [] timeout = new int[60];
+ int notimeout = 0;
+ for (int i = 0; i < sessions.length; i++) {
+ int time = sessions[i].getMaxInactiveInterval()/(10*60);
+ if (time < 0)
+ notimeout++;
+ else if (time >= timeout.length)
+ timeout[timeout.length-1]++;
+ else
+ timeout[time]++;
+ }
+ if (timeout[0] > 0)
+ writer.println(sm.getString("managerServlet.sessiontimeout",
+ "<10" + timeout[0]));
+ for (int i = 1; i < timeout.length-1; i++) {
+ if (timeout[i] > 0)
+ writer.println(sm.getString("managerServlet.sessiontimeout",
+ "" + (i)*10 + " - <" + (i+1)*10,"" + timeout[i]));
+ }
+ if (timeout[timeout.length-1] > 0)
+ writer.println(sm.getString("managerServlet.sessiontimeout",
+ ">=" + timeout.length*10,"" + timeout[timeout.length-1]));
+ if (notimeout > 0)
+ writer.println(sm.getString("managerServlet.sessiontimeout",
+ "unlimited","" + notimeout));
+ } catch (Throwable t) {
+ getServletContext().log("ManagerServlet.sessions[" + displayPath + "]",
+ t);
+ writer.println(sm.getString("managerServlet.exception",
+ t.toString()));
+ }
+
+ }
+
+ /**
+ * Start the web application at the specified context path.
+ *
+ * @param writer Writer to render to
+ * @param path Context path of the application to be started
+ */
+ private void start(PrintWriter writer, String path) {
+
+ if (debug >= 1)
+ log("start: Starting web application at '" + path + "'");
+
+ if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
+ writer.println(sm.getString("managerServlet.invalidPath", path));
+ return;
+ }
+ String displayPath = path;
+ if( path.equals("/") )
+ path = "";
+
+ try {
+ Context context = deployer.findDeployedApp(path);
+ if (context == null) {
+ writer.println(sm.getString("managerServlet.noContext",
displayPath));
+ return;
+ }
+ deployer.start(path);
+ writer.println(sm.getString("managerServlet.started", displayPath));
+ } catch (Throwable t) {
+ getServletContext().log("ManagerServlet.start[" + displayPath + "]",
+ t);
+ writer.println(sm.getString("managerServlet.exception",
+ t.toString()));
+ }
+
+ }
+
+
+ /**
+ * Stop the web application at the specified context path.
+ *
+ * @param writer Writer to render to
+ * @param path Context path of the application to be stopped
+ */
+ private void stop(PrintWriter writer, String path) {
+
+ if (debug >= 1)
+ log("stop: Stopping web application at '" + path + "'");
+
+ if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
+ writer.println(sm.getString("managerServlet.invalidPath", path));
+ return;
+ }
+ String displayPath = path;
+ if( path.equals("/") )
+ path = "";
+
+ try {
+ Context context = deployer.findDeployedApp(path);
+ if (context == null) {
+ writer.println(sm.getString("managerServlet.noContext",
displayPath));
+ return;
+ }
+ deployer.stop(path);
+ writer.println(sm.getString("managerServlet.stopped", displayPath));
+ } catch (Throwable t) {
+ getServletContext().log("ManagerServlet.stop[" + displayPath + "]",
+ t);
+ writer.println(sm.getString("managerServlet.exception",
+ t.toString()));
+ }
}