1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.shared.renderkit.html.util;
20
21 import java.io.IOException;
22 import java.util.HashMap;
23 import java.util.Map;
24 import javax.faces.FacesWrapper;
25
26 import javax.faces.application.Resource;
27 import javax.faces.component.UIComponent;
28 import javax.faces.context.FacesContext;
29 import javax.faces.context.ResponseWriter;
30
31 import org.apache.myfaces.shared.config.MyfacesConfig;
32 import org.apache.myfaces.shared.renderkit.JSFAttr;
33 import org.apache.myfaces.shared.renderkit.html.HTML;
34 import org.apache.myfaces.shared.resource.ContractResource;
35
36
37
38
39 public class ResourceUtils
40 {
41 public final static String JAVAX_FACES_LIBRARY_NAME = "javax.faces";
42 public final static String JSF_JS_RESOURCE_NAME = "jsf.js";
43
44 public final static String MYFACES_JS_RESOURCE_NAME = "oamSubmit.js";
45 public final static String MYFACES_JS_RESOURCE_NAME_UNCOMPRESSED = "oamSubmit-uncompressed.js";
46 public final static String MYFACES_LIBRARY_NAME = "org.apache.myfaces";
47 private final static String RENDERED_MYFACES_JS = "org.apache.myfaces.RENDERED_MYFACES_JS";
48
49 public final static String JSF_MYFACES_JSFJS_MINIMAL = "minimal";
50 public final static String JSF_MYFACES_JSFJS_MINIMAL_MODERN = "minimal-modern";
51 public final static String JSF_MYFACES_JSFJS_NORMAL = "normal";
52
53 public final static String JSF_UNCOMPRESSED_JS_RESOURCE_NAME = "jsf-uncompressed.js";
54 public final static String JSF_MINIMAL_JS_RESOURCE_NAME = "jsf-minimal.js";
55 public final static String JSF_MINIMAL_MODERN_JS_RESOURCE_NAME = "jsf-minimal-modern.js";
56
57 public final static String JSF_MYFACES_JSFJS_I18N = "jsf-i18n.js";
58 public final static String JSF_MYFACES_JSFJS_EXPERIMENTAL = "jsf-experimental.js";
59 public final static String JSF_MYFACES_JSFJS_LEGACY = "jsf-legacy.js";
60
61 private final static String RENDERED_STYLESHEET_RESOURCES_SET =
62 "org.apache.myfaces.RENDERED_STYLESHEET_RESOURCES_SET";
63 private final static String RENDERED_SCRIPT_RESOURCES_SET = "org.apache.myfaces.RENDERED_SCRIPT_RESOURCES_SET";
64 private final static String RENDERED_JSF_JS = "org.apache.myfaces.RENDERED_JSF_JS";
65 public final static String HEAD_TARGET = "head";
66 public final static String BODY_TARGET = "body";
67 public final static String FORM_TARGET = "form";
68
69 public static final String JAVAX_FACES_OUTPUT_COMPONENT_TYPE = "javax.faces.Output";
70 public static final String JAVAX_FACES_TEXT_RENDERER_TYPE = "javax.faces.Text";
71 public static final String DEFAULT_SCRIPT_RENDERER_TYPE = "javax.faces.resource.Script";
72 public static final String DEFAULT_STYLESHEET_RENDERER_TYPE = "javax.faces.resource.Stylesheet";
73
74
75
76
77
78
79
80
81 @SuppressWarnings("unchecked")
82 private static Map<String, Boolean> getRenderedStylesheetResources(FacesContext facesContext)
83 {
84 Map<String, Boolean> map = (Map<String, Boolean>) facesContext.getAttributes().get(
85 RENDERED_STYLESHEET_RESOURCES_SET);
86 if (map == null)
87 {
88 map = new HashMap<String, Boolean>();
89 facesContext.getAttributes().put(RENDERED_STYLESHEET_RESOURCES_SET,map);
90 }
91 return map;
92 }
93
94
95
96
97
98
99
100
101 @SuppressWarnings("unchecked")
102 private static Map<String, Boolean> getRenderedScriptResources(FacesContext facesContext)
103 {
104 Map<String, Boolean> map = (Map<String, Boolean>) facesContext.getAttributes().get(
105 RENDERED_SCRIPT_RESOURCES_SET);
106 if (map == null)
107 {
108 map = new HashMap<String, Boolean>();
109 facesContext.getAttributes().put(RENDERED_SCRIPT_RESOURCES_SET,map);
110 }
111 return map;
112 }
113
114 public static void markScriptAsRendered(FacesContext facesContext, String libraryName, String resourceName)
115 {
116 getRenderedScriptResources(facesContext).put(
117 libraryName != null ? libraryName+'/'+resourceName : resourceName, Boolean.TRUE);
118 if (JAVAX_FACES_LIBRARY_NAME.equals(libraryName) &&
119 JSF_JS_RESOURCE_NAME.equals(resourceName))
120 {
121
122
123 getRenderedScriptResources(facesContext).put(
124 MYFACES_LIBRARY_NAME+'/'+MYFACES_JS_RESOURCE_NAME, Boolean.TRUE);
125 }
126 }
127
128 public static void markStylesheetAsRendered(FacesContext facesContext, String libraryName, String resourceName)
129 {
130 getRenderedStylesheetResources(facesContext).put(
131 libraryName != null ? libraryName+'/'+resourceName : resourceName, Boolean.TRUE);
132 }
133
134 public static boolean isRenderedScript(FacesContext facesContext, String libraryName, String resourceName)
135 {
136 return getRenderedScriptResources(facesContext).containsKey(
137 libraryName != null ? libraryName+'/'+resourceName : resourceName);
138 }
139
140 public static boolean isRenderedStylesheet(FacesContext facesContext, String libraryName, String resourceName)
141 {
142 return getRenderedStylesheetResources(facesContext).containsKey(
143 libraryName != null ? libraryName+'/'+resourceName : resourceName);
144 }
145
146 public static void writeScriptInline(FacesContext facesContext, ResponseWriter writer, String libraryName,
147 String resourceName) throws IOException
148 {
149 if (!ResourceUtils.isRenderedScript(facesContext, libraryName, resourceName))
150 {
151 if (MyfacesConfig.getCurrentInstance(facesContext.getExternalContext()).isRiImplAvailable())
152 {
153
154 UIComponent outputScript = facesContext.getApplication().
155 createComponent(facesContext, JAVAX_FACES_OUTPUT_COMPONENT_TYPE, DEFAULT_SCRIPT_RENDERER_TYPE);
156 outputScript.getAttributes().put(JSFAttr.NAME_ATTR, resourceName);
157 outputScript.getAttributes().put(JSFAttr.LIBRARY_ATTR, libraryName);
158 outputScript.encodeAll(facesContext);
159 }
160 else
161 {
162
163 Resource resource = facesContext.getApplication().getResourceHandler().createResource(
164 resourceName, libraryName);
165 markScriptAsRendered(facesContext, libraryName, resourceName);
166 writer.startElement(HTML.SCRIPT_ELEM, null);
167 writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT , null);
168 writer.writeURIAttribute(HTML.SRC_ATTR, resource.getRequestPath(), null);
169 writer.endElement(HTML.SCRIPT_ELEM);
170 }
171 }
172 }
173
174 public static void renderDefaultJsfJsInlineIfNecessary(FacesContext facesContext, ResponseWriter writer)
175 throws IOException
176 {
177 if (facesContext.getAttributes().containsKey(RENDERED_JSF_JS))
178 {
179 return;
180 }
181
182
183
184 if (isRenderedScript(facesContext, JAVAX_FACES_LIBRARY_NAME, JSF_JS_RESOURCE_NAME))
185 {
186 facesContext.getAttributes().put(RENDERED_JSF_JS, Boolean.TRUE);
187 return;
188 }
189
190
191
192 if (facesContext.getPartialViewContext() != null &&
193 (facesContext.getPartialViewContext().isPartialRequest() ||
194 facesContext.getPartialViewContext().isAjaxRequest() )
195 )
196 {
197 return;
198 }
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 if (MyfacesConfig.getCurrentInstance(facesContext.getExternalContext()).isRiImplAvailable())
215 {
216
217 UIComponent outputScript = facesContext.getApplication().
218 createComponent(facesContext, JAVAX_FACES_OUTPUT_COMPONENT_TYPE, DEFAULT_SCRIPT_RENDERER_TYPE);
219 outputScript.getAttributes().put(JSFAttr.NAME_ATTR, JSF_JS_RESOURCE_NAME);
220 outputScript.getAttributes().put(JSFAttr.LIBRARY_ATTR, JAVAX_FACES_LIBRARY_NAME);
221 outputScript.encodeAll(facesContext);
222 }
223 else
224 {
225
226 Resource resource = facesContext.getApplication().getResourceHandler().createResource(
227 JSF_JS_RESOURCE_NAME, JAVAX_FACES_LIBRARY_NAME);
228 markScriptAsRendered(facesContext, JAVAX_FACES_LIBRARY_NAME, JSF_JS_RESOURCE_NAME);
229 writer.startElement(HTML.SCRIPT_ELEM, null);
230 writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
231 writer.writeURIAttribute(HTML.SRC_ATTR, resource.getRequestPath(), null);
232 writer.endElement(HTML.SCRIPT_ELEM);
233 }
234
235
236 facesContext.getAttributes().put(RENDERED_JSF_JS, Boolean.TRUE);
237 return;
238 }
239
240 public static void renderMyfacesJSInlineIfNecessary(FacesContext facesContext, ResponseWriter writer)
241 throws IOException
242 {
243 if (facesContext.getAttributes().containsKey(RENDERED_MYFACES_JS))
244 {
245 return;
246 }
247
248
249
250
251
252 if (facesContext.getPartialViewContext() != null &&
253 (facesContext.getPartialViewContext().isPartialRequest() ||
254 facesContext.getPartialViewContext().isAjaxRequest() )
255 )
256 {
257 return;
258 }
259
260
261 if (isRenderedScript(facesContext, MYFACES_LIBRARY_NAME, MYFACES_JS_RESOURCE_NAME))
262 {
263 facesContext.getAttributes().put(RENDERED_MYFACES_JS, Boolean.TRUE);
264 return;
265 }
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280 if (MyfacesConfig.getCurrentInstance(facesContext.getExternalContext()).isRiImplAvailable())
281 {
282
283 UIComponent outputScript = facesContext.getApplication().
284 createComponent(facesContext, JAVAX_FACES_OUTPUT_COMPONENT_TYPE, DEFAULT_SCRIPT_RENDERER_TYPE);
285 outputScript.getAttributes().put(JSFAttr.NAME_ATTR, MYFACES_JS_RESOURCE_NAME);
286 outputScript.getAttributes().put(JSFAttr.LIBRARY_ATTR, MYFACES_LIBRARY_NAME);
287 outputScript.encodeAll(facesContext);
288 }
289 else
290 {
291
292 Resource resource = facesContext.getApplication().getResourceHandler().createResource(
293 MYFACES_JS_RESOURCE_NAME, MYFACES_LIBRARY_NAME);
294 markScriptAsRendered(facesContext, MYFACES_LIBRARY_NAME, MYFACES_JS_RESOURCE_NAME);
295 writer.startElement(HTML.SCRIPT_ELEM, null);
296 writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
297 writer.writeURIAttribute(HTML.SRC_ATTR, resource.getRequestPath(), null);
298 writer.endElement(HTML.SCRIPT_ELEM);
299 }
300
301
302 facesContext.getAttributes().put(RENDERED_MYFACES_JS, Boolean.TRUE);
303 return;
304 }
305
306 public static String getContractName(Resource resource)
307 {
308 while (resource != null)
309 {
310 if (resource instanceof ContractResource)
311 {
312 return ((ContractResource)resource).getContractName();
313 }
314 else if (resource instanceof FacesWrapper)
315 {
316 resource = (Resource)((FacesWrapper)resource).getWrapped();
317 }
318 else
319 {
320 resource = null;
321 }
322 }
323 return null;
324 }
325 }