1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.renderkit.html;
20
21 import java.io.IOException;
22 import java.io.OutputStream;
23 import java.io.Writer;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.Iterator;
27 import java.util.Map;
28 import java.util.concurrent.ConcurrentHashMap;
29 import java.util.logging.Level;
30 import java.util.logging.Logger;
31
32 import javax.faces.context.FacesContext;
33 import javax.faces.context.ResponseStream;
34 import javax.faces.context.ResponseWriter;
35 import javax.faces.render.ClientBehaviorRenderer;
36 import javax.faces.render.RenderKit;
37 import javax.faces.render.Renderer;
38 import javax.faces.render.ResponseStateManager;
39
40 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderKit;
41 import org.apache.myfaces.shared.config.MyfacesConfig;
42 import org.apache.myfaces.shared.renderkit.ContentTypeUtils;
43 import org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils;
44 import org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl;
45
46
47
48
49
50 @JSFRenderKit(renderKitId = "HTML_BASIC")
51 public class HtmlRenderKitImpl extends RenderKit
52 {
53
54 private static final Logger log = Logger.getLogger(HtmlRenderKitImpl.class.getName());
55
56
57
58 private Map<String, Map<String, Renderer>> _renderers;
59 private ResponseStateManager _responseStateManager;
60
61 private Map<String, ClientBehaviorRenderer> _clientBehaviorRenderers;
62
63
64
65 public HtmlRenderKitImpl()
66 {
67 _renderers = new ConcurrentHashMap<String, Map<String, Renderer>>(64, 0.75f, 1);
68 _responseStateManager = new HtmlResponseStateManager();
69
70 _clientBehaviorRenderers = new HashMap<String, ClientBehaviorRenderer>();
71 }
72
73
74
75 @Override
76 public void addClientBehaviorRenderer(String type, ClientBehaviorRenderer renderer)
77 {
78 if (type == null)
79 {
80 throw new NullPointerException("client behavior renderer type must not be null");
81 }
82 if ( renderer == null)
83 {
84 throw new NullPointerException("client behavior renderer must not be null");
85 }
86
87 _clientBehaviorRenderers.put(type, renderer);
88 }
89
90 @Override
91 public ClientBehaviorRenderer getClientBehaviorRenderer(String type)
92 {
93 if (type == null)
94 {
95 throw new NullPointerException("client behavior renderer type must not be null");
96 }
97
98 return _clientBehaviorRenderers.get(type);
99 }
100
101 @Override
102 public Iterator<String> getClientBehaviorRendererTypes()
103 {
104 return _clientBehaviorRenderers.keySet().iterator();
105 }
106
107 @Override
108 public Renderer getRenderer(String componentFamily, String rendererType)
109 {
110 if (componentFamily == null)
111 {
112 throw new NullPointerException("component family must not be null.");
113 }
114 if (rendererType == null)
115 {
116 throw new NullPointerException("renderer type must not be null.");
117 }
118 Map <String,Renderer> familyRendererMap = _renderers.get(componentFamily);
119 Renderer renderer = null;
120 if (familyRendererMap != null)
121 {
122 renderer = familyRendererMap.get(rendererType);
123 }
124 if (renderer == null)
125 {
126 log.warning("Unsupported component-family/renderer-type: " + componentFamily + "/" + rendererType);
127 }
128 return renderer;
129 }
130
131 @Override
132 public void addRenderer(String componentFamily, String rendererType, Renderer renderer)
133 {
134 if (componentFamily == null)
135 {
136 log.severe("addRenderer: componentFamily = null is not allowed");
137 throw new NullPointerException("component family must not be null.");
138 }
139 if (rendererType == null)
140 {
141 log.severe("addRenderer: rendererType = null is not allowed");
142 throw new NullPointerException("renderer type must not be null.");
143 }
144 if (renderer == null)
145 {
146 log.severe("addRenderer: renderer = null is not allowed");
147 throw new NullPointerException("renderer must not be null.");
148 }
149
150 _put(componentFamily, rendererType, renderer);
151
152 if (log.isLoggable(Level.FINEST))
153 {
154 log.finest("add Renderer family = " + componentFamily + " rendererType = " + rendererType
155 + " renderer class = " + renderer.getClass().getName());
156 }
157 }
158
159
160
161
162
163
164
165
166 synchronized private void _put(String componentFamily, String rendererType, Renderer renderer)
167 {
168 Map <String,Renderer> familyRendererMap = _renderers.get(componentFamily);
169 if (familyRendererMap == null)
170 {
171 familyRendererMap = new ConcurrentHashMap<String, Renderer>(8, 0.75f, 1);
172 _renderers.put(componentFamily, familyRendererMap);
173 }
174 else
175 {
176 if (familyRendererMap.get(rendererType) != null)
177 {
178
179
180
181 log.fine("Overwriting renderer with family = " + componentFamily +
182 " rendererType = " + rendererType +
183 " renderer class = " + renderer.getClass().getName());
184 }
185 }
186 familyRendererMap.put(rendererType, renderer);
187 }
188
189 @Override
190 public ResponseStateManager getResponseStateManager()
191 {
192 return _responseStateManager;
193 }
194
195
196
197
198 @Override
199 public Iterator<String> getComponentFamilies()
200 {
201
202 return _renderers.keySet().iterator();
203 }
204
205
206
207
208 @Override
209 public Iterator<String> getRendererTypes(String componentFamily)
210 {
211
212 Map<String, Renderer> map = _renderers.get(componentFamily);
213 if (map != null)
214 {
215 return map.keySet().iterator();
216 }
217
218
219
220
221
222
223
224 return Collections.<String>emptySet().iterator();
225
226
227
228 }
229
230 @Override
231 public ResponseWriter createResponseWriter(Writer writer, String contentTypeListString, String characterEncoding)
232 {
233 FacesContext facesContext = FacesContext.getCurrentInstance();
234 MyfacesConfig myfacesConfig = MyfacesConfig.getCurrentInstance(
235 facesContext.getExternalContext());
236 String selectedContentType = null;
237 String writerContentType = null;
238 boolean isAjaxRequest = facesContext.getPartialViewContext().isAjaxRequest();
239 String contentTypeListStringFromAccept = null;
240
241
242
243
244
245
246
247 if (contentTypeListString != null)
248 {
249 selectedContentType = ContentTypeUtils.chooseWriterContentType(contentTypeListString,
250 ContentTypeUtils.HTML_ALLOWED_CONTENT_TYPES,
251 isAjaxRequest ? ContentTypeUtils.AJAX_XHTML_ALLOWED_CONTENT_TYPES :
252 ContentTypeUtils.XHTML_ALLOWED_CONTENT_TYPES);
253 }
254
255
256
257 if (selectedContentType == null)
258 {
259 contentTypeListStringFromAccept =
260 ContentTypeUtils.getContentTypeFromAcceptHeader(facesContext);
261
262 if (contentTypeListStringFromAccept != null)
263 {
264 selectedContentType = ContentTypeUtils.chooseWriterContentType(contentTypeListStringFromAccept,
265 ContentTypeUtils.HTML_ALLOWED_CONTENT_TYPES,
266 isAjaxRequest ? ContentTypeUtils.AJAX_XHTML_ALLOWED_CONTENT_TYPES :
267 ContentTypeUtils.XHTML_ALLOWED_CONTENT_TYPES);
268 }
269 }
270
271
272 if (selectedContentType == null)
273 {
274 if (contentTypeListString == null && contentTypeListStringFromAccept == null)
275 {
276
277 selectedContentType = myfacesConfig.getDefaultResponseWriterContentTypeMode();
278 }
279 else
280 {
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406