1
2
3
4
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
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 }