blob: d019bf7b44518a177ffd18bf085e8ecbb353d0fb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Obeo 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:
* Obeo - initial API and implementation
* Mathias Schaefer - preferences refactoring
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.tests.framework;
import java.util.Collection;
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.preferences.InstanceScope;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
import org.eclipse.emf.compare.ide.ui.internal.preferences.EMFCompareUIPreferences;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
import org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
/**
* EMFCompare specific statements must extends this class.
*
* @author <a href="mailto:mathieu.cartaud@obeo.fr">Mathieu Cartaud</a>
*/
@SuppressWarnings("restriction")
public abstract class AbstractCompareStatement extends Statement {
/** The class selector for the extension point. */
private static final String EXTENSION_POINT_CLASS_SELECTOR = "impl"; //$NON-NLS-1$
/** The id selector for the extension point. */
private static final String EXTENSION_POINT_ID_SELECTOR = "id"; //$NON-NLS-1$
/** The separator used to build a string of preferences. */
private static final String PREFERENCES_SEPARATOR = ";"; //$NON-NLS-1$
/** Separator used to construct the following IDs. */
private static final String ID_SEPARATOR = "."; //$NON-NLS-1$
/** The id of the diff extension point. */
private static final String DIFF_EXTENSION_POINT_ID = EMFCompareRCPPlugin.PLUGIN_ID + ID_SEPARATOR
+ EMFCompareRCPPlugin.DIFF_ENGINE_PPID;
/** The id of the equivalence extension point. */
private static final String EQ_EXTENSION_POINT_ID = EMFCompareRCPPlugin.PLUGIN_ID + ID_SEPARATOR
+ EMFCompareRCPPlugin.EQUI_ENGINE_PPID;
/** The id of the requirement extension point. */
private static final String REQ_EXTENSION_POINT_ID = EMFCompareRCPPlugin.PLUGIN_ID + ID_SEPARATOR
+ EMFCompareRCPPlugin.REQ_ENGINE_PPID;
/** The id of the conflict extension point. */
private static final String CONFLICT_EXTENSION_POINT_ID = EMFCompareRCPPlugin.PLUGIN_ID + ID_SEPARATOR
+ EMFCompareRCPPlugin.CONFLICT_DETECTOR_PPID;
/** The default disabled match engines. */
private static final List<String> DEFAULT_DISABLED_MATCH_ENGINES = Collections.emptyList();
/** The default diff engine. */
private static final String DEFAULT_DIFF_ENGINE = "org.eclipse.emf.compare.rcp.default.diffEngine"; //$NON-NLS-1$
/** The default eq engine. */
private static final String DEFAULT_EQ_ENGINE = "org.eclipse.emf.compare.rcp.default.equiEngine"; //$NON-NLS-1$
/** The default req engine. */
private static final String DEFAULT_REQ_ENGINE = "org.eclipse.emf.compare.rcp.default.reqEngine"; //$NON-NLS-1$
/** The default conflict detector. */
private static final String DEFAULT_CONFLICT_DETECTOR = "org.eclipse.emf.compare.rcp.fast.conflictDetector"; //$NON-NLS-1$
/** The default disabled post-processors. */
private static final List<String> DEFAULT_DISABLED_POST_PROCESSORS = Collections.emptyList();
/** The test class. */
protected final Object testObject;
/** The test method that will be run. */
protected final FrameworkMethod test;
/** The EMFCompare preferences. */
private final IPreferenceStore rcpPreferenceStore = new ScopedPreferenceStore(InstanceScope.INSTANCE,
EMFCompareRCPPlugin.PLUGIN_ID);
/** The EMFCompare UI preferences. */
private final IPreferenceStore uiPreferenceStore = EMFCompareIDEUIPlugin.getDefault()
.getPreferenceStore();
/** The resolution strategy used for this test. */
private final ResolutionStrategyID resolutionStrategy;
/** The match engines disabled used for this test. */
private final Class<?>[] disabledMatchEngines;
/** The diff engine used for this test. */
private final Class<?> diffEngine;
/** The eq engine used for this test. */
private final Class<?> eqEngine;
/** The req engine used for this test. */
private final Class<?> reqEngine;
/** The conflict detector used for this test. */
private final Class<?> conflictDetector;
/** The post-processors disabled for this test. */
private final Class<?>[] disabledPostProcessors;
/** The default resolution strategy. */
private String defaultResolutionStrategy = "WORKSPACE"; //$NON-NLS-1$
/**
* Constructor for the classic (no Git) comparison statement.
*
* @param testObject
* The test class
* @param test
* The test method
* @param resolutionStrategy
* The resolution strategy used for this test
* @param configuration
* EMFCompare configurations for this test
*/
public AbstractCompareStatement(Object testObject, FrameworkMethod test,
ResolutionStrategyID resolutionStrategy, EMFCompareTestConfiguration configuration) {
this.testObject = testObject;
this.test = test;
this.resolutionStrategy = resolutionStrategy;
this.disabledMatchEngines = configuration.getDisabledMatchEngines();
this.diffEngine = configuration.getDiffEngine();
this.eqEngine = configuration.getEqEngine();
this.reqEngine = configuration.getReqEngine();
this.conflictDetector = configuration.getConflictDetector();
this.disabledPostProcessors = configuration.getDisabledPostProcessors();
setEMFComparePreferencesDefaults();
}
/**
* Normalize the given path (remove first "/" and "./" if necessary).
*
* @param value
* The given path
* @return the normalized path
*/
protected String normalizePath(String value) {
if (value.startsWith("/")) { //$NON-NLS-1$
return value.substring(1, value.length());
} else if (value.startsWith("./")) { //$NON-NLS-1$
return value.substring(2, value.length());
} else {
return value;
}
}
/**
* Set the default values to use for all test-relevant preference settings.
*/
private void setEMFComparePreferencesDefaults() {
uiPreferenceStore.setDefault(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE,
defaultResolutionStrategy);
rcpPreferenceStore.setDefault(EMFComparePreferences.MATCH_ENGINE_DISABLE_ENGINES,
join(DEFAULT_DISABLED_MATCH_ENGINES, PREFERENCES_SEPARATOR));
rcpPreferenceStore.setDefault(EMFComparePreferences.DIFF_ENGINES, DEFAULT_DIFF_ENGINE);
rcpPreferenceStore.setDefault(EMFComparePreferences.EQUI_ENGINES, DEFAULT_EQ_ENGINE);
rcpPreferenceStore.setDefault(EMFComparePreferences.REQ_ENGINES, DEFAULT_REQ_ENGINE);
rcpPreferenceStore.setDefault(EMFComparePreferences.CONFLICTS_DETECTOR, DEFAULT_CONFLICT_DETECTOR);
rcpPreferenceStore.setDefault(EMFComparePreferences.DISABLED_POST_PROCESSOR,
join(DEFAULT_DISABLED_POST_PROCESSORS, PREFERENCES_SEPARATOR));
}
/**
* Restore preferences as if they were unset by the user.
*/
protected void restoreEMFComparePreferences() {
uiPreferenceStore.setToDefault(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE);
rcpPreferenceStore.setToDefault(EMFComparePreferences.MATCH_ENGINE_DISABLE_ENGINES);
rcpPreferenceStore.setToDefault(EMFComparePreferences.DIFF_ENGINES);
rcpPreferenceStore.setToDefault(EMFComparePreferences.EQUI_ENGINES);
rcpPreferenceStore.setToDefault(EMFComparePreferences.REQ_ENGINES);
rcpPreferenceStore.setToDefault(EMFComparePreferences.CONFLICTS_DETECTOR);
rcpPreferenceStore.setToDefault(EMFComparePreferences.DISABLED_POST_PROCESSOR);
}
/**
* Set the preferences required to run the test.
*/
protected void setEMFComparePreferences() {
setResolutionStrategyPreference();
setMatchPreference();
setDiffPreference();
setEqPreference();
setReqPreference();
setConflictPreference();
setPostProcessorPreference();
}
/**
* Set the resolution strategy preference.
*/
private void setResolutionStrategyPreference() {
defaultResolutionStrategy = uiPreferenceStore
.getString(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE);
uiPreferenceStore.setValue(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE,
resolutionStrategy.name());
}
/**
* Set the match engine preference.
*/
private void setMatchPreference() {
List<String> matchEngineNames = Collections.emptyList();
for (Class<?> matchEngine : disabledMatchEngines) {
matchEngineNames.add(matchEngine.getCanonicalName());
}
rcpPreferenceStore.setValue(EMFComparePreferences.MATCH_ENGINE_DISABLE_ENGINES,
join(matchEngineNames, PREFERENCES_SEPARATOR));
}
/**
* Set the diff engine preference.
*/
private void setDiffPreference() {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(DIFF_EXTENSION_POINT_ID);
IExtension[] extensions = extensionPoint.getExtensions();
String diffEngineId = null;
for (IExtension iExtension : extensions) {
for (IConfigurationElement iConfig : iExtension.getConfigurationElements()) {
if (iConfig.getAttribute(EXTENSION_POINT_CLASS_SELECTOR)
.equals(diffEngine.getCanonicalName())) {
diffEngineId = iConfig.getAttribute(EXTENSION_POINT_ID_SELECTOR);
break;
}
}
}
if (diffEngineId != null) {
rcpPreferenceStore.setValue(EMFComparePreferences.DIFF_ENGINES, diffEngineId);
}
}
/**
* Set the equivalence engine preference.
*/
private void setEqPreference() {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(EQ_EXTENSION_POINT_ID);
IExtension[] extensions = extensionPoint.getExtensions();
String eqEngineId = null;
for (IExtension iExtension : extensions) {
for (IConfigurationElement iConfig : iExtension.getConfigurationElements()) {
if (iConfig.getAttribute(EXTENSION_POINT_CLASS_SELECTOR)
.equals(eqEngine.getCanonicalName())) {
eqEngineId = iConfig.getAttribute(EXTENSION_POINT_ID_SELECTOR);
break;
}
}
}
if (eqEngineId != null) {
rcpPreferenceStore.setValue(EMFComparePreferences.EQUI_ENGINES, eqEngineId);
}
}
/**
* Set the requirement engine preference.
*/
private void setReqPreference() {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(REQ_EXTENSION_POINT_ID);
IExtension[] extensions = extensionPoint.getExtensions();
String reqEngineId = null;
for (IExtension iExtension : extensions) {
for (IConfigurationElement iConfig : iExtension.getConfigurationElements()) {
if (iConfig.getAttribute(EXTENSION_POINT_CLASS_SELECTOR)
.equals(reqEngine.getCanonicalName())) {
reqEngineId = iConfig.getAttribute(EXTENSION_POINT_ID_SELECTOR);
break;
}
}
}
if (reqEngineId != null) {
rcpPreferenceStore.setValue(EMFComparePreferences.REQ_ENGINES, reqEngineId);
}
}
/**
* Set the conflict detector preference.
*/
private void setConflictPreference() {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(CONFLICT_EXTENSION_POINT_ID);
IExtension[] extensions = extensionPoint.getExtensions();
String conflictDetectorId = null;
for (IExtension iExtension : extensions) {
for (IConfigurationElement iConfig : iExtension.getConfigurationElements()) {
if (iConfig.getAttribute(EXTENSION_POINT_CLASS_SELECTOR)
.equals(conflictDetector.getCanonicalName())) {
conflictDetectorId = iConfig.getAttribute(EXTENSION_POINT_ID_SELECTOR);
break;
}
}
}
if (conflictDetectorId != null) {
rcpPreferenceStore.setValue(EMFComparePreferences.CONFLICTS_DETECTOR, conflictDetectorId);
}
}
/**
* Set the post-processors preference.
*/
private void setPostProcessorPreference() {
List<String> postProcessorNames = Collections.emptyList();
for (Class<?> postProcessor : disabledPostProcessors) {
postProcessorNames.add(postProcessor.getCanonicalName());
}
rcpPreferenceStore.setValue(EMFComparePreferences.DISABLED_POST_PROCESSOR,
join(postProcessorNames, PREFERENCES_SEPARATOR));
}
/**
* Join a collection of string with the given separator.
*
* @param parts
* The collection of Strings
* @param separator
* The separator
* @return the joined string
*/
private String join(Collection<String> parts, String separator) {
StringBuilder sb = new StringBuilder();
int i = 0;
int lastIndex = parts.size() - 1;
for (String part : parts) {
sb.append(part);
if (i == lastIndex - 1) {
sb.append(separator);
} else if (i != lastIndex) {
sb.append(separator);
}
i++;
}
return sb.toString();
}
}