blob: 4d026a683fbf3a27b9342c70307862fea1d35097 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 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.internal.conflict;
import static com.google.common.base.Preconditions.checkNotNull;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.compare.AttributeChange;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.FeatureMapChange;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.compare.ResourceAttachmentChange;
import org.eclipse.emf.compare.util.CompareSwitch;
import org.eclipse.emf.ecore.EReference;
/**
* Factory for ConflictSearch classes.
*
* @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a>
*/
public class ConflictSearchFactory extends CompareSwitch<AbstractConflictSearch<? extends Diff>> {
/**
* Index of reference changes by their target.
*/
private final ComparisonIndex index;
/**
* The monitor that searches instantiated by this factory must use.
*/
private final Monitor monitor;
/**
* Constructor.
*
* @param comparison
* The comparison
* @param monitor
* The progress monitor
*/
public ConflictSearchFactory(Comparison comparison, Monitor monitor) {
checkNotNull(comparison);
this.monitor = checkNotNull(monitor);
this.index = ComparisonIndex.index(comparison, monitor);
}
@Override
public AbstractConflictSearch<AttributeChange> caseAttributeChange(AttributeChange diff) {
switch (diff.getKind()) {
case ADD:
return new AttributeChangeConflictSearch.Add(diff, index, monitor);
case CHANGE:
return new AttributeChangeConflictSearch.Change(diff, index, monitor);
case DELETE:
return new AttributeChangeConflictSearch.Delete(diff, index, monitor);
case MOVE:
return new AttributeChangeConflictSearch.Move(diff, index, monitor);
default:
throw new IllegalArgumentException();
}
}
@Override
public AbstractConflictSearch<? extends Diff> caseFeatureMapChange(FeatureMapChange diff) {
switch (diff.getKind()) {
case ADD:
return new FeatureMapChangeConflictSearch.Add(diff, index, monitor);
case CHANGE:
return new FeatureMapChangeConflictSearch.Change(diff, index, monitor);
case DELETE:
return new FeatureMapChangeConflictSearch.Delete(diff, index, monitor);
case MOVE:
return new FeatureMapChangeConflictSearch.Move(diff, index, monitor);
default:
throw new IllegalArgumentException();
}
}
@Override
public AbstractConflictSearch<? extends Diff> caseReferenceChange(ReferenceChange diff) {
EReference ref = diff.getReference();
checkNotNull(ref);
if (ref.isContainment()) {
return createContainmentSearch(diff);
} else {
return createNonContaimentSearch(diff);
}
}
/**
* Create a Conflict Search for containment reference change.
*
* @param diff
* The containment {@link ReferenceChange}
* @return A conflict search for the given diff.
*/
private AbstractConflictSearch<? extends Diff> createContainmentSearch(ReferenceChange diff) {
switch (diff.getKind()) {
case ADD:
return new ContainmentRefChangeConflictSearch.Add(diff, index, monitor);
case CHANGE:
return new ContainmentRefChangeConflictSearch.Change(diff, index, monitor);
case DELETE:
return new ContainmentRefChangeConflictSearch.Delete(diff, index, monitor);
case MOVE:
return new ContainmentRefChangeConflictSearch.Move(diff, index, monitor);
default:
throw new IllegalArgumentException();
}
}
/**
* Create a Conflict Search for non-containment reference change.
*
* @param diff
* The non-containment {@link ReferenceChange}
* @return A conflict search for the given diff.
*/
private AbstractConflictSearch<? extends Diff> createNonContaimentSearch(ReferenceChange diff) {
switch (diff.getKind()) {
case ADD:
return new NonContainmentRefChangeConflictSearch.Add(diff, index, monitor);
case CHANGE:
return new NonContainmentRefChangeConflictSearch.Change(diff, index, monitor);
case DELETE:
return new NonContainmentRefChangeConflictSearch.Delete(diff, index, monitor);
case MOVE:
return new NonContainmentRefChangeConflictSearch.Move(diff, index, monitor);
default:
throw new IllegalArgumentException();
}
}
@Override
public AbstractConflictSearch<? extends Diff> caseResourceAttachmentChange(
ResourceAttachmentChange diff) {
switch (diff.getKind()) {
case ADD:
return new ResourceAttachmentChangeConflictSearch.Add(diff, index, monitor);
case CHANGE:
return new ResourceAttachmentChangeConflictSearch.Change(diff, index, monitor);
case DELETE:
return new ResourceAttachmentChangeConflictSearch.Delete(diff, index, monitor);
case MOVE:
return new ResourceAttachmentChangeConflictSearch.Move(diff, index, monitor);
default:
throw new IllegalArgumentException();
}
}
}