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 = new ConcurrentHashMap<>(
073 new LinkedHashMap<String, Map<String, ResourceBundle>>());
074 }
075
076 private ResourceBundle _getResourceBundle(
077 Map<String, ResourceBundle> resourceBundles, String languageId) {
078
079 ResourceBundle resourceBundle = resourceBundles.get(languageId);
080
081 if (resourceBundle == null) {
082 try {
083 resourceBundle = new PropertyResourceBundle(
084 new UnsyncByteArrayInputStream(new byte[0]));
085
086 resourceBundles.put(languageId, resourceBundle);
087 }
088 catch (IOException ioe) {
089 _log.error(ioe);
090 }
091 }
092
093 return resourceBundle;
094 }
095
096 private ResourceBundle _getResourceBundle(
097 String servletContextName, String languageId) {
098
099 Map<String, ResourceBundle> resourceBundles = _getResourceBundles(
100 servletContextName);
101
102 return _getResourceBundle(resourceBundles, languageId);
103 }
104
105 private Map<String, ResourceBundle> _getResourceBundles(
106 String servletContextName) {
107
108 Map<String, ResourceBundle> resourceBundles = _resourceBundles.get(
109 servletContextName);
110
111 if (resourceBundles == null) {
112 resourceBundles = new HashMap<>();
113
114 _resourceBundles.put(servletContextName, resourceBundles);
115 }
116
117 return resourceBundles;
118 }
119
120 private String _getString(HttpServletRequest request, String key) {
121 Locale locale = RequestUtils.getUserLocale(request, null);
122
123 return _getString(locale, key);
124 }
125
126 private String _getString(Locale locale, String key) {
127 return _getString(LocaleUtil.toLanguageId(locale), key);
128 }
129
130 private String _getString(String languageId, String key) {
131 return _getString(null, languageId, key);
132 }
133
134 private String _getString(
135 String servletContextName, String languageId, String key) {
136
137 if (servletContextName != null) {
138 ResourceBundle resourceBundle = _getResourceBundle(
139 servletContextName, languageId);
140
141 return resourceBundle.getString(key);
142 }
143
144 for (Map.Entry<String, Map<String, ResourceBundle>> entry :
145 _resourceBundles.entrySet()) {
146
147 Map<String, ResourceBundle> resourceBundles = entry.getValue();
148
149 ResourceBundle resourceBundle = _getResourceBundle(
150 resourceBundles, languageId);
151
152 String value = ResourceBundleUtil.getString(resourceBundle, key);
153
154 if (value != null) {
155 return value;
156 }
157 }
158
159 return null;
160 }
161
162 private void _put(
163 String servletContextName, String languageId,
164 ResourceBundle resourceBundle) {
165
166 Map<String, ResourceBundle> resourceBundles = _getResourceBundles(
167 servletContextName);
168
169 resourceBundles.put(languageId, resourceBundle);
170 }
171
172 private void _remove(String servletContextName) {
173 _resourceBundles.remove(servletContextName);
174 }
175
176 private static final Log _log = LogFactoryUtil.getLog(
177 PortletResourceBundles.class);
178
179 private static final PortletResourceBundles _instance =
180 new PortletResourceBundles();
181
182 private final Map<String, Map<String, ResourceBundle>> _resourceBundles;
183
184 }