1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.tiles.servlet.context;
23
24 import java.io.IOException;
25
26 import javax.servlet.ServletContext;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.http.HttpServletRequest;
30
31 import org.apache.tiles.ArrayStack;
32 import org.apache.tiles.TilesApplicationContext;
33 import org.apache.tiles.TilesContainer;
34 import org.apache.tiles.access.TilesAccess;
35 import org.apache.tiles.context.TilesRequestContext;
36 import org.apache.tiles.context.TilesRequestContextWrapper;
37 import org.apache.tiles.impl.NoSuchContainerException;
38 import org.apache.tiles.util.TilesIOException;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42
43
44
45
46
47
48
49 public final class ServletUtil {
50
51
52
53
54 public static final String COMPOSE_STACK_ATTRIBUTE_NAME = "org.apache.tiles.template.COMPOSE_STACK";
55
56
57
58
59
60 public static final String FORCE_INCLUDE_ATTRIBUTE_NAME =
61 "org.apache.tiles.servlet.context.ServletTilesRequestContext.FORCE_INCLUDE";
62
63
64
65
66 public static final String CURRENT_CONTAINER_ATTRIBUTE_NAME =
67 "org.apache.tiles.servlet.context.ServletTilesRequestContext.CURRENT_CONTAINER_KEY";
68
69
70
71
72 private ServletUtil() {
73 }
74
75
76
77
78
79
80
81
82 public static boolean isForceInclude(HttpServletRequest request) {
83 Boolean retValue = (Boolean) request
84 .getAttribute(ServletUtil.FORCE_INCLUDE_ATTRIBUTE_NAME);
85 return retValue != null && retValue.booleanValue();
86 }
87
88
89
90
91
92
93
94
95
96 public static void setForceInclude(HttpServletRequest request,
97 boolean forceInclude) {
98 Boolean retValue = Boolean.valueOf(forceInclude);
99 request.setAttribute(
100 ServletUtil.FORCE_INCLUDE_ATTRIBUTE_NAME,
101 retValue);
102 }
103
104
105
106
107
108
109
110
111 public static TilesContainer getContainer(ServletContext context) {
112 return getContainer(context, TilesAccess.CONTAINER_ATTRIBUTE);
113 }
114
115
116
117
118
119
120
121
122
123
124 public static TilesContainer getContainer(ServletContext context, String key) {
125 if (key == null) {
126 key = TilesAccess.CONTAINER_ATTRIBUTE;
127 }
128 return (TilesContainer) context.getAttribute(key);
129 }
130
131
132
133
134
135
136
137
138 public static void setContainer(ServletContext context,
139 TilesContainer container) {
140 setContainer(context, container, TilesAccess.CONTAINER_ATTRIBUTE);
141 }
142
143
144
145
146
147
148
149
150
151 public static void setContainer(ServletContext context,
152 TilesContainer container, String key) {
153 Logger log = LoggerFactory.getLogger(ServletUtil.class);
154 if (key == null) {
155 key = TilesAccess.CONTAINER_ATTRIBUTE;
156 }
157
158 if (container == null) {
159 if (log.isInfoEnabled()) {
160 log.info("Removing TilesContext for context: " + context.getClass().getName());
161 }
162 context.removeAttribute(key);
163 }
164 if (container != null && log.isInfoEnabled()) {
165 log.info("Publishing TilesContext for context: " + context.getClass().getName());
166 }
167 context.setAttribute(key, container);
168 }
169
170
171
172
173
174
175
176
177
178 public static void setCurrentContainer(ServletRequest request,
179 ServletContext context, String key) {
180 TilesContainer container = getContainer(context, key);
181 if (container != null) {
182 request.setAttribute(CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
183 } else {
184 throw new NoSuchContainerException("The container with the key '"
185 + key + "' cannot be found");
186 }
187 }
188
189
190
191
192
193
194
195
196
197 public static void setCurrentContainer(ServletRequest request,
198 ServletContext context, TilesContainer container) {
199 if (container != null) {
200 request.setAttribute(CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
201 } else {
202 throw new NoSuchContainerException("The container cannot be null");
203 }
204 }
205
206
207
208
209
210
211
212
213
214 public static TilesContainer getCurrentContainer(ServletRequest request,
215 ServletContext context) {
216 TilesContainer container = (TilesContainer) request
217 .getAttribute(CURRENT_CONTAINER_ATTRIBUTE_NAME);
218 if (container == null) {
219 container = getContainer(context);
220 request.setAttribute(CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
221 }
222
223 return container;
224 }
225
226
227
228
229
230
231
232
233
234 public static IOException wrapServletException(ServletException ex,
235 String message) {
236 IOException retValue;
237 Throwable rootCause = ex.getRootCause();
238 if (rootCause != null) {
239
240
241 retValue = new TilesIOException(message, rootCause);
242 } else {
243 retValue = new TilesIOException(message, ex);
244 }
245
246 return retValue;
247 }
248
249
250
251
252
253
254
255
256
257 @SuppressWarnings("unchecked")
258 public static ArrayStack<Object> getComposeStack(HttpServletRequest request) {
259 ArrayStack<Object> composeStack = (ArrayStack<Object>) request.getAttribute(
260 COMPOSE_STACK_ATTRIBUTE_NAME);
261 if (composeStack == null) {
262 composeStack = new ArrayStack<Object>();
263 request.setAttribute(COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
264 }
265 return composeStack;
266 }
267
268
269
270
271
272
273
274
275
276
277 public static ServletTilesRequestContext getServletRequest(TilesRequestContext request) {
278 TilesRequestContext currentRequest = request;
279 while (true) {
280 if (currentRequest == null) {
281 throw new NotAServletEnvironmentException("Last Tiles request context is null");
282 }
283
284 if (currentRequest instanceof ServletTilesRequestContext) {
285 return (ServletTilesRequestContext) currentRequest;
286 }
287 if (!(currentRequest instanceof TilesRequestContextWrapper)) {
288 throw new NotAServletEnvironmentException("Not a Servlet environment, not supported");
289 }
290 currentRequest = ((TilesRequestContextWrapper) currentRequest).getWrappedRequest();
291 }
292 }
293
294
295
296
297
298
299
300
301
302
303 public static ServletContext getServletContext(TilesApplicationContext applicationContext) {
304 if (applicationContext instanceof ServletTilesApplicationContext) {
305 return (ServletContext) ((ServletTilesApplicationContext) applicationContext).getContext();
306 }
307
308 throw new NotAServletEnvironmentException("Not a Servlet-based environment");
309 }
310 }