Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCamille Letavernier2018-07-30 10:44:55 -0400
committerCamille Letavernier2018-09-24 06:48:28 -0400
commite5ef3c3723a42d3837760a21c433bd97a8cce24d (patch)
tree3ca9523935ee09a303d1bb67b40f92bf8605e828 /plugins
parenteb7c941a7911bd828d7d62d49544a118996ea80a (diff)
downloadorg.eclipse.papyrus-e5ef3c3723a42d3837760a21c433bd97a8cce24d.tar.gz
org.eclipse.papyrus-e5ef3c3723a42d3837760a21c433bd97a8cce24d.tar.xz
org.eclipse.papyrus-e5ef3c3723a42d3837760a21c433bd97a8cce24d.zip
Bug 536640: [Sequence Diagram] Ensure that graphics & semantics remain
consistent for Durations https://bugs.eclipse.org/bugs/show_bug.cgi?id=536640 Change-Id: I7458b84062b529a98780a729d8f27bfcab50814c Signed-off-by: Camille Letavernier <cletavernier@eclipsesource.com>
Diffstat (limited to 'plugins')
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/AbstractDurationLinkAdvice.java87
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationConstraintLinkAdvice.java31
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationObservationLinkAdvice.java31
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/DurationLinkUtil.java112
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/SequenceDiagram.elementtypesconfigurations18
5 files changed, 273 insertions, 6 deletions
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/AbstractDurationLinkAdvice.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/AbstractDurationLinkAdvice.java
new file mode 100644
index 00000000000..4d70849c3a2
--- /dev/null
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/AbstractDurationLinkAdvice.java
@@ -0,0 +1,87 @@
+/*****************************************************************************
+ * Copyright (c) 2018 CEA LIST, EclipseSource and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * EclipseSource - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice;
+
+import java.util.Collection;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature.Setting;
+import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice;
+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
+import org.eclipse.gmf.runtime.notation.Connector;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.services.edit.service.ElementEditServiceUtils;
+import org.eclipse.papyrus.infra.services.edit.service.IElementEditService;
+import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.SequenceDiagramEditPart;
+import org.eclipse.papyrus.uml.diagram.sequence.util.DurationLinkUtil;
+
+/**
+ * <p>
+ * Abstract sequence diagram advice to clear DurationLinks when the corresponding
+ * semantic Duration element becomes inconsistent (typically, the source/target changes
+ * or is removed).
+ * </p>
+ */
+public abstract class AbstractDurationLinkAdvice extends AbstractEditHelperAdvice {
+
+ private EClass durationElementType;
+ private EReference eventsReference;
+ private String durationLinkType;
+
+ protected AbstractDurationLinkAdvice(EClass durationElementType, EReference eventsReference, String durationLinkType) {
+ this.durationElementType = durationElementType;
+ this.eventsReference = eventsReference;
+ this.durationLinkType = durationLinkType;
+ }
+
+ @Override
+ protected ICommand getAfterSetCommand(SetRequest request) {
+ if (request.getFeature() == eventsReference && durationElementType.isInstance(request.getElementToEdit())) {
+ Collection<Setting> usages = EMFHelper.getUsages(request.getElementToEdit());
+
+ // We need to delegate to the command provider; otherwise the view is not correctly destroyed,
+ // and the diagram may still display a ghost connection (referencing a view that is no longer
+ // attached to the notation model)
+ IElementEditService provider = ElementEditServiceUtils.getCommandProvider(request.getElementToEdit());
+ if (provider == null) {
+ return null;
+ }
+
+ CompositeCommand deletions = new CompositeCommand("Delete inconsistent DurationLink views");
+ for (Setting usage : usages) {
+ if (usage.getEObject() instanceof Connector && usage.getEStructuralFeature() == NotationPackage.Literals.VIEW__ELEMENT) {
+ Connector connector = (Connector) usage.getEObject();
+ if (durationLinkType.equals(connector.getType()) //
+ && connector.getDiagram() != null //
+ && SequenceDiagramEditPart.MODEL_ID.equals(connector.getDiagram().getType())) {
+ if (!DurationLinkUtil.isConsistent(connector, request)) {
+ // Retrieve delete command from the Element Edit service
+ DestroyElementRequest destroyRequest = new DestroyElementRequest(request.getEditingDomain(), connector, false);
+ ICommand deleteCommand = provider.getEditCommand(destroyRequest);
+ deletions.add(deleteCommand);
+ }
+ }
+ }
+ }
+ return deletions.isEmpty() ? null : deletions.reduce();
+ }
+ return super.getAfterSetCommand(request);
+ }
+
+}
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationConstraintLinkAdvice.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationConstraintLinkAdvice.java
new file mode 100644
index 00000000000..7bd4d30d6b9
--- /dev/null
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationConstraintLinkAdvice.java
@@ -0,0 +1,31 @@
+/*****************************************************************************
+ * Copyright (c) 2018 CEA LIST, EclipseSource and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * EclipseSource - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice;
+
+import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.DurationConstraintLinkEditPart;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * <p>
+ * A sequence diagram advice to clear {@link DurationConstraintLinkEditPart DurationConstraint links} when the
+ * constraint's constrained elements are changed.
+ * </p>
+ */
+public class DurationConstraintLinkAdvice extends AbstractDurationLinkAdvice {
+
+ public DurationConstraintLinkAdvice() {
+ super(UMLPackage.Literals.DURATION_CONSTRAINT, UMLPackage.Literals.CONSTRAINT__CONSTRAINED_ELEMENT, DurationConstraintLinkEditPart.VISUAL_ID);
+ }
+
+}
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationObservationLinkAdvice.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationObservationLinkAdvice.java
new file mode 100644
index 00000000000..6a3c92258c8
--- /dev/null
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/helpers/advice/DurationObservationLinkAdvice.java
@@ -0,0 +1,31 @@
+/*****************************************************************************
+ * Copyright (c) 2018 CEA LIST, EclipseSource and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * EclipseSource - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice;
+
+import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.DurationObservationLinkEditPart;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * <p>
+ * A sequence diagram advice to clear {@link DurationObservationLinkEditPart DurationObservation links} when the
+ * observation's events are changed.
+ * </p>
+ */
+public class DurationObservationLinkAdvice extends AbstractDurationLinkAdvice {
+
+ public DurationObservationLinkAdvice() {
+ super(UMLPackage.Literals.DURATION_OBSERVATION, UMLPackage.Literals.DURATION_OBSERVATION__EVENT, DurationObservationLinkEditPart.VISUAL_ID);
+ }
+
+}
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/DurationLinkUtil.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/DurationLinkUtil.java
index 09e3876e2f5..600773dab24 100644
--- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/DurationLinkUtil.java
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/DurationLinkUtil.java
@@ -20,6 +20,7 @@ import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gef.requests.CreateRequest;
@@ -30,10 +31,21 @@ import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewAndElemen
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
+import org.eclipse.gmf.runtime.notation.Connector;
+import org.eclipse.gmf.runtime.notation.IdentityAnchor;
+import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.infra.gmfdiag.common.service.palette.AspectUnspecifiedTypeConnectionTool.CreateAspectUnspecifiedTypeConnectionRequest;
+import org.eclipse.papyrus.uml.diagram.sequence.anchors.AnchorConstants;
import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.DurationConstraintLinkEditPart;
import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.DurationObservationLinkEditPart;
import org.eclipse.papyrus.uml.diagram.sequence.providers.UMLElementTypes;
+import org.eclipse.uml2.uml.DurationConstraint;
+import org.eclipse.uml2.uml.DurationObservation;
+import org.eclipse.uml2.uml.ExecutionSpecification;
+import org.eclipse.uml2.uml.Message;
+import org.eclipse.uml2.uml.MessageEnd;
+import org.eclipse.uml2.uml.OccurrenceSpecification;
/**
* <p>
@@ -168,4 +180,104 @@ public class DurationLinkUtil {
request.getConnectionEditPart() instanceof DurationObservationLinkEditPart;
}
+ /**
+ * <p>
+ * Test if the connector view is consistent with a new value. If the new value is not a List,
+ * this method always returns true. Otherwise, the list items will be compared with the
+ * semantic source/target of the given connector.
+ * </p>
+ *
+ * @param connector
+ * A connector representing a DurationLink (Constraint or Observation) in the Sequence Diagram
+ * @param setRequest
+ * A {@link SetRequest} modifying a duration link source/target (for {@link DurationConstraint#getConstrainedElements()}
+ * or {@link DurationObservation#getEvents()},
+ * @return
+ * <code>true</code> if the Connector is consistent with the new proposed value, <code>false</code> if the connector
+ * is no longer consistent. If the result is <code>false</code>, actions should be taken to preserve the diagram
+ * consistency.
+ */
+ public static boolean isConsistent(Connector connector, SetRequest setRequest) {
+ Object newValue = setRequest.getValue();
+ if (false == newValue instanceof List) {
+ // Not supported; do nothing. Probably shouldn't happen anyway.
+ return true;
+ }
+
+ List<?> values = (List<?>) newValue;
+ if (values.isEmpty()) {
+ // FIXME Workaround for the Properties View. When using the multi-reference editor's dialog,
+ // the editor will first send a clear() request, then a addAll() request; so we'd always
+ // destroy the connector, even if it's actually still valid. To be safe, we ignore this case
+ // Keeping an invalid connector in the diagram is better than destroying a valid one.
+ return true;
+ }
+
+ View sourceView = connector.getSource();
+ String sourceAnchor = connector.getSourceAnchor() instanceof IdentityAnchor ? ((IdentityAnchor) connector.getSourceAnchor()).getId() : "";
+
+ View targetView = connector.getTarget();
+ String targetAnchor = connector.getSourceAnchor() instanceof IdentityAnchor ? ((IdentityAnchor) connector.getTargetAnchor()).getId() : "";
+
+ if (sourceView == null || targetView == null) {
+ return false;
+ }
+
+ if (values.isEmpty()) {
+ return false;
+ }
+
+ Object sourceEvent = values.get(0);
+ if (sourceEvent != DurationLinkUtil.findSemanticOccurrence(sourceView, sourceAnchor)) {
+ return false;
+ }
+
+ if (values.size() > 1) { // source != target
+ Object targetEvent = values.get(1);
+ return targetEvent == DurationLinkUtil.findSemanticOccurrence(targetView, targetAnchor);
+ } else { // source == target
+ return sourceEvent == DurationLinkUtil.findSemanticOccurrence(targetView, targetAnchor);
+ }
+ }
+
+ /**
+ * Find the semantic {@link OccurrenceSpecification} represented by the given <code>connectorEnd</code>.
+ * The connector should be the source or target of a DurationLink connector.
+ *
+ * @param connectorEnd
+ * the source or target of a DurationLink connector
+ * @param anchorTerminal
+ * The connection anchor corresponding to the given connector end.
+ * @return
+ * The semantic occurrence specification represented by the given connector end (View), or null
+ * if the view doesn't represent a valid {@link OccurrenceSpecification}.
+ */
+ public static OccurrenceSpecification findSemanticOccurrence(View connectorEnd, String anchorTerminal) {
+ EObject semantic = connectorEnd.getElement();
+ if (semantic instanceof OccurrenceSpecification) {
+ return (OccurrenceSpecification) semantic;
+ } else if (semantic instanceof ExecutionSpecification) {
+ switch (anchorTerminal) {
+ case AnchorConstants.START_TERMINAL:
+ return ((ExecutionSpecification) semantic).getStart();
+ case AnchorConstants.END_TERMINAL:
+ return ((ExecutionSpecification) semantic).getFinish();
+ default:
+ return null;
+ }
+ } else if (semantic instanceof Message) {
+ switch (anchorTerminal) {
+ case AnchorConstants.START_TERMINAL:
+ MessageEnd sendEvent = ((Message) semantic).getSendEvent();
+ return sendEvent instanceof OccurrenceSpecification ? (OccurrenceSpecification) sendEvent : null;
+ case AnchorConstants.END_TERMINAL:
+ MessageEnd receiveEvent = ((Message) semantic).getReceiveEvent();
+ return receiveEvent instanceof OccurrenceSpecification ? (OccurrenceSpecification) receiveEvent : null;
+ default:
+ return null;
+ }
+ }
+ return null;
+ }
+
}
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/SequenceDiagram.elementtypesconfigurations b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/SequenceDiagram.elementtypesconfigurations
index bb84ce2dda9..8fb60f354be 100644
--- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/SequenceDiagram.elementtypesconfigurations
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/SequenceDiagram.elementtypesconfigurations
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
-<elementtypesconfigurations:ElementTypeSetConfiguration xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:elementtypesconfigurations="http://www.eclipse.org/papyrus/infra/elementtypesconfigurations/1.2" xmi:id="_uuwoQENKEeimO7ZhVBpjkg" description="Notational edit-helper advices for the Sequence Diagram." identifier="org.eclipse.papyrus.uml.diagram.sequence.advice" name="Sequence Diagram Advice" metamodelNsURI="http://www.eclipse.org/uml2/5.0.0/UML">
- <adviceBindingsConfigurations xsi:type="elementtypesconfigurations:AdviceBindingConfiguration" xmi:id="_BvoRIENLEeimO7ZhVBpjkg" description="Advice for configuration of the view for the default operand of a new combined fragment." identifier="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.defaultInteractionOperand" inheritance="all" editHelperAdviceClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.DefaultInteractionOperandAdvice">
- <target xsi:type="elementtypesconfigurations:SpecializationTypeConfiguration" href="platform:/plugin/org.eclipse.papyrus.uml.service.types/model/umldi.elementtypesconfigurations#org.eclipse.papyrus.umldi.CombinedFragment_Shape"/>
+<elementtypesconfigurations:ElementTypeSetConfiguration xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:elementtypesconfigurations="http://www.eclipse.org/papyrus/infra/elementtypesconfigurations/1.2" xmi:id="_uuwoQENKEeimO7ZhVBpjkg" description="Notational edit-helper advices for the Sequence Diagram." identifier="org.eclipse.papyrus.uml.diagram.sequence.advice" name="Sequence Diagram Advice" metamodelNsURI="http://www.eclipse.org/uml2/5.0.0/UML">
+ <adviceBindingsConfigurations xmi:type="elementtypesconfigurations:AdviceBindingConfiguration" xmi:id="_BvoRIENLEeimO7ZhVBpjkg" description="Advice for configuration of the view for the default operand of a new combined fragment." identifier="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.defaultInteractionOperand" inheritance="all" editHelperAdviceClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.DefaultInteractionOperandAdvice">
+ <target xmi:type="elementtypesconfigurations:SpecializationTypeConfiguration" href="platform:/plugin/org.eclipse.papyrus.uml.service.types/model/umldi.elementtypesconfigurations#org.eclipse.papyrus.umldi.CombinedFragment_Shape"/>
</adviceBindingsConfigurations>
- <adviceBindingsConfigurations xsi:type="elementtypesconfigurations:AdviceBindingConfiguration" xmi:id="_MdNHsFePEeiIR4R5xrPjKA" description="" identifier="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.interactionoperandviewadvice" inheritance="all" editHelperAdviceClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.InteractionOperandViewAdvice">
- <before xsi:type="elementtypesconfigurations:ExternallyRegisteredAdvice" href="platform:/plugin/org.eclipse.papyrus.infra.gmfdiag.common/model/gmfdiag-common.elementtypesconfigurations#_U91U4F6dEeev1-J3e2LKZA"/>
- <target xsi:type="elementtypesconfigurations:SpecializationTypeConfiguration" href="platform:/plugin/org.eclipse.papyrus.uml.service.types/model/umldi.elementtypesconfigurations#org.eclipse.papyrus.umldi.InteractionOperand_Shape"/>
+ <adviceBindingsConfigurations xmi:type="elementtypesconfigurations:AdviceBindingConfiguration" xmi:id="_MdNHsFePEeiIR4R5xrPjKA" description="" identifier="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.interactionoperandviewadvice" inheritance="all" editHelperAdviceClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.InteractionOperandViewAdvice">
+ <before xmi:type="elementtypesconfigurations:ExternallyRegisteredAdvice" href="platform:/plugin/org.eclipse.papyrus.infra.gmfdiag.common/model/gmfdiag-common.elementtypesconfigurations#_U91U4F6dEeev1-J3e2LKZA"/>
+ <target xmi:type="elementtypesconfigurations:SpecializationTypeConfiguration" href="platform:/plugin/org.eclipse.papyrus.uml.service.types/model/umldi.elementtypesconfigurations#org.eclipse.papyrus.umldi.InteractionOperand_Shape"/>
+ </adviceBindingsConfigurations>
+ <adviceBindingsConfigurations xmi:type="elementtypesconfigurations:AdviceBindingConfiguration" xmi:id="_fKI5cJP_EeiUfLwbDmLfuw" description="Graphical advice for preserving DurationConstraintLink consistency" identifier="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.DurationConstraintLinkAdvice" inheritance="all" editHelperAdviceClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.DurationConstraintLinkAdvice">
+ <target xmi:type="elementtypesconfigurations:MetamodelTypeConfiguration" href="platform:/plugin/org.eclipse.papyrus.uml.service.types/model/uml.elementtypesconfigurations#org.eclipse.papyrus.uml.DurationConstraint"/>
+ </adviceBindingsConfigurations>
+ <adviceBindingsConfigurations xmi:type="elementtypesconfigurations:AdviceBindingConfiguration" xmi:id="_fhVRcJP_EeiUfLwbDmLfuw" description="Graphical advice for preserving DurationObservationLink consistency" identifier="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.DurationObservationLinkAdvice" editHelperAdviceClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.advice.DurationObservationLinkAdvice">
+ <target xmi:type="elementtypesconfigurations:MetamodelTypeConfiguration" href="platform:/plugin/org.eclipse.papyrus.uml.service.types/model/uml.elementtypesconfigurations#org.eclipse.papyrus.uml.DurationObservation"/>
</adviceBindingsConfigurations>
</elementtypesconfigurations:ElementTypeSetConfiguration>

Back to the top