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.ServiceTracker;
022 import com.liferay.registry.ServiceTrackerCustomizer;
023
024 import java.util.ArrayList;
025 import java.util.HashMap;
026 import java.util.List;
027 import java.util.Map;
028
029
032 public class DDMFormFieldValueRendererRegistryImpl
033 implements DDMFormFieldValueRendererRegistry {
034
035 public DDMFormFieldValueRendererRegistryImpl() {
036 Registry registry = RegistryUtil.getRegistry();
037
038 Class<?> clazz = getClass();
039
040 Filter filter = registry.getFilter(
041 "(&(objectClass=" + DDMFormFieldValueRenderer.class.getName() +
042 ")(!(objectClass=" + clazz.getName() + ")))");
043
044 _serviceTracker = registry.trackServices(
045 filter, new DDMFormFieldValueRendererServiceTrackerCustomizer());
046
047 _serviceTracker.open();
048 }
049
050 @Override
051 public DDMFormFieldValueRenderer getDDMFormFieldValueRenderer(
052 String ddmFormFieldType) {
053
054 List<DDMFormFieldValueRenderer> ddmFormFieldValueRenderers =
055 _ddmFormFieldValueRenderersMap.get(ddmFormFieldType);
056
057 if ((ddmFormFieldValueRenderers == null) ||
058 ddmFormFieldValueRenderers.isEmpty()) {
059
060 return null;
061 }
062
063 return ddmFormFieldValueRenderers.get(
064 ddmFormFieldValueRenderers.size() - 1);
065 }
066
067 public void setDefaultDDMFormFieldValueRenderers(
068 List<DDMFormFieldValueRenderer> ddmFormFieldValueRenderers) {
069
070 Registry registry = RegistryUtil.getRegistry();
071
072 for (DDMFormFieldValueRenderer ddmFormFieldValueRenderer :
073 ddmFormFieldValueRenderers) {
074
075 registry.registerService(
076 DDMFormFieldValueRenderer.class, ddmFormFieldValueRenderer);
077 }
078 }
079
080 private final Map<String, List<DDMFormFieldValueRenderer>>
081 _ddmFormFieldValueRenderersMap = new HashMap<>();
082 private final
083 ServiceTracker<DDMFormFieldValueRenderer, DDMFormFieldValueRenderer>
084 _serviceTracker;
085
086 private class DDMFormFieldValueRendererServiceTrackerCustomizer
087 implements
088 ServiceTrackerCustomizer
089 <DDMFormFieldValueRenderer, DDMFormFieldValueRenderer> {
090
091 @Override
092 public DDMFormFieldValueRenderer addingService(
093 ServiceReference<DDMFormFieldValueRenderer> serviceReference) {
094
095 Registry registry = RegistryUtil.getRegistry();
096
097 DDMFormFieldValueRenderer ddmFormFieldValueRenderer =
098 registry.getService(serviceReference);
099
100 String supportedDDMFormFieldType =
101 ddmFormFieldValueRenderer.getSupportedDDMFormFieldType();
102
103 List<DDMFormFieldValueRenderer> ddmFormFieldValueRenderers =
104 _ddmFormFieldValueRenderersMap.get(supportedDDMFormFieldType);
105
106 if (ddmFormFieldValueRenderers == null) {
107 ddmFormFieldValueRenderers = new ArrayList<>();
108
109 _ddmFormFieldValueRenderersMap.put(
110 supportedDDMFormFieldType, ddmFormFieldValueRenderers);
111 }
112
113 ddmFormFieldValueRenderers.add(ddmFormFieldValueRenderer);
114
115 return ddmFormFieldValueRenderer;
116 }
117
118 @Override
119 public void modifiedService(
120 ServiceReference<DDMFormFieldValueRenderer> serviceReference,
121 DDMFormFieldValueRenderer ddmFormFieldValueRenderer) {
122 }
123
124 @Override
125 public void removedService(
126 ServiceReference<DDMFormFieldValueRenderer> serviceReference,
127 DDMFormFieldValueRenderer ddmFormFieldValueRenderer) {
128
129 Registry registry = RegistryUtil.getRegistry();
130
131 registry.ungetService(serviceReference);
132
133 String supportedDDMFormFieldType =
134 ddmFormFieldValueRenderer.getSupportedDDMFormFieldType();
135
136 List<DDMFormFieldValueRenderer> ddmFormFieldValueRenderers =
137 _ddmFormFieldValueRenderersMap.get(supportedDDMFormFieldType);
138
139 if (ddmFormFieldValueRenderers == null) {
140 return;
141 }
142
143 ddmFormFieldValueRenderers.remove(ddmFormFieldValueRenderer);
144 }
145
146 }
147
148 }