bip 01/05/27 14:09:11 Modified: catalina/src/share/org/apache/catalina/servlets ManagerServlet.java Added: catalina/src/share/org/apache/catalina/servlets HTMLManagerServlet.java Log: Changed ManagerServlet to allow for subclassing. Added HTMLManagerServlet which is a ManagerServlet with a extended HTML interface to allow for easier administration. Revision Changes Path 1.6 +130 -128 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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ManagerServlet.java 2001/05/14 00:02:32 1.5 +++ ManagerServlet.java 2001/05/27 21:09:11 1.6 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v 1.5 2001/05/14 00:02:32 craigmcc Exp $ - * $Revision: 1.5 $ - * $Date: 2001/05/14 00:02:32 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v 1.6 2001/05/27 21:09:11 bip Exp $ + * $Revision: 1.6 $ + * $Date: 2001/05/27 21:09:11 $ * * ==================================================================== * @@ -152,10 +152,10 @@ * </ul> * * @author Craig R. McClanahan - * @version $Revision: 1.5 $ $Date: 2001/05/14 00:02:32 $ + * @version $Revision: 1.6 $ $Date: 2001/05/27 21:09:11 $ */ -public final class ManagerServlet +public class ManagerServlet extends HttpServlet implements ContainerServlet { @@ -165,13 +165,13 @@ /** * The Context container associated with our web application. */ - private Context context = null; + protected Context context = null; /** * The debugging detail level for this servlet. */ - private int debug = 1; + protected int debug = 1; /** @@ -179,20 +179,20 @@ * along with the associated Contexts for web applications that we * are managing. */ - private Deployer deployer = null; + protected Deployer deployer = null; /** * The string manager for this package. */ - private static StringManager sm = - StringManager.getManager(Constants.Package); + protected static StringManager sm = + StringManager.getManager(Constants.Package); /** * The Wrapper container associated with this servlet. */ - private Wrapper wrapper = null; + protected Wrapper wrapper = null; // ----------------------------------------------- ContainerServlet Methods @@ -250,46 +250,46 @@ * @exception ServletException if a servlet-specified error occurs */ public void doGet(HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException { + HttpServletResponse response) + throws IOException, ServletException { - // Identify the request parameters that we need - String command = request.getPathInfo(); - if (command == null) - command = request.getServletPath(); - String path = request.getParameter("path"); - String war = request.getParameter("war"); - - // Prepare our output writer to generate the response message - response.setContentType("text/plain"); - PrintWriter writer = response.getWriter(); - - // Process the requested command - if (command == null) { - writer.println(sm.getString("managerServlet.noCommand")); - } 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("/remove")) { - remove(writer, path); + // Identify the request parameters that we need + String command = request.getPathInfo(); + if (command == null) + command = request.getServletPath(); + String path = request.getParameter("path"); + String war = request.getParameter("war"); + + // Prepare our output writer to generate the response message + response.setContentType("text/plain"); + PrintWriter writer = response.getWriter(); + + // Process the requested command + if (command == null) { + writer.println(sm.getString("managerServlet.noCommand")); + } 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("/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)); - } - - // Finish up the response - writer.flush(); - writer.close(); - + } else { + writer.println(sm.getString("managerServlet.unknownCommand", + command)); + } + + // Finish up the response + writer.flush(); + writer.close(); + } @@ -311,23 +311,23 @@ throw new UnavailableException (sm.getString("managerServlet.cannotInvoke")); - // Set our properties from the initialization parameters - String value = null; - try { - value = getServletConfig().getInitParameter("debug"); - debug = Integer.parseInt(value); - } catch (Throwable t) { - ; - } + // Set our properties from the initialization parameters + String value = null; + try { + value = getServletConfig().getInitParameter("debug"); + debug = Integer.parseInt(value); + } catch (Throwable t) { + ; + } // Log debugging messages as necessary - if (debug >= 1) { - log("init: Associated with Deployer '" + deployer.getName() + "'"); - } - + if (debug >= 1) { + log("init: Associated with Deployer '" + deployer.getName() + "'"); + } + } - + // -------------------------------------------------------- Private Methods @@ -341,12 +341,12 @@ * @param path Context path of the application to be installed * @param war URL of the web application archive to be installed */ - private void install(PrintWriter writer, String path, String war) { + protected void install(PrintWriter writer, String path, String war) { if (debug >= 1) - log("install: Installing web application at '" + path + - "' from '" + war + "'"); - + log("install: Installing web application at '" + path + + "' from '" + war + "'"); + if ((path == null) || (!path.startsWith("/") && path.equals(""))) { writer.println(sm.getString("managerServlet.invalidPath", path)); return; @@ -359,22 +359,22 @@ writer.println(sm.getString("managerServlet.invalidWar", war)); return; } - - try { - Context context = deployer.findDeployedApp(path); - if (context != null) { - writer.println(sm.getString("managerServlet.alreadyContext", - displayPath)); - return; - } - deployer.install(path, new URL(war)); - writer.println(sm.getString("managerServlet.installed", displayPath)); - } catch (Throwable t) { - getServletContext().log("ManagerServlet.install[" + displayPath + "]", t); - writer.println(sm.getString("managerServlet.exception", - t.toString())); - } - + + try { + Context context = deployer.findDeployedApp(path); + if (context != null) { + writer.println(sm.getString("managerServlet.alreadyContext", + displayPath)); + return; + } + deployer.install(path, new URL(war)); + writer.println(sm.getString("managerServlet.installed", displayPath)); + } catch (Throwable t) { + getServletContext().log("ManagerServlet.install[" + displayPath + "]", t); + writer.println(sm.getString("managerServlet.exception", + t.toString())); + } + } @@ -383,7 +383,7 @@ * * @param writer Writer to render to */ - private void list(PrintWriter writer) { + protected void list(PrintWriter writer) { if (debug >= 1) log("list: Listing contexts for virtual host '" + @@ -397,33 +397,33 @@ String displayPath = contextPaths[i]; if( displayPath.equals("") ) displayPath = "/"; - if (context != null ) { + if (context != null ) { if (context.getAvailable()) { writer.println(sm.getString("managerServlet.listitem", - displayPath, - "running", - "" + context.getManager().findSessions().length)); + displayPath, + "running", + "" + context.getManager().findSessions().length)); } else { writer.println(sm.getString("managerServlet.listitem", - displayPath, - "stopped", - "0")); + displayPath, + "stopped", + "0")); } } } } - - + + /** * Reload the web application at the specified context path. * * @param writer Writer to render to * @param path Context path of the application to be restarted */ - private void reload(PrintWriter writer, String path) { + protected void reload(PrintWriter writer, String path) { if (debug >= 1) - log("restart: Reloading web application at '" + path + "'"); + log("restart: Reloading web application at '" + path + "'"); if ((path == null) || (!path.startsWith("/") && path.equals(""))) { writer.println(sm.getString("managerServlet.invalidPath", path)); @@ -432,20 +432,20 @@ String displayPath = path; if( path.equals("/") ) path = ""; - + try { Context context = deployer.findDeployedApp(path); if (context == null) { writer.println(sm.getString("managerServlet.noContext", displayPath)); - return; + return; } context.reload(); writer.println(sm.getString("managerServlet.reloaded", displayPath)); - } catch (Throwable t) { - getServletContext().log("ManagerServlet.reload[" + displayPath + "]", t); - writer.println(sm.getString("managerServlet.exception", - t.toString())); - } + } catch (Throwable t) { + getServletContext().log("ManagerServlet.reload[" + displayPath + "]", t); + writer.println(sm.getString("managerServlet.exception", + t.toString())); + } } @@ -456,10 +456,10 @@ * @param writer Writer to render to * @param path Context path of the application to be removed */ - private void remove(PrintWriter writer, String path) { + protected void remove(PrintWriter writer, String path) { if (debug >= 1) - log("remove: Removing web application at '" + path + "'"); + log("remove: Removing web application at '" + path + "'"); if ((path == null) || (!path.startsWith("/") && path.equals(""))) { writer.println(sm.getString("managerServlet.invalidPath", path)); @@ -468,22 +468,22 @@ String displayPath = path; if( path.equals("/") ) path = ""; - + try { - Context context = deployer.findDeployedApp(path); - if (context == null) { - writer.println(sm.getString("managerServlet.noContext", displayPath)); - return; - } + Context context = deployer.findDeployedApp(path); + if (context == null) { + writer.println(sm.getString("managerServlet.noContext", displayPath)); + return; + } deployer.remove(path); - writer.println(sm.getString("managerServlet.removed", displayPath)); - } catch (Throwable t) { - getServletContext().log("ManagerServlet.remove[" + displayPath + "]", - t); - writer.println(sm.getString("managerServlet.exception", - t.toString())); - } - + writer.println(sm.getString("managerServlet.removed", displayPath)); + } catch (Throwable t) { + getServletContext().log("ManagerServlet.remove[" + displayPath + "]", + t); + writer.println(sm.getString("managerServlet.exception", + t.toString())); + } + } @@ -495,7 +495,7 @@ * @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) { + protected void sessions(PrintWriter writer, String path) { if (debug >= 1) log("sessions: Session information for web application at '" + path + "'"); @@ -514,11 +514,11 @@ return; } writer.println(sm.getString("managerServlet.sessions", displayPath)); - writer.println(sm.getString("managerServlet.sessiondefaultmax", - "" + context.getManager().getMaxInactiveInterval()/60)); - Session [] sessions = context.getManager().findSessions(); + writer.println(sm.getString("managerServlet.sessiondefaultmax", + "" + context.getManager().getMaxInactiveInterval()/60)); + Session [] sessions = context.getManager().findSessions(); int [] timeout = new int[60]; - int notimeout = 0; + int notimeout = 0; for (int i = 0; i < sessions.length; i++) { int time = sessions[i].getMaxInactiveInterval()/(10*60); if (time < 0) @@ -530,34 +530,36 @@ } if (timeout[0] > 0) writer.println(sm.getString("managerServlet.sessiontimeout", - "<10" + timeout[0])); + "<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])); + "" + (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])); + ">=" + timeout.length*10, + "" + timeout[timeout.length-1])); if (notimeout > 0) - writer.println(sm.getString("managerServlet.sessiontimeout", - "unlimited","" + notimeout)); + 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) { + protected void start(PrintWriter writer, String path) { if (debug >= 1) log("start: Starting web application at '" + path + "'"); @@ -569,7 +571,7 @@ String displayPath = path; if( path.equals("/") ) path = ""; - + try { Context context = deployer.findDeployedApp(path); if (context == null) { @@ -584,7 +586,7 @@ writer.println(sm.getString("managerServlet.exception", t.toString())); } - + } @@ -594,7 +596,7 @@ * @param writer Writer to render to * @param path Context path of the application to be stopped */ - private void stop(PrintWriter writer, String path) { + protected void stop(PrintWriter writer, String path) { if (debug >= 1) log("stop: Stopping web application at '" + path + "'"); 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/HTMLManagerServlet.java Index: HTMLManagerServlet.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/HTMLManagerServlet.java,v 1.1 2001/05/27 21:09:11 bip Exp $ * $Revision: 1.1 $ * $Date: 2001/05/27 21:09:11 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.catalina.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.Context; import org.apache.catalina.Globals; /** * Servlet that enables remote management of the web applications installed * within the same virtual host as this web application is. Normally, this * functionality will be protected by a security constraint in the web * application deployment descriptor. However, this requirement can be * relaxed during testing. * <p> * The difference between this <code>ManagerServlet</code> and this * Servlet is that this Servlet prints out a HTML interface which * makes it easier to administrate. * <p> * However if you use a software that parses the output of * <code>ManagerServlet</code you won't be able to upgrade * to this Servlet since the output are not in the * same format ar from <code>ManagerServlet</code> * * @author Bip Thelin * @version $Revision: 1.1 $, $Date: 2001/05/27 21:09:11 $ * @see ManagerServlet */ public final class HTMLManagerServlet extends ManagerServlet { // --------------------------------------------------------- Public Methods /** * Render a HTML list of the currently * active Contexts in our virtual host. * * @param writer Writer to render to */ public void list(PrintWriter writer) { if (debug >= 1) log("list: Listing contexts for virtual host '" + deployer.getName() + "'"); writer.print("<html>\n<head>\n<title>"); writer.print("Listed applications for virtual host "); writer.print(deployer.getName()+"</title>\n</head>\n"); writer.print("<body bgcolor=\"#FFFFFF\">\n"); writer.print("<form method=\"get\" action=\"install\">"); writer.print("<table cellspacing=\"0\""); writer.print("cellpadding=\"3\" align=\"center\">\n"); writer.print("<tr><td colspan=\"3\"><font size=\"+2\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<strong>Listed applications for virtual host "); writer.print(deployer.getName()+"</strong>\n</font></td>\n</tr>\n"); writer.print("<tr bgcolor=\"#CCCCCC\">\n"); writer.print("<td align=\"left\"><font size=\"+1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<strong>Path</strong></font>\n</td>"); writer.print("<td align=\"center\"><font size=\"+1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<strong>Status</strong></font></td>\n"); writer.print("<td align=\"right\"><font size=\"+1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<strong>Sessions</strong></font></td>\n"); writer.print("<td align=\"right\"><font size=\"+1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<strong>Reload</strong></font></td>\n"); writer.print("<td align=\"right\"><font size=\"+1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<strong>Remove</strong></font></td>\n</tr>\n"); String contextPaths[] = deployer.findDeployedApps(); 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 ) { writer.print("<tr bgcolor=\"#FFFFFF\">\n"); writer.print("<td align=\"left\"><font size=\"1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print(displayPath+"</font>\n</td>"); writer.print("<td align=\"center\"><font size=\"1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); if (context.getAvailable()) { writer.print("running / <a href=\"stop?path="+displayPath); writer.print("\">stop</a>"); } else { writer.print("<a href=\"start?path="+displayPath); writer.print("\">start</a> / stopped"); } writer.print("</font></td>\n"); writer.print("<td align=\"right\"><font size=\"1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<a href=\"sessions?path="+displayPath+"\">"); writer.print(context.getManager().findSessions().length); writer.print("</a></font></td>\n"); writer.print("<td align=\"right\"><font size=\"1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); if (context.getAvailable()) { writer.print("<a href=\"reload?path="+displayPath+"\">"); writer.print("Reload »"); writer.print("</a></font></td>\n"); } else { writer.print("-</font></td>"); } writer.print("<td align=\"right\"><font size=\"1\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print("<a href=\"remove?path="+displayPath+"\">"); writer.print("Remove »"); writer.print("</a></font></td>\n</tr>\n"); } } writer.print("<tr><td colspan=\"5\"> </td></tr>"); writer.print("<tr><td>"); writer.print("<font size=\"2\""); writer.print(" face=\"Arial, Helvetica, sans-serif\">"); writer.print("<b>Install a webapp</b></font></td>\n"); writer.print("<td><font size=\"2\" face=\"Arial, Helvetica, sans-serif\">"); writer.print("Path: </font>"); writer.print("<input type=\"text\" name=\"path\" size=\"25\"></td>"); writer.print("<td><font size=\"2\" face=\"Arial, Helvetica, sans-serif\">"); writer.print("War-URL: </font>"); writer.print("<input type=\"text\" name=\"war\" size=\"25\"></td>"); writer.print("<td colspan=\"2\">"); writer.print(" <input type=\"submit\" value=\"install\"></td></tr>\n"); writer.print("<tr><td colspan=\"5\" bgcolor=\"#CCCCCC\"><font size=\"-1\" "); writer.print(" face=\"Arial, Helvetica, sans-serif\">\n"); writer.print(Globals.SERVER_INFO+"</font></td>\n</tr>\n"); writer.print("</table>\n</form>\n</body>\n</html>"); } /** * Reload the web application at the specified context path. * * @param writer Writer to render to * @param path Context path of the application to be restarted */ protected void reload(PrintWriter writer, String path) { if (debug >= 1) log("restart: Reloading web application at '" + path + "'"); if ((path == null) || (!path.startsWith("/") && path.equals(""))) { writer.println(sm.getString("managerServlet.invalidPath", path)); list(writer); return; } String displayPath = path; if( path.equals("/") ) path = ""; try { Context context = deployer.findDeployedApp(path); if (context == null) { writer.println(sm.getString("managerServlet.noContext", displayPath)); list(writer); return; } context.reload(); list(writer); } catch (Throwable t) { getServletContext().log("ManagerServlet.reload[" + displayPath + "]", t); writer.println(sm.getString("managerServlet.exception", t.toString())); } } /** * Remove the web application at the specified context path. * * @param writer Writer to render to * @param path Context path of the application to be removed */ protected void remove(PrintWriter writer, String path) { if (debug >= 1) log("remove: Removing web application at '" + path + "'"); if ((path == null) || (!path.startsWith("/") && path.equals(""))) { writer.println(sm.getString("managerServlet.invalidPath", path)); list(writer); return; } String displayPath = path; if( path.equals("/") ) path = ""; try { Context context = deployer.findDeployedApp(path); if (context == null) { writer.println(sm.getString("managerServlet.noContext", displayPath)); list(writer); return; } deployer.remove(path); list(writer); } catch (Throwable t) { getServletContext().log("ManagerServlet.remove[" + 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 */ public 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)); list(writer); return; } String displayPath = path; if( path.equals("/") ) path = ""; try { Context context = deployer.findDeployedApp(path); if (context == null) { writer.println(sm.getString("managerServlet.noContext", displayPath)); list(writer); return; } deployer.start(path); list(writer); } 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 */ protected 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)); list(writer); return; } String displayPath = path; if( path.equals("/") ) path = ""; try { Context context = deployer.findDeployedApp(path); if (context == null) { writer.println(sm.getString("managerServlet.noContext", displayPath)); list(writer); return; } deployer.stop(path); list(writer); } catch (Throwable t) { getServletContext().log("ManagerServlet.stop[" + displayPath + "]", t); writer.println(sm.getString("managerServlet.exception", t.toString())); } } }