blob: 1470d4c967c93192641c7f50ff2e5b12ee207f4e [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2019 CEA LIST, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.gitlight.compare.internal;
import java.util.Iterator;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.MatchResource;
import org.eclipse.emf.compare.postprocessor.IPostProcessor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
/**
* Post-processor that causes changes applied to the contents of di-files to be ignored.
* <p>
* This post-processor removes the matches of model elements contained in di-files. Thus, those elements will
* be ignored in the subsequent phases of the comparison.
* </p>
*/
public class IgnoreDiFilePostProcessor implements IPostProcessor {
/** The name of the class that represents the di-file's root container. */
private static final String SASH_WINDOWS_MNGR = "SashWindowsMngr"; //$NON-NLS-1$
/** The file extension of di-files. */
private static final String DI = "di"; //$NON-NLS-1$
/**
* Removes the matches of or within di-files.
* <p>
* By removing the matches of resource matches and element matches of or within di-files, any changes
* within di-files are ignored during the remaining comparison.
* </p>
*
* @param comparison
* The comparison
* @param monitor
* The progress monitor
*/
public void postMatch(Comparison comparison, Monitor monitor) {
if (monitor == null || !monitor.isCanceled()) {
filterSashModelMngrMatches(comparison);
filterDiFileMatchResources(comparison);
}
}
/**
* Removes the di-file {@link MatchResource match resources} of the given <code>comparison</code>.
*
* @param comparison
* The comparison to remove the match resources from.
*/
private void filterDiFileMatchResources(Comparison comparison) {
final EList<MatchResource> matchedResources = comparison.getMatchedResources();
for (Iterator<MatchResource> iterator = matchedResources.iterator(); iterator.hasNext();) {
if (isDiFile(iterator.next())) {
iterator.remove();
}
}
}
/**
* Removes the root matches that match an {@link EObject} of type {@link SashWindowsMngr} in di-files.
*
* @param comparison
* The comparison to remove the {@link SashWindowsMngr} root matches from.
*/
private void filterSashModelMngrMatches(Comparison comparison) {
final EList<Match> matches = comparison.getMatches();
for (Iterator<Match> iterator = matches.iterator(); iterator.hasNext();) {
final EObject eObject = getMatchedEObject(iterator.next());
if (isDiResource(eObject.eResource()) && SASH_WINDOWS_MNGR.equals(eObject.eClass().getName())) {
iterator.remove();
}
}
}
/**
* Specifies whether the given <code>resource</code> is a di-file.
*
* @param resource
* The resource to check.
* @return <code>true</code> if it is a di-file (or null), <code>false</code> otherwise.
*/
private boolean isDiResource(Resource resource) {
return resource == null || DI.equals(resource.getURI().fileExtension());
}
/**
* Returns the {@link EObject} of the given <code>match</code>.
* <p>
* It is either the {@link Match#getLeft() left}, {@link Match#getRight() right}, or
* {@link Match#getOrigin() origin} of the given {@link Match}.
*
* @param match
* The match.
* @return The {@link EObject} of the given <code>match</code>.
*/
private EObject getMatchedEObject(Match match) {
final EObject eObject;
if (match.getLeft() != null) {
eObject = match.getLeft();
} else if (match.getRight() != null) {
eObject = match.getRight();
} else {
eObject = match.getOrigin();
}
return eObject;
}
/**
* Specifies whether the given <code>matchResource</code> concerns a di-file.
*
* @param matchResource
* The {@link MatchResource} to check.
* @return <code>true</code> if <code>matchResource</code> concerns a di-file, <code>false</code>
* otherwise.
*/
private boolean isDiFile(MatchResource matchResource) {
final Resource resource;
if (matchResource.getLeft() != null) {
resource = matchResource.getLeft();
} else if (matchResource.getRight() != null) {
resource = matchResource.getRight();
} else {
resource = matchResource.getOrigin();
}
return isDiResource(resource);
}
/**
* {@inheritDoc}
*/
public void postDiff(Comparison comparison, Monitor monitor) {
// nothing to do
}
/**
* {@inheritDoc}
*/
public void postRequirements(Comparison comparison, Monitor monitor) {
// nothing to do
}
/**
* {@inheritDoc}
*/
public void postEquivalences(Comparison comparison, Monitor monitor) {
// nothing to do
}
/**
* {@inheritDoc}
*/
public void postConflicts(Comparison comparison, Monitor monitor) {
// nothing to do
}
/**
* {@inheritDoc}
*/
public void postComparison(Comparison comparison, Monitor monitor) {
// nothing to do
}
}