org.springframework.webflow.execution.RequestContext Maven / Gradle / Ivy
/*
* Copyright 2004-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.webflow.execution;
import org.springframework.webflow.context.ExternalContext;
import org.springframework.webflow.core.collection.AttributeMap;
import org.springframework.webflow.core.collection.MutableAttributeMap;
import org.springframework.webflow.core.collection.ParameterMap;
import org.springframework.webflow.definition.FlowDefinition;
import org.springframework.webflow.definition.StateDefinition;
import org.springframework.webflow.definition.TransitionDefinition;
/**
* A context for a single request to manipulate a flow execution. Allows Web Flow users to access contextual information
* about the executing request, as well as the governing {@link #getFlowExecutionContext() active flow execution}.
*
* The term request is used to describe a single call (thread) into the flow system by an external actor to
* manipulate exactly one flow execution.
*
* A new instance of this object is typically created when one of the core operations supported by a flow execution is
* invoked, either start
to launch the flow execution, signalEvent
to resume the flow
* execution, or refresh
to reconstitute the flow execution's last view selection for purposes of
* reissuing a user response.
*
* Once created this context object is passed around throughout flow execution request processing where it may be
* accessed and reasoned upon by SWF-internal artifacts such as states, user-implemented action code, and state
* transition criteria.
*
* When a call into a flow execution returns this object goes out of scope and is disposed of automatically. Thus a
* request context is an internal artifact used within a FlowExecution: this object is not exposed to external client
* code, e.g. a view implementation (JSP).
*
* The {@link #getRequestScope() requestScope} property may be used as a store for arbitrary data that should exist for
* the life of this object. Request-scoped data, along with all data in {@link #getFlashScope() flash scope},
* {@link #getFlowScope() flow scope} and {@link #getConversationScope() conversation scope} is available for exposing
* to view templates via a {@link #getModel() model} property.
*
* The web flow system will ensure that a RequestContext object is local to the current thread. It can be safely
* manipulated without needing to worry about concurrent access.
*
* Note: this request context is in no way linked to an HTTP or Portlet request. It uses the familiar "request" naming
* convention to indicate a single call to manipulate a runtime execution of a flow definition.
*
* @author Keith Donald
* @author Erwin Vervaet
*/
public interface RequestContext {
/**
* Returns the definition of the flow that is currently executing.
* @return the flow definition for the active session
* @throws IllegalStateException if the flow execution has not been started at all, or if the execution has ended
* and is no longer actively executing
*/
public FlowDefinition getActiveFlow() throws IllegalStateException;
/**
* Returns the current state of the executing flow. May return null
if this flow execution is in the
* process of starting and has not yet entered its start state.
* @return the current state, or null
if in the process of starting
* @throws IllegalStateException if this flow execution has not been started at all, or if this execution has ended
* and is no longer actively executing
*/
public StateDefinition getCurrentState() throws IllegalStateException;
/**
* Returns a mutable accessor for accessing and/or setting attributes in request scope. Request scoped attributes
* exist for the duration of this request only.
* @return the request scope
*/
public MutableAttributeMap getRequestScope();
/**
* Returns a mutable accessor for accessing and/or setting attributes in flash scope. Flash scoped attributes
* exist untill the next event is signaled in the flow execution.
* @return the flash scope
*/
public MutableAttributeMap getFlashScope();
/**
* Returns a mutable accessor for accessing and/or setting attributes in flow scope. Flow scoped attributes exist
* for the life of the active flow session.
* @return the flow scope
* @see FlowSession
*/
public MutableAttributeMap getFlowScope();
/**
* Returns a mutable accessor for accessing and/or setting attributes in conversation scope. Conversation scoped
* attributes exist for the life of the executing flow and are shared across all flow sessions.
* @return the conversation scope
* @see FlowExecutionContext
*/
public MutableAttributeMap getConversationScope();
/**
* Returns the immutable input parameters associated with this request into Spring Web Flow. The map returned is
* immutable and cannot be changed.
*
* This is typically a convenient shortcut for accessing the {@link ExternalContext#getRequestParameterMap()}
* directly.
* @see #getExternalContext()
*/
public ParameterMap getRequestParameters();
/**
* Returns the external client context that originated (or triggered) this request.
*
* Acting as a facade, the returned context object provides a single point of access to the calling client's
* environment. It provides normalized access to attributes of the client environment without tying you to specific
* constructs within that environment.
*
* In addition, this context may be downcastable to a specific context type for a specific client environment, such
* as a {@link org.springframework.webflow.context.servlet.ServletExternalContext} for servlets or a
* {@link org.springframework.webflow.context.portlet.PortletExternalContext} for portlets. Such downcasting will
* give you full access to a native HttpServletRequest, for example. With that said, for portability reasons you
* should avoid coupling your flow artifacts to a specific deployment environment when possible.
* @return the originating external context, the one that triggered the current execution request
*/
public ExternalContext getExternalContext();
/**
* Returns contextual information about the flow execution itself. Information in this context typically spans more
* than one request.
* @return the flow execution context
*/
public FlowExecutionContext getFlowExecutionContext();
/**
* Returns the last event signaled during this request. The event may or may not have caused a state transition to
* happen.
* @return the last signaled event, or null if no event has been signaled yet
*/
public Event getLastEvent();
/**
* Returns the last state transition that executed in this request.
* @return the last transition, or null
if no transition has occured yet
*/
public TransitionDefinition getLastTransition();
/**
* Returns a context map for accessing arbitrary attributes about the state of the current request. These attributes
* may be used to influence flow execution behavior.
* @return the current attributes of this request, or empty if not set
*/
public AttributeMap getAttributes();
/**
* Set the contextual attributes describing the state of this request. Overwrites any pre-existing collection.
* @param attributes the attributes
*/
public void setAttributes(AttributeMap attributes);
/**
* Returns the data model capturing the state of this context, suitable for exposing to clients (mostly web views).
* Typically the model will contain the union of the data available in request, flash, session and conversation
* scope.
* @return the model that can be exposed to a client view for rendering purposes
*/
public AttributeMap getModel();
}