diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index cf2509e3b..88591a9ed 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -93,6 +93,7 @@ The import now correctly creates a `MultiplicityRange` containing `LiteralIntege - https://github.com/eclipse-syson/syson/issues/1318[#1318] [details] Fix an issue that prevents adding a new value to a multi-valued reference in the reference widget. - https://github.com/eclipse-syson/syson/issues/1331[#1331] [general-view] Fix an issue that prevents dropping a `Definition` element from the _Explorer view_ on a _General View_. - https://github.com/eclipse-syson/syson/issues/1321[#1321] [general-view] Prevent `TransitionUsage` graphical edges source/target reconnection to another `TransitionUsage`. +- https://github.com/eclipse-syson/syson/issues/1263[#1236] [general-view] Improve `BindingConnectorAsUsage` to be able to create `FeatureChain` if necessary. === Improvements diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/checkers/BindingConnectorAsUsageChecker.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/checkers/BindingConnectorAsUsageChecker.java new file mode 100644 index 000000000..858cdf74b --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/checkers/BindingConnectorAsUsageChecker.java @@ -0,0 +1,130 @@ +/******************************************************************************* + * Copyright (c) 2025 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.application.controllers.diagrams.checkers; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramRefreshedEventPayload; +import org.eclipse.sirius.components.core.api.IIdentityService; +import org.eclipse.sirius.components.diagrams.Diagram; +import org.eclipse.syson.application.controller.editingContext.checkers.SemanticCheckerService; +import org.eclipse.syson.sysml.BindingConnectorAsUsage; +import org.eclipse.syson.sysml.FeatureChaining; + +import reactor.test.StepVerifier.Step; + +/** + * Checker that verify semantic of a {@link BindingConnectorAsUsage}. + * + * @author Arthur Daussy + */ +public class BindingConnectorAsUsageChecker { + + private String expectedSourceSemanticId; + + private String expectedTargetSemanticId; + + private String expectedSemanticContainer; + + private List expectedSourceFeatureChain; + + private String expectedSourceReference; + + private List expectedTargetFeatureChain; + + private String expectedTargetReference; + + private final IIdentityService identityService; + + private final SemanticCheckerService semanticCheckerService; + + public BindingConnectorAsUsageChecker( + IIdentityService identityService, + SemanticCheckerService semanticCheckerService) { + this.identityService = identityService; + this.semanticCheckerService = semanticCheckerService; + } + + public BindingConnectorAsUsageChecker setExpectedSemanticContainer(String anExpectedSemanticContainer) { + this.expectedSemanticContainer = anExpectedSemanticContainer; + return this; + } + + public BindingConnectorAsUsageChecker setExpectedSourceFeatureChain(List anExpectedSourceFeatureChain) { + this.expectedSourceFeatureChain = anExpectedSourceFeatureChain; + return this; + } + + public BindingConnectorAsUsageChecker setExpectedSourceReference(String anExpectedSourceReference) { + this.expectedSourceReference = anExpectedSourceReference; + return this; + } + + public BindingConnectorAsUsageChecker setExpectedSourceSemanticId(String anExpectedSourceSemanticId) { + this.expectedSourceSemanticId = anExpectedSourceSemanticId; + return this; + } + + public BindingConnectorAsUsageChecker setExpectedTargetSemanticId(String anExpectedTargetSemanticId) { + this.expectedTargetSemanticId = anExpectedTargetSemanticId; + return this; + } + + public BindingConnectorAsUsageChecker setExpectedTargetFeatureChain(List anExpectedTargetFeatureChain) { + this.expectedTargetFeatureChain = anExpectedTargetFeatureChain; + return this; + } + + public BindingConnectorAsUsageChecker setExpectedTargetReference(String anExpectedTargetReference) { + this.expectedTargetReference = anExpectedTargetReference; + return this; + } + + public void run(Step verifier, AtomicReference diagram, AtomicReference bindingIdProvider) { + + this.semanticCheckerService.checkElement(verifier, BindingConnectorAsUsage.class, () -> bindingIdProvider.get(), + binding -> { + assertThat(this.identityService.getId(binding.getSourceFeature().getFeatureTarget())) + .isEqualTo(this.expectedSourceSemanticId); + assertThat(this.identityService.getId(binding.getTargetFeature().get(0).getFeatureTarget())) + .isEqualTo(this.expectedTargetSemanticId); + assertThat(this.identityService.getId(binding.getOwningType())).isEqualTo(this.expectedSemanticContainer); + + if (this.expectedSourceReference != null) { + assertThat(this.identityService.getId(binding.getSourceFeature())) + .isEqualTo(this.expectedSourceReference); + } else if (this.expectedSourceFeatureChain != null) { + assertThat(binding.getSourceFeature().getOwnedFeatureChaining().stream() + .map(FeatureChaining::getChainingFeature) + .map(fc -> this.identityService.getId(fc)) + .toList()) + .isEqualTo(this.expectedSourceFeatureChain); + } + + if (this.expectedTargetReference != null) { + assertThat(this.identityService.getId(binding.getTargetFeature().get(0))) + .isEqualTo(this.expectedTargetReference); + } else if (this.expectedTargetFeatureChain != null) { + assertThat(binding.getTargetFeature().get(0).getOwnedFeatureChaining().stream() + .map(FeatureChaining::getChainingFeature) + .map(fc -> this.identityService.getId(fc)) + .toList()) + .isEqualTo(this.expectedTargetFeatureChain); + } + }); + } + +} diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVBindingConnectorAsUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVBindingConnectorAsUsageTests.java new file mode 100644 index 000000000..3e6dd1c9d --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVBindingConnectorAsUsageTests.java @@ -0,0 +1,313 @@ +/******************************************************************************* + * Copyright (c) 2025 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.application.controllers.diagrams.general.view; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.eclipse.sirius.components.diagrams.tests.assertions.DiagramAssertions.assertThat; +import static org.eclipse.sirius.components.diagrams.tests.assertions.DiagramInstanceOfAssertFactories.EDGE; +import static org.eclipse.sirius.components.diagrams.tests.assertions.DiagramInstanceOfAssertFactories.EDGE_STYLE; + +import java.time.Duration; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; + +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramEventInput; +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramRefreshedEventPayload; +import org.eclipse.sirius.components.core.api.IIdentityService; +import org.eclipse.sirius.components.core.api.IObjectSearchService; +import org.eclipse.sirius.components.diagrams.ArrowStyle; +import org.eclipse.sirius.components.diagrams.Diagram; +import org.eclipse.sirius.components.diagrams.Edge; +import org.eclipse.sirius.components.diagrams.events.ReconnectEdgeKind; +import org.eclipse.sirius.components.view.emf.diagram.IDiagramIdProvider; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.eclipse.syson.AbstractIntegrationTests; +import org.eclipse.syson.SysONTestsProperties; +import org.eclipse.syson.application.controller.editingContext.checkers.SemanticCheckerService; +import org.eclipse.syson.application.controllers.diagrams.checkers.BindingConnectorAsUsageChecker; +import org.eclipse.syson.application.controllers.diagrams.checkers.CheckDiagramElementCount; +import org.eclipse.syson.application.controllers.diagrams.checkers.DiagramCheckerService; +import org.eclipse.syson.application.controllers.diagrams.checkers.IDiagramChecker; +import org.eclipse.syson.application.controllers.diagrams.testers.EdgeCreationTester; +import org.eclipse.syson.application.controllers.diagrams.testers.EdgeReconnectionTester; +import org.eclipse.syson.application.data.GeneralViewBindingConnectorProjectData; +import org.eclipse.syson.diagram.general.view.GVDescriptionNameGenerator; +import org.eclipse.syson.services.SemanticRunnableFactory; +import org.eclipse.syson.services.diagrams.DiagramComparator; +import org.eclipse.syson.services.diagrams.DiagramDescriptionIdProvider; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramDescription; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramReference; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramSubscription; +import org.eclipse.syson.sysml.BindingConnectorAsUsage; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.util.IDescriptionNameGenerator; +import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; +import org.springframework.transaction.annotation.Transactional; + +import reactor.test.StepVerifier; + +/** + * Tests the edition of {@link BindingConnectorAsUsage}s on General View. + * + * @author Arthur Daussy + */ +@Transactional +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { SysONTestsProperties.NO_DEFAULT_LIBRARIES_PROPERTY }) +public class GVBindingConnectorAsUsageTests extends AbstractIntegrationTests { + + private final IDescriptionNameGenerator descriptionNameGenerator = new GVDescriptionNameGenerator(); + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IGivenDiagramReference givenDiagram; + + @Autowired + private IGivenDiagramDescription givenDiagramDescription; + + @Autowired + private IGivenDiagramSubscription givenDiagramSubscription; + + @Autowired + private IDiagramIdProvider diagramIdProvider; + + @Autowired + private EdgeCreationTester edgeCreationTester; + + @Autowired + private DiagramComparator diagramComparator; + + @Autowired + private IObjectSearchService objectSearchService; + + @Autowired + private SemanticRunnableFactory semanticRunnableFactory; + + @Autowired + private IIdentityService identityService; + + @Autowired + private EdgeReconnectionTester edgeReconnectionTester; + + private DiagramDescriptionIdProvider diagramDescriptionIdProvider; + + private DiagramCheckerService diagramCheckerService; + + private StepVerifier.Step verifier; + + private SemanticCheckerService semanticCheckerService; + + private AtomicReference diagram; + + @BeforeEach + public void setUp() { + this.givenInitialServerState.initialize(); + var diagramEventInput = new DiagramEventInput(UUID.randomUUID(), + GeneralViewBindingConnectorProjectData.EDITING_CONTEXT_ID, + GeneralViewBindingConnectorProjectData.GraphicalIds.DIAGRAM_ID); + var flux = this.givenDiagramSubscription.subscribe(diagramEventInput); + this.verifier = StepVerifier.create(flux); + this.diagram = this.givenDiagram.getDiagram(this.verifier); + var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewBindingConnectorProjectData.EDITING_CONTEXT_ID, + SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); + this.diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); + this.diagramCheckerService = new DiagramCheckerService(this.diagramComparator, this.descriptionNameGenerator); + this.semanticCheckerService = new SemanticCheckerService(this.semanticRunnableFactory, this.objectSearchService, GeneralViewBindingConnectorProjectData.EDITING_CONTEXT_ID, + GeneralViewBindingConnectorProjectData.SemanticIds.PACKAGE_1_ID); + } + + @AfterEach + public void tearDown() { + if (this.verifier != null) { + this.verifier.thenCancel() + .verify(Duration.ofSeconds(10)); + } + } + + @DisplayName("GIVEN a ActionUsage with nested item (1 level), WHEN creating a BindingConnectorAsUsage, THEN the binding should be created in the common container (A0) and a feature chain should be created for non direct features in target") + @Sql(scripts = { GeneralViewBindingConnectorProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, + config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Test + public void bindingNestedLevel1() { + + AtomicReference newEdge = this.createEdge("i0", "i1", GeneralViewBindingConnectorProjectData.GraphicalIds.I0_ID, GeneralViewBindingConnectorProjectData.GraphicalIds.I1_ID); + + // I0 -> I1 + this.createChecker() + .setExpectedSourceSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I0_ID) + .setExpectedTargetSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I1_ID) + .setExpectedSemanticContainer(GeneralViewBindingConnectorProjectData.SemanticIds.A0_ID) + .setExpectedSourceReference(GeneralViewBindingConnectorProjectData.SemanticIds.I0_ID) + .setExpectedTargetFeatureChain(List.of(GeneralViewBindingConnectorProjectData.SemanticIds.A1_ID, GeneralViewBindingConnectorProjectData.SemanticIds.I1_ID)) + .run(this.verifier, this.diagram, newEdge); + + } + + @DisplayName("GIVEN a ActionUsage with nested item (1 level), WHEN creating a BindingConnectorAsUsage, THEN the binding should be created in the common container (A0) and a feature chain should be created for non direct features in source") + @Sql(scripts = { GeneralViewBindingConnectorProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, + config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Test + public void bindingNestedLevel1Reversed() { + + AtomicReference newEdge = this.createEdge("i1", "i0", GeneralViewBindingConnectorProjectData.GraphicalIds.I1_ID, GeneralViewBindingConnectorProjectData.GraphicalIds.I0_ID); + + // I1 -> I0 + this.createChecker() + .setExpectedSourceSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I1_ID) + .setExpectedTargetSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I0_ID) + .setExpectedSemanticContainer(GeneralViewBindingConnectorProjectData.SemanticIds.A0_ID) + .setExpectedTargetReference(GeneralViewBindingConnectorProjectData.SemanticIds.I0_ID) + .setExpectedSourceFeatureChain(List.of(GeneralViewBindingConnectorProjectData.SemanticIds.A1_ID, GeneralViewBindingConnectorProjectData.SemanticIds.I1_ID)) + .run(this.verifier, this.diagram, newEdge); + + } + + @DisplayName("GIVEN a ActionUsage with nested item (2 level), WHEN creating a BindingConnectorAsUsage, THEN the binding should be created in the common container (A0) and a feature chain should be created for non direct features in source") + @Sql(scripts = { GeneralViewBindingConnectorProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, + config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Test + public void bindingNestedLevel2() { + + AtomicReference newEdge = this.createEdge("i0", "i11", GeneralViewBindingConnectorProjectData.GraphicalIds.I0_ID, GeneralViewBindingConnectorProjectData.GraphicalIds.I11_ID); + // I0 -> I11 + this.createChecker() + .setExpectedSourceSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I0_ID) + .setExpectedTargetSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I11_ID) + .setExpectedSemanticContainer(GeneralViewBindingConnectorProjectData.SemanticIds.A0_ID) + .setExpectedSourceReference(GeneralViewBindingConnectorProjectData.SemanticIds.I0_ID) + .setExpectedTargetFeatureChain(List.of(GeneralViewBindingConnectorProjectData.SemanticIds.A1_ID, GeneralViewBindingConnectorProjectData.SemanticIds.A11_ID, + GeneralViewBindingConnectorProjectData.SemanticIds.I11_ID)) + .run(this.verifier, this.diagram, newEdge); + } + + @DisplayName("GIVEN a ActionUsage owning sibling items, WHEN creating a BindingConnectorAsUsage, THEN the binding should be created the common container (A11) and feature should be directly referenced") + @Sql(scripts = { GeneralViewBindingConnectorProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, + config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Test + public void bindingSameLevel() { + + AtomicReference newEdge = this.createEdge("i11", "i11Test", GeneralViewBindingConnectorProjectData.GraphicalIds.I11_ID, GeneralViewBindingConnectorProjectData.GraphicalIds.I11TEST_ID); + + // I11 -> I11Test + this.createChecker() + .setExpectedSourceSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I11_ID) + .setExpectedTargetSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I11TEST_ID) + .setExpectedSemanticContainer(GeneralViewBindingConnectorProjectData.SemanticIds.A11_ID) + .setExpectedSourceReference(GeneralViewBindingConnectorProjectData.SemanticIds.I11_ID) + .setExpectedTargetReference(GeneralViewBindingConnectorProjectData.SemanticIds.I11TEST_ID) + .run(this.verifier, this.diagram, newEdge); + } + + @DisplayName("GIVEN a ActionUsage with existing binding, WHEN reconnecting target, THEN binding should be moved to new the common container (A1) and the source/target should be recomputed") + @Sql(scripts = { GeneralViewBindingConnectorProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, + config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @Test + public void reconnectTargetSameLevel() { + + var newEdge = this.reconnect(GeneralViewBindingConnectorProjectData.GraphicalIds.BINDING_EDGE_ID, GeneralViewBindingConnectorProjectData.GraphicalIds.I2_ID, ReconnectEdgeKind.TARGET, + GeneralViewBindingConnectorProjectData.GraphicalIds.I1_ID, GeneralViewBindingConnectorProjectData.GraphicalIds.I2_ID); + this.createChecker() + .setExpectedSourceSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I1_ID) + .setExpectedTargetSemanticId(GeneralViewBindingConnectorProjectData.SemanticIds.I2_ID) + // Semantic container should change from A0 to A1 + .setExpectedSemanticContainer(GeneralViewBindingConnectorProjectData.SemanticIds.A1_ID) + .setExpectedSourceReference(GeneralViewBindingConnectorProjectData.SemanticIds.I1_ID) + // No more feature chain required + .setExpectedTargetReference(GeneralViewBindingConnectorProjectData.SemanticIds.I2_ID) + .run(this.verifier, this.diagram, newEdge); + } + + private BindingConnectorAsUsageChecker createChecker() { + return new BindingConnectorAsUsageChecker(this.identityService, this.semanticCheckerService); + } + + private AtomicReference reconnect(String edgeId, String newTarget, ReconnectEdgeKind reconnectionKind, String expectedSourceGraplicalId, String expectedTargetGraplicalId) { + + this.verifier.then(() -> this.edgeReconnectionTester.reconnectEdge(GeneralViewBindingConnectorProjectData.EDITING_CONTEXT_ID, + this.diagram, + edgeId, + newTarget, + reconnectionKind)); + + var result = new AtomicReference(); + IDiagramChecker diagramCheckerTarget = (initialDiagram, newDiagram) -> { + new CheckDiagramElementCount(this.diagramComparator) + .hasNewEdgeCount(1) + .check(initialDiagram, newDiagram); + + Edge newEdge = this.diagramComparator.newEdges(initialDiagram, newDiagram).get(0); + result.set(newEdge.getTargetObjectId()); + assertThat(newEdge) + .hasSourceId(expectedSourceGraplicalId) + .hasTargetId(expectedTargetGraplicalId) + .extracting(Edge::getStyle, EDGE_STYLE) + .hasSourceArrow(ArrowStyle.None) + .hasTargetArrow(ArrowStyle.None); + assertThat(newEdge) + .extracting(e -> e.getCenterLabel().getText()).isEqualTo("="); + }; + + this.diagramCheckerService.checkDiagram(diagramCheckerTarget, this.diagram, this.verifier); + + return result; + } + + private AtomicReference createEdge(String sourceName, String targetName, String expectedSourceGraplicalId, String expectedTargetGraplicalId) { + String creationToolId = this.diagramDescriptionIdProvider.getEdgeCreationToolId( + this.descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage()), + "New Binding Connector As Usage (bind)"); + this.verifier.then(() -> this.edgeCreationTester.createEdge(GeneralViewBindingConnectorProjectData.EDITING_CONTEXT_ID, + this.diagram, + sourceName, + targetName, + creationToolId)); + + var result = new AtomicReference(); + + IDiagramChecker diagramChecker = (initialDiagram, newDiagram) -> { + new CheckDiagramElementCount(this.diagramComparator) + .hasNewNodeCount(0) + .hasNewEdgeCount(1) + .check(initialDiagram, newDiagram); + List newEdges = this.diagramComparator.newEdges(initialDiagram, newDiagram); + assertThat(newEdges).hasSize(1).first(EDGE) + .hasSourceId(expectedSourceGraplicalId) + .hasTargetId(expectedTargetGraplicalId) + .extracting(Edge::getStyle, EDGE_STYLE) + .hasSourceArrow(ArrowStyle.None) + .hasTargetArrow(ArrowStyle.None); + assertThat(newEdges).hasSize(1).first(EDGE) + .extracting(e -> e.getCenterLabel().getText()).isEqualTo("="); + result.set(newEdges.get(0).getTargetObjectId()); + }; + + this.diagramCheckerService.checkDiagram(diagramChecker, this.diagram, this.verifier); + return result; + } + +} diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgePortUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgePortUsageTests.java index 91e84dd11..6d7553a0d 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgePortUsageTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgePortUsageTests.java @@ -168,7 +168,7 @@ public void givenSysMLProjectWithPortsWhenFlowConnectionEdgeToolCreationIsReques } @DisplayName("Given a SysML Project with ports, when binding connector as usage edge tool creation is request between two ports, then a new binding connector edge is created") - @Sql(scripts = { GeneralViewPortTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = { GeneralViewPortTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) @Test public void givenSysMLProjectWithPortsWhenBindingConnectorAsUsageEdgeToolCreationIsRequestedThenNewBindingConnectorEdgeIsCreated() { @@ -196,7 +196,7 @@ public void givenSysMLProjectWithPortsWhenBindingConnectorAsUsageEdgeToolCreatio this.diagramCheckerService.checkDiagram(diagramChecker, this.diagram, this.verifier); - ISemanticChecker semanticChecker = this.semanticCheckerService.getElementInParentSemanticChecker("Package 1", SysmlPackage.eINSTANCE.getNamespace_OwnedMember(), + ISemanticChecker semanticChecker = this.semanticCheckerService.getElementInParentSemanticChecker("part1", SysmlPackage.eINSTANCE.getType_Feature(), SysmlPackage.eINSTANCE.getBindingConnectorAsUsage()); this.semanticCheckerService.checkEditingContext(semanticChecker, this.verifier); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFlowConnectionTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFlowConnectionTests.java index 446c460c4..5c78ebb62 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFlowConnectionTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFlowConnectionTests.java @@ -181,7 +181,8 @@ public void checkFlowConnectionCreation() { } @DisplayName("Given a SysML Project with ItemUsages on ActionUsage, when creating a BindingConnectorAsUsage between them, then an edge should be displayed to represent that new binding") - @Sql(scripts = { GeneralViewFlowConnectionItemUsagesProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = { GeneralViewFlowConnectionItemUsagesProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, + config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) @Test public void checkItemUsageBindingConnectorAsUsage() { @@ -213,7 +214,7 @@ public void checkItemUsageBindingConnectorAsUsage() { this.semanticCheckerService.checkElement(this.verifier, BindingConnectorAsUsage.class, () -> newBinding[0], binding -> { assertThat(this.identityService.getId(binding.getSourceFeature())) .isEqualTo(GeneralViewFlowConnectionItemUsagesProjectData.SemanticIds.ACTION_USAGE_2_OUT_ITEM_ID); - assertThat(this.identityService.getId(binding.getTargetFeature().get(0))) + assertThat(this.identityService.getId(binding.getTargetFeature().get(0).getFeatureTarget())) .isEqualTo(GeneralViewFlowConnectionItemUsagesProjectData.SemanticIds.ACTION_USAGE_3_IN_ITEM_ID); }); } diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewBindingConnectorProjectData.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewBindingConnectorProjectData.java new file mode 100644 index 000000000..f78e7d731 --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewBindingConnectorProjectData.java @@ -0,0 +1,85 @@ +/******************************************************************************* + * Copyright (c) 2025 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.application.data; + +/** + * Project Data ids for project "GeneralView-BindingConnectorProject". + * + * @author Arthur Daussy + */ +public class GeneralViewBindingConnectorProjectData { + + public static final String SCRIPT_PATH = "/scripts/database-content/GeneralView-BindingConnectorProject.sql"; + + public static final String EDITING_CONTEXT_ID = "d9f1cd0e-2ca2-4e69-8a91-87a80a455e04"; + + /** + * Semantic ids. + * + * @author Arthur Daussy + */ + public static final class SemanticIds { + + public static final String PACKAGE_1_ID = "4968c2dd-be63-495d-a19d-e4e3b5272724"; + + public static final String GENERAL_VIEW_ID = "efcc9cdb-5dc0-48fc-807a-ca020be54a0b"; + + public static final String A0_ID = "7e9a5607-31d3-46cf-b709-1443f71c38bd"; + + public static final String I0_ID = "e89ec9aa-8192-4aff-9f63-2f37b71b7250"; + + public static final String REFERENCE2_ID = "47f82ce8-7771-41d8-a215-5ca7bfc7ba09"; + + public static final String A1_ID = "202f7d9c-9f2f-4f97-a63f-fe05454d64de"; + + public static final String I1_ID = "dec9add2-c1c4-47bf-8e34-0f1354cee650"; + + public static final String I2_ID = "4942323d-3861-4e3a-9135-b06d6ccd6c20"; + + public static final String A11_ID = "2b6e065b-6d23-4d0f-8d8b-1fdfb0def024"; + + public static final String I11_ID = "c881eaab-b12d-4b90-bb58-39aad9fd6767"; + + public static final String I11TEST_ID = "f119ba39-42e1-4b21-a04e-3e4944082b59"; + + public static final String P0_ID = "865f3559-99ce-4132-88b3-3acda5a5d86b"; + + } + + /** + * Graphical ids. + * + * @author Arthur Daussy + */ + public static final class GraphicalIds { + + public static final String DIAGRAM_ID = "219f9e4c-900d-4258-b2fc-a69c94f3f666"; + + public static final String I0_ID = "c0a61f94-7762-357b-a245-2d00916f612e"; + + public static final String I1_ID = "07b3e9f5-55b1-3b81-97b9-e04214393b4b"; + + public static final String I11 = "e43e174a-8163-3ac8-b3f5-ebe6856d9ed2"; + + public static final String I11TEST = "99a13645-74bd-3ca4-97fd-59d8340f7bfd"; + + public static final String I11_ID = "e43e174a-8163-3ac8-b3f5-ebe6856d9ed2"; + + public static final String I11TEST_ID = "99a13645-74bd-3ca4-97fd-59d8340f7bfd"; + + public static final String BINDING_EDGE_ID = "38487ae1-e4ee-32e6-892b-d43929582aa0"; + + public static final String I2_ID = "a8aa241b-5fff-3fd3-963d-60f3c5b01858"; + + } +} diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/imports/ImportSysMLModelTest.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/imports/ImportSysMLModelTest.java index 76f883541..ad3c09173 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/imports/ImportSysMLModelTest.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/imports/ImportSysMLModelTest.java @@ -40,6 +40,7 @@ import org.eclipse.syson.services.UtilService; import org.eclipse.syson.sysml.ActionUsage; import org.eclipse.syson.sysml.AttributeUsage; +import org.eclipse.syson.sysml.BindingConnectorAsUsage; import org.eclipse.syson.sysml.ConjugatedPortDefinition; import org.eclipse.syson.sysml.DecisionNode; import org.eclipse.syson.sysml.Expression; @@ -137,6 +138,40 @@ public void tearDown() { TestTransaction.start(); } + @Test + @DisplayName("Given a model using a BindingConnectorAsUsage with feature chain, when importing the model, then model is correctly imported") + public void checkBindingConnectorWithFeatureChaine() throws IOException { + var input = """ + package pk1 { + action a1 { + in item i1; + + action a11 { + in item i11; + } + action a21 { + in item i21; + } + bind i1 = a21.i21; + binding b2 bind a11.i11 = a21.i21; + } + }"""; + this.checker.checkImportedModel(resource -> { + List bindings = EMFUtils.allContainedObjectOfType(resource, BindingConnectorAsUsage.class) + .toList(); + assertThat(bindings).hasSize(2); + + BindingConnectorAsUsage b1 = bindings.get(0); + assertThat(b1.getSourceFeature().getFeatureTarget().getName()).isEqualTo("i1"); + assertThat(b1.getTargetFeature().get(0).getFeatureTarget().getName()).isEqualTo("i21"); + + BindingConnectorAsUsage b2 = bindings.get(1); + assertThat(b2.getName()).isEqualTo("b2"); + assertThat(b2.getSourceFeature().getFeatureTarget().getName()).isEqualTo("i11"); + assertThat(b2.getTargetFeature().get(0).getFeatureTarget().getName()).isEqualTo("i21"); + + }).check(input); + } @Test @DisplayName("Given a model with a TextualRepresentation with a multiline body, when importing the model, then the boly is imported without /* and */") public void checkTextualRepresentationFeatures() throws IOException { diff --git a/backend/application/syson-application/src/test/resources/scripts/database-content/GeneralView-BindingConnectorProject.sql b/backend/application/syson-application/src/test/resources/scripts/database-content/GeneralView-BindingConnectorProject.sql new file mode 100644 index 000000000..21596b99b --- /dev/null +++ b/backend/application/syson-application/src/test/resources/scripts/database-content/GeneralView-BindingConnectorProject.sql @@ -0,0 +1,99 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 12.11 (Debian 12.11-1.pgdg110+1) +-- Dumped by pg_dump version 17.0 + +SET statement_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Data for Name: semantic_data; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + +INSERT INTO public.semantic_data (id, created_on, last_modified_on) VALUES ('d9f1cd0e-2ca2-4e69-8a91-87a80a455e04', '2025-06-24 09:08:53.631306+00', '2025-06-24 09:13:23.288377+00'); + + +-- +-- Data for Name: document; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + +INSERT INTO public.document (id, semantic_data_id, name, content, created_on, last_modified_on) VALUES ('7a8c74c9-de8d-4881-97ea-8c9e3c8da660', 'd9f1cd0e-2ca2-4e69-8a91-87a80a455e04', 'GeneralView-BindingConnectorProject.sysml', '{"json":{"version":"1.0","encoding":"utf-8"},"ns":{"sysml":"http://www.eclipse.org/syson/sysml"},"migration":{"lastMigrationPerformed":"ViewUsageExposeElementMigrationParticipant","migrationVersion":"2025.6.0-202506110000"},"content":[{"id":"ca77fd86-6185-443d-b1ee-180550cfde61","eClass":"sysml:Namespace","data":{"elementId":"474515ef-a6d1-4666-83c5-34c33ca59aa6","ownedRelationship":[{"id":"8b65f9b4-3f2a-4f99-a755-9442e277cb21","eClass":"sysml:OwningMembership","data":{"elementId":"910d32d9-3d53-4e5d-9aa7-deb3e6c31acb","ownedRelatedElement":[{"id":"4968c2dd-be63-495d-a19d-e4e3b5272724","eClass":"sysml:Package","data":{"declaredName":"Package 1","elementId":"34cd81ab-48d2-4613-b191-5fe246722c88","ownedRelationship":[{"id":"9e960946-fb0c-4cb0-a9ee-0ec77f5afb78","eClass":"sysml:NamespaceImport","data":{"elementId":"e754d243-7522-4566-9964-ad2545ad1a5e","importedNamespace":"865f3559-99ce-4132-88b3-3acda5a5d86b"}},{"id":"0fd56bf7-c84e-4813-8e82-e4aa7705152d","eClass":"sysml:OwningMembership","data":{"elementId":"6d03ac93-f5a1-41f2-a0e3-a322ae26faf4","ownedRelatedElement":[{"id":"efcc9cdb-5dc0-48fc-807a-ca020be54a0b","eClass":"sysml:ViewUsage","data":{"declaredName":"General View","elementId":"7264e968-2d03-44b5-b66d-c8afda363460","ownedRelationship":[{"id":"5abe4a10-9797-4185-9140-9d9efe196468","eClass":"sysml:FeatureTyping","data":{"elementId":"78a2d648-a19e-4b01-b0c6-6d604bcb7fe6","type":"sysml:ViewDefinition sysmllibrary:///faf517ae-dbcd-30a4-b3b9-3d9cb3bbf5c1#7098b764-d891-48f5-b928-4ba41cbe837e","typedFeature":"efcc9cdb-5dc0-48fc-807a-ca020be54a0b"}},{"id":"7fb40f4c-a97b-4f43-ba98-2d79df390cd4","eClass":"sysml:MembershipExpose","data":{"elementId":"ffaf9df5-948e-4ce0-9e08-4b14f6c65b14","importedMembership":"3add9cff-8283-4648-9342-9be7d89e3777"}},{"id":"cbcf4335-3f1f-4cee-bb23-4851216105dc","eClass":"sysml:MembershipExpose","data":{"elementId":"4cd74b47-d9a7-4b9c-a4aa-ae62daa36e1e"}},{"id":"71446bb3-ce7c-4465-b6b5-47343abcbf3b","eClass":"sysml:MembershipExpose","data":{"elementId":"58e9ca95-9af1-4f75-90e1-552afc828cb6","importedMembership":"41e694c4-c8c6-40d2-87a9-14e066d4ac79"}},{"id":"5216c322-4ede-49cb-9739-1fc9f4c3e99e","eClass":"sysml:MembershipExpose","data":{"elementId":"68bff07c-c838-4cac-a540-abb47eb36c06","importedMembership":"8bad6b15-1e82-4571-92db-1542cd508169"}},{"id":"43062d3c-14d3-441a-a7bc-1f6bf1a7551d","eClass":"sysml:MembershipExpose","data":{"elementId":"2f6bd4b0-340a-4f7c-9284-8db50f648d8d","importedMembership":"f3c0247f-eb4c-4a45-a832-cc8660bef6da"}},{"id":"e36a123c-be0e-49f3-8e00-794226c01624","eClass":"sysml:MembershipExpose","data":{"elementId":"4f06f409-399f-4540-8ebc-f59188265110","importedMembership":"34f05310-0b20-4ac5-9f49-5ecb16244c12"}},{"id":"922ba2f9-caa4-4a29-a98c-97757479af2e","eClass":"sysml:MembershipExpose","data":{"elementId":"a5f16063-a52c-4dce-b1f1-ae65f31772c6","importedMembership":"7f7683e4-4237-4c07-90ef-ec3f57d1b156"}},{"id":"e7b560ec-00d9-4ed1-a7bf-08ce3fa44cf0","eClass":"sysml:MembershipExpose","data":{"elementId":"9d38b4fb-a004-4cbe-b141-e2533862f70d","importedMembership":"c5c7c650-56d1-48e4-a8a6-37aac0126ac0"}},{"id":"05722514-01c3-49c8-b8cc-5288f3b6817d","eClass":"sysml:MembershipExpose","data":{"elementId":"01a247b7-e210-45ac-874f-ee4317dea5a0","importedMembership":"276234d2-72b8-4bf8-a1db-1fce9cc8dc03"}}]}}]}},{"id":"3add9cff-8283-4648-9342-9be7d89e3777","eClass":"sysml:OwningMembership","data":{"elementId":"3da98d4e-c920-432b-ba58-40e85b188570","ownedRelatedElement":[{"id":"7e9a5607-31d3-46cf-b709-1443f71c38bd","eClass":"sysml:ActionUsage","data":{"declaredName":"a0","elementId":"ad787332-943d-4fe5-8f1a-e21055a7e04a","ownedRelationship":[{"id":"b33369b0-2a7d-41b5-9eba-e6febebcd292","eClass":"sysml:FeatureMembership","data":{"elementId":"114218bd-ae10-4a0e-84c1-df1ad8a1d479","ownedRelatedElement":[{"id":"e89ec9aa-8192-4aff-9f63-2f37b71b7250","eClass":"sysml:ItemUsage","data":{"declaredName":"i0","elementId":"6ec048eb-4d47-4ba6-8d61-c9aa42673712","direction":"in","isComposite":true}}]}},{"id":"21ba1f3e-e906-4534-b91d-9aef2cb6c525","eClass":"sysml:FeatureMembership","data":{"elementId":"49cc7d42-9b18-49db-91bf-284f28798f58","ownedRelatedElement":[{"id":"ef21ef2b-555e-4407-92dc-f028a3dd9f25","eClass":"sysml:BindingConnectorAsUsage","data":{"elementId":"65b02efe-6260-4fa5-8f7c-7ef10c56a025","ownedRelationship":[{"id":"b250be9a-8ebe-406e-bc3f-b30f70bbcb7b","eClass":"sysml:EndFeatureMembership","data":{"elementId":"825a6442-d6c5-4bb4-af10-5465cceff73e","ownedRelatedElement":[{"id":"47f82ce8-7771-41d8-a215-5ca7bfc7ba09","eClass":"sysml:ReferenceUsage","data":{"declaredName":"reference2","elementId":"f8f6fa9a-eedc-4704-832c-aef41e25946f","ownedRelationship":[{"id":"d484c694-2a6a-4960-8ea0-400086393bd4","eClass":"sysml:ReferenceSubsetting","data":{"elementId":"29a7bc62-0a0c-421d-980b-2632c0e7b05d","ownedRelatedElement":[{"id":"5e2cf331-6f3d-40dc-9291-3185d29092b4","eClass":"sysml:Feature","data":{"elementId":"e82ba433-8bac-4e09-a05c-12e4c5440cb4","ownedRelationship":[{"id":"79e53d49-6ced-4e59-b64c-aca434146161","eClass":"sysml:FeatureChaining","data":{"elementId":"bafc886a-a947-4e8b-aab9-10c28d6a89e9","chainingFeature":"202f7d9c-9f2f-4f97-a63f-fe05454d64de"}},{"id":"e24f683d-7970-4134-9c91-8367d8dc9361","eClass":"sysml:FeatureChaining","data":{"elementId":"3c51aa92-29c6-4744-9486-9840f9cb1cf2","chainingFeature":"dec9add2-c1c4-47bf-8e34-0f1354cee650"}}]}}],"referencedFeature":"5e2cf331-6f3d-40dc-9291-3185d29092b4"}}],"isComposite":true,"isEnd":true}}]}},{"id":"bebb0fa2-9a8b-4ac0-be25-33386b840423","eClass":"sysml:EndFeatureMembership","data":{"elementId":"dcb5b7f6-2354-4d9b-b862-bbfb3d014b19","ownedRelatedElement":[{"id":"59baa45e-6f64-4c2b-a39b-a62545aa2f7d","eClass":"sysml:ReferenceUsage","data":{"elementId":"d480d425-0717-44b9-8529-92ebc6b28994","ownedRelationship":[{"id":"8ebf5d74-82b7-499e-9e7e-0079e6ec073a","eClass":"sysml:ReferenceSubsetting","data":{"elementId":"af86152f-9472-42ec-8e95-9ecba730aa14","referencedFeature":"e89ec9aa-8192-4aff-9f63-2f37b71b7250"}}],"isEnd":true}}]}}]}}]}},{"id":"276234d2-72b8-4bf8-a1db-1fce9cc8dc03","eClass":"sysml:FeatureMembership","data":{"elementId":"d3a21d55-f558-49df-b9d8-8d4e327ada1c","ownedRelatedElement":[{"id":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","eClass":"sysml:ActionUsage","data":{"declaredName":"a1","elementId":"41481670-4a26-4206-993a-f4cae0d9e5f1","ownedRelationship":[{"id":"4e45fdf3-4f9f-4d53-a341-27cc958aab7c","eClass":"sysml:FeatureMembership","data":{"elementId":"30323257-c843-4bec-ba7f-a54d73d82025","ownedRelatedElement":[{"id":"dec9add2-c1c4-47bf-8e34-0f1354cee650","eClass":"sysml:ItemUsage","data":{"declaredName":"i1","elementId":"6888cae5-6cb4-40f7-8680-0e42d34814a8","direction":"in","isComposite":true}}]}},{"id":"0b4c6641-33ec-447b-a1fc-2473f0a2cea8","eClass":"sysml:FeatureMembership","data":{"elementId":"fdf29ab2-2a40-406f-ba23-7660b3dd54b5","ownedRelatedElement":[{"id":"4942323d-3861-4e3a-9135-b06d6ccd6c20","eClass":"sysml:ItemUsage","data":{"declaredName":"i2","elementId":"15a829b3-e3a6-4d20-8542-3f5840cac2f9","ownedRelationship":[{"id":"96a330a3-8514-4912-9146-c5b2f144445e","eClass":"sysml:FeatureTyping","data":{"elementId":"161433e7-178d-4334-bc22-12249108fea0","type":"3ed5a025-987c-4206-8e71-90c1878c07e4","typedFeature":"4942323d-3861-4e3a-9135-b06d6ccd6c20"}}],"direction":"in","isComposite":true}}]}},{"id":"c5c7c650-56d1-48e4-a8a6-37aac0126ac0","eClass":"sysml:FeatureMembership","data":{"elementId":"15825b32-705f-4968-a566-7376047a1eef","ownedRelatedElement":[{"id":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","eClass":"sysml:ActionUsage","data":{"declaredName":"a11","elementId":"4c799bc9-ed2b-4ae3-8c78-04235a93f6e6","ownedRelationship":[{"id":"f240e0e1-e00f-4ab5-ad3a-e0ae4da0f2cc","eClass":"sysml:FeatureMembership","data":{"elementId":"1188365d-3a72-43e6-add8-f2881a38dafa","ownedRelatedElement":[{"id":"c881eaab-b12d-4b90-bb58-39aad9fd6767","eClass":"sysml:ItemUsage","data":{"declaredName":"i11","elementId":"6b6258e8-45c5-4025-9965-59a4568f70b3","direction":"in","isComposite":true}}]}},{"id":"7c6194ba-8fa2-40a2-b740-965f19b99b16","eClass":"sysml:FeatureMembership","data":{"elementId":"d2a161a5-3dcf-42c8-9725-0463013ff1e7","ownedRelatedElement":[{"id":"f119ba39-42e1-4b21-a04e-3e4944082b59","eClass":"sysml:ItemUsage","data":{"declaredName":"i11Test","elementId":"5bc8bb71-c0f8-4d44-a796-637f5e2e88d7","direction":"in","isComposite":true}}]}}],"isComposite":true}}]}}],"isComposite":true}}]}}],"isComposite":true}}]}},{"id":"41e694c4-c8c6-40d2-87a9-14e066d4ac79","eClass":"sysml:OwningMembership","data":{"elementId":"24f83bc7-544a-4c86-97ce-5d043d5ac48b","ownedRelatedElement":[{"id":"865f3559-99ce-4132-88b3-3acda5a5d86b","eClass":"sysml:Package","data":{"declaredName":"P0","elementId":"412a43db-96f7-4fe5-a819-26a77c0a016a","ownedRelationship":[{"id":"8bad6b15-1e82-4571-92db-1542cd508169","eClass":"sysml:OwningMembership","data":{"elementId":"7a427b02-58e5-4d96-b505-5905ee762fcb","ownedRelatedElement":[{"id":"3ed5a025-987c-4206-8e71-90c1878c07e4","eClass":"sysml:ItemDefinition","data":{"declaredName":"ID1","elementId":"6537251b-bece-4a57-af38-cc440d007bce","ownedRelationship":[{"id":"f3c0247f-eb4c-4a45-a832-cc8660bef6da","eClass":"sysml:FeatureMembership","data":{"elementId":"fe0fb48d-04b7-4650-9318-8323b6f66eae","ownedRelatedElement":[{"id":"f5f19bf0-5141-4d53-8ed0-27504cf0862e","eClass":"sysml:ItemUsage","data":{"declaredName":"id1","elementId":"b6b606f1-24a8-4a10-84cc-2b220fc295d2","direction":"in","isComposite":true}}]}}]}}]}},{"id":"34f05310-0b20-4ac5-9f49-5ecb16244c12","eClass":"sysml:OwningMembership","data":{"elementId":"4c11f9be-f3f7-4362-96cb-c147cf410727","ownedRelatedElement":[{"id":"c59e2821-591d-4b8f-aadc-6b38db7c5960","eClass":"sysml:ItemDefinition","data":{"declaredName":"ID2","elementId":"f46a9dc3-23c4-4fce-8e48-9c5db0c5013f","ownedRelationship":[{"id":"7f7683e4-4237-4c07-90ef-ec3f57d1b156","eClass":"sysml:FeatureMembership","data":{"elementId":"dc6ffbb1-d2cc-483e-8917-a9d13cea2181","ownedRelatedElement":[{"id":"070be138-442a-4b90-b10d-8d5256eba5a2","eClass":"sysml:ItemUsage","data":{"declaredName":"id2","elementId":"03b6772e-710c-4614-949c-c8344b3384da","direction":"in","isComposite":true}}]}}]}}]}}]}}]}}]}}]}}]}}]}', '2025-06-24 09:13:23.288377+00', '2025-06-24 09:13:23.288377+00'); + + +-- +-- Data for Name: image; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + + + +-- +-- Data for Name: library; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + + + +-- +-- Data for Name: project; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + +INSERT INTO public.project (id, name, created_on, last_modified_on) VALUES ('1c43c31a-4e1a-4608-b916-14a3f76a274a', 'GeneralView-BindingConnectorProject', '2025-06-24 09:08:53.556036+00', '2025-06-24 09:13:13.218738+00'); + + +-- +-- Data for Name: nature; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + + + +-- +-- Data for Name: project_image; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + + + +-- +-- Data for Name: project_semantic_data; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + +INSERT INTO public.project_semantic_data (id, project_id, semantic_data_id, name, created_on, last_modified_on) VALUES ('b0d24ab9-1898-4a94-92e5-298e4dcfd9c9', '1c43c31a-4e1a-4608-b916-14a3f76a274a', 'd9f1cd0e-2ca2-4e69-8a91-87a80a455e04', 'main', '2025-06-24 09:08:53.67321+00', '2025-06-24 09:08:53.67321+00'); + + +-- +-- Data for Name: representation_metadata; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + +INSERT INTO public.representation_metadata (id, target_object_id, description_id, label, kind, created_on, last_modified_on, documentation, semantic_data_id) VALUES ('219f9e4c-900d-4258-b2fc-a69c94f3f666', 'efcc9cdb-5dc0-48fc-807a-ca020be54a0b', 'siriusComponents://representationDescription?kind=diagramDescription&sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=db495705-e917-319b-af55-a32ad63f4089', 'General View', 'siriusComponents://representation?type=Diagram', '2025-06-24 09:09:02.743241+00', '2025-06-24 09:09:02.743241+00', '', 'd9f1cd0e-2ca2-4e69-8a91-87a80a455e04'); + + +-- +-- Data for Name: representation_content; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + +INSERT INTO public.representation_content (id, content, last_migration_performed, migration_version, created_on, last_modified_on) VALUES ('219f9e4c-900d-4258-b2fc-a69c94f3f666', '{"id":"219f9e4c-900d-4258-b2fc-a69c94f3f666","kind":"siriusComponents://representation?type=Diagram","targetObjectId":"efcc9cdb-5dc0-48fc-807a-ca020be54a0b","descriptionId":"siriusComponents://representationDescription?kind=diagramDescription&sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=db495705-e917-319b-af55-a32ad63f4089","nodes":[{"id":"fbc64fc2-f832-3dcc-a940-4f48f5eddb7f","type":"customnode:sysmlpackage","targetObjectId":"865f3559-99ce-4132-88b3-3acda5a5d86b","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=Package","targetObjectLabel":"P0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c0ac286a-69c6-389a-9635-a559ec3e942d","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"389aa6af-cf49-3a5a-9500-bcd20e30cf7a","text":"P0","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/Package.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"ELLIPSIS","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderStyle":"Solid","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[{"id":"3a8b2304-34fc-385b-a5e3-16690bb54181","type":"node:rectangle","targetObjectId":"3ed5a025-987c-4206-8e71-90c1878c07e4","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=7b83d1e4-c130-3b90-a806-953d1b187d92","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"ba2d8003-5033-3d9d-b9c3-2d2ac79c6eba","text":"«item def»\nID1","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemDefinition.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"IF_CHILDREN","overflowStrategy":"WRAP","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":false,"topGap":0,"bottomGap":0,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"db862c66-6644-350d-a764-dc6c3fb5153e","type":"node:rectangle","targetObjectId":"3ed5a025-987c-4206-8e71-90c1878c07e4","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=cc917467-07d3-3cd6-9ec7-2ef563c1b866","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"5aaefd76-2f6c-32f9-9fcc-30ac71ae395f","text":"doc","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"05d57427-697d-390a-be00-174b1ec62e9a","type":"node:rectangle","targetObjectId":"3ed5a025-987c-4206-8e71-90c1878c07e4","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=30a26fb3-2835-36bf-b97a-23db1e1b2161","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"b83d5fb0-2201-3c5d-a5f0-15e3f9cdf746","text":"attributes","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"aaef3b4c-3ca5-3746-b1c5-1f234843c746","type":"node:rectangle","targetObjectId":"c59e2821-591d-4b8f-aadc-6b38db7c5960","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=7b83d1e4-c130-3b90-a806-953d1b187d92","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"1a471ed4-8858-3a19-adf5-28e0a9cbd18f","text":"«item def»\nID2","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemDefinition.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"IF_CHILDREN","overflowStrategy":"WRAP","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":false,"topGap":0,"bottomGap":0,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"b9fdbed1-af66-3d40-adba-0d95301c209e","type":"node:rectangle","targetObjectId":"c59e2821-591d-4b8f-aadc-6b38db7c5960","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=cc917467-07d3-3cd6-9ec7-2ef563c1b866","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"842cdf4b-3331-3a83-b0ea-eebe948adb64","text":"doc","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"0b830b08-e322-361a-86cb-bf8f28744278","type":"node:rectangle","targetObjectId":"c59e2821-591d-4b8f-aadc-6b38db7c5960","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=30a26fb3-2835-36bf-b97a-23db1e1b2161","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"57c72c3f-7bdf-3972-89b6-29468546c367","text":"attributes","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"f5a2beaa-d5b6-3095-9f53-e3c178c17cd8","type":"node:rectangle","targetObjectId":"f5f19bf0-5141-4d53-8ed0-27504cf0862e","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=3276b2ca-7ffa-34eb-8962-0c08a02d3871","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"1ed8fe9d-9138-387d-931f-a0a49a71f56d","text":"«item»\nid1","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemUsageIn.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"IF_CHILDREN","overflowStrategy":"WRAP","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":10,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":false,"topGap":0,"bottomGap":0,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"90f5cdc8-b081-3ea7-97ac-6222d520a116","type":"node:rectangle","targetObjectId":"f5f19bf0-5141-4d53-8ed0-27504cf0862e","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=4fb578fd-0766-30ae-94df-67882aa20bc4","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"adfa78f5-59b6-3b07-b7d6-7932f744bd29","text":"doc","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"a651a200-697e-370d-a7d0-03a41b1fc935","type":"node:rectangle","targetObjectId":"f5f19bf0-5141-4d53-8ed0-27504cf0862e","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=07b32dd9-07de-3291-9075-0cf8b9c449b1","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"79eedec2-3f8c-375b-bb32-a6dcf8fd6516","text":"attributes","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"1ca5292c-68e5-32f4-baa4-bf88ad8d50de","type":"node:rectangle","targetObjectId":"f5f19bf0-5141-4d53-8ed0-27504cf0862e","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=7c2ec106-fc4b-3ee7-b43b-211893bfaa65","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"ae107fe7-0ad7-3368-8cdb-a7927cecb859","text":"references","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"cdac8561-c52e-3ce4-8996-ea3f6b45a6d7","type":"node:rectangle","targetObjectId":"070be138-442a-4b90-b10d-8d5256eba5a2","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=3276b2ca-7ffa-34eb-8962-0c08a02d3871","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"4c4f3f7b-2b1c-3f85-8064-b6e360279b7f","text":"«item»\nid2","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemUsageIn.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"IF_CHILDREN","overflowStrategy":"WRAP","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":10,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":false,"topGap":0,"bottomGap":0,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"ddd57fbf-3d43-3abc-863e-58f8ea1cd3fb","type":"node:rectangle","targetObjectId":"070be138-442a-4b90-b10d-8d5256eba5a2","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=4fb578fd-0766-30ae-94df-67882aa20bc4","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"19f100b3-4a03-33f5-bc6d-9932fdee3d98","text":"doc","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"1cc7f5f6-1200-3cf4-9141-4e83b183df0f","type":"node:rectangle","targetObjectId":"070be138-442a-4b90-b10d-8d5256eba5a2","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=07b32dd9-07de-3291-9075-0cf8b9c449b1","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"4dac8e77-f413-3cd8-bc61-4ffda1883c15","text":"attributes","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"200b2b76-13ee-3286-b963-f9030df4a311","type":"node:rectangle","targetObjectId":"070be138-442a-4b90-b10d-8d5256eba5a2","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"id2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=7c2ec106-fc4b-3ee7-b43b-211893bfaa65","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"c8cffeee-0115-359f-a106-f5fbcd67fed4","text":"references","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":200,"defaultHeight":101,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"eff1032f-52fc-3c3a-bf78-c4c31f0d7386","type":"node:rectangle","targetObjectId":"7e9a5607-31d3-46cf-b709-1443f71c38bd","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=77cfbd22-c903-3b4e-9792-03871fdfc3d4","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"daaabee6-a220-3fd4-9e99-dafbf4197866","text":"«action»\na0","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ActionUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"IF_CHILDREN","overflowStrategy":"WRAP","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":10,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":false,"topGap":0,"bottomGap":0,"growableNodeIds":["siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bb882f80-cc45-3f6b-8039-17517822bf25"],"kind":"List"}},"borderNodes":[{"id":"c0a61f94-7762-357b-a245-2d00916f612e","type":"node:image","targetObjectId":"e89ec9aa-8192-4aff-9f63-2f37b71b7250","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=af106b58-1a88-3b79-8aa0-18d14ef52a64","borderNode":true,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":null,"outsideLabels":[{"id":"d53efc49-9e45-33af-ac22-88d712f2ec5e","text":"i0","outsideLabelLocation":"BOTTOM_MIDDLE","style":{"color":"#000000","fontSize":12,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"overflowStrategy":"NONE","textAlign":"LEFT"}],"style":{"imageURL":"/images/feature_in.svg","scalingFactor":1,"borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","positionDependentRotation":true,"childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":10,"defaultHeight":10,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"childNodes":[{"id":"34914234-7924-3cbd-aa35-20c4b5669823","type":"node:rectangle","targetObjectId":"7e9a5607-31d3-46cf-b709-1443f71c38bd","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=1e5ed573-49f7-3cd1-a659-3ccd1c577402","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"540b318b-9fa2-37a7-8277-9a30d7cf0501","text":"doc","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"2d2edec6-f9cf-3c5f-ac70-68a7b5f3e46b","type":"node:rectangle","targetObjectId":"7e9a5607-31d3-46cf-b709-1443f71c38bd","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=5f287f50-8d40-387f-a261-42f62d0fc29f","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"13f643f2-0edb-3e1f-9790-c665603c1a0f","text":"items","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"7bc9bcb8-8303-3d5a-bb90-1df74ebdb060","type":"node:icon-label","targetObjectId":"e89ec9aa-8192-4aff-9f63-2f37b71b7250","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=87499c19-ab91-39e9-8ba6-a3963af9e075","borderNode":false,"modifiers":[],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"aeca6c37-667b-36fe-9fc0-66b6376eb367","text":"in i0","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemUsageIn.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"edaf4a76-ff70-3783-8c2f-ab653d2bf6c4","type":"node:rectangle","targetObjectId":"7e9a5607-31d3-46cf-b709-1443f71c38bd","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=513b74fd-f039-3f7b-92ca-4345c730ece8","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"c751de7e-4975-3021-96c1-838c5d318acb","text":"actions","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"86ffe292-ab09-307e-8952-a1928d367e1b","type":"node:icon-label","targetObjectId":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=2dd54548-6092-36c5-8262-9dde41bd15e1","borderNode":false,"modifiers":[],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"3dacabb2-dca6-3c2e-ae9c-dfd5268abe01","text":"a1","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ActionUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"b95d1a1a-6a9a-3b6f-bdbf-cfc15f38bef8","type":"node:rectangle","targetObjectId":"7e9a5607-31d3-46cf-b709-1443f71c38bd","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bb882f80-cc45-3f6b-8039-17517822bf25","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"4ccf8ed2-1f8c-3972-a440-0bb1cd15618f","text":"action flow","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[{"id":"13e6c905-2b6e-3401-9a90-869409118013","type":"node:rectangle","targetObjectId":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=77cfbd22-c903-3b4e-9792-03871fdfc3d4","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"963071e0-e8f0-38b4-9cf0-f0df63bcc6eb","text":"«action»\na1","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ActionUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"IF_CHILDREN","overflowStrategy":"WRAP","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":10,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":false,"topGap":0,"bottomGap":0,"growableNodeIds":["siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bb882f80-cc45-3f6b-8039-17517822bf25"],"kind":"List"}},"borderNodes":[{"id":"07b3e9f5-55b1-3b81-97b9-e04214393b4b","type":"node:image","targetObjectId":"dec9add2-c1c4-47bf-8e34-0f1354cee650","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=af106b58-1a88-3b79-8aa0-18d14ef52a64","borderNode":true,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":null,"outsideLabels":[{"id":"3cc70e39-49bc-303f-bee9-cb007acc725f","text":"i1","outsideLabelLocation":"BOTTOM_MIDDLE","style":{"color":"#000000","fontSize":12,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"overflowStrategy":"NONE","textAlign":"LEFT"}],"style":{"imageURL":"/images/feature_in.svg","scalingFactor":1,"borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","positionDependentRotation":true,"childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":10,"defaultHeight":10,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"a8aa241b-5fff-3fd3-963d-60f3c5b01858","type":"node:image","targetObjectId":"4942323d-3861-4e3a-9135-b06d6ccd6c20","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=af106b58-1a88-3b79-8aa0-18d14ef52a64","borderNode":true,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":null,"outsideLabels":[{"id":"6bc036f0-9c75-3eb2-987f-fc8a2bded540","text":"i2 : ID1","outsideLabelLocation":"BOTTOM_MIDDLE","style":{"color":"#000000","fontSize":12,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"overflowStrategy":"NONE","textAlign":"LEFT"}],"style":{"imageURL":"/images/feature_in.svg","scalingFactor":1,"borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","positionDependentRotation":true,"childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":10,"defaultHeight":10,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"childNodes":[{"id":"d920fb77-e4fe-3a20-85a9-45a04fd12cd5","type":"node:rectangle","targetObjectId":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=1e5ed573-49f7-3cd1-a659-3ccd1c577402","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"05b66c2f-ac36-3c24-80bb-ee72a254346a","text":"doc","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"4b3ce5cd-d6d1-3524-99cd-4ea43bbc7a1d","type":"node:rectangle","targetObjectId":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=5f287f50-8d40-387f-a261-42f62d0fc29f","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"888001c2-bba0-3ea2-83c1-72133fa8953c","text":"items","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"ab9b8cdc-9e4e-3741-993e-2c1eb8ab01a0","type":"node:icon-label","targetObjectId":"dec9add2-c1c4-47bf-8e34-0f1354cee650","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=87499c19-ab91-39e9-8ba6-a3963af9e075","borderNode":false,"modifiers":[],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"6036cb08-3a35-3cd0-be1b-b892f8a7ad68","text":"in i1","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemUsageIn.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"ecb26641-f733-3eb7-a4ef-f5cd2b5a3ce8","type":"node:icon-label","targetObjectId":"4942323d-3861-4e3a-9135-b06d6ccd6c20","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=87499c19-ab91-39e9-8ba6-a3963af9e075","borderNode":false,"modifiers":[],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"060883da-2cd6-3672-a2d3-1e56ae465ea6","text":"in i2 : ID1","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemUsageIn.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"f8cb7c7e-e74f-32b9-8d46-bd5b762680c9","type":"node:rectangle","targetObjectId":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=513b74fd-f039-3f7b-92ca-4345c730ece8","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"9801c5a8-c105-38e3-b412-73b40bd9a753","text":"actions","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"1df4c39a-a8e6-3e07-a615-3b603efcaf38","type":"node:icon-label","targetObjectId":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=2dd54548-6092-36c5-8262-9dde41bd15e1","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"b55977fe-793f-38be-aa74-f9cd7604082b","text":"a11","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ActionUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"f5f9c1c1-b0a8-3ca1-9567-290787503a06","type":"node:rectangle","targetObjectId":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bb882f80-cc45-3f6b-8039-17517822bf25","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"d2940cbb-eebe-316d-8baa-ac7379b22865","text":"action flow","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[{"id":"b838f6d6-5bba-331e-a435-13e52d47060e","type":"node:rectangle","targetObjectId":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=77cfbd22-c903-3b4e-9792-03871fdfc3d4","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"51179162-4ef5-32e3-92b6-08261eb3dc74","text":"«action»\na11","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ActionUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"IF_CHILDREN","overflowStrategy":"WRAP","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":10,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":false,"topGap":0,"bottomGap":0,"growableNodeIds":["siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bb882f80-cc45-3f6b-8039-17517822bf25"],"kind":"List"}},"borderNodes":[{"id":"e43e174a-8163-3ac8-b3f5-ebe6856d9ed2","type":"node:image","targetObjectId":"c881eaab-b12d-4b90-bb58-39aad9fd6767","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=af106b58-1a88-3b79-8aa0-18d14ef52a64","borderNode":true,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":null,"outsideLabels":[{"id":"8acd683a-0bc2-329e-9d32-1a828c038cde","text":"i11","outsideLabelLocation":"BOTTOM_MIDDLE","style":{"color":"#000000","fontSize":12,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"overflowStrategy":"NONE","textAlign":"LEFT"}],"style":{"imageURL":"/images/feature_in.svg","scalingFactor":1,"borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","positionDependentRotation":true,"childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":10,"defaultHeight":10,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"99a13645-74bd-3ca4-97fd-59d8340f7bfd","type":"node:image","targetObjectId":"f119ba39-42e1-4b21-a04e-3e4944082b59","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i11Test","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=af106b58-1a88-3b79-8aa0-18d14ef52a64","borderNode":true,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":null,"outsideLabels":[{"id":"fdb378f1-fcd9-325d-9689-cd51481f582c","text":"i11Test","outsideLabelLocation":"BOTTOM_MIDDLE","style":{"color":"#000000","fontSize":12,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"overflowStrategy":"NONE","textAlign":"LEFT"}],"style":{"imageURL":"/images/feature_in.svg","scalingFactor":1,"borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","positionDependentRotation":true,"childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":10,"defaultHeight":10,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"childNodes":[{"id":"22499d75-9e78-33f5-8d12-0ff4a9c84db9","type":"node:rectangle","targetObjectId":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=1e5ed573-49f7-3cd1-a659-3ccd1c577402","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"35caebf1-9572-3772-adc0-44c084aae591","text":"doc","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"a4f5407e-184a-34ab-88e9-5f96efc4c3da","type":"node:rectangle","targetObjectId":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=5f287f50-8d40-387f-a261-42f62d0fc29f","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"f9c3652a-8ab7-343e-9d05-54565f117cbf","text":"items","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"2a53ec2c-abc7-3ee3-b08f-87d7a0e74872","type":"node:icon-label","targetObjectId":"c881eaab-b12d-4b90-bb58-39aad9fd6767","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=87499c19-ab91-39e9-8ba6-a3963af9e075","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"5adacdb2-84af-3114-8479-73926e366e6f","text":"in i11","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemUsageIn.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]},{"id":"75dcc703-95c1-3ad9-97d7-825ac87d138c","type":"node:icon-label","targetObjectId":"f119ba39-42e1-4b21-a04e-3e4944082b59","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemUsage","targetObjectLabel":"i11Test","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=87499c19-ab91-39e9-8ba6-a3963af9e075","borderNode":false,"modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"a0205088-1e89-3f79-a9e9-09007652b573","text":"in i11Test","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/ItemUsageIn.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"216ce810-3c0e-34da-9109-f74e3636c96b","type":"node:rectangle","targetObjectId":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=513b74fd-f039-3f7b-92ca-4345c730ece8","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"d6a8ad2b-2909-349a-bbcf-e77c73a1f668","text":"actions","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"95b0684f-cfb7-3f4a-924c-af2d18a9eed7","type":"node:rectangle","targetObjectId":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bb882f80-cc45-3f6b-8039-17517822bf25","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"8d07fda6-85a1-3e75-b85e-709ff9e6d55e","text":"action flow","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":150,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"c7b1f5c0-b757-385c-a588-8492a191f009","type":"node:rectangle","targetObjectId":"2b6e065b-6d23-4d0f-8d8b-1fdfb0def024","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a11","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=2e086be9-2d88-3100-ab3d-6788096a15d2","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"622fb7ca-61f3-32fa-b01a-37ef44e14a60","text":"perform actions","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":150,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"a501e427-a96f-3567-9418-aec51ea0028d","type":"node:rectangle","targetObjectId":"202f7d9c-9f2f-4f97-a63f-fe05454d64de","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=2e086be9-2d88-3100-ab3d-6788096a15d2","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"3fffa670-5ad7-3577-a136-851d8e600152","text":"perform actions","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":150,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"be31b865-e28b-36b0-be81-165a3daed8f7","type":"node:rectangle","targetObjectId":"7e9a5607-31d3-46cf-b709-1443f71c38bd","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ActionUsage","targetObjectLabel":"a0","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=2e086be9-2d88-3100-ab3d-6788096a15d2","borderNode":false,"modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"79e9084b-a440-398f-b6cc-dd78f0a78bee","text":"perform actions","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":12,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null},"isHeader":true,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"NONE","textAlign":"CENTER","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"areChildNodesDraggable":true,"topGap":0,"bottomGap":10,"growableNodeIds":[],"kind":"List"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"edges":[{"id":"3ed0521b-fedd-35a5-a5f3-0f53b75f7120","type":"edge:straight","targetObjectId":"3ed5a025-987c-4206-8e71-90c1878c07e4","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID1","descriptionId":"siriusComponents://edgeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=64e436e5-4ba8-3787-9c63-01b15e2973b0","beginLabel":null,"centerLabel":{"id":"895e3b69-dae1-3d5b-b8d6-75636e23738e","type":"label:edge-center","text":"","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null}},"endLabel":null,"sourceId":"3a8b2304-34fc-385b-a5e3-16690bb54181","targetId":"f5a2beaa-d5b6-3095-9f53-e3c178c17cd8","modifiers":[],"state":"Normal","style":{"size":1,"lineStyle":"Solid","sourceArrow":"FillDiamond","targetArrow":"None","color":"#000000"},"centerLabelEditable":true},{"id":"c7a54fe4-036a-3f5a-beae-c22992a2e525","type":"edge:straight","targetObjectId":"c59e2821-591d-4b8f-aadc-6b38db7c5960","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=ItemDefinition","targetObjectLabel":"ID2","descriptionId":"siriusComponents://edgeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=64e436e5-4ba8-3787-9c63-01b15e2973b0","beginLabel":null,"centerLabel":{"id":"279fcd61-7ab4-36fa-8183-dfe015b3b5fa","type":"label:edge-center","text":"","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null}},"endLabel":null,"sourceId":"aaef3b4c-3ca5-3746-b1c5-1f234843c746","targetId":"cdac8561-c52e-3ce4-8996-ea3f6b45a6d7","modifiers":[],"state":"Normal","style":{"size":1,"lineStyle":"Solid","sourceArrow":"FillDiamond","targetArrow":"None","color":"#000000"},"centerLabelEditable":true},{"id":"38487ae1-e4ee-32e6-892b-d43929582aa0","type":"edge:straight","targetObjectId":"ef21ef2b-555e-4407-92dc-f028a3dd9f25","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=BindingConnectorAsUsage","targetObjectLabel":"","descriptionId":"siriusComponents://edgeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c4e981ca-ce0c-394c-b896-1e84f56ff5d4","beginLabel":null,"centerLabel":{"id":"05979ff7-8fff-38d3-92c6-3cce44e3f40f","type":"label:edge-center","text":"=","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":[],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null}},"endLabel":null,"sourceId":"07b3e9f5-55b1-3b81-97b9-e04214393b4b","targetId":"c0a61f94-7762-357b-a245-2d00916f612e","modifiers":[],"state":"Normal","style":{"size":1,"lineStyle":"Solid","sourceArrow":"None","targetArrow":"None","color":"#000000"},"centerLabelEditable":true}],"layoutData":{"nodeLayoutData":{"e43e174a-8163-3ac8-b3f5-ebe6856d9ed2":{"id":"e43e174a-8163-3ac8-b3f5-ebe6856d9ed2","position":{"x":-11.0,"y":22.0},"size":{"width":16.0,"height":16.0},"resizedByUser":false,"handleLayoutData":[]},"b9fdbed1-af66-3d40-adba-0d95301c209e":{"id":"b9fdbed1-af66-3d40-adba-0d95301c209e","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"216ce810-3c0e-34da-9109-f74e3636c96b":{"id":"216ce810-3c0e-34da-9109-f74e3636c96b","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"edaf4a76-ff70-3783-8c2f-ab653d2bf6c4":{"id":"edaf4a76-ff70-3783-8c2f-ab653d2bf6c4","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"b95d1a1a-6a9a-3b6f-bdbf-cfc15f38bef8":{"id":"b95d1a1a-6a9a-3b6f-bdbf-cfc15f38bef8","position":{"x":0.8,"y":52.8},"size":{"width":402.21995417124987,"height":414.4},"resizedByUser":false,"handleLayoutData":[]},"0b830b08-e322-361a-86cb-bf8f28744278":{"id":"0b830b08-e322-361a-86cb-bf8f28744278","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"fbc64fc2-f832-3dcc-a940-4f48f5eddb7f":{"id":"fbc64fc2-f832-3dcc-a940-4f48f5eddb7f","position":{"x":12.0,"y":12.0},"size":{"width":394.0,"height":256.79999485192457},"resizedByUser":true,"handleLayoutData":[]},"eff1032f-52fc-3c3a-bf78-c4c31f0d7386":{"id":"eff1032f-52fc-3c3a-bf78-c4c31f0d7386","position":{"x":466.0,"y":12.0},"size":{"width":403.8199541712499,"height":468.0},"resizedByUser":true,"handleLayoutData":[]},"c0a61f94-7762-357b-a245-2d00916f612e":{"id":"c0a61f94-7762-357b-a245-2d00916f612e","position":{"x":-11.0,"y":285.92271840310923},"size":{"width":16.0,"height":16.0},"resizedByUser":false,"handleLayoutData":[]},"cdac8561-c52e-3ce4-8996-ea3f6b45a6d7":{"id":"cdac8561-c52e-3ce4-8996-ea3f6b45a6d7","position":{"x":227.0,"y":184.79999485192454},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"a4f5407e-184a-34ab-88e9-5f96efc4c3da":{"id":"a4f5407e-184a-34ab-88e9-5f96efc4c3da","position":{"x":0.8,"y":52.8},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"b838f6d6-5bba-331e-a435-13e52d47060e":{"id":"b838f6d6-5bba-331e-a435-13e52d47060e","position":{"x":12.0,"y":42.39999623338374},"size":{"width":156.6,"height":113.6},"resizedByUser":false,"handleLayoutData":[]},"a501e427-a96f-3567-9418-aec51ea0028d":{"id":"a501e427-a96f-3567-9418-aec51ea0028d","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"be31b865-e28b-36b0-be81-165a3daed8f7":{"id":"be31b865-e28b-36b0-be81-165a3daed8f7","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"1df4c39a-a8e6-3e07-a615-3b603efcaf38":{"id":"1df4c39a-a8e6-3e07-a615-3b603efcaf38","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":15.0},"resizedByUser":false,"handleLayoutData":[]},"7bc9bcb8-8303-3d5a-bb90-1df74ebdb060":{"id":"7bc9bcb8-8303-3d5a-bb90-1df74ebdb060","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":15.0},"resizedByUser":false,"handleLayoutData":[]},"f5f9c1c1-b0a8-3ca1-9567-290787503a06":{"id":"f5f9c1c1-b0a8-3ca1-9567-290787503a06","position":{"x":0.8,"y":52.8},"size":{"width":176.6,"height":163.99999623338374},"resizedByUser":false,"handleLayoutData":[]},"4b3ce5cd-d6d1-3524-99cd-4ea43bbc7a1d":{"id":"4b3ce5cd-d6d1-3524-99cd-4ea43bbc7a1d","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"200b2b76-13ee-3286-b963-f9030df4a311":{"id":"200b2b76-13ee-3286-b963-f9030df4a311","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"ecb26641-f733-3eb7-a4ef-f5cd2b5a3ce8":{"id":"ecb26641-f733-3eb7-a4ef-f5cd2b5a3ce8","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":15.0},"resizedByUser":false,"handleLayoutData":[]},"aaef3b4c-3ca5-3746-b1c5-1f234843c746":{"id":"aaef3b4c-3ca5-3746-b1c5-1f234843c746","position":{"x":227.0,"y":44.79999485192454},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"99a13645-74bd-3ca4-97fd-59d8340f7bfd":{"id":"99a13645-74bd-3ca4-97fd-59d8340f7bfd","position":{"x":-11.0,"y":55.52272028641738},"size":{"width":16.0,"height":16.0},"resizedByUser":false,"handleLayoutData":[]},"1ca5292c-68e5-32f4-baa4-bf88ad8d50de":{"id":"1ca5292c-68e5-32f4-baa4-bf88ad8d50de","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"22499d75-9e78-33f5-8d12-0ff4a9c84db9":{"id":"22499d75-9e78-33f5-8d12-0ff4a9c84db9","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"13e6c905-2b6e-3401-9a90-869409118013":{"id":"13e6c905-2b6e-3401-9a90-869409118013","position":{"x":135.3473552203272,"y":88.25707342488978},"size":{"width":178.2,"height":217.59999623338376},"resizedByUser":false,"handleLayoutData":[]},"86ffe292-ab09-307e-8952-a1928d367e1b":{"id":"86ffe292-ab09-307e-8952-a1928d367e1b","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":15.0},"resizedByUser":false,"handleLayoutData":[]},"c7b1f5c0-b757-385c-a588-8492a191f009":{"id":"c7b1f5c0-b757-385c-a588-8492a191f009","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"95b0684f-cfb7-3f4a-924c-af2d18a9eed7":{"id":"95b0684f-cfb7-3f4a-924c-af2d18a9eed7","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":150.0},"resizedByUser":false,"handleLayoutData":[]},"ab9b8cdc-9e4e-3741-993e-2c1eb8ab01a0":{"id":"ab9b8cdc-9e4e-3741-993e-2c1eb8ab01a0","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":15.0},"resizedByUser":false,"handleLayoutData":[]},"a651a200-697e-370d-a7d0-03a41b1fc935":{"id":"a651a200-697e-370d-a7d0-03a41b1fc935","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"d920fb77-e4fe-3a20-85a9-45a04fd12cd5":{"id":"d920fb77-e4fe-3a20-85a9-45a04fd12cd5","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"3a8b2304-34fc-385b-a5e3-16690bb54181":{"id":"3a8b2304-34fc-385b-a5e3-16690bb54181","position":{"x":12.0,"y":44.79999485192454},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"1cc7f5f6-1200-3cf4-9141-4e83b183df0f":{"id":"1cc7f5f6-1200-3cf4-9141-4e83b183df0f","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"ddd57fbf-3d43-3abc-863e-58f8ea1cd3fb":{"id":"ddd57fbf-3d43-3abc-863e-58f8ea1cd3fb","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"07b3e9f5-55b1-3b81-97b9-e04214393b4b":{"id":"07b3e9f5-55b1-3b81-97b9-e04214393b4b","position":{"x":-11.0,"y":27.74292142703476},"size":{"width":16.0,"height":16.0},"resizedByUser":false,"handleLayoutData":[{"edgeId":"38487ae1-e4ee-32e6-892b-d43929582aa0","position":{"x":0.0,"y":0.0},"handlePosition":"left","type":"source"}]},"2d2edec6-f9cf-3c5f-ac70-68a7b5f3e46b":{"id":"2d2edec6-f9cf-3c5f-ac70-68a7b5f3e46b","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"05d57427-697d-390a-be00-174b1ec62e9a":{"id":"05d57427-697d-390a-be00-174b1ec62e9a","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"90f5cdc8-b081-3ea7-97ac-6222d520a116":{"id":"90f5cdc8-b081-3ea7-97ac-6222d520a116","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"f8cb7c7e-e74f-32b9-8d46-bd5b762680c9":{"id":"f8cb7c7e-e74f-32b9-8d46-bd5b762680c9","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"34914234-7924-3cbd-aa35-20c4b5669823":{"id":"34914234-7924-3cbd-aa35-20c4b5669823","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"f5a2beaa-d5b6-3095-9f53-e3c178c17cd8":{"id":"f5a2beaa-d5b6-3095-9f53-e3c178c17cd8","position":{"x":12.0,"y":184.79999485192454},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"db862c66-6644-350d-a764-dc6c3fb5153e":{"id":"db862c66-6644-350d-a764-dc6c3fb5153e","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"a8aa241b-5fff-3fd3-963d-60f3c5b01858":{"id":"a8aa241b-5fff-3fd3-963d-60f3c5b01858","position":{"x":-11.0,"y":79.19999623338373},"size":{"width":16.0,"height":16.0},"resizedByUser":false,"handleLayoutData":[]}},"edgeLayoutData":{"c7a54fe4-036a-3f5a-beae-c22992a2e525":{"id":"c7a54fe4-036a-3f5a-beae-c22992a2e525","bendingPoints":[],"edgeAnchorLayoutData":[]},"38487ae1-e4ee-32e6-892b-d43929582aa0":{"id":"38487ae1-e4ee-32e6-892b-d43929582aa0","bendingPoints":[],"edgeAnchorLayoutData":[]},"3ed0521b-fedd-35a5-a5f3-0f53b75f7120":{"id":"3ed0521b-fedd-35a5-a5f3-0f53b75f7120","bendingPoints":[],"edgeAnchorLayoutData":[]}},"labelLayoutData":{}}}', 'none', '2025.6.0-202506011650', '2025-06-24 09:09:02.789508+00', '2025-06-24 09:12:01.407938+00'); + + +-- +-- Data for Name: semantic_data_dependency; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + + + +-- +-- Data for Name: semantic_data_domain; Type: TABLE DATA; Schema: public; Owner: dbuser +-- + +INSERT INTO public.semantic_data_domain (semantic_data_id, uri) VALUES ('d9f1cd0e-2ca2-4e69-8a91-87a80a455e04', 'http://www.eclipse.org/syson/sysml'); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/backend/application/syson-sysml-import/src/main/java/org/eclipse/syson/sysml/ASTTransformer.java b/backend/application/syson-sysml-import/src/main/java/org/eclipse/syson/sysml/ASTTransformer.java index 27ca7801c..dfc87cded 100644 --- a/backend/application/syson-sysml-import/src/main/java/org/eclipse/syson/sysml/ASTTransformer.java +++ b/backend/application/syson-sysml-import/src/main/java/org/eclipse/syson/sysml/ASTTransformer.java @@ -164,9 +164,24 @@ private void postResolvingFixingPhase(List rootSysmlObjects) for (EObject root : rootSysmlObjects) { this.fixTransitionUsageImplicitSource(root); this.fixOperatorExpressionUsedAsRanges(root); + this.fixReferenceSubsettingWithNestedFeature(root); } } + /** + * SysIDE AST does not provide a special feature to set the referenced feature of the Feature holding the feature + * chaining element. This code sets this reference. + * + * @param root + * the root of the imported object + */ + private void fixReferenceSubsettingWithNestedFeature(EObject root) { + EMFUtils.allContainedObjectOfType(root, ReferenceSubsetting.class) + .filter(ref -> ref.getReferencedFeature() == null + && ref.getOwnedRelatedElement().stream().anyMatch(e -> e.eClass() == SysmlPackage.eINSTANCE.getFeature() && !((Feature) e).getChainingFeature().isEmpty())) + .forEach(this::fixFeatureChainReferenceUsage); + } + private void fixOperatorExpressionUsedAsRanges(EObject root) { // Only get the OperatorExpressions used in MultiplicityRange. Based on KerML 8.2.5.8.1 OperatorExpression // referring to the ".." function can exist, but the specification does not allow them in MultiplicityRange (see @@ -417,4 +432,12 @@ private String toLogMessage(Message msg) { }; return prefix + msg.body(); } + + private void fixFeatureChainReferenceUsage(ReferenceSubsetting referencesubsetting1) { + referencesubsetting1.getOwnedRelatedElement().stream() + .filter(e -> e.eClass() == SysmlPackage.eINSTANCE.getFeature() && !((Feature) e).getChainingFeature().isEmpty()) + .map(Feature.class::cast) + .findFirst() + .ifPresent(referencesubsetting1::setReferencedFeature); + } } diff --git a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java index d59ed6f61..12b3e7318 100644 --- a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java +++ b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java @@ -86,6 +86,24 @@ public static Collection getInverse(EObject source, EReference targetin return List.of(); }); + } + /** + * Gets all Settings targeting the given source element. + * + * @param source + * the source element + * @return a {@link Collection} of {@link Setting} + */ + public static Collection getInverse(EObject source) { + return source.eAdapters().stream() + .filter(ECrossReferenceAdapter.class::isInstance) + .map(ECrossReferenceAdapter.class::cast) + .map(crossRef -> crossRef.getInverseReferences(source)) + .findFirst().orElseGet(() -> { + LOGGER.warn("Unable to find a ECrossReference on " + source); + return List.of(); + }); + } /** diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/FeatureChainComputer.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/FeatureChainComputer.java new file mode 100644 index 000000000..c9e24ef00 --- /dev/null +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/FeatureChainComputer.java @@ -0,0 +1,187 @@ +/******************************************************************************* + * Copyright (c) 2025 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.services; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature.Setting; +import org.eclipse.syson.sysml.Feature; +import org.eclipse.syson.sysml.FeatureMembership; +import org.eclipse.syson.sysml.FeatureTyping; +import org.eclipse.syson.sysml.Specialization; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.sysml.Type; +import org.eclipse.syson.sysml.helper.EMFUtils; +import org.springframework.stereotype.Service; + +/** + * Object in charge of computing a chain of feature to access a {@link Feature} from one {@link Type}. + * + * @author Arthur Daussy + */ +@Service +public class FeatureChainComputer { + + /** + * Find the shortest path from the given source to the given feature. + * + * @param source + * a Type + * @param target + * a Feature + * @return an {@link Optional} list of feature (including the target) + */ + public Optional> computeShortestPath(Type source, Feature target) { + List> chains = this.computeChains(source, target, new HashSet<>()); + return chains.stream().min(Comparator.comparing(Collection::size)); + } + + /** + * Compute all feature paths from the given source to the given feature. + * + * @param source + * a {@link Type} + * @param target + * a Feature. + * @return list of all path + */ + public List> computeAllPath(Type source, Feature target) { + return this.computeChains(source, target, new HashSet<>()); + } + + private List> computeChains(Type source, Feature target, Set encounteredFeature0) { + List> result = new ArrayList<>(); + Set encounteredFeature = new HashSet<>(encounteredFeature0); + encounteredFeature.add(target); + + if (target != null) { + + if (target.getOwningType() == null) { + // The target is a feature directly available in the root namespace + List features = new ArrayList<>(); + features.add(target); + result.add(features); + } + EList sourceFeatures = source.getFeature(); + + for (Feature accessingFeature : this.computeAccessingFeature(target, encounteredFeature)) { + if (accessingFeature == source) { + List features = new ArrayList<>(); + features.add(target); + result.add(features); + } else if (sourceFeatures.contains(accessingFeature)) { + List features = new ArrayList<>(); + features.add(accessingFeature); + features.add(target); + result.add(features); + } else { + List> subchains = this.computeChains(source, accessingFeature, encounteredFeature); + for (List subChainfeature : subchains) { + if (!subChainfeature.isEmpty()) { + List features = new ArrayList<>(subChainfeature); + features.add(target); + result.add(features); + } + } + } + } + + } + return result; + } + + private List computeAccessingFeature(Feature target, Set encounteredFeature) { + + Collection inverseReferences = EMFUtils.getInverse(target); + + List accessingFeatures = new ArrayList<>(); + for (Setting s : inverseReferences) { + List accessFeatures = this.collectTargettingFeatures(s); + for (var af : accessFeatures) { + if (!encounteredFeature.contains(af) && !accessingFeatures.contains(af)) { + accessingFeatures.add(af); + } + } + } + + return accessingFeatures; + } + + private List collectTargettingFeatures(Setting inverseReference) { + EObject referenceSource = inverseReference.getEObject(); + List accessFeatures = new ArrayList<>(); + if (referenceSource instanceof FeatureTyping featureTyping && inverseReference.getEStructuralFeature() == SysmlPackage.eINSTANCE.getFeatureTyping_Type()) { + accessFeatures.add(featureTyping.getOwningFeature()); + } else if (referenceSource instanceof FeatureMembership featureMembership && inverseReference.getEStructuralFeature() == SysmlPackage.eINSTANCE.getRelationship_OwnedRelatedElement()) { + Type owningType = featureMembership.getOwningType(); + this.collectFeatureFromType(owningType, accessFeatures); + } + return accessFeatures; + } + + private void collectFeatureFromType(Type owningType, List accessFeatures) { + // If the owning type is Feature then it a valid candidate + if (owningType instanceof Feature owningFeature) { + accessFeatures.add(owningFeature); + } else if (owningType != null) { + // Otherwise check for all features typing this type of one its inherited type + this.collectTypingFeatures(accessFeatures, owningType); + } + } + + private void collectTypingFeatures(List accessFeatures, Type owningType) { + List typeToSearch = new ArrayList<>(); + typeToSearch.add(owningType); + this.collectAllSubTypes(owningType, typeToSearch); + for (Type t : typeToSearch) { + List features = EMFUtils.getInverse(t, SysmlPackage.eINSTANCE.getFeatureTyping_Type()).stream() + .map(Setting::getEObject) + .map(FeatureTyping.class::cast) + .filter(Objects::nonNull) + .map(FeatureTyping::getOwningFeature) + .toList(); + accessFeatures.addAll(features); + + } + } + + private void collectAllSubTypes(Type superType, List result) { + List specifics = this.computeSpecific(superType); + for (Type specific : specifics) { + if (!result.contains(specific)) { + result.add(specific); + this.collectAllSubTypes(specific, result); + } + } + + } + + private List computeSpecific(Type superType) { + return EMFUtils.getInverse(superType, SysmlPackage.eINSTANCE.getSubclassification_Superclassifier()) + .stream() + .map(s -> ((Specialization) s.getEObject()).getSpecific()) + .toList(); + } + + + +} diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java index 4a41acd00..38c17974e 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java @@ -38,11 +38,13 @@ import org.eclipse.syson.sysml.Classifier; import org.eclipse.syson.sysml.ConjugatedPortTyping; import org.eclipse.syson.sysml.ConnectionUsage; +import org.eclipse.syson.sysml.ConnectorAsUsage; import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.EndFeatureMembership; import org.eclipse.syson.sysml.ExhibitStateUsage; import org.eclipse.syson.sysml.Feature; +import org.eclipse.syson.sysml.FeatureChaining; import org.eclipse.syson.sysml.FeatureDirectionKind; import org.eclipse.syson.sysml.FeatureTyping; import org.eclipse.syson.sysml.FlowConnectionUsage; @@ -57,6 +59,7 @@ import org.eclipse.syson.sysml.PerformActionUsage; import org.eclipse.syson.sysml.PortUsage; import org.eclipse.syson.sysml.Redefinition; +import org.eclipse.syson.sysml.ReferenceSubsetting; import org.eclipse.syson.sysml.ReferenceUsage; import org.eclipse.syson.sysml.Relationship; import org.eclipse.syson.sysml.RenderingUsage; @@ -74,6 +77,7 @@ import org.eclipse.syson.sysml.Type; import org.eclipse.syson.sysml.Usage; import org.eclipse.syson.sysml.ViewUsage; +import org.eclipse.syson.sysml.helper.EMFUtils; import org.eclipse.syson.sysml.helper.NameHelper; import org.eclipse.syson.sysml.util.ElementUtil; import org.eclipse.syson.util.AQLUtils; @@ -887,4 +891,77 @@ public List getAllPerformActions(Element element) { .filter(performActionUsage -> !(performActionUsage instanceof ExhibitStateUsage)) .toList(); } + + /** + * Gets the closest common container for both given {@link Feature}. If none is found prefer the source owning type + * as a container. In last resort use the target owning type. + * + * @param f1 + * the first feature + * @param f2 + * the second feature + * @return the common type or null + */ + public Type getConnectorContainer(Feature f1, Feature f2) { + Type sourceType = f1.getOwningType(); + Type targetType = f2.getOwningType(); + Type container = EMFUtils.getLeastCommonContainer(Type.class, sourceType, targetType); + + if (container == null) { + container = sourceType; + if (container == null) { + container = targetType; + } + } + + return container; + } + + /** + * Sets the connector ends of a {@link ConnectorAsUsage}. + * + * @param connectorAsUsage + * The connector to configure + * @param source + * the source of the connector + * @param target + * the target of the connector + * @param connectorContainer + * the container of the connector. Use to compute the path from the feature path from the connector and + * its ends + */ + public void setConnectorEnds(ConnectorAsUsage connectorAsUsage, Feature source, Feature target, Type connectorContainer) { + this.addConnectorEnd(connectorAsUsage, source, connectorContainer); + this.addConnectorEnd(connectorAsUsage, target, connectorContainer); + } + + private ReferenceUsage addConnectorEnd(ConnectorAsUsage connectorAsUsage, Feature end, Type connectorContainer) { + FeatureChainComputer cmp = new FeatureChainComputer(); + List sourceFeaturePath = cmp.computeShortestPath(connectorContainer, end).orElse(List.of()); + EndFeatureMembership sourceEndFeatureMembership = SysmlFactory.eINSTANCE.createEndFeatureMembership(); + connectorAsUsage.getOwnedRelationship().add(sourceEndFeatureMembership); + ReferenceUsage sourceFeature = SysmlFactory.eINSTANCE.createReferenceUsage(); + sourceFeature.setIsEnd(true); + sourceEndFeatureMembership.getOwnedRelatedElement().add(sourceFeature); + this.elementInitializerSwitch.doSwitch(sourceFeature); + ReferenceSubsetting sourceReferenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); + sourceFeature.getOwnedRelationship().add(sourceReferenceSubsetting); + this.elementInitializerSwitch.doSwitch(sourceReferenceSubsetting); + if (sourceFeaturePath.isEmpty() || sourceFeaturePath.size() == 1) { + // If no path found create a direct reference. The model will not be valid but keep track of the desire + // target + sourceReferenceSubsetting.setReferencedFeature(end); + } else { + // We need to create a feature chain here + Feature sourceFeatureChain = SysmlFactory.eINSTANCE.createFeature(); + for (Feature chainedFeature : sourceFeaturePath) { + FeatureChaining featureChaining = SysmlFactory.eINSTANCE.createFeatureChaining(); + sourceFeatureChain.getOwnedRelationship().add(featureChaining); + featureChaining.setChainingFeature(chainedFeature); + } + sourceReferenceSubsetting.setReferencedFeature(sourceFeatureChain); + sourceReferenceSubsetting.getOwnedRelatedElement().add(sourceFeatureChain); + } + return sourceFeature; + } } diff --git a/backend/services/syson-services/src/test/java/org/eclipse/syson/services/FeatureChainComputerTest.java b/backend/services/syson-services/src/test/java/org/eclipse/syson/services/FeatureChainComputerTest.java new file mode 100644 index 000000000..30d2160f7 --- /dev/null +++ b/backend/services/syson-services/src/test/java/org/eclipse/syson/services/FeatureChainComputerTest.java @@ -0,0 +1,140 @@ +/******************************************************************************* + * Copyright (c) 2025 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.services; + +import static java.util.stream.Collectors.joining; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.List; +import java.util.Optional; + +import org.eclipse.emf.ecore.util.ECrossReferenceAdapter; +import org.eclipse.syson.services.data.ItemsModelTest; +import org.eclipse.syson.sysml.Feature; +import org.eclipse.syson.sysml.Type; +import org.eclipse.syson.sysml.util.ModelBuilder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * Test class for FeatureChainComputer. + * + * @author Arthur Daussy + */ +public class FeatureChainComputerTest { + + private ItemsModelTest model; + + @BeforeEach + public void setUp() { + this.model = new ItemsModelTest(); + this.model.getResourceSet().eAdapters().add(new ECrossReferenceAdapter()); + } + + @Test + @DisplayName("Given a source type and a direct feature, when computing the shortest feature chain, then the result if a direct access to the feature") + public void directAccess() { + this.assertFeatures(this.computeShortestPath(this.model.getA11(), this.model.getI11Test()), this.model.getI11Test()); + this.assertFeatures(this.computeShortestPath(this.model.getA1(), this.model.getI1()), this.model.getI1()); + } + + @Test + @DisplayName("Given a source and a feature accessed via 1 intermediate feature, when computing the shortest feature chain, then the result is composed of two feature segments") + public void featureChain2Segments() { + this.assertFeatures(this.computeShortestPath(this.model.getA1(), this.model.getId1()), this.model.getI2(), this.model.getId1()); + } + + @Test + @DisplayName("Given a source and a feature accessed via 2 intermediate features, when computing the shortest feature chain, then the result is composed of two feature segments") + public void featureChain3Segments() { + this.assertFeatures(this.computeShortestPath(this.model.getA1(), this.model.getId2()), this.model.getI2(), this.model.getId1(), + this.model.getId2()); + this.assertFeatures(this.computeShortestPath(this.model.getA0(), this.model.getI11()), this.model.getA1(), this.model.getA11(), this.model.getI11()); + } + + @Test + @DisplayName("Given a source with no access to a feature defined at root level, when computing the shortest feature chain, then the result is composed with a feature chain starting at root level") + public void rootAccessFeature() { + this.assertFeatures(this.computeShortestPath(this.model.getExternalAction(), this.model.getI11()), this.model.getA0(), this.model.getA1(), + this.model.getA11(), this.model.getI11()); + } + + @Test + @DisplayName("Given a source and a feature accessed via 2 intermediate feature with one inherited, when computing the shortest feature chain, then the result is composed with a feature chain starting at root level") + public void inheritedFeature() { + // Expected path i0.i3 (i3 is accessed using i0 which typed by ID4 which inherits from ID3) + this.assertFeatures(this.computeShortestPath(this.model.getA0(), this.model.getId3()), this.model.getI0(), this.model.getId3()); + } + + @Test + @DisplayName("Given a source and a feature via multiple path, when computing all feature path, then all matching path are returned") + public void multiplePath() { + ModelBuilder builder = new ModelBuilder(); + // Makes i1 typed by ID4 + builder.setType(this.model.getI1(), this.model.getIdef4()); + // Makes i11Test typed by ID3 + builder.setType(this.model.getI11Test(), this.model.getIdef3()); + // Compute all path + this.assertAllPathFeatures(this.computeAllPath(this.model.getA0(), this.model.getId3()), List.of( + List.of(this.model.getI0(), this.model.getId3()), + List.of(this.model.getA1(), this.model.getI1(), this.model.getId3()), + List.of(this.model.getA1(), this.model.getA11(), this.model.getI11Test(), this.model.getId3()))); + // Compute shortest path + this.assertFeatures(this.computeShortestPath(this.model.getA0(), this.model.getId3()), this.model.getI0(), this.model.getId3()); + } + + // Check against infinite loop + @Test + @DisplayName("Given a source and a feature using type infinit loop, when computing the shortest feature chain, then no stackoverflow is thrown") + public void checkAgainstInfiniteLoop() { + ModelBuilder builder = new ModelBuilder(); + builder.setType(this.model.getId2(), this.model.getIdef1()); + this.assertFeatures(this.computeShortestPath(this.model.getA1(), this.model.getId2()), this.model.getI2(), this.model.getId1(), this.model.getId2()); + builder.setType(this.model.getId1(), this.model.getIdef1()); + this.assertFeatures(this.computeShortestPath(this.model.getA1(), this.model.getId1()), this.model.getI2(), this.model.getId1()); + + } + + private Optional> computeShortestPath(Type source, Feature target) { + return new FeatureChainComputer().computeShortestPath(source, target); + } + + private List> computeAllPath(Type source, Feature target) { + return new FeatureChainComputer().computeAllPath(source, target); + } + + private void assertFeatures(Optional> features, Feature... expected) { + assertTrue(features.isPresent()); + List expecteds = List.of(expected); + assertThat(features.get()) + .as("\nExpected :\n" + expecteds.stream().map(f -> f.getName()).collect(joining(",")) + "\n but was : \n" + features.get().stream().map(f -> f.getName()).collect(joining(","))) + .isEqualTo(expecteds); + } + + private String featuresToString(List features) { + return features.stream().map(f -> f.getName()).collect(joining(",")); + } + + private String pathToStringToString(List> path) { + return path.stream().map(this::featuresToString).collect(joining(",\n")); + } + + private void assertAllPathFeatures(List> path, List> expectedPaths) { + assertThat(path) + .as("Expecting :\n" + this.pathToStringToString(expectedPaths) + "\n but was :\n " + this.pathToStringToString(path)) + .containsExactlyInAnyOrderElementsOf(expectedPaths); + } + +} diff --git a/backend/services/syson-services/src/test/java/org/eclipse/syson/services/data/ItemsModelTest.java b/backend/services/syson-services/src/test/java/org/eclipse/syson/services/data/ItemsModelTest.java new file mode 100644 index 000000000..79f9277fc --- /dev/null +++ b/backend/services/syson-services/src/test/java/org/eclipse/syson/services/data/ItemsModelTest.java @@ -0,0 +1,260 @@ +/******************************************************************************* + * Copyright (c) 2025 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.services.data; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.sirius.components.emf.services.JSONResourceFactory; +import org.eclipse.sirius.emfjson.resource.JsonResource; +import org.eclipse.syson.sysml.ActionUsage; +import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.FeatureDirectionKind; +import org.eclipse.syson.sysml.ItemDefinition; +import org.eclipse.syson.sysml.ItemUsage; +import org.eclipse.syson.sysml.Namespace; +import org.eclipse.syson.sysml.Package; +import org.eclipse.syson.sysml.util.ModelBuilder; + +/** + * Test model with items. + * + *
+    action externalAction {
+                in item i00;
+            }
+
+            package P0 {
+                item def ID1 {
+                    in item id1 : ID2;
+                }
+
+                item def ID2 {
+                    in item id2;
+                }
+
+                item def ID3 {
+                    in item id3;
+                }
+
+                item def ID4 :> ID3{
+                }
+            }
+
+            action a0 {
+                item i0 : ID4;
+
+                action a1 {
+
+                    in item i1;
+                    in item i2 : P0::ID1;
+
+                    action a11 {
+                        in item i11;
+                        in item i11Test;
+                    }
+                }
+            }
+ * 
+ * + * @author Arthur Daussy + */ +public class ItemsModelTest { + private final ModelBuilder builder = new ModelBuilder(); + + private ResourceSetImpl resourceSet; + + private JsonResource resource; + + private Namespace rootNamespace; + + private ActionUsage externalAction; + + private ItemUsage i00; + + private Package p0; + + private ItemDefinition idef1; + + private ItemUsage id1; + + private ItemDefinition idef2; + + private ItemUsage id2; + + private ActionUsage a0; + + private ItemUsage i0; + + private ActionUsage a1; + + private ItemUsage i1; + + private ItemUsage i2; + + private ActionUsage a11; + + private ItemUsage i11; + + private ItemUsage i11Test; + + private ItemDefinition idef3; + + private ItemUsage id3; + + private ItemDefinition idef4; + + public ItemsModelTest() { + this.build(); + } + + private void build() { + this.resourceSet = new ResourceSetImpl(); + this.resource = new JSONResourceFactory().createResource(URI.createURI("fakeURI://testModel")); + this.resourceSet.getResources().add(this.resource); + this.rootNamespace = this.builder.createRootNamespace(); + this.resource.getContents().add(this.rootNamespace); + + this.externalAction = this.builder.createInWithName(ActionUsage.class, this.rootNamespace, "externalAction"); + this.i00 = this.createInItemUsageIn(this.externalAction, "i00"); + + + this.p0 = this.builder.createInWithName(Package.class, this.rootNamespace, "P0"); + + this.idef1 = this.builder.createInWithName(ItemDefinition.class, this.p0, "ID1"); + this.id1 = this.createInItemUsageIn(this.idef1, "id1"); + + this.idef2 = this.builder.createInWithName(ItemDefinition.class, this.p0, "ID2"); + this.id2 = this.createInItemUsageIn(this.idef2, "id2"); + + this.idef3 = this.builder.createInWithName(ItemDefinition.class, this.p0, "ID3"); + this.id3 = this.createInItemUsageIn(this.idef3, "id3"); + + this.idef4 = this.builder.createInWithName(ItemDefinition.class, this.p0, "ID4"); + + this.builder.addSubclassification(this.idef4, this.idef3); + + this.a0 = this.builder.createInWithName(ActionUsage.class, this.rootNamespace, "a0"); + this.i0 = this.createInItemUsageIn(this.a0, "i0"); + this.builder.setType(this.i0, this.idef4); + + this.a1 = this.builder.createInWithName(ActionUsage.class, this.a0, "a1"); + + + this.i1 = this.createInItemUsageIn(this.a1, "i1"); + this.i2 = this.createInItemUsageIn(this.a1, "i2"); + + this.a11 = this.builder.createInWithName(ActionUsage.class, this.a1, "a11"); + + this.i11 = this.createInItemUsageIn(this.a11, "i11"); + this.i11Test = this.createInItemUsageIn(this.a11, "i11Test"); + + this.builder.setType(this.id1, this.idef2); + this.builder.setType(this.i2, this.idef1); + + } + + private ItemUsage createInItemUsageIn(Element parent, String name) { + ItemUsage result = this.builder.createInWithName(ItemUsage.class, parent, name); + result.setDirection(FeatureDirectionKind.IN); + return result; + } + + + public ResourceSetImpl getResourceSet() { + return this.resourceSet; + } + + public JsonResource getResource() { + return this.resource; + } + + public ModelBuilder getBuilder() { + return this.builder; + } + + public Namespace getRootNamespace() { + return this.rootNamespace; + } + + public ActionUsage getExternalAction() { + return this.externalAction; + } + + public ItemUsage getI00() { + return this.i00; + } + + public Package getP0() { + return this.p0; + } + + public ItemDefinition getIdef1() { + return this.idef1; + } + + public ItemUsage getId1() { + return this.id1; + } + + public ItemDefinition getIdef2() { + return this.idef2; + } + + public ItemUsage getId2() { + return this.id2; + } + + public ActionUsage getA0() { + return this.a0; + } + + public ItemUsage getI0() { + return this.i0; + } + + public ActionUsage getA1() { + return this.a1; + } + + public ItemUsage getI1() { + return this.i1; + } + + public ItemUsage getI2() { + return this.i2; + } + + public ActionUsage getA11() { + return this.a11; + } + + public ItemUsage getI11() { + return this.i11; + } + + public ItemUsage getI11Test() { + return this.i11Test; + } + + public ItemUsage getId3() { + return this.id3; + } + + public ItemDefinition getIdef3() { + return this.idef3; + } + + public ItemDefinition getIdef4() { + return this.idef4; + } +} diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractBindingConnectorAsUsageEdgeDescriptionProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractBindingConnectorAsUsageEdgeDescriptionProvider.java index 8847ea783..88a767bd4 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractBindingConnectorAsUsageEdgeDescriptionProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractBindingConnectorAsUsageEdgeDescriptionProvider.java @@ -84,10 +84,10 @@ public EdgeDescription create() { .centerLabelExpression("=") .name(this.getName()) .semanticCandidatesExpression("aql:self.getAllReachable(" + domainType + ")") - .sourceExpression("aql:self.getSourcePort()") + .sourceExpression("aql:self.getSource()") .style(this.createEdgeStyle()) .synchronizationPolicy(SynchronizationPolicy.SYNCHRONIZED) - .targetExpression("aql:self.getTargetPort()") + .targetExpression("aql:self.getTarget()") .build(); } @@ -133,12 +133,12 @@ protected LabelEditTool getEdgeEditTool() { @Override protected ChangeContextBuilder getSourceReconnectToolBody() { return this.viewBuilderHelper.newChangeContext() - .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".setSourcePort(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); + .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".reconnectSource(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); } @Override protected ChangeContextBuilder getTargetReconnectToolBody() { return this.viewBuilderHelper.newChangeContext() - .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".setTargetPort(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); + .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".reconnectTarget(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); } } diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractInterfaceUsageEdgeDescriptionProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractInterfaceUsageEdgeDescriptionProvider.java index d50d90001..f49df2295 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractInterfaceUsageEdgeDescriptionProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractInterfaceUsageEdgeDescriptionProvider.java @@ -84,10 +84,10 @@ public EdgeDescription create() { .centerLabelExpression("aql:self.getEdgeLabel()") .name(this.getName()) .semanticCandidatesExpression("aql:self.getAllReachable(" + domainType + ")") - .sourceExpression("aql:self.getSourcePort()") + .sourceExpression("aql:self.getSource()") .style(this.createEdgeStyle()) .synchronizationPolicy(SynchronizationPolicy.SYNCHRONIZED) - .targetExpression("aql:self.getTargetPort()") + .targetExpression("aql:self.getTarget()") .build(); } @@ -131,12 +131,12 @@ protected LabelEditTool getEdgeEditTool() { @Override protected ChangeContextBuilder getSourceReconnectToolBody() { return this.viewBuilderHelper.newChangeContext() - .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".setSourcePort(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); + .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".reconnectSource(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); } @Override protected ChangeContextBuilder getTargetReconnectToolBody() { return this.viewBuilderHelper.newChangeContext() - .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".setTargetPort(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); + .expression(AQLConstants.AQL + AQLConstants.EDGE_SEMANTIC_ELEMENT + ".reconnectTarget(" + AQLConstants.SEMANTIC_RECONNECTION_TARGET + ")"); } } 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 499b38e47..e916c609a 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 @@ -1101,36 +1101,18 @@ public FlowConnectionUsage createFlowConnectionUsage(Feature source, Feature tar } public BindingConnectorAsUsage createBindingConnectorAsUsage(Feature source, Feature target) { - Namespace bindingContainer = this.getClosestContainingDefinitionOrPackageFrom(source); - if (bindingContainer == null) { + + Type container = this.utilService.getConnectorContainer(source, target); + if (container == null) { + this.feedbackMessageService.addFeedbackMessage(new Message("Unable to find a suitable Type to hold the new binding connector.", MessageLevel.WARNING)); return null; } BindingConnectorAsUsage bindingConnectorAsUsage = SysmlFactory.eINSTANCE.createBindingConnectorAsUsage(); - this.addChildInParent(bindingContainer, bindingConnectorAsUsage); + this.addChildInParent(container, bindingConnectorAsUsage); this.elementInitializer(bindingConnectorAsUsage); - EndFeatureMembership sourceEndFeatureMembership = SysmlFactory.eINSTANCE.createEndFeatureMembership(); - bindingConnectorAsUsage.getOwnedRelationship().add(sourceEndFeatureMembership); - ReferenceUsage sourceFeature = SysmlFactory.eINSTANCE.createReferenceUsage(); - sourceFeature.setIsEnd(true); - sourceEndFeatureMembership.getOwnedRelatedElement().add(sourceFeature); - this.elementInitializer(sourceFeature); - ReferenceSubsetting sourceReferenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); - sourceFeature.getOwnedRelationship().add(sourceReferenceSubsetting); - this.elementInitializer(sourceReferenceSubsetting); - sourceReferenceSubsetting.setReferencedFeature(source); - - EndFeatureMembership targetEndFeatureMembership = SysmlFactory.eINSTANCE.createEndFeatureMembership(); - bindingConnectorAsUsage.getOwnedRelationship().add(targetEndFeatureMembership); - ReferenceUsage targetFeature = SysmlFactory.eINSTANCE.createReferenceUsage(); - targetFeature.setIsEnd(true); - targetEndFeatureMembership.getOwnedRelatedElement().add(targetFeature); - this.elementInitializer(sourceFeature); - ReferenceSubsetting targetReferenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); - targetFeature.getOwnedRelationship().add(targetReferenceSubsetting); - this.elementInitializer(targetReferenceSubsetting); - targetReferenceSubsetting.setReferencedFeature(target); + this.utilService.setConnectorEnds(bindingConnectorAsUsage, source, target, container); return bindingConnectorAsUsage; } diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeService.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeService.java index 6193c0070..dfe4378ca 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeService.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeService.java @@ -27,9 +27,7 @@ import org.eclipse.syson.services.UtilService; import org.eclipse.syson.sysml.ActionUsage; import org.eclipse.syson.sysml.AllocationUsage; -import org.eclipse.syson.sysml.BindingConnectorAsUsage; import org.eclipse.syson.sysml.ConnectorAsUsage; -import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.EndFeatureMembership; import org.eclipse.syson.sysml.Expression; @@ -40,11 +38,7 @@ import org.eclipse.syson.sysml.FeatureReferenceExpression; import org.eclipse.syson.sysml.FeatureValue; import org.eclipse.syson.sysml.FlowConnectionUsage; -import org.eclipse.syson.sysml.InterfaceUsage; -import org.eclipse.syson.sysml.ItemUsage; import org.eclipse.syson.sysml.Membership; -import org.eclipse.syson.sysml.Namespace; -import org.eclipse.syson.sysml.PortUsage; import org.eclipse.syson.sysml.Redefinition; import org.eclipse.syson.sysml.ReferenceSubsetting; import org.eclipse.syson.sysml.ReferenceUsage; @@ -54,6 +48,7 @@ import org.eclipse.syson.sysml.SysmlFactory; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.sysml.TransitionUsage; +import org.eclipse.syson.sysml.Type; import org.eclipse.syson.sysml.Usage; import org.eclipse.syson.util.SysMLMetamodelHelper; @@ -130,14 +125,6 @@ public List getAllReachableAllocationUsages(EObject eObject) { .toList(); } - public Element getSource(SuccessionAsUsage succession) { - return succession.getSourceFeature(); - } - - public Element getTarget(SuccessionAsUsage succession) { - return succession.getTargetFeature().stream().findFirst().orElse(null); - } - public Element getSourceAllocateEdge(AllocationUsage allocationUsage) { var features = this.getFeatures(allocationUsage); if (features.size() == 2) { @@ -387,44 +374,6 @@ public Feature unwrapFeature(Feature input) { } } - /** - * Return the source {@link Usage} of the given {@link ConnectorAsUsage} (e.g. a {@link BindingConnectorAsUsage}, an - * {@link InterfaceUsage}). - * - * @param bind - * the given {@link ConnectorAsUsage}. - * @return the source {@link Usage} if found, null otherwise. - */ - public Usage getSourcePort(ConnectorAsUsage bind) { - Usage sourcePort = null; - Optional endFeatureMembership = bind.getOwnedFeatureMembership().stream() - .filter(EndFeatureMembership.class::isInstance) - .map(EndFeatureMembership.class::cast) - .findFirst(); - if (endFeatureMembership.isPresent()) { - Optional referencedFeature = endFeatureMembership.get().getOwnedRelatedElement().stream() - .filter(Feature.class::isInstance) - .map(Feature.class::cast) - .findFirst() - .map(Feature::getOwnedReferenceSubsetting) - .map(ReferenceSubsetting::getReferencedFeature); - if (referencedFeature.isPresent()) { - Feature feature = referencedFeature.get(); - if (feature instanceof PortUsage || feature instanceof ItemUsage) { - sourcePort = (Usage) feature; - } else if (!feature.getOwnedFeatureChaining().isEmpty()) { - EList ownedFeatureChaining = feature.getOwnedFeatureChaining(); - FeatureChaining lastFeatureChaining = ownedFeatureChaining.get(Math.max(0, ownedFeatureChaining.size() - 1)); - Feature chainingFeature = lastFeatureChaining.getChainingFeature(); - if (chainingFeature instanceof PortUsage || chainingFeature instanceof ItemUsage) { - sourcePort = (Usage) chainingFeature; - } - } - } - } - return sourcePort; - } - /** * Get the target of a {@link FeatureValue} edge. * @@ -450,41 +399,32 @@ public Feature getFeatureValueTarget(FeatureValue featureValue) { } /** - * Return the target {@link Usage} of the given {@link ConnectorAsUsage} (e.g. a {@link BindingConnectorAsUsage}, an - * {@link InterfaceUsage}). + * Gets the target of a {@link ConnectorAsUsage}. * - * @param bind - * the given {@link ConnectorAsUsage}. - * @return the target {@link Usage} if found, null otherwise. + * @param connector + * a {@link ConnectorAsUsage} + * @return a list of targets */ - public Usage getTargetPort(ConnectorAsUsage bind) { - Usage targetPort = null; - Optional endFeatureMembership = bind.getOwnedFeatureMembership().stream() - .filter(EndFeatureMembership.class::isInstance) - .map(EndFeatureMembership.class::cast) - .reduce((first, second) -> second); - if (endFeatureMembership.isPresent()) { - Optional referencedFeature = endFeatureMembership.get().getOwnedRelatedElement().stream() - .filter(Feature.class::isInstance) - .map(Feature.class::cast) - .findFirst() - .map(Feature::getOwnedReferenceSubsetting) - .map(ReferenceSubsetting::getReferencedFeature); - if (referencedFeature.isPresent()) { - Feature feature = referencedFeature.get(); - if (feature instanceof PortUsage || feature instanceof ItemUsage) { - targetPort = (Usage) feature; - } else if (!feature.getOwnedFeatureChaining().isEmpty()) { - EList ownedFeatureChaining = feature.getOwnedFeatureChaining(); - FeatureChaining lastFeatureChaining = ownedFeatureChaining.get(Math.max(0, ownedFeatureChaining.size() - 1)); - Feature chainingFeature = lastFeatureChaining.getChainingFeature(); - if (chainingFeature instanceof PortUsage || chainingFeature instanceof ItemUsage) { - targetPort = (Usage) feature; - } - } - } + public List getTarget(ConnectorAsUsage connector) { + return connector.getTargetFeature().stream() + .filter(Objects::nonNull) + .map(Feature::getFeatureTarget) + .toList(); + } + + /** + * Gets the source of a {@link ConnectorAsUsage}. + * + * @param connector + * a {@link ConnectorAsUsage} + * @return the source feature + */ + public Feature getSource(ConnectorAsUsage connectorAsUsage) { + Feature sourceFeature = connectorAsUsage.getSourceFeature(); + if (sourceFeature != null) { + return sourceFeature.getFeatureTarget(); } - return targetPort; + return null; } /** @@ -537,30 +477,28 @@ public FlowConnectionUsage reconnectTarget(FlowConnectionUsage flow, Feature new * the new target {@link Element}. * @return the given {@link ConnectorAsUsage}. */ - public ConnectorAsUsage setSourcePort(ConnectorAsUsage bind, Element newSource) { - if (newSource instanceof PortUsage newSourcePort) { - Optional endFeatureMembership = bind.getOwnedFeatureMembership().stream() - .filter(EndFeatureMembership.class::isInstance) - .map(EndFeatureMembership.class::cast) - .findFirst(); - if (endFeatureMembership.isPresent()) { - endFeatureMembership.get().getOwnedRelatedElement().stream() - .filter(Feature.class::isInstance) - .map(Feature.class::cast) - .findFirst() - .map(Feature::getOwnedReferenceSubsetting) - .ifPresent(refSub -> { - refSub.setReferencedFeature(newSourcePort); - // move the given connector into the parent of the new source - Namespace owningNamespace = newSourcePort.getOwningNamespace(); - if (owningNamespace instanceof Usage || owningNamespace instanceof Definition) { - owningNamespace.getOwnedRelationship().add(bind.getOwningRelationship()); - } - }); - } - } else { - this.feedbackMessageService.addFeedbackMessage(new Message("The source of the ConnectorAsUsage can only be connected to a PortUsage", MessageLevel.WARNING)); + public ConnectorAsUsage reconnectSource(ConnectorAsUsage bind, Feature newSource) { + Optional optOldTarget = this.getTarget(bind).stream().findFirst(); + if (optOldTarget.isEmpty()) { + // Invalid model for reconnection + this.feedbackMessageService.addFeedbackMessage(new Message("Invalid connector : Missing target", MessageLevel.WARNING)); + return bind; + } + Type newContainer = this.utilService.getConnectorContainer(optOldTarget.get(), newSource); + + if (bind.getOwningType() != newContainer && newContainer != null) { + // Move to the new container + newContainer.getOwnedRelationship().add(bind.getOwningRelationship()); } + + // Recompute both target and source chain + List endFeatureMemberships = bind.getOwnedFeatureMembership().stream() + .filter(EndFeatureMembership.class::isInstance) + .map(EndFeatureMembership.class::cast) + .toList(); + bind.getOwnedRelationship().removeAll(endFeatureMemberships); + + this.utilService.setConnectorEnds(bind, newSource, optOldTarget.get(), newContainer); return bind; } @@ -573,23 +511,29 @@ public ConnectorAsUsage setSourcePort(ConnectorAsUsage bind, Element newSource) * the new target {@link Element}. * @return the given {@link ConnectorAsUsage}. */ - public ConnectorAsUsage setTargetPort(ConnectorAsUsage bind, Element newTarget) { - if (newTarget instanceof PortUsage newTargetPort) { - Optional endFeatureMembership = bind.getOwnedFeatureMembership().stream() - .filter(EndFeatureMembership.class::isInstance) - .map(EndFeatureMembership.class::cast) - .reduce((first, second) -> second); - if (endFeatureMembership.isPresent()) { - endFeatureMembership.get().getOwnedRelatedElement().stream() - .filter(Feature.class::isInstance) - .map(Feature.class::cast) - .findFirst() - .map(Feature::getOwnedReferenceSubsetting) - .ifPresent(refSub -> refSub.setReferencedFeature(newTargetPort)); - } - } else { - this.feedbackMessageService.addFeedbackMessage(new Message("The target of the ConnectorAsUsage can only be connected to a PortUsage", MessageLevel.WARNING)); + public ConnectorAsUsage reconnectTarget(ConnectorAsUsage bind, Feature newTarget) { + Feature source = this.getSource(bind); + if (source == null) { + // Invalid model for reconnection + this.feedbackMessageService.addFeedbackMessage(new Message("Invalid connector : Missing source", MessageLevel.WARNING)); + return bind; + } + Type newContainer = this.utilService.getConnectorContainer(source, newTarget); + + if (bind.getOwningType() != newContainer && newContainer != null) { + // Move to the new container + newContainer.getOwnedRelationship().add(bind.getOwningRelationship()); } + + // Recompute both target and source chain + + List endFeatureMemberships = bind.getOwnedFeatureMembership().stream() + .filter(EndFeatureMembership.class::isInstance) + .map(EndFeatureMembership.class::cast) + .toList(); + bind.getOwnedRelationship().removeAll(endFeatureMemberships); + + this.utilService.setConnectorEnds(bind, source, newTarget, newContainer); return bind; } diff --git a/backend/views/syson-diagram-interconnection-view/src/test/java/org/eclipse/syson/diagram/interconnection/view/InterconnectionViewCreateServiceTests.java b/backend/views/syson-diagram-interconnection-view/src/test/java/org/eclipse/syson/diagram/interconnection/view/InterconnectionViewCreateServiceTests.java index b60740608..fda6253d3 100644 --- a/backend/views/syson-diagram-interconnection-view/src/test/java/org/eclipse/syson/diagram/interconnection/view/InterconnectionViewCreateServiceTests.java +++ b/backend/views/syson-diagram-interconnection-view/src/test/java/org/eclipse/syson/diagram/interconnection/view/InterconnectionViewCreateServiceTests.java @@ -28,6 +28,7 @@ import org.eclipse.syson.diagram.common.view.services.ShowDiagramsInheritedMembersService; import org.eclipse.syson.diagram.interconnection.view.services.InterconnectionViewCreateService; import org.eclipse.syson.sysml.BindingConnectorAsUsage; +import org.eclipse.syson.sysml.FeatureMembership; import org.eclipse.syson.sysml.FlowConnectionUsage; import org.eclipse.syson.sysml.InterfaceUsage; import org.eclipse.syson.sysml.Namespace; @@ -93,15 +94,14 @@ public Optional findById(IEditingContext editingContext, Str this.build(); } - @DisplayName("Given an existing model, when the createBindingConnectorAsUsage service is called, then a BindingConnectorAsUsage is created under the root Package and an OwningMembership.") + @DisplayName("Given an existing model, when the createBindingConnectorAsUsage service is called, then a BindingConnectorAsUsage is created under the common ancestor of the source and target.") @Test public void testCreateBindingConnectorAsUsage() { BindingConnectorAsUsage bindingConnectorAsUsage = this.interconnectionViewCreateService.createBindingConnectorAsUsage(this.port2, this.port3); assertNotNull(bindingConnectorAsUsage); - var owningNamespace = bindingConnectorAsUsage.getOwningNamespace(); - assertSame(this.partDef1, owningNamespace); + assertSame(this.part1, bindingConnectorAsUsage.getOwningType()); var owningMembership = bindingConnectorAsUsage.getOwningMembership(); - assertInstanceOf(OwningMembership.class, owningMembership); + assertInstanceOf(FeatureMembership.class, owningMembership); } @DisplayName("Given an existing model, when the createInterfaceUsage service is called, then an InterfaceUsage is created under the root Package and an OwningMembership.") diff --git a/doc/content/modules/user-manual/pages/release-notes/2025.8.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2025.8.0.adoc index 16e772fbc..e83df0545 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2025.8.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2025.8.0.adoc @@ -16,6 +16,23 @@ - Fix an issue that made the _Expand All_ tool not work consistently in SysON _Explorer_ view. - Fix an issue where a d'n'd of an `Element` from the _Explorer_ view to a diagram exposed the `Element` twice in the `ViewUsage` associated to the diagram. +- In the _General View_ diagram, the creation of `BindingConnectorAsUsage` now computes the shortest feature path between the source feature and the target feature to create a feature chain if required. +For example creating a `BindingConnectorAsUsage` between "i0" and "i11" in the following model will create the feature chain : _a1.a11.i11_. + +``` +action a0 { + item i0; + action a1 { + action a11 { + in item i11; + } + } +} +``` + +Moreover, the tooling has been improved to: +* Find the best containment location at creation time. In this case, "a0" +* Handle properly source/target reconnection to recompute feature chain and the best container. == Improvements