001
014
015 package com.liferay.portal.security.permission;
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 import com.liferay.registry.util.StringPlus;
029
030 import java.util.Collection;
031 import java.util.List;
032 import java.util.Map;
033 import java.util.concurrent.ConcurrentHashMap;
034
035
038 @ProviderType
039 public class PermissionUpdateHandlerRegistryUtil {
040
041 public static PermissionUpdateHandler getPermissionUpdateHandler(
042 String modelClassName) {
043
044 return _instance._getPermissionUpdateHandler(modelClassName);
045 }
046
047 public static List<PermissionUpdateHandler> getPermissionUpdateHandlers() {
048 return _instance._getPermissionUpdateHandlers();
049 }
050
051 public static void register(
052 PermissionUpdateHandler permissionUpdateHandler) {
053
054 _instance._register(permissionUpdateHandler);
055 }
056
057 public static void unregister(
058 List<PermissionUpdateHandler> permissionUpdateHandlers) {
059
060 for (PermissionUpdateHandler permissionUpdateHandler :
061 permissionUpdateHandlers) {
062
063 unregister(permissionUpdateHandler);
064 }
065 }
066
067 public static void unregister(
068 PermissionUpdateHandler permissionUpdateHandler) {
069
070 _instance._unregister(permissionUpdateHandler);
071 }
072
073 private PermissionUpdateHandlerRegistryUtil() {
074 Registry registry = RegistryUtil.getRegistry();
075
076 _serviceTracker = registry.trackServices(
077 (Class<PermissionUpdateHandler>)(Class<?>)
078 PermissionUpdateHandler.class,
079 new PermissionUpdateHandlerServiceTrackerCustomizer());
080
081 _serviceTracker.open();
082 }
083
084 private PermissionUpdateHandler _getPermissionUpdateHandler(
085 String modelClassName) {
086
087 return _permissionUpdateHandlers.get(modelClassName);
088 }
089
090 private List<PermissionUpdateHandler> _getPermissionUpdateHandlers() {
091 Collection<PermissionUpdateHandler> values =
092 _permissionUpdateHandlers.values();
093
094 return ListUtil.fromCollection(values);
095 }
096
097 private void _register(PermissionUpdateHandler permissionUpdateHandler) {
098 Registry registry = RegistryUtil.getRegistry();
099
100 ServiceRegistration<PermissionUpdateHandler>
101 serviceRegistration = registry.registerService(
102 (Class<PermissionUpdateHandler>)(Class<?>)
103 PermissionUpdateHandler.class,
104 permissionUpdateHandler);
105
106 _serviceRegistrations.put(permissionUpdateHandler, serviceRegistration);
107 }
108
109 private void _unregister(PermissionUpdateHandler permissionUpdateHandler) {
110 ServiceRegistration<PermissionUpdateHandler> serviceRegistration =
111 _serviceRegistrations.remove(permissionUpdateHandler);
112
113 if (serviceRegistration != null) {
114 serviceRegistration.unregister();
115 }
116 }
117
118 private static final PermissionUpdateHandlerRegistryUtil _instance =
119 new PermissionUpdateHandlerRegistryUtil();
120
121 private final Map<String, PermissionUpdateHandler>
122 _permissionUpdateHandlers = new ConcurrentHashMap<>();
123 private final ServiceRegistrationMap<PermissionUpdateHandler>
124 _serviceRegistrations = new ServiceRegistrationMapImpl<>();
125 private final ServiceTracker
126 <PermissionUpdateHandler, PermissionUpdateHandler> _serviceTracker;
127
128 private class PermissionUpdateHandlerServiceTrackerCustomizer
129 implements ServiceTrackerCustomizer
130 <PermissionUpdateHandler, PermissionUpdateHandler> {
131
132 @Override
133 public PermissionUpdateHandler addingService(
134 ServiceReference<PermissionUpdateHandler> serviceReference) {
135
136 Registry registry = RegistryUtil.getRegistry();
137
138 PermissionUpdateHandler permissionUpdateHandler =
139 registry.getService(serviceReference);
140
141 List<String> modelClassNames = StringPlus.asList(
142 serviceReference.getProperty("model.class.name"));
143
144 for (String modelClassName : modelClassNames) {
145 _permissionUpdateHandlers.put(
146 modelClassName, permissionUpdateHandler);
147 }
148
149 return permissionUpdateHandler;
150 }
151
152 @Override
153 public void modifiedService(
154 ServiceReference<PermissionUpdateHandler> serviceReference,
155 PermissionUpdateHandler permissionUpdateHandler) {
156 }
157
158 @Override
159 public void removedService(
160 ServiceReference<PermissionUpdateHandler> serviceReference,
161 PermissionUpdateHandler permissionUpdateHandler) {
162
163 Registry registry = RegistryUtil.getRegistry();
164
165 registry.ungetService(serviceReference);
166
167 List<String> modelClassNames = StringPlus.asList(
168 serviceReference.getProperty("model.class.name"));
169
170 for (String modelClassName : modelClassNames) {
171 _permissionUpdateHandlers.remove(modelClassName);
172 }
173 }
174
175 }
176
177 }