View Javadoc

1   /*
2    * $Id: RcfacesContextImpl.java,v 1.18 2011/06/16 09:29:40 jbmeslin Exp $
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   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
56   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
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              // ImageContentAccessorHandlerImpl.class.getPackage(),
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         // On en créée un en attendant !
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         // On ne serialize rien !
377     }
378 
379     public void writeExternal(ObjectOutput out) {
380         // On ne serialize rien !
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 }