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 java.io.IOException;
22 import java.util.Iterator;
23 import java.util.Map;
24
25 import javax.faces.application.FacesMessage;
26 import javax.faces.component.UIComponent;
27 import javax.faces.component.UIMessage;
28 import javax.faces.component.UIViewRoot;
29 import javax.faces.component.html.HtmlMessage;
30 import javax.faces.context.FacesContext;
31 import javax.faces.context.ResponseWriter;
32
33 import org.apache.commons.logging.Log;
34 import org.apache.commons.logging.LogFactory;
35 import org.apache.myfaces.shared_orchestra.renderkit.JSFAttr;
36 import org.apache.myfaces.shared_orchestra.renderkit.RendererUtils;
37 import org.apache.myfaces.shared_orchestra.renderkit.html.HTML;
38
39
40
41
42
43 public abstract class HtmlMessageRendererBase
44 extends HtmlRenderer
45 {
46 private static final Log log = LogFactory.getLog(HtmlMessageRendererBase.class);
47
48 protected abstract String getSummary(FacesContext facesContext,
49 UIComponent message,
50 FacesMessage facesMessage,
51 String msgClientId);
52
53 protected abstract String getDetail(FacesContext facesContext,
54 UIComponent message,
55 FacesMessage facesMessage,
56 String msgClientId);
57
58
59 protected void renderMessage(FacesContext facesContext,
60 UIComponent message)
61 throws IOException
62 {
63 renderMessage(facesContext, message, false);
64 }
65
66
67
68
69
70
71 protected void renderMessage(FacesContext facesContext, UIComponent message, boolean alwaysRenderSpan) throws IOException
72 {
73 String forAttr = getFor(message);
74 if (forAttr == null)
75 {
76 log.error("Attribute 'for' of UIMessage must not be null");
77 return;
78 }
79
80 UIComponent forComponent = message.findComponent(forAttr);
81 if (forComponent == null)
82 {
83 log.error("Could not render Message. Unable to find component '" + forAttr + "' (calling findComponent on component '" + message.getClientId(facesContext) + "'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.");
84 return;
85 }
86
87 String clientId = forComponent.getClientId(facesContext);
88
89 Iterator messageIterator = facesContext.getMessages(clientId);
90 if (!messageIterator.hasNext())
91 {
92
93 if (alwaysRenderSpan)
94 {
95
96 ResponseWriter writer = facesContext.getResponseWriter();
97 writer.startElement(HTML.SPAN_ELEM, message);
98 writer.writeAttribute(HTML.ID_ATTR, message.getId(), null);
99 writer.endElement(HTML.SPAN_ELEM);
100 }
101 return;
102 }
103
104
105 FacesMessage facesMessage = (FacesMessage) messageIterator.next();
106
107
108 renderSingleFacesMessage(facesContext, message, facesMessage, clientId);
109 }
110
111
112 protected void renderSingleFacesMessage(FacesContext facesContext,
113 UIComponent message,
114 FacesMessage facesMessage,
115 String messageClientId)
116 throws IOException
117 {
118 renderSingleFacesMessage(facesContext, message, facesMessage, messageClientId,true);
119 }
120
121 protected void renderSingleFacesMessage(FacesContext facesContext,
122 UIComponent message,
123 FacesMessage facesMessage,
124 String messageClientId,
125 boolean renderId)
126 throws IOException
127 {
128 renderSingleFacesMessage(facesContext, message, facesMessage, messageClientId, renderId, true);
129 }
130
131 protected void renderSingleFacesMessage(FacesContext facesContext,
132 UIComponent message,
133 FacesMessage facesMessage,
134 String messageClientId,
135 boolean renderId,
136 boolean renderStyleAndStyleClass)
137 throws IOException
138 {
139
140 String[] styleAndClass = HtmlMessageRendererBase.getStyleAndStyleClass(message, facesMessage.getSeverity());
141 String style = styleAndClass[0];
142 String styleClass = styleAndClass[1];
143
144 String summary = getSummary(facesContext, message, facesMessage, messageClientId);
145 String detail = getDetail(facesContext, message, facesMessage, messageClientId);
146
147 String title = getTitle(message);
148 boolean tooltip = isTooltip(message);
149
150 if (title == null && tooltip)
151 {
152 title = summary;
153 }
154
155 ResponseWriter writer = facesContext.getResponseWriter();
156
157 boolean span = false;
158
159
160 if (message.getId() != null && !message.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
161 {
162 span = true;
163
164 writer.startElement(HTML.SPAN_ELEM, message);
165
166 if (renderId)
167 {
168 HtmlRendererUtils.writeIdIfNecessary(writer, message, facesContext);
169 }
170
171 HtmlRendererUtils.renderHTMLAttributes(writer, message, HTML.MESSAGE_PASSTHROUGH_ATTRIBUTES_WITHOUT_TITLE_STYLE_AND_STYLE_CLASS);
172 }
173 else
174 {
175 span = HtmlRendererUtils.renderHTMLAttributesWithOptionalStartElement(
176 writer, message, HTML.SPAN_ELEM, HTML.MESSAGE_PASSTHROUGH_ATTRIBUTES_WITHOUT_TITLE_STYLE_AND_STYLE_CLASS);
177 }
178
179 span |= HtmlRendererUtils.renderHTMLAttributeWithOptionalStartElement(writer, message, HTML.SPAN_ELEM, HTML.TITLE_ATTR, title, span);
180 if (renderStyleAndStyleClass)
181 {
182 span |= HtmlRendererUtils.renderHTMLAttributeWithOptionalStartElement(writer, message, HTML.SPAN_ELEM, HTML.STYLE_ATTR, style, span);
183 span |= HtmlRendererUtils.renderHTMLAttributeWithOptionalStartElement(writer, message, HTML.SPAN_ELEM, HTML.STYLE_CLASS_ATTR, styleClass, span);
184 }
185
186
187 boolean showSummary = isShowSummary(message) && (summary != null);
188 boolean showDetail = isShowDetail(message) && (detail != null);
189
190 if (showSummary && !(title == null && tooltip))
191 {
192 writer.writeText(summary, null);
193 if (showDetail)
194 {
195 writer.writeText(" ", null);
196 }
197 }
198
199 if (showDetail)
200 {
201 writer.writeText(detail, null);
202 }
203
204 if (span)
205 {
206 writer.endElement(org.apache.myfaces.shared_orchestra.renderkit.html.HTML.SPAN_ELEM);
207 }
208 }
209
210
211 public static String[] getStyleAndStyleClass(UIComponent message,
212 FacesMessage.Severity severity)
213 {
214 String style = null;
215 String styleClass = null;
216 if (message instanceof HtmlMessage)
217 {
218 if (severity == FacesMessage.SEVERITY_INFO)
219 {
220 style = ((HtmlMessage) message).getInfoStyle();
221 styleClass = ((HtmlMessage) message).getInfoClass();
222 }
223 else if (severity == FacesMessage.SEVERITY_WARN)
224 {
225 style = ((HtmlMessage) message).getWarnStyle();
226 styleClass = ((HtmlMessage) message).getWarnClass();
227 }
228 else if (severity == FacesMessage.SEVERITY_ERROR)
229 {
230 style = ((HtmlMessage) message).getErrorStyle();
231 styleClass = ((HtmlMessage) message).getErrorClass();
232 }
233 else if (severity == FacesMessage.SEVERITY_FATAL)
234 {
235 style = ((HtmlMessage) message).getFatalStyle();
236 styleClass = ((HtmlMessage) message).getFatalClass();
237 }
238
239 if (style == null)
240 {
241 style = ((HtmlMessage) message).getStyle();
242 }
243
244 if (styleClass == null)
245 {
246 styleClass = ((HtmlMessage) message).getStyleClass();
247 }
248 }
249 else
250 {
251 Map attr = message.getAttributes();
252 if (severity == FacesMessage.SEVERITY_INFO)
253 {
254 style = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.INFO_STYLE_ATTR);
255 styleClass = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.INFO_CLASS_ATTR);
256 }
257 else if (severity == FacesMessage.SEVERITY_WARN)
258 {
259 style = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.WARN_STYLE_ATTR);
260 styleClass = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.WARN_CLASS_ATTR);
261 }
262 else if (severity == FacesMessage.SEVERITY_ERROR)
263 {
264 style = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.ERROR_STYLE_ATTR);
265 styleClass = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.ERROR_CLASS_ATTR);
266 }
267 else if (severity == FacesMessage.SEVERITY_FATAL)
268 {
269 style = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.FATAL_STYLE_ATTR);
270 styleClass = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.FATAL_CLASS_ATTR);
271 }
272
273 if (style == null)
274 {
275 style = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.STYLE_ATTR);
276 }
277
278 if (styleClass == null)
279 {
280 styleClass = (String) attr.get(org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.STYLE_CLASS_ATTR);
281 }
282 }
283
284 return new String[]{style, styleClass};
285 }
286
287 protected String getFor(UIComponent component)
288 {
289 if (component instanceof UIMessage)
290 {
291 return ((UIMessage) component).getFor();
292 }
293 else
294 {
295 return (String) component.getAttributes().get(JSFAttr.FOR_ATTR);
296 }
297 }
298
299 protected String getTitle(UIComponent component)
300 {
301 if (component instanceof HtmlMessage)
302 {
303 return ((HtmlMessage) component).getTitle();
304 }
305 else
306 {
307 return (String) component.getAttributes().get(JSFAttr.TITLE_ATTR);
308 }
309 }
310
311 protected boolean isTooltip(UIComponent component)
312 {
313 if (component instanceof HtmlMessage)
314 {
315 return ((HtmlMessage) component).isTooltip();
316 }
317 else
318 {
319 return org.apache.myfaces.shared_orchestra.renderkit.RendererUtils.getBooleanAttribute(component, org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.TOOLTIP_ATTR, false);
320 }
321 }
322
323 protected boolean isShowSummary(UIComponent component)
324 {
325 if (component instanceof UIMessage)
326 {
327 return ((UIMessage) component).isShowSummary();
328 }
329 else
330 {
331 return org.apache.myfaces.shared_orchestra.renderkit.RendererUtils.getBooleanAttribute(component, org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.SHOW_SUMMARY_ATTR, false);
332 }
333 }
334
335 protected boolean isShowDetail(UIComponent component)
336 {
337 if (component instanceof UIMessage)
338 {
339 return ((UIMessage) component).isShowDetail();
340 }
341 else
342 {
343 return RendererUtils.getBooleanAttribute(component, org.apache.myfaces.shared_orchestra.renderkit.JSFAttr.SHOW_DETAIL_ATTR, false);
344 }
345 }
346
347
348 }