1 | |
package org.apache.turbine.services.rundata; |
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
|
20 | |
|
21 | |
|
22 | |
import java.util.HashMap; |
23 | |
import java.util.Iterator; |
24 | |
import java.util.Locale; |
25 | |
import java.util.Map; |
26 | |
|
27 | |
import javax.servlet.ServletConfig; |
28 | |
import javax.servlet.ServletContext; |
29 | |
import javax.servlet.http.HttpServletRequest; |
30 | |
import javax.servlet.http.HttpServletResponse; |
31 | |
|
32 | |
import org.apache.commons.configuration2.Configuration; |
33 | |
import org.apache.fulcrum.parser.CookieParser; |
34 | |
import org.apache.fulcrum.parser.DefaultCookieParser; |
35 | |
import org.apache.fulcrum.parser.DefaultParameterParser; |
36 | |
import org.apache.fulcrum.parser.ParameterParser; |
37 | |
import org.apache.fulcrum.parser.ParserService; |
38 | |
import org.apache.fulcrum.pool.PoolException; |
39 | |
import org.apache.fulcrum.pool.PoolService; |
40 | |
import org.apache.turbine.Turbine; |
41 | |
import org.apache.turbine.services.InitializationException; |
42 | |
import org.apache.turbine.services.TurbineBaseService; |
43 | |
import org.apache.turbine.services.TurbineServices; |
44 | |
import org.apache.turbine.util.RunData; |
45 | |
import org.apache.turbine.util.ServerData; |
46 | |
import org.apache.turbine.util.TurbineException; |
47 | |
|
48 | |
|
49 | |
|
50 | |
|
51 | |
|
52 | |
|
53 | |
|
54 | |
|
55 | |
|
56 | |
|
57 | |
|
58 | |
|
59 | |
public class TurbineRunDataService |
60 | |
extends TurbineBaseService |
61 | |
implements RunDataService |
62 | |
{ |
63 | |
|
64 | |
|
65 | 102 | private static final String DEFAULT_RUN_DATA = |
66 | 102 | DefaultTurbineRunData.class.getName(); |
67 | |
|
68 | |
|
69 | 102 | private static final String DEFAULT_PARAMETER_PARSER = |
70 | 102 | DefaultParameterParser.class.getName(); |
71 | |
|
72 | |
|
73 | 204 | private static final String DEFAULT_COOKIE_PARSER = |
74 | 102 | DefaultCookieParser.class.getName(); |
75 | |
|
76 | |
|
77 | 102 | private final Map<String, Object> configurations = new HashMap<String, Object>(); |
78 | |
|
79 | |
|
80 | 102 | private final Map<String, Class<?>> classCache = new HashMap<String, Class<?>>(); |
81 | |
|
82 | |
|
83 | 102 | private PoolService pool = null; |
84 | |
|
85 | |
|
86 | 102 | private ParserService parserService = null; |
87 | |
|
88 | |
|
89 | |
|
90 | |
|
91 | |
public TurbineRunDataService() |
92 | |
{ |
93 | 102 | super(); |
94 | 102 | } |
95 | |
|
96 | |
|
97 | |
|
98 | |
|
99 | |
|
100 | |
|
101 | |
@Override |
102 | |
public void init() |
103 | |
throws InitializationException |
104 | |
{ |
105 | |
|
106 | 132 | String[] def = new String[] |
107 | |
{ |
108 | |
DEFAULT_RUN_DATA, |
109 | |
DEFAULT_PARAMETER_PARSER, |
110 | |
DEFAULT_COOKIE_PARSER |
111 | |
}; |
112 | 132 | configurations.put(DEFAULT_CONFIG, def.clone()); |
113 | |
|
114 | |
|
115 | 132 | Configuration conf = getConfiguration(); |
116 | 132 | if (conf != null) |
117 | |
{ |
118 | |
String key,value; |
119 | |
String[] config; |
120 | 132 | String[] plist = new String[] |
121 | |
{ |
122 | |
RUN_DATA_KEY, |
123 | |
PARAMETER_PARSER_KEY, |
124 | |
COOKIE_PARSER_KEY |
125 | |
}; |
126 | 132 | for (Iterator<String> i = conf.getKeys(); i.hasNext();) |
127 | |
{ |
128 | 447 | key = i.next(); |
129 | 447 | value = conf.getString(key); |
130 | 1158 | for (int j = 0; j < plist.length; j++) |
131 | |
{ |
132 | 1026 | if (key.endsWith(plist[j]) && key.length() > plist[j].length() + 1) |
133 | |
{ |
134 | 315 | key = key.substring(0, key.length() - plist[j].length() - 1); |
135 | 315 | config = (String[]) configurations.get(key); |
136 | 315 | if (config == null) |
137 | |
{ |
138 | 0 | config = def.clone(); |
139 | 0 | configurations.put(key, config); |
140 | |
} |
141 | 315 | config[j] = value; |
142 | 315 | break; |
143 | |
} |
144 | |
} |
145 | |
} |
146 | |
} |
147 | |
|
148 | 132 | pool = (PoolService)TurbineServices.getInstance().getService(PoolService.ROLE); |
149 | |
|
150 | 132 | if (pool == null) |
151 | |
{ |
152 | 0 | throw new InitializationException("RunData Service requires" |
153 | |
+ " configured Pool Service!"); |
154 | |
} |
155 | |
|
156 | 132 | parserService = (ParserService)TurbineServices.getInstance().getService(ParserService.ROLE); |
157 | |
|
158 | 132 | if (parserService == null) |
159 | |
{ |
160 | 0 | throw new InitializationException("RunData Service requires" |
161 | |
+ " configured Parser Service!"); |
162 | |
} |
163 | |
|
164 | 132 | setInit(true); |
165 | 132 | } |
166 | |
|
167 | |
|
168 | |
|
169 | |
|
170 | |
|
171 | |
|
172 | |
@Override |
173 | |
public void shutdown() |
174 | |
{ |
175 | 132 | classCache.clear(); |
176 | 132 | super.shutdown(); |
177 | 132 | } |
178 | |
|
179 | |
|
180 | |
|
181 | |
|
182 | |
|
183 | |
|
184 | |
|
185 | |
|
186 | |
|
187 | |
|
188 | |
@Override |
189 | |
public RunData getRunData(HttpServletRequest req, |
190 | |
HttpServletResponse res, |
191 | |
ServletConfig config) |
192 | |
throws TurbineException |
193 | |
{ |
194 | 90 | return getRunData(DEFAULT_CONFIG, req, res, config); |
195 | |
} |
196 | |
|
197 | |
|
198 | |
|
199 | |
|
200 | |
|
201 | |
|
202 | |
|
203 | |
|
204 | |
|
205 | |
|
206 | |
|
207 | |
|
208 | |
|
209 | |
@Override |
210 | |
public RunData getRunData(String key, |
211 | |
HttpServletRequest req, |
212 | |
HttpServletResponse res, |
213 | |
ServletConfig config) |
214 | |
throws TurbineException, |
215 | |
IllegalArgumentException |
216 | |
{ |
217 | |
|
218 | |
|
219 | |
|
220 | |
|
221 | |
|
222 | |
|
223 | 90 | if (req == null || res == null || config == null) |
224 | |
{ |
225 | 0 | throw new IllegalArgumentException("HttpServletRequest, " |
226 | |
+ "HttpServletResponse or ServletConfig was null."); |
227 | |
} |
228 | |
|
229 | |
|
230 | 90 | String[] cfg = (String[]) configurations.get(key); |
231 | 90 | if (cfg == null) |
232 | |
{ |
233 | 0 | throw new TurbineException("RunTime configuration '" + key + "' is undefined"); |
234 | |
} |
235 | |
|
236 | |
TurbineRunData data; |
237 | |
try |
238 | |
{ |
239 | 90 | Class<?> runDataClazz = classCache.get(cfg[0]); |
240 | 90 | if (runDataClazz == null) |
241 | |
{ |
242 | 39 | runDataClazz = Class.forName(cfg[0]); |
243 | 39 | classCache.put(cfg[0], runDataClazz); |
244 | |
} |
245 | |
|
246 | 90 | Class<?> parameterParserClazz = classCache.get(cfg[1]); |
247 | 90 | if (parameterParserClazz == null) |
248 | |
{ |
249 | 39 | parameterParserClazz = Class.forName(cfg[1]); |
250 | 39 | classCache.put(cfg[1], parameterParserClazz); |
251 | |
} |
252 | |
|
253 | 90 | Class<?> cookieParserClazz = classCache.get(cfg[2]); |
254 | 90 | if (cookieParserClazz == null) |
255 | |
{ |
256 | 39 | cookieParserClazz = Class.forName(cfg[2]); |
257 | 39 | classCache.put(cfg[2], cookieParserClazz); |
258 | |
} |
259 | |
|
260 | 90 | data = (TurbineRunData) pool.getInstance(runDataClazz); |
261 | |
@SuppressWarnings("unchecked") |
262 | 90 | ParameterParser pp = parserService.getParser((Class<ParameterParser>)parameterParserClazz); |
263 | 90 | data.get(Turbine.class).put(ParameterParser.class, pp); |
264 | |
|
265 | |
@SuppressWarnings("unchecked") |
266 | 90 | CookieParser cp = parserService.getParser((Class<CookieParser>)cookieParserClazz); |
267 | 90 | data.get(Turbine.class).put(CookieParser.class, cp); |
268 | |
|
269 | 90 | Locale locale = req.getLocale(); |
270 | |
|
271 | 90 | if (locale == null) |
272 | |
{ |
273 | |
|
274 | 0 | locale = data.getLocale(); |
275 | |
} |
276 | |
|
277 | |
|
278 | 90 | data.setLocale(locale); |
279 | |
} |
280 | 0 | catch (PoolException pe) |
281 | |
{ |
282 | 0 | throw new TurbineException("RunData configuration '" + key + "' is illegal caused a pool exception", pe); |
283 | |
} |
284 | 0 | catch (ClassNotFoundException | ClassCastException | InstantiationException x) |
285 | |
{ |
286 | 0 | throw new TurbineException("RunData configuration '" + key + "' is illegal", x); |
287 | 90 | } |
288 | |
|
289 | |
|
290 | 90 | data.get(Turbine.class).put(HttpServletRequest.class, req); |
291 | 90 | data.get(Turbine.class).put(HttpServletResponse.class, res); |
292 | |
|
293 | |
|
294 | 90 | data.get(Turbine.class).put(ServletConfig.class, config); |
295 | 90 | data.get(Turbine.class).put(ServletContext.class, config.getServletContext()); |
296 | |
|
297 | |
|
298 | 90 | data.get(Turbine.class).put(ServerData.class, new ServerData(req)); |
299 | |
|
300 | 90 | return data; |
301 | |
} |
302 | |
|
303 | |
|
304 | |
|
305 | |
|
306 | |
|
307 | |
|
308 | |
|
309 | |
@Override |
310 | |
public boolean putRunData(RunData data) |
311 | |
{ |
312 | 3 | if (data instanceof TurbineRunData) |
313 | |
{ |
314 | 3 | parserService.putParser(((TurbineRunData) data).getParameterParser()); |
315 | 3 | parserService.putParser(((TurbineRunData) data).getCookieParser()); |
316 | |
|
317 | 3 | return pool.putInstance(data); |
318 | |
} |
319 | |
else |
320 | |
{ |
321 | 0 | return false; |
322 | |
} |
323 | |
} |
324 | |
} |