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.portlet.exportimport.lifecycle;
016    
017    import com.liferay.registry.Registry;
018    import com.liferay.registry.RegistryUtil;
019    import com.liferay.registry.ServiceReference;
020    import com.liferay.registry.ServiceRegistration;
021    import com.liferay.registry.ServiceTracker;
022    import com.liferay.registry.ServiceTrackerCustomizer;
023    import com.liferay.registry.collections.ServiceRegistrationMap;
024    import com.liferay.registry.collections.ServiceRegistrationMapImpl;
025    
026    import java.util.HashSet;
027    import java.util.List;
028    import java.util.Set;
029    
030    /**
031     * @author Daniel Kocsis
032     */
033    public class ExportImportLifecycleEventListenerRegistryUtil {
034    
035            public static Set<ExportImportLifecycleListener>
036                    getAsyncExportImportLifecycleListeners() {
037    
038                    return _instance._getAsyncExportImportLifecycleListeners();
039            }
040    
041            public static Set<ExportImportLifecycleListener>
042                    getSyncExportImportLifecycleListeners() {
043    
044                    return _instance._getSyncExportImportLifecycleListeners();
045            }
046    
047            public static void register(
048                    ExportImportLifecycleListener exportImportLifecycleListener) {
049    
050                    _instance._register(exportImportLifecycleListener);
051            }
052    
053            public static void unregister(
054                    ExportImportLifecycleListener exportImportLifecycleListener) {
055    
056                    _instance._unregister(exportImportLifecycleListener);
057            }
058    
059            public static void unregister(
060                    List<ExportImportLifecycleListener> exportImportLifecycleListeners) {
061    
062                    for (ExportImportLifecycleListener exportImportLifecycleListener :
063                                    exportImportLifecycleListeners) {
064    
065                            unregister(exportImportLifecycleListener);
066                    }
067            }
068    
069            private ExportImportLifecycleEventListenerRegistryUtil() {
070                    Registry registry = RegistryUtil.getRegistry();
071    
072                    _serviceTracker = registry.trackServices(
073                            ExportImportLifecycleListener.class,
074                            new ExportImportLifecycleListenerServiceTrackerCustomizer());
075    
076                    _serviceTracker.open();
077            }
078    
079            private Set<ExportImportLifecycleListener>
080                    _getAsyncExportImportLifecycleListeners() {
081    
082                    return _asyncExportImportLifecycleListeners;
083            }
084    
085            private Set<ExportImportLifecycleListener>
086                    _getSyncExportImportLifecycleListeners() {
087    
088                    return _syncExportImportLifecycleListeners;
089            }
090    
091            private void _register(
092                    ExportImportLifecycleListener exportImportLifecycleListener) {
093    
094                    Registry registry = RegistryUtil.getRegistry();
095    
096                    ServiceRegistration<ExportImportLifecycleListener> serviceRegistration =
097                            registry.registerService(
098                                    ExportImportLifecycleListener.class,
099                                    exportImportLifecycleListener);
100    
101                    _serviceRegistrations.put(
102                            exportImportLifecycleListener, serviceRegistration);
103            }
104    
105            private void _unregister(
106                    ExportImportLifecycleListener exportImportLifecycleListener) {
107    
108                    ServiceRegistration<ExportImportLifecycleListener> serviceRegistration =
109                            _serviceRegistrations.remove(exportImportLifecycleListener);
110    
111                    if (serviceRegistration != null) {
112                            serviceRegistration.unregister();
113                    }
114            }
115    
116            private static final ExportImportLifecycleEventListenerRegistryUtil
117                    _instance = new ExportImportLifecycleEventListenerRegistryUtil();
118    
119            private final Set<ExportImportLifecycleListener>
120                    _asyncExportImportLifecycleListeners = new HashSet<>();
121            private final ServiceRegistrationMap<ExportImportLifecycleListener>
122                    _serviceRegistrations = new ServiceRegistrationMapImpl<>();
123            private final ServiceTracker
124                    <ExportImportLifecycleListener, ExportImportLifecycleListener>
125                            _serviceTracker;
126            private final Set<ExportImportLifecycleListener>
127                    _syncExportImportLifecycleListeners = new HashSet<>();
128    
129            private class ExportImportLifecycleListenerServiceTrackerCustomizer
130                    implements ServiceTrackerCustomizer
131                            <ExportImportLifecycleListener, ExportImportLifecycleListener> {
132    
133                    @Override
134                    public ExportImportLifecycleListener addingService(
135                            ServiceReference<ExportImportLifecycleListener> serviceReference) {
136    
137                            Registry registry = RegistryUtil.getRegistry();
138    
139                            ExportImportLifecycleListener exportImportLifecycleListener =
140                                    registry.getService(serviceReference);
141    
142                            if (exportImportLifecycleListener.isParallel()) {
143                                    _asyncExportImportLifecycleListeners.add(
144                                            exportImportLifecycleListener);
145                            }
146                            else {
147                                    _syncExportImportLifecycleListeners.add(
148                                            exportImportLifecycleListener);
149                            }
150    
151                            return exportImportLifecycleListener;
152                    }
153    
154                    @Override
155                    public void modifiedService(
156                            ServiceReference<ExportImportLifecycleListener> serviceReference,
157                            ExportImportLifecycleListener exportImportLifecycleListener) {
158                    }
159    
160                    @Override
161                    public void removedService(
162                            ServiceReference<ExportImportLifecycleListener> serviceReference,
163                            ExportImportLifecycleListener exportImportLifecycleListener) {
164    
165                            Registry registry = RegistryUtil.getRegistry();
166    
167                            registry.ungetService(serviceReference);
168    
169                            if (exportImportLifecycleListener.isParallel()) {
170                                    _asyncExportImportLifecycleListeners.remove(
171                                            exportImportLifecycleListener);
172                            }
173                            else {
174                                    _syncExportImportLifecycleListeners.remove(
175                                            exportImportLifecycleListener);
176                            }
177                    }
178    
179            }
180    
181    }