1
2
3
4 package org.rcfaces.core.internal.config;
5
6 import java.io.CharArrayReader;
7 import java.io.Externalizable;
8 import java.io.ObjectInput;
9 import java.io.ObjectOutput;
10 import java.io.Serializable;
11 import java.net.URL;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.Iterator;
15 import java.util.List;
16 import java.util.Map;
17
18 import javax.faces.FactoryFinder;
19 import javax.faces.context.FacesContext;
20 import javax.faces.event.PhaseListener;
21 import javax.faces.lifecycle.Lifecycle;
22 import javax.faces.lifecycle.LifecycleFactory;
23
24 import org.apache.commons.digester.Digester;
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27 import org.rcfaces.core.internal.Constants;
28 import org.rcfaces.core.internal.RcfacesContext;
29 import org.rcfaces.core.internal.adapter.AdapterManagerImpl;
30 import org.rcfaces.core.internal.adapter.IAdapterManager;
31 import org.rcfaces.core.internal.capability.IListenerStrategy;
32 import org.rcfaces.core.internal.contentAccessor.ContentAccessorsRegistryImpl;
33 import org.rcfaces.core.internal.contentAccessor.IContentAccessorRegistry;
34 import org.rcfaces.core.internal.contentAccessor.IContentProxyHandler;
35 import org.rcfaces.core.internal.contentAccessor.IContentVersionHandler;
36 import org.rcfaces.core.internal.contentProxy.IResourceProxyHandler;
37 import org.rcfaces.core.internal.contentProxy.ResourceProxyHandlerImpl;
38 import org.rcfaces.core.internal.contentStorage.ContentStorageAccessorHandler;
39 import org.rcfaces.core.internal.contentStorage.IContentStorageEngine;
40 import org.rcfaces.core.internal.converter.StrategyListenerConverter;
41 import org.rcfaces.core.internal.documentBuilder.IDocumentBuilderProvider;
42 import org.rcfaces.core.internal.renderkit.border.IBorderRenderersRegistry;
43 import org.rcfaces.core.internal.repository.IRepositoryManager;
44 import org.rcfaces.core.internal.repository.RepositoryManagerImpl;
45 import org.rcfaces.core.internal.service.IServicesRegistry;
46 import org.rcfaces.core.internal.util.ConfigurationLoader;
47 import org.rcfaces.core.internal.validator.IClientValidatorsRegistry;
48 import org.rcfaces.core.internal.version.IResourceVersionHandler;
49 import org.rcfaces.core.internal.version.ResourceVersionHandlerImpl;
50 import org.xml.sax.EntityResolver;
51 import org.xml.sax.InputSource;
52
53
54
55
56
57
58 public class RcfacesContextImpl extends RcfacesContext implements
59 Externalizable {
60
61 private static final long serialVersionUID = -4224530723124583628L;
62
63 private static final Log LOG = LogFactory.getLog(RcfacesContextImpl.class);
64
65 private static final Package[] KERNEL_CONFIG_FILENAMES = new Package[] {
66 RcfacesContext.class.getPackage(),
67 RcfacesContextImpl.class.getPackage(),
68 AdapterManagerImpl.class.getPackage(),
69 ResourceVersionHandlerImpl.class.getPackage(),
70 ResourceProxyHandlerImpl.class.getPackage(),
71 ContentAccessorsRegistryImpl.class.getPackage(),
72
73 ContentAccessorsRegistryImpl.class.getPackage(),
74 ContentStorageAccessorHandler.class.getPackage(),
75 RepositoryManagerImpl.class.getPackage() };
76
77 private static final String DESIGNER_MODE_PROPERTY = "com.vedana.nodus3.designer";
78
79 private static final String RCFACES_VERSION_PROPERTY = "org_rcfaces_VERSION";
80
81 private transient ServicesRegistryImpl servicesRegistry;
82
83 private transient ClientValidatorsRegistryImpl clientValidatorsRegistry;
84
85 private transient ProvidersRegistry providersRegistry;
86
87 private transient BorderRenderersRegistryImpl borderRenderersRegistry;
88
89 private final Map attributes = new HashMap(32);
90
91 private transient IContentVersionHandler contentVersionHandler;
92
93 private transient IContentProxyHandler contentProxyHandler;
94
95 private transient IContentAccessorRegistry contentAccessorRegistry;
96
97 private transient IResourceVersionHandler resourceVersionHandler;
98
99 private transient IResourceProxyHandler resourceProxyHandler;
100
101 private transient String applicationVersion;
102
103 private transient int listenerManagerStrategy = IListenerStrategy.DEFAULT;
104
105 private transient IAdapterManager adapterManager;
106
107 private transient IContentStorageEngine indirectContentRepository;
108
109 private transient IDocumentBuilderProvider documentBuilderProvider;
110
111 private transient IRepositoryManager repositoryManager;
112
113 private boolean designerMode;
114
115 public RcfacesContextImpl() {
116 }
117
118 protected void initialize(FacesContext facesContext) {
119 if (facesContext == null) {
120 facesContext = FacesContext.getCurrentInstance();
121 }
122
123 designerMode = facesContext.getExternalContext().getApplicationMap()
124 .containsKey(DESIGNER_MODE_PROPERTY);
125 if (designerMode) {
126 LOG.info("Designer MODE detected.");
127 }
128
129 facesContext.getExternalContext().getApplicationMap()
130 .put(RCFACES_VERSION_PROPERTY, Constants.getVersion());
131
132 initializeRegistries(null);
133
134 loadConfigs(facesContext);
135
136 initializeConfigs(facesContext);
137 }
138
139 protected void initializeRegistries(FacesContext facesContext) {
140
141 if (designerMode) {
142 LOG.debug("Ignore service registry (designer mode)");
143
144 LOG.debug("Ignore clientValidators registry (designer mode)");
145
146 } else {
147 LOG.debug("Initialize service registry");
148 servicesRegistry = createServicesRegistry();
149
150 LOG.debug("Initialize clientValidators registry");
151 clientValidatorsRegistry = createClientValidatorsRegistry();
152 }
153
154 LOG.debug("Initialize border renderers registry");
155 borderRenderersRegistry = createBorderRenderersRegistry();
156
157 LOG.debug("Initialize providers registry");
158 providersRegistry = createProvidersRegistry();
159 }
160
161 public final IServicesRegistry getServicesRegistry() {
162 return servicesRegistry;
163 }
164
165 protected ServicesRegistryImpl createServicesRegistry() {
166 LOG.debug("Installing services registry");
167
168 LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder
169 .getFactory(FactoryFinder.LIFECYCLE_FACTORY);
170
171 Iterator it = lifecycleFactory.getLifecycleIds();
172 for (; it.hasNext();) {
173 String lifecycleId = (String) it.next();
174
175 Lifecycle lifecycle = lifecycleFactory.getLifecycle(lifecycleId);
176
177 PhaseListener phaseListeners[] = lifecycle.getPhaseListeners();
178 if (phaseListeners == null || phaseListeners.length < 1) {
179 continue;
180 }
181
182 for (int i = 0; i < phaseListeners.length; i++) {
183 PhaseListener phaseListener = phaseListeners[i];
184
185 if ((phaseListener instanceof ServicesRegistryImpl) == false) {
186 continue;
187 }
188
189 servicesRegistry = (ServicesRegistryImpl) phaseListener;
190 servicesRegistry.initialize(null);
191
192 LOG.debug("Services registry installed.");
193 return servicesRegistry;
194 }
195 }
196
197 LOG.error("Can not find Services Registry into lifeCycle factories.");
198
199
200 ServicesRegistryImpl services = new ServicesRegistryImpl();
201 services.initialize(null);
202
203 return services;
204 }
205
206 public final IClientValidatorsRegistry getClientValidatorsRegistry() {
207 return clientValidatorsRegistry;
208 }
209
210 protected ClientValidatorsRegistryImpl createClientValidatorsRegistry() {
211 return new ClientValidatorsRegistryImpl();
212 }
213
214 public final IProvidersRegistry getProvidersRegistry() {
215 return providersRegistry;
216 }
217
218 protected ProvidersRegistry createProvidersRegistry() {
219 return new ProvidersRegistry();
220 }
221
222 public final IBorderRenderersRegistry getBorderRenderersRegistry() {
223 return borderRenderersRegistry;
224 }
225
226 protected BorderRenderersRegistryImpl createBorderRenderersRegistry() {
227 return new BorderRenderersRegistryImpl();
228 }
229
230 public final Serializable setAttribute(String property, Serializable value) {
231 return (Serializable) attributes.put(property, value);
232 }
233
234 public final Serializable getAttribute(String property) {
235 return (Serializable) attributes.get(property);
236 }
237
238 public final Serializable removeAttribute(String property) {
239 return (Serializable) attributes.remove(property);
240 }
241
242 private void loadConfigs(FacesContext facesContext) {
243 LOG.info("Loading rcfaces config ...");
244
245 Digester digester = new Digester();
246 digester.setUseContextClassLoader(true);
247
248 digester.setEntityResolver(new EntityResolver() {
249 private static final String REVISION = "$Revision: 1.18 $";
250
251 public InputSource resolveEntity(String string, String string1) {
252 return new InputSource(new CharArrayReader(new char[0]));
253 }
254
255 });
256
257 LOG.debug("Declare configurations rules.");
258 configureRules(digester);
259
260 List urls = new ArrayList(32);
261
262 LOG.debug("Search configuration files ...");
263 for (int i = 0; i < KERNEL_CONFIG_FILENAMES.length; i++) {
264 Package pkg = KERNEL_CONFIG_FILENAMES[i];
265
266 String resourceName = pkg.getName().replace('.', '/') + '/'
267 + RCFACES_CONFIG_FILENAME;
268
269 URL url = getClass().getClassLoader().getResource(resourceName);
270
271 LOG.debug("Configuration file '" + resourceName + "' => "
272 + ((url != null) ? "exists" : "ignore"));
273 if (url == null) {
274 continue;
275 }
276
277 urls.add(url);
278 }
279
280 ConfigurationLoader configurationLoader = ConfigurationLoader
281 .scanRCFacesConfig(facesContext.getExternalContext(), urls);
282
283 configurationLoader.parse(digester);
284
285 loadProvidersConfiguration(facesContext, configurationLoader);
286
287 LOG.info("Rcfaces config loaded.");
288 }
289
290 private void configureRules(Digester digester) {
291 if (designerMode == false) {
292 ((ServicesRegistryImpl) getServicesRegistry())
293 .configureRules(digester);
294 ((ClientValidatorsRegistryImpl) getClientValidatorsRegistry())
295 .configureRules(digester);
296 }
297
298 ((ProvidersRegistry) getProvidersRegistry()).configureRules(digester);
299 ((BorderRenderersRegistryImpl) getBorderRenderersRegistry())
300 .configureRules(digester);
301 }
302
303 private void loadProvidersConfiguration(FacesContext facesContext,
304 final ConfigurationLoader configurationLoader) {
305
306 IProvidersConfigurator providersConfigurator = new IProvidersConfigurator() {
307
308 public void parseConfiguration(Digester digester) {
309 configurationLoader.parse(digester);
310 }
311
312 };
313
314 ((ProvidersRegistry) getProvidersRegistry())
315 .loadProvidersConfiguration(providersConfigurator);
316
317 ((ProvidersRegistry) getProvidersRegistry())
318 .startupProviders(facesContext);
319 }
320
321 protected void initializeConfigs(FacesContext facesContext) {
322
323 Map applicationMap = facesContext.getExternalContext()
324 .getApplicationMap();
325
326 applicationVersion = (String) applicationMap
327 .get(APPLICATION_VERSION_PROPERTY);
328
329 LOG.debug("Set application version to '" + applicationVersion + "'.");
330
331 String strategyName = facesContext.getExternalContext()
332 .getInitParameter(LISTENER_MANAGER_STRATEGY_PARAMETER);
333
334 if (strategyName != null) {
335 Integer convertedStartegy = ((Integer) StrategyListenerConverter.SINGLETON
336 .getAsObject(facesContext, null, strategyName));
337
338 if (convertedStartegy == null) {
339 throw new IllegalArgumentException(
340 "Listener manager strategy: '"
341 + strategyName
342 + "' is not recognized. See IListenerStrategy constants.");
343 }
344
345 listenerManagerStrategy = convertedStartegy.intValue();
346
347 LOG.debug("Set listener manager stategy to '" + strategyName + "'.");
348 }
349
350 LOG.debug("Initialize all configs: done.");
351 }
352
353 public final String getApplicationVersion() {
354 return applicationVersion;
355 }
356
357 public void setDefaultContentVersionHandler(
358 IContentVersionHandler contentVersionHandler) {
359 this.contentVersionHandler = contentVersionHandler;
360 }
361
362 public final IContentVersionHandler getDefaultContentVersionHandler() {
363 return contentVersionHandler;
364 }
365
366 public IContentProxyHandler getDefaultContentProxyHandler() {
367 return contentProxyHandler;
368 }
369
370 public void setDefaultContentProxyHandler(
371 IContentProxyHandler contentProxyHandler) {
372 this.contentProxyHandler = contentProxyHandler;
373 }
374
375 public void readExternal(ObjectInput in) {
376
377 }
378
379 public void writeExternal(ObjectOutput out) {
380
381 }
382
383 public IAdapterManager getAdapterManager() {
384 return adapterManager;
385 }
386
387 public void setAdapterManager(IAdapterManager adapterManager) {
388 this.adapterManager = adapterManager;
389 }
390
391 public boolean isDesignerMode() {
392 return designerMode;
393 }
394
395 public IContentAccessorRegistry getContentAccessorRegistry() {
396 return contentAccessorRegistry;
397 }
398
399 public void setContentAccessorRegistry(
400 IContentAccessorRegistry contentAccessorRegistry) {
401 this.contentAccessorRegistry = contentAccessorRegistry;
402 }
403
404 public IResourceVersionHandler getResourceVersionHandler() {
405 return resourceVersionHandler;
406 }
407
408 public void setResourceVersionHandler(
409 IResourceVersionHandler resourceVersionHandler) {
410 this.resourceVersionHandler = resourceVersionHandler;
411 }
412
413 public IContentStorageEngine getContentStorageEngine() {
414 return indirectContentRepository;
415 }
416
417 public void setContentStorageEngine(
418 IContentStorageEngine indirectContentRepository) {
419 this.indirectContentRepository = indirectContentRepository;
420 }
421
422 public IResourceProxyHandler getResourceProxyHandler() {
423 return resourceProxyHandler;
424 }
425
426 public void setResourceProxyHandler(
427 IResourceProxyHandler resourceProxyHandler) {
428 this.resourceProxyHandler = resourceProxyHandler;
429 }
430
431 public IDocumentBuilderProvider getDocumentBuilderProvider() {
432 return documentBuilderProvider;
433 }
434
435 public void setDocumentBuilderProvider(
436 IDocumentBuilderProvider documentBuilderProvider) {
437 this.documentBuilderProvider = documentBuilderProvider;
438 }
439
440 public IRepositoryManager getRepositoryManager() {
441 return repositoryManager;
442 }
443
444 public void setRepositoryManager(IRepositoryManager repositoryManager) {
445 this.repositoryManager = repositoryManager;
446 }
447
448 public int getListenerManagerStrategy() {
449 return listenerManagerStrategy;
450 }
451 }