View Javadoc

1   /*
2    *  jDTAUS Core API
3    *  Copyright (C) 2005 Christian Schulte
4    *  <cs@schulte.it>
5    *
6    *  This library is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public
8    *  License as published by the Free Software Foundation; either
9    *  version 2.1 of the License, or any later version.
10   *
11   *  This library is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this library; if not, write to the Free Software
18   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19   *
20   */
21  package org.jdtaus.core.text;
22  
23  import java.io.Serializable;
24  import java.util.Collection;
25  import java.util.LinkedList;
26  
27  /**
28   * Collection of messages.
29   *
30   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
31   * @version $JDTAUS: Messages.java 8743 2012-10-07 03:06:20Z schulte $
32   */
33  public class Messages implements Cloneable, Serializable
34  {
35      //--Constants---------------------------------------------------------------
36  
37      /** Serial version UID for backwards compatibility with 1.0.x classes. */
38      private static final long serialVersionUID = 834125519895929330L;
39  
40      //---------------------------------------------------------------Constants--
41      //--Messages----------------------------------------------------------------
42  
43      /**
44       * Value of property {@code messages}.
45       * @serial
46       */
47      private Collection messages;
48  
49      /** Creates a new {@code Messages} instance. */
50      public Messages()
51      {
52          super();
53      }
54  
55      /**
56       * Getter for property {@code messages}.
57       *
58       * @return messages held by the collection.
59       */
60      public Message[] getMessages()
61      {
62          if ( this.messages == null )
63          {
64              this.messages = new LinkedList();
65          }
66  
67          return ( Message[] ) this.messages.toArray(
68              new Message[ this.messages.size() ] );
69  
70      }
71  
72      /**
73       * Accessor to messages of a given type.
74       *
75       * @param type the type of the messages to return.
76       *
77       * @return a collection of messages of type {@code type}.
78       *
79       * @throws NullPointerException if {@code type} is {@code null}.
80       */
81      public final Messages getMessages( final Class type )
82      {
83          if ( type == null )
84          {
85              throw new NullPointerException( "type" );
86          }
87  
88          final Message[] msgs = this.getMessages();
89          final Messages ret = new Messages();
90          for ( int i = msgs.length - 1; i >= 0; i-- )
91          {
92              if ( type.isAssignableFrom( msgs[i].getClass() ) )
93              {
94                  ret.addMessage( msgs[i] );
95              }
96          }
97  
98          return ret;
99      }
100 
101     /**
102      * Accessor to an indexed message.
103      *
104      * @param index the index of the message to return.
105      *
106      * @return a reference to the message at {@code index}.
107      *
108      * @throws IndexOutOfBoundsException if {@code index} is negativ,
109      * greater than or equal to {@code size()}.
110      */
111     public final Message getMessage( final int index )
112     {
113         if ( index < 0 || index >= this.size() )
114         {
115             throw new ArrayIndexOutOfBoundsException( index );
116         }
117 
118         return this.getMessages()[index];
119     }
120 
121     /**
122      * Adds a message to the collection.
123      *
124      * @param message the message to add to the collection.
125      *
126      * @throws NullPointerException if {@code message} is {@code null}.
127      */
128     public void addMessage( final Message message )
129     {
130         if ( message == null )
131         {
132             throw new NullPointerException( "message" );
133         }
134 
135         if ( this.messages == null )
136         {
137             this.messages = new LinkedList();
138         }
139 
140         this.messages.add( message );
141     }
142 
143     /**
144      * Adds messages to the collection.
145      *
146      * @param messages collection of messages to add to the collection.
147      *
148      * @throws NullPointerException if {@code messages} is {@code null}.
149      */
150     public final void addMessages( final Messages messages )
151     {
152         if ( messages == null )
153         {
154             throw new NullPointerException( "messages" );
155         }
156 
157         final Message[] msgs = messages.getMessages();
158         for ( int i = msgs.length - 1; i >= 0; i-- )
159         {
160             this.addMessage( msgs[i] );
161         }
162     }
163 
164     /**
165      * Adds an array of messages to the collection.
166      *
167      * @param messages array of messages to add to the collection.
168      *
169      * @throws NullPointerException if {@code messages} is {@code null} or
170      * contains {@code null} elements.
171      */
172     public final void addMessages( final Message[] messages )
173     {
174         if ( messages == null )
175         {
176             throw new NullPointerException( "messages" );
177         }
178 
179         for ( int i = messages.length - 1; i >= 0; i-- )
180         {
181             this.addMessage( messages[i] );
182         }
183     }
184 
185     /**
186      * Removes a message from the collection.
187      *
188      * @param message the message to remove from the collection.
189      *
190      * @throws NullPointerException if {@code message} is {@code null}.
191      */
192     public void removeMessage( final Message message )
193     {
194         if ( message == null )
195         {
196             throw new NullPointerException( "message" );
197         }
198 
199         if ( this.messages == null )
200         {
201             this.messages = new LinkedList();
202         }
203 
204         this.messages.remove( message );
205     }
206 
207     /**
208      * Removes messages from the collection.
209      *
210      * @param messages collection of messages to remove from the collection.
211      *
212      * @throws NullPointerException if {@code messages} is {@code null}.
213      */
214     public final void removeMessages( final Messages messages )
215     {
216         if ( messages == null )
217         {
218             throw new NullPointerException( "messages" );
219         }
220 
221         final Message[] msgs = messages.getMessages();
222         for ( int i = msgs.length - 1; i >= 0; i-- )
223         {
224             this.removeMessage( msgs[i] );
225         }
226     }
227 
228     /**
229      * Removes messages of a given type.
230      *
231      * @param type the type of the messages to remove.
232      *
233      * @return the collection of messages of type {@code type} removed from the
234      * collection.
235      *
236      * @throws NullPointerException if {@code type} is {@code null}.
237      */
238     public final Messages removeMessages( final Class type )
239     {
240         if ( type == null )
241         {
242             throw new NullPointerException( "type" );
243         }
244 
245         final Messages removed = this.getMessages( type );
246         this.removeMessages( removed );
247         return removed;
248     }
249 
250     /**
251      * Getter for property {@code size}.
252      *
253      * @return the number of elements in this collection.
254      */
255     public final int size()
256     {
257         return this.getMessages().length;
258     }
259 
260     /** Removes all messages from the collection. */
261     public void clear()
262     {
263         if ( this.messages == null )
264         {
265             this.messages = new LinkedList();
266         }
267 
268         this.messages.clear();
269     }
270 
271     //----------------------------------------------------------------Messages--
272     //--Object------------------------------------------------------------------
273 
274     /**
275      * Creates and returns a deep copy of this object.
276      *
277      * @return a clone of this instance.
278      */
279     public Object clone()
280     {
281         try
282         {
283             final Message[] msgs = this.getMessages();
284             final Messages ret = ( Messages ) super.clone();
285 
286             ret.clear();
287             for ( int i = msgs.length - 1; i >= 0; i-- )
288             {
289                 ret.addMessage( ( Message ) msgs[i].clone() );
290             }
291 
292             return ret;
293         }
294         catch ( final CloneNotSupportedException e )
295         {
296             throw new AssertionError( e );
297         }
298     }
299 
300     //------------------------------------------------------------------Object--
301 }