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