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
25 import javax.faces.application.Resource;
26 import javax.faces.component.UIComponent;
27 import javax.faces.context.FacesContext;
28 import javax.faces.context.ResponseWriter;
29
30 import org.apache.myfaces.shared.config.MyfacesConfig;
31 import org.apache.myfaces.shared.renderkit.JSFAttr;
32 import org.apache.myfaces.shared.renderkit.html.HTML;
33
34
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 && facesContext.getPartialViewContext().isAjaxRequest())
193 {
194 return;
195 }
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211 if (MyfacesConfig.getCurrentInstance(facesContext.getExternalContext()).isRiImplAvailable())
212 {
213
214 UIComponent outputScript = facesContext.getApplication().
215 createComponent(facesContext, JAVAX_FACES_OUTPUT_COMPONENT_TYPE, DEFAULT_SCRIPT_RENDERER_TYPE);
216 outputScript.getAttributes().put(JSFAttr.NAME_ATTR, JSF_JS_RESOURCE_NAME);
217 outputScript.getAttributes().put(JSFAttr.LIBRARY_ATTR, JAVAX_FACES_LIBRARY_NAME);
218 outputScript.encodeAll(facesContext);
219 }
220 else
221 {
222
223 Resource resource = facesContext.getApplication().getResourceHandler().createResource(
224 JSF_JS_RESOURCE_NAME, JAVAX_FACES_LIBRARY_NAME);
225 markScriptAsRendered(facesContext, JAVAX_FACES_LIBRARY_NAME, JSF_JS_RESOURCE_NAME);
226 writer.startElement(HTML.SCRIPT_ELEM, null);
227 writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
228 writer.writeURIAttribute(HTML.SRC_ATTR, resource.getRequestPath(), null);
229 writer.endElement(HTML.SCRIPT_ELEM);
230 }
231
232
233 facesContext.getAttributes().put(RENDERED_JSF_JS, Boolean.TRUE);
234 return;
235 }
236
237 public static void renderMyfacesJSInlineIfNecessary(FacesContext facesContext, ResponseWriter writer)
238 throws IOException
239 {
240 if (facesContext.getAttributes().containsKey(RENDERED_MYFACES_JS))
241 {
242 return;
243 }
244
245
246
247
248
249 if (facesContext.getPartialViewContext() != null && facesContext.getPartialViewContext().isPartialRequest())
250 {
251 return;
252 }
253
254
255 if (isRenderedScript(facesContext, MYFACES_LIBRARY_NAME, MYFACES_JS_RESOURCE_NAME))
256 {
257 facesContext.getAttributes().put(RENDERED_MYFACES_JS, Boolean.TRUE);
258 return;
259 }
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274 if (MyfacesConfig.getCurrentInstance(facesContext.getExternalContext()).isRiImplAvailable())
275 {
276
277 UIComponent outputScript = facesContext.getApplication().
278 createComponent(facesContext, JAVAX_FACES_OUTPUT_COMPONENT_TYPE, DEFAULT_SCRIPT_RENDERER_TYPE);
279 outputScript.getAttributes().put(JSFAttr.NAME_ATTR, MYFACES_JS_RESOURCE_NAME);
280 outputScript.getAttributes().put(JSFAttr.LIBRARY_ATTR, MYFACES_LIBRARY_NAME);
281 outputScript.encodeAll(facesContext);
282 }
283 else
284 {
285
286 Resource resource = facesContext.getApplication().getResourceHandler().createResource(
287 MYFACES_JS_RESOURCE_NAME, MYFACES_LIBRARY_NAME);
288 markScriptAsRendered(facesContext, MYFACES_LIBRARY_NAME, MYFACES_JS_RESOURCE_NAME);
289 writer.startElement(HTML.SCRIPT_ELEM, null);
290 writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
291 writer.writeURIAttribute(HTML.SRC_ATTR, resource.getRequestPath(), null);
292 writer.endElement(HTML.SCRIPT_ELEM);
293 }
294
295
296 facesContext.getAttributes().put(RENDERED_MYFACES_JS, Boolean.TRUE);
297 return;
298 }
299
300 }