com.openedit.BaseWebPageRequest.java Source code

Java tutorial

Introduction

Here is the source code for com.openedit.BaseWebPageRequest.java

Source

/*
 * Created on Jul 28, 2003
 *
 /*
 Copyright (c) 2003 eInnovation Inc. All rights reserved
    
 This library is free software; you can redistribute it and/or modify it under the terms
 of the GNU Lesser General Public License as published by the Free Software Foundation;
 either version 2.1 of the License, or (at your option) any later version.
    
 This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU Lesser General Public License for more details.
 */
package com.openedit;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

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

import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.profile.UserProfile;
import org.openedit.util.LocaleManager;

import com.openedit.generators.VariablePackage;
import com.openedit.generators.VariableStore;
import com.openedit.page.Page;
import com.openedit.page.PageAction;
import com.openedit.page.PageRequestKeys;
import com.openedit.page.PageStreamer;
import com.openedit.users.User;
import com.openedit.util.PathUtilities;
import com.openedit.util.SessionMap;
import com.openedit.util.URLUtilities;
import com.openedit.web.Browser;

import groovy.json.JsonSlurper;

/**
 * @author Matt Avery, mavery@einnovation.com
 */
public class BaseWebPageRequest implements WebPageRequest, PageRequestKeys {
    private static final Log log = LogFactory.getLog(BaseWebPageRequest.class);

    protected HttpServletRequest fieldHttpServletRequest;
    protected HttpServletResponse fieldHttpServletResponse;
    protected HttpSession fieldHttpSession;

    protected WebPageRequest fieldParent;
    protected Map fieldVariables;
    protected Set fieldProtectedFields;
    protected Map fieldParameters;
    protected Map fieldBackUpSession;
    protected LocaleManager fieldLocaleManager;
    protected String fieldLocale;
    protected boolean fieldHasRedirected;
    protected boolean fieldHasForwarded;
    protected boolean fieldHasCancelActions;
    protected boolean fieldEditable;

    protected UserProfile fieldUserProfile;

    public BaseWebPageRequest(WebPageRequest parent) {
        fieldParent = parent;
        setEditable(parent.isEditable());
        while (parent != null) {
            if (parent == this) {
                throw new OpenEditRuntimeException("can't set parent to self");
            }
            parent = parent.getParent();
        }
    }

    public BaseWebPageRequest() {
    }

    @Override
    public Map getJsonRequest() {
        Map jsonRequest = (Map) getPageValue("_jsonRequest");

        if (jsonRequest == null && getRequest() != null) {
            JsonSlurper slurper = new JsonSlurper();
            try {
                Reader reader = getRequest().getReader();
                if (reader != null) {
                    jsonRequest = (Map) slurper.parse(reader); //this is real, the other way is just for t
                    putPageValue("_jsonRequest", jsonRequest);
                }
            } catch (Throwable ex) {
                putPageValue("_jsonRequest", new HashMap());
                //throw new OpenEditException(ex);
            }
        }

        return jsonRequest;
    }

    @Override
    public void setJsonRequest(Map inMap) {
        if (getParent() != null) {
            getParent().putPageValue("_jsonRequest", inMap);
        } else {
            putPageValue("_jsonRequest", inMap);
        }
    }

    protected Set getProtectedFields() {
        if (fieldProtectedFields == null) {
            fieldProtectedFields = new HashSet();
        }
        return fieldProtectedFields;
    }

    public WebPageRequest getParent() {
        return fieldParent;
    }

    public HttpServletRequest getRequest() {
        if (fieldHttpServletRequest == null && getParent() != null) {
            return getParent().getRequest();
        }
        return fieldHttpServletRequest;
    }

    public HttpServletResponse getResponse() {
        if (fieldHttpServletResponse == null && getParent() != null) {
            return getParent().getResponse();
        }
        return fieldHttpServletResponse;
    }

    public HttpSession getSession() {
        if (fieldHttpSession == null && getParent() != null) {
            return getParent().getSession();
        }
        return fieldHttpSession;
    }

    public void forward(String inUrl) throws OpenEditException {
        //fieldHasRedirected = true;
        getPageStreamer().forward(inUrl, this);
    }

    public String getParam(String inKey) {
        String val = getRequestParameter(inKey);
        if (val != null) {
            val = URLUtilities.xmlEscape(val);
        }
        return val;
    }

    public String getReferringPage() {
        String referringPage = getRequest().getHeader("referer");

        return referringPage;
    }

    public String getRequestParameter(String inKey) {
        String value = getLocalRequestParameter(inKey);
        if (value == null) {
            if (getRequest() != null) {
                value = getRequest().getParameter(inKey);
            }

            if (value == null && getVariables().containsKey("_jsonRequest")) {
                Object vals = getJsonRequest().get(inKey);
                if (vals instanceof Collection) {
                    Collection array = (Collection) vals;
                    if (array.size() > 0) {
                        value = (String) array.iterator().next();
                    }
                } else {
                    value = (String) vals;
                }
            }
        }
        if (value != null && value.length() == 0) {
            value = null; //null out blank strings
        }
        return value;
    }

    public String getLocalRequestParameter(String inKey) {
        String value = null;
        if (getLocalParameters().containsKey(inKey)) {
            Object val = getLocalParameters().get(inKey);
            if (val != null) {
                if (val instanceof String) {
                    value = (String) val;
                } else {
                    String[] vals = (String[]) val;
                    if (vals != null && vals.length > 0) {
                        value = vals[0];
                    }
                }
                return value;
            }
        }
        if (value == null && getParent() != null) {
            return getParent().getLocalRequestParameter(inKey);
        }
        return value;
    }

    /* 
     * @see com.openedit.WebAppContext#getParameterMap()
     */
    public Map getParameterMap() {
        if (getRequest() != null) {
            Map combinedparams = null;
            String[] ordering = getRequest().getParameterValues("fieldorder");
            Enumeration enumeration = getRequest().getParameterNames();
            if (ordering == null) {
                combinedparams = new HashMap(); //unsorted            
            } else {
                combinedparams = ListOrderedMap.decorate(new HashMap());
                //replace the enumartion with a sorted one
                for (int i = 0; i < ordering.length; i++) {
                    String[] allv = getRequest().getParameterValues(ordering[i]);
                    if (allv != null && allv.length == 1) {
                        combinedparams.put(ordering[i], allv[0]);
                    } else {
                        combinedparams.put(ordering[i], allv);
                    }

                }
            }
            while (enumeration.hasMoreElements()) {
                String key = (String) enumeration.nextElement();
                if (ordering != null && combinedparams.containsKey(key)) {
                    continue; //Skip if already in there
                }
                String[] allv = getRequest().getParameterValues(key);
                if (allv != null && allv.length == 1) {
                    combinedparams.put(key, allv[0]);
                } else {
                    combinedparams.put(key, allv);
                }
            }
            if (ordering != null) {
                combinedparams.remove("fieldorder");
            }

            Map locals = getAllLocalParameters();
            combinedparams.putAll(locals);

            //get json stuff
            Map jsonRequest = (Map) getPageValue("_jsonRequest");
            if (jsonRequest != null) {
                combinedparams.putAll(jsonRequest);
            }

            return combinedparams;

        } else {
            Map locals = getAllLocalParameters();
            return locals;
        }

    }

    /*
     * This request is at the end.
     */
    protected LinkedList getParentsAsList() {
        LinkedList parents = new LinkedList();
        BaseWebPageRequest parent = this;
        while (parent != null) {
            parents.addFirst(parent);
            parent = (BaseWebPageRequest) parent.getParent();
        }
        return parents;
    }

    protected Map getLocalParameters() {
        if (fieldParameters == null) {
            fieldParameters = new HashMap();
        }
        return fieldParameters;
    }

    /*
     * Children's params have precedence
     */
    protected Map getAllLocalParameters() {
        Map params = new HashMap();

        for (Iterator iterator = getParentsAsList().iterator(); iterator.hasNext();) {
            BaseWebPageRequest req = (BaseWebPageRequest) iterator.next();
            if (req.fieldParameters != null) {
                params.putAll(req.fieldParameters);
            }
        }
        return params;
    }

    /*
     * Children have precedence
     */
    protected Map getAllVariables() {
        Map vars = new HashMap();

        for (Iterator iterator = getParentsAsList().iterator(); iterator.hasNext();) {
            BaseWebPageRequest req = (BaseWebPageRequest) iterator.next();
            if (req.fieldVariables != null) {
                vars.putAll(req.fieldVariables);
            }
        }
        return vars;
    }

    /* 
     * @see com.openedit.WebAppContext#getRequiredParameter(java.lang.String)
     */
    public String getRequiredParameter(String inParameterName) throws OpenEditException {
        String req = getRequestParameter(inParameterName);
        if (req == null) {
            throw new OpenEditException("Required parameter not found " + inParameterName);
        }
        return req;
    }

    /* 
     * @see com.openedit.WebAppContext#getVariable(java.lang.String)
     */
    public void put(String inKey, Object inValue) throws OpenEditException {
        putPageValue(inKey, inValue);
    }

    public String getSiteRoot() {
        String site = (String) getPageValue("siteRoot");
        if (site == null) {
            site = getContentProperty("siteRoot");
        }
        if (site == null && getRequest() != null) {
            StringBuffer ctx = getRequest().getRequestURL();
            site = ctx.substring(0, ctx.indexOf("/", 8)); //8 comes from https://
        } else if (site == null) {
            site = getRequestParameter("siteRoot");
        }
        return site;
    }

    public Object get(String inKey) {
        return getPageValue(inKey);
    }

    public Object getPageValue(String inKey) {
        Object ret = getVariables().get(inKey);
        if (ret == null && getParent() != null) {
            return getParent().getPageValue(inKey);
        }
        return ret;
    }

    /* 
     * @see com.openedit.WebAppContext#redirect(java.lang.String)
     */
    public void redirect(String inUrl) {
        boolean alreadyRedirected = getPageValue("redirect") != null;
        String home = (String) getPageValue("home");
        if (alreadyRedirected) {
            log.debug(
                    "Previous redirect to " + getPageValue("redirect") + " requested, cannot redirect to " + inUrl);
            return;
        }

        try {
            if (inUrl != null) {
                if (!inUrl.startsWith("http")) {
                    if (inUrl.contains("./")) {
                        inUrl = PathUtilities.resolveRelativePath(inUrl, getPath());
                    }
                    inUrl = home + inUrl;
                }
                log.debug("Redirecting to: " + inUrl);
                putPageValue("redirect", inUrl);
                if (getResponse() != null) {
                    getResponse().sendRedirect(inUrl);
                } else {
                    log.error("No response set");
                }
                setHasRedirected(true);
                setCancelActions(true);
            }
        } catch (IOException e) {
            throw new OpenEditRuntimeException(e);
        }
    }

    /**
     * This was added because a customer needed it for google indexes. 
     * I wonder if we can not just use permenanet redirects all the time?
     * @param inPath
     */
    public void redirectPermanently(String inPath) {
        String home = (String) getPageValue("home");
        try {
            if (inPath != null) {
                log.debug("Perma redirect to: " + inPath);
                if (!inPath.startsWith("http")) {
                    inPath = home + inPath;
                }
                putPageValue("redirect", inPath);
                if (getResponse() != null) {
                    getResponse().setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
                    getResponse().setHeader("Location", inPath);
                    getResponse().flushBuffer();
                } else {
                    log.error("No response set");
                }
                setHasRedirected(true);
            }
        } catch (IOException e) {
            throw new OpenEditRuntimeException(e);
        }

    }

    protected Map getVariables() {
        if (fieldVariables == null) {
            fieldVariables = new HashMap();
            fieldVariables.put("context", this);
        }
        return fieldVariables;
    }

    /** 
     * @see com.openedit.WebAppContext#setVariable(java.lang.String, java.lang.Object)
     */
    public void putPageValue(String inKey, Object inObject) {
        if (getProtectedFields().contains(inKey) && getParent() != null) {
            throw new RuntimeException("Restricted variables can only be set at the root level");
        }
        if (inObject == null) {
            getVariables().remove(inKey);
        } else {
            getVariables().put(inKey, inObject);
        }
    }

    public void putProtectedPageValue(String inKey, Object inObject) {
        getProtectedFields().remove(inKey);
        putPageValue(inKey, inObject);
        getProtectedFields().add(inKey);
    }

    /* 
     * @see com.openedit.WebAppContext#removeVariable(java.lang.String)
     */
    public void removePageValue(String inKey) {
        getVariables().remove(inKey);
    }

    public void setRequest(HttpServletRequest inReq) {
        fieldHttpServletRequest = inReq;
    }

    public void setResponse(HttpServletResponse inRes) {
        fieldHttpServletResponse = inRes;
    }

    public void setSession(HttpSession inS) {
        fieldHttpSession = inS;
    }

    /* 
     * @see com.openedit.WebPageContext#setRequestParameter(java.lang.String, java.lang.String)
     */
    public void setRequestParameter(String inKey, String inValue) {
        if (inValue == null) {
            getLocalParameters().remove(inKey);
        } else {
            getLocalParameters().put(inKey, inValue);
        }
    }

    public void setRequestParameter(String inKey, String[] inValue) {
        getLocalParameters().put(inKey, inValue);
    }

    /* 
     * @see com.openedit.WebPageContext#getVariableMap()
     */
    public Map getPageMap() {
        Map combined = new HashMap();
        if (getParent() != null) {
            combined.putAll(getParent().getPageMap());
        }
        if (fieldVariables != null) {
            combined.putAll(getVariables());
        }
        return combined;
    }

    /* 
     * @see com.openedit.WebPageContext#getRequestParameters(java.lang.String)
     */
    public String[] getRequestParameters(String inKey) {
        Object parameter = null;
        if (getLocalParameters().containsKey(inKey)) {
            parameter = getLocalParameters().get(inKey);
        }
        if (parameter == null && getParent() != null) {
            parameter = getParent().getRequestParameters(inKey);
        }
        if (parameter == null && getRequest() != null) {
            parameter = getRequest().getParameterValues(inKey);
        }
        if (parameter == null && getVariables().containsKey("_jsonRequest")) {
            parameter = getJsonRequest().get(inKey);
            if (parameter instanceof Collection) {
                Collection col = (Collection) parameter;
                return (String[]) col.toArray(new String[col.size()]);
            }
        }

        if (parameter instanceof String[] || parameter == null) {
            return (String[]) parameter;
        }
        return new String[] { (String) parameter };
    }

    /* 
     * @see com.openedit.WebPageContext#getStoredVariable(java.lang.String)
     */
    public Object getSessionValue(String inKey) {
        if (inKey == null) {
            return null;
        }
        HttpSession session = getSession();
        if (session == null) {
            return getSessionValues().get(inKey);
        }
        return session.getAttribute(inKey);
    }

    /* 
     * @see com.openedit.WebPageContext#setStoredVariable(java.lang.String, java.lang.Object)
     */
    public void putSessionValue(String inKey, Object inObject) {
        if (getSession() == null) {
            if (inObject == null) {
                getSessionValues().remove(inKey);
            } else {
                getSessionValues().put(inKey, inObject);
            }
            return;
        }
        if (inObject == null) {
            getSession().removeAttribute(inKey);
        } else {
            getSession().setAttribute(inKey, inObject);
        }
        //All session values also go in page values
        putPageValue(inKey, inObject);
    }

    /* 
     * @see com.openedit.WebPageContext#removeStoredVariable(java.lang.String)
     */
    public void removeSessionValue(String inKey) {
        if (getSession() != null) {
            getSession().removeAttribute(inKey);
        } else {
            getSessionValues().remove(inKey);
        }
    }

    public String getPath() {
        if (getPage() == null) {
            return null;
        }
        return getPage().getPath();
    }

    /**
     * TODO: copy this to standard WebPageContext API
     * @param inMap
     */
    public void putSessionValues(SessionMap inMap) {
        for (Iterator iter = inMap.keySet().iterator(); iter.hasNext();) {
            String key = (String) iter.next();
            putSessionValue(key, inMap.get(key));
        }
    }

    /**
     * TODO: copy this to standard WebPageContext API
     * @param inMap
     */
    public void putPageValues(Map inMap) {
        getVariables().putAll(inMap);
    }

    /* (non-javadoc)
     * @see com.openedit.WebPageContext#getPathUrl()
     */
    public String getPathUrl() {
        URLUtilities util = (URLUtilities) get(URL_UTILITIES);
        if (util == null) {
            return null;
        }
        return util.requestPathWithArguments();
    }

    public String getPathUrlWithoutContext() {
        URLUtilities util = (URLUtilities) get(URL_UTILITIES);
        if (util == null) {
            return null;
        }
        return util.requestPathWithArgumentsNoContext();
    }

    public OutputStream getOutputStream() {
        return getPageStreamer().getOutput().getStream();
    }

    public Writer getWriter() {
        return getPageStreamer().getOutput().getWriter();
    }

    public PageStreamer getPageStreamer() {
        return (PageStreamer) getPageValue(PAGES);
    }

    public void putPageStreamer(PageStreamer inStreamer) {
        putPageValue(PAGES, inStreamer);
    }

    public Page getPage() {
        Page content = (Page) getPageValue(PAGE);
        return content;
    }

    public void setPage(Page inPage) {
        putPageValue(PAGE, inPage);
    }

    public Page getContentPage() {
        Page content = (Page) getPageValue(CONTENT);
        return content;
    }

    /**
     * This is used only if getSession() is null
     * @return
     */
    protected Map getSessionValues() {
        if (fieldBackUpSession == null) {
            fieldBackUpSession = new HashMap();
        }
        return fieldBackUpSession;
    }

    /* (non-javadoc)
     * @see com.openedit.WebPageContext#hasRedirected()
     */
    public boolean hasRedirected() {
        return fieldHasRedirected;
    }

    public void setHasRedirected(boolean inBol) {
        fieldHasRedirected = inBol;
    }

    /**
     * @param inOutputStream
     */
    public void setWriter(Writer inOutputStream) {
        putProtectedPageValue(OUTPUT_WRITER, inOutputStream);
    }

    /**
     * Determine whether this page can be edited by the given user.  The page is editable if:
     * 
     * <ul>
     * <li>
     * the page's repository is not read-only;
     * </li>
     * <li>
     * the "editable" property is not present or equal to "true"; and
     * </li>
     * <li>
     * the edit filter is not present or passes the given user.
     * </li>
     * </ul>
     * 
     *
     * @param inUser The user to query
     * @param inContext DOCME
     *
     * @return boolean  <code>true</code> if the page is editable by the user, <code>false</code>
     *          if not
     *
     * @throws OpenEditException DOCME
     */
    public boolean isEditable() {
        //      Boolean canedit = (Boolean)getPageValue("canedit");
        //      if( canedit != null)
        //      {
        //         return canedit.booleanValue();
        //      }
        return fieldEditable;
    }

    public void setEditable(boolean inEditable) {
        fieldEditable = inEditable;
    }

    public String[] getRequestActions() {
        String[] actions = getRequestParameters("oe-action");
        //      if ( actions == null)
        //      {
        //         actions = getRequestParameters( "wsp-action" );  //to support OE 3.0
        //      }
        return actions;
    }

    /* (non-javadoc)
     * @see com.openedit.WebPageRequest#copy()
     */
    public WebPageRequest copy() {
        return new BaseWebPageRequest(this);
    }

    /* (non-javadoc)
     * @see com.openedit.WebPageRequest#copy(com.openedit.page.Page)
     */
    public WebPageRequest copy(Page inPage) {
        BaseWebPageRequest req = new BaseWebPageRequest(this);
        req.putProtectedPageValue(PageRequestKeys.PAGE, inPage);
        return req;
    }

    /* (non-javadoc)
     * @see com.openedit.WebPageRequest#setUser(com.openedit.users.User)
     */
    public void setUser(User inUser) {
        if (inUser == null) {
            getVariables().remove(USER);
            if (getParent() != null) {
                getParent().setUser(null);
            }
        } else {
            putPageValue(USER, inUser);
        }
    }

    public User getUser() {
        User user = (User) getPageValue(USER);
        //      if( user == null)
        //      {
        //         String catalogid = findValue("catalogid");
        //         user = (User) getSessionValue(catalogid + "user");
        //      }
        return user;
    }

    /**
     * @param inPage
     */
    public void setContentPage(Page inPage) {
        putPageValue(CONTENT, inPage);
    }

    /* (non-javadoc)
     * @see com.openedit.WebPageRequest#setCurrentAction(com.openedit.page.PageAction)
     */
    public void setCurrentAction(PageAction inAction) {
        putPageValue("exec-action", inAction);
    }

    /* (non-javadoc)
     * @see com.openedit.WebPageRequest#getCurrentAction()
     */
    public PageAction getCurrentAction() {
        return (PageAction) getPageValue("exec-action");
    }

    public String toString() {
        Object ret = getVariables().get("page");
        if (ret != null) {
            return "page=" + ret.toString();
        } else if (getParent() != null) {
            return "child of " + getParent().toString();
        }
        return "no parent";
    }

    public String getContentProperty(String inKey) {
        Page page = getContentPage();
        String locale = getLocale();
        String prop = page.getProperty(inKey, locale);
        return prop;
    }

    public String getPageProperty(String inKey) {
        Page page = getPage();
        String locale = getLocale();
        String prop = page.getProperty(inKey, locale);
        return prop;
    }

    public String getLocale() {
        String locale = (String) getPageValue("sessionlocale");
        //      if( locale == null || locale.length() == 0)
        //      {
        //         User user = getUser();
        //         if( user != null)
        //         {
        //            //locale = (String)user.get("locale");
        //         }
        //      }
        //TODO Cache this
        if (locale == null || locale.length() == 0) {
            if (fieldLocale != null) {
                return fieldLocale;
            }
            Browser browser = (Browser) getPageValue("browser");
            if (browser != null && browser.getLocale() != null) {
                locale = browser.getLocale().toString();
            }
            fieldLocale = locale;
        }
        if (locale == null) {
            locale = "en_US";
        }
        return locale;
    }

    public String getLanguage() {
        String language = getLocale();
        if (language != null) {
            int unds = language.indexOf('_');
            if (unds > -1) {
                language = language.substring(0, unds);
            }
        }
        return language;
    }

    public boolean hasForwarded() {
        return fieldHasForwarded;
    }

    public void setHasForwarded(boolean inB) {
        fieldHasForwarded = inB;
    }

    /**
     * WARNING! does not return null
     */
    public String getUserName() {
        User user = getUser();
        if (user != null) {
            return user.getUserName();
        }
        return "anonymous";
    }

    public String findValue(String inName) {
        String name = null;
        PageAction inAction = getCurrentAction();
        if (inAction != null && inAction.getConfig() != null) {
            name = inAction.getChildValue(inName);
            if (name == null) {
                name = inAction.getProperty(inName);
            }
        }
        //TODO: Change the order. The content should go first?
        if (name == null) {
            name = getPage().get(inName);
        }
        if (name == null) {
            name = getContentPage().get(inName);
        }
        if (name == null) {
            //This should not be here. TODO: Create a new API called findReqValue() that gives this top priority
            name = getRequestParameter(inName);
        }
        name = getPage().getPageSettings().replaceProperty(name);
        return name;
    }

    public boolean hasCancelActions() {
        return fieldHasCancelActions;
    }

    public void setCancelActions(boolean inB) {
        fieldHasCancelActions = inB;
    }

    public String getRequestParamsAsList() {
        Map all = getParameterMap();

        StringBuffer list = new StringBuffer();

        for (Iterator iterator = all.keySet().iterator(); iterator.hasNext();) {
            String name = (String) iterator.next();
            Object vals = all.get(name);
            if (vals instanceof String[]) {
                String[] values = (String[]) vals;
                for (int i = 0; i < values.length; i++) {
                    list.append(name);
                    list.append("=");
                    list.append(values[i]);
                    if (i < values.length - 1) {
                        list.append("&");
                    }
                }
            } else {
                list.append(name);
                list.append("=");
                list.append(vals);
            }
            if (iterator.hasNext()) {
                list.append("&");
            }
        }
        return list.toString();
    }

    public String ajax() {
        String id = packageVariables();
        return "varpackageid: '" + id + "'";
    }

    public String ajaxid() {
        String id = packageVariables();
        return id;
    }

    public String rewriteParams() {
        String id = packageVariables();
        return "varpackageid=" + id + "";
    }

    public VariableStore getVariableStore() {
        VariableStore store = (VariableStore) getSessionValue("variablestore");
        if (store == null) {
            store = new VariableStore();
            putSessionValue("variablestore", store);
        }
        return store;
    }

    public String packageVariables() {
        VariablePackage varPackage = new VariablePackage();
        Map allVariables = getAllVariables();

        for (Iterator iterator = allVariables.keySet().iterator(); iterator.hasNext();) {
            String key = (String) iterator.next();
            if (!getProtectedFields().contains(key)
                    //we don't overwrite vars anyway. this might not be necessary
                    && !key.equals("pages") && !key.equals("context")) {
                Object value = allVariables.get(key);
                varPackage.addVariable(key, value);
            }

        }

        String id = getVariableStore().addPackage(varPackage);
        return id;
    }

    public void unpackageVariables() {
        String id = getRequestParameter("varpackageid");
        if (id != null) {
            VariablePackage varPackage = getVariableStore().getPackage(id);
            if (varPackage != null) {
                Map current = getAllVariables();
                Map map = varPackage.getVariables();
                for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
                    String key = (String) iterator.next();

                    if (!current.containsKey(key)) {
                        //log.info("putting page value" + val);
                        Object val = map.get(key);
                        putPageValue(key, val);
                    }

                }
            }
        }
    }

    public String getDate(Date inDate) {

        return getLocaleManager().formatDateForDisplay(inDate, getLocale());
    }

    public String getHours(String inDate) {
        if (inDate == null || inDate.length() == 0) {
            return null;
        }

        Date date = getLocaleManager().getDateStorageUtil().parseFromStorage(inDate);
        if (date == null) {
            return null;
        }

        return String.valueOf(date.getHours());
    }

    public String getMinutes(String inDate) {
        if (inDate == null) {
            return null;
        }
        Date date = getLocaleManager().getDateStorageUtil().parseFromStorage(inDate);
        if (date == null) {
            return null;
        }
        return String.valueOf(date.getMinutes());
    }

    public String getDate(String inStorageFormat) {
        return getLocaleManager().formatDateForDisplay(inStorageFormat, getLocale());
    }

    public String getDateTime(Date inDate) {
        return getLocaleManager().formatDateTimeForDisplay(inDate, getLocale());
    }

    public String getDateTime(String inStorageFormat) {
        return getLocaleManager().formatDateTimeForDisplay(inStorageFormat, getLocale());
    }

    public String getText(String inKey) {
        String text = getPage().getText(inKey, getLocale());
        return text;
    }

    public LocaleManager getLocaleManager() {
        if (fieldLocaleManager == null) {
            fieldLocaleManager = new LocaleManager();
        }
        return fieldLocaleManager;
    }

    public void setLocaleManager(LocaleManager inLocaleManager) {
        fieldLocaleManager = inLocaleManager;
    }

    public boolean isSecure() {
        if (getRequest() == null) {
            return false;
        }
        return getRequest().isSecure();
    }

    public UserProfile getUserProfile() {
        if (fieldUserProfile == null) {
            fieldUserProfile = (UserProfile) getPageValue("userprofile");
            if (fieldUserProfile == null && getParent() != null) {
                fieldUserProfile = getParent().getUserProfile();
            }
        }
        return fieldUserProfile;
    }

    public void setUserProfile(UserProfile inUserProfile) {
        fieldUserProfile = inUserProfile;
    }

    public String getUserProfileValue(String inKey) {
        if (getUserProfile() == null) {
            return null;
        }
        String val = getUserProfile().get(inKey);
        return val;
    }

    @Override
    public void putAllRequestParameters(Map inArgs) {
        getLocalParameters().putAll(inArgs);

    }

    public String getMethod() {
        if (getRequest() != null) {
            return getRequest().getMethod();
        }

        return null;
    }

    public void setMethod(String inMethod) {
        //NOOP
    }

}