View Javadoc

    1   package org.apache.turbine.services.session;
    2
    3
    4   /*
    5    * Licensed to the Apache Software Foundation (ASF) under one
    6    * or more contributor license agreements.  See the NOTICE file
    7    * distributed with this work for additional information
    8    * regarding copyright ownership.  The ASF licenses this file
    9    * to you under the Apache License, Version 2.0 (the
    10   * "License"); you may not use this file except in compliance
    11   * with the License.  You may obtain a copy of the License at
    12   *
    13   *   http://www.apache.org/licenses/LICENSE-2.0
    14   *
    15   * Unless required by applicable law or agreed to in writing,
    16   * software distributed under the License is distributed on an
    17   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    18   * KIND, either express or implied.  See the License for the
    19   * specific language governing permissions and limitations
    20   * under the License.
    21   */
    22
    23
    24  import java.util.ArrayList;
    25  import java.util.Collection;
    26  import java.util.Hashtable;
    27  import java.util.Iterator;
    28  import java.util.Map;
    29  import javax.servlet.http.HttpSession;
    30
    31  import org.apache.turbine.om.security.User;
    32  import org.apache.turbine.services.TurbineBaseService;
    33
    34  /**
    35   * The SessionService allows thread-safe access to the current
    36   * sessions of the current context.  The session objects that are
    37   * cached by this service are obtained through a listener, which must
    38   * be configured via your web application's <code>web.xml</code>
    39   * deployement descriptor as follows:
    40   *
    41   * <blockquote><code><pre>
    42   * &lt;listener&gt;
    43   *   &lt;listener-class&gt;
    44   *     org.apache.turbine.session.SessionListener
    45   *   &lt;/listener-class&gt;
    46   * &lt;/listener&gt;
    47   * </pre></code></blockquote>
    48   *
    49   * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
    50   * @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
    51   * @since 2.3
    52   * @version $Id: TurbineSessionService.java 1066925 2011-02-03 19:44:37Z ludwig $
    53   * @see org.apache.turbine.services.session.TurbineSession
    54   * @see org.apache.turbine.services.session.SessionListener
    55   */
    56  public class TurbineSessionService
    57          extends TurbineBaseService
    58          implements SessionService
    59  {
    60      /** Map of active sessions */
    61      private Map<String, HttpSession> activeSessions;
    62
    63      /**
    64       * Gets a list of the active sessions.
    65       *
    66       * @return A copy of the list of <code>HttpSession</code> objects.
    67       */
    68      public Collection<HttpSession> getActiveSessions()
    69      {
    70          // Sync externally to allow ArrayList's ctor to iterate
    71          // activeSessions' values in a thread-safe fashion.
    72          synchronized (activeSessions)
    73          {
    74              return new ArrayList<HttpSession>(activeSessions.values());
    75          }
    76      }
    77
    78      /**
    79       * Adds a session to the current list.  This method should only be
    80       * called by the listener.
    81       *
    82       * @param session Session to add
    83       */
    84      public void addSession(HttpSession session)
    85      {
    86          activeSessions.put(session.getId(), session);
    87      }
    88
    89      /**
    90       * Removes a session from the current list.  This method should only be
    91       * called by the listener.
    92       *
    93       * @param session Session to remove
    94       */
    95      public void removeSession(HttpSession session)
    96      {
    97          activeSessions.remove(session.getId());
    98      }
    99
    100     /**
    101      * Determines if a given user is currently logged in.  The actual
    102      * implementation of the User object must implement the equals()
    103      * method.  By default, Torque based objects (liek TurbineUser)
    104      * have an implementation of equals() that will compare the
    105      * result of getPrimaryKey().
    106      *
    107      * @param user User to check for
    108      * @return true if the user is logged in on one of the
    109      * active sessions.
    110      */
    111     public boolean isUserLoggedIn(User user)
    112     {
    113         return getActiveUsers().contains(user);
    114     }
    115
    116     /**
    117      * Gets a collection of all user objects representing the users currently
    118      * logged in.  This will exclude any instances of anonymous user that
    119      * Turbine will use before the user actually logs on.
    120      *
    121      * @return A set of {@link org.apache.turbine.om.security.User} objects.
    122      */
    123     public Collection<User> getActiveUsers()
    124     {
    125         Collection<User> users;
    126         synchronized (activeSessions)
    127         {
    128             // Pre-allocate a list which won't need expansion more
    129             // than once.
    130             users = new ArrayList<User>((int) (activeSessions.size() * 0.7));
    131             for (Iterator<HttpSession> i = activeSessions.values().iterator(); i.hasNext();)
    132             {
    133                 User u = getUserFromSession(i.next());
    134                 if (u != null && u.hasLoggedIn())
    135                 {
    136                     users.add(u);
    137                 }
    138             }
    139         }
    140
    141         return users;
    142     }
    143
    144     /**
    145      * Gets the User object of the the specified HttpSession.
    146      *
    147      * @param session The session from which to extract a user.
    148      * @return The Turbine User object.
    149      */
    150     public User getUserFromSession(HttpSession session)
    151     {
    152         // Not sure of other containers, but Tomcat 5.0.28 sometimes returns
    153         // invalid sessions which will result in IllegalStateException when
    154         // session.getAttribute() is invoked below.
    155         try
    156         {
    157             return (User) session.getAttribute(User.SESSION_KEY);
    158         }
    159         catch (IllegalStateException e)
    160         {
    161             return null;
    162         }
    163     }
    164
    165     /**
    166      * Gets the HttpSession by the session identifier
    167      *
    168      * @param sessionId The unique session identifier.
    169      * @return The session keyed by the specified identifier.
    170      */
    171     public HttpSession getSession(String sessionId)
    172     {
    173         return this.activeSessions.get(sessionId);
    174     }
    175
    176     /**
    177      * Get a collection of all session on which the given user
    178      * is logged in.
    179      *
    180      * @param user the user
    181      * @return Collection of HtttSession objects
    182      */
    183     public Collection<HttpSession> getSessionsForUser(User user)
    184     {
    185         Collection<HttpSession> sessions = new ArrayList<HttpSession>();
    186         synchronized (activeSessions)
    187         {
    188             for (Iterator<HttpSession> i = activeSessions.values().iterator(); i.hasNext();)
    189             {
    190                 HttpSession session = i.next();
    191                 User u = this.getUserFromSession(session);
    192                 if (user.equals(u))
    193                 {
    194                     sessions.add(session);
    195                 }
    196             }
    197         }
    198
    199         return sessions;
    200     }
    201
    202
    203     // ---- Service initilization ------------------------------------------
    204
    205     /**
    206      * Initializes the service
    207      */
    208     @Override
    209     public void init()
    210     {
    211         this.activeSessions = new Hashtable<String, HttpSession>();
    212
    213         setInit(true);
    214     }
    215
    216     /**
    217      * Returns to uninitialized state.
    218      */
    219     @Override
    220     public void shutdown()
    221     {
    222         this.activeSessions = null;
    223
    224         setInit(false);
    225     }
    226
    227 }