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