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.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    /**
039     * @author Raymond Aug??
040     */
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    }