/** * 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.model.internal; import gov.redhawk.model.sca.IDataProviderServiceRegistry; import gov.redhawk.model.sca.IScaDataProviderServiceDescriptor; import gov.redhawk.model.sca.ScaModelPlugin; import gov.redhawk.sca.model.preferences.ScaModelPreferenceContants; import java.util.ArrayList; import java.util.Collections; import java.util.List; 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; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; import org.eclipse.core.runtime.preferences.InstanceScope; /** * @since 9.0 */ public enum DataProviderServicesRegistry implements IExtensionChangeHandler, IDataProviderServiceRegistry { INSTANCE; public static final String DATA_PROVIDER_EP_ID = "dataProviderService"; private final List<IScaDataProviderServiceDescriptor> dataProviderServiceDescriptors = new ArrayList<IScaDataProviderServiceDescriptor>(); private final ExtensionTracker tracker; private IPreferenceChangeListener listener = new IPreferenceChangeListener() { @Override public void preferenceChange(PreferenceChangeEvent event) { if (event.getKey().equals(ScaModelPreferenceContants.DISABLED_DATA_PROVIDERS)) { Object obj = event.getNewValue(); if (obj instanceof String) { String value = (String) obj; for (IScaDataProviderServiceDescriptor desc : dataProviderServiceDescriptors) { if (value.contains(desc.getId())) { ((ScaDataProviderServiceDescriptor) desc).setEnabled(false); } else { ((ScaDataProviderServiceDescriptor) desc).setEnabled(true); } } } else { for (IScaDataProviderServiceDescriptor desc : dataProviderServiceDescriptors) { ((ScaDataProviderServiceDescriptor) desc).setEnabled(true); } } } } }; private IEclipsePreferences node; private DataProviderServicesRegistry() { final IExtensionRegistry reg = Platform.getExtensionRegistry(); final IExtensionPoint ep = reg.getExtensionPoint(ScaModelPlugin.ID, DataProviderServicesRegistry.DATA_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); } } node = InstanceScope.INSTANCE.getNode(ScaModelPlugin.ID); node.addPreferenceChangeListener(listener); } @Override public void addExtension(final IExtensionTracker tracker, final IExtension extension) { String disabledDataProviders = Platform.getPreferencesService().getString(ScaModelPlugin.ID, ScaModelPreferenceContants.DISABLED_DATA_PROVIDERS, "", null); for (final IConfigurationElement element : extension.getConfigurationElements()) { final ScaDataProviderServiceDescriptor descriptor = createDescriptor(element, disabledDataProviders); this.dataProviderServiceDescriptors.add(descriptor); tracker.registerObject(extension, descriptor, IExtensionTracker.REF_SOFT); } } private ScaDataProviderServiceDescriptor createDescriptor(IConfigurationElement element, String disabledDataProviders) { ScaDataProviderServiceDescriptor desc = new ScaDataProviderServiceDescriptor(element, disabledDataProviders); return desc; } @Override public void removeExtension(final IExtension extension, final Object[] objects) { for (final Object obj : objects) { if (obj instanceof IScaDataProviderServiceDescriptor) { this.dataProviderServiceDescriptors.remove(obj); } } } public void clearDataProviders() { this.dataProviderServiceDescriptors.clear(); } @Override public List<IScaDataProviderServiceDescriptor> getDataProvidersDescriptors() { return Collections.unmodifiableList(this.dataProviderServiceDescriptors); } public void dispose() { node.removePreferenceChangeListener(listener); } }