1
2
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
41
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
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 }