/*
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2003 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 acknowlegement:  
 *       "This product includes software developed by the 
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 *
 * 4. The names "The Jakarta Project", "Pluto", and "Apache Software
 *    Foundation" 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"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * 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/>.
 *
 * ====================================================================
 *
 * This source code implements specifications defined by the Java
 * Community Process. In order to remain compliant with the specification
 * DO NOT add / change / or delete method signatures!
 */

package javax.portlet;


/**
 * The <CODE>Portlet</CODE> interface is used by the portlet container to
 * invoke the portlets. Every portlet has to implement this interface,
 * either by directly implementing it, or by using an existing class 
 * implementing the Portlet interface.
 * <P>
 * A portlet is a Java technology-based web component. It is managed by the portlet container and
 * processes requests and generates dynamic content as response. Portlets are used by portals as
 * pluggable user interface components.
 * <p>
 * The content generated by a portlet is called a fragment. A fragment is a piece of
 * markup (e.g. HTML, XHTML, WML) adhering to certain rules and can be aggregated
 * with other fragments into a complete document. The content of a portlet is normally
 * aggregated with the content of other portlets into the portal page. 
 * <P>
 * The portlet container instanciates portlets, manages their lifecycle 
 * and invoking them to process requests. The lifecycle consists of:
 * <ul>
 * <li>initializing the portlet using using the <code>init</code> method
 * <li>request processsing
 * <li>taking the portlet out of service using the <code>destroy</code> method
 * </ul>
 * <p>
 * Request processing is divided into two types:
 * <ul>
 * <li>action requests handled through the <code>processAction</code> method, 
 *     to perform actions targeted to the portlet
 * <li>render requests handled through the <code>render</code> method, 
 *     to perform the render operation
 * </ul>
 */
public interface Portlet
{



  /**
   * Called by the portlet container to indicate to a portlet that the 
   * portlet is being placed into service.
   *
   * <p>The portlet container calls the <code>init</code>
   * method exactly once after instantiating the portlet.
   * The <code>init</code> method must complete successfully
   * before the portlet can receive any requests.
   *
   * <p>The portlet container cannot place the portlet into service
   * if the <code>init</code> method
   * <ol>
   * <li>Throws a <code>PortletException</code>
   * <li>Does not return within a time period defined by the portlet container.
   * </ol>
   *
   *
   * @param config			a <code>PortletConfig</code> object 
   *					containing the portlet's
   * 					configuration and initialization parameters
   *
   * @exception PortletException 	if an exception has occurred that
   *					interferes with the portlet's normal
   *					operation.
   * @exception UnavailableException 	if the portlet cannot perform the initialization at this time.
   *
   *
   */

  public void init(PortletConfig config) throws PortletException;




  /**
   * Called by the portlet container to allow the portlet to process
   * an action request. This method is called if the client request was
   * originated by a URL created (by the portlet) with the 
   * <code>RenderResponse.createActionURL()</code> method.
   * <p>
   * Typically, in response to an action request, a portlet updates state 
   * based on the information sent in the action request parameters.
   * In an action the portlet may:
   * <ul>
   * <li>issue a redirect
   * <li>change its window state
   * <li>change its portlet mode
   * <li>modify its persistent state
   * <li>set render parameters
   * </ul>
   * <p>
   * A client request triggered by an action URL translates into one 
   * action request and many render requests, one per portlet in the portal page.
   * The action processing must be finished before the render requests
   * can be issued.
   *
   * @param request
   *                 the action request
   * @param response
   *                 the action response
   * @exception  PortletException
   *                   if the portlet has problems fulfilling the
   *                   request
   * @exception  UnavailableException 	
   *                   if the portlet is unavailable to process the action at this time
   * @exception  PortletSecurityException  
   *                   if the portlet cannot fullfill this request because of security reasons
   * @exception  IOException
   *                   if the streaming causes an I/O problem
   */
  public void processAction (ActionRequest request, ActionResponse response) 
    throws PortletException, java.io.IOException;



  /**
   * Called by the portlet container to allow the portlet to generate
   * the content of the response based on its current state.
   *
   * @param   request
   *          the render request
   * @param   response
   *          the render response
   *
   * @exception   PortletException
   *              if the portlet has problems fulfilling the
   *              rendering request
   * @exception  UnavailableException 	
   *                   if the portlet is unavailable to perform render at this time
   * @exception  PortletSecurityException  
   *                   if the portlet cannot fullfill this request because of security reasons
   * @exception  java.io.IOException
   *              if the streaming causes an I/O problem
   */

  public void render (RenderRequest request, RenderResponse response) 
    throws PortletException, java.io.IOException;


  /**
   *
   * Called by the portlet container to indicate to a portlet that the
   * portlet is being taken out of service.  
   * <p>
   * Before the portlet container calls the destroy method, it should 
   * allow any threads that are currently processing requests within 
   * the portlet object to complete execution. To avoid
   * waiting forever, the portlet container can optionally wait for 
   * a predefined time before destroying the portlet object.
   *
   * <p>This method enables the portlet to do the following:
   * <ul>
   * <li>clean up any resources that it holds (for example, memory,
   * file handles, threads) 
   * <li>make sure that any persistent state is
   * synchronized with the portlet current state in memory.
   * </ul>
   */
  
  public void destroy();
}
