/**
* <copyright>
*
* Copyright (c) 2010-2016 Thales Global Services S.A.S.
* 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:
* Thales Global Services S.A.S. - initial API and implementation
*
* </copyright>
*/
package org.eclipse.emf.diffmerge.diffdata.impl;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.diffmerge.api.IDiffPolicy;
import org.eclipse.emf.diffmerge.api.IMapping;
import org.eclipse.emf.diffmerge.api.IMatch;
import org.eclipse.emf.diffmerge.api.IMergePolicy;
import org.eclipse.emf.diffmerge.api.scopes.IEditableModelScope;
import org.eclipse.emf.diffmerge.diffdata.DiffdataPackage;
import org.eclipse.emf.diffmerge.diffdata.EComparison;
import org.eclipse.emf.diffmerge.diffdata.EElementPresence;
import org.eclipse.emf.diffmerge.diffdata.EMatch;
import org.eclipse.emf.diffmerge.impl.helpers.BidirectionalComparisonCopier;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>EElement Presence</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.emf.diffmerge.diffdata.impl.EElementPresenceImpl#getOwnerMatch <em>Owner Match</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class EElementPresenceImpl extends EElementRelativePresenceImpl
implements EElementPresence {
/**
* The cached value of the '{@link #getOwnerMatch() <em>Owner Match</em>}' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getOwnerMatch()
* @generated
* @ordered
*/
protected EMatch ownerMatch;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected EElementPresenceImpl() {
super();
}
/**
* Constructor
* @param comparison_p the non-null comparison to which this difference belongs
* @param match_p the non-null match to which this difference is relative
* @param ownerMatch_p a potentially null match for the owner of the element
* @generated NOT
*/
public EElementPresenceImpl(EComparison comparison_p, EMatch match_p,
EMatch ownerMatch_p) {
super(comparison_p, match_p, match_p.getUncoveredRole().opposite());
ownerMatch = ownerMatch_p;
((IMatch.Editable) elementMatch).addRelatedDifference(this);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return DiffdataPackage.Literals.EELEMENT_PRESENCE;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EMatch getOwnerMatch() {
if (ownerMatch != null && ownerMatch.eIsProxy()) {
InternalEObject oldOwnerMatch = (InternalEObject) ownerMatch;
ownerMatch = (EMatch) eResolveProxy(oldOwnerMatch);
if (ownerMatch != oldOwnerMatch) {
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE,
DiffdataPackage.EELEMENT_PRESENCE__OWNER_MATCH, oldOwnerMatch,
ownerMatch));
}
}
return ownerMatch;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EMatch basicGetOwnerMatch() {
return ownerMatch;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case DiffdataPackage.EELEMENT_PRESENCE__OWNER_MATCH:
if (resolve)
return getOwnerMatch();
return basicGetOwnerMatch();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case DiffdataPackage.EELEMENT_PRESENCE__OWNER_MATCH:
return ownerMatch != null;
}
return super.eIsSet(featureID);
}
/**
* @see org.eclipse.emf.diffmerge.api.diff.IElementPresence#getElement()
* @generated NOT
*/
public EObject getElement() {
return getElementMatch().get(getPresenceRole());
}
/**
* @see org.eclipse.emf.diffmerge.api.diff.IElementRelativeDifference#isUnrelatedToContainmentTree()
* @generated NOT
*/
public boolean isUnrelatedToContainmentTree() {
return false;
}
/**
* @see org.eclipse.emf.diffmerge.api.diff.IElementPresence#isRoot()
* @generated NOT
*/
public boolean isRoot() {
return getOwnerMatch() == null;
}
/**
* @see org.eclipse.emf.diffmerge.diffdata.impl.EElementRelativePresenceImpl#mergeAddition()
* @generated NOT
*/
@Override
protected void mergeAddition() {
IMapping.Editable mapping = getComparison().getMapping();
IMatch eltMatch = getElementMatch();
EObject clone = eltMatch.isPartial() ? mapping.completeMatch(eltMatch)
: eltMatch.get(getAbsenceRole());
boolean addedToScope = false;
boolean actuallyAdded = false;
IMergePolicy mergePolicy = getComparison().getLastMergePolicy();
if (getComparison().getLastMergePolicy().bindPresenceToOwnership(getAbsenceScope())
&& !isRoot()) {
EObject container = getOwnerMatch().get(getAbsenceRole());
if (container != null) {
EReference containment = getPresenceScope()
.getContainment(getElement());
actuallyAdded = getAbsenceScope().add(container, containment, clone);
addedToScope = true; // Even if !actuallyAdded
// Order handling
IDiffPolicy diffPolicy = getComparison().getLastDiffPolicy();
if (diffPolicy != null && actuallyAdded
&& diffPolicy.considerOrdered(containment)) {
// Move added value if required
int index = mergePolicy.getDesiredValuePosition(getComparison(),
getAbsenceRole(), getOwnerMatch(), containment, getElement());
if (index >= 0)
getAbsenceScope().move(container, containment, index, -1);
}
}
// Else container will be created and ownership automatically applied by the copier,
// if containment tree of the scope is consistent with matching
}
if (!addedToScope)
actuallyAdded = getAbsenceScope().add(clone);
if (actuallyAdded)
BidirectionalComparisonCopier.handleIDCopy(
getElement(), getPresenceScope(), clone, getAbsenceScope(), mergePolicy);
}
/**
* @see org.eclipse.emf.diffmerge.diffdata.impl.EElementRelativePresenceImpl#mergeRemoval()
* @generated NOT
*/
@Override
protected void mergeRemoval() {
if (isRoot()
|| getElementMatch().getOwnershipDifference(getPresenceRole()) == null) {
IEditableModelScope presenceScope = getPresenceScope();
EObject element = getElement();
presenceScope.remove(element);
// Delete element
for (EStructuralFeature.Setting setting : getComparison().getMapping()
.getCrossReferences(element, getPresenceRole())) {
presenceScope.remove(setting.getEObject(),
(EReference) setting.getEStructuralFeature(), element);
}
} // Else handled by ownership
}
} //EElementPresenceImpl