1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.krad.messages.providers;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.kuali.rice.core.api.CoreApiServiceLocator;
20  import org.kuali.rice.core.api.exception.RiceRuntimeException;
21  import org.kuali.rice.krad.messages.Message;
22  import org.kuali.rice.krad.messages.MessageProvider;
23  import org.kuali.rice.krad.messages.MessageService;
24  import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
25  import org.kuali.rice.krad.service.ModuleService;
26  
27  import java.util.ArrayList;
28  import java.util.Arrays;
29  import java.util.Collection;
30  import java.util.Enumeration;
31  import java.util.HashMap;
32  import java.util.List;
33  import java.util.Locale;
34  import java.util.Map;
35  import java.util.ResourceBundle;
36  
37  
38  
39  
40  
41  
42  public class ResourceMessageProvider implements MessageProvider {
43  
44      private static final String COMPONENT_PLACEHOLDER_BEGIN = "@cmp{";
45      private static final String COMPONENT_PLACEHOLDER_END = "}";
46  
47      protected Map<String, List<ResourceBundle>> cachedResourceBundles;
48  
49      public ResourceMessageProvider() {
50          cachedResourceBundles = new HashMap<String, List<ResourceBundle>>();
51      }
52  
53      
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69      public Message getMessage(String namespace, String component, String key, String locale) {
70          Message message = null;
71  
72          List<ResourceBundle> bundles = getCachedResourceBundles(namespace, locale);
73  
74          
75          
76          String messageText = null;
77          for (ResourceBundle bundle : bundles) {
78              
79              String resourceKey = COMPONENT_PLACEHOLDER_BEGIN + component + COMPONENT_PLACEHOLDER_END + key;
80              if (bundle.containsKey(resourceKey)) {
81                  messageText = bundle.getString(resourceKey);
82              }
83              
84              else if (MessageService.DEFAULT_COMPONENT_CODE.equals(component) && bundle.containsKey(key)) {
85                  messageText = bundle.getString(key);
86              }
87          }
88  
89          
90          if (StringUtils.isNotBlank(messageText)) {
91              message = buildMessage(namespace, component, key, messageText, locale);
92          }
93  
94          return message;
95      }
96  
97      
98  
99  
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114     public Collection<Message> getAllMessagesForComponent(String namespace, String component, String locale) {
115         List<ResourceBundle> bundles = getCachedResourceBundles(namespace, locale);
116 
117         Map<String, Message> messagesByKey = new HashMap<String, Message>();
118         for (ResourceBundle bundle : bundles) {
119             Enumeration<String> resourceKeys = bundle.getKeys();
120             while (resourceKeys.hasMoreElements()) {
121                 String resourceKey = resourceKeys.nextElement();
122 
123                 boolean match = false;
124                 if (StringUtils.contains(resourceKey,
125                         COMPONENT_PLACEHOLDER_BEGIN + component + COMPONENT_PLACEHOLDER_END)) {
126                     match = true;
127                 } else if (MessageService.DEFAULT_COMPONENT_CODE.equals(component) && !StringUtils.contains(resourceKey,
128                         COMPONENT_PLACEHOLDER_BEGIN)) {
129                     match = true;
130                 }
131 
132                 if (match) {
133                     String messageText = bundle.getString(resourceKey);
134 
135                     resourceKey = cleanResourceKey(resourceKey);
136                     Message message = buildMessage(namespace, component, resourceKey, messageText, locale);
137                     messagesByKey.put(resourceKey, message);
138                 }
139             }
140         }
141 
142         return messagesByKey.values();
143     }
144 
145     
146 
147 
148 
149 
150 
151     protected String cleanResourceKey(String resourceKey) {
152         String cleanedKey = resourceKey;
153 
154         String component = StringUtils.substringBetween(cleanedKey, COMPONENT_PLACEHOLDER_BEGIN,
155                 COMPONENT_PLACEHOLDER_END);
156         if (StringUtils.isNotBlank(component)) {
157             cleanedKey = StringUtils.remove(cleanedKey,
158                     COMPONENT_PLACEHOLDER_BEGIN + component + COMPONENT_PLACEHOLDER_END);
159         }
160 
161         return cleanedKey;
162     }
163 
164     
165 
166 
167 
168 
169 
170 
171 
172 
173 
174     protected Message buildMessage(String namespace, String component, String key, String messageText, String locale) {
175         Message message = new Message();
176 
177         message.setNamespaceCode(namespace);
178         message.setComponentCode(component);
179 
180         key = cleanResourceKey(key);
181         message.setKey(key);
182 
183         message.setText(messageText);
184         message.setLocale(locale);
185 
186         return message;
187     }
188 
189     
190 
191 
192 
193 
194 
195 
196 
197     protected List<ResourceBundle> getCachedResourceBundles(String namespace, String localeCode) {
198         if (StringUtils.isBlank(namespace)) {
199             namespace = MessageService.DEFAULT_NAMESPACE_CODE;
200         }
201 
202         String cacheKey = namespace + "|" + localeCode;
203         if (cachedResourceBundles.containsKey(cacheKey)) {
204             return cachedResourceBundles.get(cacheKey);
205         }
206 
207         List<ResourceBundle> bundles = null;
208         if (StringUtils.isBlank(namespace) || MessageService.DEFAULT_NAMESPACE_CODE.equals(namespace)) {
209             bundles = getResourceBundlesForApplication(localeCode);
210         } else {
211             bundles = getResourceBundlesForNamespace(namespace, localeCode);
212         }
213 
214         cachedResourceBundles.put(cacheKey, bundles);
215 
216         return bundles;
217     }
218 
219     
220 
221 
222 
223 
224 
225 
226     protected List<ResourceBundle> getResourceBundlesForNamespace(String namespace, String localeCode) {
227         List<String> resourceBundleNames = getResourceBundleNamesForNamespace(namespace);
228 
229         return getResourceBundles(resourceBundleNames, localeCode);
230     }
231 
232     
233 
234 
235 
236 
237 
238     protected List<ResourceBundle> getResourceBundlesForApplication(String localeCode) {
239         List<String> resourceBundleNames = getResourceBundleNamesForApplication();
240 
241         return getResourceBundles(resourceBundleNames, localeCode);
242     }
243 
244     
245 
246 
247 
248 
249 
250 
251 
252 
253 
254 
255 
256     protected List<ResourceBundle> getResourceBundles(List<String> resourceBundleNames, String localeCode) {
257         List<ResourceBundle> resourceBundles = new ArrayList<ResourceBundle>();
258 
259         String[] localeIdentifiers = StringUtils.split(localeCode, "-");
260         if ((localeIdentifiers == null) || (localeIdentifiers.length != 2)) {
261             throw new RiceRuntimeException("Invalid locale code: " + (localeCode == null ? "Null" : localeCode));
262         }
263 
264         Locale locale = new Locale(localeIdentifiers[0], localeIdentifiers[1]);
265 
266         if (resourceBundleNames != null) {
267             for (String bundleName : resourceBundleNames) {
268                 ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale);
269                 if (bundle != null) {
270                     resourceBundles.add(bundle);
271                 }
272             }
273         }
274 
275         return resourceBundles;
276     }
277 
278     
279 
280 
281 
282 
283 
284 
285 
286 
287 
288 
289     protected List<String> getResourceBundleNamesForNamespace(String namespace) {
290         ModuleService moduleService = KRADServiceLocatorWeb.getKualiModuleService().getModuleServiceByNamespaceCode(
291                 namespace);
292         if (moduleService != null) {
293             return moduleService.getModuleConfiguration().getResourceBundleNames();
294         }
295 
296         return null;
297     }
298 
299     
300 
301 
302 
303 
304 
305 
306 
307 
308 
309     protected List<String> getResourceBundleNamesForApplication() {
310         String resourceBundleNamesConfig = CoreApiServiceLocator.getKualiConfigurationService().getPropertyValueAsString(
311                 "resourceBundleNames");
312         if (StringUtils.isNotBlank(resourceBundleNamesConfig)) {
313             String[] resourceBundleNames = StringUtils.split(resourceBundleNamesConfig, ",");
314 
315             return Arrays.asList(resourceBundleNames);
316         }
317 
318         return null;
319     }
320 }