Skip to content

Commit

Permalink
[fix] Start and Done prevent succession removal when removed
Browse files Browse the repository at this point in the history
Start and Done special actions break the automatic cleanup of succession
edge when they are deleted from the diagram.

+ Avoid creation of Dependency edge tool on those actions.

Bug: eclipse-syson#269
Signed-off-by: Jerome Gout <jerome.gout@obeosoft.com>
  • Loading branch information
jerome-obeo committed Jun 5, 2024
1 parent 4ac9634 commit d4751c5
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
package org.eclipse.syson.services;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

Expand Down Expand Up @@ -116,8 +117,7 @@ public Set<EObject> caseSuccession(Succession object) {
if (this.eStructuralFeature.equals(SysmlPackage.eINSTANCE.getRelationship_Target())
|| this.eStructuralFeature.equals(SysmlPackage.eINSTANCE.getRelationship_Source())) {
// Handle the case where the succession source or target has already been deleted
if ((!object.getSource().isEmpty() && object.getSource().get(0).getOwner() == null)
|| (!object.getTarget().isEmpty() && object.getTarget().get(0).getOwner() == null)) {
if (this.hasBeenAlreadyDeleted(object.getSource()) || this.hasBeenAlreadyDeleted(object.getTarget())) {
return relatedElements;
}
relatedElements.add(object);
Expand All @@ -133,4 +133,8 @@ public Set<EObject> caseSuccession(Succession object) {
}
return relatedElements;
}

private boolean hasBeenAlreadyDeleted(List<Element> ends) {
return !ends.isEmpty() && !(ends.get(0) instanceof Membership) && ends.get(0).getOwner() == null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.eclipse.sirius.components.view.diagram.EdgeTool;
import org.eclipse.sirius.components.view.diagram.NodeDescription;
import org.eclipse.syson.diagram.common.view.nodes.DoneActionNodeDescriptionProvider;
import org.eclipse.syson.diagram.common.view.nodes.StartActionNodeDescriptionProvider;
import org.eclipse.syson.sysml.AcceptActionUsage;
import org.eclipse.syson.sysml.ActionUsage;
import org.eclipse.syson.sysml.AllocationUsage;
Expand Down Expand Up @@ -255,10 +256,15 @@ public List<EdgeTool> caseStateUsage(StateUsage object) {
@Override
public List<EdgeTool> caseUsage(Usage object) {
var edgeTools = new ArrayList<EdgeTool>();
edgeTools.add(this.edgeToolService.createDependencyEdgeTool(this.allNodeDescriptions));
// special actions (such as Start or Done) should not be considered to create edges.
var targetDescriptions = this.allNodeDescriptions.stream()
.filter(nodeDesc -> !this.nameGenerator.getNodeName(StartActionNodeDescriptionProvider.START_ACTION_NAME).equals(nodeDesc.getName()) &&
!this.nameGenerator.getNodeName(DoneActionNodeDescriptionProvider.DONE_ACTION_NAME).equals(nodeDesc.getName()))
.toList();
edgeTools.add(this.edgeToolService.createDependencyEdgeTool(targetDescriptions));
edgeTools.add(this.edgeToolService.createRedefinitionEdgeTool(List.of(this.nodeDescription)));
edgeTools.add(this.edgeToolService.createSubsettingEdgeTool(List.of(this.nodeDescription)));
edgeTools.add(this.edgeToolService.createAllocateEdgeTool(this.allNodeDescriptions));
edgeTools.add(this.edgeToolService.createAllocateEdgeTool(targetDescriptions));
var definitionNodeDescription = this.edgeToolService.getNodeDescription(this.edgeToolService.getDefinitionFromUsage(object));
if (definitionNodeDescription.isPresent()) {
edgeTools.add(this.edgeToolService.createFeatureTypingEdgeTool(List.of(definitionNodeDescription.get())));
Expand Down

0 comments on commit d4751c5

Please sign in to comment.