/* * Copyright (c) 2016 wetransform GmbH * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * wetransform GmbH <http://www.wetransform.to> */ package eu.esdihumboldt.hale.ui.io.config; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.IConfigurationElement; import de.fhg.igd.eclipse.util.extension.AbstractConfigurationFactory; import de.fhg.igd.eclipse.util.extension.AbstractExtension; import de.fhg.igd.eclipse.util.extension.ExtensionObjectFactoryCollection; import de.fhg.igd.eclipse.util.extension.FactoryFilter; import de.fhg.igd.slf4jplus.ALogger; import de.fhg.igd.slf4jplus.ALoggerFactory; import eu.esdihumboldt.hale.common.core.io.extension.IOProviderDescriptor; /** * Extension for I/O provider configuration dialogs. * * @author Florian Esser */ public class ConfigurationDialogExtension extends AbstractExtension<AbstractConfigurationDialog<?>, ConfigurationDialogFactory> { private static final ALogger log = ALoggerFactory.getLogger(ConfigurationDialogExtension.class); /** * Extension point ID */ public static final String EXTENSION_POINT_ID = "eu.esdihumboldt.hale.ui.io.config"; private static ConfigurationDialogExtension instance; /** * Default constructor */ public ConfigurationDialogExtension() { super(EXTENSION_POINT_ID); } /** * Get the configuration page extension instance * * @return the extension instance */ public static ConfigurationDialogExtension getInstance() { if (instance == null) { instance = new ConfigurationDialogExtension(); } return instance; } /** * @see AbstractExtension#createFactory(IConfigurationElement) */ @Override protected ConfigurationDialogFactory createFactory(IConfigurationElement conf) throws Exception { if (conf.getName().equals("configDialog")) { return new ConfigurationDialogFactoryImpl(conf); } else { return null; } } /** * Get the configuration dialog registered for the given I/O provider * descriptor. * * @param descriptor the provider descriptor * @return the configuration dialog where the corresponding provider * identifier is mapped to the configuration dialog, one page (the * same instance) might be mapped for multiple identifiers */ public ConfigurationDialogFactory getConfigurationDialog( final IOProviderDescriptor descriptor) { List<ConfigurationDialogFactory> factories = getFactories( new FactoryFilter<AbstractConfigurationDialog<?>, ConfigurationDialogFactory>() { @Override public boolean acceptFactory(ConfigurationDialogFactory factory) { return factory.getSupportedProviderIDs() .contains(descriptor.getIdentifier()); } @Override public boolean acceptCollection( ExtensionObjectFactoryCollection<AbstractConfigurationDialog<?>, ConfigurationDialogFactory> collection) { return false; } }); if (factories.isEmpty()) { return null; } else if (factories.size() > 1) { log.warn("Multiple configuration dialogs for provider {}. Using first one.", descriptor.getIdentifier()); } return factories.get(0); } /** * Factory for {@link AbstractConfigurationDialog}s based on an * {@link IConfigurationElement} */ private static class ConfigurationDialogFactoryImpl extends AbstractConfigurationFactory<AbstractConfigurationDialog<?>> implements ConfigurationDialogFactory { /** * Create a factory based on the given configuration * * @param conf the configuration element */ protected ConfigurationDialogFactoryImpl(IConfigurationElement conf) { super(conf, "class"); } @Override public void dispose(AbstractConfigurationDialog<?> instance) { // nothing to do } @Override public String getIdentifier() { return conf.getAttribute("class"); } @Override public String getDisplayName() { return getIdentifier(); } @Override public Set<String> getSupportedProviderIDs() { IConfigurationElement[] children = conf.getChildren("provider"); if (children != null) { Set<String> result = new HashSet<String>(); for (IConfigurationElement child : children) { result.add(child.getAttribute("ref")); } return result; } else { return Collections.emptySet(); } } } }