001
014
015 package com.liferay.portal.kernel.atom;
016
017 import aQute.bnd.annotation.ProviderType;
018
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.util.ListUtil;
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.ServiceRegistrationMap;
029
030 import java.util.List;
031 import java.util.Map;
032 import java.util.concurrent.ConcurrentHashMap;
033
034
037 @ProviderType
038 public class AtomCollectionAdapterRegistryUtil {
039
040 public static AtomCollectionAdapter<?> getAtomCollectionAdapter(
041 String collectionName) {
042
043 return _instance._getAtomCollectionAdapter(collectionName);
044 }
045
046 public static List<AtomCollectionAdapter<?>> getAtomCollectionAdapters() {
047 return _instance._getAtomCollectionAdapters();
048 }
049
050 public static void register(
051 AtomCollectionAdapter<?> atomCollectionAdapter) {
052
053 _instance._register(atomCollectionAdapter);
054 }
055
056 public static void register(
057 List<AtomCollectionAdapter<?>> atomCollectionAdapters) {
058
059 for (AtomCollectionAdapter<?> atomCollectionAdapter :
060 atomCollectionAdapters) {
061
062 register(atomCollectionAdapter);
063 }
064 }
065
066 public static void unregister(
067 AtomCollectionAdapter<?> atomCollectionAdapter) {
068
069 _instance._unregister(atomCollectionAdapter);
070 }
071
072 public static void unregister(
073 List<AtomCollectionAdapter<?>> atomCollectionAdapters) {
074
075 for (AtomCollectionAdapter<?> atomCollectionAdapter :
076 atomCollectionAdapters) {
077
078 unregister(atomCollectionAdapter);
079 }
080 }
081
082 private AtomCollectionAdapterRegistryUtil() {
083 Registry registry = RegistryUtil.getRegistry();
084
085 _serviceTracker = registry.trackServices(
086 (Class<AtomCollectionAdapter<?>>)(Class<?>)
087 AtomCollectionAdapter.class,
088 new AtomCollectionAdapterServiceTrackerCustomizer());
089
090 _serviceTracker.open();
091 }
092
093 private AtomCollectionAdapter<?> _getAtomCollectionAdapter(
094 String collectionName) {
095
096 return _atomCollectionAdapters.get(collectionName);
097 }
098
099 private List<AtomCollectionAdapter<?>> _getAtomCollectionAdapters() {
100 return ListUtil.fromMapValues(_atomCollectionAdapters);
101 }
102
103 private void _register(AtomCollectionAdapter<?> atomCollectionAdapter) {
104 Registry registry = RegistryUtil.getRegistry();
105
106 ServiceRegistration<AtomCollectionAdapter<?>> serviceRegistration =
107 registry.registerService(
108 (Class<AtomCollectionAdapter<?>>)(Class<?>)
109 AtomCollectionAdapter.class,
110 atomCollectionAdapter);
111
112 _serviceRegistrations.put(atomCollectionAdapter, serviceRegistration);
113 }
114
115 private void _unregister(AtomCollectionAdapter<?> atomCollectionAdapter) {
116 ServiceRegistration<AtomCollectionAdapter<?>> serviceRegistration =
117 _serviceRegistrations.remove(atomCollectionAdapter);
118
119 if (serviceRegistration != null) {
120 serviceRegistration.unregister();
121 }
122 }
123
124 private static final Log _log = LogFactoryUtil.getLog(
125 AtomCollectionAdapterRegistryUtil.class);
126
127 private static final AtomCollectionAdapterRegistryUtil _instance =
128 new AtomCollectionAdapterRegistryUtil();
129
130 private final Map<String, AtomCollectionAdapter<?>>
131 _atomCollectionAdapters =
132 new ConcurrentHashMap<String, AtomCollectionAdapter<?>>();
133 private final ServiceRegistrationMap<AtomCollectionAdapter<?>>
134 _serviceRegistrations =
135 new ServiceRegistrationMap<AtomCollectionAdapter<?>>();
136 private final
137 ServiceTracker<AtomCollectionAdapter<?>, AtomCollectionAdapter<?>>
138 _serviceTracker;
139
140 private class AtomCollectionAdapterServiceTrackerCustomizer
141 implements ServiceTrackerCustomizer
142 <AtomCollectionAdapter<?>, AtomCollectionAdapter<?>> {
143
144 @Override
145 public AtomCollectionAdapter<?> addingService(
146 ServiceReference<AtomCollectionAdapter<?>> serviceReference) {
147
148 Registry registry = RegistryUtil.getRegistry();
149
150 AtomCollectionAdapter<?> atomCollectionAdapter =
151 registry.getService(serviceReference);
152
153 if (_atomCollectionAdapters.containsKey(
154 atomCollectionAdapter.getCollectionName())) {
155
156 if (_log.isWarnEnabled()) {
157 _log.warn(
158 "Duplicate collection name " +
159 atomCollectionAdapter.getCollectionName());
160 }
161
162 return null;
163 }
164
165 _atomCollectionAdapters.put(
166 atomCollectionAdapter.getCollectionName(),
167 atomCollectionAdapter);
168
169 return atomCollectionAdapter;
170 }
171
172 @Override
173 public void modifiedService(
174 ServiceReference<AtomCollectionAdapter<?>> serviceReference,
175 AtomCollectionAdapter<?> atomCollectionAdapter) {
176 }
177
178 @Override
179 public void removedService(
180 ServiceReference<AtomCollectionAdapter<?>> serviceReference,
181 AtomCollectionAdapter<?> atomCollectionAdapter) {
182
183 Registry registry = RegistryUtil.getRegistry();
184
185 registry.ungetService(serviceReference);
186
187 _atomCollectionAdapters.remove(
188 atomCollectionAdapter.getCollectionName());
189 }
190
191 }
192
193 }