View Javadoc

1   /*
2    * DefaultMessage.java
3    *
4    * Created on 4 Март 2006 г., 20:52
5    */
6   
7   package org.weda.message.impl;
8   
9   import java.util.ArrayList;
10  import java.util.Collections;
11  import java.util.HashMap;
12  import java.util.HashSet;
13  import java.util.List;
14  import java.util.Locale;
15  import java.util.Map;
16  import java.util.Set;
17  import org.weda.message.Message;
18  import org.weda.message.MessageEntry;
19  import org.weda.message.MessageException;
20  
21  /**
22   *
23   * @author Mikhail Titov
24   */
25  public class MessageImpl implements Message {    
26      private final static Set<String> languages;
27      private final static Set<String> countries;
28      
29      private String key;
30      private String defaultMessage;
31      private Map<String/*language[_country]*/, String/*message*/> messages = 
32                  new HashMap<String, String>();
33      //освобождается после инициализации
34      private List<MessageEntry> messageEntries = new ArrayList(2);
35      
36      static {
37          languages = new HashSet<String>();
38          for (String lang: Locale.getISOLanguages())
39              languages.add(lang);
40          //
41          countries = new HashSet<String>();
42          for (String country: Locale.getISOCountries())
43              countries.add(country);
44      }
45      
46      public void init() throws MessageException {
47          if (messageEntries!=null){
48              for (MessageEntry entry: messageEntries){
49                  if (   entry.getCountry()!=null 
50                      && !countries.contains(entry.getCountry()))
51                  {
52                      throw new MessageException(
53                          String.format(
54                              "Invalid country code (%s) for message key (%s)"
55                              , entry.getCountry(), getKey())
56                      );
57                  }        
58                  if (entry.getLanguage()==null)
59                      throw new MessageException(
60                          String.format(
61                              "Language can not be null. Message key is (%s)"
62                              , getKey())
63                      );
64                  if (!languages.contains(entry.getLanguage()))
65                      throw new MessageException(
66                          String.format(
67                              "Invalid language code (%s) for message key (%s)"
68                              , entry.getCountry(), getKey())
69                      );
70                  if (entry.getMessage()==null)
71                      throw new MessageException(
72                          String.format(
73                              "Message can not be null. Message key is (%s)"
74                              , getKey())
75                      );
76                  messages.put(
77                          entry.getLanguage()
78                              +(entry.getCountry()==null?"":entry.getCountry())
79                          , entry.getMessage());
80              }
81              Map<String, String> additions = new HashMap<String, String>();
82              for (Map.Entry<String, String> entry: messages.entrySet()){
83                  if (entry.getKey().length()==4){
84                      String language = entry.getKey().substring(0, 2);
85                      if (!messages.containsKey(language))
86                          additions.put(language, entry.getValue());
87                  }
88              }
89              messageEntries=null;
90              messages.putAll(additions);
91          }
92      }
93      
94      public String getLocalizedMessage(Locale locale) {
95          String message=messages.get(locale.getLanguage()+locale.getCountry());
96          if (message==null)
97              message=messages.get(locale.getLanguage());
98          if (message==null)
99              message=getDefaultMessage();
100         if (message==null)
101             message="["+getKey().toUpperCase()+"]";
102         return message;
103     }
104     
105     public void merge(Message message){
106         messages.putAll(message.getAllMessages());
107     }
108     
109     public void addMessageEntry(MessageEntry messageEntry){
110         messageEntries.add(messageEntry);
111     }
112     
113     public void setKey(String key){
114         this.key = key;
115     }
116 
117     public String getKey() {
118         return key;
119     }
120 
121     public String getDefaultMessage() {
122         return defaultMessage;
123     }
124 
125     public void setDefaultMessage(String defaultMessage) {
126         this.defaultMessage = defaultMessage;
127     }
128 
129     public Map<String, String> getAllMessages() {
130         return Collections.unmodifiableMap(messages);
131     }
132 }