001
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
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 }