| /******************************************************************************* |
| * Copyright (c) 2015 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.diagram.papyrus.internal; |
| |
| import org.eclipse.emf.compare.Diff; |
| import org.eclipse.emf.compare.Match; |
| import org.eclipse.emf.compare.ReferenceChange; |
| import org.eclipse.emf.compare.utils.MatchUtil; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.gmf.runtime.notation.Connector; |
| import org.eclipse.gmf.runtime.notation.NotationPackage; |
| import org.eclipse.uml2.uml.Property; |
| import org.eclipse.uml2.uml.Transition; |
| import org.eclipse.uml2.uml.UMLPackage; |
| |
| /** |
| * Super-class of handlers of this project to mutualize some code. |
| * |
| * @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a> |
| */ |
| public abstract class AbstractPapyrusDiagramDiffHandler implements IDiffHandler { |
| |
| /** |
| * Indicates whether the given {@link Diff} is a change of the reference <code>uml::Property.type</code>. |
| * |
| * @param diff |
| * The diff |
| * @return <code>true</code> if and only if the given diff is a {@link ReferenceChange} that concerns the |
| * <code>uml::TypedElement.type</code> reference, on an Property |
| */ |
| protected boolean isPropertyTypeChange(ReferenceChange diff) { |
| EReference ref = diff.getReference(); |
| return ref == UMLPackage.Literals.TYPED_ELEMENT__TYPE |
| && getOriginMatchObject(diff) instanceof Property; |
| } |
| |
| /** |
| * Indicates whether the given {@link ReferenceChange} is a change of the "source" or "target" EReference |
| * of a uml::Transition. |
| * |
| * @param diff |
| * The diff |
| * @return <code>true</code> if and only if the change is that of a Transition's target or source |
| * reference. |
| */ |
| protected boolean isTransitionReferenceChange(ReferenceChange diff) { |
| EReference ref = diff.getReference(); |
| return (ref == UMLPackage.Literals.TRANSITION__TARGET || ref == UMLPackage.Literals.TRANSITION__SOURCE) |
| && getOriginMatchObject(diff) instanceof Transition; |
| } |
| |
| /** |
| * Indicates whether the given {@link ReferenceChange} is a change of the "source" or "target" EReference |
| * of a notation::Connector. |
| * |
| * @param diff |
| * the ref change |
| * @return <code>true</code> if and only if the change is that of a Connector'target or source reference. |
| */ |
| protected boolean isConnectorReferenceChange(ReferenceChange diff) { |
| EReference ref = diff.getReference(); |
| return (ref == NotationPackage.Literals.EDGE__TARGET || ref == NotationPackage.Literals.EDGE__SOURCE) |
| && getOriginMatchObject(diff) instanceof Connector; |
| } |
| |
| /** |
| * Indicates whether the given {@link ReferenceChange} is a part of a more global ADD or DELETE change. |
| * |
| * @param refChange |
| * The ref change |
| * @return <code>true</code> if and only if the given change is part of an ADD or DELETE. |
| */ |
| protected boolean isContainedInAddOrDelete(ReferenceChange refChange) { |
| EObject eContainer = refChange.getMatch().eContainer(); |
| if (eContainer instanceof Match) { |
| if (MatchUtil.getOriginValue(refChange.getMatch().getComparison(), refChange) == null) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * Provides the EObject of the given diff's match that is on the "origin" side, which is LEFT for 2-way |
| * and ORIGIN for 3-way. |
| * |
| * @param diff |
| * The diff |
| * @return The EObject of the diff's match that is on the LEFT if the diff's comparison is 2-way, and on |
| * the ORIGIN side if the diff's comparison is 3-way. |
| */ |
| protected EObject getOriginMatchObject(Diff diff) { |
| Match match = diff.getMatch(); |
| final EObject result; |
| if (match == null) { |
| result = null; // diff is a ResourceLocationChange, for instance |
| } else { |
| if (match.getOrigin() != null) { |
| result = match.getOrigin(); |
| } else { |
| result = match.getLeft(); |
| } |
| } |
| return result; |
| } |
| |
| } |