diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 26a654f08..1f332a4d1 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -63,6 +63,9 @@ Also add a _New Satisfy Requirement_ graphical edge tool between `Feature` grap As a result, the application won't start if a service call is constructed with an invalid number of arguments. - https://github.com/eclipse-syson/syson/issues/1988[#1988] [syson] Extract Elasticsearch container initialization in a dedicated abstract test class. Integration tests that require Elasticsearch now need to extend `AbstractIntegrationTestsWithElasticsearch`. +- https://github.com/eclipse-syson/syson/issues/1945[#1945] [diagrams] Add ends compartment on `AllocationDefinition` and `ConnectionDefinition` graphical nodes +Newly created `AllocationDefinition` and `ConnectionDefinition` graphical nodes now have two initial _connection ends_, named `source` and `target`. +Additional ends can be created using the _New end_ tool (which replaces the _New Part as end_ previously available only on `AllocationDefinition` graphical nodes). === New features diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/checkers/DiagramCheckerService.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/checkers/DiagramCheckerService.java index a5b503176..1f8997790 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/checkers/DiagramCheckerService.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/checkers/DiagramCheckerService.java @@ -59,14 +59,15 @@ public DiagramCheckerService(DiagramComparator diagramComparator, IDescriptionNa * the EClass of the expected child node * @param compartmentCount * the expected number of compartments + * @param newNodesCount + * the expected total number of new nodes * @return a consumer that performs the graphical check */ public Consumer childNodeGraphicalChecker(AtomicReference previousDiagram, DiagramDescriptionIdProvider diagramDescriptionIdProvider, String parentLabel, EClass childEClass, - int compartmentCount) { + int compartmentCount, int newNodesCount) { return assertRefreshedDiagramThat(newDiagram -> { - int createdNodesExpectedCount = 1 + compartmentCount; new CheckDiagramElementCount(this.diagramComparator) - .hasNewNodeCount(createdNodesExpectedCount) + .hasNewNodeCount(newNodesCount) .hasNewEdgeCount(0) .check(previousDiagram.get(), newDiagram); @@ -199,6 +200,7 @@ public void checkDiagram(IDiagramChecker diagramChecker, AtomicReference checkDiagram(IDiagramChecker diagramChecker, AtomicReference previousDiagram) { return object -> Optional.of(object) .filter(DiagramRefreshedEventPayload.class::isInstance) diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java index 98ddce5ad..120d81e52 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java @@ -113,7 +113,7 @@ public void setUp() { private static Stream partUsageNodeParameters() { return Stream.of( Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), "part1", 11), - Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), "allocation1", 4), + Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), "allocation1", 6), Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), "interface1", 6)); } diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java index c5366b695..adaed8088 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java @@ -195,41 +195,42 @@ private static Stream itemUsageBorderAndChildNodeParameters() { private static Stream packageChildNodeParameters() { EReference ownedMember = SysmlPackage.eINSTANCE.getNamespace_OwnedMember(); return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getAttributeDefinition(), ownedMember, 2), - Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), ownedMember, 3), - Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), ownedMember, 4), - Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), ownedMember, 3), - Arguments.of(SysmlPackage.eINSTANCE.getActionDefinition(), ownedMember, 6), - Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), ownedMember, 2), - Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), ownedMember, 7), - Arguments.of(SysmlPackage.eINSTANCE.getAssignmentActionUsage(), ownedMember, 1), - Arguments.of(SysmlPackage.eINSTANCE.getConcernDefinition(), ownedMember, 8), - Arguments.of(SysmlPackage.eINSTANCE.getConcernUsage(), ownedMember, 8), - Arguments.of(SysmlPackage.eINSTANCE.getConstraintDefinition(), ownedMember, 2), - Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), ownedMember, 4), - Arguments.of(SysmlPackage.eINSTANCE.getEnumerationDefinition(), ownedMember, 2), - Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), ownedMember, 6), - Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), ownedMember, 4), - Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), ownedMember, 2), - Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), ownedMember, 4), - Arguments.of(SysmlPackage.eINSTANCE.getMetadataDefinition(), ownedMember, 3), - Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), ownedMember, 3), - Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), ownedMember, 2), + Arguments.of(SysmlPackage.eINSTANCE.getAttributeDefinition(), ownedMember, 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), ownedMember, 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), ownedMember, 4, 2), + Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), ownedMember, 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getActionDefinition(), ownedMember, 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), ownedMember, 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), ownedMember, 7, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAssignmentActionUsage(), ownedMember, 1, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConcernDefinition(), ownedMember, 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConcernUsage(), ownedMember, 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConstraintDefinition(), ownedMember, 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), ownedMember, 4, 0), + Arguments.of(SysmlPackage.eINSTANCE.getEnumerationDefinition(), ownedMember, 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), ownedMember, 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), ownedMember, 4, 0), + Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), ownedMember, 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), ownedMember, 4, 0), + Arguments.of(SysmlPackage.eINSTANCE.getMetadataDefinition(), ownedMember, 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), ownedMember, 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), ownedMember, 2, 0), // A package doesn't have a compartment: it is handled as a custom node - Arguments.of(SysmlPackage.eINSTANCE.getPackage(), ownedMember, 0), - Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), ownedMember, 11), - Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), ownedMember, 11), - Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), ownedMember, 5), - Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), ownedMember, 5), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 8), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 8), - Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), ownedMember, 5), - Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), ownedMember, 7), - Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), ownedMember, 8), - Arguments.of(SysmlPackage.eINSTANCE.getStateDefinition(), ownedMember, 6), - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), ownedMember, 6), - Arguments.of(SysmlPackage.eINSTANCE.getNamespaceImport(), SysmlPackage.eINSTANCE.getNamespace_OwnedImport(), 0)) - .map(TestNameGenerator::namedArguments); + Arguments.of(SysmlPackage.eINSTANCE.getPackage(), ownedMember, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), ownedMember, 11, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), ownedMember, 11, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), ownedMember, 5, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), ownedMember, 5, 0), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), ownedMember, 5, 0), + Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), ownedMember, 7, 0), + Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), ownedMember, 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getStateDefinition(), ownedMember, 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), ownedMember, 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getNamespaceImport(), SysmlPackage.eINSTANCE.getNamespace_OwnedImport(), 0, + 0) + ).map(TestNameGenerator::namedArguments); } private static Stream partDefinitionChildNodeParameters() { @@ -701,7 +702,7 @@ public void createItemUsageBorderAndChildNodes(EClass childEClass, String compar @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) @ParameterizedTest @MethodSource("packageChildNodeParameters") - public void createPackageChildNodes(EClass childEClass, EReference containmentReference, int compartmentCount) { + public void createPackageChildNodes(EClass childEClass, EReference containmentReference, int compartmentCount, int additionalNodesCount) { var flux = this.givenSubscriptionToDiagram(); var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, @@ -721,7 +722,8 @@ public void createPackageChildNodes(EClass childEClass, EReference containmentRe List finalVariables = variables; Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, parentLabel, childEClass, finalVariables); - Consumer diagramChecker = this.diagramCheckerService.childNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, parentLabel, childEClass, compartmentCount); + Consumer diagramChecker = this.diagramCheckerService.childNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, parentLabel, childEClass, compartmentCount, + 1 + compartmentCount + additionalNodesCount); Runnable semanticChecker = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass)); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java index 460bdc3cf..dc429b2e2 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java @@ -140,43 +140,44 @@ public class GVTopNodeCreationTests extends AbstractIntegrationTests { private static Stream topNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getAttributeDefinition(), 2, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), 3, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), 3, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), 4, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), 2, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getActionDefinition(), 6, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), 7, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getAssignmentActionUsage(), 1, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getComment(), 0, ViewConstants.DEFAULT_NOTE_HEIGHT, ViewConstants.DEFAULT_NOTE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getConcernDefinition(), 8, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getConcernUsage(), 8, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getConstraintDefinition(), 2, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), 4, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getConnectionDefinition(), 4, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getEnumerationDefinition(), 2, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), 6, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), 6, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), 4, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), 2, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), 4, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getMetadataDefinition(), 3, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), 3, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), 2, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getAttributeDefinition(), 2, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), 3, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), 3, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), 4, 2, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), 2, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getActionDefinition(), 6, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), 7, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getAssignmentActionUsage(), 1, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getComment(), 0, 0, ViewConstants.DEFAULT_NOTE_HEIGHT, ViewConstants.DEFAULT_NOTE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getConcernDefinition(), 8, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getConcernUsage(), 8, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getConstraintDefinition(), 2, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), 4, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getConnectionDefinition(), 5, 2, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getEnumerationDefinition(), 2, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), 6, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), 6, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), 4, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), 2, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), 4, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getMetadataDefinition(), 3, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), 3, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), 2, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), // A package doesn't have a compartment: it is handled as a custom node - Arguments.of(SysmlPackage.eINSTANCE.getPackage(), 0, ViewConstants.DEFAULT_PACKAGE_NODE_HEIGHT, ViewConstants.DEFAULT_PACKAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), 11, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 11, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getStateDefinition(), 6, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), 6, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), - Arguments.of(SysmlPackage.eINSTANCE.getViewUsage(), 0, ViewConstants.DEFAULT_VIEW_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_VIEW_USAGE_NODE_WIDTH) + Arguments.of(SysmlPackage.eINSTANCE.getPackage(), 0, 0, ViewConstants.DEFAULT_PACKAGE_NODE_HEIGHT, ViewConstants.DEFAULT_PACKAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), 11, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 11, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getStateDefinition(), 6, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), 6, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH), + Arguments.of(SysmlPackage.eINSTANCE.getViewUsage(), 0, 0, ViewConstants.DEFAULT_VIEW_USAGE_NODE_HEIGHT, + ViewConstants.DEFAULT_VIEW_USAGE_NODE_WIDTH) ).map(TestNameGenerator::namedArguments); } @@ -193,7 +194,7 @@ public void setUp() { @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @ParameterizedTest @MethodSource("topNodeParameters") - public void createTopNode(EClass eClass, int compartmentCount, int expectedDefaultHeight, int expectedDefaultWidth) { + public void createTopNode(EClass eClass, int compartmentCount, int itemsCount, int expectedDefaultHeight, int expectedDefaultWidth) { var flux = this.givenSubscriptionToDiagram(); AtomicReference diagram = new AtomicReference<>(); @@ -209,7 +210,7 @@ public void createTopNode(EClass eClass, int compartmentCount, int expectedDefau Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); - int createdNodesExpectedCount = 1 + compartmentCount; + int createdNodesExpectedCount = 1 + compartmentCount + itemsCount; new CheckDiagramElementCount(this.diagramComparator) .hasNewEdgeCount(0) .hasNewNodeCount(createdNodesExpectedCount) diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java index dc69089d7..e82243066 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java @@ -152,41 +152,41 @@ public class GVViewUsageTests extends AbstractIntegrationTests { private static Stream childNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), 2), - Arguments.of(SysmlPackage.eINSTANCE.getActionDefinition(), 6), - Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), 7), - Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), 4), - Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), 3), - Arguments.of(SysmlPackage.eINSTANCE.getAssignmentActionUsage(), 1), - Arguments.of(SysmlPackage.eINSTANCE.getAttributeDefinition(), 2), - Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), 3), - Arguments.of(SysmlPackage.eINSTANCE.getConcernDefinition(), 8), - Arguments.of(SysmlPackage.eINSTANCE.getConcernUsage(), 8), - Arguments.of(SysmlPackage.eINSTANCE.getConnectionDefinition(), 4), - Arguments.of(SysmlPackage.eINSTANCE.getConstraintDefinition(), 2), - Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), 4), - Arguments.of(SysmlPackage.eINSTANCE.getEnumerationDefinition(), 2), - Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), 6), - Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), 6), - Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), 4), - Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), 2), - Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), 4), - Arguments.of(SysmlPackage.eINSTANCE.getMetadataDefinition(), 3), - Arguments.of(SysmlPackage.eINSTANCE.getPackage(), 0), - Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), 3), - Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), 2), - Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), 11), - Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 11), - Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5), - Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8), - Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5), - Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7), - Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8), - Arguments.of(SysmlPackage.eINSTANCE.getStateDefinition(), 6), - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), 6), - Arguments.of(SysmlPackage.eINSTANCE.getViewUsage(), 0) + Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getActionDefinition(), 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), 7, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), 4, 2), + Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAssignmentActionUsage(), 1, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAttributeDefinition(), 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConcernDefinition(), 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConcernUsage(), 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConnectionDefinition(), 5, 2), + Arguments.of(SysmlPackage.eINSTANCE.getConstraintDefinition(), 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), 4, 0), + Arguments.of(SysmlPackage.eINSTANCE.getEnumerationDefinition(), 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), 4, 0), + Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), 4, 0), + Arguments.of(SysmlPackage.eINSTANCE.getMetadataDefinition(), 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPackage(), 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), 3, 0), + Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), 2, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), 11, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 11, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0), + Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0), + Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0), + Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0), + Arguments.of(SysmlPackage.eINSTANCE.getStateDefinition(), 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), 6, 0), + Arguments.of(SysmlPackage.eINSTANCE.getViewUsage(), 0, 0) ).map(TestNameGenerator::namedArguments); } @@ -228,7 +228,7 @@ public void tearDown() { @GivenSysONServer({ GeneralViewViewTestProjectData.SCRIPT_PATH }) @ParameterizedTest @MethodSource("childNodeParameters") - public void checkViewUsageChildNodeCreation(EClass eClass, int compartmentCount) { + public void checkViewUsageChildNodeCreation(EClass eClass, int compartmentCount, int additionalNewNodes) { String creationToolId = this.diagramDescriptionIdProvider.getNodeToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getViewUsage()), this.descriptionNameGenerator.getCreationToolName(eClass)); @@ -241,7 +241,7 @@ public void checkViewUsageChildNodeCreation(EClass eClass, int compartmentCount) creationToolId, List.of()); Consumer updatedDiagramConsumer = assertRefreshedDiagramThat(newDiagram -> { - int createdNodesExpectedCount = 1 + compartmentCount; + int createdNodesExpectedCount = 1 + compartmentCount + additionalNewNodes; new CheckDiagramElementCount(this.diagramComparator) .hasNewEdgeCount(0) .hasNewNodeCount(createdNodesExpectedCount) diff --git a/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/ElementInitializerSwitch.java b/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/ElementInitializerSwitch.java index 1f87bc1fc..3dc540650 100644 --- a/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/ElementInitializerSwitch.java +++ b/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/ElementInitializerSwitch.java @@ -21,6 +21,7 @@ import org.eclipse.syson.sysml.BindingConnectorAsUsage; import org.eclipse.syson.sysml.Comment; import org.eclipse.syson.sysml.ConjugatedPortDefinition; +import org.eclipse.syson.sysml.ConnectionDefinition; import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Dependency; import org.eclipse.syson.sysml.Documentation; @@ -110,6 +111,24 @@ public Element caseComment(Comment object) { return object; } + @Override + public Element caseConnectionDefinition(ConnectionDefinition object) { + // 8.3.13.3 ConnectionDefinition: "A ConnectionDefinition always has isSufficient = true." + object.setIsSufficient(true); + this.addConnectionEnd(object, "source"); + this.addConnectionEnd(object, "target"); + return null; + } + + private void addConnectionEnd(ConnectionDefinition connectionDefinition, String name) { + var referenceUsage = SysmlFactory.eINSTANCE.createReferenceUsage(); + referenceUsage.setDeclaredName(name); + referenceUsage.setIsEnd(true); + var featureMembership = SysmlFactory.eINSTANCE.createFeatureMembership(); + featureMembership.getOwnedRelatedElement().add(referenceUsage); + connectionDefinition.getOwnedRelationship().add(featureMembership); + } + @Override public Element caseTextualRepresentation(TextualRepresentation object) { object.setBody("add textual representation here"); diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewCreateService.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewCreateService.java index da9d2e769..87533d7d2 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewCreateService.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewCreateService.java @@ -36,11 +36,11 @@ import org.eclipse.syson.sysml.AcceptActionUsage; import org.eclipse.syson.sysml.ActionDefinition; import org.eclipse.syson.sysml.ActionUsage; -import org.eclipse.syson.sysml.AllocationDefinition; import org.eclipse.syson.sysml.AllocationUsage; import org.eclipse.syson.sysml.BindingConnectorAsUsage; import org.eclipse.syson.sysml.CaseDefinition; import org.eclipse.syson.sysml.CaseUsage; +import org.eclipse.syson.sysml.ConnectionDefinition; import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.EndFeatureMembership; @@ -381,31 +381,28 @@ public boolean isEmptyOfActionKindCompartment(Element self, String kind) { } /** - * Create a new Part Usage which is used as the end given Allocation Definition. + * Create a new connection end (a ReferenceUsage) in a given Connection Definition. * * @param self - * the Allocation Definition in which the new end is added. + * the Connection Definition in which the new end is added. * @param endParent - * the owner of the new part usage used as the end. + * the owner of the new part usage used as the end. * @return the self modified element is returned */ - public Element createPartUsageAsAllocationDefinitionEnd(AllocationDefinition self, Element endParent) { - // create the part usage that is used as the end element - PartUsage newPartUsage = SysmlFactory.eINSTANCE.createPartUsage(); - newPartUsage.setDeclaredName(self.getDeclaredName() + "'s end"); - var membership = SysmlFactory.eINSTANCE.createOwningMembership(); - membership.getOwnedRelatedElement().add(newPartUsage); - endParent.getOwnedRelationship().add(membership); - var featureTyping = SysmlFactory.eINSTANCE.createFeatureTyping(); - featureTyping.setType(newPartUsage); + public Element createConnectionDefinitionEnd(ConnectionDefinition self) { + int suffix = self.getOwnedEndFeature().size() + 1; + this.addConnectionEnd(self, "end" + suffix); + return self; + } + + private void addConnectionEnd(ConnectionDefinition connectionDefinition, String name) { var referenceUsage = SysmlFactory.eINSTANCE.createReferenceUsage(); - referenceUsage.setDeclaredName("end"); + new ElementInitializerSwitch().doSwitch(referenceUsage); + referenceUsage.setDeclaredName(name); referenceUsage.setIsEnd(true); - referenceUsage.getOwnedRelationship().add(featureTyping); var featureMembership = SysmlFactory.eINSTANCE.createFeatureMembership(); featureMembership.getOwnedRelatedElement().add(referenceUsage); - self.getOwnedRelationship().add(featureMembership); - return self; + connectionDefinition.getOwnedRelationship().add(featureMembership); } /** diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/AllocationDefinitionEndCompartmentNodeToolProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/ConnectionDefinitionEndCompartmentNodeToolProvider.java similarity index 66% rename from backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/AllocationDefinitionEndCompartmentNodeToolProvider.java rename to backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/ConnectionDefinitionEndCompartmentNodeToolProvider.java index 61106ae00..99afcb8d8 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/AllocationDefinitionEndCompartmentNodeToolProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/ConnectionDefinitionEndCompartmentNodeToolProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2024 Obeo. + * Copyright (c) 2024, 2026 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -12,30 +12,29 @@ *******************************************************************************/ package org.eclipse.syson.diagram.common.view.tools; +import org.eclipse.syson.diagram.common.view.services.ViewCreateService; +import org.eclipse.syson.util.ServiceMethod; + /** - * Node tool provider for creating an Part usage as an end of Allocation definition. + * Node tool provider for creating an end on a Connection definition. * * @author Jerome Gout */ -public class AllocationDefinitionEndCompartmentNodeToolProvider extends AbstractCompartmentNodeToolProvider { - - public AllocationDefinitionEndCompartmentNodeToolProvider() { - super(); - } +public class ConnectionDefinitionEndCompartmentNodeToolProvider extends AbstractCompartmentNodeToolProvider { @Override protected String getServiceCallExpression() { - return "aql:self.createPartUsageAsAllocationDefinitionEnd(self.eContainer().eContainer())"; + return ServiceMethod.of0(ViewCreateService::createConnectionDefinitionEnd).aqlSelf(); } @Override protected String getNodeToolName() { - return "New Part as End"; + return "New end"; } @Override protected String getNodeToolIconURLsExpression() { - return "/icons/full/obj16/PartUsage.svg"; + return "/icons/full/obj16/ReferenceUsage.svg"; } @Override diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java index b93337718..c369dd4ca 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java @@ -100,6 +100,8 @@ import org.eclipse.syson.standard.diagrams.view.nodes.CaseUsageObjectiveRequirementCompartmentNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.CaseUsageSubjectCompartmentNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.CompartmentNodeDescriptionProvider; +import org.eclipse.syson.standard.diagrams.view.nodes.ConnectionDefinitionEndsCompartmentItemNodeDescriptionProvider; +import org.eclipse.syson.standard.diagrams.view.nodes.ConnectionDefinitionEndsCompartmentNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.FakeNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.GeneralViewEmptyDiagramNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.InheritedPortUsageBorderNodeDescriptionProvider; @@ -348,6 +350,7 @@ public RepresentationDescription create(IColorProvider colorProvider) { this.linkCaseActorsCompartment(cache); this.linkCaseObjectiveRequirementCompartment(cache); this.linkAllocationDefinitionEndsCompartment(cache); + this.linkConnectionDefinitionEndsCompartment(cache); this.linkStatesCompartment(cache); this.linkActionParametersCompartment(cache); this.linkPartPerformActionsCompartment(cache); @@ -427,7 +430,7 @@ private List> createAllCompartmentNodeDesc compartmentNodeDescriptionProviders.addAll(this.createCompartmentsForObjectiveRequirement(colorProvider)); // Compartment "ends" (ConnectionEnd) is defined for: - // AllocationDefinition + // AllocationDefinition, ConnectionDefinition compartmentNodeDescriptionProviders.addAll(this.createCompartmentsForConnectionEnd(colorProvider)); // Compartment "actions" (OwnedAction) is defined for: @@ -612,6 +615,12 @@ private List> createCompartmentsForConnect compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getAllocationDefinition(), SysmlPackage.eINSTANCE.getConnectionDefinition_ConnectionEnd(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ConnectionDefinitionEndsCompartmentNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ConnectionDefinitionEndsCompartmentItemNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConnectionDefinition(), + SysmlPackage.eINSTANCE.getConnectionDefinition_ConnectionEnd(), colorProvider, + this.getDescriptionNameGenerator())); + return compartmentNodeDescriptionProviders; } @@ -1052,6 +1061,13 @@ private void linkAllocationDefinitionEndsCompartment(IViewDiagramElementFinder c .ifPresent(allocationDefinitionNodeDescription.getReusedChildNodeDescriptions()::add); } + private void linkConnectionDefinitionEndsCompartment(IViewDiagramElementFinder cache) { + NodeDescription connectionDefinitionNodeDescription = cache.getNodeDescription(this.getDescriptionNameGenerator().getNodeName(SysmlPackage.eINSTANCE.getConnectionDefinition())).get(); + cache.getNodeDescription( + this.getDescriptionNameGenerator().getCompartmentName(SysmlPackage.eINSTANCE.getConnectionDefinition(), SysmlPackage.eINSTANCE.getConnectionDefinition_ConnectionEnd())) + .ifPresent(connectionDefinitionNodeDescription.getReusedChildNodeDescriptions()::add); + } + private void linkStatesCompartment(IViewDiagramElementFinder cache) { NodeDescription stateDefinitionNodeDescription = cache.getNodeDescription(this.getDescriptionNameGenerator().getNodeName(SysmlPackage.eINSTANCE.getStateDefinition())).get(); cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(SysmlPackage.eINSTANCE.getStateDefinition(), diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/AllocationDefinitionEndsCompartmentNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/AllocationDefinitionEndsCompartmentNodeDescriptionProvider.java index b8d0cbcfe..c0ab62cb7 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/AllocationDefinitionEndsCompartmentNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/AllocationDefinitionEndsCompartmentNodeDescriptionProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2024, 2025 Obeo. + * Copyright (c) 2024, 2026 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -20,7 +20,7 @@ import org.eclipse.sirius.components.view.builder.providers.INodeToolProvider; import org.eclipse.sirius.components.view.diagram.NodeDescription; import org.eclipse.syson.diagram.common.view.nodes.AbstractCompartmentNodeDescriptionProvider; -import org.eclipse.syson.diagram.common.view.tools.AllocationDefinitionEndCompartmentNodeToolProvider; +import org.eclipse.syson.diagram.common.view.tools.ConnectionDefinitionEndCompartmentNodeToolProvider; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.util.IDescriptionNameGenerator; @@ -48,7 +48,7 @@ protected String getCustomCompartmentLabel() { @Override protected List getItemCreationToolProviders() { List creationToolProviders = new ArrayList<>(); - creationToolProviders.add(new AllocationDefinitionEndCompartmentNodeToolProvider()); + creationToolProviders.add(new ConnectionDefinitionEndCompartmentNodeToolProvider()); return creationToolProviders; } } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ConnectionDefinitionEndsCompartmentItemNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ConnectionDefinitionEndsCompartmentItemNodeDescriptionProvider.java new file mode 100644 index 000000000..03f83e5dc --- /dev/null +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ConnectionDefinitionEndsCompartmentItemNodeDescriptionProvider.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.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.syson.standard.diagrams.view.nodes; + +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.syson.diagram.common.view.nodes.CompartmentItemNodeDescriptionProvider; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.util.AQLConstants; +import org.eclipse.syson.util.IDescriptionNameGenerator; + +/** + * Used to create a Connection Definition ends compartment item node description. + *

+ * The connectionEnds reference of connection definition returns inherited elements from standard libraries, we don't + * want that. + *

+ * + * @author pcdavid + */ +public class ConnectionDefinitionEndsCompartmentItemNodeDescriptionProvider extends CompartmentItemNodeDescriptionProvider { + + public ConnectionDefinitionEndsCompartmentItemNodeDescriptionProvider(IColorProvider colorProvider, IDescriptionNameGenerator nameGenerator) { + super(SysmlPackage.eINSTANCE.getConnectionDefinition(), SysmlPackage.eINSTANCE.getConnectionDefinition_ConnectionEnd(), colorProvider, nameGenerator); + } + + @Override + protected String getSemanticCandidateExpression() { + return AQLConstants.AQL_SELF + "." + this.eReference.getName() + "->select(endElt | not endElt.isFromStandardLibrary())"; + } +} diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ConnectionDefinitionEndsCompartmentNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ConnectionDefinitionEndsCompartmentNodeDescriptionProvider.java new file mode 100644 index 000000000..0a14e270b --- /dev/null +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ConnectionDefinitionEndsCompartmentNodeDescriptionProvider.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.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.syson.standard.diagrams.view.nodes; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.INodeToolProvider; +import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.syson.diagram.common.view.nodes.AbstractCompartmentNodeDescriptionProvider; +import org.eclipse.syson.diagram.common.view.tools.ConnectionDefinitionEndCompartmentNodeToolProvider; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.util.IDescriptionNameGenerator; + +/** + * Used to handle the Ends compartment of Connection Definition. + * + * @author pcdavid + */ +public class ConnectionDefinitionEndsCompartmentNodeDescriptionProvider extends AbstractCompartmentNodeDescriptionProvider { + + public ConnectionDefinitionEndsCompartmentNodeDescriptionProvider(IColorProvider colorProvider, IDescriptionNameGenerator nameGenerator) { + super(SysmlPackage.eINSTANCE.getConnectionDefinition(), SysmlPackage.eINSTANCE.getConnectionDefinition_ConnectionEnd(), colorProvider, nameGenerator); + } + + @Override + protected List getDroppableNodes(IViewDiagramElementFinder cache) { + return List.of(); + } + + @Override + protected String getCustomCompartmentLabel() { + return "ends"; + } + + @Override + protected List getItemCreationToolProviders() { + List creationToolProviders = new ArrayList<>(); + creationToolProviders.add(new ConnectionDefinitionEndCompartmentNodeToolProvider()); + return creationToolProviders; + } +} diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java index 323fcfc6e..158b733fc 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java @@ -103,6 +103,8 @@ private void addReusableCompartments(IViewDiagramElementFinder cache, IDescripti .ifPresent(childrenNodes::add); cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getAllocationDefinition(), SysmlPackage.eINSTANCE.getConnectionDefinition_ConnectionEnd())) .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getConnectionDefinition(), SysmlPackage.eINSTANCE.getConnectionDefinition_ConnectionEnd())) + .ifPresent(childrenNodes::add); cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getStateDefinition(), SysmlPackage.eINSTANCE.getDefinition_OwnedState())) .ifPresent(childrenNodes::add); cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState())) diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java index 4283dc816..5f2ae8b34 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java @@ -31,6 +31,7 @@ import org.eclipse.syson.diagram.common.view.tools.ActorCompartmentNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.AssignmentActionNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.CompartmentNodeToolProvider; +import org.eclipse.syson.diagram.common.view.tools.ConnectionDefinitionEndCompartmentNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.DecisionActionNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.DoneActionNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.ExhibitStateWithReferenceNodeToolProvider; @@ -69,6 +70,7 @@ import org.eclipse.syson.sysml.CaseUsage; import org.eclipse.syson.sysml.ConcernDefinition; import org.eclipse.syson.sysml.ConcernUsage; +import org.eclipse.syson.sysml.ConnectionDefinition; import org.eclipse.syson.sysml.ConstraintUsage; import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Element; @@ -482,6 +484,13 @@ public List caseOccurrenceUsage(OccurrenceUsage object) { return sections; } + @Override + public List caseConnectionDefinition(ConnectionDefinition object) { + var sections = this.casePartDefinition(object); + this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, new ConnectionDefinitionEndCompartmentNodeToolProvider().create(this.cache)); + return sections; + } + @Override public List casePartDefinition(PartDefinition object) { var sections = this.toolDescriptionService.createDefaultNodeToolSections(); diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc index 853d5e063..51c7c3515 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc @@ -65,7 +65,8 @@ part system { * In diagrams: ** When dropping `Element` from the _Explorer_ view to a diagram, hide its compartments unless it's the _interconnection compartment_ on an _Interconnection View_ diagram. -** Add _attributes_, _doc_ and _parts_ compartments on `ConnectionDefinition` graphical nodes. +** Add _ends_ compartments on `AlloocationDefinition` graphical nodes. +** Add _attributes_, _ends_, _doc_ and _parts_ compartments on `ConnectionDefinition` graphical nodes. ** Add _parts_ compartments on `PartDefinition`, `AllocationDefinition` and `InterfaceDefinition` graphical nodes. ** Add _actors_ compartment on `RequirementUsage` and `RequirementDefinition` graphical nodes. ** Add _Subjects_ as graphical nodes in addition to the existing the _subject_ compartment for `CaseUsages`, `CaseDefinitions`, `UseCaseUsage`, `UseCaseDefinitions`, `RequirementsUsages`, `RequirementsDefinitions` and `SatisfyRequirementUsages`. @@ -76,7 +77,8 @@ This tool allows to create a `SatisfyRequirementUsage` based on the `Requirement ** Add _New Satisfy Requirement_ graphical edge tool between `Feature` graphical nodes and `RequirementUsage` graphical nodes. This tool allows to create a `SatisfyRequirementUsage` between the `Feature` and `RequirementUsage` selected during the tool creation. ** Add the _timeslice_ and _snapshot_ prefixes in the label of `OccurrenceUsage` graphical nodes and some of the graphical nodes representing subclasses of `OccurrenceUsage`. - +** Newly created `AllocationDefinition` and `ConnectionDefinition` graphical nodes now have two initial _connection ends_, named `source` and `target`. +Additional ends can be created using the _New end_ tool (which replaces the _New Part as end_ previously available only on `AllocationDefinition` graphical nodes). * In textual import/export: ** Implement the textual export for `StateUsage` and `StateDefinition`.