dgraham 2002/10/20 11:58:55 Modified: src/share/org/apache/struts/action ActionMessages.java Log: Added ability to add an ActionMessages object to an ActionMessages object. Revision Changes Path 1.5 +258 -226 jakarta-struts/src/share/org/apache/struts/action/ActionMessages.java Index: ActionMessages.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionMessages.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ActionMessages.java 24 Jun 2002 18:53:01 -0000 1.4 +++ ActionMessages.java 20 Oct 2002 18:58:55 -0000 1.5 @@ -59,10 +59,8 @@ * */ - package org.apache.struts.action; - import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -71,7 +69,6 @@ import java.util.HashMap; import java.util.List; - /** * <p>A class that encapsulates messages. Messages can be either global * or they are specific to a particular bean property.</p> @@ -89,232 +86,267 @@ * @author David Geary * @author Craig R. McClanahan * @author David Winterfeldt + * @author David Graham * @version $Revision$ $Date$ * @since Struts 1.1 */ public class ActionMessages implements Serializable { + // ----------------------------------------------------- Manifest Constants - // ----------------------------------------------------- Manifest Constants - - - /** - * The "property name" marker to use for global messages, as opposed to - * those related to a specific property. - */ - public static final String GLOBAL_MESSAGE = - "org.apache.struts.action.GLOBAL_MESSAGE"; - - - // ----------------------------------------------------- Instance Variables - - - /** - * The accumulated set of <code>ActionMessage</code> objects (represented - * as an ArrayList) for each property, keyed by property name. - */ - protected HashMap messages = new HashMap(); - - /** - * The current number of the property/key being added. This is used - * to maintain the order messages are added. - */ - protected int iCount = 0; - - - // --------------------------------------------------------- Public Methods - - - /** - * Add a message to the set of messages for the specified property. An - * order of the property/key is maintained based on the initial addition - * of the property/key. - * - * @param property Property name (or ActionMessages.GLOBAL_MESSAGE) - * @param message The message to be added - */ - public void add(String property, ActionMessage message) { - - ActionMessageItem ami = (ActionMessageItem) messages.get(property); - List list = null; - - if (ami == null) { - list = new ArrayList(); - ami = new ActionMessageItem(list, iCount++); - - messages.put(property, ami); - } else { - list = ami.getList(); - } - - list.add(message); - - } - - - /** - * Clear all messages recorded by this object. - */ - public void clear() { - - messages.clear(); - - } - - - /** - * Return <code>true</code> if there are no messages recorded - * in this collection, or <code>false</code> otherwise. - */ - public boolean empty() { - - return (messages.size() == 0); - - } - - - /** - * Return the set of all recorded messages, without distinction - * by which property the messages are associated with. If there are - * no messages recorded, an empty enumeration is returned. - */ - public Iterator get() { - - if (messages.size() == 0) - return (Collections.EMPTY_LIST.iterator()); - - ArrayList results = new ArrayList(); - ArrayList actionItems = new ArrayList(); - - for (Iterator i = messages.values().iterator(); i.hasNext(); ) - actionItems.add(i.next()); - - // Sort ActionMessageItems based on the initial order the - // property/key was added to ActionMessages. - Collections.sort(actionItems, new Comparator() { - public int compare(Object o1, Object o2) { - return ((ActionMessageItem) o1).getOrder() - ((ActionMessageItem) o2).getOrder(); - } - }); - - for (Iterator i = actionItems.iterator(); i.hasNext(); ) { - ActionMessageItem ami = (ActionMessageItem)i.next(); - - for (Iterator messages = ami.getList().iterator(); messages.hasNext(); ) - results.add(messages.next()); - } - - return (results.iterator()); - - } - - - /** - * Return the set of messages related to a specific property. - * If there are no such messages, an empty enumeration is returned. - * - * @param property Property name (or ActionMessages.GLOBAL_MESSAGE) - */ - public Iterator get(String property) { - - ActionMessageItem ami = (ActionMessageItem) messages.get(property); - - if (ami == null) - return (Collections.EMPTY_LIST.iterator()); - else - return (ami.getList().iterator()); - - } - - - /** - * Return the set of property names for which at least one message has - * been recorded. If there are no messages, an empty Iterator is returned. - * If you have recorded global messages, the String value of - * <code>ActionMessages.GLOBAL_MESSAGE</code> will be one of the returned - * property names. - */ - public Iterator properties() { - - return (messages.keySet().iterator()); - - } - - - /** - * Return the number of messages recorded for all properties (including - * global messages). <strong>NOTE</strong> - it is more efficient to call - * <code>empty()</code> if all you care about is whether or not there are - * any messages at all. - */ - public int size() { - - int total = 0; - - for (Iterator i = messages.values().iterator(); i.hasNext(); ) { - ActionMessageItem ami = (ActionMessageItem) i.next(); - total += ami.getList().size(); - } - - return (total); - - } - - - /** - * Return the number of messages associated with the specified property. - * - * @param property Property name (or ActionMessages.GLOBAL_MESSAGE) - */ - public int size(String property) { - - ActionMessageItem ami = (ActionMessageItem) messages.get(property); - - if (ami == null) - return (0); - else - return (ami.getList().size()); - - } - - /** - * This class is used to store a set of messages associated with a - * property/key and the position it was initially added to list. - */ - protected class ActionMessageItem implements Serializable { - - /** - * The list of <code>ActionMessage</code>s. - */ - protected List list = null; - - /** - * The position in the list of messages. - */ - protected int iOrder = 0; - - public ActionMessageItem(List list, int iOrder) { - this.list = list; - this.iOrder = iOrder; - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - - public int getOrder() { - return iOrder; - } - - public void setOrder(int iOrder) { - this.iOrder = iOrder; - } + /** + * The "property name" marker to use for global messages, as opposed to + * those related to a specific property. + */ + public static final String GLOBAL_MESSAGE = "org.apache.struts.action.GLOBAL_MESSAGE"; + + // ----------------------------------------------------- Instance Variables + + /** + * The accumulated set of <code>ActionMessage</code> objects (represented + * as an ArrayList) for each property, keyed by property name. + */ + protected HashMap messages = new HashMap(); + + /** + * The current number of the property/key being added. This is used + * to maintain the order messages are added. + */ + protected int iCount = 0; + + // --------------------------------------------------------- Public Methods + + /** + * Create an empty <code>ActionMessages</code> object. + */ + public ActionMessages() { + super(); + } + + /** + * Create an <code>ActionMessages</code> object initialized with the given + * messages . + * + * @param messages The messages to be initially added to this object. + */ + public ActionMessages(ActionMessages messages) { + super(); + this.add(messages); + } + + /** + * Add a message to the set of messages for the specified property. An + * order of the property/key is maintained based on the initial addition + * of the property/key. + * + * @param property Property name (or ActionMessages.GLOBAL_MESSAGE) + * @param message The message to be added + */ + public void add(String property, ActionMessage message) { + + ActionMessageItem item = (ActionMessageItem) messages.get(property); + List list = null; + + if (item == null) { + list = new ArrayList(); + item = new ActionMessageItem(list, iCount++); + + messages.put(property, item); + } else { + list = item.getList(); + } + + list.add(message); + + } + + /** + * Adds the messages from the given <code>ActionMessages</code> object to + * this set of messages. The messages are added in the order they are returned from + * the properties() method. If a message's property is already in the current + * <code>ActionMessages</code> object it is added to the end of the list for that + * property. If a message's property is not in the current list it is added to the end + * of the properties. + * @param messages The <code>ActionMessages</code> object to be added. + * + */ + public void add(ActionMessages messages) { + // loop over properties + Iterator props = messages.properties(); + while (props.hasNext()) { + String property = (String) props.next(); + + // loop over messages for each property + Iterator msgs = messages.get(property); + while (msgs.hasNext()) { + ActionMessage msg = (ActionMessage) msgs.next(); + this.add(property, msg); + } + + } + } + + /** + * Clear all messages recorded by this object. + */ + public void clear() { + + messages.clear(); + + } + + /** + * Return <code>true</code> if there are no messages recorded + * in this collection, or <code>false</code> otherwise. + */ + public boolean empty() { + + return (messages.size() == 0); + + } + + /** + * Return the set of all recorded messages, without distinction + * by which property the messages are associated with. If there are + * no messages recorded, an empty enumeration is returned. + */ + public Iterator get() { + + if (messages.size() == 0) { + return (Collections.EMPTY_LIST.iterator()); + } + + ArrayList results = new ArrayList(); + ArrayList actionItems = new ArrayList(); + + for (Iterator i = messages.values().iterator(); i.hasNext();) { + actionItems.add(i.next()); + } + + // Sort ActionMessageItems based on the initial order the + // property/key was added to ActionMessages. + Collections.sort(actionItems, new Comparator() { + public int compare(Object o1, Object o2) { + return ((ActionMessageItem) o1).getOrder() - ((ActionMessageItem) o2).getOrder(); + } + }); + + for (Iterator i = actionItems.iterator(); i.hasNext();) { + ActionMessageItem ami = (ActionMessageItem) i.next(); + + for (Iterator messages = ami.getList().iterator(); messages.hasNext();) { + results.add(messages.next()); + } + } + + return (results.iterator()); + + } + + /** + * Return the set of messages related to a specific property. + * If there are no such messages, an empty enumeration is returned. + * + * @param property Property name (or ActionMessages.GLOBAL_MESSAGE) + */ + public Iterator get(String property) { + + ActionMessageItem item = (ActionMessageItem) messages.get(property); + + if (item == null) { + return (Collections.EMPTY_LIST.iterator()); + } else { + return (item.getList().iterator()); + } + + } + + /** + * Return the set of property names for which at least one message has + * been recorded. If there are no messages, an empty Iterator is returned. + * If you have recorded global messages, the String value of + * <code>ActionMessages.GLOBAL_MESSAGE</code> will be one of the returned + * property names. + */ + public Iterator properties() { + + return (messages.keySet().iterator()); + + } + + /** + * Return the number of messages recorded for all properties (including + * global messages). <strong>NOTE</strong> - it is more efficient to call + * <code>empty()</code> if all you care about is whether or not there are + * any messages at all. + */ + public int size() { + + int total = 0; + + for (Iterator i = messages.values().iterator(); i.hasNext();) { + ActionMessageItem ami = (ActionMessageItem) i.next(); + total += ami.getList().size(); + } + + return (total); + + } + + /** + * Return the number of messages associated with the specified property. + * + * @param property Property name (or ActionMessages.GLOBAL_MESSAGE) + */ + public int size(String property) { + + ActionMessageItem ami = (ActionMessageItem) messages.get(property); + + if (ami == null) + return (0); + else + return (ami.getList().size()); + + } + + /** + * This class is used to store a set of messages associated with a + * property/key and the position it was initially added to list. + */ + protected class ActionMessageItem implements Serializable { + + /** + * The list of <code>ActionMessage</code>s. + */ + protected List list = null; + + /** + * The position in the list of messages. + */ + protected int iOrder = 0; + + public ActionMessageItem(List list, int iOrder) { + this.list = list; + this.iOrder = iOrder; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public int getOrder() { + return iOrder; + } + + public void setOrder(int iOrder) { + this.iOrder = iOrder; + } - } + } }
-- To unsubscribe, e-mail: <mailto:struts-dev-unsubscribe@;jakarta.apache.org> For additional commands, e-mail: <mailto:struts-dev-help@;jakarta.apache.org>