View Javadoc

1   /*
2    * $Id: RcfacesContext.java,v 1.18 2011/06/16 09:29:40 jbmeslin Exp $
3    * 
4    */
5   package org.rcfaces.core.internal;
6   
7   import java.util.Map;
8   
9   import javax.faces.FacesException;
10  import javax.faces.FactoryFinder;
11  import javax.faces.context.FacesContext;
12  import javax.faces.context.FacesContextFactory;
13  import javax.faces.event.PhaseListener;
14  import javax.faces.lifecycle.Lifecycle;
15  import javax.servlet.ServletContext;
16  import javax.servlet.ServletRequest;
17  import javax.servlet.ServletResponse;
18  
19  import org.apache.commons.logging.Log;
20  import org.apache.commons.logging.LogFactory;
21  import org.rcfaces.core.internal.adapter.IAdapterManager;
22  import org.rcfaces.core.internal.config.IProvidersRegistry;
23  import org.rcfaces.core.internal.config.RcfacesContextImpl;
24  import org.rcfaces.core.internal.contentAccessor.IContentAccessorRegistry;
25  import org.rcfaces.core.internal.contentAccessor.IContentProxyHandler;
26  import org.rcfaces.core.internal.contentAccessor.IContentVersionHandler;
27  import org.rcfaces.core.internal.contentProxy.IResourceProxyHandler;
28  import org.rcfaces.core.internal.contentStorage.IContentStorageEngine;
29  import org.rcfaces.core.internal.documentBuilder.IDocumentBuilderProvider;
30  import org.rcfaces.core.internal.renderkit.border.IBorderRenderersRegistry;
31  import org.rcfaces.core.internal.repository.IRepositoryManager;
32  import org.rcfaces.core.internal.service.IServicesRegistry;
33  import org.rcfaces.core.internal.util.FakeHttpServletRequest;
34  import org.rcfaces.core.internal.util.FakeHttpServletResponse;
35  import org.rcfaces.core.internal.validator.IClientValidatorsRegistry;
36  import org.rcfaces.core.internal.version.IResourceVersionHandler;
37  
38  /**
39   * 
40   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
41   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:40 $
42   */
43  public abstract class RcfacesContext {
44      private static final Log LOG = LogFactory.getLog(RcfacesContext.class);
45  
46      private static final String CAMELIA_CONTEXT_PROPERTY = "org.rcfaces.core.internal.CAMELIA_CONTEXT";
47  
48      public static final int JSF_1_1 = 0x100100;
49  
50      public static final int JSF_1_2 = 0x100200;
51  
52      private static final boolean isJSF1_2;
53      static {
54          boolean is1_2 = false;
55  
56          try {
57              RcfacesContext.class.getClassLoader().loadClass(
58                      "javax.faces.webapp.UIComponentELTag");
59  
60              is1_2 = true;
61  
62              LOG.info("JSF version 1.2 detected !");
63  
64          } catch (Throwable ex) {
65              LOG.debug(ex);
66          }
67  
68          isJSF1_2 = is1_2;
69      }
70  
71      public static final String RCFACES_CONFIG_FILES_PARAMETER = Constants
72              .getPackagePrefix() + ".CONFIG_FILES";
73  
74      public static final String RCFACES_CONFIG_FILENAME = "rcfaces-config.xml";
75  
76      protected static final String LISTENER_MANAGER_STRATEGY_PARAMETER = Constants
77              .getPackagePrefix() + ".LISTENER_MANAGER_STRATEGY";
78  
79      protected static final String APPLICATION_VERSION_PROPERTY = "org.rcfaces.core.internal.APPLICATION_VERSION";
80  
81      private static final Lifecycle EMPTY_LIFECYCLE = new Lifecycle() {
82          private static final String REVISION = "$Revision: 1.18 $";
83  
84          public void addPhaseListener(PhaseListener listener) {
85          }
86  
87          public void execute(FacesContext context) throws FacesException {
88          }
89  
90          public PhaseListener[] getPhaseListeners() {
91              return new PhaseListener[0];
92          }
93  
94          public void removePhaseListener(PhaseListener listener) {
95          }
96  
97          public void render(FacesContext context) throws FacesException {
98          }
99      };
100 
101     protected RcfacesContext() {
102     }
103 
104     public static final RcfacesContext getCurrentInstance() {
105         return getInstance((FacesContext) null);
106     }
107 
108     public static final RcfacesContext getInstance(FacesContext facesContext) {
109         if (facesContext == null) {
110             facesContext = FacesContext.getCurrentInstance();
111 
112             if (facesContext == null) {
113                 throw new FacesException("No faces context !");
114             }
115         }
116 
117         Map applicationMap = facesContext.getExternalContext()
118                 .getApplicationMap();
119 
120         RcfacesContext cameliaContext;
121         synchronized (CAMELIA_CONTEXT_PROPERTY) {
122             cameliaContext = (RcfacesContext) applicationMap
123                     .get(CAMELIA_CONTEXT_PROPERTY);
124 
125             if (cameliaContext == null) {
126                 applicationMap.put(CAMELIA_CONTEXT_PROPERTY, Boolean.FALSE);
127 
128                 cameliaContext = createCameliaContext();
129 
130                 applicationMap.put(CAMELIA_CONTEXT_PROPERTY, cameliaContext);
131 
132                 cameliaContext.initialize(facesContext);
133             }
134         }
135 
136         return cameliaContext;
137     }
138 
139     public static final RcfacesContext getInstance(
140             ServletContext servletContext, ServletRequest request,
141             ServletResponse response) {
142 
143         synchronized (CAMELIA_CONTEXT_PROPERTY) {
144             RcfacesContext cameliaContext = (RcfacesContext) servletContext
145                     .getAttribute(CAMELIA_CONTEXT_PROPERTY);
146             if (cameliaContext != null) {
147                 return cameliaContext;
148             }
149 
150             cameliaContext = createCameliaContext(servletContext, request,
151                     response);
152 
153             return cameliaContext;
154         }
155     }
156 
157     public static void runIntoFacesContext(ServletContext context,
158             ServletRequest request, ServletResponse response, Runnable runnable) {
159 
160         if (FacesContext.getCurrentInstance() != null) {
161             runnable.run();
162             return;
163         }
164 
165         FacesContextFactory facesContextFactory = (FacesContextFactory) FactoryFinder
166                 .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
167 
168         if (facesContextFactory == null) {
169             throw new FacesException("Can not get Faces Context Factory !");
170         }
171 
172         FacesContext facesContext = facesContextFactory.getFacesContext(
173                 context, request, response, EMPTY_LIFECYCLE);
174         try {
175             runnable.run();
176 
177         } finally {
178             facesContext.release();
179         }
180     }
181 
182     private static RcfacesContext createCameliaContext(
183             final ServletContext context, ServletRequest request,
184             ServletResponse response) {
185 
186         final RcfacesContext rcfacesContextRef[] = new RcfacesContext[1];
187 
188         if (request == null) {
189             request = FakeHttpServletRequest.SINGLETON;
190         }
191 
192         if (response == null) {
193             response = FakeHttpServletResponse.SINGLETON;
194         }
195 
196         runIntoFacesContext(context, request, response, new Runnable() {
197 
198             public void run() {
199                 FacesContext facesContext = FacesContext.getCurrentInstance();
200 
201                 RcfacesContext rcfacesContext = createCameliaContext();
202 
203                 context.setAttribute(CAMELIA_CONTEXT_PROPERTY, rcfacesContext);
204 
205                 rcfacesContext.initialize(facesContext);
206 
207                 rcfacesContextRef[0] = rcfacesContext;
208             }
209 
210         });
211 
212         return rcfacesContextRef[0];
213     }
214 
215     protected abstract void initialize(FacesContext facesContext);
216 
217     private static RcfacesContext createCameliaContext() {
218 
219         // @XXX Rechercher dans les propriétés la classe d'impl !
220 
221         RcfacesContext cameliaContext = new RcfacesContextImpl();
222 
223         return cameliaContext;
224     }
225 
226     public abstract String getApplicationVersion();
227 
228     public abstract boolean isDesignerMode();
229 
230     public abstract int getListenerManagerStrategy();
231 
232     public abstract IServicesRegistry getServicesRegistry();
233 
234     public abstract IClientValidatorsRegistry getClientValidatorsRegistry();
235 
236     public abstract IBorderRenderersRegistry getBorderRenderersRegistry();
237 
238     public abstract IProvidersRegistry getProvidersRegistry();
239 
240     public abstract IAdapterManager getAdapterManager();
241 
242     public abstract void setAdapterManager(IAdapterManager adapterManager);
243 
244     public abstract IContentVersionHandler getDefaultContentVersionHandler();
245 
246     public abstract void setDefaultContentVersionHandler(
247             IContentVersionHandler handler);
248 
249     public abstract IContentProxyHandler getDefaultContentProxyHandler();
250 
251     public abstract void setDefaultContentProxyHandler(
252             IContentProxyHandler handler);
253 
254     public abstract IContentAccessorRegistry getContentAccessorRegistry();
255 
256     public abstract void setContentAccessorRegistry(
257             IContentAccessorRegistry registry);
258 
259     public abstract IResourceVersionHandler getResourceVersionHandler();
260 
261     public abstract void setResourceVersionHandler(
262             IResourceVersionHandler resourceVersionHandler);
263 
264     public abstract IResourceProxyHandler getResourceProxyHandler();
265 
266     public abstract void setResourceProxyHandler(
267             IResourceProxyHandler resourceProxyHandler);
268 
269     public abstract IContentStorageEngine getContentStorageEngine();
270 
271     public abstract void setContentStorageEngine(
272             IContentStorageEngine indirectContentRepository);
273 
274     public abstract IDocumentBuilderProvider getDocumentBuilderProvider();
275 
276     public abstract void setDocumentBuilderProvider(
277             IDocumentBuilderProvider documentBuilderProvider);
278 
279     public abstract IRepositoryManager getRepositoryManager();
280 
281     public abstract void setRepositoryManager(
282             IRepositoryManager repositoryManager);
283 
284     public static boolean isJSF1_2() {
285         return isJSF1_2;
286     }
287 
288 }