001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
030     * @author Marcellus Tavares
031     */
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    }