diff options
author | Laurent Redor | 2021-09-22 12:00:11 +0000 |
---|---|---|
committer | Laurent Redor | 2021-09-27 16:10:14 +0000 |
commit | dd6a2039464f8c440291c84370c3c599da833fba (patch) | |
tree | 7427ec0d0aad4c374ba9ec5b926c30378439a54c /plugins | |
parent | e679d9605000258fc00176041779016a497dba78 (diff) | |
download | org.eclipse.sirius-dd6a2039464f8c440291c84370c3c599da833fba.tar.gz org.eclipse.sirius-dd6a2039464f8c440291c84370c3c599da833fba.tar.xz org.eclipse.sirius-dd6a2039464f8c440291c84370c3c599da833fba.zip |
[576216] Add migration participant to keep same edges display order
In some cases, see issue for details, the display order of edges is
different after the z-order feature implementation.
The goal of this migration participant is to change the order of GMF
edges to keep the same display order.
The version of aird used in ZOrderActionsTest has been changed. Indeed,
this data already contains specific edges order.
Bug: 576216
Cherry-picked-from: 576057
Change-Id: Ibb8e7663732fc2562a96d75861c06f8522a14533
Signed-off-by: Laurent Redor <laurent.redor@obeo.fr>
Diffstat (limited to 'plugins')
12 files changed, 926 insertions, 1 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/plugin.properties b/plugins/org.eclipse.sirius.diagram.ui/plugin.properties index c1b3b9359b..42e655b62a 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/plugin.properties +++ b/plugins/org.eclipse.sirius.diagram.ui/plugin.properties @@ -954,6 +954,8 @@ EclipseImageSelectorDescriptor_extensionLoadingError = Error while loading the e EdgeGroupMoveMessage = Move edge group EdgeReconnectionHelper_invalidReconnectionKind = reconnectionKind must be ReconnectionKind.RECONNECT_SOURCE or ReconnectionKind.RECONNECT_TARGET EdgeRoutingStyleChangedCommand_label = Change routing style +EdgesZOrderMigrationParticipant_title = Migration done for "Edges z-order" (the result of this migration will be saved on the next session save): +EdgesZOrderMigrationParticipant_edgesOrderChanged = \n\t* The order of edges has been changed to keep same visual render in diagram "{0}". EditPartTools_nullParameterMsg = root or editPartType is null ExtendedPropertyDescriptor_categoryName = Extended ExtendedPropertyDescriptor_description = Property source for the extension framework diff --git a/plugins/org.eclipse.sirius.diagram.ui/plugin.xml b/plugins/org.eclipse.sirius.diagram.ui/plugin.xml index 4fc0a6fe31..94345d912c 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/plugin.xml +++ b/plugins/org.eclipse.sirius.diagram.ui/plugin.xml @@ -2153,6 +2153,10 @@ class="org.eclipse.sirius.diagram.ui.business.internal.migration.RepairEdgesWithOneBendpointMigrationParticipant" kind="RepresentationsFile"> </participant> + <participant + class="org.eclipse.sirius.diagram.ui.business.internal.migration.EdgesZOrderMigrationParticipant" + kind="RepresentationsFile"> + </participant> </extension> <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories"> diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/business/internal/migration/EdgesZOrderMigrationParticipant.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/business/internal/migration/EdgesZOrderMigrationParticipant.java new file mode 100644 index 0000000000..8558cb6572 --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/business/internal/migration/EdgesZOrderMigrationParticipant.java @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright (c) 2021 THALES GLOBAL SERVICES. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.diagram.ui.business.internal.migration; + +import java.text.MessageFormat; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; + +import org.eclipse.gmf.runtime.notation.Diagram; +import org.eclipse.gmf.runtime.notation.Edge; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.sirius.business.api.migration.AbstractRepresentationsFileMigrationParticipant; +import org.eclipse.sirius.business.api.query.DViewQuery; +import org.eclipse.sirius.diagram.DDiagram; +import org.eclipse.sirius.diagram.tools.api.DiagramPlugin; +import org.eclipse.sirius.diagram.ui.business.api.query.DDiagramGraphicalQuery; +import org.eclipse.sirius.diagram.ui.provider.Messages; +import org.eclipse.sirius.ext.base.Option; +import org.eclipse.sirius.viewpoint.DAnalysis; +import org.eclipse.sirius.viewpoint.DRepresentation; +import org.eclipse.sirius.viewpoint.DRepresentationDescriptor; +import org.eclipse.sirius.viewpoint.DView; +import org.osgi.framework.Version; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +/** + * This migration participant changes the GMF edges order according to connections source/target order. The goal is to + * keep the same visual aspect after the z-order feature (bugzilla 574273). Indeed, the display order now consider GMF + * edges order (changes in + * {@link org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDDiagramEditPart#refreshChildren()}). + * + * @author Laurent Redor + * + */ +public class EdgesZOrderMigrationParticipant extends AbstractRepresentationsFileMigrationParticipant { + + /** + * Migration version. + */ + public static final Version MIGRATION_VERSION = new Version("14.6.0.202109231100"); //$NON-NLS-1$ + + + @Override + public Version getMigrationVersion() { + return MIGRATION_VERSION; + } + + /** + * This method is overridden to change GMF edges order if necessary. + */ + @Override + protected void postLoad(DAnalysis dAnalysis, Version loadedVersion) { + if (loadedVersion.compareTo(MIGRATION_VERSION) < 0) { + + boolean isModified = false; + StringBuilder sb = new StringBuilder(Messages.EdgesZOrderMigrationParticipant_title); + + for (DView dView : dAnalysis.getOwnedViews()) { + List<DRepresentationDescriptor> loadedRepresentationsDescriptors = new DViewQuery(dView).getLoadedRepresentationsDescriptors(); + for (DRepresentationDescriptor descriptor : loadedRepresentationsDescriptors) { + DRepresentation rep = descriptor.getRepresentation(); + if (rep instanceof DDiagram) { + DDiagram dDiagram = (DDiagram) rep; + + DDiagramGraphicalQuery query = new DDiagramGraphicalQuery(dDiagram); + Option<Diagram> gmfDiagram = query.getAssociatedGMFDiagram(); + if (gmfDiagram.some()) { + // Get edges sorted from connection source/target order (as it was displayed before) + Collection<Edge> edgesFromSourceTargetOrder = getEdgesFromSourceAndTargetOrder(gmfDiagram.get()); + if (sortEdges(gmfDiagram.get(), edgesFromSourceTargetOrder)) { + isModified = true; + // Add information to be logged + sb.append(MessageFormat.format(Messages.EdgesZOrderMigrationParticipant_edgesOrderChanged, descriptor.getName())); + } + } + } + } + } + + if (isModified) { + DiagramPlugin.getDefault().logInfo(sb.toString()); + } + } + } + + /** + * Sort edges of the given diagram according to the given order. + * + * @param gmfDiagram + * The diagram containing edges to sort + * @param edgesFromSourceTargetOrder + * The edges in the expected order + * @return true if the order of edges in GMF diagram has been changed, false otherwise. + */ + private boolean sortEdges(Diagram gmfDiagram, Collection<Edge> edgesFromSourceTargetOrder) { + boolean orderHasChanged = false; + int currentIndex = 0; + for (Iterator<Edge> iterator = edgesFromSourceTargetOrder.iterator(); iterator.hasNext(); /* */) { + Edge edge = iterator.next(); + List<Edge> edges = getEdges(gmfDiagram); + if (edge != edges.get(currentIndex)) { + gmfDiagram.removeEdge(edge); + gmfDiagram.insertEdgeAt(edge, currentIndex); + orderHasChanged = true; + } + currentIndex++; + } + return orderHasChanged; + } + + /** + * Get edges of this view and of its descendants. The order of the list is the same than in the refresh of the + * figures threw {@link org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDDiagramEditPart#refreshChildren()} + * before the z-order feature implementation. + * + * @param view + * The starting point to get edges + * @return A list of edges + */ + private Collection<Edge> getEdgesFromSourceAndTargetOrder(View view) { + Collection<Edge> result = new LinkedHashSet<Edge>(); + for (Object child : view.getChildren()) { + if (child instanceof View) { + View childView = (View) child; + result.addAll(getEdgesFromSourceAndTargetOrder(childView)); + result.addAll(childView.getSourceEdges()); + result.addAll(childView.getTargetEdges()); + } + } + return result; + } + + /** + * Get the {@link Edge}s contained in the given {@link Diagram} . + * + * @param gmfDiagram + * the given {@link Diagram}. + * @return the {@link Edge}s contained in the given {@link Diagram}. + */ + private List<Edge> getEdges(Diagram gmfDiagram) { + return Lists.newArrayList(Iterables.filter(gmfDiagram.getEdges(), Edge.class)); + } + + protected String getMessageMigrationParticipantTitle() { + return Messages.RepairGMFbendpointsMigrationParticipant_title; + } +} diff --git a/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java b/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java index aa0928f9b1..5cc8715e85 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java @@ -551,6 +551,12 @@ public final class Messages { public static String EdgeRoutingStyleChangedCommand_label; @TranslatableMessage + public static String EdgesZOrderMigrationParticipant_title; + + @TranslatableMessage + public static String EdgesZOrderMigrationParticipant_edgesOrderChanged; + + @TranslatableMessage public static String EditPartTools_nullParameterMsg; @TranslatableMessage diff --git a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html index 785bca6cc7..b1f3cd34e1 100644 --- a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html +++ b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html @@ -364,6 +364,9 @@ </ul> <h4 id="Migrations">Migrations</h4> <ul> + <li><span class="label label-success">Added</span> A migration participant has been added to sort GMF edges order. The goal is to have edges displayed as before “edges z-order” improvement. Indeed, the display now consider order of GMF edges instead of order of its sources/targets.The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is + <em>14.6.0.202109231100</em>. + </li> <li><span class="label label-info">Modified</span> The migration participant <code>org.eclipse.sirius.diagram.ui.business.internal.migration.NoteShapeDefaultLabelAlignmentMigrationParticipant</code> has been updated to repair Notes with a potential wrong vertical label alignment. This problem can occur since Sirius 6.3.2 used in a collaborative environment, Obeo Designer Team Edition or Team For Capella for example. The corresponding version, stored in the attribute version of viewpoint:DAnalysis of the aird file, is <em>14.5.1.202106111100</em> (migration added in Sirius 6.5.1). diff --git a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile index 6be8d60fbe..1b1665bb88 100644 --- a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile +++ b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile @@ -81,6 +81,7 @@ h4. Changes in @org.eclipse.sirius.diagram.ui@ h4. Migrations +* <span class="label label-success">Added</span> A migration participant has been added to sort GMF edges order. The goal is to have edges displayed as before "edges z-order" improvement. Indeed, the display now consider order of GMF edges instead of order of its sources/targets.The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.6.0.202109231100_. * <span class="label label-info">Modified</span> The migration participant @org.eclipse.sirius.diagram.ui.business.internal.migration.NoteShapeDefaultLabelAlignmentMigrationParticipant@ has been updated to repair Notes with a potential wrong vertical label alignment. This problem can occur since Sirius 6.3.2 used in a collaborative environment, Obeo Designer Team Edition or Team For Capella for example. The corresponding version, stored in the attribute version of viewpoint:DAnalysis of the aird file, is _14.5.1.202106111100_ (migration added in Sirius 6.5.1). h2(#sirius6.5.0). Changes in Sirius 6.5.0 diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/My.ecore b/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/My.ecore new file mode 100644 index 0000000000..e3eb5b3a55 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/My.ecore @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="root"> + <eClassifiers xsi:type="ecore:EClass" name="A1"> + <eStructuralFeatures xsi:type="ecore:EReference" name="a5" eType="#//A2"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="A2"/> + <eClassifiers xsi:type="ecore:EClass" name="A3"> + <eStructuralFeatures xsi:type="ecore:EReference" name="a6" eType="#//A4"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="A4"/> + <eClassifiers xsi:type="ecore:EClass" name="B1"> + <eStructuralFeatures xsi:type="ecore:EReference" name="b6" eType="#//B2"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="B2"/> + <eClassifiers xsi:type="ecore:EClass" name="B3"> + <eStructuralFeatures xsi:type="ecore:EReference" name="b5" eType="#//B4"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="B4"/> + <eClassifiers xsi:type="ecore:EClass" name="C1"> + <eStructuralFeatures xsi:type="ecore:EReference" name="c3" eType="#//C2"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="C2"> + <eStructuralFeatures xsi:type="ecore:EReference" name="c4" eType="#//C1"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="D1"> + <eStructuralFeatures xsi:type="ecore:EReference" name="d4" eType="#//D2"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="D2"> + <eStructuralFeatures xsi:type="ecore:EReference" name="d3" eType="#//D1"/> + </eClassifiers> +</ecore:EPackage> diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/My.odesign b/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/My.odesign new file mode 100644 index 0000000000..d0147580be --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/My.odesign @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<description:Group xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:tool="http://www.eclipse.org/sirius/diagram/description/tool/1.1.0" xmlns:tool_1="http://www.eclipse.org/sirius/description/tool/1.1.0" name="My" version="12.0.0.2017041100"> + <ownedViewpoints name="SimpleVP" modelFileExtension="ecore"> + <ownedRepresentations xsi:type="description_1:DiagramDescription" name="Diag" domainClass="ecore::EPackage" enablePopupBars="true"> + <metamodel href="http://www.eclipse.org/emf/2002/Ecore#/"/> + <defaultLayer name="Default"> + <nodeMappings name="Classes" semanticCandidatesExpression="feature:eClassifiers" domainClass="ecore::EClass"> + <borderedNodeMappings name="Atributes" semanticCandidatesExpression="feature:eAttributes" domainClass="ecore::EAttribute"> + <style xsi:type="style:BundledImageDescription" labelSize="12" labelPosition="node" resizeKind="NSEW"> + <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <color xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + </style> + </borderedNodeMappings> + <style xsi:type="style:BundledImageDescription" labelSize="12" sizeComputationExpression="5" labelPosition="node" resizeKind="NSEW"> + <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <color xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='blue']"/> + </style> + </nodeMappings> + <edgeMappings name="References" labelDirectEdit="//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@toolSections.0/@ownedTools[name='']" sourceMapping="//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']" targetMapping="//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']" targetFinderExpression="feature:eReferenceType" sourceFinderExpression="feature:eContainer" domainClass="ecore::EReference" useDomainElement="true"> + <style sizeComputationExpression="2"> + <strokeColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='gray']"/> + <centerLabelStyleDescription labelSize="12" labelExpression="aql:self.name"> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + </centerLabelStyleDescription> + </style> + </edgeMappings> + <toolSections> + <ownedTools xsi:type="tool:NodeCreationDescription" name="Class" nodeMappings="//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"> + <variable name="container"/> + <viewVariable name="containerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:CreateInstance" typeName="ecore::EClass" referenceName="eClassifiers"/> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:NodeCreationDescription" name="Attribute" nodeMappings="//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@borderedNodeMappings[name='Atributes']"> + <variable name="container"/> + <viewVariable name="containerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:CreateInstance" typeName="ecore::EAttribute" referenceName="eAttributes"/> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:DirectEditLabel"> + <mask mask="{0}"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="var:0"/> + </initialOperation> + </ownedTools> + </toolSections> + </defaultLayer> + </ownedRepresentations> + </ownedViewpoints> +</description:Group> diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/representations.aird b/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/representations.aird new file mode 100644 index 0000000000..dcf381c4a8 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/migration/do_not_migrate/edgesZOrder/representations.aird @@ -0,0 +1,491 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style"> + <viewpoint:DAnalysis uid="_a8JSQD5-EeqvsIjF1ndgcQ" selectedViews="_5rSDoD5_EeqvsIjF1ndgcQ" version="14.5.1.202106111100"> + <semanticResources>My.ecore</semanticResources> + <ownedViews xmi:type="viewpoint:DView" uid="_5rSDoD5_EeqvsIjF1ndgcQ"> + <viewpoint xmi:type="description:Viewpoint" href="My.odesign#//@ownedViewpoints[name='SimpleVP']"/> + <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_pK3p8P82EeuG9o0Fcqxd3Q" name="new Diag" repPath="#_pKugAP82EeuG9o0Fcqxd3Q" changeId="6fb63d78-f2a1-4fa8-b3a1-eab5df222747"> + <description xmi:type="description_1:DiagramDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']"/> + <target xmi:type="ecore:EPackage" href="My.ecore#/"/> + </ownedRepresentationDescriptors> + </ownedViews> + </viewpoint:DAnalysis> + <diagram:DSemanticDiagram uid="_pKugAP82EeuG9o0Fcqxd3Q"> + <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_pLBa8P82EeuG9o0Fcqxd3Q" source="GMF_DIAGRAMS"> + <data xmi:type="notation:Diagram" xmi:id="_pLBa8f82EeuG9o0Fcqxd3Q" type="Sirius" element="_pKugAP82EeuG9o0Fcqxd3Q" measurementUnit="Pixel"> + <children xmi:type="notation:Node" xmi:id="_PCTCwBeZEeydU40JcbH77w" type="2001" element="_PCHckBeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_PCX7QBeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_PCX7QReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_PCZwcBeZEeydU40JcbH77w" type="3004" element="_PCJ40BeZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_PCZwcReZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PCZwcheZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_PCTCwReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PCTCwheZEeydU40JcbH77w" x="6" y="99" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_Qs0q4BeZEeydU40JcbH77w" type="2001" element="_QssIAheZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_Qs1R8BeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_Qs1R8ReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_Qs1R8heZEeydU40JcbH77w" type="3004" element="_QssvEBeZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_Qs1R8xeZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qs1R9BeZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_Qs0q4ReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qs0q4heZEeydU40JcbH77w" x="183" y="99" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_SxjiwBeZEeydU40JcbH77w" type="2001" element="_SxdcIReZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_SxkJ0BeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_SxkJ0ReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_SxkJ0heZEeydU40JcbH77w" type="3004" element="_SxdcIheZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_SxkJ0xeZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SxkJ1BeZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_SxjiwReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SxjiwheZEeydU40JcbH77w" x="86" y="17" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_UfuUwBeZEeydU40JcbH77w" type="2001" element="_UfnnFheZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_UfuUwxeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_UfuUxBeZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_Ufu70BeZEeydU40JcbH77w" type="3004" element="_UfoOIBeZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_Ufu70ReZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ufu70heZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_UfuUwReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UfuUwheZEeydU40JcbH77w" x="85" y="180" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_Wi-l8BeZEeydU40JcbH77w" type="2001" element="_Wi5GYheZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_Wi_NABeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_Wi_NAReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_Wi_NAheZEeydU40JcbH77w" type="3004" element="_Wi5GYxeZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_Wi_NAxeZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Wi_NBBeZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_Wi-l8ReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Wi-l8heZEeydU40JcbH77w" x="260" y="99" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_YauxwBeZEeydU40JcbH77w" type="2001" element="_YaoEExeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_YauxwxeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_YauxxBeZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_YauxxReZEeydU40JcbH77w" type="3004" element="_YaoEFBeZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_YauxxheZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YauxxxeZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_YauxwReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YauxwheZEeydU40JcbH77w" x="471" y="99" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_aBEdcBeZEeydU40JcbH77w" type="2001" element="_aA-96BeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_aBFEgBeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_aBFEgReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_aBFEgheZEeydU40JcbH77w" type="3004" element="_aA-96ReZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_aBFEgxeZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aBFEhBeZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_aBEdcReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aBEdcheZEeydU40JcbH77w" x="359" y="17" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_dB2G0BeZEeydU40JcbH77w" type="2001" element="_c-lXeBeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_dB2t4BeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_dB2t4ReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_dB5xMBeZEeydU40JcbH77w" type="3004" element="_c-lXeReZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_dB5xMReZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dB5xMheZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_dB2G0ReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dB2G0heZEeydU40JcbH77w" x="366" y="180" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_dB38ABeZEeydU40JcbH77w" type="2001" element="_c-lXexeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_dB4jEBeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_dB5KIBeZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_dB6YQBeZEeydU40JcbH77w" type="3004" element="_c-l-gBeZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_dB6YQReZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dB6YQheZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_dB38AReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dB38AheZEeydU40JcbH77w" x="6" y="300" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_ip2RIBeZEeydU40JcbH77w" type="2001" element="_ipwKiBeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_ip2RIxeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_ip2RJBeZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_ip24MBeZEeydU40JcbH77w" type="3004" element="_ipwKiReZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_ip24MReZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ip24MheZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_ip2RIReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ip2RIheZEeydU40JcbH77w" x="183" y="300" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_4HrrsBeZEeydU40JcbH77w" type="2001" element="_4EiRFReZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_4Hs50BeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_4Hs50ReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_4Htg4BeZEeydU40JcbH77w" type="3004" element="_4EiRFheZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_4Htg4ReZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4Htg4heZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_4HrrsReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4HrrsheZEeydU40JcbH77w" x="260" y="300" width="61" height="61"/> + </children> + <children xmi:type="notation:Node" xmi:id="_5-4d4BeZEeydU40JcbH77w" type="2001" element="_5-xJLReZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_5-5E8BeZEeydU40JcbH77w" type="5002"> + <layoutConstraint xmi:type="notation:Location" xmi:id="_5-5E8ReZEeydU40JcbH77w" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_5-5E8heZEeydU40JcbH77w" type="3004" element="_5-xwMBeZEeydU40JcbH77w"> + <styles xmi:type="notation:ShapeStyle" xmi:id="_5-5E8xeZEeydU40JcbH77w" fontName="Segoe UI"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5-5E9BeZEeydU40JcbH77w"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_5-4d4ReZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5-4d4heZEeydU40JcbH77w" x="471" y="300" width="61" height="61"/> + </children> + <styles xmi:type="notation:DiagramStyle" xmi:id="_pLBa8v82EeuG9o0Fcqxd3Q"/> + <edges xmi:type="notation:Edge" xmi:id="_ip6ikBeZEeydU40JcbH77w" type="4001" element="_ipzN0BeZEeydU40JcbH77w" source="_PCTCwBeZEeydU40JcbH77w" target="_Qs0q4BeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_ip7wsBeZEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ip7wsReZEeydU40JcbH77w" x="-52" y="-15"/> + </children> + <children xmi:type="notation:Node" xmi:id="_ip8-0BeZEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ip8-0ReZEeydU40JcbH77w" x="-2" y="9"/> + </children> + <children xmi:type="notation:Node" xmi:id="_ip-M8BeZEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ip-M8ReZEeydU40JcbH77w" x="-29" y="-1"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_ip6ikReZEeydU40JcbH77w" jumpLinkStatus="Above" jumpLinkType="Tunnel"/> + <styles xmi:type="notation:FontStyle" xmi:id="_ip6ikheZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ip6ikxeZEeydU40JcbH77w" points="[29, 0, -148, 0]$[145, 0, -32, 0]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_iqApMBeZEeydU40JcbH77w" id="(0.5,0.5)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_iqApMReZEeydU40JcbH77w" id="(0.5,0.5)"/> + </edges> + <edges xmi:type="notation:Edge" xmi:id="_pUdvABeZEeydU40JcbH77w" type="4001" element="_pRTtVBeZEeydU40JcbH77w" source="_SxjiwBeZEeydU40JcbH77w" target="_UfuUwBeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_pUeWEBeZEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pUeWEReZEeydU40JcbH77w" x="-40" y="-19"/> + </children> + <children xmi:type="notation:Node" xmi:id="_pUe9IBeZEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pUe9IReZEeydU40JcbH77w" x="7" y="1"/> + </children> + <children xmi:type="notation:Node" xmi:id="_pUe9IheZEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pUe9IxeZEeydU40JcbH77w" x="8" y="2"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_pUdvAReZEeydU40JcbH77w" jumpLinkStatus="Above" jumpLinkType="Tunnel"/> + <styles xmi:type="notation:FontStyle" xmi:id="_pUdvAheZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_pUdvAxeZEeydU40JcbH77w" points="[-1, 36, 0, -127]$[-1, 138, 0, -25]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pUfkMBeZEeydU40JcbH77w" id="(0.5,0.5)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pUfkMReZEeydU40JcbH77w" id="(0.5,0.5)"/> + </edges> + <edges xmi:type="notation:Edge" xmi:id="_pUgLQBeZEeydU40JcbH77w" type="4001" element="_pRUUZBeZEeydU40JcbH77w" source="_aBEdcBeZEeydU40JcbH77w" target="_dB2G0BeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_pUgLRBeZEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pUgLRReZEeydU40JcbH77w" x="-40" y="-19"/> + </children> + <children xmi:type="notation:Node" xmi:id="_pUgLRheZEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pUgLRxeZEeydU40JcbH77w" x="1" y="2"/> + </children> + <children xmi:type="notation:Node" xmi:id="_pUgLSBeZEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pUgLSReZEeydU40JcbH77w" x="4" y="1"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_pUgLQReZEeydU40JcbH77w" jumpLinkStatus="Above" jumpLinkType="Tunnel"/> + <styles xmi:type="notation:FontStyle" xmi:id="_pUgLQheZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_pUgLQxeZEeydU40JcbH77w" points="[1, 36, -6, -127]$[5, 138, -2, -25]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pUgyUBeZEeydU40JcbH77w" id="(0.5,0.5)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pUhZYBeZEeydU40JcbH77w" id="(0.5,0.5)"/> + </edges> + <edges xmi:type="notation:Edge" xmi:id="_tgttABeZEeydU40JcbH77w" type="4001" element="_tdjrXBeZEeydU40JcbH77w" source="_Wi-l8BeZEeydU40JcbH77w" target="_YauxwBeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_tgttBBeZEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tgttBReZEeydU40JcbH77w" x="-58" y="-15"/> + </children> + <children xmi:type="notation:Node" xmi:id="_tgttBheZEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tgttBxeZEeydU40JcbH77w" x="-12" y="5"/> + </children> + <children xmi:type="notation:Node" xmi:id="_tgttCBeZEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tgttCReZEeydU40JcbH77w" x="-6" y="7"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_tgttAReZEeydU40JcbH77w" jumpLinkStatus="Above" jumpLinkType="Tunnel"/> + <styles xmi:type="notation:FontStyle" xmi:id="_tgttAheZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_tgttAxeZEeydU40JcbH77w" points="[29, 0, -182, 0]$[179, 0, -32, 0]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_tgttCheZEeydU40JcbH77w" id="(0.5,0.5)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_tgttCxeZEeydU40JcbH77w" id="(0.5,0.5)"/> + </edges> + <edges xmi:type="notation:Edge" xmi:id="_xfLtsBeZEeydU40JcbH77w" type="4001" element="_xfFnHBeZEeydU40JcbH77w" source="_dB38ABeZEeydU40JcbH77w" target="_ip2RIBeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_xfLttBeZEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xfLttReZEeydU40JcbH77w" x="-35" y="16"/> + </children> + <children xmi:type="notation:Node" xmi:id="_xfLttheZEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xfLttxeZEeydU40JcbH77w" y="-3"/> + </children> + <children xmi:type="notation:Node" xmi:id="_xfLtuBeZEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xfLtuReZEeydU40JcbH77w" x="-4" y="-2"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_xfLtsReZEeydU40JcbH77w"/> + <styles xmi:type="notation:FontStyle" xmi:id="_xfLtsheZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_xfLtsxeZEeydU40JcbH77w" points="[29, 0, -148, 0]$[145, 0, -32, 0]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_xfMUwBeZEeydU40JcbH77w" id="(0.5,0.5)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_xfMUwReZEeydU40JcbH77w" id="(0.5,0.5)"/> + </edges> + <edges xmi:type="notation:Edge" xmi:id="_06ZQUBeZEeydU40JcbH77w" type="4001" element="_06Vl8BeZEeydU40JcbH77w" source="_ip2RIBeZEeydU40JcbH77w" target="_dB38ABeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_06Z3YBeZEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ce-aMBebEeydU40JcbH77w" x="-38" y="26"/> + </children> + <children xmi:type="notation:Node" xmi:id="_06Z3YheZEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ce-aMRebEeydU40JcbH77w" x="-21" y="-7"/> + </children> + <children xmi:type="notation:Node" xmi:id="_06Z3ZBeZEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ce-aMhebEeydU40JcbH77w" x="-14" y="10"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_06ZQUReZEeydU40JcbH77w"/> + <styles xmi:type="notation:FontStyle" xmi:id="_06ZQUheZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_06ZQUxeZEeydU40JcbH77w" points="[-32, -3, 145, -3]$[-5, 25, 172, 25]$[-148, 4, 29, 4]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_06Z3ZheZEeydU40JcbH77w" id="(0.5,0.5)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_06Z3ZxeZEeydU40JcbH77w" id="(0.5,0.5)"/> + </edges> + <edges xmi:type="notation:Edge" xmi:id="_-StDgBeZEeydU40JcbH77w" type="4001" element="_-SnkABeZEeydU40JcbH77w" source="_5-4d4BeZEeydU40JcbH77w" target="_4HrrsBeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_-StDhBeZEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-StDhReZEeydU40JcbH77w" x="-47" y="15"/> + </children> + <children xmi:type="notation:Node" xmi:id="_-StDhheZEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-StDhxeZEeydU40JcbH77w" x="-11" y="-1"/> + </children> + <children xmi:type="notation:Node" xmi:id="_-StDiBeZEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-StDiReZEeydU40JcbH77w" x="-11"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_-StDgReZEeydU40JcbH77w"/> + <styles xmi:type="notation:FontStyle" xmi:id="_-StDgheZEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-StDgxeZEeydU40JcbH77w" points="[-28, 0, 184, 0]$[-178, 0, 34, 0]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-StDiheZEeydU40JcbH77w" id="(0.4166666666666667,0.4098360655737705)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-StDixeZEeydU40JcbH77w" id="(0.4098360655737705,0.4098360655737705)"/> + </edges> + <edges xmi:type="notation:Edge" xmi:id="_BHuv4BeaEeydU40JcbH77w" type="4001" element="_BHpQZxeaEeydU40JcbH77w" source="_4HrrsBeZEeydU40JcbH77w" target="_5-4d4BeZEeydU40JcbH77w"> + <children xmi:type="notation:Node" xmi:id="_BHvW8xeaEeydU40JcbH77w" type="6001"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5kO08BxJEey_5Z1gDuSaLA" x="-48" y="15"/> + </children> + <children xmi:type="notation:Node" xmi:id="_BHvW9ReaEeydU40JcbH77w" type="6002"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5kPcABxJEey_5Z1gDuSaLA" y="10"/> + </children> + <children xmi:type="notation:Node" xmi:id="_BHvW9xeaEeydU40JcbH77w" type="6003"> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5kPcARxJEey_5Z1gDuSaLA" y="10"/> + </children> + <styles xmi:type="notation:ConnectorStyle" xmi:id="_BHvW8BeaEeydU40JcbH77w"/> + <styles xmi:type="notation:FontStyle" xmi:id="_BHvW8ReaEeydU40JcbH77w" fontName="Segoe UI" fontHeight="12"/> + <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_BHvW8heaEeydU40JcbH77w" points="[34, 0, -178, 0]$[184, 0, -28, 0]"/> + <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_BHvW-ReaEeydU40JcbH77w" id="(0.4098360655737705,0.4098360655737705)"/> + <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_BHvW-heaEeydU40JcbH77w" id="(0.4166666666666667,0.4098360655737705)"/> + </edges> + </data> + </ownedAnnotationEntries> + <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_pLgjIP82EeuG9o0Fcqxd3Q" source="DANNOTATION_CUSTOMIZATION_KEY"> + <data xmi:type="diagram:ComputedStyleDescriptionRegistry" uid="_pLgjIf82EeuG9o0Fcqxd3Q"/> + </ownedAnnotationEntries> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_PCHckBeZEeydU40JcbH77w" name="A1" outgoingEdges="_ipzN0BeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//A1"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//A1"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_PCJ40BeZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_QssIAheZEeydU40JcbH77w" name="A2" incomingEdges="_ipzN0BeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//A2"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//A2"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_QssvEBeZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_SxdcIReZEeydU40JcbH77w" name="A3" outgoingEdges="_pRTtVBeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//A3"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//A3"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_SxdcIheZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_UfnnFheZEeydU40JcbH77w" name="A4" incomingEdges="_pRTtVBeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//A4"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//A4"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_UfoOIBeZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_Wi5GYheZEeydU40JcbH77w" name="B1" outgoingEdges="_tdjrXBeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//B1"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//B1"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_Wi5GYxeZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_YaoEExeZEeydU40JcbH77w" name="B2" incomingEdges="_tdjrXBeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//B2"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//B2"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_YaoEFBeZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_aA-96BeZEeydU40JcbH77w" name="B3" outgoingEdges="_pRUUZBeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//B3"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//B3"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_aA-96ReZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_c-lXeBeZEeydU40JcbH77w" name="B4" incomingEdges="_pRUUZBeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//B4"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//B4"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_c-lXeReZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_c-lXexeZEeydU40JcbH77w" name="C1" outgoingEdges="_xfFnHBeZEeydU40JcbH77w" incomingEdges="_06Vl8BeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//C1"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//C1"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_c-l-gBeZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_ipwKiBeZEeydU40JcbH77w" name="C2" outgoingEdges="_06Vl8BeZEeydU40JcbH77w" incomingEdges="_xfFnHBeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//C2"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//C2"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_ipwKiReZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_4EiRFReZEeydU40JcbH77w" name="D1" outgoingEdges="_BHpQZxeaEeydU40JcbH77w" incomingEdges="_-SnkABeZEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//D1"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//D1"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_4EiRFheZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNode" uid="_5-xJLReZEeydU40JcbH77w" name="D2" outgoingEdges="_-SnkABeZEeydU40JcbH77w" incomingEdges="_BHpQZxeaEeydU40JcbH77w" width="5" height="5" resizeKind="NSEW"> + <target xmi:type="ecore:EClass" href="My.ecore#//D2"/> + <semanticElements xmi:type="ecore:EClass" href="My.ecore#//D2"/> + <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> + <arrangeConstraints>KEEP_SIZE</arrangeConstraints> + <arrangeConstraints>KEEP_RATIO</arrangeConstraints> + <ownedStyle xmi:type="diagram:BundledImage" uid="_5-xwMBeZEeydU40JcbH77w" labelSize="12" borderColor="39,76,114" labelPosition="node" color="114,159,207"> + <description xmi:type="style:BundledImageDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@nodeMappings[name='Classes']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ipzN0BeZEeydU40JcbH77w" name="a5" sourceNode="_PCHckBeZEeydU40JcbH77w" targetNode="_QssIAheZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//A1/a5"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//A1/a5"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_ipzN0ReZEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_ipzN0heZEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_pRTtVBeZEeydU40JcbH77w" name="a6" sourceNode="_SxdcIReZEeydU40JcbH77w" targetNode="_UfnnFheZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//A3/a6"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//A3/a6"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_pRUUYBeZEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_pRUUYReZEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_pRUUZBeZEeydU40JcbH77w" name="b5" sourceNode="_aA-96BeZEeydU40JcbH77w" targetNode="_c-lXeBeZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//B3/b5"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//B3/b5"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_pRUUZReZEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_pRUUZheZEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_tdjrXBeZEeydU40JcbH77w" name="b6" sourceNode="_Wi5GYheZEeydU40JcbH77w" targetNode="_YaoEExeZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//B1/b6"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//B1/b6"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_tdjrXReZEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_tdjrXheZEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_xfFnHBeZEeydU40JcbH77w" name="c3" sourceNode="_c-lXexeZEeydU40JcbH77w" targetNode="_ipwKiBeZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//C1/c3"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//C1/c3"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_xfFnHReZEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_xfFnHheZEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_06Vl8BeZEeydU40JcbH77w" name="c4" sourceNode="_ipwKiBeZEeydU40JcbH77w" targetNode="_c-lXexeZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//C2/c4"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//C2/c4"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_06Vl8ReZEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_06Vl8heZEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_-SnkABeZEeydU40JcbH77w" name="d3" sourceNode="_5-xJLReZEeydU40JcbH77w" targetNode="_4EiRFReZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//D2/d3"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//D2/d3"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_-SoLABeZEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_-SoLAReZEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DEdge" uid="_BHpQZxeaEeydU40JcbH77w" name="d4" sourceNode="_4EiRFReZEeydU40JcbH77w" targetNode="_5-xJLReZEeydU40JcbH77w"> + <target xmi:type="ecore:EReference" href="My.ecore#//D1/d4"/> + <semanticElements xmi:type="ecore:EReference" href="My.ecore#//D1/d4"/> + <ownedStyle xmi:type="diagram:EdgeStyle" uid="_BHp3YBeaEeydU40JcbH77w" size="2"> + <description xmi:type="style:EdgeStyleDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']/@style"/> + <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_BHp3YReaEeydU40JcbH77w" labelSize="12"/> + </ownedStyle> + <actualMapping xmi:type="description_1:EdgeMapping" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer/@edgeMappings[name='References']"/> + </ownedDiagramElements> + <description xmi:type="description_1:DiagramDescription" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']"/> + <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_pK0moP82EeuG9o0Fcqxd3Q"/> + <activatedLayers xmi:type="description_1:Layer" href="My.odesign#//@ownedViewpoints[name='SimpleVP']/@ownedRepresentations[name='Diag']/@defaultLayer"/> + <target xmi:type="ecore:EPackage" href="My.ecore#/"/> + </diagram:DSemanticDiagram> +</xmi:XMI> diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/diagram/AllDiagramPluginsTests.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/diagram/AllDiagramPluginsTests.java index 503340fa73..c6b167b63b 100644 --- a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/diagram/AllDiagramPluginsTests.java +++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/diagram/AllDiagramPluginsTests.java @@ -167,6 +167,7 @@ import org.eclipse.sirius.tests.unit.diagram.layoutingmode.LayoutingModeOnCustom import org.eclipse.sirius.tests.unit.diagram.layoutingmode.LayoutingModeOnECoreModelerTest; import org.eclipse.sirius.tests.unit.diagram.mapping.EdgeMappingCreationDescriptionTests; import org.eclipse.sirius.tests.unit.diagram.migration.ActivatedFilterSortingMigrationParticipantTest; +import org.eclipse.sirius.tests.unit.diagram.migration.EdgesZOrderMigrationParticipantTest; import org.eclipse.sirius.tests.unit.diagram.migration.JumpLinkNewTypeMigrationTest; import org.eclipse.sirius.tests.unit.diagram.migration.LabelOnBorderMigrationTests6_3_0; import org.eclipse.sirius.tests.unit.diagram.migration.LabelOnBorderMigrationTestsBefore6_3_0; @@ -562,6 +563,7 @@ public class AllDiagramPluginsTests { suite.addTestSuite(JumpLinkNewTypeMigrationTest.class); suite.addTestSuite(LabelOnBorderMigrationTestsBefore6_3_0.class); suite.addTestSuite(LabelOnBorderMigrationTests6_3_0.class); + suite.addTestSuite(EdgesZOrderMigrationParticipantTest.class); // Edge on edge tests suite.addTestSuite(EdgeOnEdgeHideRevealTest.class); diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/migration/EdgesZOrderMigrationParticipantTest.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/migration/EdgesZOrderMigrationParticipantTest.java new file mode 100644 index 0000000000..00bcac6cf2 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/migration/EdgesZOrderMigrationParticipantTest.java @@ -0,0 +1,169 @@ +/******************************************************************************* + * Copyright (c) 2021 THALES GLOBAL SERVICES. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.tests.unit.diagram.migration; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.emf.common.util.URI; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.sirius.common.tools.api.util.ReflectionHelper; +import org.eclipse.sirius.diagram.DDiagram; +import org.eclipse.sirius.diagram.DEdge; +import org.eclipse.sirius.diagram.ui.business.internal.migration.EdgesZOrderMigrationParticipant; +import org.eclipse.sirius.ext.gmf.runtime.draw2d.ui.figures.SiriusPolylineConnectionEx; +import org.eclipse.sirius.tests.SiriusTestsPlugin; +import org.eclipse.sirius.tests.support.api.SiriusDiagramTestCase; +import org.eclipse.sirius.tests.support.api.TestsUtil; +import org.eclipse.sirius.ui.business.api.dialect.DialectUIManager; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.PlatformUI; +import org.osgi.framework.Version; + +/** + * Test for {@link EdgesZOrderMigrationParticipant}. + * + * @author lredor + */ +public class EdgesZOrderMigrationParticipantTest extends SiriusDiagramTestCase { + private static final String PATH = "/data/unit/migration/do_not_migrate/edgesZOrder/"; + + private static final String SESSION_RESOURCE_PATH = "/" + SiriusTestsPlugin.PLUGIN_ID + PATH + "representations.aird"; + + private static final String SEMANTIC_RESOURCE_PATH = "/" + SiriusTestsPlugin.PLUGIN_ID + PATH + "My.ecore"; + + @Override + protected void setUp() throws Exception { + super.setUp(); + // Set full screen to be sure to draw all figures. + PlatformUI.getWorkbench().getDisplay().syncExec(() -> { + // Just call getActiveWorkbenchWindow() to avoid potential + // empty list in getWorkbenchWindows() (see bug 441507). + PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + Shell shell = PlatformUI.getWorkbench().getWorkbenchWindows()[0].getShell(); + String osName = System.getProperty("os.name"); + if (osName.contains("Mac") || osName.contains("Linux")) { + shell.setMaximized(true); + } else { + shell.setFullScreen(true); + } + if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() != null) { + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().forceActive(); + } + }); + genericSetUp(Collections.singletonList(SEMANTIC_RESOURCE_PATH), Collections.<String> emptyList(), SESSION_RESOURCE_PATH); + } + + /** + * Test that the data were not migrated on the repository. It allows to check the effect of the migration in the + * other test. + */ + public void testMigrationIsNeededOnData() { + Version migrationVersion = new EdgesZOrderMigrationParticipant().getMigrationVersion(); + + // Check that the migration of the session resource is needed. + Version loadedVersion = checkRepresentationFileMigrationStatus(URI.createPlatformResourceURI(SESSION_RESOURCE_PATH, true), true); + assertTrue("The migration must be required on test data.", migrationVersion.compareTo(loadedVersion) > 0); + } + + /** + * Check that the figures of edges are correctly displayed: + * <UL> + * <LI>right number of jump links,</LI> + * <LI>or straight line.</LI> + * </UL> + */ + public void testEdgesFigures() { + DDiagram diagram = (DDiagram) getRepresentationsByName("new Diag").toArray()[0]; + IEditorPart editorPart = DialectUIManager.INSTANCE.openEditor(session, diagram, new NullProgressMonitor()); + TestsUtil.synchronizationWithUIThread(); + // TestsUtil.synchronizationWithUIThread(); + // Check that edge a5 has a jump link (OK even without migration participant) + SiriusPolylineConnectionEx connection = getConnection(diagram, editorPart, "a5"); + checkJumpLinksNumber("a5", connection, 1); + // Check that edge a6 has not a jump link (OK even without migration participant) + connection = getConnection(diagram, editorPart, "a6"); + checkJumpLinksNumber("a6", connection, 0); + // Check that edge b5 has not a jump link (KO without migration participant) + connection = getConnection(diagram, editorPart, "b5"); + checkJumpLinksNumber("b5", connection, 0); + // Check that edge b6 has a jump link (KO without migration participant) + connection = getConnection(diagram, editorPart, "b6"); + checkJumpLinksNumber("b6", connection, 1); + // Check that edge c3 is a straight line, ie with only 2 points (OK even without migration participant) + connection = getConnection(diagram, editorPart, "c3"); + assertEquals("The edge c3 should have only 2 points.", 2, connection.getPoints().size()); + // Check that edge d4 is a straight line, ie with only 2 points (KO without migration participant) + connection = getConnection(diagram, editorPart, "d4"); + assertEquals("The edge d4 should have only 2 points.", 2, connection.getPoints().size()); + } + + /** + * Check the number of jump links. This method uses ReflectionHelper to access private fields to count the jump + * links on the figure. + * + * @param edgeName + * The edge that is currently tested + * @param connection + * The figure to check + * @param expectedNumberOfJumpLinks + * The expected number of jump links on the edge + */ + @SuppressWarnings("unchecked") + private void checkJumpLinksNumber(String edgeName, SiriusPolylineConnectionEx connection, int expectedNumberOfJumpLinks) { + Optional<Object> optionalJumpLinkSet = ReflectionHelper.getFieldValueWithoutException(connection, "jumpLinkSet"); + if (optionalJumpLinkSet.isPresent()) { + Optional<Object> optionalJumpLinkList = ReflectionHelper.getFieldValueWithoutException(optionalJumpLinkSet.get(), "m_pJumpLinks"); + if (optionalJumpLinkList.isPresent()) { + if (optionalJumpLinkList.get() instanceof List) { + String errorMessage; + if (expectedNumberOfJumpLinks == 0) { + errorMessage = "The edge " + edgeName + " should not have jump link."; + } else { + errorMessage = "Wrong number of expected jump links for edge " + edgeName + "."; + } + assertEquals(errorMessage, expectedNumberOfJumpLinks, ((List<Object>) optionalJumpLinkList.get()).size()); + } else { + fail("Impossible to get the private jump links list."); + } + } else { + fail("There was a problem when trying to get the private jump links list field through reflection."); + } + } else { + fail("There was a problem when trying to get the private jump links field through reflection."); + } + } + + /** + * Get the connection figure corresponding to the edge name. + * + * @param diagram + * The diagram containing the edge. + * @param editor + * The editor containing the searched figure. + * @param edgeName + * The name of the searched edge. + * + * @return The connection figure corresponding to the edge name. + */ + protected SiriusPolylineConnectionEx getConnection(DDiagram diagram, IEditorPart editor, String edgeName) { + DEdge edge = getDiagramElementsFromLabel(diagram, edgeName, DEdge.class).iterator().next(); + IGraphicalEditPart edgeEditPart = getEditPart(edge, editor); + assertTrue("The figure for edge " + edgeName + " should be a SiriusPolylineConnectionEx", edgeEditPart.getFigure() instanceof SiriusPolylineConnectionEx); + SiriusPolylineConnectionEx connection = (SiriusPolylineConnectionEx) edgeEditPart.getFigure(); + return connection; + } +} diff --git a/plugins/org.eclipse.sirius.tests.swtbot/data/unit/tools/zorder/representations.aird b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/tools/zorder/representations.aird index 171d42f4fb..ca6ae1e129 100644 --- a/plugins/org.eclipse.sirius.tests.swtbot/data/unit/tools/zorder/representations.aird +++ b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/tools/zorder/representations.aird @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style"> - <viewpoint:DAnalysis uid="_a8JSQD5-EeqvsIjF1ndgcQ" selectedViews="_5rSDoD5_EeqvsIjF1ndgcQ" version="14.5.1.202106111100"> + <viewpoint:DAnalysis uid="_a8JSQD5-EeqvsIjF1ndgcQ" selectedViews="_5rSDoD5_EeqvsIjF1ndgcQ" version="14.6.0.202109231100"> <semanticResources>My.ecore</semanticResources> <ownedViews xmi:type="viewpoint:DView" uid="_5rSDoD5_EeqvsIjF1ndgcQ"> <viewpoint xmi:type="description:Viewpoint" href="My.odesign#//@ownedViewpoints[name='SimpleVP']"/> |