001: /*
002: * This file is part of the WfMOpen project.
003: * Copyright (C) 2001-2005 Danet GmbH (www.danet.de), BU BTS.
004: * All rights reserved.
005: *
006: * This program is free software; you can redistribute it and/or modify
007: * it under the terms of the GNU General Public License as published by
008: * the Free Software Foundation; either version 2 of the License, or
009: * (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * $Id: MessagesPostProcessor.java,v 1.6 2006/09/29 12:32:11 drmlipp Exp $
021: *
022: * $Log: MessagesPostProcessor.java,v $
023: * Revision 1.6 2006/09/29 12:32:11 drmlipp
024: * Consistently using WfMOpen as projct name now.
025: *
026: * Revision 1.5 2006/09/01 11:14:54 drmlipp
027: * Further improved error handling.
028: *
029: * Revision 1.4 2006/08/31 14:15:17 drmlipp
030: * Improved error handling.
031: *
032: * Revision 1.3 2006/08/30 13:47:15 drmlipp
033: * Avoid null pointer exception.
034: *
035: * Revision 1.2 2006/07/26 13:49:02 drmlipp
036: * Continued field related messages.
037: *
038: * Revision 1.1 2006/07/19 20:11:35 mlipp
039: * Prepared message post processing.
040: *
041: */
042: package de.danet.an.util.jsf;
043:
044: import java.util.Iterator;
045: import java.util.Map;
046:
047: import javax.faces.application.FacesMessage;
048: import javax.faces.component.UIComponent;
049: import javax.faces.component.UIViewRoot;
050: import javax.faces.context.FacesContext;
051: import javax.faces.event.PhaseEvent;
052: import javax.faces.event.PhaseId;
053: import javax.faces.event.PhaseListener;
054:
055: import de.danet.an.util.Misc;
056:
057: /**
058: * This class provides a "before render response" phase listener that
059: * manipulates the accumulated messages.
060: *
061: * @author Michael Lipp
062: */
063: public class MessagesPostProcessor implements PhaseListener {
064:
065: /* (non-Javadoc)
066: * @see javax.faces.event.PhaseListener#getPhaseId()
067: */
068: public PhaseId getPhaseId() {
069: return PhaseId.RENDER_RESPONSE;
070: }
071:
072: /* (non-Javadoc)
073: * @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
074: */
075: public void beforePhase(PhaseEvent e) {
076: FacesContext fc = e.getFacesContext();
077: UIViewRoot root = fc.getViewRoot();
078: for (Iterator i = fc.getClientIdsWithMessages(); i.hasNext();) {
079: String clientId = (String) i.next();
080: if (clientId == null) {
081: continue;
082: }
083: UIComponent c = root.findComponent(clientId);
084: if (c == null) {
085: continue;
086: }
087: Map attrs = c.getAttributes();
088: // if a local message has been registered, replace detail
089: String localSwapMessages = (String) attrs
090: .get("localSwapMessages");
091: String localErrorDetail = (String) attrs
092: .get("localErrorDetail");
093: String localErrorSummary = (String) attrs
094: .get("localErrorSummary");
095: if (localSwapMessages != null || localErrorDetail != null
096: || localErrorSummary != null) {
097: for (Iterator j = fc.getMessages(clientId); j.hasNext();) {
098: FacesMessage msg = (FacesMessage) j.next();
099: if (Boolean.valueOf(localSwapMessages)
100: .booleanValue()) {
101: String h = msg.getDetail();
102: msg.setDetail(msg.getSummary());
103: msg.setSummary(h);
104: }
105: if (localErrorDetail != null) {
106: msg.setDetail(localErrorDetail);
107: }
108: if (localErrorSummary != null) {
109: msg.setSummary(localErrorSummary);
110: }
111: }
112: }
113:
114: // if a global message (forward hint) has been registered, make
115: // sure that it exists (but only once)
116: String globalErrorDetail = (String) attrs
117: .get("globalErrorDetail");
118: String globalErrorSummary = (String) attrs
119: .get("globalErrorSummary");
120: boolean found = false;
121: if (globalErrorDetail != null || globalErrorSummary != null) {
122: for (Iterator j = fc.getMessages(null); j.hasNext();) {
123: FacesMessage msg = (FacesMessage) j.next();
124: if (msg != null
125: && Misc.equals(msg.getDetail(),
126: globalErrorDetail)
127: && Misc.equals(msg.getSummary(),
128: globalErrorSummary)) {
129: found = true;
130: break;
131: }
132: }
133: if (!found) {
134: fc.addMessage(null, new FacesMessage(
135: FacesMessage.SEVERITY_ERROR,
136: globalErrorSummary, globalErrorDetail));
137: }
138: }
139: }
140: }
141:
142: /* (non-Javadoc)
143: * @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
144: */
145: public void afterPhase(PhaseEvent arg0) {
146: }
147:
148: }
|