View Javadoc

1   /*
2    * DefaultMessages.java
3    * Created on 5 Март 2006 г., 7:57
4    */
5   
6   package org.weda.message.impl;
7   
8   import java.util.HashMap;
9   import java.util.List;
10  import java.util.Map;
11  import org.apache.hivemind.service.ThreadLocale;
12  import org.weda.message.Message;
13  import org.weda.message.MessageException;
14  import org.weda.message.Messages;
15  import org.weda.message.MessagesProvider;
16  import org.weda.message.MessagesRegistry;
17  import org.weda.message.MessagesException;
18  
19  /**
20   *
21   * @author Mikhail Titov
22   */
23  public class MessagesImpl extends AbstractMessages implements MessagesRegistry{
24      private Map<String/*message key*/, Message> messages = 
25                  new HashMap<String, Message>();
26      private List<MessageCategory> messagesConfig;
27      private List<MessagesProviderInfo> messagesProvidersInfos;
28      private Map<Class, MessagesProvider> messagesClasses = 
29              new HashMap<Class, MessagesProvider>();
30      private ThreadLocale threadLocale;
31      private String inPlacePrefix;
32      
33      public void init() throws MessagesException{
34          try{
35              for (MessageCategory category: messagesConfig){
36                  for (MessageElement element: category.getMessageElements()){
37                      for (Message message: element.getMessages()){
38                          String key = 
39                                  category.getName()+":"+element.getName()
40                                  +":"+message.getKey();
41                          message.setKey(key);
42                          message.init();
43                          Message exMessage = messages.get(key);
44                          if (exMessage!=null)
45                              exMessage.merge(message);
46                          else
47                              messages.put(key, message);
48                      }
49                  }
50              }
51              for (MessagesProviderInfo providerInfo: messagesProvidersInfos){
52                  MessagesProvider provider = (MessagesProvider)
53                          providerInfo.getMessagesProviderClass().newInstance();
54                  provider.setCategoryMessages(
55                          new MessagesSubset(
56                              this, providerInfo.getMessagesCategory()));
57                  for (Class clazz: provider.getSupportedClasses()){
58                      if (messagesClasses.containsKey(clazz))
59                          throw new MessagesException(
60                              String.format(
61                                  "Can't add messages provider for class (%s). " +
62                                  "Messages provider already exists for " +
63                                  "this class"
64                                  , clazz.getName()));
65                      else
66                          messagesClasses.put(clazz, provider);
67                  }
68              }
69          }catch(Exception e){
70              throw new MessagesException(
71                      "Can't initialize messages service", e);
72          }
73      }
74          
75      public String getMessage(String messageKey) {
76          Message message = messages.get(messageKey);
77          if (message==null)
78              return "["+messageKey.toUpperCase()+"]";
79          else
80              return message.getLocalizedMessage(threadLocale.getLocale());
81      }
82  
83      public String format(String messageKey, Object... args) {
84          String message = getMessage(messageKey);
85          return String.format(message, args);
86      }
87      
88      public void setThreadLocale(ThreadLocale threadLocale) {
89          this.threadLocale = threadLocale;
90      }
91  
92      public void setMessagesConfig(List<MessageCategory> messagesConfig) {
93          this.messagesConfig = messagesConfig;
94      }
95  
96      public String getInPlacePrefix() {
97          return inPlacePrefix;
98      }
99  
100     public void setInPlacePrefix(String inPlacePrefix) {
101         this.inPlacePrefix = inPlacePrefix;
102     }
103 
104     public Messages getMessagesForObject(Object obj) 
105         throws MessagesException
106     {
107         MessagesProvider provider = null;
108         Class clazz = obj.getClass();
109         while (true){
110             provider = messagesClasses.get(clazz);
111             if (provider!=null || clazz.getSuperclass()==null)
112                 break;
113             else
114                 clazz = clazz.getSuperclass();
115         }
116         if (provider==null){
117             for (Map.Entry<Class, MessagesProvider> entry
118                     : messagesClasses.entrySet())
119             {
120                 if (entry.getKey().isAssignableFrom(obj.getClass())){
121                     provider = entry.getValue();
122                     break;
123                 }
124             }
125         }
126         if (provider==null)
127             throw new MessagesException(
128                 String.format(
129                     "Can't find messages provider for class (%s)"
130                     , obj.getClass().getName()));
131         else
132             return provider.getMessagesForObject(obj);
133     }
134 
135     public void setMessagesProvidersInfos(
136             List<MessagesProviderInfo> messagesProvidersInfos)
137     {
138         this.messagesProvidersInfos = messagesProvidersInfos;
139     }
140 
141 }