View Javadoc

1   /**
2    * - Digitalis Internal Framework v2.0 - (C) 2007, Digitalis Informatica. Distribuicao e Gestao de Informatica, Lda.
3    * Estrada de Paco de Arcos num.9 - Piso -1 2780-666 Paco de Arcos Telefone: (351) 21 4408990 Fax: (351) 21 4408999
4    * http://www.digitalis.pt
5    */
6   package pt.digitalis.dif.dem.managers.impl;
7   
8   import java.util.HashMap;
9   import java.util.HashSet;
10  import java.util.Map;
11  import java.util.Set;
12  
13  import pt.digitalis.dif.dem.Entity;
14  import pt.digitalis.dif.dem.interfaces.IApplication;
15  import pt.digitalis.dif.dem.interfaces.IEntity;
16  import pt.digitalis.dif.dem.interfaces.IProvider;
17  import pt.digitalis.dif.dem.interfaces.IService;
18  import pt.digitalis.dif.dem.interfaces.IStage;
19  import pt.digitalis.dif.dem.managers.IMessageManager;
20  import pt.digitalis.dif.dem.objects.messages.MessageList;
21  import pt.digitalis.dif.dem.objects.messages.MessageTranslations;
22  import pt.digitalis.dif.startup.DIFStartupConfiguration;
23  
24  /**
25   * Manages the DEM messages, providing operations for access, pooling and persistence.
26   * 
27   * @author Pedro Viegas <a href="mailto:pviegas@digitalis.pt">pviegas@digitalis.pt</a>
28   * @author Rodrigo Gonçalves <a href="mailto:rgoncalves@digitalis.pt">rgoncalves@digitalis.pt</a>
29   * @created 2007/06/01
30   */
31  abstract public class AbstractMessageManager implements IMessageManager {
32  
33      /** The default message file extension. */
34      final static protected String DEFAULT_MESSAGE_FILE_EXTENSION = ".messages";
35  
36      /** The message repository structure: EntityID, Message list */
37      static private Map<String, MessageList> messageRepository = new HashMap<String, MessageList>();
38  
39      /** The messages folder. */
40      final static protected String MESSAGES_FOLDER = "messages/";
41  
42      /** The number sign character as a string. */
43      final static protected String NUMBER_SIGN = "#";
44  
45      /** The list of supported languages. */
46      static private Set<String> supportedLanguages = new HashSet<String>();
47  
48      /**
49       * @see pt.digitalis.dif.dem.managers.IMessageManager#addSupportedLanguage(java.lang.String)
50       */
51      public void addSupportedLanguage(String language)
52      {
53          supportedLanguages.add(language);
54      }
55  
56      /**
57       * Generates the ID of a given entity.
58       * 
59       * @param entity
60       *            the entity to generate the ID
61       * @return the entity ID
62       */
63      protected String getEntityID(IEntity entity)
64      {
65          String entityID = null;
66  
67          Class<?>[] interfaces = entity.getClass().getInterfaces();
68  
69          if (interfaces.length > 0)
70          {
71  
72              for (Class<?> entityInterface: interfaces)
73              {
74                  if (entityInterface.getCanonicalName().equals(IProvider.class.getCanonicalName()))
75                      entityID = Entity.getID(Entity.PROVIDER, entity.getID());
76                  else if (entityInterface.getCanonicalName().equals(IApplication.class.getCanonicalName()))
77                      entityID = Entity.getID(Entity.APPLICATION, entity.getID());
78                  else if (entityInterface.getCanonicalName().equals(IService.class.getCanonicalName()))
79                      entityID = Entity.getID(Entity.SERVICE, entity.getID());
80                  else if (entityInterface.getCanonicalName().equals(IStage.class.getCanonicalName()))
81                      entityID = Entity.getID(Entity.STAGE, entity.getID());
82              }
83          }
84  
85          return entityID;
86      }
87  
88      /**
89       * Gets the messages from the repository and collects them on first use
90       * 
91       * @param type
92       *            the entity type
93       * @param entity
94       *            the entity object
95       * @return the messages collected
96       */
97      public MessageList getMessageList(Entity type, IEntity entity)
98      {
99  
100         String entityID = Entity.getID(type, entity.getID());
101         MessageList messages = null;
102 
103         // Only reads from the cache if not in developer mode (developer mode refreshes from repository every time)
104         if (!DIFStartupConfiguration.getDeveloperMode())
105             messages = messageRepository.get(entityID);
106 
107         if (messages == null)
108         {
109             // First time access to this entity. Collect messages from the repository
110             messages = collectEntityMessagesFromRepository(type, entity);
111             messageRepository.put(entityID, messages);
112         }
113 
114         return messages;
115     }
116 
117     /**
118      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessageList(pt.digitalis.dif.dem.interfaces.IApplication)
119      */
120     public MessageList getMessageList(IApplication application)
121     {
122 
123         MessageList messages = new MessageList();
124 
125         // Get the application's provider messages
126         messages.addMessageList(getMessageList(application.getProvider()));
127 
128         // Add/override the application ones
129         messages.addMessageList(getMessageList(Entity.APPLICATION, application));
130 
131         return messages;
132     }
133 
134     /**
135      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessageList(pt.digitalis.dif.dem.interfaces.IProvider)
136      */
137     public MessageList getMessageList(IProvider provider)
138     {
139 
140         return getMessageList(Entity.PROVIDER, provider);
141     }
142 
143     /**
144      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessageList(pt.digitalis.dif.dem.interfaces.IService)
145      */
146     public MessageList getMessageList(IService service)
147     {
148 
149         MessageList messages = new MessageList();
150 
151         // Get the service's application messages
152         messages.addMessageList(getMessageList(service.getApplication()));
153 
154         // Add/override the service ones
155         messages.addMessageList(getMessageList(Entity.SERVICE, service));
156 
157         return messages;
158     }
159 
160     /**
161      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessageList(pt.digitalis.dif.dem.interfaces.IStage)
162      */
163     public MessageList getMessageList(IStage stage)
164     {
165 
166         MessageList messages = new MessageList();
167 
168         // Get the stage's service messages
169         messages.addMessageList(getMessageList(stage.getService()));
170 
171         // Add/override the stage ones
172         messages.addMessageList(getMessageList(Entity.STAGE, stage));
173 
174         return messages;
175     }
176 
177     /**
178      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessages(pt.digitalis.dif.dem.interfaces.IApplication,
179      *      String)
180      */
181     public Map<String, String> getMessages(IApplication application, String language)
182     {
183 
184         return getMessageList(application).getMessages(language);
185     }
186 
187     /**
188      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessages(pt.digitalis.dif.dem.interfaces.IProvider, String)
189      */
190     public Map<String, String> getMessages(IProvider provider, String language)
191     {
192 
193         return getMessageList(provider).getMessages(language);
194     }
195 
196     /**
197      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessages(pt.digitalis.dif.dem.interfaces.IService, String)
198      */
199     public Map<String, String> getMessages(IService service, String language)
200     {
201 
202         return getMessageList(service).getMessages(language);
203     }
204 
205     /**
206      * @see pt.digitalis.dif.dem.managers.IMessageManager#getMessages(pt.digitalis.dif.dem.interfaces.IStage, String)
207      */
208     public Map<String, String> getMessages(IStage stage, String language)
209     {
210 
211         return getMessageList(stage).getMessages(language);
212     }
213 
214     /**
215      * @see pt.digitalis.dif.dem.managers.IMessageManager#getSupportedLanguages()
216      */
217     public Set<String> getSupportedLanguages()
218     {
219         return supportedLanguages;
220     }
221 
222     /**
223      * @see pt.digitalis.dif.dem.managers.IMessageManager#invalidateMessages()
224      */
225     public void invalidateMessages()
226     {
227         messageRepository = new HashMap<String, MessageList>();
228     }
229 
230     /**
231      * @see pt.digitalis.dif.dem.managers.IMessageManager#isLanguageSupported(java.lang.String)
232      */
233     public boolean isLanguageSupported(String language)
234     {
235         // FIXME: Might be useful to implement a system to check that "en-gb" and "en" are the same language
236         return supportedLanguages.contains(language);
237     }
238 
239     /**
240      * @see pt.digitalis.dif.dem.managers.IMessageManager#updateMessage(java.lang.Class, java.lang.String,
241      *      pt.digitalis.dif.dem.objects.messages.MessageTranslations)
242      */
243     public void updateMessage(Class<?> clazz, String messageID, MessageTranslations message)
244     {
245 
246         if (messageRepository.containsKey(clazz.getSimpleName())
247                 && messageRepository.get(clazz.getSimpleName()).containsMessageWithID(messageID))
248             messageRepository.get(clazz.getSimpleName()).addMessage(messageID, message);
249     }
250 
251     /**
252      * @see pt.digitalis.dif.dem.managers.IMessageManager#updateMessage(pt.digitalis.dif.dem.interfaces.IEntity,
253      *      java.lang.String, pt.digitalis.dif.dem.objects.messages.MessageTranslations)
254      */
255     public void updateMessage(IEntity entity, String messageID, MessageTranslations message)
256     {
257         String entityID = getEntityID(entity);
258 
259         if (messageRepository.containsKey(entityID) && messageRepository.get(entityID).containsMessageWithID(messageID))
260             messageRepository.get(entityID).addMessage(messageID, message);
261     }
262 }