001
014
015 package com.liferay.portal.kernel.portlet;
016
017 import com.liferay.portal.kernel.util.LocaleUtil;
018 import com.liferay.portal.kernel.util.ResourceBundleUtil;
019 import com.liferay.portal.kernel.util.StringPool;
020 import com.liferay.portal.model.Portlet;
021 import com.liferay.registry.Filter;
022 import com.liferay.registry.Registry;
023 import com.liferay.registry.RegistryUtil;
024 import com.liferay.registry.ServiceReference;
025 import com.liferay.registry.ServiceRegistration;
026 import com.liferay.registry.ServiceTracker;
027 import com.liferay.registry.ServiceTrackerCustomizer;
028 import com.liferay.registry.collections.StringServiceRegistrationMap;
029 import com.liferay.registry.collections.StringServiceRegistrationMapImpl;
030
031 import java.io.Closeable;
032
033 import java.util.Iterator;
034 import java.util.Map;
035 import java.util.Map.Entry;
036 import java.util.ResourceBundle;
037 import java.util.Set;
038 import java.util.concurrent.ConcurrentHashMap;
039
040
043 public class ResourceBundleTracker implements Closeable {
044
045 public ResourceBundleTracker(ClassLoader classLoader, Portlet portlet) {
046 _classLoader = classLoader;
047 _portlet = portlet;
048
049 Registry registry = RegistryUtil.getRegistry();
050
051 Filter filter = registry.getFilter(
052 "(&(javax.portlet.name=" + portlet.getPortletId() +
053 ")(language.id=*)(objectClass=" +
054 ResourceBundle.class.getName() + "))");
055
056 _serviceTracker = registry.trackServices(
057 filter, new ResourceBundleServiceTrackerCustomizer());
058
059 _serviceTracker.open();
060 }
061
062 public void clear() {
063 Set<Entry<String, ServiceRegistration<ResourceBundle>>> set =
064 _serviceRegistrations.entrySet();
065
066 Iterator<Entry<String, ServiceRegistration<ResourceBundle>>> iterator =
067 set.iterator();
068
069 while (iterator.hasNext()) {
070 Entry<String, ServiceRegistration<ResourceBundle>> entry =
071 iterator.next();
072
073 ServiceRegistration<ResourceBundle> serviceRegistration =
074 entry.getValue();
075
076 serviceRegistration.unregister();
077
078 iterator.remove();
079 }
080 }
081
082 @Override
083 public void close() {
084 clear();
085
086 _serviceTracker.close();
087 }
088
089 public ResourceBundle getResourceBundle(String languageId) {
090 if (languageId == null) {
091 languageId = StringPool.BLANK;
092 }
093
094 ResourceBundle resourceBundle = _resourceBundles.get(languageId);
095
096 if (resourceBundle != null) {
097 return resourceBundle;
098 }
099
100 return ResourceBundleUtil.getBundle(
101 _portlet.getResourceBundle(), LocaleUtil.fromLanguageId(languageId),
102 _classLoader);
103 }
104
105 private final ClassLoader _classLoader;
106 private final Portlet _portlet;
107 private final Map<String, ResourceBundle> _resourceBundles =
108 new ConcurrentHashMap<>();
109 private final StringServiceRegistrationMap<ResourceBundle>
110 _serviceRegistrations = new StringServiceRegistrationMapImpl<>();
111 private final ServiceTracker<ResourceBundle, ResourceBundle>
112 _serviceTracker;
113
114 private class ResourceBundleServiceTrackerCustomizer
115 implements ServiceTrackerCustomizer<ResourceBundle, ResourceBundle> {
116
117 @Override
118 public ResourceBundle addingService(
119 ServiceReference<ResourceBundle> serviceReference) {
120
121 Registry registry = RegistryUtil.getRegistry();
122
123 ResourceBundle resourceBundle = registry.getService(
124 serviceReference);
125
126 _resourceBundles.put(
127 (String)serviceReference.getProperty("language.id"),
128 resourceBundle);
129
130 return resourceBundle;
131 }
132
133 @Override
134 public void modifiedService(
135 ServiceReference<ResourceBundle> serviceReference,
136 ResourceBundle resourceBundle) {
137 }
138
139 @Override
140 public void removedService(
141 ServiceReference<ResourceBundle> serviceReference,
142 ResourceBundle resourceBundle) {
143
144 Registry registry = RegistryUtil.getRegistry();
145
146 registry.ungetService(serviceReference);
147
148 _resourceBundles.remove(
149 serviceReference.getProperty("language.id"));
150 }
151
152 }
153
154 }