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 = new HashMap<>();
080 private final ServiceRegistrationMap<DDMFormFieldRenderer>
081 _serviceRegistrations = new ServiceRegistrationMap<>();
082 private final ServiceTracker<DDMFormFieldRenderer, DDMFormFieldRenderer>
083 _serviceTracker;
084
085 private class DDMFormFieldRendererServiceTrackerCustomizer
086 implements
087 ServiceTrackerCustomizer
088 <DDMFormFieldRenderer, DDMFormFieldRenderer> {
089
090 @Override
091 public DDMFormFieldRenderer addingService(
092 ServiceReference<DDMFormFieldRenderer> serviceReference) {
093
094 Registry registry = RegistryUtil.getRegistry();
095
096 DDMFormFieldRenderer ddmFormFieldRenderer = registry.getService(
097 serviceReference);
098
099 for (String supportedDDMFormFieldType :
100 ddmFormFieldRenderer.getSupportedDDMFormFieldTypes()) {
101
102 List<DDMFormFieldRenderer> ddmFormFieldRenderers =
103 _ddmFormFieldRenderersMap.get(supportedDDMFormFieldType);
104
105 if (ddmFormFieldRenderers == null) {
106 ddmFormFieldRenderers = new ArrayList<>();
107
108 _ddmFormFieldRenderersMap.put(
109 supportedDDMFormFieldType, ddmFormFieldRenderers);
110 }
111
112 ddmFormFieldRenderers.add(ddmFormFieldRenderer);
113 }
114
115 return ddmFormFieldRenderer;
116 }
117
118 @Override
119 public void modifiedService(
120 ServiceReference<DDMFormFieldRenderer> serviceReference,
121 DDMFormFieldRenderer ddmFormFieldRenderer) {
122 }
123
124 @Override
125 public void removedService(
126 ServiceReference<DDMFormFieldRenderer> serviceReference,
127 DDMFormFieldRenderer ddmFormFieldRenderer) {
128
129 Registry registry = RegistryUtil.getRegistry();
130
131 registry.ungetService(serviceReference);
132
133 for (String supportedDDMFormFieldType :
134 ddmFormFieldRenderer.getSupportedDDMFormFieldTypes()) {
135
136 List<DDMFormFieldRenderer> ddmFormFieldRenderers =
137 _ddmFormFieldRenderersMap.get(supportedDDMFormFieldType);
138
139 if (ddmFormFieldRenderers == null) {
140 return;
141 }
142
143 ddmFormFieldRenderers.remove(ddmFormFieldRenderer);
144 }
145 }
146
147 }
148
149 }