/* ExtendletContext.java

	Purpose:
		
	Description:
		
	History:
		Mon Aug 29 18:27:04     2005, Created by tomyeh

Copyright (C) 2005 Potix Corporation. All Rights Reserved.

{{IS_RIGHT
	This program is distributed under LGPL Version 2.1 in the hope that
	it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.web.util.resource;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.zkoss.util.resource.Locator;

/**
 * This interface defines an extended context that
 * {@link org.zkoss.web.servlet.Servlets#getRequestDispatcher} will try to
 * resolve.
 * When {@link org.zkoss.web.servlet.Servlets#getRequestDispatcher} is
 * called, it detects whether ~xxx/ is specified.
 * If specified, it looks up any extended context
 * is registered as xxx. If found, the extend context is used.
 * If not found, it looks up any servlet context called xxx.
 *
 * <p>To registers an extended context, use 
 * {@link org.zkoss.web.servlet.Servlets#addExtendletContext}.
 *
 * @author tomyeh
 */
public interface ExtendletContext {
	/** Returns the encoded URL.
	 * The returned URL is also encoded with HttpServletResponse.encodeURL.
	 *
	 * <p>It resolves "*" contained in URI, if any, to the proper Locale,
	 * and the browser code.
	 * Refer to {@link org.zkoss.web.servlet.Servlets#locate(javax.servlet.ServletContext, ServletRequest, String, org.zkoss.util.resource.Locator)}
	 * for details. 
	 *
	 * @param uri it must be empty or starts with "/". It might contain
	 * "*" for current browser code and Locale.
	 * @return the complete URL (excluding the machine name).
	 * It includes the context path and the servlet to interpret
	 * this extended resource.
	 */
	public String encodeURL(ServletRequest request, ServletResponse response, String uri)
			throws ServletException, IOException;

	/** Returns  the encoded URL for send redirect.
	 * The URL is also encoded with HttpServletResposne.encodeRedirectURL.
	 */
	public String encodeRedirectURL(HttpServletRequest request, HttpServletResponse response, String uri, Map params,
			int mode);

	/* Returns the request dispatcher that acts as a wrapper for
	 * the resource located at the given path, or null if not found.
	 */
	public RequestDispatcher getRequestDispatcher(String uri);

	/** Includes the specified page.
	 *
	 * <p>Note: if you want to include the content into a different
	 * writer, you have to use {@link org.zkoss.web.servlet.BufferedResponse}
	 * to 'wrap' the writer in the response.
	 *
	 * @since 3.5.2 
	 */
	public void include(HttpServletRequest request, HttpServletResponse response, String uri, Map params)
			throws ServletException, IOException;

	/** Returns the URL of the specified URI, or null if not found.
	 *
	 * <p>Unlike {@link #getLocator}, {@link #getResourceAsStream}
	 * handles the JavaScript debugging. In other words,
	 * if the JavaScript debugging is turned on, it will try to load
	 * the non-compressed version.
	 */
	public URL getResource(String uri);

	/** Returns the resource of the specified URI as input stream,
	 * or null if not found.
	 *
	 * <p>Unlike {@link #getLocator}, {@link #getResourceAsStream}
	 * handles the JavaScript debugging. In other words,
	 * if the JavaScript debugging is turned on, it will try to load
	 * the non-compressed version.
	 */
	public InputStream getResourceAsStream(String uri);

	/** Returns the servlet context.
	 */
	public ServletContext getServletContext();

	/** Returns the locator of this context used to locate resources.
	 *
	 * <p>Unlike {@link #getResource} and {@link #getResourceAsStream},
	 * {@link #getLocator} doesn't handle the JavaScript debugging.
	 */
	public Locator getLocator();

	/** Tests whether to compress the specified extension, e.g, "js" and
	 * "css".
	 *
	 * <p>It returns false if the request is included by other Servlets.
	 */
	public boolean shallCompress(ServletRequest request, String ext);
}
