| /** |
| * <copyright> |
| * |
| * Copyright (c) 2013, 2018 Willink Transformations and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * E.D.Willink - Initial API and implementation |
| * |
| * </copyright> |
| */ |
| package org.eclipse.qvtd.pivot.qvtschedule.impl; |
| |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.common.notify.NotificationChain; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.InternalEObject; |
| import org.eclipse.emf.ecore.impl.ENotificationImpl; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.jdt.annotation.NonNull; |
| import org.eclipse.jdt.annotation.Nullable; |
| import org.eclipse.ocl.pivot.internal.ElementImpl; |
| import org.eclipse.ocl.pivot.internal.NamedElementImpl; |
| import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphStringBuilder; |
| import org.eclipse.qvtd.pivot.qvtbase.graphs.ToGraphHelper; |
| import org.eclipse.qvtd.pivot.qvtschedule.Cluster; |
| import org.eclipse.qvtd.pivot.qvtschedule.Edge; |
| import org.eclipse.qvtd.pivot.qvtschedule.Node; |
| import org.eclipse.qvtd.pivot.qvtschedule.QVTscheduleFactory; |
| import org.eclipse.qvtd.pivot.qvtschedule.QVTschedulePackage; |
| import org.eclipse.qvtd.pivot.qvtschedule.Region; |
| import org.eclipse.qvtd.pivot.qvtschedule.Role; |
| import org.eclipse.qvtd.pivot.qvtschedule.utilities.QVTscheduleConstants; |
| import org.eclipse.qvtd.pivot.qvtschedule.utilities.QVTscheduleUtil; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * An implementation of the model object '<em><b>Edge</b></em>'. |
| * <!-- end-user-doc --> |
| * <p> |
| * The following features are implemented: |
| * </p> |
| * <ul> |
| * <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.EdgeImpl#getCluster <em>Cluster</em>}</li> |
| * <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.EdgeImpl#getEdgeRole <em>Edge Role</em>}</li> |
| * <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.EdgeImpl#getName <em>Name</em>}</li> |
| * <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.EdgeImpl#getOwningRegion <em>Owning Region</em>}</li> |
| * <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.EdgeImpl#getSourceNode <em>Source Node</em>}</li> |
| * <li>{@link org.eclipse.qvtd.pivot.qvtschedule.impl.EdgeImpl#getTargetNode <em>Target Node</em>}</li> |
| * </ul> |
| * |
| * @generated |
| */ |
| public abstract class EdgeImpl extends ElementImpl implements Edge { |
| /** |
| * The number of structural features of the '<em>Edge</em>' class. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| * @ordered |
| */ |
| public static final int EDGE_FEATURE_COUNT = ElementImpl.ELEMENT_FEATURE_COUNT + 6; |
| |
| /** |
| * The number of operations of the '<em>Edge</em>' class. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| * @ordered |
| */ |
| public static final int EDGE_OPERATION_COUNT = ElementImpl.ELEMENT_OPERATION_COUNT + 0; |
| |
| /** |
| * The cached value of the '{@link #getCluster() <em>Cluster</em>}' reference. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @see #getCluster() |
| * @generated |
| * @ordered |
| */ |
| protected Cluster cluster; |
| |
| /** |
| * The default value of the '{@link #getEdgeRole() <em>Edge Role</em>}' attribute. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @see #getEdgeRole() |
| * @generated |
| * @ordered |
| */ |
| protected static final Role EDGE_ROLE_EDEFAULT = Role.CONSTANT; |
| |
| /** |
| * The cached value of the '{@link #getEdgeRole() <em>Edge Role</em>}' attribute. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @see #getEdgeRole() |
| * @generated |
| * @ordered |
| */ |
| protected Role edgeRole = EDGE_ROLE_EDEFAULT; |
| |
| /** |
| * The default value of the '{@link #getName() <em>Name</em>}' attribute. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @see #getName() |
| * @generated |
| * @ordered |
| */ |
| protected static final String NAME_EDEFAULT = null; |
| |
| /** |
| * The cached value of the '{@link #getName() <em>Name</em>}' attribute. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @see #getName() |
| * @generated |
| * @ordered |
| */ |
| protected String name = NAME_EDEFAULT; |
| |
| /** |
| * The cached value of the '{@link #getSourceNode() <em>Source Node</em>}' reference. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @see #getSourceNode() |
| * @generated |
| * @ordered |
| */ |
| protected Node sourceNode; |
| |
| /** |
| * The cached value of the '{@link #getTargetNode() <em>Target Node</em>}' reference. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @see #getTargetNode() |
| * @generated |
| * @ordered |
| */ |
| protected Node targetNode; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected EdgeImpl() { |
| super(); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| protected EClass eStaticClass() { |
| return QVTschedulePackage.Literals.EDGE; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public Cluster getCluster() { |
| if (cluster != null && cluster.eIsProxy()) { |
| InternalEObject oldCluster = (InternalEObject)cluster; |
| cluster = (Cluster)eResolveProxy(oldCluster); |
| if (cluster != oldCluster) { |
| if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.RESOLVE, ElementImpl.ELEMENT_FEATURE_COUNT + 0, oldCluster, cluster)); |
| } |
| } |
| return cluster; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public Cluster basicGetCluster() { |
| return cluster; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public NotificationChain basicSetCluster(Cluster newCluster, NotificationChain msgs) { |
| Cluster oldCluster = cluster; |
| cluster = newCluster; |
| if (eNotificationRequired()) { |
| ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 0, oldCluster, newCluster); |
| if (msgs == null) msgs = notification; else msgs.add(notification); |
| } |
| return msgs; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void setCluster(Cluster newCluster) { |
| if (newCluster != cluster) { |
| NotificationChain msgs = null; |
| if (cluster != null) |
| msgs = ((InternalEObject)cluster).eInverseRemove(this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 3, Cluster.class, msgs); |
| if (newCluster != null) |
| msgs = ((InternalEObject)newCluster).eInverseAdd(this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 3, Cluster.class, msgs); |
| msgs = basicSetCluster(newCluster, msgs); |
| if (msgs != null) msgs.dispatch(); |
| } |
| else if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 0, newCluster, newCluster)); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public Role getEdgeRole() { |
| return edgeRole; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void setEdgeRole(Role newEdgeRole) { |
| Role oldEdgeRole = edgeRole; |
| edgeRole = newEdgeRole == null ? EDGE_ROLE_EDEFAULT : newEdgeRole; |
| if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 1, oldEdgeRole, edgeRole)); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public String getName() { |
| return name; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void setName(String newName) { |
| String oldName = name; |
| name = newName; |
| if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 2, oldName, name)); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public Region getOwningRegion() { |
| if (eContainerFeatureID() != (ElementImpl.ELEMENT_FEATURE_COUNT + 3)) return null; |
| return (Region)eInternalContainer(); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public NotificationChain basicSetOwningRegion(Region newOwningRegion, NotificationChain msgs) { |
| msgs = eBasicSetContainer((InternalEObject)newOwningRegion, ElementImpl.ELEMENT_FEATURE_COUNT + 3, msgs); |
| return msgs; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void setOwningRegion(Region newOwningRegion) { |
| if (newOwningRegion != eInternalContainer() || (eContainerFeatureID() != (ElementImpl.ELEMENT_FEATURE_COUNT + 3) && newOwningRegion != null)) { |
| if (EcoreUtil.isAncestor(this, newOwningRegion)) |
| throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); |
| NotificationChain msgs = null; |
| if (eInternalContainer() != null) |
| msgs = eBasicRemoveFromContainer(msgs); |
| if (newOwningRegion != null) |
| msgs = ((InternalEObject)newOwningRegion).eInverseAdd(this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 2, Region.class, msgs); |
| msgs = basicSetOwningRegion(newOwningRegion, msgs); |
| if (msgs != null) msgs.dispatch(); |
| } |
| else if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 3, newOwningRegion, newOwningRegion)); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public Node getSourceNode() { |
| if (sourceNode != null && sourceNode.eIsProxy()) { |
| InternalEObject oldSourceNode = (InternalEObject)sourceNode; |
| sourceNode = (Node)eResolveProxy(oldSourceNode); |
| if (sourceNode != oldSourceNode) { |
| if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.RESOLVE, ElementImpl.ELEMENT_FEATURE_COUNT + 4, oldSourceNode, sourceNode)); |
| } |
| } |
| return sourceNode; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public Node basicGetSourceNode() { |
| return sourceNode; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public NotificationChain basicSetSourceNode(Node newSourceNode, NotificationChain msgs) { |
| Node oldSourceNode = sourceNode; |
| sourceNode = newSourceNode; |
| if (eNotificationRequired()) { |
| ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 4, oldSourceNode, newSourceNode); |
| if (msgs == null) msgs = notification; else msgs.add(notification); |
| } |
| return msgs; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void setSourceNode(Node newSourceNode) { |
| if (newSourceNode != sourceNode) { |
| NotificationChain msgs = null; |
| if (sourceNode != null) |
| msgs = ((InternalEObject)sourceNode).eInverseRemove(this, ElementImpl.ELEMENT_FEATURE_COUNT + 7, Node.class, msgs); |
| if (newSourceNode != null) |
| msgs = ((InternalEObject)newSourceNode).eInverseAdd(this, ElementImpl.ELEMENT_FEATURE_COUNT + 7, Node.class, msgs); |
| msgs = basicSetSourceNode(newSourceNode, msgs); |
| if (msgs != null) msgs.dispatch(); |
| } |
| else if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 4, newSourceNode, newSourceNode)); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public Node getTargetNode() { |
| if (targetNode != null && targetNode.eIsProxy()) { |
| InternalEObject oldTargetNode = (InternalEObject)targetNode; |
| targetNode = (Node)eResolveProxy(oldTargetNode); |
| if (targetNode != oldTargetNode) { |
| if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.RESOLVE, ElementImpl.ELEMENT_FEATURE_COUNT + 5, oldTargetNode, targetNode)); |
| } |
| } |
| return targetNode; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public Node basicGetTargetNode() { |
| return targetNode; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public NotificationChain basicSetTargetNode(Node newTargetNode, NotificationChain msgs) { |
| Node oldTargetNode = targetNode; |
| targetNode = newTargetNode; |
| if (eNotificationRequired()) { |
| ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 5, oldTargetNode, newTargetNode); |
| if (msgs == null) msgs = notification; else msgs.add(notification); |
| } |
| return msgs; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void setTargetNode(Node newTargetNode) { |
| if (newTargetNode != targetNode) { |
| NotificationChain msgs = null; |
| if (targetNode != null) |
| msgs = ((InternalEObject)targetNode).eInverseRemove(this, ElementImpl.ELEMENT_FEATURE_COUNT + 3, Node.class, msgs); |
| if (newTargetNode != null) |
| msgs = ((InternalEObject)newTargetNode).eInverseAdd(this, ElementImpl.ELEMENT_FEATURE_COUNT + 3, Node.class, msgs); |
| msgs = basicSetTargetNode(newTargetNode, msgs); |
| if (msgs != null) msgs.dispatch(); |
| } |
| else if (eNotificationRequired()) |
| eNotify(new ENotificationImpl(this, Notification.SET, ElementImpl.ELEMENT_FEATURE_COUNT + 5, newTargetNode, newTargetNode)); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) { |
| switch (featureID) { |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 0: |
| if (cluster != null) |
| msgs = ((InternalEObject)cluster).eInverseRemove(this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 3, Cluster.class, msgs); |
| return basicSetCluster((Cluster)otherEnd, msgs); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 3: |
| if (eInternalContainer() != null) |
| msgs = eBasicRemoveFromContainer(msgs); |
| return basicSetOwningRegion((Region)otherEnd, msgs); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 4: |
| if (sourceNode != null) |
| msgs = ((InternalEObject)sourceNode).eInverseRemove(this, ElementImpl.ELEMENT_FEATURE_COUNT + 7, Node.class, msgs); |
| return basicSetSourceNode((Node)otherEnd, msgs); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 5: |
| if (targetNode != null) |
| msgs = ((InternalEObject)targetNode).eInverseRemove(this, ElementImpl.ELEMENT_FEATURE_COUNT + 3, Node.class, msgs); |
| return basicSetTargetNode((Node)otherEnd, msgs); |
| } |
| return super.eInverseAdd(otherEnd, featureID, msgs); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) { |
| switch (featureID) { |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 0: |
| return basicSetCluster(null, msgs); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 3: |
| return basicSetOwningRegion(null, msgs); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 4: |
| return basicSetSourceNode(null, msgs); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 5: |
| return basicSetTargetNode(null, msgs); |
| } |
| return super.eInverseRemove(otherEnd, featureID, msgs); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) { |
| switch (eContainerFeatureID()) { |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 3: |
| return eInternalContainer().eInverseRemove(this, NamedElementImpl.NAMED_ELEMENT_FEATURE_COUNT + 2, Region.class, msgs); |
| } |
| return super.eBasicRemoveFromContainerFeature(msgs); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public Object eGet(int featureID, boolean resolve, boolean coreType) { |
| switch (featureID) { |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 0: |
| if (resolve) return getCluster(); |
| return basicGetCluster(); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 1: |
| return getEdgeRole(); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 2: |
| return getName(); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 3: |
| return getOwningRegion(); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 4: |
| if (resolve) return getSourceNode(); |
| return basicGetSourceNode(); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 5: |
| if (resolve) return getTargetNode(); |
| return basicGetTargetNode(); |
| } |
| return super.eGet(featureID, resolve, coreType); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void eSet(int featureID, Object newValue) { |
| switch (featureID) { |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 0: |
| setCluster((Cluster)newValue); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 1: |
| setEdgeRole((Role)newValue); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 2: |
| setName((String)newValue); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 3: |
| setOwningRegion((Region)newValue); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 4: |
| setSourceNode((Node)newValue); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 5: |
| setTargetNode((Node)newValue); |
| return; |
| } |
| super.eSet(featureID, newValue); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void eUnset(int featureID) { |
| switch (featureID) { |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 0: |
| setCluster((Cluster)null); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 1: |
| setEdgeRole(EDGE_ROLE_EDEFAULT); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 2: |
| setName(NAME_EDEFAULT); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 3: |
| setOwningRegion((Region)null); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 4: |
| setSourceNode((Node)null); |
| return; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 5: |
| setTargetNode((Node)null); |
| return; |
| } |
| super.eUnset(featureID); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public boolean eIsSet(int featureID) { |
| switch (featureID) { |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 0: |
| return cluster != null; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 1: |
| return edgeRole != EDGE_ROLE_EDEFAULT; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 2: |
| return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name); |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 3: |
| return getOwningRegion() != null; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 4: |
| return sourceNode != null; |
| case ElementImpl.ELEMENT_FEATURE_COUNT + 5: |
| return targetNode != null; |
| } |
| return super.eIsSet(featureID); |
| } |
| |
| @Override |
| public void appendEdgeAttributes(@NonNull ToGraphHelper toGraphHelper, @NonNull String sourceName, @NonNull String targetName) { |
| GraphStringBuilder s = toGraphHelper.getGraphStringBuilder(); |
| toGraphHelper.setColor(this); |
| String label = getLabel(); |
| if (label != null) { |
| s.setLabel(label); |
| } |
| String style = getStyle(); |
| if (style != null) { |
| s.setStyle(style); |
| } |
| String arrowhead = getArrowhead(); |
| if (arrowhead != null) { |
| s.setArrowhead(arrowhead); |
| } |
| String arrowtail = getArrowtail(); |
| if (arrowtail != null) { |
| s.setArrowtail(arrowtail); |
| } |
| s.setPenwidth(getPenwidth()); |
| s.appendAttributedEdge(sourceName, this, targetName); |
| } |
| |
| /* @Override |
| public void appendNode(@NonNull GraphStringBuilder s, @NonNull String nodeName) { |
| String name = getName(); |
| / * String indexText = getIndexText(); |
| if (indexText != null) { |
| name = name + "\\n " + indexText; |
| } * / |
| s.setLabel(name); |
| s.setShape("ellipse"); |
| // String style = getStyle(); |
| // if (style != null) { |
| // s.setStyle(style); |
| // } |
| s.setColor(getColor()); |
| s.setPenwidth(getPenwidth()); |
| s.appendAttributedNode(nodeName); |
| } */ |
| |
| private void connect() { |
| Node sourceNode2 = this.sourceNode; |
| Node targetNode2 = this.targetNode; |
| assert sourceNode2 != null; |
| assert targetNode2 != null; |
| // assert sourceNode2 != targetNode2; -- cyclic edges may be unusual, but they're not wrong |
| Region region = QVTscheduleUtil.getOwningRegion(sourceNode2); |
| assert region == targetNode2.getOwningRegion(); |
| // region.addEdge(this); |
| // sourceNode2.addOutgoingEdge(this); |
| // targetNode2.addIncomingEdge(this); |
| assert sourceNode2.getOutgoingEdges().contains(this); |
| assert targetNode2.getIncomingEdges().contains(this); |
| assert !sourceNode2.isDependency() || targetNode2.isDependency() || targetNode2.isOperation(); // sourceNode2.isDependency() implies (targetNode2.isDependency() or targetNode2.isOperation()) |
| assert !targetNode2.isDependency() || sourceNode2.isDependency(); // targetNode2.isDependency() implies sourceNode2.isDependency() |
| } |
| |
| @Override |
| public @NonNull Edge createEdge(@NonNull Role edgeRole, @NonNull Node sourceNode, @NonNull Node targetNode) { |
| EdgeImpl edge = (EdgeImpl)QVTscheduleFactory.eINSTANCE.create(eClass()); |
| edge.initialize(edgeRole, sourceNode, name, targetNode); |
| return edge; |
| } |
| |
| @Override |
| public void destroy() { |
| Node sourceNode2 = this.sourceNode; |
| Node targetNode2 = this.targetNode; |
| if ((sourceNode2 != null) && (targetNode2 != null)) { |
| setTarget(null); |
| setSource(null); |
| setOwningRegion(null); |
| } |
| } |
| |
| private void disconnect() { |
| if (this.sourceNode != null) { |
| // this.sourceNode.removeOutgoingEdge(this); |
| } |
| if (this.targetNode != null) { |
| // this.targetNode.removeIncomingEdge(this); |
| } |
| // this.sourceNode = null; |
| // this.targetNode = null; |
| setOwningRegion(null); |
| setSourceNode(null); |
| setTargetNode(null); |
| } |
| |
| @Override |
| public String getArrowhead() { |
| return null; |
| } |
| |
| @Override |
| public String getArrowtail() { |
| return (isCast() || isNavigation()) ? "vee" : null; |
| } |
| |
| @Override |
| public @NonNull String getColor() { |
| assert edgeRole != null; |
| return QVTscheduleUtil.getColor(edgeRole); |
| } |
| |
| @Override |
| public @NonNull Node getEdgeSource() { |
| return QVTscheduleUtil.getSourceNode(this); |
| } |
| |
| @Override |
| public @NonNull Node getEdgeTarget() { |
| return QVTscheduleUtil.getTargetNode(this); |
| } |
| |
| @Override |
| public @NonNull Edge getForwardEdge() { |
| return this; |
| } |
| |
| @Override |
| public @Nullable String getLabel() { |
| return name; |
| } |
| |
| public @NonNull Integer getPenwidth() { |
| return (isCast() || isNavigation()) ? 2*QVTscheduleConstants.LINE_WIDTH : QVTscheduleConstants.LINE_WIDTH; |
| } |
| |
| public @Nullable String getStyle() { |
| return isMatched() ? null : "dashed"; |
| } |
| |
| @Override |
| public void initialize(@NonNull Role edgeRole, @NonNull Node sourceNode, @Nullable String name, @NonNull Node targetNode) { |
| setOwningRegion(QVTscheduleUtil.getOwningRegion(sourceNode)); |
| setEdgeRole(edgeRole); |
| setName(name); |
| setSource(sourceNode); |
| setTarget(targetNode); |
| } |
| |
| @Override |
| public boolean isCast() { |
| return false; |
| } |
| |
| @Override |
| public boolean isChecked() { |
| assert edgeRole != null; |
| return edgeRole.isChecked(); |
| } |
| |
| @Override |
| public boolean isComputation() { |
| return false; |
| } |
| |
| @Override |
| public boolean isConstant() { |
| assert edgeRole != null; |
| return edgeRole == Role.CONSTANT; |
| } |
| |
| @Override |
| public final boolean isDependency() { |
| return QVTscheduleUtil.getSourceNode(this).isDependency(); |
| } |
| |
| @Override |
| public boolean isExpression() { |
| return false; |
| } |
| |
| @Override |
| public boolean isLoaded() { |
| assert edgeRole != null; |
| return edgeRole == Role.LOADED; |
| } |
| |
| @Override |
| public final boolean isMatched() { |
| return QVTscheduleUtil.getSourceNode(this).isMatched() && QVTscheduleUtil.getTargetNode(this).isMatched(); |
| } |
| |
| @Override |
| public boolean isNavigation() { |
| return false; |
| } |
| |
| @Override |
| public boolean isNew() { |
| assert edgeRole != null; |
| return edgeRole.isNew(); |
| } |
| |
| @Override |
| public boolean isOld() { |
| assert edgeRole != null; |
| return edgeRole.isOld(); |
| } |
| |
| @Override |
| public boolean isPartial() { |
| return false; |
| } |
| |
| @Override |
| public boolean isPredicate() { |
| return false; |
| } |
| |
| @Override |
| public boolean isPredicated() { |
| assert edgeRole != null; |
| return edgeRole == Role.PREDICATED; |
| } |
| |
| @Override |
| public boolean isRealized() { |
| assert edgeRole != null; |
| return edgeRole == Role.REALIZED; |
| } |
| |
| @Override |
| public boolean isRecursion() { |
| return false; |
| } |
| |
| @Override |
| public boolean isSecondary() { |
| return false; |
| } |
| |
| @Override |
| public boolean isSpeculated() { |
| assert edgeRole != null; |
| return edgeRole == Role.SPECULATED; |
| } |
| |
| @Override |
| public boolean isSuccess() { |
| return false; |
| } |
| |
| @Override |
| public boolean isUnconditional() { |
| return QVTscheduleUtil.getSourceNode(this).isUnconditional() && QVTscheduleUtil.getTargetNode(this).isUnconditional(); |
| } |
| |
| protected void mergeRole(@NonNull Role edgeRole) { |
| if (this.edgeRole != edgeRole) { |
| assert this.edgeRole != null; |
| this.edgeRole = QVTscheduleUtil.mergeToMoreKnownPhase(this.edgeRole, edgeRole); |
| } |
| } |
| |
| @Override |
| public void setSource(@Nullable Node sourceNode) { |
| if (this.sourceNode != sourceNode) { |
| if (sourceNode == null) { |
| disconnect(); |
| } |
| else { |
| if (this.sourceNode != null) { |
| // this.sourceNode.removeOutgoingEdge(this); |
| disconnect(); |
| } |
| setSourceNode(sourceNode); |
| if (this.targetNode != null) { |
| connect(); |
| } |
| } |
| } |
| } |
| |
| @Override |
| public void setTarget(@Nullable Node targetNode) { |
| if (this.targetNode != targetNode) { |
| if (targetNode == null) { |
| disconnect(); |
| } |
| else { |
| if (this.targetNode != null) { |
| // this.targetNode.removeIncomingEdge(this); |
| disconnect(); |
| } |
| setTargetNode(targetNode); |
| if (this.sourceNode != null) { |
| connect(); |
| } |
| } |
| } |
| } |
| |
| @Override |
| public @NonNull String toString() { |
| Role edgeRole = getEdgeRole(); |
| StringBuilder s = new StringBuilder(); |
| s.append(edgeRole); |
| s.append("-"); |
| s.append(eClass().getName()); |
| s.append("("); |
| s.append(String.valueOf(sourceNode)); |
| s.append("=>"); |
| s.append(String.valueOf(name)); |
| s.append("=>"); |
| s.append(String.valueOf(targetNode)); |
| s.append(")"); |
| return s.toString(); |
| } |
| |
| } //EdgeImpl |