KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tapestry > engine > ActionService


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

15 package org.apache.tapestry.engine;
16
17 import java.io.IOException JavaDoc;
18 import java.util.HashMap JavaDoc;
19 import java.util.Map JavaDoc;
20
21 import org.apache.hivemind.ApplicationRuntimeException;
22 import org.apache.hivemind.util.Defense;
23 import org.apache.tapestry.IAction;
24 import org.apache.tapestry.IComponent;
25 import org.apache.tapestry.IPage;
26 import org.apache.tapestry.IRequestCycle;
27 import org.apache.tapestry.StaleSessionException;
28 import org.apache.tapestry.Tapestry;
29 import org.apache.tapestry.services.LinkFactory;
30 import org.apache.tapestry.services.ResponseRenderer;
31 import org.apache.tapestry.services.ServiceConstants;
32 import org.apache.tapestry.web.WebRequest;
33 import org.apache.tapestry.web.WebSession;
34
35 /**
36  * A context-sensitive service related to {@link org.apache.tapestry.form.Form}and
37  * {@link org.apache.tapestry.link.ActionLink}. Encodes the page, component and an action id in the
38  * service context.
39  *
40  * @author Howard Lewis Ship
41  * @since 1.0.9
42  */

43
44 public class ActionService implements IEngineService
45 {
46     /** @since 4.0 */
47     private ResponseRenderer _responseRenderer;
48
49     /** @since 4.0 */
50     private LinkFactory _linkFactory;
51
52     /** @since 4.0 */
53     private static final String JavaDoc ACTION = "action";
54
55     /** @since 4.0 */
56     private WebRequest _request;
57
58     public ILink getLink(IRequestCycle cycle, Object JavaDoc parameter)
59     {
60         Defense.isAssignable(parameter, ActionServiceParameter.class, "parameter");
61
62         ActionServiceParameter asp = (ActionServiceParameter) parameter;
63
64         IComponent component = asp.getComponent();
65         IPage activePage = cycle.getPage();
66         IPage componentPage = component.getPage();
67
68         Map JavaDoc parameters = new HashMap JavaDoc();
69
70         boolean stateful = _request.getSession(false) != null;
71
72         parameters.put(ServiceConstants.SERVICE, Tapestry.ACTION_SERVICE);
73         parameters.put(ServiceConstants.COMPONENT, component.getIdPath());
74         parameters.put(ServiceConstants.PAGE, activePage.getPageName());
75         parameters.put(ServiceConstants.CONTAINER, activePage == componentPage ? null
76                 : componentPage.getPageName());
77         parameters.put(ACTION, asp.getActionId());
78         parameters.put(ServiceConstants.SESSION, stateful ? "T" : null);
79
80         return _linkFactory.constructLink(cycle, parameters, true);
81     }
82
83     public void service(IRequestCycle cycle) throws IOException JavaDoc
84     {
85         String JavaDoc componentId = cycle.getParameter(ServiceConstants.COMPONENT);
86         String JavaDoc componentPageName = cycle.getParameter(ServiceConstants.CONTAINER);
87         String JavaDoc activePageName = cycle.getParameter(ServiceConstants.PAGE);
88         String JavaDoc actionId = cycle.getParameter(ACTION);
89         boolean activeSession = cycle.getParameter(ServiceConstants.SESSION) != null;
90
91         IPage page = cycle.getPage(activePageName);
92
93         // Setup the page for the rewind, then do the rewind.
94

95         cycle.activate(page);
96
97         IPage componentPage = componentPageName == null ? page : cycle.getPage(componentPageName);
98
99         IComponent component = componentPage.getNestedComponent(componentId);
100
101         IAction action = null;
102
103         try
104         {
105             action = (IAction) component;
106         }
107         catch (ClassCastException JavaDoc ex)
108         {
109             throw new ApplicationRuntimeException(EngineMessages.wrongComponentType(
110                     component,
111                     IAction.class), component, null, ex);
112         }
113
114         // Only perform the stateful check if the application was stateful
115
// when the URL was rendered.
116

117         if (activeSession && action.getRequiresSession())
118         {
119             WebSession session = _request.getSession(false);
120
121             if (session == null || session.isNew())
122                 throw new StaleSessionException(EngineMessages.requestStateSession(component),
123                         componentPage);
124
125         }
126
127         cycle.rewindPage(actionId, action);
128
129         // During the rewind, a component may change the page. This will take
130
// effect during the second render, which renders the HTML response.
131

132         // Render that response.
133

134         _responseRenderer.renderResponse(cycle);
135     }
136
137     public String JavaDoc getName()
138     {
139         return Tapestry.ACTION_SERVICE;
140     }
141
142     /** @since 4.0 */
143     public void setResponseRenderer(ResponseRenderer responseRenderer)
144     {
145         _responseRenderer = responseRenderer;
146     }
147
148     /** @since 4.0 */
149     public void setLinkFactory(LinkFactory linkFactory)
150     {
151         _linkFactory = linkFactory;
152     }
153
154     /** @since 4.0 */
155     public void setRequest(WebRequest request)
156     {
157         _request = request;
158     }
159 }
Popular Tags