package org.apache.struts.beanaction;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.beanaction.httpmap.ApplicationMap;
import org.apache.struts.beanaction.httpmap.CookieMap;
import org.apache.struts.beanaction.httpmap.ParameterMap;
import org.apache.struts.beanaction.httpmap.RequestMap;
import org.apache.struts.beanaction.httpmap.SessionMap;

/**
 * The ActionContext class gives simplified, thread-safe access to
 * <p/>
 * the request and response, as well as form parameters, request
 * <p/>
 * attributes, session attributes, application attributes. Much
 * <p/>
 * of this can be accopmplished without using the Struts or even
 * <p/>
 * the Servlet API, therefore isolating your application from
 * <p/>
 * presentation framework details.
 * <p/>
 * <p/>
 * <p/>
 * This class also provides facilities for simpler message and error
 * <p/>
 * message handling. Although not as powerful as that provided by
 * <p/>
 * Struts, it is great for simple applications that don't require
 * <p/>
 * internationalization or the flexibility of resource bundles.
 * <p/>
 * <p/>
 * <p/>
 * <i>Note: A more complete error and message handling API will be implemented.</i>
 * <p/>
 * <p/>
 * <p/>
 * Date: Mar 9, 2004 9:57:39 PM
 *
 * @author Clinton Begin
 */
public class ActionContext {
    private static final ThreadLocal localContext = new ThreadLocal();
    private HttpServletRequest request;
    private HttpServletResponse response;
    private Map cookieMap;
    private Map parameterMap;
    private Map requestMap;
    private Map sessionMap;
    private Map applicationMap;

    public ActionContext() {
        cookieMap = new HashMap();
        parameterMap = new HashMap();
        requestMap = new HashMap();
        sessionMap = new HashMap();
        applicationMap = new HashMap();
    }

    static void initCurrentContext(HttpServletRequest request, HttpServletResponse response) {
        ActionContext ctx = getActionContext();
        ctx.request = request;
        ctx.response = response;
        ctx.cookieMap = null;
        ctx.parameterMap = null;
        ctx.requestMap = null;
        ctx.sessionMap = null;
        ctx.applicationMap = null;
    }

    public Map getCookieMap() {
        if (cookieMap == null) {
            cookieMap = new CookieMap(request);
        }
        return cookieMap;
    }

    public Map getParameterMap() {
        if (parameterMap == null) {
            parameterMap = new ParameterMap(request);
        }
        return parameterMap;
    }

    public Map getRequestMap() {
        if (requestMap == null) {
            requestMap = new RequestMap(request);
        }
        return requestMap;
    }

    public Map getSessionMap() {
        if (sessionMap == null) {
            sessionMap = new SessionMap(request);
        }
        return sessionMap;
    }

    public Map getApplicationMap() {
        if (applicationMap == null) {
            applicationMap = new ApplicationMap(request);
        }
        return applicationMap;
    }

    public HttpServletRequest getRequest() {
        return request;
    }

    public HttpServletResponse getResponse() {
        return response;
    }

    public static ActionContext getActionContext() {
        ActionContext ctx = (ActionContext) localContext.get();
        if (ctx == null) {
            ctx = new ActionContext();
            localContext.set(ctx);
        }
        return ctx;
    }
}
