blob: 1ae18bbf090640f3ea7c8bd582eeea8ee5cac4f5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 EclipseSource Muenchen GmbH and others.
* 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:
* Stefan Dirix - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.customization;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.adapterfactory.context.IContextTester;
import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemContentProvider;
import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemProvider;
import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IOptionalProvider;
/**
* The registry responsible for managing the content merge viewer customizations.
*
* @author Stefan Dirix <sdirix@eclipsesource.com>
*/
public class ContentMergeViewerCustomizationRegistry {
/** Keeps track of the extensions providing {@link IMergeViewerItemProvider}s. */
private final Map<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider>> registeredDescriptors;
/** Keeps track of the extensions providing {@link IMergeViewerItemContentProvider}s. */
private final Map<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider>> registeredTreeDescriptors;
/**
* Constructs and initialized this registry.
*/
public ContentMergeViewerCustomizationRegistry() {
registeredDescriptors = new LinkedHashMap<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider>>();
registeredTreeDescriptors = new LinkedHashMap<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider>>();
}
/**
* Adds the given {@link ContentMergeViewerCustomizationDescriptor} to this registry, using the given
* {@code className} as the identifier.
*
* @param className
* The identifier for the given {@link ContentMergeViewerCustomizationDescriptor}.
* @param descriptor
* The {@link ContentMergeViewerCustomizationDescriptor} which is to be added to this registry.
*/
public void addCustomization(String className,
ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider> descriptor) {
registeredDescriptors.put(className, descriptor);
}
/**
* Adds the given {@link ContentMergeViewerCustomizationDescriptor} to this registry, using the given
* {@code className} as the identifier.
*
* @param className
* The identifier for the given {@link ContentMergeViewerCustomizationDescriptor}.
* @param descriptor
* The {@link ContentMergeViewerCustomizationDescriptor} which is to be added to this registry.
*/
public void addTreeCustomization(String className,
ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider> descriptor) {
registeredTreeDescriptors.put(className, descriptor);
}
/**
* Removes the {@link ContentMergeViewerCustomizationDescriptor} and its managed
* {@link IDependencyProvider} identified by the given {@code className} from this registry.
*
* @param className
* Identifier of the provider we are to remove from this registry.
*/
public void removeDescriptor(String className) {
registeredDescriptors.remove(className);
registeredTreeDescriptors.remove(className);
}
/** Clears out all registered listeners from this registry. */
public void clear() {
registeredDescriptors.clear();
registeredTreeDescriptors.clear();
}
private <T extends IOptionalProvider> T getBestFittingProvider(
Collection<ContentMergeViewerCustomizationDescriptor<T>> descriptors, Comparison comparison,
Object object) {
ContentMergeViewerCustomizationDescriptor<T> bestDescriptor = null;
final Map<Object, Object> context = createContext(comparison);
for (ContentMergeViewerCustomizationDescriptor<T> descriptor : descriptors) {
IContextTester contextTester = descriptor.getContextTester();
// check context
if (contextTester != null && !contextTester.apply(context)) {
continue;
}
// check ranking
if (bestDescriptor != null && bestDescriptor.getRanking() > descriptor.getRanking()) {
continue;
}
// check provider
if (descriptor.getProvider().canHandle(object)) {
bestDescriptor = descriptor;
}
}
if (bestDescriptor != null) {
return bestDescriptor.getProvider();
}
return null;
}
/**
* Creates the context for the {@link IContextTester}s.
*
* @param comparison
* the {@link Comparison}.
* @return the created context.
*/
private Map<Object, Object> createContext(Comparison comparison) {
final Map<Object, Object> context = new HashMap<Object, Object>();
context.put(IContextTester.CTX_COMPARISON, comparison);
return context;
}
/**
* Returns the best fitting {@link IMergeViewerItemProvider}.
*
* @param comparison
* the {@link Comparison} is used to check the context.
* @param object
* the {@link Object} for which the {@link IMergeViewerItemProvider} is responsible.
* @return the determined {@link IMergeViewerItemProvider} if one exists, {@code null} otherwise.
*/
public IMergeViewerItemProvider getBestFittingMergeViewerItemProvider(Comparison comparison,
Object object) {
return getBestFittingProvider(registeredDescriptors.values(), comparison, object);
}
/**
* Returns the best fitting {@link IMergeViewerItemContentProvider}.
*
* @param comparison
* the {@link Comparison} is used to check the context.
* @param object
* the {@link Object} for which the {@link IMergeViewerItemContentProvider} is responsible.
* @return the determined {@link IMergeViewerItemContentProvider} if one exists, {@code null} otherwise.
*/
public IMergeViewerItemContentProvider getBestFittingMergeViewerItemContentProvider(Comparison comparison,
Object object) {
return getBestFittingProvider(registeredTreeDescriptors.values(), comparison, object);
}
}