/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jboss.web.tomcat.service.session;

import org.jboss.web.tomcat.statistics.ReplicationStatistics;

/**
 * The MBean-interface for the JBossManager
 *
 * @author Thomas Peuss <jboss@peuss.de>
 * @author Brian Stansberry
 * 
 * @version $Revision: 82920 $
 */
public interface JBossManagerMBean
{
   /**
    * Gets the replication statistics for the sessions managed
    * by this manager.
    * 
    * @return the statistics
    */
   ReplicationStatistics getReplicationStatistics();

   /**
    * Resets all statistics.
    */
   void resetStats();

   /**
    * Gets the elapsed time (in seconds) since this manager was instantiated 
    * or the last call to resetStats()
    */
   long getTimeSinceLastReset();

   /**
    * Gets the number of sessions active on this node.  This includes
    * replicated sessions that have not been accessed on this node.
    */
   long getActiveSessionCount();
   
   /**
    * Gets the count of sessions known to this manager, excluding those
    * in the distributed stored that have not been accessed on this node.
    */
   long getLocalActiveSessionCount();
   

   /**
    * Gets the number of times session creation has failed because the
    * number of active sessions exceeds 
    * {@link #getMaxActiveAllowed() maxActiveAllowed}
    */
   long getRejectedSessionCount();

   /**
    * Gets the number of sessions created on this node. Does not include
    * sessions initially created on other nodes, even if those sessions
    * were accessed on this node.
    */
   long getCreatedSessionCount();

   /**
    * Gets the number of sessions that have been expired on this node.
    */
   long getExpiredSessionCount();
   
   /**
    * Gets the highest number of sessions concurrently active on this node.   
    * This includes replicated sessions that have not been accessed on 
    * this node.
    */
   long getMaxActiveSessionCount();
   
   /**
    * Gets the highest value seen for {@link #getLocalSessionCount()}
    */
   long getMaxLocalActiveSessionCount();
   
   /**
    * Gets the maximum number of {@link #getActiveSessionCount() active sessions}
    * that will concurrently be allowed on this node.  This includes replicated 
    * sessions that have not been accessed on this node.
    */
   int getMaxActiveAllowed();
   
   /**
    * Sets the maximum number of active sessions that will concurrently be
    * allowed on this node, excluding any sessions that have been passivated.  
    * This includes replicated sessions that have not been accessed on this 
    * node. If the {@link #getActiveSessionCount() active session count} 
    * exceeds this value and an attempt to create a new session is made, 
    * session creation will fail with an {@link IllegalStateException}.
    * 
    * @param max the max number of sessions, or <code>-1</code> if there is
    *            no limit.
    */
   void setMaxActiveAllowed(int max);
   
   /**
    * Gets the maximum time interval, in seconds, between client requests
    * after which sessions created by this manager should be expired.  A 
    * negative time indicates that the session should never time out.
    */
   int getMaxInactiveInterval();
   
   /**
    * Sets the maximum time interval, in seconds, between client requests
    * after which sessions created by this manager should be expired.  A 
    * negative time indicates that the session should never time out.
    *
    * @param interval The new maximum interval
    */
   void setMaxInactiveInterval(int minutes);
   
   /**
    * Gets whether this manager's sessions are distributable.
    */
   boolean getDistributable();
   
   /**
    * Gets the cumulative number of milliseconds spent in the 
    * <code>Manager.backgroundProcess()</code> method.
    */
   long getProcessingTime();
   
   /**
    * Outputs the replication statistics as an HTML table, with one row
    * per session.
    */
   String reportReplicationStatistics();
   
   /**
    * Outputs the replication statistics as a comma-separated-values, with one 
    * row per session.  First row is a header listing field names.
    */
   String reportReplicationStatisticsCSV();

   /**
    * Outputs the replication statistics for the given session as a set of 
    * comma-separated-values.  First row is a header listing field names.
    */
   String reportReplicationStatisticsCSV(String sessionId);
   
   /**
    * Gets the number of characters used in creating a session id.  Excludes
    * any jvmRoute.
    */
   int getSessionIdLength();
   
   // StandardManager Attributes
   
   /**
    * Gets the message digest algorithm to be used when generating
    * session identifiers.
    */
   String getAlgorithm();
   
   /**
    * Gets the fully qualified class name of the managed object
    */
   String getClassName();
   
   /**
    * Gets the maximum number of active Sessions allowed, or -1
      for no limit.
    */
   int getMaxActiveSessions();
   
   /**
    * Gets the frequency of the manager checks (expiration and passivation)
    */
   int getProcessExpiresFrequency();
   
   /**
    * Sets the frequency of the manager checks (expiration and passivation)
    */
   void setProcessExpiresFrequency(int frequency);
   
   /**
    * Gets the name of this Manager implementation.
    */
   String getName();
   
   /**
    * Number of active sessions at this moment. 
    * Same as {@link #getActiveSessionCount()}.
    */
   int getActiveSessions();
   
   /**
    * Total number of sessions created by this manager. 
    * Same as {@link #getCreatedSessionCount()}
    */
   int getSessionCounter();
   
   /**
    * Gets the maximum number of active sessions so far. 
    * Same as {@link #getMaxActiveSessionCount()}
    */
   int getMaxActive();
   
   /**
    * Gets the longest time an expired session had been alive
    */
   int getSessionMaxAliveTime();
   
   /**
    * Gets the average time an expired session had been alive
    */
   int getSessionAverageAliveTime();
   
   /**
    * Gets the number of sessions that expired. 
    * Same as {@link #getExpiredSessionCount()}
    */
   int getExpiredSessions();
   
   /**
    * Gets the number of sessions we rejected due to maxActive being reached. 
    * Same as {@link #getRejectedSessionCount()}
    */
   int getRejectedSessions();
   
}
