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