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