1
14
15 package com.liferay.portlet;
16
17 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
18 import com.liferay.portal.kernel.log.Log;
19 import com.liferay.portal.kernel.log.LogFactoryUtil;
20 import com.liferay.portal.kernel.util.LocaleUtil;
21
22 import java.io.IOException;
23
24 import java.util.HashMap;
25 import java.util.Iterator;
26 import java.util.LinkedHashMap;
27 import java.util.Locale;
28 import java.util.Map;
29 import java.util.MissingResourceException;
30 import java.util.PropertyResourceBundle;
31 import java.util.ResourceBundle;
32 import java.util.concurrent.ConcurrentHashMap;
33
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.jsp.PageContext;
36
37 import org.apache.struts.util.RequestUtils;
38
39
44 public class PortletResourceBundles {
45
46 public static String getString(Locale locale, String key) {
47 return _instance._getString(locale, key);
48 }
49
50 public static String getString(PageContext pageContext, String key) {
51 return _instance._getString(pageContext, key);
52 }
53
54 public static String getString(String languageId, String key) {
55 return _instance._getString(languageId, key);
56 }
57
58 public static String getString(
59 String servletContextName, String languageId, String key) {
60
61 return _instance._getString(servletContextName, languageId, key);
62 }
63
64 public static void put(
65 String servletContextName, String languageId,
66 ResourceBundle resourceBundle) {
67
68 _instance._put(servletContextName, languageId, resourceBundle);
69 }
70
71 public static void remove(String servletContextName) {
72 _instance._remove(servletContextName);
73 }
74
75 private Map<String, Map<String, ResourceBundle>> _resourceBundles;
76
77 private PortletResourceBundles() {
78 _resourceBundles =
79 new ConcurrentHashMap<String, Map<String, ResourceBundle>>(
80 new LinkedHashMap<String, Map<String, ResourceBundle>>());
81 }
82
83 private ResourceBundle _getResourceBundle(
84 Map<String, ResourceBundle> resourceBundles, String languageId) {
85
86 ResourceBundle resourceBundle = resourceBundles.get(languageId);
87
88 if (resourceBundle == null) {
89 try {
90 resourceBundle = new PropertyResourceBundle(
91 new UnsyncByteArrayInputStream(new byte[0]));
92
93 resourceBundles.put(languageId, resourceBundle);
94 }
95 catch (IOException ioe) {
96 _log.error(ioe);
97 }
98 }
99
100 return resourceBundle;
101 }
102
103 private ResourceBundle _getResourceBundle(
104 String servletContextName, String languageId) {
105
106 Map<String, ResourceBundle> resourceBundles = _getResourceBundles(
107 servletContextName);
108
109 return _getResourceBundle(resourceBundles, languageId);
110 }
111
112 private Map<String, ResourceBundle> _getResourceBundles(
113 String servletContextName) {
114
115 Map<String, ResourceBundle> resourceBundles = _resourceBundles.get(
116 servletContextName);
117
118 if (resourceBundles == null) {
119 resourceBundles = new HashMap<String, ResourceBundle>();
120
121 _resourceBundles.put(servletContextName, resourceBundles);
122 }
123
124 return resourceBundles;
125 }
126
127 private String _getString(Locale locale, String key) {
128 return _getString(LocaleUtil.toLanguageId(locale), key);
129 }
130
131 private String _getString(PageContext pageContext, String key) {
132 Locale locale = RequestUtils.getUserLocale(
133 (HttpServletRequest)pageContext.getRequest(), null);
134
135 return _getString(locale, key);
136 }
137
138 private String _getString(String languageId, String key) {
139 return _getString(null, languageId, key);
140 }
141
142 private String _getString(
143 String servletContextName, String languageId, String key) {
144
145 if (servletContextName != null) {
146 ResourceBundle resourceBundle = _getResourceBundle(
147 servletContextName, languageId);
148
149 return resourceBundle.getString(key);
150 }
151
152 Iterator<Map.Entry<String, Map<String, ResourceBundle>>> itr =
153 _resourceBundles.entrySet().iterator();
154
155 while (itr.hasNext()) {
156 Map.Entry<String, Map<String, ResourceBundle>> entry = itr.next();
157
158 Map<String, ResourceBundle> resourceBundles = entry.getValue();
159
160 ResourceBundle resourceBundle = _getResourceBundle(
161 resourceBundles, languageId);
162
163 try {
164 return resourceBundle.getString(key);
165 }
166 catch (MissingResourceException mre) {
167 }
168 }
169
170 return null;
171 }
172
173 private void _put(
174 String servletContextName, String languageId,
175 ResourceBundle resourceBundle) {
176
177 Map<String, ResourceBundle> resourceBundles = _getResourceBundles(
178 servletContextName);
179
180 resourceBundles.put(languageId, resourceBundle);
181 }
182
183 private void _remove(String servletContextName) {
184 _resourceBundles.remove(servletContextName);
185 }
186
187 private static Log _log = LogFactoryUtil.getLog(
188 PortletResourceBundles.class);
189
190 private static PortletResourceBundles _instance =
191 new PortletResourceBundles();
192
193 }