/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.dynamic.data.mapping.form.field.type.internal; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldRenderer; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTemplateContextContributor; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldType; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldValueAccessor; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldValueRenderer; import com.liferay.dynamic.data.mapping.form.field.type.DefaultDDMFormFieldValueRenderer; import com.liferay.dynamic.data.mapping.form.field.type.internal.util.comparator.DDMFormFieldTypeServiceWrapperDisplayOrderComparator; import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerCustomizerFactory; import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerCustomizerFactory.ServiceWrapper; import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMap; import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMapFactory; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.ListUtil; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Set; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; /** * @author Marcellus Tavares */ @Component(immediate = true) public class DDMFormFieldTypeServicesTrackerImpl implements DDMFormFieldTypeServicesTracker { @Override public DDMFormFieldRenderer getDDMFormFieldRenderer(String name) { return _ddmFormFieldRendererServiceTrackerMap.getService(name); } @Override public DDMFormFieldTemplateContextContributor getDDMFormFieldTemplateContextContributor(String name) { return _ddmFormFieldTemplateContextContributorServiceTrackerMap. getService(name); } @Override public DDMFormFieldType getDDMFormFieldType(String name) { ServiceWrapper<DDMFormFieldType> ddmFormFieldTypeServiceWrapper = _ddmFormFieldTypeServiceTrackerMap.getService(name); if (ddmFormFieldTypeServiceWrapper == null) { if (_log.isDebugEnabled()) { _log.debug( "No DDM form field type registered with name " + name); } return null; } return ddmFormFieldTypeServiceWrapper.getService(); } @Override public Set<String> getDDMFormFieldTypeNames() { return _ddmFormFieldTypeServiceTrackerMap.keySet(); } @Override public Map<String, Object> getDDMFormFieldTypeProperties(String name) { ServiceWrapper<DDMFormFieldType> ddmFormFieldTypeServiceWrapper = _ddmFormFieldTypeServiceTrackerMap.getService(name); if (ddmFormFieldTypeServiceWrapper == null) { if (_log.isDebugEnabled()) { _log.debug( "No DDM form field type registered with name " + name); } return null; } return ddmFormFieldTypeServiceWrapper.getProperties(); } @Override public List<DDMFormFieldType> getDDMFormFieldTypes() { List<DDMFormFieldType> ddmFormFieldTypes = new ArrayList<>(); List<ServiceWrapper<DDMFormFieldType>> ddmFormFieldTypeServiceWrappers = ListUtil.fromCollection( _ddmFormFieldTypeServiceTrackerMap.values()); Collections.sort( ddmFormFieldTypeServiceWrappers, _ddmFormFieldTypeServiceWrapperDisplayOrderComparator); for (ServiceWrapper<DDMFormFieldType> ddmFormFieldTypeServiceWrapper : ddmFormFieldTypeServiceWrappers) { ddmFormFieldTypes.add(ddmFormFieldTypeServiceWrapper.getService()); } return Collections.unmodifiableList(ddmFormFieldTypes); } @Override public <T> DDMFormFieldValueAccessor<T> getDDMFormFieldValueAccessor( String name) { return _ddmFormFieldValueAccessorServiceTrackerMap.getService(name); } @Override public DDMFormFieldValueRenderer getDDMFormFieldValueRenderer(String name) { DDMFormFieldValueRenderer ddmFormFieldValueRenderer = _ddmFormFieldValueRendererServiceTrackerMap.getService(name); if (ddmFormFieldValueRenderer != null) { return ddmFormFieldValueRenderer; } return _defaultDDMFormFieldValueRenderer; } @Activate protected void activate(BundleContext bundleContext) { _ddmFormFieldRendererServiceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap( bundleContext, DDMFormFieldRenderer.class, "ddm.form.field.type.name"); _ddmFormFieldTemplateContextContributorServiceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap( bundleContext, DDMFormFieldTemplateContextContributor.class, "ddm.form.field.type.name"); _ddmFormFieldTypeServiceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap( bundleContext, DDMFormFieldType.class, "ddm.form.field.type.name", ServiceTrackerCustomizerFactory. <DDMFormFieldType>serviceWrapper(bundleContext)); _ddmFormFieldValueAccessorServiceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap( bundleContext, DDMFormFieldValueAccessor.class, "ddm.form.field.type.name"); _ddmFormFieldValueRendererServiceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap( bundleContext, DDMFormFieldValueRenderer.class, "ddm.form.field.type.name"); } @Deactivate protected void deactivate() { _ddmFormFieldRendererServiceTrackerMap.close(); _ddmFormFieldTemplateContextContributorServiceTrackerMap.close(); _ddmFormFieldTypeServiceTrackerMap.close(); _ddmFormFieldValueAccessorServiceTrackerMap.close(); _ddmFormFieldValueRendererServiceTrackerMap.close(); } private static final Log _log = LogFactoryUtil.getLog( DDMFormFieldTypeServicesTrackerImpl.class); private ServiceTrackerMap<String, DDMFormFieldRenderer> _ddmFormFieldRendererServiceTrackerMap; private ServiceTrackerMap<String, DDMFormFieldTemplateContextContributor> _ddmFormFieldTemplateContextContributorServiceTrackerMap; private ServiceTrackerMap<String, ServiceWrapper<DDMFormFieldType>> _ddmFormFieldTypeServiceTrackerMap; private final Comparator<ServiceWrapper<DDMFormFieldType>> _ddmFormFieldTypeServiceWrapperDisplayOrderComparator = new DDMFormFieldTypeServiceWrapperDisplayOrderComparator(); private ServiceTrackerMap<String, DDMFormFieldValueAccessor> _ddmFormFieldValueAccessorServiceTrackerMap; private ServiceTrackerMap<String, DDMFormFieldValueRenderer> _ddmFormFieldValueRendererServiceTrackerMap; private final DefaultDDMFormFieldValueRenderer _defaultDDMFormFieldValueRenderer = new DefaultDDMFormFieldValueRenderer(); }