001    /*
002     * Copyright 2001,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    
017    package org.apache.commons.scaffold.util;
018    
019    
020    import java.io.Serializable;
021    import java.util.ArrayList;
022    import java.util.Collections;
023    import java.util.Comparator;
024    import java.util.Iterator;
025    import java.util.HashMap;
026    import java.util.List;
027    
028    // ------------------------------------------------------------------------ 78
029    
030    public class MessagesImpl implements Serializable,Messages {
031    
032            /**
033             * The accumulated set of <code>Message</code> objects (represented
034             * as an ArrayList) for each property, keyed by property name.
035             */
036            protected HashMap messages = new HashMap();
037    
038            /**
039             * The current number of the property/key being added.  This is used
040             * to maintain the order messages are added.
041            */
042            protected int iCount = 0;
043    
044            // --------------------------------------------------------- Public Methods
045    
046            /**
047             * Create an empty <code>Messages</code> object.
048             */
049            public MessagesImpl() {
050                    super();
051            }
052    
053            /**
054             * Create an <code>AMessages</code> object initialized with the given 
055             * messages.
056             * 
057             * @param messages The messages to be initially added to this object.
058             * @since Struts 1.1
059             */
060            public MessagesImpl(Messages messages) {
061                    super();
062                    this.add(messages);
063            }
064    
065    
066            // See interface for JavaDoc
067            public void add(String property, Message message) {
068    
069                    MessageItem item = (MessageItem) messages.get(property);
070                    List list = null;
071    
072                    if (item == null) {
073                            list = new ArrayList();
074                            item = new MessageItem(list, iCount++);
075    
076                            messages.put(property, item);
077                    } else {
078                            list = item.getList();
079                    }
080    
081                    list.add(message);
082    
083            }
084    
085    
086            // See interface for JavaDoc
087            public void add(Message message) {
088                    
089                    add(Messages.GLOBAL_MESSAGE_KEY,message);
090            }
091    
092    
093            // See interface for JavaDoc
094            public void add(Messages messages) {
095                    // loop over properties
096                    Iterator props = messages.properties();
097                    while (props.hasNext()) {
098                            String property = (String) props.next();
099    
100                            // loop over messages for each property
101                            Iterator msgs = messages.get(property);
102                            while (msgs.hasNext()) {
103                                    Message msg = (Message) msgs.next();
104                                    this.add(property, msg);
105                            }
106    
107                    }
108            }
109    
110            // See interface for JavaDoc
111            public void clear() {
112    
113                    messages.clear();
114    
115            }
116    
117            // See interface for JavaDoc
118            public boolean empty() {
119                    return (this.isEmpty());
120            }
121            
122            // See interface for JavaDoc
123            public boolean isEmpty(){
124                    return (messages.isEmpty());    
125            }
126    
127            // See interface for JavaDoc
128            public Iterator get() {
129    
130                    if (messages.size() == 0) {
131                            return (Collections.EMPTY_LIST.iterator());
132                    }
133    
134                    ArrayList results = new ArrayList();
135                    ArrayList actionItems = new ArrayList();
136    
137                    for (Iterator i = messages.values().iterator(); i.hasNext();) {
138                            actionItems.add(i.next());
139                    }
140    
141                    // Sort MessageItems based on the initial order the
142                    // property/key was added to Messages.
143                    Collections.sort(actionItems, new Comparator() {
144                            public int compare(Object o1, Object o2) {
145                                    return ((MessageItem) o1).getOrder() - ((MessageItem) o2).getOrder();
146                            }
147                    });
148    
149                    for (Iterator i = actionItems.iterator(); i.hasNext();) {
150                            MessageItem ami = (MessageItem) i.next();
151    
152                            for (Iterator messages = ami.getList().iterator(); messages.hasNext();) {
153                                    results.add(messages.next());
154                            }
155                    }
156    
157                    return (results.iterator());
158    
159            }
160    
161            // See interface for JavaDoc
162            public Iterator get(String property) {
163    
164                    MessageItem item = (MessageItem) messages.get(property);
165    
166                    if (item == null) {
167                            return (Collections.EMPTY_LIST.iterator());
168                    } else {
169                            return (item.getList().iterator());
170                    }
171                    
172            }
173    
174            // See interface for JavaDoc
175            public Iterator properties() {
176    
177                    return (messages.keySet().iterator());
178    
179            }
180    
181            // See interface for JavaDoc
182            public int size() {
183    
184                    int total = 0;
185    
186                    for (Iterator i = messages.values().iterator(); i.hasNext();) {
187                            MessageItem ami = (MessageItem) i.next();
188                            total += ami.getList().size();
189                    }
190    
191                    return (total);
192    
193            }
194    
195            // See interface for JavaDoc
196            public int size(String property) {
197    
198                    MessageItem ami = (MessageItem) messages.get(property);
199    
200                    if (ami == null)
201                            return (0);
202                    else
203                            return (ami.getList().size());
204    
205            }
206    
207            // See interface for JavaDoc
208            protected class MessageItem implements Serializable {
209    
210                    /**
211                     * The list of <code>Message</code>s.
212                     */
213                    protected List list = null;
214    
215                    /**
216                     * The position in the list of messages.
217                     */
218                    protected int iOrder = 0;
219    
220                    public MessageItem(List list, int iOrder) {
221                            this.list = list;
222                            this.iOrder = iOrder;
223                    }
224    
225                    public List getList() {
226                            return list;
227                    }
228    
229                    public void setList(List list) {
230                            this.list = list;
231                    }
232    
233                    public int getOrder() {
234                            return iOrder;
235                    }
236    
237                    public void setOrder(int iOrder) {
238                            this.iOrder = iOrder;
239                    }
240    
241            }
242    
243    } // end MessagesImpl