001
014
015 package com.liferay.portlet.asset;
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.portal.util.PortalUtil;
023 import com.liferay.portlet.asset.model.AssetRendererFactory;
024 import com.liferay.registry.Registry;
025 import com.liferay.registry.RegistryUtil;
026 import com.liferay.registry.ServiceReference;
027 import com.liferay.registry.ServiceRegistration;
028 import com.liferay.registry.ServiceTracker;
029 import com.liferay.registry.ServiceTrackerCustomizer;
030 import com.liferay.registry.collections.ServiceRegistrationMap;
031
032 import java.util.List;
033 import java.util.Map;
034 import java.util.concurrent.ConcurrentHashMap;
035
036
040 @ProviderType
041 public class AssetRendererFactoryRegistryUtil {
042
043
047 @Deprecated
048 public static List<AssetRendererFactory> getAssetRendererFactories() {
049 return _instance._getAssetRendererFactories();
050 }
051
052 public static List<AssetRendererFactory> getAssetRendererFactories(
053 long companyId) {
054
055 return _instance._getAssetRendererFactories(companyId);
056 }
057
058 public static AssetRendererFactory getAssetRendererFactoryByClassName(
059 String className) {
060
061 return _instance._getAssetRendererFactoryByClassName(className);
062 }
063
064 public static AssetRendererFactory getAssetRendererFactoryByClassNameId(
065 long classNameId) {
066
067 return _instance._getAssetRendererFactoryByClassNameId(classNameId);
068 }
069
070 public static AssetRendererFactory getAssetRendererFactoryByType(
071 String type) {
072
073 return _instance._getAssetRendererFactoryByType(type);
074 }
075
076
079 @Deprecated
080 public static long[] getClassNameIds() {
081 return _instance._getClassNameIds(0, false);
082 }
083
084 public static long[] getClassNameIds(long companyId) {
085 return _instance._getClassNameIds(companyId, false);
086 }
087
088 public static long[] getClassNameIds(
089 long companyId, boolean filterSelectable) {
090
091 return _instance._getClassNameIds(companyId, filterSelectable);
092 }
093
094 public static void register(AssetRendererFactory assetRendererFactory) {
095 _instance._register(assetRendererFactory);
096 }
097
098 public static void register(
099 List<AssetRendererFactory> assetRendererFactories) {
100
101 for (AssetRendererFactory assetRendererFactory :
102 assetRendererFactories) {
103
104 register(assetRendererFactory);
105 }
106 }
107
108 public static void unregister(AssetRendererFactory assetRendererFactory) {
109 _instance._unregister(assetRendererFactory);
110 }
111
112 public static void unregister(
113 List<AssetRendererFactory> assetRendererFactories) {
114
115 for (AssetRendererFactory assetRendererFactory :
116 assetRendererFactories) {
117
118 unregister(assetRendererFactory);
119 }
120 }
121
122 private AssetRendererFactoryRegistryUtil() {
123 Registry registry = RegistryUtil.getRegistry();
124
125 _serviceTracker = registry.trackServices(
126 AssetRendererFactory.class,
127 new AssetRendererFactoryServiceTrackerCustomizer());
128
129 _serviceTracker.open();
130 }
131
132 private Map<String, AssetRendererFactory> _filterAssetRendererFactories(
133 long companyId,
134 Map<String, AssetRendererFactory> assetRendererFactories,
135 boolean filterSelectable) {
136
137 Map<String, AssetRendererFactory> filteredAssetRendererFactories =
138 new ConcurrentHashMap<>();
139
140 for (String className : assetRendererFactories.keySet()) {
141 AssetRendererFactory assetRendererFactory =
142 assetRendererFactories.get(className);
143
144 if (assetRendererFactory.isActive(companyId) &&
145 (!filterSelectable || assetRendererFactory.isSelectable())) {
146
147 filteredAssetRendererFactories.put(
148 className, assetRendererFactory);
149 }
150 }
151
152 return filteredAssetRendererFactories;
153 }
154
155 private List<AssetRendererFactory> _getAssetRendererFactories() {
156 return ListUtil.fromMapValues(_assetRenderFactoriesMapByClassName);
157 }
158
159 private List<AssetRendererFactory> _getAssetRendererFactories(
160 long companyId) {
161
162 return ListUtil.fromMapValues(
163 _filterAssetRendererFactories(
164 companyId, _assetRenderFactoriesMapByClassName, false));
165 }
166
167 private AssetRendererFactory _getAssetRendererFactoryByClassName(
168 String className) {
169
170 return _assetRenderFactoriesMapByClassName.get(className);
171 }
172
173 private AssetRendererFactory _getAssetRendererFactoryByClassNameId(
174 long classNameId) {
175
176 return _getAssetRendererFactoryByClassName(
177 PortalUtil.getClassName(classNameId));
178 }
179
180 private AssetRendererFactory _getAssetRendererFactoryByType(String type) {
181 return _assetRenderFactoriesMapByClassType.get(type);
182 }
183
184 private long[] _getClassNameIds(long companyId, boolean filterSelectable) {
185 Map<String, AssetRendererFactory> assetRenderFactories =
186 _assetRenderFactoriesMapByClassName;
187
188 if (companyId > 0) {
189 assetRenderFactories = _filterAssetRendererFactories(
190 companyId, _assetRenderFactoriesMapByClassName,
191 filterSelectable);
192 }
193
194 long[] classNameIds = new long[assetRenderFactories.size()];
195
196 int i = 0;
197
198 for (AssetRendererFactory assetRendererFactory :
199 assetRenderFactories.values()) {
200
201 classNameIds[i] = assetRendererFactory.getClassNameId();
202
203 i++;
204 }
205
206 return classNameIds;
207 }
208
209 private void _register(AssetRendererFactory assetRendererFactory) {
210 Registry registry = RegistryUtil.getRegistry();
211
212 ServiceRegistration<AssetRendererFactory> serviceRegistration =
213 registry.registerService(
214 AssetRendererFactory.class, assetRendererFactory);
215
216 _serviceRegistrations.put(assetRendererFactory, serviceRegistration);
217 }
218
219 private void _unregister(AssetRendererFactory assetRendererFactory) {
220 ServiceRegistration<AssetRendererFactory> serviceRegistration =
221 _serviceRegistrations.remove(assetRendererFactory);
222
223 if (serviceRegistration != null) {
224 serviceRegistration.unregister();
225 }
226 }
227
228 private static final Log _log = LogFactoryUtil.getLog(
229 AssetRendererFactoryRegistryUtil.class);
230
231 private static final AssetRendererFactoryRegistryUtil _instance =
232 new AssetRendererFactoryRegistryUtil();
233
234 private final Map<String, AssetRendererFactory>
235 _assetRenderFactoriesMapByClassName = new ConcurrentHashMap<>();
236 private final Map<String, AssetRendererFactory>
237 _assetRenderFactoriesMapByClassType = new ConcurrentHashMap<>();
238 private final ServiceRegistrationMap<AssetRendererFactory>
239 _serviceRegistrations = new ServiceRegistrationMap<>();
240 private final ServiceTracker<AssetRendererFactory, AssetRendererFactory>
241 _serviceTracker;
242
243 private class AssetRendererFactoryServiceTrackerCustomizer
244 implements ServiceTrackerCustomizer
245 <AssetRendererFactory, AssetRendererFactory> {
246
247 @Override
248 public AssetRendererFactory addingService(
249 ServiceReference<AssetRendererFactory> serviceReference) {
250
251 Registry registry = RegistryUtil.getRegistry();
252
253 AssetRendererFactory assetRendererFactory = registry.getService(
254 serviceReference);
255
256 String className = assetRendererFactory.getClassName();
257
258 AssetRendererFactory classNameAssetRendererFactory =
259 _assetRenderFactoriesMapByClassName.put(
260 className, assetRendererFactory);
261
262 if (_log.isWarnEnabled() &&
263 (classNameAssetRendererFactory != null)) {
264
265 _log.warn(
266 "Replacing " + classNameAssetRendererFactory +
267 " for class name " + className + " with " +
268 assetRendererFactory);
269 }
270
271 String type = assetRendererFactory.getType();
272
273 AssetRendererFactory typeAssetRendererFactory =
274 _assetRenderFactoriesMapByClassType.put(
275 type, assetRendererFactory);
276
277 if (_log.isWarnEnabled() && (typeAssetRendererFactory != null)) {
278 _log.warn(
279 "Replacing " + typeAssetRendererFactory + " for type " +
280 type + " with " + assetRendererFactory);
281 }
282
283 return assetRendererFactory;
284 }
285
286 @Override
287 public void modifiedService(
288 ServiceReference<AssetRendererFactory> serviceReference,
289 AssetRendererFactory assetRendererFactory) {
290 }
291
292 @Override
293 public void removedService(
294 ServiceReference<AssetRendererFactory> serviceReference,
295 AssetRendererFactory assetRendererFactory) {
296
297 Registry registry = RegistryUtil.getRegistry();
298
299 registry.ungetService(serviceReference);
300
301 _assetRenderFactoriesMapByClassName.remove(
302 assetRendererFactory.getClassName());
303 _assetRenderFactoriesMapByClassType.remove(
304 assetRendererFactory.getType());
305 }
306
307 }
308
309 }