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