View Javadoc

1   //////////////////////////////////////////////////////////////////////////////
2   // Clirr: compares two versions of a java library for binary compatibility
3   // Copyright (C) 2003 - 2005  Lars Kühne
4   //
5   // This library is free software; you can redistribute it and/or
6   // modify it under the terms of the GNU Lesser General Public
7   // License as published by the Free Software Foundation; either
8   // version 2.1 of the License, or (at your option) any later version.
9   //
10  // This library is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  // Lesser General Public License for more details.
14  //
15  // You should have received a copy of the GNU Lesser General Public
16  // License along with this library; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  //////////////////////////////////////////////////////////////////////////////
19  
20  package net.sf.clirr.core;
21  
22  import java.util.Iterator;
23  import java.util.ArrayList;
24  import java.util.Comparator;
25  import java.util.Collection;
26  
27  /***
28   * Class which manages API Difference messages, including expanding message
29   * codes into strings and descriptions.
30   */
31  public final class MessageManager
32  {
33      private static MessageManager instance;
34      private ArrayList messages = new ArrayList();
35  
36      /***
37       * Utility class to sort messages by their numeric ids.
38       */
39      private static class MessageComparator implements Comparator
40      {
41          public int compare(Object o1, Object o2)
42          {
43              Message m1 = (Message) o1;
44              Message m2 = (Message) o2;
45              return m1.getId() - m2.getId();
46          }
47      }
48  
49      /***
50       * This is a singleton class; to get an instance of this class, use
51       * the getInstance method.
52       */
53      private MessageManager()
54      {
55      }
56  
57      /***
58       * Return the singleton instance of this class.
59       */
60      public static MessageManager getInstance()
61      {
62          if (instance == null)
63          {
64              instance = new MessageManager();
65          }
66          return instance;
67      }
68  
69      /***
70       * Add a message to the list of known messages.
71       */
72      public void addMessage(Message msg)
73      {
74          messages.add(msg);
75      }
76  
77      /***
78       * Verify that the list of known messages contains no two objects
79       * with the same numeric message id. This method is expected to be
80       * called from the unit tests, so that if a developer adds a new
81       * message and accidentally uses the message id of an existing
82       * message object, then this will be reported as an error.
83       * <p>
84       * @throws java.lang.IllegalArgumentException if any duplicate id is found.
85       */
86      public void checkUnique()
87      {
88          java.util.Collections.sort(messages, new MessageComparator());
89          int lastId = -1;
90          for (Iterator i = messages.iterator(); i.hasNext();)
91          {
92              // check for any duplicates
93              Message m = (Message) i.next();
94              int currId = m.getId();
95              if (currId <= lastId)
96              {
97                  throw new IllegalArgumentException("Message id [" + currId + "] is not unique.");
98              }
99          }
100     }
101 
102     /***
103      * Return the complete set of registered messages.
104      */
105     public Collection getMessages()
106     {
107         return messages;
108     }
109 }