/*
 * JBoss, the OpenSource J2EE webOS
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */

package org.jboss.ha.httpsession.server;

import javax.ejb.EJBException;

import org.jboss.ha.httpsession.interfaces.SerializableHttpSession;

/**
 * Service that provide unified access to clustered HTTPSessions for servlets.
 *
 * @see org.jboss.ha.httpsession.beanimpl.interfaces.ClusteredHTTPSession
 * @see org.jboss.ha.httpsession.beanimpl.interfaces.ClusteredHTTPSessionHome
 *
 * @author  <a href="mailto:sacha.labourey@cogito-info.ch">Sacha Labourey</a>.
 * @version $Revision: 1.3 $
 *   
 * <p><b>Revisions:</b>
 *
 * <p><b>31. décembre 2001 Sacha Labourey:</b>
 * <ul>
 * <li> First implementation </li> 
 * </ul>
 */

public interface ClusteredHTTPSessionServiceMBean extends org.jboss.system.ServiceMBean
{
   /**
    * Return the HttpSession associated to a session id.
    * As all session id are shared for all Web Applications, all sessions ids accross
    * all applications and all nodes must be distincts!
    * The creation and last access time of the session may not be correct if they
    * are the only thing that has been modified on a distant node (and no attribute).
    * See setHttpSession for more information.
    */   
   public SerializableHttpSession getHttpSession (String sessionId, ClassLoader tcl) throws EJBException;
   /**
    * Associate a new session with the session id. To reduce the cluster communication,
    * if the only thing that has changed in the session is the last accessed time, the
    * new session is kept in cache but not replicated on the other nodes. Thus, if you
    * use a front-end load-balancer that support sticky session, that is not a problem
    * because a client will always target the same node and receive the updated session
    * available in cache.
    * Nevertheless, as soon as an attribute is modified in the session, it is replicated
    * in the cluster.
    */   
   public void setHttpSession (String sessionId, SerializableHttpSession session) throws EJBException;
   /**
    * Remove an HttpSession from the cluster (log off for example)
    */   
   public void removeHttpSession (String sessionId) throws EJBException;   
   /**
    * Generates a new session id available cluster-wide
    */   
   public String getSessionId ();
   
   /**
    * Indicate the duration, in ms, after which the session can be cleaned if no
    * access occurs.
    */   
   public long getSessionTimeout (); // defaults to 15 minutes i.e. 15*60*1000 = 900'000
   /**
    * Indicate the duration, in ms, after which the session can be cleaned if no
    * access occurs.
    */   
   public void setSessionTimeout (long miliseconds);   
   
   /**
    * Indicates whether the service should use the local and home interfaces of the
    * entity bean or the remote and remote home interfaces (depending if they are in
    * the same JVM).
    */   
   public void setUseLocalBean (boolean useLocal);   
   public boolean getUseLocalBean ();
}