/*
* Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com)
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: StateStoreSession.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.engine;
import com.uwyn.rife.config.RifeConfig;
import com.uwyn.rife.engine.exceptions.EngineException;
import com.uwyn.rife.tools.UniqueID;
import com.uwyn.rife.tools.UniqueIDGenerator;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
public class StateStoreSession implements StateStore
{
public static final String IDENTIFIER = "session";
private static final String ATTRIBUTE_STATES_SUFFIX = "\u0000states";
StateStoreSession()
{
}
public void init(Request request)
throws EngineException
{
request.getSession();
}
public void exportQueryUrl(CharSequenceDeferred deferred, String url, FlowState state, ElementInfo source, String type, String name) throws EngineException
{
Request request = RequestState.getActiveRequestState().getRequest();
Response response = RequestState.getActiveRequestState().getResponse();
HttpSession session = request.getSession();
if (state.isEmpty())
{
deferred.setContent(response.encodeURL(url));
return;
}
UniqueID id = UniqueIDGenerator.generate(request.getRemoteAddr());
storeStates(id, session);
session.setAttribute(id.toString(), state);
StringBuilder query_parameters = new StringBuilder("?");
query_parameters.append(ReservedParameters.STATEID);
query_parameters.append("=");
query_parameters.append(id.toString());
deferred.setContent(response.encodeURL(url+query_parameters.toString()));
}
public void exportFormState(CharSequenceDeferred deferred, FlowState state, FormStateType stateType)
throws EngineException
{
Request request = RequestState.getActiveRequestState().getRequest();
HttpSession session = request.getSession();
if (state.isEmpty())
{
deferred.setContent("");
return;
}
UniqueID id = UniqueIDGenerator.generate(request.getRemoteAddr());
storeStates(id, session);
session.setAttribute(id.toString(), state);
StringBuilder form_state = new StringBuilder();
if (FormStateType.PARAMS == stateType)
{
StateStoreTools.appendHtmlHiddenParam(form_state, deferred, ReservedParameters.STATEID, id.toString());
}
else if (FormStateType.JAVASCRIPT == stateType)
{
StateStoreTools.appendJavascriptHeader(form_state);
StateStoreTools.appendJavascriptHiddenParam(form_state, ReservedParameters.STATEID, id.toString());
StateStoreTools.appendJavascriptFooter(form_state);
}
deferred.setContent(form_state.toString());
}
public void exportFormUrl(CharSequenceDeferred deferred, String url) throws EngineException
{
Response response = RequestState.getActiveRequestState().getResponse();
deferred.setContent(response.encodeURL(url));
}
private FlowState getSessionFlowState(Request request)
{
String[] value = request.getParameters().get(ReservedParameters.STATEID);
if (null == value ||
0 == value.length)
{
return null;
}
String state_id = value[0];
HttpSession session = request.getSession(false);
if (null == session)
{
return null;
}
return (FlowState)session.getAttribute(state_id);
}
public Map<String, String[]> restoreParameters(Request request)
throws EngineException
{
FlowState state = getSessionFlowState(request);
if (null == state)
{
return null;
}
Map<String, String[]> result = new LinkedHashMap<String, String[]>();
if (state.hasParameters())
{
result.putAll(state.getParameters());
}
String[] values = null;
for (Map.Entry<String, String[]> entry : request.getParameters().entrySet())
{
values = entry.getValue();
// only override with non empty values
if (values != null &&
(values.length > 1 ||
(values[0] != null && values[0].trim().length() > 0)))
{
result.put(entry.getKey(), values);
}
}
return result;
}
public ResultStates restoreResultStates(Request request)
throws EngineException
{
ResultStates result_states = null;
String[] value = request.getParameters().get(ReservedParameters.STATEID);
if (value != null &&
value.length > 0)
{
String state_id = value[0];
HttpSession session = request.getSession(false);
if (session != null)
{
String states_id = (String)session.getAttribute(state_id+ATTRIBUTE_STATES_SUFFIX);
if (states_id != null &&
states_id.startsWith(ResultStates.ID_PREFIX))
{
result_states = (ResultStates)session.getAttribute(states_id);
if (RifeConfig.Engine.getSessionStateStoreCloning())
{
result_states = result_states.cloneForStateStore(this);
result_states.regenerateId();
}
else
{
session.removeAttribute(states_id);
}
}
}
}
if (null == result_states)
{
result_states = new ResultStates();
}
FlowState flowstate = getSessionFlowState(request);
if (flowstate != null)
{
if (flowstate.hasSubmissionGlobalInputs())
{
ElementResultStateSession result_state = new ElementResultStateSession("");
result_state.setPreservedInputs(flowstate.getSubmissionGlobalInputs());
result_states.put(result_state);
}
if (flowstate.hasSubmissionElementInputs() &&
flowstate.getSubmissionContextId() != null)
{
ElementResultStateSession result_state = new ElementResultStateSession(flowstate.getSubmissionContextId());
result_state.setPreservedInputs(flowstate.getSubmissionElementInputs());
result_states.put(result_state);
}
}
return result_states;
}
public ElementResultState createNewResultState(String contextId)
throws EngineException
{
return new ElementResultStateSession(contextId);
}
public Class getResultStateType()
throws EngineException
{
return ElementResultStateSession.class;
}
protected void storeStates(UniqueID stateId, HttpSession session)
{
ResultStates states = RequestState.getActiveRequestState().getElementResultStatesObtained();
if (null == session.getAttribute(states.getId()))
{
session.setAttribute(states.getId(), states);
}
session.setAttribute(stateId+ATTRIBUTE_STATES_SUFFIX, states.getId());
}
}