001
014
015 package com.liferay.portlet.dynamicdatamapping.util;
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 DDMDisplayRegistryUtil {
038
039 public static DDMDisplay getDDMDisplay(String portletId) {
040 return _instance._getDDMDisplay(portletId);
041 }
042
043 public static List<DDMDisplay> getDDMDisplays() {
044 return _instance._getDDMDisplays();
045 }
046
047 public static String[] getPortletIds() {
048 return _instance._getPortletIds();
049 }
050
051 public static void register(DDMDisplay ddmDisplay) {
052 _instance._register(ddmDisplay);
053 }
054
055 public static void unregister(DDMDisplay ddmDisplay) {
056 _instance._unregister(ddmDisplay);
057 }
058
059 private DDMDisplayRegistryUtil() {
060 Registry registry = RegistryUtil.getRegistry();
061
062 _serviceTracker = registry.trackServices(
063 DDMDisplay.class, new DDMDisplayServiceTrackerCustomizer());
064
065 _serviceTracker.open();
066 }
067
068 private DDMDisplay _getDDMDisplay(String portletId) {
069 return _ddmDisplays.get(portletId);
070 }
071
072 private List<DDMDisplay> _getDDMDisplays() {
073 return ListUtil.fromMapValues(_ddmDisplays);
074 }
075
076 private String[] _getPortletIds() {
077 Set<String> portletIds = _ddmDisplays.keySet();
078
079 return portletIds.toArray(new String[portletIds.size()]);
080 }
081
082 private void _register(DDMDisplay ddmDisplay) {
083 Registry registry = RegistryUtil.getRegistry();
084
085 ServiceRegistration<DDMDisplay> serviceRegistration =
086 registry.registerService(DDMDisplay.class, ddmDisplay);
087
088 _serviceRegistrations.put(ddmDisplay, serviceRegistration);
089 }
090
091 private void _unregister(DDMDisplay ddmDisplay) {
092 ServiceRegistration<DDMDisplay> serviceRegistration =
093 _serviceRegistrations.remove(ddmDisplay);
094
095 if (serviceRegistration != null) {
096 serviceRegistration.unregister();
097 }
098 }
099
100 private static final DDMDisplayRegistryUtil _instance =
101 new DDMDisplayRegistryUtil();
102
103 private final Map<String, DDMDisplay> _ddmDisplays =
104 new ConcurrentHashMap<String, DDMDisplay>();
105 private final ServiceRegistrationMap<DDMDisplay> _serviceRegistrations =
106 new ServiceRegistrationMap<DDMDisplay>();
107 private final ServiceTracker<DDMDisplay, DDMDisplay> _serviceTracker;
108
109 private class DDMDisplayServiceTrackerCustomizer
110 implements ServiceTrackerCustomizer<DDMDisplay, DDMDisplay> {
111
112 @Override
113 public DDMDisplay addingService(
114 ServiceReference<DDMDisplay> serviceReference) {
115
116 Registry registry = RegistryUtil.getRegistry();
117
118 DDMDisplay ddmDisplay = registry.getService(serviceReference);
119
120 _ddmDisplays.put(ddmDisplay.getPortletId(), ddmDisplay);
121
122 return ddmDisplay;
123 }
124
125 @Override
126 public void modifiedService(
127 ServiceReference<DDMDisplay> serviceReference,
128 DDMDisplay ddmDisplay) {
129 }
130
131 @Override
132 public void removedService(
133 ServiceReference<DDMDisplay> serviceReference,
134 DDMDisplay ddmDisplay) {
135
136 Registry registry = RegistryUtil.getRegistry();
137
138 registry.ungetService(serviceReference);
139
140 _ddmDisplays.remove(ddmDisplay.getPortletId());
141 }
142
143 }
144
145 }