001
014
015 package com.liferay.portlet;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
018 import com.liferay.portal.kernel.log.Log;
019 import com.liferay.portal.kernel.log.LogFactoryUtil;
020 import com.liferay.portal.kernel.util.LocaleUtil;
021 import com.liferay.portal.kernel.util.ResourceBundleUtil;
022
023 import java.io.IOException;
024
025 import java.util.HashMap;
026 import java.util.LinkedHashMap;
027 import java.util.Locale;
028 import java.util.Map;
029 import java.util.PropertyResourceBundle;
030 import java.util.ResourceBundle;
031 import java.util.concurrent.ConcurrentHashMap;
032
033 import javax.servlet.http.HttpServletRequest;
034
035 import org.apache.struts.util.RequestUtils;
036
037
040 public class PortletResourceBundles {
041
042 public static String getString(HttpServletRequest request, String key) {
043 return _instance._getString(request, key);
044 }
045
046 public static String getString(Locale locale, String key) {
047 return _instance._getString(locale, key);
048 }
049
050 public static String getString(String languageId, String key) {
051 return _instance._getString(languageId, key);
052 }
053
054 public static String getString(
055 String servletContextName, String languageId, String key) {
056
057 return _instance._getString(servletContextName, languageId, key);
058 }
059
060 public static void put(
061 String servletContextName, String languageId,
062 ResourceBundle resourceBundle) {
063
064 _instance._put(servletContextName, languageId, resourceBundle);
065 }
066
067 public static void remove(String servletContextName) {
068 _instance._remove(servletContextName);
069 }
070
071 private PortletResourceBundles() {
072 _resourceBundles =
073 new ConcurrentHashMap<String, Map<String, ResourceBundle>>(
074 new LinkedHashMap<String, Map<String, ResourceBundle>>());
075 }
076
077 private ResourceBundle _getResourceBundle(
078 Map<String, ResourceBundle> resourceBundles, String languageId) {
079
080 ResourceBundle resourceBundle = resourceBundles.get(languageId);
081
082 if (resourceBundle == null) {
083 try {
084 resourceBundle = new PropertyResourceBundle(
085 new UnsyncByteArrayInputStream(new byte[0]));
086
087 resourceBundles.put(languageId, resourceBundle);
088 }
089 catch (IOException ioe) {
090 _log.error(ioe);
091 }
092 }
093
094 return resourceBundle;
095 }
096
097 private ResourceBundle _getResourceBundle(
098 String servletContextName, String languageId) {
099
100 Map<String, ResourceBundle> resourceBundles = _getResourceBundles(
101 servletContextName);
102
103 return _getResourceBundle(resourceBundles, languageId);
104 }
105
106 private Map<String, ResourceBundle> _getResourceBundles(
107 String servletContextName) {
108
109 Map<String, ResourceBundle> resourceBundles = _resourceBundles.get(
110 servletContextName);
111
112 if (resourceBundles == null) {
113 resourceBundles = new HashMap<String, ResourceBundle>();
114
115 _resourceBundles.put(servletContextName, resourceBundles);
116 }
117
118 return resourceBundles;
119 }
120
121 private String _getString(HttpServletRequest request, String key) {
122 Locale locale = RequestUtils.getUserLocale(request, null);
123
124 return _getString(locale, key);
125 }
126
127 private String _getString(Locale locale, String key) {
128 return _getString(LocaleUtil.toLanguageId(locale), key);
129 }
130
131 private String _getString(String languageId, String key) {
132 return _getString(null, languageId, key);
133 }
134
135 private String _getString(
136 String servletContextName, String languageId, String key) {
137
138 if (servletContextName != null) {
139 ResourceBundle resourceBundle = _getResourceBundle(
140 servletContextName, languageId);
141
142 return resourceBundle.getString(key);
143 }
144
145 for (Map.Entry<String, Map<String, ResourceBundle>> entry :
146 _resourceBundles.entrySet()) {
147
148 Map<String, ResourceBundle> resourceBundles = entry.getValue();
149
150 ResourceBundle resourceBundle = _getResourceBundle(
151 resourceBundles, languageId);
152
153 return ResourceBundleUtil.getString(resourceBundle, key);
154 }
155
156 return null;
157 }
158
159 private void _put(
160 String servletContextName, String languageId,
161 ResourceBundle resourceBundle) {
162
163 Map<String, ResourceBundle> resourceBundles = _getResourceBundles(
164 servletContextName);
165
166 resourceBundles.put(languageId, resourceBundle);
167 }
168
169 private void _remove(String servletContextName) {
170 _resourceBundles.remove(servletContextName);
171 }
172
173 private static final Log _log = LogFactoryUtil.getLog(
174 PortletResourceBundles.class);
175
176 private static final PortletResourceBundles _instance =
177 new PortletResourceBundles();
178
179 private final Map<String, Map<String, ResourceBundle>> _resourceBundles;
180
181 }