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.portlet;
016    
017    import aQute.bnd.annotation.ProviderType;
018    
019    import com.liferay.portal.kernel.util.ListUtil;
020    import com.liferay.registry.Registry;
021    import com.liferay.registry.RegistryUtil;
022    import com.liferay.registry.ServiceReference;
023    import com.liferay.registry.ServiceRegistration;
024    import com.liferay.registry.ServiceTracker;
025    import com.liferay.registry.ServiceTrackerCustomizer;
026    import com.liferay.registry.collections.ServiceRegistrationMap;
027    import com.liferay.registry.collections.ServiceRegistrationMapImpl;
028    
029    import java.util.List;
030    import java.util.Map;
031    import java.util.Set;
032    import java.util.concurrent.ConcurrentHashMap;
033    
034    /**
035     * @author Eduardo Garcia
036     */
037    @ProviderType
038    public class FriendlyURLResolverRegistryUtil {
039    
040            public static FriendlyURLResolver getFriendlyURLResolver(
041                    String urlSeparator) {
042    
043                    return _instance._getFriendlyURLResolver(urlSeparator);
044            }
045    
046            public static List<FriendlyURLResolver> getFriendlyURLResolvers() {
047                    return _instance._getFriendlyURLResolvers();
048            }
049    
050            public static String[] getURLSeparators() {
051                    return _instance._getURLSeparators();
052            }
053    
054            public static void register(FriendlyURLResolver friendlyURLResolver) {
055                    _instance._register(friendlyURLResolver);
056            }
057    
058            public static void unregister(FriendlyURLResolver friendlyURLResolver) {
059                    _instance._unregister(friendlyURLResolver);
060            }
061    
062            private FriendlyURLResolverRegistryUtil() {
063                    Registry registry = RegistryUtil.getRegistry();
064    
065                    _serviceTracker = registry.trackServices(
066                            FriendlyURLResolver.class,
067                            new FriendlyURLResolverServiceTrackerCustomizer());
068    
069                    _serviceTracker.open();
070            }
071    
072            private FriendlyURLResolver _getFriendlyURLResolver(String urlSeparator) {
073                    return _friendlyURLResolvers.get(urlSeparator);
074            }
075    
076            private List<FriendlyURLResolver> _getFriendlyURLResolvers() {
077                    return ListUtil.fromMapValues(_friendlyURLResolvers);
078            }
079    
080            private String[] _getURLSeparators() {
081                    Set<String> urlSeparators = _friendlyURLResolvers.keySet();
082    
083                    return urlSeparators.toArray(new String[urlSeparators.size()]);
084            }
085    
086            private void _register(FriendlyURLResolver friendlyURLResolver) {
087                    Registry registry = RegistryUtil.getRegistry();
088    
089                    ServiceRegistration<FriendlyURLResolver> serviceRegistration =
090                            registry.registerService(
091                                    FriendlyURLResolver.class, friendlyURLResolver);
092    
093                    _serviceRegistrations.put(friendlyURLResolver, serviceRegistration);
094            }
095    
096            private void _unregister(FriendlyURLResolver friendlyURLResolver) {
097                    ServiceRegistration<FriendlyURLResolver> serviceRegistration =
098                            _serviceRegistrations.remove(friendlyURLResolver);
099    
100                    if (serviceRegistration != null) {
101                            serviceRegistration.unregister();
102                    }
103            }
104    
105            private static final FriendlyURLResolverRegistryUtil _instance =
106                    new FriendlyURLResolverRegistryUtil();
107    
108            private final Map<String, FriendlyURLResolver> _friendlyURLResolvers =
109                    new ConcurrentHashMap<>();
110            private final ServiceRegistrationMap<FriendlyURLResolver>
111                    _serviceRegistrations = new ServiceRegistrationMapImpl<>();
112            private final ServiceTracker<FriendlyURLResolver, FriendlyURLResolver>
113                    _serviceTracker;
114    
115            private class FriendlyURLResolverServiceTrackerCustomizer
116                    implements ServiceTrackerCustomizer
117                            <FriendlyURLResolver, FriendlyURLResolver> {
118    
119                    @Override
120                    public FriendlyURLResolver addingService(
121                            ServiceReference<FriendlyURLResolver> serviceReference) {
122    
123                            Registry registry = RegistryUtil.getRegistry();
124    
125                            FriendlyURLResolver friendlyURLResolver = registry.getService(
126                                    serviceReference);
127    
128                            _friendlyURLResolvers.put(
129                                    friendlyURLResolver.getURLSeparator(), friendlyURLResolver);
130    
131                            return friendlyURLResolver;
132                    }
133    
134                    @Override
135                    public void modifiedService(
136                            ServiceReference<FriendlyURLResolver> serviceReference,
137                            FriendlyURLResolver friendlyURLResolver) {
138                    }
139    
140                    @Override
141                    public void removedService(
142                            ServiceReference<FriendlyURLResolver> serviceReference,
143                            FriendlyURLResolver friendlyURLResolver) {
144    
145                            Registry registry = RegistryUtil.getRegistry();
146    
147                            registry.ungetService(serviceReference);
148    
149                            _friendlyURLResolvers.remove(friendlyURLResolver.getURLSeparator());
150                    }
151    
152            }
153    
154    }