/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * All rights reserved. This program and the accompanying materials are made available under * the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html. * */ package gov.redhawk.sca.properties; import gov.redhawk.sca.ScaPlugin; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker; import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler; import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; import org.eclipse.core.runtime.dynamichelpers.IFilter; /** * @since 5.0 */ public enum PropertiesProviderRegistry implements IExtensionChangeHandler, IPropertiesProviderRegistry { INSTANCE; public static final String PROPERTIES_PROVIDER_EP_ID = "propertiesProvider"; private final List<IPropertiesProviderDescriptor> propertiesProviderDescriptors = new ArrayList<IPropertiesProviderDescriptor>(); private final List<IPropertiesProvider> propertiesProviders = new ArrayList<IPropertiesProvider>(); private final Map<IPropertiesProvider, String> nameMap = new HashMap<IPropertiesProvider, String>(); private final ExtensionTracker tracker; private PropertiesProviderRegistry() { final IExtensionRegistry reg = Platform.getExtensionRegistry(); final IExtensionPoint ep = reg.getExtensionPoint(ScaPlugin.PLUGIN_ID, PropertiesProviderRegistry.PROPERTIES_PROVIDER_EP_ID); this.tracker = new ExtensionTracker(reg); if (ep != null) { final IFilter filter = ExtensionTracker.createExtensionPointFilter(ep); this.tracker.registerHandler(this, filter); final IExtension[] extensions = ep.getExtensions(); for (final IExtension extension : extensions) { addExtension(this.tracker, extension); } } } @Override public void addExtension(final IExtensionTracker tracker, final IExtension extension) { for (final IConfigurationElement element : extension.getConfigurationElements()) { final IPropertiesProviderDescriptor descriptor = new PropertiesProviderDescriptor(element); this.propertiesProviderDescriptors.add(descriptor); tracker.registerObject(extension, descriptor, IExtensionTracker.REF_SOFT); } } @Override public void removeExtension(final IExtension extension, final Object[] objects) { for (final Object obj : objects) { if (obj instanceof IPropertiesProviderDescriptor) { this.propertiesProviderDescriptors.remove(obj); } } } public void clearPropertiesProviders() { this.propertiesProviderDescriptors.clear(); } @Override public List<IPropertiesProviderDescriptor> getPropertiesProvidersDescriptors() { return Collections.unmodifiableList(this.propertiesProviderDescriptors); } /** * {@inheritDoc} */ @Override public List<IPropertiesProvider> getPropertiesProviders() { this.propertiesProviders.clear(); this.nameMap.clear(); for (IPropertiesProviderDescriptor descriptor : this.propertiesProviderDescriptors) { this.propertiesProviders.add(descriptor.getProvider()); this.nameMap.put(descriptor.getProvider(), descriptor.getName()); } return this.propertiesProviders; } /** * {@inheritDoc} */ @Override public String getName(IPropertiesProvider provider) { return this.nameMap.get(provider); } }