/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.exportimport.kernel.lar; import aQute.bnd.annotation.ProviderType; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.registry.Registry; import com.liferay.registry.RegistryUtil; import com.liferay.registry.ServiceReference; import com.liferay.registry.ServiceRegistration; import com.liferay.registry.ServiceTracker; import com.liferay.registry.ServiceTrackerCustomizer; import com.liferay.registry.collections.ServiceRegistrationMap; import com.liferay.registry.collections.ServiceRegistrationMapImpl; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Provides a utility facade to the staged model data handler registry * framework. * * @author Mate Thurzo * @author Brian Wing Shun Chan * @since 6.2 */ @ProviderType public class StagedModelDataHandlerRegistryUtil { /** * Returns the registered staged model data handler with the class name. * * @param className the name of the staged model class * @return the registered staged model data handler with the class name, or * <code>null</code> if none are registered with the class name */ public static StagedModelDataHandler<?> getStagedModelDataHandler( String className) { return _instance._getStagedModelDataHandler(className); } /** * Returns all the registered staged model data handlers. * * @return the registered staged model data handlers */ public static List<StagedModelDataHandler<?>> getStagedModelDataHandlers() { return _instance._getStagedModelDataHandlers(); } /** * Registers the staged model data handler. * * @param stagedModelDataHandler the staged model data handler to register */ public static void register( StagedModelDataHandler<?> stagedModelDataHandler) { _instance._register(stagedModelDataHandler); } /** * Unregisters the staged model data handlers. * * @param stagedModelDataHandlers the staged model data handlers to * unregister */ public static void unregister( List<StagedModelDataHandler<?>> stagedModelDataHandlers) { for (StagedModelDataHandler<?> stagedModelDataHandler : stagedModelDataHandlers) { unregister(stagedModelDataHandler); } } /** * Unregisters the staged model data handler. * * @param stagedModelDataHandler the staged model data handler to unregister */ public static void unregister( StagedModelDataHandler<?> stagedModelDataHandler) { _instance._unregister(stagedModelDataHandler); } private StagedModelDataHandlerRegistryUtil() { Registry registry = RegistryUtil.getRegistry(); _serviceTracker = registry.trackServices( (Class<StagedModelDataHandler<?>>)(Class<?>) StagedModelDataHandler.class, new StagedModelDataHandlerServiceTrackerCustomizer()); _serviceTracker.open(); } private StagedModelDataHandler<?> _getStagedModelDataHandler( String className) { return _stagedModelDataHandlers.get(className); } private List<StagedModelDataHandler<?>> _getStagedModelDataHandlers() { Collection<StagedModelDataHandler<?>> values = _stagedModelDataHandlers.values(); return ListUtil.fromCollection(values); } private void _register(StagedModelDataHandler<?> stagedModelDataHandler) { Registry registry = RegistryUtil.getRegistry(); ServiceRegistration<StagedModelDataHandler<?>> serviceRegistration = registry.registerService( (Class<StagedModelDataHandler<?>>)(Class<?>) StagedModelDataHandler.class, stagedModelDataHandler); _serviceRegistrations.put(stagedModelDataHandler, serviceRegistration); } private void _unregister(StagedModelDataHandler<?> stagedModelDataHandler) { ServiceRegistration<StagedModelDataHandler<?>> serviceRegistration = _serviceRegistrations.remove(stagedModelDataHandler); if (serviceRegistration != null) { serviceRegistration.unregister(); } } private static final StagedModelDataHandlerRegistryUtil _instance = new StagedModelDataHandlerRegistryUtil(); private final ServiceRegistrationMap<StagedModelDataHandler<?>> _serviceRegistrations = new ServiceRegistrationMapImpl<>(); private final ServiceTracker<StagedModelDataHandler<?>, StagedModelDataHandler<?>> _serviceTracker; private final Map<String, StagedModelDataHandler<?>> _stagedModelDataHandlers = new ConcurrentHashMap<>(); private class StagedModelDataHandlerServiceTrackerCustomizer implements ServiceTrackerCustomizer <StagedModelDataHandler<?>, StagedModelDataHandler<?>> { @Override public StagedModelDataHandler<?> addingService( ServiceReference<StagedModelDataHandler<?>> serviceReference) { Registry registry = RegistryUtil.getRegistry(); StagedModelDataHandler<?> stagedModelDataHandler = registry.getService(serviceReference); for (String className : stagedModelDataHandler.getClassNames()) { _stagedModelDataHandlers.put(className, stagedModelDataHandler); } return stagedModelDataHandler; } @Override public void modifiedService( ServiceReference<StagedModelDataHandler<?>> serviceReference, StagedModelDataHandler<?> stagedModelDataHandler) { } @Override public void removedService( ServiceReference<StagedModelDataHandler<?>> serviceReference, StagedModelDataHandler<?> stagedModelDataHandler) { Registry registry = RegistryUtil.getRegistry(); registry.ungetService(serviceReference); for (String className : stagedModelDataHandler.getClassNames()) { _stagedModelDataHandlers.remove(className); } } } }