/*
 *  ====================================================================
 *  The Apache Software License, Version 1.1
 *
 *  Copyright (c) 2002 The Apache Software Foundation.  All rights
 *  reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  1. Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in
 *  the documentation and/or other materials provided with the
 *  distribution.
 *
 *  3. The end-user documentation included with the redistribution,
 *  if any, must include the following acknowledgment:
 *  "This product includes software developed by the
 *  Apache Software Foundation (http://www.apache.org/)."
 *  Alternately, this acknowledgment may appear in the software itself,
 *  if and wherever such third-party acknowledgments normally appear.
 *
 *  4. The names "Apache" and "Apache Software Foundation" and
 *  "Apache Tapestry" must not be used to endorse or promote products
 *  derived from this software without prior written permission. For
 *  written permission, please contact apache@apache.org.
 *
 *  5. Products derived from this software may not be called "Apache",
 *  "Apache Tapestry", nor may "Apache" appear in their name, without
 *  prior written permission of the Apache Software Foundation.
 *
 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 *  SUCH DAMAGE.
 *  ====================================================================
 *
 *  This software consists of voluntary contributions made by many
 *  individuals on behalf of the Apache Software Foundation.  For more
 *  information on the Apache Software Foundation, please see
 *  <http://www.apache.org/>.
 */
package net.sf.tapestry;

/**
 *  Basic support for application monitoring and metrics.  
 *  This interface defines events; the implementation
 *  decides what to do with them (such as record them to a database).
 *
 *  @author Howard Lewis Ship
 *  @version $Id$
 * 
 **/

public interface IMonitor
{
	/**
	 *  Invoked before constructing a page.
	 *
	 **/

	public void pageCreateBegin(String pageName);

	/**
	 *  Invoked after successfully constructing a page and all of its components.
	 *
	 **/

	public void pageCreateEnd(String pageName);

	/**
	 *  Invoked when a page is loaded.  This includes time to locate or create an instance
	 *  of the page and rollback its state (to any previously recorded value).
	 *
	 **/

	public void pageLoadBegin(String pageName);

	/**
	 *  Invoked once a page is completely loaded and rolled back to its prior state.
	 *
	 **/

	public void pageLoadEnd(String pageName);

	/**
	 *  Invoked before a page render begins.
	 *
	 **/

	public void pageRenderBegin(String pageName);

	/**
	 *  Invoked after a page has succesfully rendered.
	 *
	 **/

	public void pageRenderEnd(String pageName);

	/**
	 *  Invoked before a page rewind (to respond to an action) begins.
	 *
	 **/

	public void pageRewindBegin(String pageName);

	/**
	 *  Invoked after a page has succesfully been rewound (which includes
	 *  any activity related to the action listener).
	 *
	 **/

	public void pageRewindEnd(String pageName);

	/**
	 *  Invoked when a service begins processing.
	 *
	 **/

	public void serviceBegin(String serviceName, String detailMessage);

	/**
	 *  Invoked when a service successfully ends.
	 *
	 **/

	public void serviceEnd(String serviceName);

	/**
	 *  Invoked when a service throws an exception rather than completing normally.
	 *  Processing of the request may continue with the display of an exception
	 *  page.
	 *
	 **/

	public void serviceException(Throwable exception);

	/**
	 *  Invoked when a session is initiated.  This is typically
	 *  done from the implementation of the home service.
	 *
	 **/

	public void sessionBegin();
}