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 import javax.servlet.jsp.PageContext;
035
036 import org.apache.struts.util.RequestUtils;
037
038
041 public class PortletResourceBundles {
042
043 public static String getString(Locale locale, String key) {
044 return _instance._getString(locale, key);
045 }
046
047 public static String getString(PageContext pageContext, String key) {
048 return _instance._getString(pageContext, key);
049 }
050
051 public static String getString(String languageId, String key) {
052 return _instance._getString(languageId, key);
053 }
054
055 public static String getString(
056 String servletContextName, String languageId, String key) {
057
058 return _instance._getString(servletContextName, languageId, key);
059 }
060
061 public static void put(
062 String servletContextName, String languageId,
063 ResourceBundle resourceBundle) {
064
065 _instance._put(servletContextName, languageId, resourceBundle);
066 }
067
068 public static void remove(String servletContextName) {
069 _instance._remove(servletContextName);
070 }
071
072 private PortletResourceBundles() {
073 _resourceBundles =
074 new ConcurrentHashMap<String, Map<String, ResourceBundle>>(
075 new LinkedHashMap<String, Map<String, ResourceBundle>>());
076 }
077
078 private ResourceBundle _getResourceBundle(
079 Map<String, ResourceBundle> resourceBundles, String languageId) {
080
081 ResourceBundle resourceBundle = resourceBundles.get(languageId);
082
083 if (resourceBundle == null) {
084 try {
085 resourceBundle = new NullSafeResourceBundle(
086 new PropertyResourceBundle(
087 new UnsyncByteArrayInputStream(new byte[0])));
088
089 resourceBundles.put(languageId, resourceBundle);
090 }
091 catch (IOException ioe) {
092 _log.error(ioe);
093 }
094 }
095
096 return resourceBundle;
097 }
098
099 private ResourceBundle _getResourceBundle(
100 String servletContextName, String languageId) {
101
102 Map<String, ResourceBundle> resourceBundles = _getResourceBundles(
103 servletContextName);
104
105 return _getResourceBundle(resourceBundles, languageId);
106 }
107
108 private Map<String, ResourceBundle> _getResourceBundles(
109 String servletContextName) {
110
111 Map<String, ResourceBundle> resourceBundles = _resourceBundles.get(
112 servletContextName);
113
114 if (resourceBundles == null) {
115 resourceBundles = new HashMap<String, ResourceBundle>();
116
117 _resourceBundles.put(servletContextName, resourceBundles);
118 }
119
120 return resourceBundles;
121 }
122
123 private String _getString(Locale locale, String key) {
124 return _getString(LocaleUtil.toLanguageId(locale), key);
125 }
126
127 private String _getString(PageContext pageContext, String key) {
128 Locale locale = RequestUtils.getUserLocale(
129 (HttpServletRequest)pageContext.getRequest(), null);
130
131 return _getString(locale, key);
132 }
133
134 private String _getString(String languageId, String key) {
135 return _getString(null, languageId, key);
136 }
137
138 private String _getString(
139 String servletContextName, String languageId, String key) {
140
141 if (servletContextName != null) {
142 ResourceBundle resourceBundle = _getResourceBundle(
143 servletContextName, languageId);
144
145 return resourceBundle.getString(key);
146 }
147
148 for (Map.Entry<String, Map<String, ResourceBundle>> entry :
149 _resourceBundles.entrySet()) {
150
151 Map<String, ResourceBundle> resourceBundles = entry.getValue();
152
153 ResourceBundle resourceBundle = _getResourceBundle(
154 resourceBundles, languageId);
155
156 return ResourceBundleUtil.getString(resourceBundle, key);
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 resourceBundle = new NullSafeResourceBundle(resourceBundle);
170
171 resourceBundles.put(languageId, resourceBundle);
172 }
173
174 private void _remove(String servletContextName) {
175 _resourceBundles.remove(servletContextName);
176 }
177
178 private static Log _log = LogFactoryUtil.getLog(
179 PortletResourceBundles.class);
180
181 private static PortletResourceBundles _instance =
182 new PortletResourceBundles();
183
184 private Map<String, Map<String, ResourceBundle>> _resourceBundles;
185
186 }