/* RequestInterceptor.java

	Purpose:
		
	Description:
		
	History:
		Fri May 25 23:39:35     2007, Created by tomyeh

Copyright (C) 2007 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.zk.ui.util;

import org.zkoss.zk.ui.Session;

/**
 * Used to intercept the requests for the ZK Loader and Update Engine.
 * Developers usually use it to prepare the locale and time zone.
 *
 * <p>{@link #request} is called at very early stage, even before
 * setting the locale for the request.
 * Thus, you can configure the locale as follows:<br/>
 *   <code>sess.setAttribute({@link org.zkoss.web.Attributes#PREFERRED_LOCALE}, myLocale);</code>
 *
 * <p>By default, the locale is decided by the browser's preference.
 * However, you may want to store the previous locale in the cookie
 * if your application is HTTP. Another example, you may want to 
 * retrieve the locale from the database where your application stores
 * user's preferences.
 *
 * <p>Similarly, you can configure the time zone (that is used by
 * some components, such as Datebox) as follows:<br/>
 *   <code>sess.setAttribute({@link org.zkoss.web.Attributes#PREFERRED_TIME_ZONE}, myLocale);</code>
 *
 * <p>How this interface is used.
 * <ol>
 * <li>First, you specify a class that implements this interface
 * in WEB-INF/zk.xml as a listener.
 * Then, an instance of the specified class is created.
 * </li>
 * <li>Each time ZK Loader or ZK Update Engine receives a request,
 * it first invoke {@link #request} against the instance created in
 * the previous step.</li>
 * </ol>
 *
 * <p>Note:
 * <ul>
 * <li>Unlike {@link ExecutionInit} and others listeners, the same instance of
 * {@link RequestInterceptor} is used for the whole application.
 * Thus, you have to make sure it can be accessed concurrently.</li>
 * </ul>
 *
 * <h3>Differences to {@link URIInterceptor}</h3>
 *
 * <p>{@link URIInterceptor} is called when retrieving a page definition
 * from an URI ({@link org.zkoss.zk.ui.metainfo.PageDefinitions#getPageDefinition}). It may or may not be caused by a client request.
 * On the other hand, {@link RequestInterceptor} is called
 * when ZK Loader or ZK Update Engine is receiving a client request.
 *
 * @author tomyeh
 * @see URIInterceptor
 */
public interface RequestInterceptor {
	/** Called before a request is processed by ZK Loader or ZK
	 * Update Engine.
	 *
	 * @param sess the session (never null)
	 * @param request the request (never null).
	 * It is javax.servlet.http.HttpServletRequest, if the application is
	 * HTTP based. A common use is to look for the cookies.
	 * @param response the response (never null).
	 * It is javax.servlet.http.HttpServletResponse, if the application is
	 * HTTP based. A common use is to store the cookies.
	 */
	public void request(Session sess, Object request, Object response);
}
