001
014
015 package com.liferay.portlet.dynamicdatamapping.render;
016
017 import com.liferay.registry.Filter;
018 import com.liferay.registry.Registry;
019 import com.liferay.registry.RegistryUtil;
020 import com.liferay.registry.ServiceReference;
021 import com.liferay.registry.ServiceRegistration;
022 import com.liferay.registry.ServiceTracker;
023 import com.liferay.registry.ServiceTrackerCustomizer;
024 import com.liferay.registry.collections.ServiceRegistrationMap;
025
026 import java.util.ArrayList;
027 import java.util.HashMap;
028 import java.util.List;
029 import java.util.Map;
030
031
034 public class DDMFormFieldRendererRegistryImpl
035 implements DDMFormFieldRendererRegistry {
036
037 public DDMFormFieldRendererRegistryImpl() {
038 Registry registry = RegistryUtil.getRegistry();
039
040 Class<?> clazz = getClass();
041
042 Filter filter = registry.getFilter(
043 "(&(objectClass=" + DDMFormFieldRenderer.class.getName() +
044 ")(!(objectClass=" + clazz.getName() + ")))");
045
046 _serviceTracker = registry.trackServices(
047 filter, new DDMFormFieldRendererServiceTrackerCustomizer());
048
049 _serviceTracker.open();
050 }
051
052 @Override
053 public DDMFormFieldRenderer getDDMFormFieldRenderer(
054 String ddmFormFieldType) {
055
056 List<DDMFormFieldRenderer> ddmFormFieldRenders =
057 _ddmFormFieldRenderersMap.get(ddmFormFieldType);
058
059 if ((ddmFormFieldRenders == null) || ddmFormFieldRenders.isEmpty()) {
060 return null;
061 }
062
063 return ddmFormFieldRenders.get(ddmFormFieldRenders.size() - 1);
064 }
065
066 public void setDefaultDDMFormFieldRenderer(
067 DDMFormFieldRenderer ddmFormFieldRenderer) {
068
069 Registry registry = RegistryUtil.getRegistry();
070
071 ServiceRegistration<DDMFormFieldRenderer> serviceRegistration =
072 registry.registerService(
073 DDMFormFieldRenderer.class, ddmFormFieldRenderer);
074
075 _serviceRegistrations.put(ddmFormFieldRenderer, serviceRegistration);
076 }
077
078 private final Map<String, List<DDMFormFieldRenderer>>
079 _ddmFormFieldRenderersMap =
080 new HashMap<String, List<DDMFormFieldRenderer>>();
081 private final ServiceRegistrationMap<DDMFormFieldRenderer>
082 _serviceRegistrations =
083 new ServiceRegistrationMap<DDMFormFieldRenderer>();
084 private final ServiceTracker<DDMFormFieldRenderer, DDMFormFieldRenderer>
085 _serviceTracker;
086
087 private class DDMFormFieldRendererServiceTrackerCustomizer
088 implements
089 ServiceTrackerCustomizer
090 <DDMFormFieldRenderer, DDMFormFieldRenderer> {
091
092 @Override
093 public DDMFormFieldRenderer addingService(
094 ServiceReference<DDMFormFieldRenderer> serviceReference) {
095
096 Registry registry = RegistryUtil.getRegistry();
097
098 DDMFormFieldRenderer ddmFormFieldRenderer = registry.getService(
099 serviceReference);
100
101 for (String supportedDDMFormFieldType :
102 ddmFormFieldRenderer.getSupportedDDMFormFieldTypes()) {
103
104 List<DDMFormFieldRenderer> ddmFormFieldRenderers =
105 _ddmFormFieldRenderersMap.get(supportedDDMFormFieldType);
106
107 if (ddmFormFieldRenderers == null) {
108 ddmFormFieldRenderers =
109 new ArrayList<DDMFormFieldRenderer>();
110
111 _ddmFormFieldRenderersMap.put(
112 supportedDDMFormFieldType, ddmFormFieldRenderers);
113 }
114
115 ddmFormFieldRenderers.add(ddmFormFieldRenderer);
116 }
117
118 return ddmFormFieldRenderer;
119 }
120
121 @Override
122 public void modifiedService(
123 ServiceReference<DDMFormFieldRenderer> serviceReference,
124 DDMFormFieldRenderer ddmFormFieldRenderer) {
125 }
126
127 @Override
128 public void removedService(
129 ServiceReference<DDMFormFieldRenderer> serviceReference,
130 DDMFormFieldRenderer ddmFormFieldRenderer) {
131
132 Registry registry = RegistryUtil.getRegistry();
133
134 registry.ungetService(serviceReference);
135
136 for (String supportedDDMFormFieldType :
137 ddmFormFieldRenderer.getSupportedDDMFormFieldTypes()) {
138
139 List<DDMFormFieldRenderer> ddmFormFieldRenderers =
140 _ddmFormFieldRenderersMap.get(supportedDDMFormFieldType);
141
142 if (ddmFormFieldRenderers == null) {
143 return;
144 }
145
146 ddmFormFieldRenderers.remove(ddmFormFieldRenderer);
147 }
148 }
149
150 }
151
152 }