KickJava   Java API By Example, From Geeks To Geeks.

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


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.IComponent;
24 import org.apache.tapestry.IDirect;
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  * Implementation of the direct service, which encodes the page and component id in the service
37  * context, and passes application-defined parameters as well.
38  *
39  * @author Howard Lewis Ship
40  * @since 1.0.9
41  */

42
43 public class DirectService implements IEngineService
44 {
45     /** @since 4.0 */
46     private ResponseRenderer _responseRenderer;
47
48     /** @since 4.0 */
49     private LinkFactory _linkFactory;
50
51     /** @since 4.0 */
52     private WebRequest _request;
53
54     public ILink getLink(IRequestCycle cycle, Object JavaDoc parameter)
55     {
56         Defense.isAssignable(parameter, DirectServiceParameter.class, "parameter");
57
58         DirectServiceParameter dsp = (DirectServiceParameter) parameter;
59
60         IComponent component = dsp.getDirect();
61
62         // New since 1.0.1, we use the component to determine
63
// the page, not the cycle. Through the use of tricky
64
// things such as Block/InsertBlock, it is possible
65
// that a component from a page different than
66
// the response page will render.
67
// In 1.0.6, we start to record *both* the render page
68
// and the component page (if different).
69

70         IPage activePage = cycle.getPage();
71         IPage componentPage = component.getPage();
72
73         Map JavaDoc parameters = new HashMap JavaDoc();
74
75         boolean stateful = _request.getSession(false) != null;
76
77         parameters.put(ServiceConstants.SERVICE, Tapestry.DIRECT_SERVICE);
78         parameters.put(ServiceConstants.PAGE, activePage.getPageName());
79         parameters.put(ServiceConstants.COMPONENT, component.getIdPath());
80         parameters.put(ServiceConstants.CONTAINER, componentPage == activePage ? null
81                 : componentPage.getPageName());
82         parameters.put(ServiceConstants.SESSION, stateful ? "T" : null);
83         parameters.put(ServiceConstants.PARAMETER, dsp.getServiceParameters());
84
85         return _linkFactory.constructLink(cycle, parameters, true);
86     }
87
88     public void service(IRequestCycle cycle) throws IOException JavaDoc
89     {
90         String JavaDoc componentId = cycle.getParameter(ServiceConstants.COMPONENT);
91         String JavaDoc componentPageName = cycle.getParameter(ServiceConstants.CONTAINER);
92         String JavaDoc activePageName = cycle.getParameter(ServiceConstants.PAGE);
93         boolean activeSession = cycle.getParameter(ServiceConstants.SESSION) != null;
94
95         IPage page = cycle.getPage(activePageName);
96
97         cycle.activate(page);
98
99         IPage componentPage = componentPageName == null ? page : cycle.getPage(componentPageName);
100
101         IComponent component = componentPage.getNestedComponent(componentId);
102
103         IDirect direct = null;
104
105         try
106         {
107             direct = (IDirect) component;
108         }
109         catch (ClassCastException JavaDoc ex)
110         {
111             throw new ApplicationRuntimeException(EngineMessages.wrongComponentType(
112                     component,
113                     IDirect.class), component, null, ex);
114         }
115
116         // Check for a StaleSession only when the session was stateful when
117
// the link was created.
118

119         if (activeSession && direct.isStateful())
120         {
121             WebSession session = _request.getSession(false);
122
123             if (session == null || session.isNew())
124                 throw new StaleSessionException(EngineMessages.requestStateSession(direct),
125                         componentPage);
126         }
127
128         Object JavaDoc[] parameters = _linkFactory.extractListenerParameters(cycle);
129
130         cycle.setListenerParameters(parameters);
131
132         direct.trigger(cycle);
133
134         // Render the response. This will be the active page
135
// unless the direct component (or its delegate) changes it.
136

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