1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.shared_orchestra.renderkit.html;
20
21 import org.apache.myfaces.shared_orchestra.renderkit.JSFAttr;
22 import org.apache.myfaces.shared_orchestra.renderkit.RendererUtils;
23 import org.apache.myfaces.shared_orchestra.renderkit.html.HTML;
24 import org.apache.myfaces.shared_orchestra.renderkit.html.HtmlMessageRendererBase;
25 import org.apache.myfaces.shared_orchestra.util.NullIterator;
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28
29 import javax.faces.application.FacesMessage;
30 import javax.faces.component.UIComponent;
31 import javax.faces.component.UIMessages;
32 import javax.faces.component.html.HtmlMessages;
33 import javax.faces.context.FacesContext;
34 import javax.faces.context.ResponseWriter;
35 import java.io.IOException;
36 import java.util.Iterator;
37 import java.util.Map;
38
39
40
41
42
43 public abstract class HtmlMessagesRendererBase
44 extends HtmlMessageRendererBase
45 {
46 private static final Log log = LogFactory.getLog(HtmlMessagesRendererBase.class);
47
48 protected static final String LAYOUT_LIST = "list";
49 protected static final String LAYOUT_TABLE = "table";
50
51
52 protected void renderMessages(FacesContext facesContext,
53 UIComponent messages)
54 throws IOException
55 {
56 MessagesIterator messagesIterator = new MessagesIterator(facesContext,
57 isGlobalOnly(messages));
58
59 if (messagesIterator.hasNext())
60 {
61 String layout = getLayout(messages);
62 if (layout == null)
63 {
64 if (log.isDebugEnabled())
65 {
66 log.debug("No messages layout given, using default layout 'list'.");
67 }
68 renderList(facesContext, messages, messagesIterator);
69 }
70 else if (layout.equalsIgnoreCase(LAYOUT_TABLE))
71 {
72 renderTable(facesContext, messages, messagesIterator);
73 }
74 else
75 {
76 if (log.isWarnEnabled() && !layout.equalsIgnoreCase(LAYOUT_LIST))
77 {
78 log.warn("Unsupported messages layout '" + layout + "' - using default layout 'list'.");
79 }
80 renderList(facesContext, messages, messagesIterator);
81 }
82 }
83 }
84
85
86 protected void renderList(FacesContext facesContext,
87 UIComponent messages,
88 MessagesIterator messagesIterator)
89 throws IOException
90 {
91 ResponseWriter writer = facesContext.getResponseWriter();
92
93 writer.startElement(HTML.UL_ELEM, messages);
94 HtmlRendererUtils.writeIdIfNecessary(writer, messages, facesContext);
95 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_ATTR, HTML.STYLE_ATTR, getComponentStyle(messages));
96 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_CLASS_ATTR, HTML.STYLE_CLASS_ATTR, getComponentStyleClass(messages));
97
98 while(messagesIterator.hasNext())
99 {
100 writer.startElement(org.apache.myfaces.shared_orchestra.renderkit.html.HTML.LI_ELEM, messages);
101
102 FacesMessage facesMessage = (FacesMessage)messagesIterator.next();
103
104 String[] styleAndClass = getStyleAndStyleClass(messages, facesMessage.getSeverity());
105 String style = styleAndClass[0];
106 String styleClass = styleAndClass[1];
107
108 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_ATTR, HTML.STYLE_ATTR, style);
109 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_CLASS_ATTR, HTML.STYLE_CLASS_ATTR, styleClass);
110
111 renderSingleFacesMessage(facesContext,
112 messages,
113 facesMessage,
114 messagesIterator.getClientId(),false,false);
115 writer.endElement(HTML.LI_ELEM);
116 }
117
118 writer.endElement(HTML.UL_ELEM);
119 }
120
121
122 protected void renderTable(FacesContext facesContext,
123 UIComponent messages,
124 MessagesIterator messagesIterator)
125 throws IOException
126 {
127 ResponseWriter writer = facesContext.getResponseWriter();
128
129 writer.startElement(HTML.TABLE_ELEM, messages);
130 HtmlRendererUtils.writeIdIfNecessary(writer, messages, facesContext);
131
132 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_ATTR, HTML.STYLE_ATTR, getComponentStyle(messages));
133 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_CLASS_ATTR, HTML.STYLE_CLASS_ATTR, getComponentStyleClass(messages));
134
135 while(messagesIterator.hasNext())
136 {
137 writer.startElement(HTML.TR_ELEM, messages);
138 writer.startElement(HTML.TD_ELEM, messages);
139
140 FacesMessage facesMessage = (FacesMessage)messagesIterator.next();
141
142 String[] styleAndClass = getStyleAndStyleClass(messages, facesMessage.getSeverity());
143 String style = styleAndClass[0];
144 String styleClass = styleAndClass[1];
145
146 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_ATTR, HTML.STYLE_ATTR, style);
147 HtmlRendererUtils.renderHTMLAttribute(writer, HTML.STYLE_CLASS_ATTR, HTML.STYLE_CLASS_ATTR, styleClass);
148
149 renderSingleFacesMessage(facesContext,
150 messages,
151 facesMessage,
152 messagesIterator.getClientId(),false,false);
153
154 writer.endElement(HTML.TD_ELEM);
155 writer.endElement(HTML.TR_ELEM);
156 }
157
158 writer.endElement(HTML.TABLE_ELEM);
159 }
160
161
162 public static String[] getStyleAndStyleClass(UIComponent messages,
163 FacesMessage.Severity severity)
164 {
165 String style = null;
166 String styleClass = null;
167 if (messages instanceof HtmlMessages)
168 {
169 if (severity == FacesMessage.SEVERITY_INFO)
170 {
171 style = ((HtmlMessages)messages).getInfoStyle();
172 styleClass = ((HtmlMessages)messages).getInfoClass();
173 }
174 else if (severity == FacesMessage.SEVERITY_WARN)
175 {
176 style = ((HtmlMessages)messages).getWarnStyle();
177 styleClass = ((HtmlMessages)messages).getWarnClass();
178 }
179 else if (severity == FacesMessage.SEVERITY_ERROR)
180 {
181 style = ((HtmlMessages)messages).getErrorStyle();
182 styleClass = ((HtmlMessages)messages).getErrorClass();
183 }
184 else if (severity == FacesMessage.SEVERITY_FATAL)
185 {
186 style = ((HtmlMessages)messages).getFatalStyle();
187 styleClass = ((HtmlMessages)messages).getFatalClass();
188 }
189
190
191
192
193
194
195
196
197
198
199 }
200 else
201 {
202 Map attr = messages.getAttributes();
203 if (severity == FacesMessage.SEVERITY_INFO)
204 {
205 style = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.INFO_STYLE_ATTR);
206 styleClass = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.INFO_CLASS_ATTR);
207 }
208 else if (severity == FacesMessage.SEVERITY_WARN)
209 {
210 style = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.WARN_STYLE_ATTR);
211 styleClass = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.WARN_CLASS_ATTR);
212 }
213 else if (severity == FacesMessage.SEVERITY_ERROR)
214 {
215 style = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.ERROR_STYLE_ATTR);
216 styleClass = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.ERROR_CLASS_ATTR);
217 }
218 else if (severity == FacesMessage.SEVERITY_FATAL)
219 {
220 style = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.FATAL_STYLE_ATTR);
221 styleClass = (String)attr.get(JSFAttr.FATAL_CLASS_ATTR);
222 }
223
224
225
226
227
228
229
230
231
232
233 }
234
235 return new String[] {style, styleClass};
236 }
237
238 protected String getComponentStyleClass(UIComponent messages)
239 {
240 String styleClass = null;
241 if (messages instanceof HtmlMessages)
242 {
243 styleClass = ((HtmlMessages)messages).getStyleClass();
244 }
245 else
246 {
247 Map attr = messages.getAttributes();
248 styleClass = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.STYLE_CLASS_ATTR);
249 }
250 return styleClass;
251 }
252
253 protected String getComponentStyle(UIComponent messages)
254 {
255 String style = null;
256 if (messages instanceof HtmlMessages)
257 {
258 style = ((HtmlMessages)messages).getStyle();
259 }
260 else
261 {
262 Map attr = messages.getAttributes();
263 style = (String)attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.STYLE_ATTR);
264 }
265 return style;
266 }
267
268 protected String getTitle(UIComponent component)
269 {
270 if (component instanceof HtmlMessages)
271 {
272 return ((HtmlMessages)component).getTitle();
273 }
274 else
275 {
276 return (String)component.getAttributes().get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.TITLE_ATTR);
277 }
278 }
279
280 protected boolean isTooltip(UIComponent component)
281 {
282 if (component instanceof HtmlMessages)
283 {
284 return ((HtmlMessages)component).isTooltip();
285 }
286 else
287 {
288 return org.apache.myfaces.shared_orchestra.renderkit.RendererUtils.getBooleanAttribute(component, org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.TOOLTIP_ATTR, false);
289 }
290 }
291
292 protected boolean isShowSummary(UIComponent component)
293 {
294 if (component instanceof UIMessages)
295 {
296 return ((UIMessages)component).isShowSummary();
297 }
298 else
299 {
300 return RendererUtils.getBooleanAttribute(component, JSFAttr.SHOW_SUMMARY_ATTR, false);
301 }
302 }
303
304 protected boolean isShowDetail(UIComponent component)
305 {
306 if (component instanceof UIMessages)
307 {
308 return ((UIMessages)component).isShowDetail();
309 }
310 else
311 {
312 return org.apache.myfaces.shared_orchestra.renderkit.RendererUtils.getBooleanAttribute(component, JSFAttr.SHOW_DETAIL_ATTR, false);
313 }
314 }
315
316 protected boolean isGlobalOnly(UIComponent component)
317 {
318 if (component instanceof UIMessages)
319 {
320 return ((UIMessages)component).isGlobalOnly();
321 }
322 else
323 {
324 return org.apache.myfaces.shared_orchestra.renderkit.RendererUtils.getBooleanAttribute(component, JSFAttr.GLOBAL_ONLY_ATTR, false);
325 }
326 }
327
328 protected String getLayout(UIComponent component)
329 {
330 if (component instanceof HtmlMessages)
331 {
332 return ((HtmlMessages)component).getLayout();
333 }
334 else
335 {
336 return (String)component.getAttributes().get(JSFAttr.LAYOUT_ATTR);
337 }
338 }
339
340
341
342 private static class MessagesIterator implements Iterator
343 {
344 private FacesContext _facesContext;
345 private Iterator _globalMessagesIterator;
346 private Iterator _clientIdsWithMessagesIterator;
347 private Iterator _componentMessagesIterator = null;
348 private String _clientId = null;
349
350 public MessagesIterator(FacesContext facesContext, boolean globalOnly)
351 {
352 _facesContext = facesContext;
353 if (globalOnly)
354 {
355 _globalMessagesIterator = facesContext.getMessages(null);
356 _clientIdsWithMessagesIterator = NullIterator.instance();
357 }
358 else
359 {
360 _globalMessagesIterator = org.apache.myfaces.shared_orchestra.util.NullIterator.instance();
361 _clientIdsWithMessagesIterator = facesContext.getClientIdsWithMessages();
362 }
363 _componentMessagesIterator = null;
364 _clientId = null;
365 }
366
367 public boolean hasNext()
368 {
369 return _globalMessagesIterator.hasNext() ||
370 _clientIdsWithMessagesIterator.hasNext() ||
371 (_componentMessagesIterator != null && _componentMessagesIterator.hasNext());
372 }
373
374 public Object next()
375 {
376 if (_globalMessagesIterator.hasNext())
377 {
378 return _globalMessagesIterator.next();
379 }
380 else if (_componentMessagesIterator != null && _componentMessagesIterator.hasNext())
381 {
382 return _componentMessagesIterator.next();
383 }
384 else
385 {
386 _clientId = (String)_clientIdsWithMessagesIterator.next();
387 _componentMessagesIterator = _facesContext.getMessages(_clientId);
388 return _componentMessagesIterator.next();
389 }
390 }
391
392 public void remove()
393 {
394 throw new UnsupportedOperationException(this.getClass().getName() + " UnsupportedOperationException");
395 }
396
397 public String getClientId()
398 {
399 return _clientId;
400 }
401 }
402
403 }