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