001: /*
002: * Copyright 2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.myfaces.shared_impl.renderkit.html;
017:
018: import org.apache.commons.logging.Log;
019: import org.apache.commons.logging.LogFactory;
020: import org.apache.myfaces.shared_impl.renderkit.JSFAttr;
021: import org.apache.myfaces.shared_impl.renderkit.RendererUtils;
022: import org.apache.myfaces.shared_impl.util.NullIterator;
023:
024: import javax.faces.application.FacesMessage;
025: import javax.faces.component.UIComponent;
026: import javax.faces.component.UIMessages;
027: import javax.faces.component.html.HtmlMessages;
028: import javax.faces.context.FacesContext;
029: import javax.faces.context.ResponseWriter;
030: import java.io.IOException;
031: import java.util.Iterator;
032: import java.util.Map;
033:
034: /**
035: * @author Manfred Geiler (latest modification by $Author: baranda $)
036: * @version $Revision: 453024 $ $Date: 2006-10-04 23:02:55 +0200 (Mi, 04 Okt 2006) $
037: */
038: public abstract class HtmlMessagesRendererBase extends
039: HtmlMessageRendererBase {
040: private static final Log log = LogFactory
041: .getLog(HtmlMessagesRendererBase.class);
042:
043: protected static final String LAYOUT_LIST = "list";
044: protected static final String LAYOUT_TABLE = "table";
045:
046: protected void renderMessages(FacesContext facesContext,
047: UIComponent messages) throws IOException {
048: MessagesIterator messagesIterator = new MessagesIterator(
049: facesContext, isGlobalOnly(messages));
050:
051: if (messagesIterator.hasNext()) {
052: String layout = getLayout(messages);
053: if (layout == null) {
054: if (log.isDebugEnabled()) {
055: log
056: .debug("No messages layout given, using default layout 'list'.");
057: }
058: renderList(facesContext, messages, messagesIterator);
059: } else if (layout.equalsIgnoreCase(LAYOUT_TABLE)) {
060: renderTable(facesContext, messages, messagesIterator);
061: } else {
062: if (log.isWarnEnabled()
063: && !layout.equalsIgnoreCase(LAYOUT_LIST)) {
064: log.warn("Unsupported messages layout '" + layout
065: + "' - using default layout 'list'.");
066: }
067: renderList(facesContext, messages, messagesIterator);
068: }
069: }
070: }
071:
072: private void renderList(FacesContext facesContext,
073: UIComponent messages, MessagesIterator messagesIterator)
074: throws IOException {
075: ResponseWriter writer = facesContext.getResponseWriter();
076:
077: writer.startElement(HTML.UL_ELEM, messages);
078: HtmlRendererUtils.writeIdIfNecessary(writer, messages,
079: facesContext);
080: HtmlRendererUtils.renderHTMLAttributes(writer, messages,
081: HTML.UNIVERSAL_ATTRIBUTES);
082:
083: while (messagesIterator.hasNext()) {
084: writer
085: .startElement(
086: org.apache.myfaces.shared_impl.renderkit.html.HTML.LI_ELEM,
087: messages);
088: renderSingleFacesMessage(facesContext, messages,
089: (FacesMessage) messagesIterator.next(),
090: messagesIterator.getClientId());
091: writer.endElement(HTML.LI_ELEM);
092: }
093:
094: writer.endElement(HTML.UL_ELEM);
095: }
096:
097: private void renderTable(FacesContext facesContext,
098: UIComponent messages, MessagesIterator messagesIterator)
099: throws IOException {
100: ResponseWriter writer = facesContext.getResponseWriter();
101:
102: writer.startElement(HTML.TABLE_ELEM, messages);
103: HtmlRendererUtils.writeIdIfNecessary(writer, messages,
104: facesContext);
105: HtmlRendererUtils.renderHTMLAttributes(writer, messages,
106: HTML.UNIVERSAL_ATTRIBUTES);
107:
108: while (messagesIterator.hasNext()) {
109: writer.startElement(HTML.TR_ELEM, messages);
110: writer.startElement(HTML.TD_ELEM, messages);
111: renderSingleFacesMessage(facesContext, messages,
112: (FacesMessage) messagesIterator.next(),
113: messagesIterator.getClientId());
114:
115: writer.endElement(HTML.TD_ELEM);
116: writer.endElement(HTML.TR_ELEM);
117: }
118:
119: writer.endElement(HTML.TABLE_ELEM);
120: }
121:
122: public static String[] getStyleAndStyleClass(UIComponent messages,
123: FacesMessage.Severity severity) {
124: String style = null;
125: String styleClass = null;
126: if (messages instanceof HtmlMessages) {
127: if (severity == FacesMessage.SEVERITY_INFO) {
128: style = ((HtmlMessages) messages).getInfoStyle();
129: styleClass = ((HtmlMessages) messages).getInfoClass();
130: } else if (severity == FacesMessage.SEVERITY_WARN) {
131: style = ((HtmlMessages) messages).getWarnStyle();
132: styleClass = ((HtmlMessages) messages).getWarnClass();
133: } else if (severity == FacesMessage.SEVERITY_ERROR) {
134: style = ((HtmlMessages) messages).getErrorStyle();
135: styleClass = ((HtmlMessages) messages).getErrorClass();
136: } else if (severity == FacesMessage.SEVERITY_FATAL) {
137: style = ((HtmlMessages) messages).getFatalStyle();
138: styleClass = ((HtmlMessages) messages).getFatalClass();
139: }
140:
141: if (style == null) {
142: style = ((HtmlMessages) messages).getStyle();
143: }
144:
145: if (styleClass == null) {
146: styleClass = ((HtmlMessages) messages).getStyleClass();
147: }
148: } else {
149: Map attr = messages.getAttributes();
150: if (severity == FacesMessage.SEVERITY_INFO) {
151: style = (String) attr
152: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.INFO_STYLE_ATTR);
153: styleClass = (String) attr
154: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.INFO_CLASS_ATTR);
155: } else if (severity == FacesMessage.SEVERITY_WARN) {
156: style = (String) attr
157: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.WARN_STYLE_ATTR);
158: styleClass = (String) attr
159: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.WARN_CLASS_ATTR);
160: } else if (severity == FacesMessage.SEVERITY_ERROR) {
161: style = (String) attr
162: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.ERROR_STYLE_ATTR);
163: styleClass = (String) attr
164: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.ERROR_CLASS_ATTR);
165: } else if (severity == FacesMessage.SEVERITY_FATAL) {
166: style = (String) attr
167: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.FATAL_STYLE_ATTR);
168: styleClass = (String) attr
169: .get(JSFAttr.FATAL_CLASS_ATTR);
170: }
171:
172: if (style == null) {
173: style = (String) attr
174: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.STYLE_CLASS_ATTR);
175: }
176:
177: if (styleClass == null) {
178: styleClass = (String) attr
179: .get(org.apache.myfaces.shared_impl.renderkit.JSFAttr.STYLE_CLASS_ATTR);
180: }
181: }
182:
183: return new String[] { style, styleClass };
184: }
185:
186: protected String getTitle(UIComponent component) {
187: if (component instanceof HtmlMessages) {
188: return ((HtmlMessages) component).getTitle();
189: } else {
190: return (String) component
191: .getAttributes()
192: .get(
193: org.apache.myfaces.shared_impl.renderkit.JSFAttr.TITLE_ATTR);
194: }
195: }
196:
197: protected boolean isTooltip(UIComponent component) {
198: if (component instanceof HtmlMessages) {
199: return ((HtmlMessages) component).isTooltip();
200: } else {
201: return org.apache.myfaces.shared_impl.renderkit.RendererUtils
202: .getBooleanAttribute(
203: component,
204: org.apache.myfaces.shared_impl.renderkit.JSFAttr.TOOLTIP_ATTR,
205: false);
206: }
207: }
208:
209: protected boolean isShowSummary(UIComponent component) {
210: if (component instanceof UIMessages) {
211: return ((UIMessages) component).isShowSummary();
212: } else {
213: return RendererUtils.getBooleanAttribute(component,
214: JSFAttr.SHOW_SUMMARY_ATTR, false);
215: }
216: }
217:
218: protected boolean isShowDetail(UIComponent component) {
219: if (component instanceof UIMessages) {
220: return ((UIMessages) component).isShowDetail();
221: } else {
222: return org.apache.myfaces.shared_impl.renderkit.RendererUtils
223: .getBooleanAttribute(component,
224: JSFAttr.SHOW_DETAIL_ATTR, false);
225: }
226: }
227:
228: protected boolean isGlobalOnly(UIComponent component) {
229: if (component instanceof UIMessages) {
230: return ((UIMessages) component).isGlobalOnly();
231: } else {
232: return org.apache.myfaces.shared_impl.renderkit.RendererUtils
233: .getBooleanAttribute(component,
234: JSFAttr.GLOBAL_ONLY_ATTR, false);
235: }
236: }
237:
238: protected String getLayout(UIComponent component) {
239: if (component instanceof HtmlMessages) {
240: return ((HtmlMessages) component).getLayout();
241: } else {
242: return (String) component.getAttributes().get(
243: JSFAttr.LAYOUT_ATTR);
244: }
245: }
246:
247: private static class MessagesIterator implements Iterator {
248: private FacesContext _facesContext;
249: private Iterator _globalMessagesIterator;
250: private Iterator _clientIdsWithMessagesIterator;
251: private Iterator _componentMessagesIterator = null;
252: private String _clientId = null;
253:
254: public MessagesIterator(FacesContext facesContext,
255: boolean globalOnly) {
256: _facesContext = facesContext;
257: if (globalOnly) {
258: _globalMessagesIterator = facesContext
259: .getMessages(null);
260: _clientIdsWithMessagesIterator = NullIterator
261: .instance();
262: } else {
263: _globalMessagesIterator = org.apache.myfaces.shared_impl.util.NullIterator
264: .instance();
265: _clientIdsWithMessagesIterator = facesContext
266: .getClientIdsWithMessages();
267: }
268: _componentMessagesIterator = null;
269: _clientId = null;
270: }
271:
272: public boolean hasNext() {
273: return _globalMessagesIterator.hasNext()
274: || _clientIdsWithMessagesIterator.hasNext()
275: || (_componentMessagesIterator != null && _componentMessagesIterator
276: .hasNext());
277: }
278:
279: public Object next() {
280: if (_globalMessagesIterator.hasNext()) {
281: return _globalMessagesIterator.next();
282: } else if (_componentMessagesIterator != null
283: && _componentMessagesIterator.hasNext()) {
284: return _componentMessagesIterator.next();
285: } else {
286: _clientId = (String) _clientIdsWithMessagesIterator
287: .next();
288: _componentMessagesIterator = _facesContext
289: .getMessages(_clientId);
290: return _componentMessagesIterator.next();
291: }
292: }
293:
294: public void remove() {
295: throw new UnsupportedOperationException(this .getClass()
296: .getName()
297: + " UnsupportedOperationException");
298: }
299:
300: public String getClientId() {
301: return _clientId;
302: }
303: }
304:
305: }
|