Skip to content

Commit 05d3587

Browse files
froueneAxelRICHARD
authored andcommitted
[1581] Add support for redefining inherited port usages in diagrams
Bug: #1581 Signed-off-by: Florian ROUËNÉ <florian.rouene@obeosoft.com>
1 parent 1aad707 commit 05d3587

15 files changed

Lines changed: 603 additions & 67 deletions

File tree

CHANGELOG.adoc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919

2020
=== New features
2121

22-
- https://github.com/eclipse-syson/syson/issues/1581[#1581] [diagrams] Display inherited `PortUsages` as border nodes in diagrams
23-
- https://github.com/eclipse-syson/syson/issues/1589[#1589] [explorer] Add a filter to hide expose elements in `ViewUsage`
22+
- https://github.com/eclipse-syson/syson/issues/1581[#1581] [diagrams] Display inherited `PortUsages` as graphical border nodes in diagrams.
23+
- https://github.com/eclipse-syson/syson/issues/1581[#1581] [diagrams] Redefine inherited `PortUsages` when connected as graphical border nodes.
24+
- https://github.com/eclipse-syson/syson/issues/1589[#1589] [explorer] Add a filter to hide expose elements in `ViewUsage`.
2425

2526
== v2025.10.0
2627

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVInheritedPortTests.java

Lines changed: 256 additions & 6 deletions
Large diffs are not rendered by default.

backend/application/syson-application/src/test/resources/scripts/database-content/GeneralView-InheritedPort.sql

Lines changed: 3 additions & 3 deletions
Large diffs are not rendered by default.

backend/services/syson-services/src/main/java/org/eclipse/syson/services/ToolService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ public boolean removeFromExposedElements(Element element, Node selectedNode, IEd
289289

290290
protected Node getParentNode(IDiagramElement diagramElement, Node nodeContainer) {
291291
List<Node> nodes = nodeContainer.getChildNodes();
292+
nodes.addAll(nodeContainer.getBorderNodes());
292293
if (nodes.contains(diagramElement)) {
293294
return nodeContainer;
294295
}

backend/services/syson-services/src/main/java/org/eclipse/syson/util/AQLConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class AQLConstants {
2323

2424
public static final String AQL_SELF = "aql:self";
2525

26+
public static final String SELF = "self";
27+
2628
public static final String AQL_TRUE = "aql:true";
2729

2830
public static final String AQL_FALSE = "aql:false";

backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/AbstractPortUsageBorderNodeDescriptionProvider.java

Lines changed: 15 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.List;
1616
import java.util.Objects;
1717

18-
import org.eclipse.sirius.components.diagrams.description.EdgeDescription;
1918
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
2019
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
2120
import org.eclipse.sirius.components.view.diagram.ConditionalNodeStyle;
@@ -41,6 +40,8 @@
4140
*/
4241
public abstract class AbstractPortUsageBorderNodeDescriptionProvider extends AbstractNodeDescriptionProvider {
4342

43+
protected static final String REDEFINE_PORT_PREFIX_TOOL_NAME = "Redefine Port And ";
44+
4445
protected final IDescriptionNameGenerator nameGenerator;
4546

4647
public AbstractPortUsageBorderNodeDescriptionProvider(IColorProvider colorProvider, IDescriptionNameGenerator nameGenerator) {
@@ -55,6 +56,17 @@ public AbstractPortUsageBorderNodeDescriptionProvider(IColorProvider colorProvid
5556
*/
5657
protected abstract String getSemanticCandidatesExpression();
5758

59+
/**
60+
* Implementers should provide the list of edge tool descriptions used inside this {@link NodeDescription}.
61+
*
62+
* @param cache
63+
* the cache used to retrieve node descriptions.
64+
* @param nodeDescription
65+
* the actual Usage node description.
66+
* @return the list of edge tool descriptions.
67+
*/
68+
protected abstract List<EdgeTool> getEdgeTools(IViewDiagramElementFinder cache, NodeDescription nodeDescription);
69+
5870
protected abstract OutsideLabelDescription createOutsideLabelDescription();
5971

6072
protected abstract String getName();
@@ -145,56 +157,8 @@ private NodePalette createNodePalette(IViewDiagramElementFinder cache, NodeDescr
145157
.build();
146158
}
147159

148-
private List<EdgeTool> getEdgeTools(IViewDiagramElementFinder cache, NodeDescription nodeDescription) {
149-
if (cache.getNodeDescription(this.getName()).isPresent()) {
150-
NodeDescription portBorderNode = cache.getNodeDescription(this.getName()).get();
151-
return List.of(this.createBindingConnectorAsUsageEdgeTool(List.of(nodeDescription, portBorderNode)),
152-
this.createInterfaceUsageEdgeTool(List.of(nodeDescription, portBorderNode)),
153-
this.createFlowUsageEdgeTool(List.of(nodeDescription, portBorderNode)));
154-
}
155-
return List.of();
156-
}
157-
158-
private EdgeTool createBindingConnectorAsUsageEdgeTool(List<NodeDescription> targetElementDescriptions) {
159-
var builder = this.diagramBuilderHelper.newEdgeTool();
160-
161-
var body = this.viewBuilderHelper.newChangeContext()
162-
.expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createBindingConnectorAsUsage", EdgeDescription.SEMANTIC_EDGE_TARGET));
163-
164-
return builder
165-
.name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getBindingConnectorAsUsage()) + " (bind)")
166-
.iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getBindingConnectorAsUsage().getName() + ".svg")
167-
.body(body.build())
168-
.targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new))
169-
.build();
170-
}
171-
172-
private EdgeTool createInterfaceUsageEdgeTool(List<NodeDescription> targetElementDescriptions) {
173-
var builder = this.diagramBuilderHelper.newEdgeTool();
174-
175-
var body = this.viewBuilderHelper.newChangeContext()
176-
.expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createInterfaceUsage", EdgeDescription.SEMANTIC_EDGE_TARGET));
177-
178-
return builder
179-
.name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getInterfaceUsage()) + " (connect)")
180-
.iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getInterfaceUsage().getName() + ".svg")
181-
.body(body.build())
182-
.targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new))
183-
.build();
184-
}
185-
186-
private EdgeTool createFlowUsageEdgeTool(List<NodeDescription> targetElementDescriptions) {
187-
var builder = this.diagramBuilderHelper.newEdgeTool();
188-
189-
var body = this.viewBuilderHelper.newChangeContext()
190-
.expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createFlowUsage", EdgeDescription.SEMANTIC_EDGE_TARGET));
191-
192-
return builder
193-
.name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getFlowUsage()) + " (flow)")
194-
.iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getFlowUsage().getName() + ".svg")
195-
.body(body.build())
196-
.targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new))
197-
.build();
160+
protected String getToolIconURLsExpression(String elementName) {
161+
return "/icons/full/obj16/" + elementName + ".svg";
198162
}
199163

200164
}

backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewToolService.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.eclipse.sirius.components.core.api.IObjectSearchService;
4343
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
4444
import org.eclipse.sirius.components.diagrams.Diagram;
45+
import org.eclipse.sirius.components.diagrams.IDiagramElement;
4546
import org.eclipse.sirius.components.diagrams.Node;
4647
import org.eclipse.sirius.components.diagrams.ViewCreationRequest;
4748
import org.eclipse.sirius.components.diagrams.ViewDeletionRequest;
@@ -70,6 +71,7 @@
7071
import org.eclipse.syson.sysml.Definition;
7172
import org.eclipse.syson.sysml.Documentation;
7273
import org.eclipse.syson.sysml.Element;
74+
import org.eclipse.syson.sysml.Feature;
7375
import org.eclipse.syson.sysml.FeatureMembership;
7476
import org.eclipse.syson.sysml.Membership;
7577
import org.eclipse.syson.sysml.Namespace;
@@ -78,6 +80,8 @@
7880
import org.eclipse.syson.sysml.Package;
7981
import org.eclipse.syson.sysml.PartDefinition;
8082
import org.eclipse.syson.sysml.PartUsage;
83+
import org.eclipse.syson.sysml.PortUsage;
84+
import org.eclipse.syson.sysml.Redefinition;
8185
import org.eclipse.syson.sysml.RequirementConstraintKind;
8286
import org.eclipse.syson.sysml.RequirementDefinition;
8387
import org.eclipse.syson.sysml.RequirementUsage;
@@ -746,6 +750,44 @@ public List<? extends Object> getActionReferenceSelectionDialogChildren(Object s
746750
return this.getChildrenWithInstancesOf(selectionDialogTreeElement, SysmlPackage.eINSTANCE.getActionUsage());
747751
}
748752

753+
/**
754+
* Redefine an inherited port.
755+
*
756+
* @param inheritedFeature
757+
* semantic inherited port
758+
* @param inheritedGraphicalPort
759+
* graphical inherited port
760+
* @param editingContext
761+
* the (non-{@code null}) {@link IEditingContext}.
762+
* @param diagramContext
763+
* the {@link DiagramContext} of the tool. It corresponds to a variable accessible from the variable
764+
* manager.
765+
* @return the new {@link PartUsage} that redefines the inherited one.
766+
*/
767+
public PortUsage redefineInheritedPort(Feature inheritedFeature, IDiagramElement inheritedGraphicalPort, IEditingContext editingContext, DiagramContext diagramContext) {
768+
Object parentNode = this.getParentNode(inheritedFeature, inheritedGraphicalPort, diagramContext);
769+
if (parentNode instanceof Node node) {
770+
var type = this.objectSearchService.getObject(editingContext, node.getTargetObjectId())
771+
.filter(Type.class::isInstance)
772+
.map(Type.class::cast)
773+
.orElse(null);
774+
if (type != null) {
775+
PortUsage portUsage = SysmlFactory.eINSTANCE.createPortUsage();
776+
Membership membership = SysmlFactory.eINSTANCE.createFeatureMembership();
777+
membership.getOwnedRelatedElement().add(portUsage);
778+
type.getOwnedRelationship().add(membership);
779+
780+
Redefinition redefinition = SysmlFactory.eINSTANCE.createRedefinition();
781+
redefinition.setRedefinedFeature(inheritedFeature);
782+
redefinition.setRedefiningFeature(portUsage);
783+
784+
portUsage.getOwnedRelationship().add(redefinition);
785+
return portUsage;
786+
}
787+
}
788+
return null;
789+
}
790+
749791
/**
750792
* Drops the provided {@code sourceElement} from the explorer on the given {@code selectedNode} on the diagram.
751793
* <p>

backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/edges/BindingConnectorAsUsageEdgeDescriptionProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ protected List<NodeDescription> getSourceNodes(IViewDiagramElementFinder cache)
4949
List<NodeDescription> nodes = new ArrayList<>();
5050
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage())).ifPresent(nodes::add);
5151
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
52+
cache.getNodeDescription(this.descriptionNameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
5253
return nodes;
5354
}
5455

@@ -57,6 +58,7 @@ protected List<NodeDescription> getTargetNodes(IViewDiagramElementFinder cache)
5758
List<NodeDescription> nodes = new ArrayList<>();
5859
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage())).ifPresent(nodes::add);
5960
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
61+
cache.getNodeDescription(this.descriptionNameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
6062
return nodes;
6163
}
6264
}

backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/edges/FeatureValueEdgeDescriptionProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ protected List<NodeDescription> getSourceNodes(IViewDiagramElementFinder cache)
4949
List<NodeDescription> nodes = new ArrayList<>();
5050
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage())).ifPresent(nodes::add);
5151
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
52+
cache.getNodeDescription(this.descriptionNameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
5253
return nodes;
5354
}
5455

@@ -57,6 +58,7 @@ protected List<NodeDescription> getTargetNodes(IViewDiagramElementFinder cache)
5758
List<NodeDescription> nodes = new ArrayList<>();
5859
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage())).ifPresent(nodes::add);
5960
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
61+
cache.getNodeDescription(this.descriptionNameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(nodes::add);
6062
return nodes;
6163
}
6264

backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/edges/FlowUsageEdgeDescriptionProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ protected List<NodeDescription> getSourceNodes(IViewDiagramElementFinder cache)
4949
var sources = new ArrayList<NodeDescription>();
5050

5151
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(sources::add);
52+
cache.getNodeDescription(this.descriptionNameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(sources::add);
5253
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage())).ifPresent(sources::add);
5354
return sources;
5455
}
@@ -57,6 +58,7 @@ protected List<NodeDescription> getSourceNodes(IViewDiagramElementFinder cache)
5758
protected List<NodeDescription> getTargetNodes(IViewDiagramElementFinder cache) {
5859
var targets = new ArrayList<NodeDescription>();
5960
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(targets::add);
61+
cache.getNodeDescription(this.descriptionNameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(targets::add);
6062
cache.getNodeDescription(this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage())).ifPresent(targets::add);
6163
return targets;
6264
}

0 commit comments

Comments
 (0)