/***************************************************************************** * Copyright (c) 2006-2013, Cloudsmith Inc. * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the copyright holder * listed above, as the Initial Contributor under such license. The text of * such license is available at www.eclipse.org. *****************************************************************************/ package org.eclipse.buckminster.core.resolver; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import org.eclipse.buckminster.core.CorePlugin; import org.eclipse.buckminster.core.Messages; import org.eclipse.buckminster.runtime.BuckminsterPreferences; import org.eclipse.buckminster.runtime.IBuckminsterPreferenceConstants; import org.eclipse.buckminster.runtime.Logger; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; import org.eclipse.osgi.util.NLS; /** * The maintainer of all component query resolver factories and their sort order * * @author Thomas Hallgren */ public class ResolverFactoryMaintainer implements IPreferenceChangeListener { public static final String QUERY_RESOLVERS_POINT = CorePlugin.CORE_NAMESPACE + ".queryResolvers"; //$NON-NLS-1$ static final String FACTORY_ELEM = "factory"; //$NON-NLS-1$ private static final ResolverFactoryMaintainer instance; static { instance = new ResolverFactoryMaintainer(); BuckminsterPreferences.addListener(instance); } public static ResolverFactoryMaintainer getInstance() { return instance; } public static String[] getRegisterFactoryIDs() { IConfigurationElement[] elems = Platform.getExtensionRegistry().getConfigurationElementsFor(ResolverFactoryMaintainer.QUERY_RESOLVERS_POINT); int idx = elems.length; String[] factoryIDs = new String[idx]; while (--idx >= 0) factoryIDs[idx] = elems[idx].getAttribute("id"); //$NON-NLS-1$ return factoryIDs; } private static IResolverFactory[] createFactoriesByExtension() { Logger logger = CorePlugin.getLogger(); IConfigurationElement[] elems = Platform.getExtensionRegistry().getConfigurationElementsFor(ResolverFactoryMaintainer.QUERY_RESOLVERS_POINT); ArrayList<IResolverFactory> factories = new ArrayList<IResolverFactory>(elems.length); for (IConfigurationElement elem : elems) { try { IResolverFactory factory = (IResolverFactory) elem.createExecutableExtension(ResolverFactoryMaintainer.FACTORY_ELEM); factories.add(factory); } catch (CoreException e) { logger.error(e, NLS.bind(Messages.Unable_to_instantiate_Query_Resolver_Factory_0, elem.getAttribute("id"))); //$NON-NLS-1$ } } return factories.toArray(new IResolverFactory[factories.size()]); } private IResolverFactory[] resolverFactories; public IResolverFactory[] getActiveResolverFactories() { IResolverFactory[] allFactories = getResolverFactories(); HashMap<String, IResolverFactory> factoriesById = new HashMap<String, IResolverFactory>(); for (IResolverFactory factory : allFactories) factoriesById.put(factory.getId(), factory); String[] sortOrder = BuckminsterPreferences.getQueryResolverSortOrder(); int numFactories = sortOrder.length; ArrayList<IResolverFactory> factories = new ArrayList<IResolverFactory>(numFactories); for (String factoryName : sortOrder) { IResolverFactory factory = factoriesById.remove(factoryName); if (factory != null) factories.add(factory); } return factories.toArray(new IResolverFactory[factories.size()]); } public synchronized IResolverFactory[] getResolverFactories() { if (resolverFactories == null) { IResolverFactory[] fcs = createFactoriesByExtension(); resolverFactories = fcs; if (!BuckminsterPreferences.isCustomQuerySortOrder()) { setDefaultResolutionOrder(); resolverFactories = fcs; // Restore since they are cleared by // the pref change } } return resolverFactories; } @Override public synchronized void preferenceChange(PreferenceChangeEvent event) { if (IBuckminsterPreferenceConstants.QUERY_RESOLVER_SORT_ORDER.equals(event.getKey())) { resolverFactories = null; } } public void setDefaultResolutionOrder() { Map<Integer, String> activeFactories = new TreeMap<Integer, String>(); for (IResolverFactory factory : getResolverFactories()) { int prio = factory.getResolutionPriority(); if (prio >= 0) activeFactories.put(new Integer(prio), factory.getId()); } BuckminsterPreferences.setQueryResolverSortOrder(activeFactories.values().toArray(new String[activeFactories.size()])); BuckminsterPreferences.setCustomQueryResolverSortOrder(false); } public synchronized void setResolverFactories(IResolverFactory[] resolverFactories) { this.resolverFactories = resolverFactories; } }