001
014
015 package com.liferay.portal.kernel.language;
016
017 import com.liferay.portal.kernel.concurrent.ConcurrentReferenceValueHashMap;
018 import com.liferay.portal.kernel.memory.FinalizeManager;
019 import com.liferay.portal.kernel.util.StringPool;
020
021 import java.io.IOException;
022 import java.io.InputStream;
023 import java.io.InputStreamReader;
024
025 import java.net.URL;
026 import java.net.URLConnection;
027
028 import java.util.Locale;
029 import java.util.Map;
030 import java.util.PropertyResourceBundle;
031 import java.util.ResourceBundle;
032 import java.util.ResourceBundle.Control;
033
034
038 public class UTF8Control extends Control {
039
040 public static final UTF8Control INSTANCE = new UTF8Control();
041
042 @Override
043 public Locale getFallbackLocale(String baseName, Locale locale) {
044 return null;
045 }
046
047 @Override
048 public ResourceBundle newBundle(
049 String baseName, Locale locale, String format,
050 ClassLoader classLoader, boolean reload)
051 throws IOException {
052
053 URL url = classLoader.getResource(
054 toResourceName(toBundleName(baseName, locale), "properties"));
055
056 if (url == null) {
057 return null;
058 }
059
060 URLConnection urlConnection = url.openConnection();
061
062 urlConnection.setUseCaches(!reload);
063
064 if (!reload) {
065 CachedResourceBundle cachedResourceBundle =
066 _cachedResourceBundles.get(url);
067
068 if (cachedResourceBundle != null) {
069 if (urlConnection.getLastModified() <=
070 cachedResourceBundle.getLastModified()) {
071
072 return cachedResourceBundle.getResourceBundle();
073 }
074 }
075 }
076
077 try (InputStream inputStream = urlConnection.getInputStream()) {
078 ResourceBundle resourceBundle = new PropertyResourceBundle(
079 new InputStreamReader(inputStream, StringPool.UTF8));
080
081 CachedResourceBundle cachedResourceBundle =
082 new CachedResourceBundle(
083 resourceBundle, urlConnection.getLastModified());
084
085 _cachedResourceBundles.put(url, cachedResourceBundle);
086
087 return resourceBundle;
088 }
089 }
090
091 private static final Map<URL, CachedResourceBundle> _cachedResourceBundles =
092 new ConcurrentReferenceValueHashMap<>(
093 FinalizeManager.SOFT_REFERENCE_FACTORY);
094
095 private static final class CachedResourceBundle {
096
097 public CachedResourceBundle(
098 ResourceBundle resourceBundle, long lastModified) {
099
100 _resourceBundle = resourceBundle;
101 _lastModified = lastModified;
102 }
103
104 public long getLastModified() {
105 return _lastModified;
106 }
107
108 public ResourceBundle getResourceBundle() {
109 return _resourceBundle;
110 }
111
112 private final long _lastModified;
113 private final ResourceBundle _resourceBundle;
114
115 }
116
117 }