001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.services.impl;
016
017 import java.util.HashMap;
018 import java.util.Iterator;
019 import java.util.List;
020 import java.util.Locale;
021 import java.util.Map;
022
023 import org.apache.hivemind.ApplicationRuntimeException;
024 import org.apache.hivemind.ClassResolver;
025 import org.apache.hivemind.ErrorLog;
026 import org.apache.hivemind.Resource;
027 import org.apache.hivemind.service.ThreadLocale;
028 import org.apache.hivemind.util.Defense;
029 import org.apache.tapestry.IRequestCycle;
030 import org.apache.tapestry.asset.AssetFactory;
031 import org.apache.tapestry.coerce.ValueConverter;
032 import org.apache.tapestry.describe.HTMLDescriber;
033 import org.apache.tapestry.engine.IPageSource;
034 import org.apache.tapestry.engine.IPropertySource;
035 import org.apache.tapestry.engine.IScriptSource;
036 import org.apache.tapestry.engine.ISpecificationSource;
037 import org.apache.tapestry.engine.state.ApplicationStateManager;
038 import org.apache.tapestry.error.ExceptionPresenter;
039 import org.apache.tapestry.error.RequestExceptionReporter;
040 import org.apache.tapestry.error.StaleLinkExceptionPresenter;
041 import org.apache.tapestry.error.StaleSessionExceptionPresenter;
042 import org.apache.tapestry.listener.ListenerInvoker;
043 import org.apache.tapestry.listener.ListenerMapSource;
044 import org.apache.tapestry.markup.MarkupWriterSource;
045 import org.apache.tapestry.services.ClassFinder;
046 import org.apache.tapestry.services.ComponentMessagesSource;
047 import org.apache.tapestry.services.ComponentPropertySource;
048 import org.apache.tapestry.services.CookieSource;
049 import org.apache.tapestry.services.DataSqueezer;
050 import org.apache.tapestry.services.Infrastructure;
051 import org.apache.tapestry.services.LinkFactory;
052 import org.apache.tapestry.services.ObjectPool;
053 import org.apache.tapestry.services.RequestCycleFactory;
054 import org.apache.tapestry.services.ResetEventHub;
055 import org.apache.tapestry.services.ResponseRenderer;
056 import org.apache.tapestry.services.ServiceMap;
057 import org.apache.tapestry.services.TemplateSource;
058 import org.apache.tapestry.spec.IApplicationSpecification;
059 import org.apache.tapestry.web.WebContext;
060 import org.apache.tapestry.web.WebContextResource;
061 import org.apache.tapestry.web.WebRequest;
062 import org.apache.tapestry.web.WebResponse;
063
064 /**
065 * Allows access to selected HiveMind services.
066 *
067 * @author Howard Lewis Ship
068 * @since 4.0
069 */
070 public class InfrastructureImpl implements Infrastructure
071 {
072 /**
073 * List of {@link org.apache.tapestry.services.impl.InfrastructureContribution}.
074 */
075 private List _normalContributions;
076
077 /**
078 * List of {@link org.apache.tapestry.services.impl.InfrastructureContribution}.
079 */
080 private List _overrideContributions;
081
082 private Map _properties = new HashMap();
083
084 private boolean _initialized;
085
086 private String _mode;
087
088 private ErrorLog _errorLog;
089
090 private ClassResolver _classResolver;
091
092 private ThreadLocale _threadLocale;
093
094 public void setLocale(Locale locale)
095 {
096 _threadLocale.setLocale(locale);
097 }
098
099 public String getApplicationId()
100 {
101 return (String) getProperty("applicationId");
102 }
103
104 public IPropertySource getApplicationPropertySource()
105 {
106 return (IPropertySource) getProperty("applicationPropertySource");
107 }
108
109 public IApplicationSpecification getApplicationSpecification()
110 {
111 return (IApplicationSpecification) getProperty("applicationSpecification");
112 }
113
114 public ApplicationStateManager getApplicationStateManager()
115 {
116 return (ApplicationStateManager) getProperty("applicationStateManager");
117 }
118
119 public ClassResolver getClassResolver()
120 {
121 return _classResolver;
122 }
123
124 public ComponentMessagesSource getComponentMessagesSource()
125 {
126 return (ComponentMessagesSource) getProperty("componentMessagesSource");
127 }
128
129 public ComponentPropertySource getComponentPropertySource()
130 {
131 return (ComponentPropertySource) getProperty("componentPropertySource");
132 }
133
134 public String getContextPath()
135 {
136 return getRequest().getContextPath();
137 }
138
139 public Resource getContextRoot()
140 {
141 WebContext context = (WebContext) getProperty("context");
142
143 return new WebContextResource(context, "/");
144 }
145
146 public DataSqueezer getDataSqueezer()
147 {
148 return (DataSqueezer) getProperty("dataSqueezer");
149 }
150
151 public IPropertySource getGlobalPropertySource()
152 {
153 return (IPropertySource) getProperty("globalPropertySource");
154 }
155
156 public LinkFactory getLinkFactory()
157 {
158 return (LinkFactory) getProperty("linkFactory");
159 }
160
161 public ObjectPool getObjectPool()
162 {
163 return (ObjectPool) getProperty("objectPool");
164 }
165
166 public IPageSource getPageSource()
167 {
168 return (IPageSource) getProperty("pageSource");
169 }
170
171 public WebRequest getRequest()
172 {
173 return (WebRequest) getProperty("request");
174 }
175
176 public RequestCycleFactory getRequestCycleFactory()
177 {
178 return (RequestCycleFactory) getProperty("requestCycleFactory");
179 }
180
181 public RequestExceptionReporter getRequestExceptionReporter()
182 {
183 return (RequestExceptionReporter) getProperty("requestExceptionReporter");
184 }
185
186 public ResetEventHub getResetEventHub()
187 {
188 return (ResetEventHub) getProperty("resetEventHub");
189 }
190
191 public WebResponse getResponse()
192 {
193 return (WebResponse) getProperty("response");
194 }
195
196 public ResponseRenderer getResponseRenderer()
197 {
198 return (ResponseRenderer) getProperty("responseRenderer");
199 }
200
201 public IScriptSource getScriptSource()
202 {
203 return (IScriptSource) getProperty("scriptSource");
204 }
205
206 public ServiceMap getServiceMap()
207 {
208 return (ServiceMap) getProperty("serviceMap");
209 }
210
211 public ISpecificationSource getSpecificationSource()
212 {
213 return (ISpecificationSource) getProperty("specificationSource");
214 }
215
216 public TemplateSource getTemplateSource()
217 {
218 return (TemplateSource) getProperty("templateSource");
219 }
220
221 public String getOutputEncoding()
222 {
223 return getApplicationPropertySource().getPropertyValue(
224 "org.apache.tapestry.output-encoding");
225 }
226
227 public MarkupWriterSource getMarkupWriterSource()
228 {
229 return (MarkupWriterSource) getProperty("markupWriterSource");
230 }
231
232 public HTMLDescriber getHTMLDescriber()
233 {
234 return (HTMLDescriber) getProperty("HTMLDescriber");
235 }
236
237 public ExceptionPresenter getExceptionPresenter()
238 {
239 return (ExceptionPresenter) getProperty("exceptionPresenter");
240 }
241
242 public ListenerMapSource getListenerMapSource()
243 {
244 return (ListenerMapSource) getProperty("listenerMapSource");
245 }
246
247 public StaleSessionExceptionPresenter getStaleSessionExceptionPresenter()
248 {
249 return (StaleSessionExceptionPresenter) getProperty("staleSessionExceptionPresenter");
250 }
251
252 public StaleLinkExceptionPresenter getStaleLinkExceptionPresenter()
253 {
254 return (StaleLinkExceptionPresenter) getProperty("staleLinkExceptionPresenter");
255 }
256
257 public ValueConverter getValueConverter()
258 {
259 return (ValueConverter) getProperty("valueConverter");
260 }
261
262 public ListenerInvoker getListenerInvoker()
263 {
264 return (ListenerInvoker) getProperty("listenerInvoker");
265 }
266
267 public AssetFactory getAssetFactory()
268 {
269 return (AssetFactory) getProperty("assetFactory");
270 }
271
272 public CookieSource getCookieSource()
273 {
274 return (CookieSource) getProperty("cookieSource");
275 }
276
277 public ClassFinder getClassFinder()
278 {
279 return (ClassFinder) getProperty("classFinder");
280 }
281
282 public IRequestCycle getRequestCycle()
283 {
284 return (IRequestCycle) getProperty("requestCycle");
285 }
286
287 public Object getProperty(String propertyName)
288 {
289 Defense.notNull(propertyName, "propertyName");
290
291 if (!_initialized)
292 throw new IllegalStateException(ImplMessages.infrastructureNotInitialized());
293
294 Object result = _properties.get(propertyName);
295
296 if (result == null)
297 throw new ApplicationRuntimeException(ImplMessages
298 .missingInfrastructureProperty(propertyName));
299
300 return result;
301 }
302
303 public synchronized void initialize(String mode)
304 {
305 Defense.notNull(mode, "mode");
306
307 if (_initialized)
308 throw new IllegalStateException(ImplMessages.infrastructureAlreadyInitialized(
309 mode,
310 _mode));
311
312 Map normalByMode = buildMapFromContributions(_normalContributions, mode);
313 Map normal = buildMapFromContributions(_normalContributions, null);
314 Map overrideByMode = buildMapFromContributions(_overrideContributions, mode);
315 Map override = buildMapFromContributions(_overrideContributions, null);
316
317 addToProperties(overrideByMode);
318 addToProperties(override);
319 addToProperties(normalByMode);
320 addToProperties(normal);
321
322 _mode = mode;
323 _initialized = true;
324 }
325
326 private Map buildMapFromContributions(List contributions, String mode)
327 {
328 Map result = new HashMap();
329
330 Iterator i = contributions.iterator();
331 while (i.hasNext())
332 {
333 InfrastructureContribution ic = (InfrastructureContribution) i.next();
334
335 if (!ic.matchesMode(mode))
336 continue;
337
338 String propertyName = ic.getProperty();
339
340 InfrastructureContribution existing = (InfrastructureContribution) result
341 .get(propertyName);
342
343 if (existing != null)
344 {
345 _errorLog.error(ImplMessages.duplicateInfrastructureContribution(ic, existing
346 .getLocation()), ic.getLocation(), null);
347 continue;
348 }
349
350 result.put(propertyName, ic);
351 }
352
353 return result;
354 }
355
356 /**
357 * Adds to the master set of properties contributed objects that don't match an already existing
358 * key.
359 *
360 * @param map
361 * map of {@link org.apache.tapestry.services.impl.InfrastructureContribution}keyed
362 * on property name (String).
363 */
364
365 private void addToProperties(Map map)
366 {
367 Iterator i = map.values().iterator();
368 while (i.hasNext())
369 {
370 InfrastructureContribution ic = (InfrastructureContribution) i.next();
371 String propertyName = ic.getProperty();
372
373 if (_properties.containsKey(propertyName))
374 continue;
375
376 _properties.put(propertyName, ic.getObject());
377 }
378 }
379
380 public void setClassResolver(ClassResolver classResolver)
381 {
382 _classResolver = classResolver;
383 }
384
385 public void setThreadLocale(ThreadLocale threadLocale)
386 {
387 _threadLocale = threadLocale;
388 }
389
390 public void setNormalContributions(List normalContributions)
391 {
392 _normalContributions = normalContributions;
393 }
394
395 public void setOverrideContributions(List overrideContributions)
396 {
397 _overrideContributions = overrideContributions;
398 }
399
400 public void setErrorLog(ErrorLog errorLog)
401 {
402 _errorLog = errorLog;
403 }
404 }