You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/11/19 13:55:27 UTC

svn commit: r1036828 - in /tomcat/trunk: java/org/apache/catalina/manager/HTMLManagerServlet.java java/org/apache/catalina/manager/ManagerServlet.java webapps/manager/WEB-INF/jsp/sessionDetail.jsp webapps/manager/WEB-INF/jsp/sessionsList.jsp

Author: markt
Date: Fri Nov 19 12:55:27 2010
New Revision: 1036828

URL: http://svn.apache.org/viewvc?rev=1036828&view=rev
Log:
Changes to Manager and HTML Manager to support parallel deployment

Modified:
    tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java
    tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java
    tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionDetail.jsp
    tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp

Modified: tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java?rev=1036828&r1=1036827&r2=1036828&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java Fri Nov 19 12:55:27 2010
@@ -125,6 +125,10 @@ public final class HTMLManagerServlet ex
         String command = request.getPathInfo();
 
         String path = request.getParameter("path");
+        ContextName cn = null;
+        if (path != null) {
+            cn = new ContextName(path, request.getParameter("version"));
+        }
 
         // Prepare our output writer to generate the response message
         response.setContentType("text/html; charset=" + Constants.CHARSET);
@@ -137,10 +141,10 @@ public final class HTMLManagerServlet ex
             // List always displayed - nothing to do here
         } else if (command.equals("/sessions")) {
             try {
-                doSessions(path, request, response, smClient);
+                doSessions(cn, request, response, smClient);
                 return;
             } catch (Exception e) {
-                log("HTMLManagerServlet.sessions[" + path + "]", e);
+                log("HTMLManagerServlet.sessions[" + cn + "]", e);
                 message = smClient.getString("managerServlet.exception",
                         e.toString());
             }
@@ -180,7 +184,16 @@ public final class HTMLManagerServlet ex
         String command = request.getPathInfo();
 
         String path = request.getParameter("path");
+        ContextName cn = null;
+        if (path != null) {
+            cn = new ContextName(path, request.getParameter("version"));
+        }
         String deployPath = request.getParameter("deployPath");
+        ContextName deployCn = null;
+        if (deployPath != null) {
+            deployCn = new ContextName(deployPath,
+                    request.getParameter("deployVersion")); 
+        }
         String deployConfig = request.getParameter("deployConfig");
         String deployWar = request.getParameter("deployWar");
 
@@ -195,18 +208,18 @@ public final class HTMLManagerServlet ex
         } else if (command.equals("/upload")) {
             message = upload(request, smClient);
         } else if (command.equals("/deploy")) {
-            message = deployInternal(deployConfig, deployPath, deployWar,
+            message = deployInternal(deployConfig, deployCn, deployWar,
                     smClient);
         } else if (command.equals("/reload")) {
-            message = reload(path, smClient);
+            message = reload(cn, smClient);
         } else if (command.equals("/undeploy")) {
-            message = undeploy(path, smClient);
+            message = undeploy(cn, smClient);
         } else if (command.equals("/expire")) {
-            message = expireSessions(path, request, smClient);
+            message = expireSessions(cn, request, smClient);
         } else if (command.equals("/start")) {
-            message = start(path, smClient);
+            message = start(cn, smClient);
         } else if (command.equals("/stop")) {
-            message = stop(path, smClient);
+            message = stop(cn, smClient);
         } else if (command.equals("/findleaks")) {
             message = findleaks(smClient);
         } else {
@@ -370,17 +383,17 @@ public final class HTMLManagerServlet ex
      * web application archive.
      *
      * @param config URL of the context configuration file to be deployed
-     * @param path Context path of the application to be deployed
+     * @param cn Name of the application to be deployed
      * @param war URL of the web application archive to be deployed
      * @return message String
      */
-    protected String deployInternal(String config, String path, String war,
+    protected String deployInternal(String config, ContextName cn, String war,
             StringManager smClient) {
 
         StringWriter stringWriter = new StringWriter();
         PrintWriter printWriter = new PrintWriter(stringWriter);
 
-        super.deploy(printWriter, config, path, war, false, smClient);
+        super.deploy(printWriter, config, cn, war, false, smClient);
 
         return stringWriter.toString();
     }
@@ -493,6 +506,15 @@ public final class HTMLManagerServlet ex
                     displayPath = "/";
                 }
 
+                StringBuilder tmp = new StringBuilder();
+                tmp.append("path=");
+                tmp.append(URL_ENCODER.encode(displayPath));
+                if (ctxt.getWebappVersion().length() > 0) {
+                    tmp.append("&version=");
+                    tmp.append(URL_ENCODER.encode(ctxt.getWebappVersion()));
+                }
+                String pathVersion = tmp.toString();
+
                 try {
                     isDeployed = isDeployed(contextName);
                 } catch (Exception e) {
@@ -512,9 +534,8 @@ public final class HTMLManagerServlet ex
                     args[2] = " ";
                 }
                 args[3] = new Boolean(ctxt.getAvailable());
-                args[4] = response.encodeURL
-                    (request.getContextPath() +
-                     "/html/sessions?path=" + URL_ENCODER.encode(displayPath));
+                args[4] = response.encodeURL(request.getContextPath() +
+                     "/html/sessions?" + pathVersion);
                 Manager manager = ctxt.getManager(); 
                 if (manager instanceof DistributedManager && showProxySessions) {
                     args[5] = new Integer(
@@ -531,26 +552,20 @@ public final class HTMLManagerServlet ex
                     (MessageFormat.format(APPS_ROW_DETAILS_SECTION, args));
 
                 args = new Object[14];
-                args[0] = response.encodeURL
-                    (request.getContextPath() +
-                     "/html/start?path=" + URL_ENCODER.encode(displayPath));
+                args[0] = response.encodeURL(request.getContextPath() +
+                        "/html/start?" + pathVersion);
                 args[1] = appsStart;
-                args[2] = response.encodeURL
-                    (request.getContextPath() +
-                     "/html/stop?path=" + URL_ENCODER.encode(displayPath));
+                args[2] = response.encodeURL(request.getContextPath() +
+                        "/html/stop?" + pathVersion);
                 args[3] = appsStop;
-                args[4] = response.encodeURL
-                    (request.getContextPath() +
-                     "/html/reload?path=" + URL_ENCODER.encode(displayPath));
+                args[4] = response.encodeURL(request.getContextPath() +
+                     "/html/reload?" + pathVersion);
                 args[5] = appsReload;
-                args[6] = response.encodeURL
-                    (request.getContextPath() +
-                     "/html/undeploy?path=" + URL_ENCODER.encode(displayPath));
+                args[6] = response.encodeURL(request.getContextPath() +
+                     "/html/undeploy?" + pathVersion);
                 args[7] = appsUndeploy;
-                
-                args[8] = response.encodeURL
-                    (request.getContextPath() +
-                     "/html/expire?path=" + URL_ENCODER.encode(displayPath));
+                args[8] = response.encodeURL(request.getContextPath() +
+                     "/html/expire?" + pathVersion);
                 args[9] = appsExpire;
                 args[10] = smClient.getString(
                         "htmlManagerServlet.expire.explain");
@@ -645,17 +660,18 @@ public final class HTMLManagerServlet ex
     /**
      * Reload the web application at the specified context path.
      *
-     * @see ManagerServlet#reload(PrintWriter, String, StringManager)
+     * @see ManagerServlet#reload(PrintWriter, ContextName, StringManager)
      *
-     * @param path Context path of the application to be restarted
+     * @param cn Name of the application to be restarted
+     * @param smClient  StringManager for the client's locale
      * @return message String
      */
-    protected String reload(String path, StringManager smClient) {
+    protected String reload(ContextName cn, StringManager smClient) {
 
         StringWriter stringWriter = new StringWriter();
         PrintWriter printWriter = new PrintWriter(stringWriter);
 
-        super.reload(printWriter, path, smClient);
+        super.reload(printWriter, cn, smClient);
 
         return stringWriter.toString();
     }
@@ -665,15 +681,16 @@ public final class HTMLManagerServlet ex
      *
      * @see ManagerServlet#undeploy(PrintWriter, String, StringManager)
      *
-     * @param path Context path of the application to be undeployed
+     * @param cn Name of the application to be undeployed
+     * @param smClient  StringManager for the client's locale
      * @return message String
      */
-    protected String undeploy(String path, StringManager smClient) {
+    protected String undeploy(ContextName cn, StringManager smClient) {
 
         StringWriter stringWriter = new StringWriter();
         PrintWriter printWriter = new PrintWriter(stringWriter);
 
-        super.undeploy(printWriter, path, smClient);
+        super.undeploy(printWriter, cn, smClient);
 
         return stringWriter.toString();
     }
@@ -683,16 +700,17 @@ public final class HTMLManagerServlet ex
      *
      * @see ManagerServlet#sessions(PrintWriter, String, int, StringManager)
      *
-     * @param path Context path of the application to list session information
+     * @param cn Name of the application to list session information
      * @param idle Expire all sessions with idle time ≥ idle for this context
+     * @param smClient  StringManager for the client's locale
      * @return message String
      */
-    protected String sessions(String path, int idle, StringManager smClient) {
+    protected String sessions(ContextName cn, int idle, StringManager smClient) {
 
         StringWriter stringWriter = new StringWriter();
         PrintWriter printWriter = new PrintWriter(stringWriter);
 
-        super.sessions(printWriter, path, idle, smClient);
+        super.sessions(printWriter, cn, idle, smClient);
 
         return stringWriter.toString();
     }
@@ -702,15 +720,16 @@ public final class HTMLManagerServlet ex
      *
      * @see ManagerServlet#start(PrintWriter, String, StringManager)
      *
-     * @param path Context path of the application to be started
+     * @param cn Name of the application to be started
+     * @param smClient  StringManager for the client's locale
      * @return message String
      */
-    protected String start(String path, StringManager smClient) {
+    protected String start(ContextName cn, StringManager smClient) {
 
         StringWriter stringWriter = new StringWriter();
         PrintWriter printWriter = new PrintWriter(stringWriter);
 
-        super.start(printWriter, path, smClient);
+        super.start(printWriter, cn, smClient);
 
         return stringWriter.toString();
     }
@@ -720,15 +739,16 @@ public final class HTMLManagerServlet ex
      *
      * @see ManagerServlet#stop(PrintWriter, String, StringManager)
      *
-     * @param path Context path of the application to be stopped
+     * @param cn Name of the application to be stopped
+     * @param smClient  StringManager for the client's locale
      * @return message String
      */
-    protected String stop(String path, StringManager smClient) {
+    protected String stop(ContextName cn, StringManager smClient) {
 
         StringWriter stringWriter = new StringWriter();
         PrintWriter printWriter = new PrintWriter(stringWriter);
 
-        super.stop(printWriter, path, smClient);
+        super.stop(printWriter, cn, smClient);
 
         return stringWriter.toString();
     }
@@ -737,6 +757,8 @@ public final class HTMLManagerServlet ex
      * Find potential memory leaks caused by web application reload.
      *
      * @see ManagerServlet#findleaks(PrintWriter, StringManager) 
+     * 
+     * @param smClient  StringManager for the client's locale
      *
      * @return message String
      */
@@ -787,10 +809,11 @@ public final class HTMLManagerServlet ex
      *
      * Extract the expiration request parameter
      * 
-     * @param path
+     * @param cn Name of the application from which to expire sessions
      * @param req
+     * @param smClient  StringManager for the client's locale
      */
-    protected String expireSessions(String path, HttpServletRequest req,
+    protected String expireSessions(ContextName cn, HttpServletRequest req,
             StringManager smClient) {
         int idle = -1;
         String idleParam = req.getParameter("idle");
@@ -801,58 +824,66 @@ public final class HTMLManagerServlet ex
                 log("Could not parse idle parameter to an int: " + idleParam);
             }
         }
-        return sessions(path, idle, smClient);
+        return sessions(cn, idle, smClient);
     }
 
     /**
      * 
      * @param req
      * @param resp
+     * @param smClient  StringManager for the client's locale
      * @throws ServletException
      * @throws IOException 
      */
-    protected void doSessions(String path, HttpServletRequest req,
+    protected void doSessions(ContextName cn, HttpServletRequest req,
             HttpServletResponse resp, StringManager smClient)
             throws ServletException, IOException {
-        req.setAttribute("path", path);
+        req.setAttribute("path", cn.getPath());
+        req.setAttribute("version", cn.getVersion());
         String action = req.getParameter("action");
         if (debug >= 1) {
-            log("sessions: Session action '" + action + "' for web application at '" + path + "'");
+            log("sessions: Session action '" + action +
+                    "' for web application '" + cn.getDisplayName() + "'");
         }
         if ("sessionDetail".equals(action)) {
             String sessionId = req.getParameter("sessionId");
-            displaySessionDetailPage(req, resp, path, sessionId, smClient);
+            displaySessionDetailPage(req, resp, cn, sessionId, smClient);
             return;
         } else if ("invalidateSessions".equals(action)) {
             String[] sessionIds = req.getParameterValues("sessionIds");
-            int i = invalidateSessions(path, sessionIds, smClient);
+            int i = invalidateSessions(cn, sessionIds, smClient);
             req.setAttribute(APPLICATION_MESSAGE, "" + i + " sessions invalidated.");
         } else if ("removeSessionAttribute".equals(action)) {
             String sessionId = req.getParameter("sessionId");
             String name = req.getParameter("attributeName");
             boolean removed =
-                removeSessionAttribute(path, sessionId, name, smClient);
+                removeSessionAttribute(cn, sessionId, name, smClient);
             String outMessage = removed ? "Session attribute '" + name + "' removed." : "Session did not contain any attribute named '" + name + "'";
             req.setAttribute(APPLICATION_MESSAGE, outMessage);
-            resp.sendRedirect(resp.encodeRedirectURL(req.getRequestURL().append("?path=").append(path).append("&action=sessionDetail&sessionId=").append(sessionId).toString()));
+            resp.sendRedirect(resp.encodeRedirectURL(req.getRequestURL().append("?path=").append(cn.getPath()).append("&action=sessionDetail&sessionId=").append(sessionId).toString()));
             return;
         } // else
-        displaySessionsListPage(path, req, resp, smClient);
+        displaySessionsListPage(cn, req, resp, smClient);
     }
 
-    protected List<Session> getSessionsForPath(String path,
+    protected List<Session> getSessionsForName(ContextName cn,
             StringManager smClient) {
-        if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
+        if ((cn == null) || (!cn.getPath().startsWith("/") &&
+                cn.getPath().equals(""))) {
+            String path = null;
+            if (cn != null) {
+                path = cn.getPath();
+            }
             throw new IllegalArgumentException(smClient.getString(
-                    "managerServlet.invalidPath", RequestUtil.filter(path)));
+                    "managerServlet.invalidPath",
+                    RequestUtil.filter(path)));
         }
-        String searchPath = path;
-        if( path.equals("/") )
-            searchPath = "";
-        Context ctxt = (Context) host.findChild(searchPath);
+
+        Context ctxt = (Context) host.findChild(cn.getName());
         if (null == ctxt) {
             throw new IllegalArgumentException(smClient.getString(
-                    "managerServlet.noContext", RequestUtil.filter(path)));
+                    "managerServlet.noContext",
+                    RequestUtil.filter(cn.getDisplayName())));
         }
         Manager manager = ctxt.getManager();
         List<Session> sessions = new ArrayList<Session>();
@@ -872,19 +903,24 @@ public final class HTMLManagerServlet ex
         }
         return sessions;
     }
-    protected Session getSessionForPathAndId(String path, String id,
+    protected Session getSessionForNameAndId(ContextName cn, String id,
             StringManager smClient) throws IOException {
-        if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
+        if ((cn == null) || (!cn.getPath().startsWith("/") &&
+                cn.getPath().equals(""))) {
+            String path = null;
+            if (cn != null) {
+                path = cn.getPath();
+            }
             throw new IllegalArgumentException(smClient.getString(
-                    "managerServlet.invalidPath", RequestUtil.filter(path)));
+                    "managerServlet.invalidPath",
+                    RequestUtil.filter(path)));
         }
-        String searchPath = path;
-        if( path.equals("/") )
-            searchPath = "";
-        Context ctxt = (Context) host.findChild(searchPath);
+        
+        Context ctxt = (Context) host.findChild(cn.getName());
         if (null == ctxt) {
             throw new IllegalArgumentException(smClient.getString(
-                    "managerServlet.noContext", RequestUtil.filter(path)));
+                    "managerServlet.noContext",
+                    RequestUtil.filter(cn.getDisplayName())));
         }
         Session session = ctxt.getManager().findSession(id);
         return session;
@@ -892,15 +928,18 @@ public final class HTMLManagerServlet ex
 
     /**
      * 
+     * @param cn Name of the application for which the sessions will be listed
      * @param req
      * @param resp
+     * @param smClient  StringManager for the client's locale
      * @throws ServletException
      * @throws IOException
      */
-    protected void displaySessionsListPage(String path, HttpServletRequest req,
-            HttpServletResponse resp, StringManager smClient)
+    protected void displaySessionsListPage(ContextName cn,
+            HttpServletRequest req, HttpServletResponse resp,
+            StringManager smClient)
             throws ServletException, IOException {
-        List<Session> sessions = getSessionsForPath(path, smClient);
+        List<Session> sessions = getSessionsForName(cn, smClient);
         String sortBy = req.getParameter("sort");
         String orderBy = null;
         if (null != sortBy && !"".equals(sortBy.trim())) {
@@ -940,13 +979,14 @@ public final class HTMLManagerServlet ex
      * 
      * @param req
      * @param resp
+     * @param smClient  StringManager for the client's locale
      * @throws ServletException
      * @throws IOException
      */
     protected void displaySessionDetailPage(HttpServletRequest req,
-            HttpServletResponse resp, String path, String sessionId,
+            HttpServletResponse resp, ContextName cn, String sessionId,
             StringManager smClient) throws ServletException, IOException {
-        Session session = getSessionForPathAndId(path, sessionId, smClient);
+        Session session = getSessionForNameAndId(cn, sessionId, smClient);
         //strong>NOTE</strong> - This header will be overridden
         // automatically if a <code>RequestDispatcher.forward()</code> call is
         // ultimately invoked.
@@ -959,11 +999,14 @@ public final class HTMLManagerServlet ex
 
     /**
      * Invalidate HttpSessions
+     * @param cn Name of the application for which sessions are to be
+     *           invalidated
      * @param sessionIds
+     * @param smClient  StringManager for the client's locale
      * @return number of invalidated sessions
      * @throws IOException 
      */
-    protected int invalidateSessions(String path, String[] sessionIds,
+    protected int invalidateSessions(ContextName cn, String[] sessionIds,
             StringManager smClient) throws IOException {
         if (null == sessionIds) {
             return 0;
@@ -971,7 +1014,8 @@ public final class HTMLManagerServlet ex
         int nbAffectedSessions = 0;
         for (int i = 0; i < sessionIds.length; ++i) {
             String sessionId = sessionIds[i];
-            HttpSession session = getSessionForPathAndId(path, sessionId, smClient).getSession();
+            HttpSession session =
+                getSessionForNameAndId(cn, sessionId, smClient).getSession();
             if (null == session) {
                 // Shouldn't happen, but let's play nice...
                 if (debug >= 1) {
@@ -996,14 +1040,18 @@ public final class HTMLManagerServlet ex
 
     /**
      * Removes an attribute from an HttpSession
+     * @param cn Name of the application hosting the session from which the
+     *           attribute is to be removed
      * @param sessionId
      * @param attributeName
+     * @param smClient  StringManager for the client's locale
      * @return true if there was an attribute removed, false otherwise
      * @throws IOException 
      */
-    protected boolean removeSessionAttribute(String path, String sessionId,
+    protected boolean removeSessionAttribute(ContextName cn, String sessionId,
             String attributeName, StringManager smClient) throws IOException {
-        HttpSession session = getSessionForPathAndId(path, sessionId, smClient).getSession();
+        HttpSession session =
+            getSessionForNameAndId(cn, sessionId, smClient).getSession();
         if (null == session) {
             // Shouldn't happen, but let's play nice...
             if (debug >= 1) {

Modified: tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java?rev=1036828&r1=1036827&r2=1036828&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java Fri Nov 19 12:55:27 2010
@@ -159,8 +159,9 @@ import org.apache.tomcat.util.res.String
  * @version $Id$
  */
 
-public class ManagerServlet
-    extends HttpServlet implements ContainerServlet {
+public class ManagerServlet extends HttpServlet implements ContainerServlet {
+
+    private static final long serialVersionUID = 1L;
 
 
     // ----------------------------------------------------- Instance Variables
@@ -254,6 +255,7 @@ public class ManagerServlet
     /**
      * Return the Wrapper with which we are associated.
      */
+    @Override
     public Wrapper getWrapper() {
 
         return (this.wrapper);
@@ -266,6 +268,7 @@ public class ManagerServlet
      *
      * @param wrapper The new wrapper
      */
+    @Override
     public void setWrapper(Wrapper wrapper) {
 
         this.wrapper = wrapper;
@@ -327,6 +330,10 @@ public class ManagerServlet
             command = request.getServletPath();
         String config = request.getParameter("config");
         String path = request.getParameter("path");
+        ContextName cn = null;
+        if (path != null) {
+            cn = new ContextName(path, request.getParameter("version"));
+        }
         String type = request.getParameter("type");
         String war = request.getParameter("war");
         String tag = request.getParameter("tag");
@@ -345,14 +352,14 @@ public class ManagerServlet
             writer.println(smClient.getString("managerServlet.noCommand"));
         } else if (command.equals("/deploy")) {
             if (war != null || config != null) {
-                deploy(writer, config, path, war, update, smClient);
+                deploy(writer, config, cn, war, update, smClient);
             } else {
-                deploy(writer, path, tag, smClient);
+                deploy(writer, cn, tag, smClient);
             }
         } else if (command.equals("/list")) {
             list(writer, smClient);
         } else if (command.equals("/reload")) {
-            reload(writer, path, smClient);
+            reload(writer, cn, smClient);
         } else if (command.equals("/resources")) {
             resources(writer, type, smClient);
         } else if (command.equals("/roles")) {
@@ -362,15 +369,15 @@ public class ManagerServlet
         } else if (command.equals("/serverinfo")) {
             serverinfo(writer, smClient);
         } else if (command.equals("/sessions")) {
-            expireSessions(writer, path, request, smClient);
+            expireSessions(writer, cn, request, smClient);
         } else if (command.equals("/expire")) {
-            expireSessions(writer, path, request, smClient);
+            expireSessions(writer, cn, request, smClient);
         } else if (command.equals("/start")) {
-            start(writer, path, smClient);
+            start(writer, cn, smClient);
         } else if (command.equals("/stop")) {
-            stop(writer, path, smClient);
+            stop(writer, cn, smClient);
         } else if (command.equals("/undeploy")) {
-            undeploy(writer, path, smClient);
+            undeploy(writer, cn, smClient);
         } else if (command.equals("/findleaks")) {
             findleaks(writer, smClient);
         } else {
@@ -406,6 +413,10 @@ public class ManagerServlet
         if (command == null)
             command = request.getServletPath();
         String path = request.getParameter("path");
+        ContextName cn = null;
+        if (path != null) {
+            cn = new ContextName(path, request.getParameter("version"));
+        }
         String tag = request.getParameter("tag");
         boolean update = false;
         if ((request.getParameter("update") != null) 
@@ -421,7 +432,7 @@ public class ManagerServlet
         if (command == null) {
             writer.println(smClient.getString("managerServlet.noCommand"));
         } else if (command.equals("/deploy")) {
-            deploy(writer, path, tag, update, request, smClient);
+            deploy(writer, cn, tag, update, request, smClient);
         } else {
             writer.println(smClient.getString("managerServlet.unknownCommand",
                     command));
@@ -586,36 +597,32 @@ public class ManagerServlet
      * at the specified context path.
      *
      * @param writer Writer to render results to
-     * @param path Context path of the application to be installed
+     * @param cn Name of the application to be installed
      * @param tag Tag to be associated with the webapp
      * @param request Servlet request we are processing
      */
     protected synchronized void deploy
-        (PrintWriter writer, String path,
+        (PrintWriter writer, ContextName cn,
          String tag, boolean update, HttpServletRequest request,
          StringManager smClient) {
 
         if (debug >= 1) {
-            log("deploy: Deploying web application at '" + path + "'");
+            log("deploy: Deploying web application '" + cn + "'");
         }
 
         // Validate the requested context path
-        if ((path == null) || path.length() == 0 || !path.startsWith("/")) {
-            writer.println(smClient.getString(
-                    "managerServlet.invalidPath", path));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        
-        ContextName cn = new ContextName(path, null);
         String name = cn.getName();
         String baseName = cn.getBaseName();
+        String displayPath = cn.getDisplayName();
 
         // Check if app already exists, or undeploy it if updating
         Context context = (Context) host.findChild(name);
         if (update) {
             if (context != null) {
-                undeploy(writer, displayPath, smClient);
+                undeploy(writer, cn, smClient);
             }
             context = (Context) host.findChild(name);
         }
@@ -685,21 +692,19 @@ public class ManagerServlet
      *
      * @param writer Writer to render results to
      * @param tag Revision tag to deploy from
-     * @param path Context path of the application to be installed
+     * @param cn Name of the application to be installed
      */
-    protected void deploy(PrintWriter writer, String path, String tag,
+    protected void deploy(PrintWriter writer, ContextName cn, String tag,
             StringManager smClient) {
 
         // Validate the requested context path
-        if ((path == null) || path.length() == 0 || !path.startsWith("/")) {
-            writer.println(smClient.getString(
-                    "managerServlet.invalidPath", path));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        ContextName cn = new ContextName(path, null);
+
         String baseName = cn.getBaseName();
         String name = cn.getName();
+        String displayPath = cn.getDisplayName();
         
         // Calculate the base path
         File deployedPath = versioned;
@@ -713,7 +718,7 @@ public class ManagerServlet
         // Check if app already exists, or undeploy it if updating
         Context context = (Context) host.findChild(name);
         if (context != null) {
-            undeploy(writer, displayPath, smClient);
+            undeploy(writer, cn, smClient);
         }
 
         // Copy WAR to appBase
@@ -754,12 +759,12 @@ public class ManagerServlet
      *
      * @param writer Writer to render results to
      * @param config URL of the context configuration file to be installed
-     * @param path Context path of the application to be installed
+     * @param cn Name of the application to be installed
      * @param war URL of the web application archive to be installed
      * @param update true to override any existing webapp on the path
      */
-    protected void deploy(PrintWriter writer, String config,
-            String path, String war, boolean update,  StringManager smClient) {
+    protected void deploy(PrintWriter writer, String config, ContextName cn,
+            String war, boolean update,  StringManager smClient) {
         
         if (config != null && config.length() == 0) {
             config = null;
@@ -778,8 +783,8 @@ public class ManagerServlet
                             config + "'");
                 }
             } else {
-                if (path != null && path.length() > 0) {
-                    log("install: Installing web application at '" + path +
+                if (cn != null) {
+                    log("install: Installing web application '" + cn +
                             "' from '" + war + "'");
                 } else {
                     log("install: Installing web application from '" + war + "'");
@@ -787,21 +792,18 @@ public class ManagerServlet
             }
         }
         
-        if (path == null || path.length() == 0 || !path.startsWith("/")) {
-            writer.println(smClient.getString("managerServlet.invalidPath",
-                    RequestUtil.filter(path)));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        ContextName cn = new ContextName(path, null);
         String name = cn.getName();
         String baseName = cn.getBaseName();
+        String displayPath = cn.getDisplayName();
         
         // Check if app already exists, or undeploy it if updating
         Context context = (Context) host.findChild(name);
         if (update) {
             if (context != null) {
-                undeploy(writer, displayPath, smClient);
+                undeploy(writer, cn, smClient);
             }
             context = (Context) host.findChild(name);
         }
@@ -906,28 +908,23 @@ public class ManagerServlet
      * 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
+     * @param cn Name of the application to be restarted
      */
-    protected void reload(PrintWriter writer, String path,
+    protected void reload(PrintWriter writer, ContextName cn,
             StringManager smClient) {
 
         if (debug >= 1)
-            log("restart: Reloading web application at '" + path + "'");
+            log("restart: Reloading web application '" + cn + "'");
 
-        if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
-            writer.println(smClient.getString("managerServlet.invalidPath",
-                    RequestUtil.filter(path)));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        if( path.equals("/") )
-            path = "";
 
         try {
-            Context context = (Context) host.findChild(path);
+            Context context = (Context) host.findChild(cn.getName());
             if (context == null) {
                 writer.println(smClient.getString("managerServlet.noContext",
-                        RequestUtil.filter(displayPath)));
+                        RequestUtil.filter(cn.getDisplayName())));
                 return;
             }
             // It isn't possible for the manager to reload itself
@@ -936,11 +933,11 @@ public class ManagerServlet
                 return;
             }
             context.reload();
-            writer.println
-                (smClient.getString("managerServlet.reloaded", displayPath));
+            writer.println(smClient.getString("managerServlet.reloaded",
+                    cn.getDisplayName()));
         } catch (Throwable t) {
             ExceptionUtils.handleThrowable(t);
-            log("ManagerServlet.reload[" + displayPath + "]", t);
+            log("ManagerServlet.reload[" + cn.getDisplayName() + "]", t);
             writer.println(smClient.getString("managerServlet.exception",
                     t.toString()));
         }
@@ -1124,28 +1121,26 @@ public class ManagerServlet
      * of sessions for each 10 minute interval up to 10 hours.
      *
      * @param writer Writer to render to
-     * @param path Context path of the application to list session information for
+     * @param cn Name of the application to list session information for
      * @param idle Expire all sessions with idle time &gt; idle for this context
      */
-    protected void sessions(PrintWriter writer, String path, int idle,
+    protected void sessions(PrintWriter writer, ContextName cn, int idle,
             StringManager smClient) {
 
         if (debug >= 1) {
-            log("sessions: Session information for web application at '" + path + "'");
+            log("sessions: Session information for web application '" + cn + "'");
             if (idle >= 0)
-                log("sessions: Session expiration for " + idle + " minutes '" + path + "'");
+                log("sessions: Session expiration for " + idle + " minutes '" + cn + "'");
         }
 
-        if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
-            writer.println(smClient.getString("managerServlet.invalidPath",
-                    RequestUtil.filter(path)));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        if( path.equals("/") )
-            path = "";
+
+        String displayPath = cn.getDisplayName();
+
         try {
-            Context context = (Context) host.findChild(path);
+            Context context = (Context) host.findChild(cn.getName());
             if (context == null) {
                 writer.println(smClient.getString("managerServlet.noContext",
                         RequestUtil.filter(displayPath)));
@@ -1232,11 +1227,11 @@ public class ManagerServlet
      * of sessions for each 10 minute interval up to 10 hours.
      *
      * @param writer Writer to render to
-     * @param path Context path of the application to list session information for
+     * @param cn Name of the application to list session information for
      */
-    protected void sessions(PrintWriter writer, String path,
+    protected void sessions(PrintWriter writer, ContextName cn,
             StringManager smClient) {
-        sessions(writer, path, -1, smClient);
+        sessions(writer, cn, -1, smClient);
     }
 
 
@@ -1244,10 +1239,10 @@ public class ManagerServlet
      *
      * Extract the expiration request parameter
      *
-     * @param path
+     * @param cn
      * @param req
      */
-    protected void expireSessions(PrintWriter writer, String path,
+    protected void expireSessions(PrintWriter writer, ContextName cn,
             HttpServletRequest req, StringManager smClient) {
         int idle = -1;
         String idleParam = req.getParameter("idle");
@@ -1258,32 +1253,29 @@ public class ManagerServlet
                 log("Could not parse idle parameter to an int: " + idleParam);
             }
         }
-        sessions(writer, path, idle, smClient);
+        sessions(writer, cn, idle, smClient);
     }
 
     /**
      * 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
+     * @param cn Name of the application to be started
      */
-    protected void start(PrintWriter writer, String path,
+    protected void start(PrintWriter writer, ContextName cn,
             StringManager smClient) {
 
         if (debug >= 1)
-            log("start: Starting web application at '" + path + "'");
+            log("start: Starting web application '" + cn + "'");
 
-        if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
-            writer.println(smClient.getString("managerServlet.invalidPath",
-                    RequestUtil.filter(path)));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        if( path.equals("/") )
-            path = "";
+
+        String displayPath = cn.getDisplayName();
 
         try {
-            Context context = (Context) host.findChild(path);
+            Context context = (Context) host.findChild(cn.getName());
             if (context == null) {
                 writer.println(smClient.getString("managerServlet.noContext", 
                         RequestUtil.filter(displayPath)));
@@ -1313,25 +1305,22 @@ public class ManagerServlet
      * 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
+     * @param cn Name of the application to be stopped
      */
-    protected void stop(PrintWriter writer, String path,
+    protected void stop(PrintWriter writer, ContextName cn,
             StringManager smClient) {
 
         if (debug >= 1)
-            log("stop: Stopping web application at '" + path + "'");
+            log("stop: Stopping web application '" + cn + "'");
 
-        if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
-            writer.println(smClient.getString("managerServlet.invalidPath",
-                    RequestUtil.filter(path)));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        if( path.equals("/") )
-            path = "";
+
+        String displayPath = cn.getDisplayName();
 
         try {
-            Context context = (Context) host.findChild(path);
+            Context context = (Context) host.findChild(cn.getName());
             if (context == null) {
                 writer.println(smClient.getString("managerServlet.noContext",
                         RequestUtil.filter(displayPath)));
@@ -1359,23 +1348,21 @@ public class ManagerServlet
      * Undeploy the web application at the specified context path.
      *
      * @param writer Writer to render to
-     * @param path Context path of the application to be removed
+     * @param cn Name of the application to be removed
      */
-    protected void undeploy(PrintWriter writer, String path,
+    protected void undeploy(PrintWriter writer, ContextName cn,
             StringManager smClient) {
 
         if (debug >= 1)
-            log("undeploy: Undeploying web application at '" + path + "'");
+            log("undeploy: Undeploying web application at '" + cn + "'");
 
-        if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
-            writer.println(smClient.getString("managerServlet.invalidPath",
-                    RequestUtil.filter(path)));
+        if (!validateContextName(cn, writer, smClient)) {
             return;
         }
-        String displayPath = path;
-        ContextName cn = new ContextName(path, null);
+
         String name = cn.getName();
         String baseName = cn.getBaseName();
+        String displayPath = cn.getDisplayName();
 
         try {
 
@@ -1613,6 +1600,24 @@ public class ManagerServlet
     }
 
 
+    protected static boolean validateContextName(ContextName cn,
+            PrintWriter writer, StringManager sm) {
+        
+        // ContextName should be non-null with a path that is empty or starts
+        // with /
+        if (cn != null &&
+                (cn.getPath().startsWith("/") || cn.getPath().equals(""))) {
+            return true;
+        }
+        
+        String path = null;
+        if (cn != null) {
+            path = RequestUtil.filter(cn.getPath());
+        }
+        writer.println(sm.getString("managerServlet.invalidPath", path));
+        return false;
+    }
+
     /**
      * Copy the specified file or directory to the destination.
      *
@@ -1680,12 +1685,14 @@ public class ManagerServlet
                         try {
                             is.close();
                         } catch (IOException e) {
+                            // Ignore
                         }
                     }
                     if (os != null) {
                         try {
                             os.close();
                         } catch (IOException e) {
+                            // Ignore
                         }
                     }
                 }

Modified: tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionDetail.jsp
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionDetail.jsp?rev=1036828&r1=1036827&r2=1036828&view=diff
==============================================================================
--- tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionDetail.jsp (original)
+++ tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionDetail.jsp Fri Nov 19 12:55:27 2010
@@ -20,6 +20,7 @@
 <%@page import="javax.servlet.http.HttpSession" %>
 <%@page import="org.apache.catalina.Session" %>
 <%@page import="org.apache.catalina.manager.JspHelper" %>
+<%@page import="org.apache.catalina.util.ContextName" %>
 <!DOCTYPE html 
      PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
@@ -28,11 +29,14 @@
 
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <% String path = (String) request.getAttribute("path");
+   String version = (String) request.getAttribute("version");
+   ContextName cn = new ContextName(path, version);
    Session currentSession = (Session)request.getAttribute("currentSession");
    HttpSession currentHttpSession = currentSession.getSession();
    String currentSessionId = currentSession.getId();
    String submitUrl = response.encodeURL(((HttpServletRequest)
-           pageContext.getRequest()).getRequestURL().toString());
+           pageContext.getRequest()).getRequestURI() + "?path=" + path +
+           "&version=" + version);
 %>
 <head>
     <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
@@ -89,7 +93,6 @@
 
 <form method="post" action="<%= submitUrl %>">
   <div>
-    <input type="hidden" name="path" value="<%= path %>" />
     <input type="hidden" name="sessionId" value="<%= currentSessionId %>" />
     <input type="hidden" name="action" value="sessionDetail" />
     <input type="submit" value="Refresh" />
@@ -131,7 +134,6 @@
             <td align="center">
                 <form method="post" action="<%= submitUrl %>">
                     <div>
-                        <input type="hidden" name="path" value="<%= path %>" />
                         <input type="hidden" name="action" value="removeSessionAttribute" />
                         <input type="hidden" name="sessionId" value="<%= currentSessionId %>" />
                         <input type="hidden" name="attributeName" value="<%= attributeName %>" />

Modified: tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp?rev=1036828&r1=1036827&r2=1036828&view=diff
==============================================================================
--- tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp (original)
+++ tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp Fri Nov 19 12:55:27 2010
@@ -21,6 +21,7 @@
 <%@page import="org.apache.catalina.manager.JspHelper" %>
 <%@page import="org.apache.catalina.Session" %>
 <%@page import="org.apache.catalina.ha.session.DeltaSession" %>
+<%@page import="org.apache.catalina.util.ContextName" %>
 <!DOCTYPE html 
      PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -28,8 +29,11 @@
 
 <%@page import="org.apache.catalina.manager.DummyProxySession"%><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <% String path = (String) request.getAttribute("path");
+   String version = (String) request.getAttribute("version");
+   ContextName cn = new ContextName(path, version);
    String submitUrl = response.encodeURL(((HttpServletRequest)
-           pageContext.getRequest()).getRequestURI() + "?path=" + path);
+           pageContext.getRequest()).getRequestURI() + "?path=" + path +
+           "&version=" + version);
    Collection activeSessions = (Collection) request.getAttribute("activeSessions");
 %>
 <head>
@@ -41,10 +45,10 @@
     <meta name="author" content="Cedrik LIME"/>
     <meta name="copyright" content="copyright 2005-2010 the Apache Software Foundation"/>
     <meta name="robots" content="noindex,nofollow,noarchive"/>
-    <title>Sessions Administration for <%= path %></title>
+    <title>Sessions Administration for <%= cn.getDisplayName() %></title>
 </head>
 <body>
-<h1>Sessions Administration for <%= path %></h1>
+<h1>Sessions Administration for <%= cn.getDisplayName() %></h1>
 
 <p>Tips:</p>
 <ul>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org