KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > springframework > webflow > execution > Action


1 /*
2  * Copyright 2002-2006 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.springframework.webflow.execution;
17
18 /**
19  * A command that executes a behavior and returns a logical execution result a
20  * calling flow execution can respond to.
21  * <p>
22  * Actions typically delegate down to the application (or service) layer to
23  * perform business operations. They often retrieve data to support response
24  * rendering. They act as a bridge between a SWF web-tier and your middle-tier
25  * business logic layer.
26  * <p>
27  * When an action completes execution it signals a result event describing the
28  * outcome of that execution (for example, "success", "error", "yes", "no",
29  * "tryAgain", etc). In addition to providing a logical outcome the flow can
30  * respond to, a result event may have payload associated with it, for example a
31  * "success" return value or an "error" error code. The result event is
32  * typically used as grounds for a state transition out of the current state of
33  * the calling Flow.
34  * <p>
35  * Action implementations are often application-scoped singletons instantiated
36  * and managed by a web-tier Spring application context to take advantage of
37  * Spring's externalized configuration and dependency injection capabilities
38  * (which is a form of Inversion of Control [IoC]). Actions may also be stateful
39  * prototypes, storing conversational state as instance variables. Action
40  * instance definitions may also be locally scoped to a specific flow definition
41  * (see use of the "import" element of the root XML flow definition element.)
42  * <p>
43  * Note: Actions are directly instantiatable for use in a standalone test
44  * environment and can be parameterized with mocks or stubs, as they are simple
45  * POJOs. Action proxies may also be generated at runtime for delegating to POJO
46  * business operations that have no dependency on the Spring Web Flow API.
47  * <p>
48  * Note: if an Action is a singleton managed in application scope, take care not
49  * to store and/or modify caller-specific state in a unsafe manner. The Action
50  * {@link #execute(RequestContext)} method runs in an independently executing
51  * thread on each invocation so make sure you deal only with local data or
52  * internal, thread-safe services.
53  * <p>
54  * Note: an Action is not a controller like a Spring MVC controller or a Struts
55  * action is a controller. Flow actions are <i>commands</i>. Such commands do
56  * not select views, they execute arbitrary behavioral logic and then return an
57  * logical execution result. The flow that invokes an Action is responsible for
58  * responding to the execution result to decide what to do next. In Spring Web
59  * Flow, the flow <i>is</i> the controller.
60  *
61  * @author Keith Donald
62  * @author Erwin Vervaet
63  */

64 public interface Action {
65
66     /**
67      * Execute this action. Action execution will occur in the context of a
68      * request associated with an active flow execution.
69      * <p>
70      * Action invocation is typically triggered in a production environment by a
71      * state within a flow carrying out the execution of a flow definition. The
72      * result of action execution, a logical outcome event, can be used as
73      * grounds for a transition out of the calling state.
74      * <p>
75      * Note: The {@link RequestContext} argument to this method provides access
76      * to data about the active flow execution in the context of the currently
77      * executing thread. Among other things, this allows this action to access
78      * {@link RequestContext#getRequestScope() data} set by other actions, as
79      * well as set its own attributes it wishes to expose in a given scope.
80      * <p>
81      * Some notes about actions and their usage of the attribute scope types:
82      * <ul>
83      * <li>Attributes set in
84      * {@link RequestContext#getRequestScope() request scope} exist for the life
85      * of the currently executing request only.
86      * <li>Attributes set in {@link RequestContext#getFlashScope() flash scope}
87      * exist until the next external user event is signaled. That time includes
88      * the current request plus any redirect or additional refreshes to the next
89      * view.
90      * <li>Attributes set in {@link RequestContext#getFlowScope() flow scope}
91      * exist for the life of the flow session and will be
92      * cleaned up automatically when the flow session ends.
93      * <li>Attributes set in
94      * {@link RequestContext#getConversationScope() conversation scope} exist
95      * for the life of the entire flow execution representing a single logical
96      * "conversation" with a user.
97      * </ul>
98      * <p>
99      * All attributes present in any scope are typically exposed in a model
100      * for access by a view when an "interactive" state type such as a view
101      * state is entered.
102      * <p>
103      * Note: flow scope should generally not be used as a general purpose cache,
104      * but rather as a context for data needed locally by other states of the
105      * flow this action participates in. For example, it would be inappropriate
106      * to stuff large collections of objects (like those returned to support a
107      * search results view) into flow scope. Instead, put such result
108      * collections in request scope, and ensure you execute this action again
109      * each time you wish to view those results. 2nd level caches managed
110      * outside of SWF are more general cache solutions.
111      * <p>
112      * Note: as flow scoped attributes are eligible for serialization they
113      * should be <code>Serializable</code>.
114      *
115      * @param context the action execution context, for accessing and setting
116      * data in a {@link ScopeType scope type}, as well as obtaining other flow
117      * contextual information (e.g. request context attributes and flow
118      * execution context information)
119      * @return a logical result outcome, used as grounds for a transition in the
120      * calling flow (e.g. "success", "error", "yes", "no", * ...)
121      * @throws Exception a exception occured during action execution, either
122      * checked or unchecked; note, any <i>recoverable</i> exceptions should be
123      * caught within this method and an appropriate result outcome returned
124      * <i>or</i> be handled by the current state of the calling flow execution.
125      */

126     public Event execute(RequestContext context) throws Exception JavaDoc;
127 }
Popular Tags