Author: markt
Date: Thu Jul 29 20:53:26 2010
New Revision: 980567

URL: http://svn.apache.org/viewvc?rev=980567&view=rev
Log:
Add optional support to the HTML Manager application to display Proxy sessions. 
It is disabled by default.

Added:
    tomcat/trunk/java/org/apache/catalina/manager/DummyProxySession.java   
(with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java
    tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java
    tomcat/trunk/java/org/apache/catalina/manager/JspHelper.java
    tomcat/trunk/java/org/apache/catalina/manager/util/SessionUtils.java
    tomcat/trunk/webapps/docs/changelog.xml
    tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp
    tomcat/trunk/webapps/manager/WEB-INF/web.xml

Modified: tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java?rev=980567&r1=980566&r2=980567&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/BackupManager.java Thu Jul 
29 20:53:26 2010
@@ -16,7 +16,9 @@
  */
 package org.apache.catalina.ha.session;
 
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
 
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleState;
@@ -214,11 +216,6 @@ public class BackupManager extends Clust
         this.distributable = dist;
     }
 
-    @Override
-    public boolean getDistributable() {
-        return distributable;
-    }
-
     public void setName(String name) {
         this.name = name;
     }
@@ -273,4 +270,16 @@ public class BackupManager extends Clust
         }
         return sb.toString();
     }
+    
+    public Set<String> getSessionIdsFull() {
+        Set<String> sessionIds = new HashSet<String>();
+        LazyReplicatedMap map = (LazyReplicatedMap)sessions;
+        @SuppressWarnings("unchecked") // sessions is of type Map<String, 
Session>
+        Iterator<String> keys = map.keySetFull().iterator();
+        while (keys.hasNext()) {
+            sessionIds.add(keys.next());
+        }
+        return sessionIds;
+    }
+
 }

Added: tomcat/trunk/java/org/apache/catalina/manager/DummyProxySession.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/DummyProxySession.java?rev=980567&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/DummyProxySession.java (added)
+++ tomcat/trunk/java/org/apache/catalina/manager/DummyProxySession.java Thu 
Jul 29 20:53:26 2010
@@ -0,0 +1,179 @@
+package org.apache.catalina.manager;
+
+import java.security.Principal;
+import java.util.Iterator;
+
+import javax.servlet.http.HttpSession;
+
+import org.apache.catalina.Manager;
+import org.apache.catalina.Session;
+import org.apache.catalina.SessionListener;
+
+public class DummyProxySession implements Session {
+
+    private String sessionId;
+    
+    public DummyProxySession(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    @Override
+    public void access() {
+        // NOOP
+    }
+
+    @Override
+    public void addSessionListener(SessionListener listener) {
+        // NOOP
+    }
+
+    @Override
+    public void endAccess() {
+        // NOOP
+    }
+
+    @Override
+    public void expire() {
+        // NOOP
+    }
+
+    @Override
+    public String getAuthType() {
+        return null;
+    }
+
+    @Override
+    public long getCreationTime() {
+        return 0;
+    }
+
+    @Override
+    public String getId() {
+        return sessionId;
+    }
+
+    @Override
+    public String getIdInternal() {
+        return sessionId;
+    }
+
+    @Override
+    public String getInfo() {
+        return null;
+    }
+
+    @Override
+    public long getLastAccessedTime() {
+        return 0;
+    }
+
+    @Override
+    public long getLastAccessedTimeInternal() {
+        return 0;
+    }
+
+    @Override
+    public Manager getManager() {
+        return null;
+    }
+
+    @Override
+    public int getMaxInactiveInterval() {
+        return 0;
+    }
+
+    @Override
+    public Object getNote(String name) {
+        return null;
+    }
+
+    @Override
+    public Iterator<String> getNoteNames() {
+        return null;
+    }
+
+    @Override
+    public Principal getPrincipal() {
+        return null;
+    }
+
+    @Override
+    public HttpSession getSession() {
+        return null;
+    }
+
+    @Override
+    public long getThisAccessedTime() {
+        return 0;
+    }
+
+    @Override
+    public long getThisAccessedTimeInternal() {
+        return 0;
+    }
+
+    @Override
+    public boolean isValid() {
+        return false;
+    }
+
+    @Override
+    public void recycle() {
+        // NOOP
+    }
+
+    @Override
+    public void removeNote(String name) {
+        // NOOP
+    }
+
+    @Override
+    public void removeSessionListener(SessionListener listener) {
+        // NOOP
+    }
+
+    @Override
+    public void setAuthType(String authType) {
+        // NOOP
+    }
+
+    @Override
+    public void setCreationTime(long time) {
+        // NOOP
+    }
+
+    @Override
+    public void setId(String id) {
+        this.sessionId = id;
+    }
+
+    @Override
+    public void setManager(Manager manager) {
+        // NOOP
+    }
+
+    @Override
+    public void setMaxInactiveInterval(int interval) {
+        // NOOP
+    }
+
+    @Override
+    public void setNew(boolean isNew) {
+        // NOOP
+    }
+
+    @Override
+    public void setNote(String name, Object value) {
+        // NOOP
+    }
+
+    @Override
+    public void setPrincipal(Principal principal) {
+        // NOOP
+    }
+
+    @Override
+    public void setValid(boolean isValid) {
+        // NOOP
+    }
+}

Propchange: tomcat/trunk/java/org/apache/catalina/manager/DummyProxySession.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=980567&r1=980566&r2=980567&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java Thu 
Jul 29 20:53:26 2010
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -33,6 +34,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Random;
+import java.util.Set;
 import java.util.TreeMap;
 
 import javax.servlet.ServletException;
@@ -45,12 +47,14 @@ import org.apache.catalina.Container;
 import org.apache.catalina.Context;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
+import org.apache.catalina.ha.session.BackupManager;
 import org.apache.catalina.manager.util.BaseSessionComparator;
 import org.apache.catalina.manager.util.ReverseComparator;
 import org.apache.catalina.manager.util.SessionUtils;
 import org.apache.catalina.util.RequestUtil;
 import org.apache.catalina.util.ServerInfo;
 import org.apache.catalina.util.URLEncoder;
+import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.http.fileupload.ParameterParser;
 
 /**
@@ -94,6 +98,8 @@ public final class HTMLManagerServlet ex
     }
     
     private final Random randomSource = new Random();
+    
+    private boolean showProxySessions = false;
 
     // --------------------------------------------------------- Public Methods
 
@@ -507,9 +513,12 @@ public final class HTMLManagerServlet ex
                 args[4] = response.encodeURL
                     (request.getContextPath() +
                      "/html/sessions?path=" + URL_ENCODER.encode(displayPath));
-                if (ctxt.getManager() != null) {
-                    args[5] = new Integer
-                        (ctxt.getManager().getActiveSessions());
+                Manager manager = ctxt.getManager(); 
+                if (manager instanceof BackupManager && showProxySessions) {
+                    args[5] = new Integer(
+                            ((BackupManager)manager).getActiveSessionsFull());
+                } else if (ctxt.getManager() != null){
+                    args[5] = new Integer(manager.getActiveSessions());
                 } else {
                     args[5] = new Integer(0);
                 }
@@ -542,7 +551,6 @@ public final class HTMLManagerServlet ex
                      "/html/expire?path=" + URL_ENCODER.encode(displayPath));
                 args[9] = appsExpire;
                 args[10] = sm.getString("htmlManagerServlet.expire.explain");
-                Manager manager = ctxt.getManager();
                 if (manager == null) {
                     args[11] = sm.getString("htmlManagerServlet.noManager");
                 } else {
@@ -775,6 +783,16 @@ public final class HTMLManagerServlet ex
     @Override
     public void init() throws ServletException {
         super.init();
+        
+        // Set our properties from the initialization parameters
+        String value = null;
+        try {
+            value = getServletConfig().getInitParameter("showProxySessions");
+            showProxySessions = Boolean.parseBoolean(value);
+        } catch (Throwable t) {
+            ExceptionUtils.handleThrowable(t);
+        }
+
     }   
 
     // ------------------------------------------------ Sessions administration
@@ -832,7 +850,7 @@ public final class HTMLManagerServlet ex
         displaySessionsListPage(path, req, resp);
     }
 
-    protected Session[] getSessionsForPath(String path) {
+    protected List<Session> getSessionsForPath(String path) {
         if ((path == null) || (!path.startsWith("/") && path.equals(""))) {
             throw new 
IllegalArgumentException(sm.getString("managerServlet.invalidPath",
                                         RequestUtil.filter(path)));
@@ -845,7 +863,22 @@ public final class HTMLManagerServlet ex
             throw new 
IllegalArgumentException(sm.getString("managerServlet.noContext",
                                         RequestUtil.filter(path)));
         }
-        Session[] sessions = ctxt.getManager().findSessions();
+        Manager manager = ctxt.getManager();
+        List<Session> sessions = new ArrayList<Session>();
+        sessions.addAll(Arrays.asList(manager.findSessions()));
+        if (manager instanceof BackupManager && showProxySessions) {
+            // Add dummy proxy sessions
+            Set<String> sessionIds =
+                ((BackupManager) manager).getSessionIdsFull();
+            // Remove active (primary and backup) session IDs from full list
+            for (Session session : sessions) {
+                sessionIds.remove(session.getId());
+            }
+            // Left with just proxy sessions - add them
+            for (String sessionId : sessionIds) {
+                sessions.add(new DummyProxySession(sessionId));
+            }
+        }
         return sessions;
     }
     protected Session getSessionForPathAndId(String path, String id) throws 
IOException {
@@ -873,7 +906,7 @@ public final class HTMLManagerServlet ex
      * @throws IOException
      */
     protected void displaySessionsListPage(String path, HttpServletRequest 
req, HttpServletResponse resp) throws ServletException, IOException {
-        List<Session> activeSessions = Arrays.asList(getSessionsForPath(path));
+        List<Session> sessions = getSessionsForPath(path);
         String sortBy = req.getParameter("sort");
         String orderBy = null;
         if (null != sortBy && !"".equals(sortBy.trim())) {
@@ -887,7 +920,7 @@ public final class HTMLManagerServlet ex
                     //orderBy = "DESC";
                 }
                 try {
-                    Collections.sort(activeSessions, comparator);
+                    Collections.sort(sessions, comparator);
                 } catch (IllegalStateException ise) {
                     // at least 1 of the sessions is invalidated
                     req.setAttribute(APPLICATION_ERROR, "Can't sort session 
list: one session is invalidated");
@@ -899,7 +932,7 @@ public final class HTMLManagerServlet ex
         // keep sort order
         req.setAttribute("sort", sortBy);
         req.setAttribute("order", orderBy);
-        req.setAttribute("activeSessions", activeSessions);
+        req.setAttribute("activeSessions", sessions);
         //strong>NOTE</strong> - This header will be overridden
         // automatically if a <code>RequestDispatcher.forward()</code> call is
         // ultimately invoked.

Modified: tomcat/trunk/java/org/apache/catalina/manager/JspHelper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/JspHelper.java?rev=980567&r1=980566&r2=980567&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/JspHelper.java (original)
+++ tomcat/trunk/java/org/apache/catalina/manager/JspHelper.java Thu Jul 29 
20:53:26 2010
@@ -73,6 +73,9 @@ public class JspHelper {
 
     public static String getDisplayCreationTimeForSession(Session in_session) {
         try {
+            if (in_session.getCreationTime() == 0) {
+                return "";
+            }
             DateFormat formatter = new SimpleDateFormat(DATE_TIME_FORMAT);
             return formatter.format(new Date(in_session.getCreationTime()));
         } catch (IllegalStateException ise) {
@@ -83,6 +86,9 @@ public class JspHelper {
 
     public static String getDisplayLastAccessedTimeForSession(Session 
in_session) {
         try {
+            if (in_session.getLastAccessedTime() == 0) {
+                return "";
+            }
             DateFormat formatter = new SimpleDateFormat(DATE_TIME_FORMAT);
             return formatter.format(new 
Date(in_session.getLastAccessedTime()));
         } catch (IllegalStateException ise) {
@@ -92,14 +98,38 @@ public class JspHelper {
     }
 
     public static String getDisplayUsedTimeForSession(Session in_session) {
+        try {
+            if (in_session.getCreationTime() == 0) {
+                return "";
+            }
+        } catch (IllegalStateException ise) {
+            //ignore: invalidated session
+            return "";
+        }
         return 
secondsToTimeString(SessionUtils.getUsedTimeForSession(in_session)/1000);
     }
 
     public static String getDisplayTTLForSession(Session in_session) {
+        try {
+            if (in_session.getCreationTime() == 0) {
+                return "";
+            }
+        } catch (IllegalStateException ise) {
+            //ignore: invalidated session
+            return "";
+        }
         return 
secondsToTimeString(SessionUtils.getTTLForSession(in_session)/1000);
     }
 
     public static String getDisplayInactiveTimeForSession(Session in_session) {
+        try {
+            if (in_session.getCreationTime() == 0) {
+                return "";
+            }
+        } catch (IllegalStateException ise) {
+            //ignore: invalidated session
+            return "";
+        }
         return 
secondsToTimeString(SessionUtils.getInactiveTimeForSession(in_session)/1000);
     }
 

Modified: tomcat/trunk/java/org/apache/catalina/manager/util/SessionUtils.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/util/SessionUtils.java?rev=980567&r1=980566&r2=980567&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/util/SessionUtils.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/manager/util/SessionUtils.java Thu 
Jul 29 20:53:26 2010
@@ -176,6 +176,9 @@ public class SessionUtils {
             return in_session.getPrincipal().getName();
         }
         HttpSession httpSession = in_session.getSession();
+        if (httpSession == null)
+            return null;
+        
         try {
             Object user = null;
             // First search "known locations"

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=980567&r1=980566&r2=980567&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Thu Jul 29 20:53:26 2010
@@ -300,6 +300,11 @@
         applications that redirect users to the html interface rather than
         returning a 404. (markt)
       </add>
+      <add>
+        Provide the HTML Manager application with the ability to differentiate
+        between primary, backup and proxy sessions. Note that proxy sessions 
are
+        only shown if enabled in web.xml. (markt) 
+      </add>
     </changelog>
   </subsection>
   <subsection name="Other">

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=980567&r1=980566&r2=980567&view=diff
==============================================================================
--- tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp (original)
+++ tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp Thu Jul 29 
20:53:26 2010
@@ -25,7 +25,8 @@
      PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
 
-<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en">
+
+<%...@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 submitUrl = response.encodeURL(((HttpServletRequest)
            pageContext.getRequest()).getRequestURI() + "?path=" + path);
@@ -107,13 +108,23 @@
            } else {
                type = "Backup";
            }
+       } else if (currentSession instanceof DummyProxySession) {
+           type = "Proxy";
        } else {
            type = "Primary";
        }
 %>
                                <tr>
                                        <td><input type="checkbox" 
name="sessionIds" value="<%= currentSessionId %>" />
+                                         <%
+                                           if ("Proxy".equals(type)) {
+                                               out.print(currentSessionId);
+                                           } else {
+                                         %>
                                          <a href="<%= submitUrl 
%>&amp;action=sessionDetail&amp;sessionId=<%= currentSessionId 
%>&amp;sessionType=<%= type %>"><%= JspHelper.escapeXml(currentSessionId) %></a>
+                                         <%
+                                           }
+                                         %>
                                        </td>
                     <td style="text-align: center;"><%= type %></td>
                                        <td style="text-align: center;"><%= 
JspHelper.guessDisplayLocaleFromSession(currentSession) %></td>

Modified: tomcat/trunk/webapps/manager/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/manager/WEB-INF/web.xml?rev=980567&r1=980566&r2=980567&view=diff
==============================================================================
--- tomcat/trunk/webapps/manager/WEB-INF/web.xml (original)
+++ tomcat/trunk/webapps/manager/WEB-INF/web.xml Thu Jul 29 20:53:26 2010
@@ -44,6 +44,13 @@
       <param-name>debug</param-name>
       <param-value>2</param-value>
     </init-param>
+    <!-- Uncomment this to show proxy sessions from the Backup manager in the
+         sessions list for an application
+    <init-param>
+      <param-name>showProxySessions</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    -->
     <multipart-config>
       <!-- 50MB max -->
       <max-file-size>52428800</max-file-size>



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

Reply via email to