/******************************************************************************* * Copyright (c) 2013, 2014 Obeo. * 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 * * Contributors: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.internal.logical.resolver.registry; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IStorage; import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin; import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.ThreadedModelResolver; import org.eclipse.emf.compare.ide.ui.internal.preferences.EMFCompareUIPreferences; import org.eclipse.emf.compare.ide.ui.logical.IModelResolver; import org.eclipse.jface.preference.IPreferenceStore; /** * This registry implements its own strategy to define the "best" resolver to use. * * @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a> */ public final class ModelResolverRegistry { /** Keeps track of the extensions providing model resolvers. */ private final Map<String, ModelResolverDescriptor> registeredDescriptors; /** * The threaded model resolver is special in that we use it when resolving is disabled. This will keep a * reference to it. */ private ThreadedModelResolver defaultResolver; /** * Initializes our registry. * * @param preferenceStore * Preference store this can query for resolver-related information. */ public ModelResolverRegistry() { this.registeredDescriptors = new LinkedHashMap<String, ModelResolverDescriptor>(); } /** * Returns a view of the descriptors registered in this registry. * * @return A view of the descriptors registered in this registry. */ public List<ModelResolverDescriptor> getRegisteredDescriptors() { return new ArrayList<ModelResolverDescriptor>(registeredDescriptors.values()); } /** * Returns a {@link IModelResolver} that handles the given IStorage. * <p> * This will iterate over all the registered resolvers, selecting the highest-ranking resolver that can * resolve the target models. * </p> * * @param sourceStorage * Source of the comparison * @return a {@link IModelResolver} that is able to handle the IStorage. */ public IModelResolver getBestResolverFor(IStorage sourceStorage) { if (!isEnabled()) { return defaultResolver; } ModelResolverDescriptor resolver = null; for (ModelResolverDescriptor candidate : registeredDescriptors.values()) { if (resolver == null || resolver.getRanking() < candidate.getRanking()) { if (candidate.getModelResolver().canResolve(sourceStorage)) { resolver = candidate; } } } if (resolver != null) { return resolver.getModelResolver(); } return defaultResolver; } /** * This can be used to check whether model resolution is currently enabled. * * @return <code>true</code> if the model resolution is enabled, <code>false</code> otherwise. */ public boolean isEnabled() { final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore(); return !store.getBoolean(EMFCompareUIPreferences.DISABLE_RESOLVERS_PREFERENCE); } /** * Registers a new resolver within this registry instance. * * @param key * Identifier of this resolver. * @param descriptor * The resolver to register. */ void addResolver(String key, ModelResolverDescriptor descriptor) { if (ThreadedModelResolver.class.getName().equals(key)) { defaultResolver = (ThreadedModelResolver)descriptor.getModelResolver(); } registeredDescriptors.put(key, descriptor); } /** * Removes the resolver identified by <code>key</code> from this registry. * * @param key * Identifier of the resolver we are to remove from this registry. * @return The removed resolver, if any. */ ModelResolverDescriptor removeResolver(String key) { final ModelResolverDescriptor descriptor = registeredDescriptors.remove(key); if (descriptor != null) { descriptor.dispose(); } return descriptor; } /** Clears out all registered resolvers from this registry. */ public void clear() { final Iterator<ModelResolverDescriptor> descriptors = registeredDescriptors.values().iterator(); while (descriptors.hasNext()) { descriptors.next().dispose(); descriptors.remove(); } } }