All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.dynamic.data.mapping.render.impl.DDMFormFieldRendererRegistryImpl Maven / Gradle / Ivy

/**
 * 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.render.impl;

import com.liferay.dynamic.data.mapping.render.DDMFormFieldRenderer;
import com.liferay.dynamic.data.mapping.render.DDMFormFieldRendererRegistry;
import com.liferay.osgi.util.ServiceTrackerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;

/**
 * @author Pablo Carvalho
 */
public class DDMFormFieldRendererRegistryImpl
	implements DDMFormFieldRendererRegistry {

	public DDMFormFieldRendererRegistryImpl() {
		Class clazz = getClass();

		Bundle bundle = FrameworkUtil.getBundle(clazz);

		_bundleContext = bundle.getBundleContext();

		_serviceTracker = ServiceTrackerFactory.open(
			_bundleContext,
			"(&(objectClass=" + DDMFormFieldRenderer.class.getName() +
				")(!(objectClass=" + clazz.getName() + ")))",
			new DDMFormFieldRendererServiceTrackerCustomizer());
	}

	@Override
	public DDMFormFieldRenderer getDDMFormFieldRenderer(
		String ddmFormFieldType) {

		List ddmFormFieldRenders =
			_ddmFormFieldRenderersMap.get(ddmFormFieldType);

		if ((ddmFormFieldRenders == null) || ddmFormFieldRenders.isEmpty()) {
			return null;
		}

		return ddmFormFieldRenders.get(ddmFormFieldRenders.size() - 1);
	}

	public void setDefaultDDMFormFieldRenderer(
		DDMFormFieldRenderer ddmFormFieldRenderer) {

		ServiceRegistration serviceRegistration =
			_bundleContext.registerService(
				DDMFormFieldRenderer.class, ddmFormFieldRenderer, null);

		_serviceRegistrations.put(ddmFormFieldRenderer, serviceRegistration);
	}

	private final BundleContext _bundleContext;
	private final Map>
		_ddmFormFieldRenderersMap = new ConcurrentHashMap<>();
	private final
		Map>
			_serviceRegistrations = new ConcurrentHashMap<>();
	private final ServiceTracker
		_serviceTracker;

	private class DDMFormFieldRendererServiceTrackerCustomizer
		implements
			ServiceTrackerCustomizer
				 {

		@Override
		public DDMFormFieldRenderer addingService(
			ServiceReference serviceReference) {

			DDMFormFieldRenderer ddmFormFieldRenderer =
				_bundleContext.getService(serviceReference);

			for (String supportedDDMFormFieldType :
					ddmFormFieldRenderer.getSupportedDDMFormFieldTypes()) {

				List ddmFormFieldRenderers =
					_ddmFormFieldRenderersMap.get(supportedDDMFormFieldType);

				if (ddmFormFieldRenderers == null) {
					ddmFormFieldRenderers = new ArrayList<>();

					_ddmFormFieldRenderersMap.put(
						supportedDDMFormFieldType, ddmFormFieldRenderers);
				}

				ddmFormFieldRenderers.add(ddmFormFieldRenderer);
			}

			return ddmFormFieldRenderer;
		}

		@Override
		public void modifiedService(
			ServiceReference serviceReference,
			DDMFormFieldRenderer ddmFormFieldRenderer) {
		}

		@Override
		public void removedService(
			ServiceReference serviceReference,
			DDMFormFieldRenderer ddmFormFieldRenderer) {

			_bundleContext.ungetService(serviceReference);

			for (String supportedDDMFormFieldType :
					ddmFormFieldRenderer.getSupportedDDMFormFieldTypes()) {

				List ddmFormFieldRenderers =
					_ddmFormFieldRenderersMap.get(supportedDDMFormFieldType);

				if (ddmFormFieldRenderers == null) {
					return;
				}

				ddmFormFieldRenderers.remove(ddmFormFieldRenderer);
			}
		}

	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy