001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
038     * @author Brian Wing Shun Chan
039     */
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    }