package com.sap.ide.refactoring.model.move;
import com.sap.ide.refactoring.model.RefactoringModelUtil;
import com.sap.tc.moin.repository.JmiHelper;
import com.sap.tc.moin.repository.mmi.model.Association;
import com.sap.tc.moin.repository.mmi.model.AssociationEnd;
import com.sap.tc.moin.repository.mmi.model.MofClass;
import com.sap.tc.moin.repository.mmi.reflect.RefAssociation;
import com.sap.tc.moin.repository.mmi.reflect.RefObject;
public class MovableElementTargetDefaultImpl implements MovableElementTarget {
/**
* Composite parent where elementToMove shall be moved under
*/
protected final RefObject target;
protected final RefObject elementToMove;
protected final Association association;
public MovableElementTargetDefaultImpl(RefObject target, RefObject elementToMove, Association association) {
this.elementToMove = elementToMove;
this.target = target;
this.association = association;
}
@Override
public String getName() {
return RefactoringModelUtil.getModelElementName(target);
}
@Override
public String getType() {
return RefactoringModelUtil.getModelElementType(target);
}
@Override
public String getRole() {
JmiHelper helper = target.get___Connection().getJmiHelper();
return helper.getCompositeAssociationEnd(association).getName();
}
@Override
public RefObject getWrappedModelElement() {
return this.target;
}
@Override
public void movetoHere() {
removeLinkFromCompositeParent(elementToMove);
addCompositeLinkBetween(target, elementToMove, association);
}
protected void removeLinkFromCompositeParent(RefObject child) {
JmiHelper helper = child.get___Connection().getJmiHelper();
RefObject parent = (RefObject) child.refImmediateComposite();
if (parent == null) {
return;
}
for (Association assoc : helper.getCompositeAssociations((MofClass) parent.refMetaObject(), (MofClass) child.refMetaObject())) {
RefAssociation refAssoc = helper.getRefAssociationForAssociation(assoc);
AssociationEnd compAssocEnd = helper.getCompositeAssociationEnd(assoc);
if (helper.isFirstAssociationEnd(assoc, compAssocEnd) && refAssoc.refLinkExists(parent, child)) {
refAssoc.refRemoveLink(parent, child);
} else if (helper.isFirstAssociationEnd(assoc, compAssocEnd.otherEnd()) && refAssoc.refLinkExists(child, parent)) {
refAssoc.refRemoveLink(child, parent);
}
}
}
protected void addCompositeLinkBetween(RefObject target, RefObject elementToMove, Association assoc) {
JmiHelper helper = target.get___Connection().getJmiHelper();
RefAssociation refAssoc = helper.getRefAssociationForAssociation(assoc);
AssociationEnd compAssocEnd = helper.getCompositeAssociationEnd(assoc);
if (helper.isFirstAssociationEnd(assoc, compAssocEnd)) {
refAssoc.refAddLink(target, elementToMove);
} else if (helper.isFirstAssociationEnd(assoc, compAssocEnd.otherEnd())) {
refAssoc.refAddLink(elementToMove, target);
}
}
@Override
public String toString() {
return "Target: " + getName() + " (" + getType() + ")" + " as " + getRole();
}
}