From dd8912cfc63b261b720c02d4bd7628ce18a2e4e4 Mon Sep 17 00:00:00 2001 From: Guillaume Coutable Date: Fri, 14 Aug 2026 21:02:57 +0200 Subject: [PATCH] [2404] Add the support for PortDefinition and PortUsage item inherited border nodes Bug: https://github.com/eclipse-syson/syson/issues/2404 Signed-off-by: Guillaume Coutable --- CHANGELOG.adoc | 1 + .../GVCompartmentItemInheritanceTests.java | 6 +++--- .../DefinitionNodeDescriptionProvider.java | 1 + .../nodes/UsageNodeDescriptionProvider.java | 1 + ...e-notes-port-inherited-item-border-nodes.png | Bin 0 -> 20140 bytes .../pages/release-notes/2026.9.0.adoc | 3 +++ 6 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 doc/content/modules/user-manual/assets/images/release-notes-port-inherited-item-border-nodes.png diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index db32eba6f0..6e572cc616 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -82,6 +82,7 @@ It is also now possible to create new concerns using the _New Concern_ tool from A requirement derivation is a `ConnectionUsage` annotated with the `#derivation` metadata or typed by `DerivationConnections::Derivation`. The edge goes from the derived requirement to the original one and is displayed as a dashed `«derive»` line, so it can be distinguished from a `«satisfy»` edge. - https://github.com/eclipse-syson/syson/issues/2403[#2403] [diagrams] Add support for the inheritance of `ItemUsage` border nodes on `ActionDefinition` and `ActionUsage` graphical nodes. +- https://github.com/eclipse-syson/syson/issues/2404[#2404] [diagrams] Add support for the inheritance of `ItemUsage` border nodes on `PortDefinition` and `PortUsage` graphical nodes. == v2026.7.0 diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/inheritance/GVCompartmentItemInheritanceTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/inheritance/GVCompartmentItemInheritanceTests.java index d1ed0c51dc..4f62af67a6 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/inheritance/GVCompartmentItemInheritanceTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/inheritance/GVCompartmentItemInheritanceTests.java @@ -193,9 +193,9 @@ private static Stream itemsCompartmentItemInheritanceArguments() { Arguments.of(ACTION_USAGE_ARGUMENT, nestedItemWithBorderNode, ACTION_USAGE_ARGUMENT, SUBSETTING_ARGUMENT.withExtraBorderNodes(1)), Arguments.of(ACTION_USAGE_ARGUMENT, nestedItemWithBorderNode, ACTION_USAGE_ARGUMENT, REFERENCE_SUBSETTING_ARGUMENT.withExtraBorderNodes(1)), Arguments.of(ACTION_USAGE_ARGUMENT, nestedItemWithBorderNode, ACTION_USAGE_ARGUMENT, REDEFINITION_ARGUMENT.withExtraBorderNodes(1)), - Arguments.of(PORT_USAGE_ARGUMENT, nestedItemWithBorderNode, PORT_USAGE_ARGUMENT, SUBSETTING_ARGUMENT), - Arguments.of(PORT_USAGE_ARGUMENT, nestedItemWithBorderNode, PORT_USAGE_ARGUMENT, REFERENCE_SUBSETTING_ARGUMENT), - Arguments.of(PORT_DEFINITION_ARGUMENT, nestedItemWithBorderNode, PORT_DEFINITION_ARGUMENT, SUBCLASSIFICATION_ARGUMENT) + Arguments.of(PORT_USAGE_ARGUMENT, nestedItemWithBorderNode, PORT_USAGE_ARGUMENT, SUBSETTING_ARGUMENT.withExtraBorderNodes(1)), + Arguments.of(PORT_USAGE_ARGUMENT, nestedItemWithBorderNode, PORT_USAGE_ARGUMENT, REFERENCE_SUBSETTING_ARGUMENT.withExtraBorderNodes(1)), + Arguments.of(PORT_DEFINITION_ARGUMENT, nestedItemWithBorderNode, PORT_DEFINITION_ARGUMENT, SUBCLASSIFICATION_ARGUMENT.withExtraBorderNodes(1)) ); } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/DefinitionNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/DefinitionNodeDescriptionProvider.java index 799af72e2c..34141c44a3 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/DefinitionNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/DefinitionNodeDescriptionProvider.java @@ -84,6 +84,7 @@ protected Set getReusedBorderNodes(IViewDiagramElementFinder ca cache.getNodeDescription(this.getDescriptionNameGenerator().getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getReferenceUsage())).ifPresent(borderNodes::add); } else if (SysmlPackage.eINSTANCE.getPortDefinition().equals(this.eClass)) { cache.getNodeDescription(this.getDescriptionNameGenerator().getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedItem())).ifPresent(borderNodes::add); + cache.getNodeDescription(this.getDescriptionNameGenerator().getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedItem())).ifPresent(borderNodes::add); } return borderNodes; } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java index edafcb388e..bc91ce042c 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java @@ -121,6 +121,7 @@ protected Set getReusedBorderNodes(IViewDiagramElementFinder ca cache.getNodeDescription(this.getDescriptionNameGenerator().getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getReferenceUsage())).ifPresent(borderNodes::add); } else if (SysmlPackage.eINSTANCE.getPortUsage().equals(this.eClass)) { cache.getNodeDescription(this.getDescriptionNameGenerator().getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem())).ifPresent(borderNodes::add); + cache.getNodeDescription(this.getDescriptionNameGenerator().getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem())).ifPresent(borderNodes::add); } return borderNodes; } diff --git a/doc/content/modules/user-manual/assets/images/release-notes-port-inherited-item-border-nodes.png b/doc/content/modules/user-manual/assets/images/release-notes-port-inherited-item-border-nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8f07a411830e1eac6d3d25b09c28016179cab9 GIT binary patch literal 20140 zcmce;c|4Tw+c&OHMT>~S*ehES#+IEndnrqHW*GY#vTsEt85G&KMA=E!7&OUD_NC0& zm9fNF8jNLZzjM_6y+8N;JkP(sdevOKX0GczkMmgH$NQM5ySf^uPH>!{p`kgYrFm1I zhUO>|Tz@=93;vHj7i0ro4teWqT&F4P=9&XP9C5gI`x*^RMcm09>!aZ3Y2CbL=x?<+#^}%GletN1jh+pEP2ATjW?s}HkTNdMRFO`1sU)>1 zVKgQqhFf3z6rOPUVs*C+Ga1DqO}k@y0dD$v;_PMjfD*BB&v#tLr~KBBWqf*CsZqpg z5?dr-zgG_*!Rh~ALQf+P{k^0Om-u`2 z>FWQlH+{&u)-bWFyS_9gqUgKuqC9w7#H&w@O#(u%{tNpy+3FJB(l2voN=WtP{&w@e zLD(8t@i`jmYDFibgtA_ghwTzq)@z$BFT8w)`lTiwU)#9ow$ilGct>Ru%_s?OQ-Do% z$P!)-Sq_?>O1P7Rh?Q55RhYjhzgYEcYQDHU$)=)UPxA;6EhF`=x5cu1I^Nw*M{1&c z7tKB{eCU`$)A1U5(9+zV&R5+n44%`0#mhF%-ChZ2Lw!nlw9_foQy>e({4gBI_3D|1 z`J&>fK}1~Q25MFr!+e&e_qk*$5=AccNF>Cmj&FtmF>msLbLq{~FMP%2H|mKA%%Y)r z`SK+b!8KYu_~*%aG4PfY>Um0^58>|V?$!<1{24i5Nz>cER8JHOAQ!_#vw=jwZ-6MM zcM7IZC{x_a{*g-L?*`!G51&nW$vb&?B(L_U!p4AN_pTh=?qyHNlDF6A<3e8(?x++l z{X-)+8noQ#wbrN6QQJfo^6YK21~$lvsj4XⅈATc^J+kXh(){>2 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

    `Y({4^*A*BR*DfE6DZ*m`Uky}auF3XXaV zYvAa?M!`{?XcJWyAB}8Bx3}dX4|#43}uBUl2Qa-$*%>NwUjj_d61bJ z%IX0#75l@5Pa4_Vc#LW(|L5`z(GY9D^&y82Fb-yVFyYdVhID`#tN&!x(Z?~8vI2*3 zu3xHKBvZwECI%dI^Nh^n8gF}bUo-_)5PM5A&ah@8XuVE1ng1j z9Q=QMVFbY2kks#-0pD;_4BmF6%C3VoRw(_*|9T5(rM5^yq15k4Ir4xy98!(90#n8R zUomI@)6^Bl@f#frQ72Ou%Va5H;}{#IgPIf~1;RwL(Uk&Gh7pPbCak)uvvf7k5?#bDn$e zIp6Qc|9Mj)c9h{DQJfQ=e9p%+(MXZr1u7c*{RbD zi;BLlGhKJwc4b4P+aZ)dbxAnXAa)lbo=@JmUN9eV08XfhB^=5;dv;487CsDzxO?No}MG5k64j{uIqz3q{HX_;;nEX#3T4 z8(HdI}lb~_BK zXb`6^AgawUKouxEd8#)_+~UY&&aMAjT91*QeDCH@Q(IuvIW&ws zy&b4E_Wd-`r5#E|%yb~7X*RVII6rq{ogHIiqoZ>583dgn`o@m0Ovh`ffq!SP^WFvK z(j#ykM1!)N@(WE6@0|<)R#EBO27n+Ld0fwN0sYknKzy)GtS?N+q5nEl@Sg!6^ewrj zrY4HXq=G(-Zw?j~gn)sC*7Z*mP%&~U3ij4ZWwQNb1qx>zxx|?Y6>x>EB``=-UMA!m z`-lvL9)ik3$9nrbR#)6}?oc6Q1yg+~c0Vv338r#Aqa*hLpd)Gpz#^tuZ#d8&Iq(KW@{}Q=AOcn_s8!}a#57?{P}MGihAiFcY+@LB*-!U$POEtL z>)_G^0-xhIOA_c;rY;jk_*)$v#yPDzf|PZkn#E!bq87CZYOr5XxPygOk@kdSZRz}E zC26Qx+wf`23|TRd?^#}$S0urJE9jN>_m2Udp&tD4%$QA1A66o{el|dx?r!C-BqChN z+803bD12!OHL&xR{IA>Ckci$*sCa$97lsz|-Tp;G(4=^Pc-zjS*6#3DG@