/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package javax.faces.application;

import javax.faces.FacesException;
import java.util.Locale;

/**
 * A ViewHandler manages the component-tree-creation and component-tree-rendering parts
 * of a request lifecycle (ie "create view", "restore view" and "render response").
 * <p>
 * A ViewHandler is responsible for generating the component tree when a new view is
 * requested; see method "createView".
 * <p>
 * When the user performs a "postback", ie activates a UICommand component within a view,
 * then the ViewHandler is resonsible for recreating a view tree identical to the one
 * used previously to render that view; see method "restoreView".
 * <p>
 * And the ViewHandler is also responsible for rendering the final output to be sent to the
 * user by invoking the rendering methods on components; see method "renderView".
 * <p>
 * This class also isolates callers from the underlying request/response system. In particular,
 * this class does not explicitly depend upon the javax.servlet apis. This allows JSF to be
 * used on servers that do not implement the servlet API (for example, plain CGI). 
 * <p>
 * Examples:
 * <ul>
 * <li>A JSP ViewHandler exists for using "jsp" pages as the presentation technology.
 * This class then works together with a taghandler class and a jsp servlet class to
 * implement the methods on this abstract class definition.
 * <li>A Facelets ViewHandler instead uses an xml file to define the components and non-component
 * data that make up a specific view. It stores all of the template content as nodes in the
 * component tree (wrapping data that is not directly a JSF component in its own special
 * component classes). Rendering a view is then just a matter of walking the component tree.
 * </ul>
 * Of course there is no reason why the "template" needs to be a textual file. A view could
 * be generated based on data in a database, or many other mechanisms.
 * <p>
 * This class is expected to be invoked via the concrete implementation of 
 * {@link javax.faces.lifecycle.Lifecycle}.
 * <p>
 * For the official specification for this class, see 
 * <a href="http://java.sun.com/j2ee/javaserverfaces/1.1_01/docs/api/index.html">JSF Specification</a>.
 *
 * @author Manfred Geiler (latest modification by $Author$)
 * @version $Revision$ $Date$
 */
public abstract class ViewHandler
{
    public static final String CHARACTER_ENCODING_KEY = "javax.faces.request.charset";
    public static final String DEFAULT_SUFFIX_PARAM_NAME = "javax.faces.DEFAULT_SUFFIX";
    public static final String DEFAULT_SUFFIX = ".jsp";

    /**
     * Return the Locale object that should be used when rendering this view to the
     * current user.
     * <p>
     * Some request protocols allow an application user to specify what locale they prefer
     * the response to be in. For example, HTTP requests can specify the "accept-language"
     * header.
     * <p>
     * Method {@link javax.faces.application.Application#getSupportedLocales()} defines
     * what locales this JSF application is capable of supporting.
     * <p>
     * This method should match such sources of data up and return the Locale object that
     * is the best choice for rendering the current application to the current user.
     */
    public abstract Locale calculateLocale(javax.faces.context.FacesContext context);

    /**
     * Return the id of an available render-kit that should be used to map the JSF
     * components into user presentation.
     * <p>
     * The render-kit selected (eg html, xhtml, pdf, xul, ...) may depend upon the user,
     * properties associated with the request, etc.
     */
    public abstract String calculateRenderKitId(javax.faces.context.FacesContext context);

    /**
     * Build a root node for a component tree.
     * <p>
     * When a request is received, this method is called if restoreView returns null,
     * ie this is not a "postback". In this case, a root node is created and then renderView
     * is invoked. It is the responsibility of the renderView method to build the full
     * component tree (ie populate the UIViewRoot with descendant nodes).
     * <p>
     * This method is also invoked when navigation occurs from one view to another, where
     * the viewId passed is the id of the new view to be displayed. Again it is the responsibility
     * of renderView to then populate the viewroot with descendants.
     */
    public abstract javax.faces.component.UIViewRoot createView(javax.faces.context.FacesContext context,
                                                                String viewId);

    /**
     * Return a URL that a remote system can invoke in order to access the specified view.
     */
    public abstract String getActionURL(javax.faces.context.FacesContext context,
                                        String viewId);

    /**
     * Return a URL that a remote system can invoke in order to access the specified resource..
     */
    public abstract String getResourceURL(javax.faces.context.FacesContext context,
                                          String path);

    /**
     * Combine the output of all the components in the viewToRender with data from the
     * original view template (if any) and write the result to context.externalContext.response.
     * <p>
     * Component output is generated by invoking the encodeBegin, encodeChildren (optional)
     * and encodeEnd methods on relevant components in the specified view. How this is
     * interleaved with the non-component content of the view template (if any) is left
     * to the ViewHandler implementation.
     * <p>
     * The actual type of the Response object depends upon the concrete implementation of
     * this class. It will almost certainly be an OutputStream of some sort, but may be
     * specific to the particular request/response  system in use.
     * <p>
     * If the view cannot be rendered (eg due to an error in a component) then a FacesException
     * is thrown.
     * <p>
     * Note that if a "postback" has occurred but no navigation to a different view, then
     * the viewToRender will be fully populated with components already. However on direct
     * access to a new view, or when navigation has occurred, the viewToRender will just
     * contain an empty UIViewRoot object that must be populated with components from
     * the "view template". 
     */
    public abstract void renderView(javax.faces.context.FacesContext context,
                                    javax.faces.component.UIViewRoot viewToRender)
            throws java.io.IOException,
            FacesException;

    /**
     * Handle a "postback" request by recreating the component tree that was most recently
     * presented to the user for the specified view.
     * <p>
     * When the user performs a "postback" of a view that has previously been created, ie
     * is updating the state of an existing view tree, then the view handler must recreate
     * a view tree identical to the one used previously to render that view to the user,
     * so that the data received from the user can be compared to the old state and the
     * correct "changes" detected.
     * <p>
     * The components in this tree will then be given the opportunity to examine new input
     * data provided by the user, and react in the appropriate manner for that component,
     * as specified for the JSF lifecycle.
     * <p>
     * Much of the work required by this method <i>must</i> be delegated to an instance
     * of StateManager.
     * <p>
     * If there is no record of the current user having been sent the specified view
     * (ie no saved state information available), then NULL should be returned.
     * <p>
     * Note that input data provided by the user may also be used to determine exactly
     * how to restore this view. In the case of "client side state", information
     * about the components to be restored will be available here. Even for
     * "server side state", user input may include an indicator that is used to
     * select among a number of different saved states available for this viewId and
     * this user.
     * <p>
     * Note that data received from users is inherently untrustworthy; care should be
     * taken to validate this information appropriately.
     * <p>
     * See saveState for more details. 
     */
    public abstract javax.faces.component.UIViewRoot restoreView(javax.faces.context.FacesContext context,
                                                                 String viewId);

    /**
     * Write sufficient information to context.externalContext.response in order to
     * be able to restore this view if the user performs a "postback" using that
     * rendered response.
     * <p>
     * For "client side state saving", sufficient information about the view
     * state should be written to allow a "restore view" operation to succeed 
     * later. This does not necessarily mean storing <i>all</i> data about the
     * current view; only data that cannot be recreated from the "template" for
     * this view needs to be saved.
     * <p>
     * For "server side state saving", this method may write out nothing. Alternately
     * it may write out a "state identifier" to identify which of multiple saved
     * user states for a particular view should be selected (or just verify that the
     * saved state does indeed correspond to the expected one).
     */
    public abstract void writeState(javax.faces.context.FacesContext context)
            throws java.io.IOException;
}
