diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index e543a1915..462563b2e 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -16,6 +16,8 @@ === New features +- https://github.com/eclipse-syson/syson/issues/1581[#1581] [diagrams] Display inherited `PortUsages` as border nodes in diagrams + == v2025.10.0 === Breaking changes diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVInheritedPortTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVInheritedPortTests.java new file mode 100644 index 000000000..7105631f8 --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVInheritedPortTests.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * 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.DiagramEventPayloadConsumer.assertRefreshedDiagramThat; + +import com.jayway.jsonpath.JsonPath; + +import java.time.Duration; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramEventInput; +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramRefreshedEventPayload; +import org.eclipse.sirius.components.diagrams.tests.navigation.DiagramNavigator; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.eclipse.syson.AbstractIntegrationTests; +import org.eclipse.syson.application.controllers.diagrams.graphql.ShowDiagramsInheritedMembersMutationRunner; +import org.eclipse.syson.application.data.GeneralViewInheritedPortTestProjectData; +import org.eclipse.syson.diagram.common.view.services.dto.ShowDiagramsInheritedMembersInput; +import org.eclipse.syson.diagram.common.view.services.dto.ShowDiagramsInheritedMembersSuccessPayload; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramSubscription; +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.core.publisher.Flux; +import reactor.test.StepVerifier; + +/** + * Tests the display of inherited ports inside the General View diagram. + * + * @author frouene + */ +@Transactional +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class GVInheritedPortTests extends AbstractIntegrationTests { + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IGivenDiagramSubscription givenDiagramSubscription; + + @Autowired + private ShowDiagramsInheritedMembersMutationRunner showDiagramsInheritedMembersMutationRunner; + + private Flux givenSubscriptionToDiagram() { + var diagramEventInput = new DiagramEventInput(UUID.randomUUID(), + GeneralViewInheritedPortTestProjectData.EDITING_CONTEXT_ID, + GeneralViewInheritedPortTestProjectData.GraphicalIds.DIAGRAM_ID); + return this.givenDiagramSubscription.subscribe(diagramEventInput); + } + + @BeforeEach + public void beforeEach() { + this.givenInitialServerState.initialize(); + } + + @DisplayName("GIVEN a diagram with some inherited port, WHEN show inherited members filter is uncheck, THEN inherited ports are not displayed") + @Sql(scripts = { GeneralViewInheritedPortTestProjectData.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 checkInheritedPortsVisibility() { + var flux = this.givenSubscriptionToDiagram(); + + var diagramId = new AtomicReference(); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + diagramId.set(diagram.getId()); + var part2Node = new DiagramNavigator(diagram).nodeWithLabel("«part»\npart2").getNode(); + assertThat(part2Node.getBorderNodes()).hasSize(1); + assertThat(part2Node.getBorderNodes()).allMatch(node -> node.getOutsideLabels().get(0).text().equals("port1")); + var v1Node = new DiagramNavigator(diagram).nodeWithLabel("«part»\nv1 : Vehicle").getNode(); + assertThat(v1Node.getBorderNodes()).hasSize(1); + assertThat(v1Node.getBorderNodes()).allMatch(node -> node.getOutsideLabels().get(0).text().equals("^fuelInPort : FuelPort")); + }); + + Runnable uncheckShowInheritedMembersFilter = () -> { + var input = new ShowDiagramsInheritedMembersInput( + UUID.randomUUID(), + GeneralViewInheritedPortTestProjectData.EDITING_CONTEXT_ID, + diagramId.get(), + false); + var result = this.showDiagramsInheritedMembersMutationRunner.run(input); + String typename = JsonPath.read(result, "$.data.showDiagramsInheritedMembers.__typename"); + assertThat(typename).isEqualTo(ShowDiagramsInheritedMembersSuccessPayload.class.getSimpleName()); + }; + + Consumer updatedDiagramContentConsumerAfterInheritedVisibilityChange = assertRefreshedDiagramThat(diagram -> { + var part2Node = new DiagramNavigator(diagram).nodeWithLabel("«part»\npart2").getNode(); + assertThat(part2Node.getBorderNodes()).hasSize(1); + var v1Node = new DiagramNavigator(diagram).nodeWithLabel("«part»\nv1 : Vehicle").getNode(); + assertThat(v1Node.getBorderNodes()).hasSize(0); + }); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(uncheckShowInheritedMembersFilter) + .consumeNextWith(updatedDiagramContentConsumerAfterInheritedVisibilityChange) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } +} diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/graphql/ShowDiagramsInheritedMembersMutationRunner.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/graphql/ShowDiagramsInheritedMembersMutationRunner.java new file mode 100644 index 000000000..51d2837d7 --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/graphql/ShowDiagramsInheritedMembersMutationRunner.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * 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.graphql; + +import java.util.Objects; + +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.graphql.tests.api.IGraphQLRequestor; +import org.eclipse.sirius.components.graphql.tests.api.IMutationRunner; +import org.springframework.stereotype.Service; + +/** + * Used to show diagram inherited members with the GraphQL API. + * + * @author frouene + */ +@Service +public class ShowDiagramsInheritedMembersMutationRunner implements IMutationRunner { + + private static final String SHOW_DIAGRAM_INHERITED_MEMBERS_MUTATION = """ + mutation showDiagramsInheritedMembers($input: ShowDiagramsInheritedMembersInput!) { + showDiagramsInheritedMembers(input: $input) { + __typename + ... on ShowDiagramsInheritedMembersSuccessPayload { + show + } + ... on ErrorPayload { + message + } + } + } + """; + + private final IGraphQLRequestor graphQLRequestor; + + public ShowDiagramsInheritedMembersMutationRunner(IGraphQLRequestor graphQLRequestor) { + this.graphQLRequestor = Objects.requireNonNull(graphQLRequestor); + } + + @Override + public String run(IInput input) { + return this.graphQLRequestor.execute(SHOW_DIAGRAM_INHERITED_MEMBERS_MUTATION, input); + } +} diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewInheritedPortTestProjectData.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewInheritedPortTestProjectData.java new file mode 100644 index 000000000..f192be7df --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewInheritedPortTestProjectData.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * 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; + +/** + * Identifiers for "GeneralView-InheritedPort" project. + * + * @author frouene + */ +public class GeneralViewInheritedPortTestProjectData { + + public static final String SCRIPT_PATH = "/scripts/database-content/GeneralView-InheritedPort.sql"; + + public static final String EDITING_CONTEXT_ID = "c3b348b0-548e-4bee-b039-925a0a9eece0"; + + /** + * Ids of graphical elements. + */ + public static class GraphicalIds { + + public static final String DIAGRAM_ID = "d10ee99f-f2cf-4182-a614-e620e885f55f"; + + } + + /** + * Ids for the semantic elements. + */ + public static class SemanticIds { + + } + +} diff --git a/backend/application/syson-application/src/test/resources/scripts/database-content/GeneralView-InheritedPort.sql b/backend/application/syson-application/src/test/resources/scripts/database-content/GeneralView-InheritedPort.sql new file mode 100644 index 000000000..321d70130 --- /dev/null +++ b/backend/application/syson-application/src/test/resources/scripts/database-content/GeneralView-InheritedPort.sql @@ -0,0 +1,100 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 17.5 (Debian 17.5-1.pgdg120+1) +-- Dumped by pg_dump version 17.5 + +SET statement_timeout = 0; +SET lock_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 ('c3b348b0-548e-4bee-b039-925a0a9eece0', '2025-10-10 08:03:00.114484+00', '2025-10-10 08:03:58.5535+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, is_read_only) VALUES ('ae846c0a-ff6c-4b07-9cb6-2f8a7a81f459', 'c3b348b0-548e-4bee-b039-925a0a9eece0', 'InheritedPort.sysml', '{"json":{"version":"1.0","encoding":"utf-8"},"ns":{"sysml":"http://www.eclipse.org/syson/sysml"},"migration":{"lastMigrationPerformed":"OneDiagramDescriptionMigrationParticipant$$SpringCGLIB$$0","migrationVersion":"2025.8.0-202508220000"},"content":[{"id":"d8139f59-bd0c-44cd-a545-41a7a9e4626a","eClass":"sysml:Namespace","data":{"elementId":"83c29e0e-b863-4eaa-99a6-03b9ebf58c46","ownedRelationship":[{"id":"0a2e2e96-84d3-4662-ade4-630a79af4b4f","eClass":"sysml:OwningMembership","data":{"elementId":"dcb0a3b2-d052-4a4d-909e-1b233ba9c81e","ownedRelatedElement":[{"id":"9421b069-d2d9-4e32-bde2-1d4091da2fda","eClass":"sysml:Package","data":{"declaredName":"Package1","elementId":"52acb223-361d-46eb-8136-2413def5616e","ownedRelationship":[{"id":"0f2c6d65-2fb7-4128-8055-16a9f8c6c120","eClass":"sysml:OwningMembership","data":{"elementId":"d56d0b62-f41a-4738-a7ce-a7c4fcf00e9c","ownedRelatedElement":[{"id":"42cde4bf-a073-41eb-bfe5-3a28fc8dbb44","eClass":"sysml:ViewUsage","data":{"declaredName":"view1","elementId":"2378a0a5-d3bb-4ba5-987b-bc061b61f4e7","ownedRelationship":[{"id":"4b5250d3-26d3-4ecb-be3c-eae0d1a0a4aa","eClass":"sysml:FeatureTyping","data":{"elementId":"fb4551aa-ebb4-4111-ab9c-b5c24eedd7fc","type":"sysml:ViewDefinition sysmllibrary:///faf517ae-dbcd-30a4-b3b9-3d9cb3bbf5c1#03904fdf-d6f2-57b1-92d5-95d36b8208dc","typedFeature":"42cde4bf-a073-41eb-bfe5-3a28fc8dbb44"}},{"id":"9da73084-dd5d-4af1-90ed-b0957a06790d","eClass":"sysml:MembershipExpose","data":{"elementId":"245bc4d1-cc58-41fc-8829-17dd9d2f8a70","importedMembership":"8bb257e8-3460-4d1c-89ab-fc05621008cc"}},{"id":"3b5cb8f1-318c-464e-8b6f-fe2ad18cea55","eClass":"sysml:MembershipExpose","data":{"elementId":"6da15657-3084-4c05-bc51-d4bec79c6c17","importedMembership":"2fdbc729-f26d-4dd3-92d9-0b6f5b31d8de"}},{"id":"7a2679ec-4a35-453c-b442-abda64b058e1","eClass":"sysml:MembershipExpose","data":{"elementId":"6ce0dc19-b1ce-447b-b8ec-632a36f431f7","importedMembership":"b373e343-6f93-481d-a864-bf06b9f6c401"}}]}}]}},{"id":"70d9603a-2bf9-48a7-bc84-1221e7dcef48","eClass":"sysml:OwningMembership","data":{"elementId":"fc1a6a71-3fdf-42f3-a0a5-eed01cea74b6","ownedRelatedElement":[{"id":"010a42b9-b76e-44fe-8bbf-9dd7ec46270c","eClass":"sysml:Package","data":{"declaredName":"VehicleModel","elementId":"a7297a41-f01a-4c90-8ca9-6a7afe771a5e","ownedRelationship":[{"id":"0647eab1-99fd-48f9-b5da-cd932a19299b","eClass":"sysml:OwningMembership","data":{"elementId":"c4fe5819-2f5b-4dd3-8691-57507ce9eec1","ownedRelatedElement":[{"id":"bf6924f1-ed24-4446-a16b-de01de57bdbd","eClass":"sysml:PortDefinition","data":{"declaredName":"FuelPort","elementId":"8578fcb6-bbcb-4702-a937-88707413d00b","ownedRelationship":[{"id":"ca047376-c5f1-4e57-a4db-22eff080a4a3","eClass":"sysml:OwningMembership","data":{"elementId":"280393b3-b4e8-4962-bd86-9f48da8d1727","ownedRelatedElement":[{"id":"745abc74-a144-48da-9156-5aa6398d1845","eClass":"sysml:ConjugatedPortDefinition","data":{"elementId":"7a8d66fd-fd92-4e67-bc9e-baf0290c7083","ownedRelationship":[{"id":"9c39430d-621b-432e-beef-74a2a282b8d8","eClass":"sysml:PortConjugation","data":{"elementId":"7fcad1c9-2ac0-4ee9-804a-71efd6602c23","conjugatedType":"745abc74-a144-48da-9156-5aa6398d1845","originalPortDefinition":"bf6924f1-ed24-4446-a16b-de01de57bdbd"}}]}}]}}]}}]}},{"id":"8bb257e8-3460-4d1c-89ab-fc05621008cc","eClass":"sysml:OwningMembership","data":{"elementId":"bc38df3f-cf38-491f-8432-411b265fbf77","ownedRelatedElement":[{"id":"1101a735-4303-4597-b99e-6680bc7372cb","eClass":"sysml:PartDefinition","data":{"declaredName":"Vehicle","elementId":"fc39fb28-b849-4757-acec-e02b3806c43d","ownedRelationship":[{"id":"ed927b5d-51b1-4602-a1c1-f1e31b5ac59a","eClass":"sysml:FeatureMembership","data":{"elementId":"8ca0fd1d-47a2-4711-bb69-811881b9c82c","ownedRelatedElement":[{"id":"5873d9ba-bd35-4fa0-aa40-d7a32af9af5c","eClass":"sysml:PortUsage","data":{"declaredName":"fuelInPort","elementId":"88cc227d-1252-4a4c-9338-4716aa567b3d","ownedRelationship":[{"id":"c6d2a950-c6ad-4bc6-b819-a788c0f6374f","eClass":"sysml:FeatureTyping","data":{"elementId":"7410be64-6586-4e90-ac5b-90d0e6aae802","type":"bf6924f1-ed24-4446-a16b-de01de57bdbd","typedFeature":"5873d9ba-bd35-4fa0-aa40-d7a32af9af5c"}}],"isComposite":true}}]}}]}}]}},{"id":"2fdbc729-f26d-4dd3-92d9-0b6f5b31d8de","eClass":"sysml:OwningMembership","data":{"elementId":"6a600e20-1729-4eca-bb46-bb34b190437c","ownedRelatedElement":[{"id":"fd53a66c-dccf-4af7-8634-6661fffeff34","eClass":"sysml:PartUsage","data":{"declaredName":"v1","elementId":"9e11f1ba-a4c3-424a-993f-66f9df3c1552","ownedRelationship":[{"id":"9e22103e-c592-4509-950a-98e7857f3d57","eClass":"sysml:FeatureTyping","data":{"elementId":"9ce543b4-3fad-47fd-a157-c0b96933fc09","type":"1101a735-4303-4597-b99e-6680bc7372cb","typedFeature":"fd53a66c-dccf-4af7-8634-6661fffeff34"}}],"isComposite":true}}]}},{"id":"b373e343-6f93-481d-a864-bf06b9f6c401","eClass":"sysml:OwningMembership","data":{"elementId":"564e2f1c-5b15-471e-a0a8-387ed5af2d15","ownedRelatedElement":[{"id":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","eClass":"sysml:PartUsage","data":{"declaredName":"part2","elementId":"63cfa612-0fee-4277-9a5a-c61442b6666c","ownedRelationship":[{"id":"30cdf4f7-effe-4ea8-9011-bffd29e76c51","eClass":"sysml:FeatureMembership","data":{"elementId":"c1b06a47-99ad-40c5-b03e-0b716d47d28f","ownedRelatedElement":[{"id":"0fa4ae60-9b6a-4042-b05b-ef649406c761","eClass":"sysml:PortUsage","data":{"declaredName":"port1","elementId":"2f4cb820-66b7-4ca9-a5c5-b9b50da8b9be","isComposite":true}}]}}],"isComposite":true}}]}}]}}]}}]}}]}}]}}]}', '2025-10-10 08:03:58.5535+00', '2025-10-10 08:03:58.5535+00', false); + + +-- +-- 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 ('6f2cb8c8-8a6d-4220-a420-ba5f053de08e', 'GeneralView-InheritedPort', '2025-10-10 08:03:00.070684+00', '2025-10-10 08:03:32.017301+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 ('a4bdb2c6-f8b8-45d4-9b5d-0e0c598a5743', '6f2cb8c8-8a6d-4220-a420-ba5f053de08e', 'c3b348b0-548e-4bee-b039-925a0a9eece0', 'main', '2025-10-10 08:03:00.14675+00', '2025-10-10 08:03:00.14675+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 ('d10ee99f-f2cf-4182-a614-e620e885f55f', '42cde4bf-a073-41eb-bfe5-3a28fc8dbb44', 'siriusComponents://representationDescription?kind=diagramDescription&sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=db495705-e917-319b-af55-a32ad63f4089', 'view1', 'siriusComponents://representation?type=Diagram', '2025-10-10 08:03:06.593097+00', '2025-10-10 08:03:06.593097+00', '', 'c3b348b0-548e-4bee-b039-925a0a9eece0'); + + +-- +-- 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 ('d10ee99f-f2cf-4182-a614-e620e885f55f', '{"id":"d10ee99f-f2cf-4182-a614-e620e885f55f","kind":"siriusComponents://representation?type=Diagram","targetObjectId":"42cde4bf-a073-41eb-bfe5-3a28fc8dbb44","descriptionId":"siriusComponents://representationDescription?kind=diagramDescription&sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=db495705-e917-319b-af55-a32ad63f4089","nodes":[{"id":"0a147189-cde2-3fb8-b054-70eeb275967a","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bd119f62-45c5-3868-9727-9f954e05e4fa","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"6aee18d9-c91b-319c-a9c9-7fe2ada46c23","text":"«part»\npart2","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/PartUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null,"visibility":"visible"},"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=30a9de2f-14f9-3de6-b68e-06b79b675555","siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c47f5c71-1cc7-3f23-8c03-c335c2d13c66"],"kind":"List"}},"borderNodes":[{"id":"9d8c2985-1923-35a0-8e5f-24356b43581c","type":"node:rectangle","targetObjectId":"0fa4ae60-9b6a-4042-b05b-ef649406c761","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PortUsage","targetObjectLabel":"port1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=9202e18a-8f43-3f30-81e8-e96dd4a4a7de","borderNode":true,"initialBorderNodePosition":"EAST","modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":null,"outsideLabels":[{"id":"c7ea37e4-6148-3a4a-80cc-b80ba80f5ed7","text":"port1","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,"visibility":"visible"},"overflowStrategy":"NONE","textAlign":"LEFT","customizedStyleProperties":[]}],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":10,"defaultHeight":10,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"childNodes":[{"id":"cb5895c9-9dae-3363-a4af-2c3ce1a43b33","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c901d8ce-4c57-3ede-8fdb-3c5aa91b67ba","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"e858e222-c3c9-3414-83d5-1c7c78e1b0b4","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,"visibility":"visible"},"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":"6009296a-0d02-3292-bf63-d8389046c67d","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=a1300415-10e4-37bb-87ed-206ec95079f0","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"f8fb1fbc-9e3f-317e-bec6-e1eb4bf843da","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,"visibility":"visible"},"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":"cd7ae9fc-323f-3651-ade1-53afb745b897","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=f664d1f2-e48d-3f5a-a073-141fc0ddc418","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"d575c64b-358e-3bf6-9cee-d18a2f0bac56","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,"visibility":"visible"},"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":"8a4916e2-7be4-31e2-a845-4a2c1fd950f3","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=cc126737-2324-3253-ae11-37d5b0dee7b9","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"44c8691b-8d33-38c5-98af-4307cd70abdf","text":"ports","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,"visibility":"visible"},"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":"c49b1479-bc3f-329c-8a93-81d533a55e2d","type":"node:icon-label","targetObjectId":"0fa4ae60-9b6a-4042-b05b-ef649406c761","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PortUsage","targetObjectLabel":"port1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=feb64ff6-1216-3056-bc12-b9d78e349d7f","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"b57d991a-ba24-366a-9eee-d4a7012e2348","text":"port1","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/PortUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null,"visibility":"visible"},"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":"c154b81c-f415-3b42-a3fb-d65d0dd69887","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=30a9de2f-14f9-3de6-b68e-06b79b675555","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"2e4fb28f-dfd8-383f-bec1-5226b762e9d9","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,"visibility":"visible"},"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":"29211b77-e40d-3824-aec3-f930e86f1a78","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c47f5c71-1cc7-3f23-8c03-c335c2d13c66","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"13ccd289-fea1-373a-b203-ebef25fd5da3","text":"state transition","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,"visibility":"visible"},"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":"bd667ce5-fbeb-3105-82ad-e59f3bd70cd9","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c97028bb-f0ba-3e9e-97a6-170cb6345d62","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"f9c24182-a60e-304e-a715-0aca4097c902","text":"states","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,"visibility":"visible"},"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":"786b85a4-c3ce-3ddf-9361-e0c47d21819f","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=a57f3491-bd3e-38c6-bb8b-b0a4b570bd3a","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"3b6e1f6d-f942-30bc-a4f3-5ac5919437b8","text":"exhibit states","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,"visibility":"visible"},"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":"7374d3a3-8b66-3136-90c6-5f9a972329db","type":"node:rectangle","targetObjectId":"6559aa2c-1cea-47f3-a231-9c5c56b8c54a","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"part2","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=fe94bbc6-f9c3-34cb-90fa-34a6701f9c17","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"19623b6c-8a1a-3fd2-a9c8-2628c11778fa","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,"visibility":"visible"},"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":"2340d319-ab8a-3a7a-9b1e-0ceb81ba7aef","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bd119f62-45c5-3868-9727-9f954e05e4fa","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"899e0701-c170-33ef-b6a8-f4938d9f9bd1","text":"«part»\nv1 : Vehicle","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/PartUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null,"visibility":"visible"},"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=30a9de2f-14f9-3de6-b68e-06b79b675555","siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c47f5c71-1cc7-3f23-8c03-c335c2d13c66"],"kind":"List"}},"borderNodes":[{"id":"629ba316-43de-384f-ad87-f60323f7f3aa","type":"node:rectangle","targetObjectId":"5873d9ba-bd35-4fa0-aa40-d7a32af9af5c","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PortUsage","targetObjectLabel":"fuelInPort","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=92236371-4fb7-38c2-837f-48c4c1eadd65","borderNode":true,"initialBorderNodePosition":"EAST","modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":null,"outsideLabels":[{"id":"14dad2ab-4b85-3a06-a264-a6b5ff49dfcf","text":"^fuelInPort : FuelPort","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,"visibility":"visible"},"overflowStrategy":"NONE","textAlign":"LEFT","customizedStyleProperties":[]}],"style":{"background":"#ffffff","borderColor":"#000000","borderSize":1,"borderRadius":0,"borderStyle":"Solid","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":10,"defaultHeight":10,"labelEditable":true,"pinned":false,"customizedStyleProperties":[]}],"childNodes":[{"id":"613b89c0-d537-3f12-83c4-d44a21b61e6c","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c901d8ce-4c57-3ede-8fdb-3c5aa91b67ba","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"a26d0ede-b321-3a4d-b062-bfdca70bdcb3","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,"visibility":"visible"},"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":"9f5cdb37-d10a-3210-bc13-3c240cabe4af","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=a1300415-10e4-37bb-87ed-206ec95079f0","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"cb856821-530a-3c4f-9623-80fd54fe75b3","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,"visibility":"visible"},"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":"9e439892-cd4a-3885-88aa-5abc8338b019","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=f664d1f2-e48d-3f5a-a073-141fc0ddc418","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"5dd7963a-3edc-36d7-9b72-6b24a3ed1319","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,"visibility":"visible"},"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":"1d363133-7216-393f-a90e-f73f88c1e0b0","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=cc126737-2324-3253-ae11-37d5b0dee7b9","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"4f6457ce-dab7-32e7-a5ac-c3e771e3ed9a","text":"ports","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,"visibility":"visible"},"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":"9e62ae21-266b-3494-bdb7-9cc5421c7194","type":"node:icon-label","targetObjectId":"5873d9ba-bd35-4fa0-aa40-d7a32af9af5c","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PortUsage","targetObjectLabel":"fuelInPort","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c3845b5a-d588-3376-814e-ac7defe0e20b","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":[],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"1f07b132-0ebc-3dec-86ca-4f38cb4221e0","text":"^fuelInPort : FuelPort","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":true,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/PortUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null,"visibility":"visible"},"isHeader":false,"headerSeparatorDisplayMode":"NEVER","overflowStrategy":"WRAP","textAlign":"LEFT","customizedStyleProperties":[]},"outsideLabels":[],"style":{"background":"transparent","childrenLayoutStrategy":{"kind":"FreeForm"}},"borderNodes":[],"childNodes":[],"defaultWidth":155,"defaultHeight":15,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]}],"defaultWidth":155,"defaultHeight":60,"labelEditable":false,"pinned":false,"customizedStyleProperties":[]},{"id":"257b5d27-236c-3a41-90c8-3460175e3545","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=30a9de2f-14f9-3de6-b68e-06b79b675555","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"8f6ea7c3-1afe-39d1-bde6-58788f9805d0","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,"visibility":"visible"},"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":"f251bef1-37dd-35b2-9184-e0622b31967a","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c47f5c71-1cc7-3f23-8c03-c335c2d13c66","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"2ea73a99-c9e5-3ce3-bbd6-c379db8401bb","text":"state transition","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,"visibility":"visible"},"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":"a879c561-bccf-31c1-9745-803def4de17c","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=c97028bb-f0ba-3e9e-97a6-170cb6345d62","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"29313b9b-d789-3bb2-ac95-7e87972057f8","text":"states","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,"visibility":"visible"},"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":"d0bc855f-45d6-3ef5-bb1c-a7ec3d9ac154","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=a57f3491-bd3e-38c6-bb8b-b0a4b570bd3a","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"e21d1c76-e14b-319a-92e9-c55cdd5872ec","text":"exhibit states","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,"visibility":"visible"},"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":"e702c812-5d62-3e81-a0ec-6459d853c8df","type":"node:rectangle","targetObjectId":"fd53a66c-dccf-4af7-8634-6661fffeff34","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartUsage","targetObjectLabel":"v1","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=fe94bbc6-f9c3-34cb-90fa-34a6701f9c17","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"bcc1d05e-cb28-35da-8369-fce68b0251c3","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,"visibility":"visible"},"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":"67ed97e8-fe0f-33eb-a7c8-4502ddca583b","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=52de5719-4873-3c76-8e5b-8d94900d4b7f","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":[],"state":"Normal","collapsingState":"EXPANDED","insideLabel":{"id":"888e0568-dec2-3e1c-8e7d-21bcba6ff0d9","text":"«part def»\nVehicle","insideLabelLocation":"TOP_CENTER","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/PartDefinition.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null,"visibility":"visible"},"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":["siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=55d4b9e8-0e72-318b-9548-34ed7657c16c","siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bbf5f364-e67f-3e69-9918-9eb94cc9d724"],"kind":"List"}},"borderNodes":[],"childNodes":[{"id":"03050907-6571-3b03-970e-692401aeba32","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=32da1a41-7187-3da3-ae52-f3cfc927b133","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"9fb4c8f9-8422-3754-b037-4da98cde1d71","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,"visibility":"visible"},"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":"ff9e0da4-c0df-3ed6-ad4e-98d30a62f3b4","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=1d4e3253-3981-3d8a-9887-b887114e3a3e","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"1fe034eb-76a9-3e62-9ee4-ada2e083e119","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,"visibility":"visible"},"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":"c36212ad-3ad8-37f3-8978-df062b76609a","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=a677fbe5-68e8-3949-beab-d96b632c4cc0","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"f6f70c0b-d2be-3907-8e98-18da76088ef9","text":"ports","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,"visibility":"visible"},"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":"b1e80522-a402-364b-b285-1bbe74a10e1f","type":"node:icon-label","targetObjectId":"5873d9ba-bd35-4fa0-aa40-d7a32af9af5c","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PortUsage","targetObjectLabel":"fuelInPort","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=a00860fb-f304-3ed8-ab86-c9f1bbfdf671","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"50cf32e3-a43e-33c0-91d1-0da1ad09257b","text":"fuelInPort : FuelPort","insideLabelLocation":"TOP_LEFT","style":{"color":"#000000","fontSize":14,"bold":false,"italic":false,"underline":false,"strikeThrough":false,"iconURL":["/icons/full/obj16/PortUsage.svg"],"background":"transparent","borderColor":"black","borderSize":0,"borderRadius":3,"borderStyle":"Solid","maxWidth":null,"visibility":"visible"},"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":"6a6df75a-639b-3c89-9044-fd51e74e1c00","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=d1db77ad-fee0-3c33-bfe1-db84f9fbd027","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"cdecf7c0-8595-3cee-96a2-295839a604f8","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,"visibility":"visible"},"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":"e2eda03f-4c34-3b59-8ad0-2bb7b09370b1","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=55d4b9e8-0e72-318b-9548-34ed7657c16c","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"97461885-2b81-3f9e-907a-36d84d9d71ac","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,"visibility":"visible"},"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":"38e78f3b-1c70-3d88-9840-7ba38814cdf2","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=bbf5f364-e67f-3e69-9918-9eb94cc9d724","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"959fc298-1073-3094-9875-98737cc7dd96","text":"state transition","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,"visibility":"visible"},"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":"8834fe18-f9ed-331d-873d-9c339aae9e21","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=ba122573-ae0d-378c-9949-7622f6057511","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"ed01f9e9-e8ca-3231-99b9-b08cc69081ad","text":"states","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,"visibility":"visible"},"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":"168e537e-4c0e-3ee0-8080-12958a418427","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=cbf68c65-4d8f-32ca-ac84-92fec0dbb646","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"c534dec6-442c-3281-942f-1af4962dacc9","text":"exhibit states","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,"visibility":"visible"},"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":"ef3a02fb-b2b8-3d86-9718-b941d2771196","type":"node:rectangle","targetObjectId":"1101a735-4303-4597-b99e-6680bc7372cb","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=PartDefinition","targetObjectLabel":"Vehicle","descriptionId":"siriusComponents://nodeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=3868c242-24f7-3a1d-956f-21bd7488b2b6","borderNode":false,"initialBorderNodePosition":"NONE","modifiers":["Hidden"],"state":"Hidden","collapsingState":"EXPANDED","insideLabel":{"id":"e7fbf073-90ad-3dfc-8bef-de221ecbfaa8","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,"visibility":"visible"},"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":"4fe6b010-254d-3503-a50e-478e80341287","type":"edge:straight","targetObjectId":"9e22103e-c592-4509-950a-98e7857f3d57","targetObjectKind":"siriusComponents://semantic?domain=sysml&entity=FeatureTyping","targetObjectLabel":"FeatureTyping","descriptionId":"siriusComponents://edgeDescription?sourceKind=view&sourceId=8dcd14b0-6259-3193-ad2c-743f394c68e4&sourceElementId=2b13316a-930e-3a51-bcdf-e71b0b0b965a","beginLabel":null,"centerLabel":null,"endLabel":null,"sourceId":"2340d319-ab8a-3a7a-9b1e-0ceb81ba7aef","targetId":"67ed97e8-fe0f-33eb-a7c8-4502ddca583b","modifiers":[],"state":"Normal","style":{"size":1,"lineStyle":"Solid","sourceArrow":"None","targetArrow":"ClosedArrowWithDots","color":"#000000","edgeType":"Manhattan"},"centerLabelEditable":false,"customizedStyleProperties":[]}],"layoutData":{"nodeLayoutData":{"6009296a-0d02-3292-bf63-d8389046c67d":{"id":"6009296a-0d02-3292-bf63-d8389046c67d","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"6a6df75a-639b-3c89-9044-fd51e74e1c00":{"id":"6a6df75a-639b-3c89-9044-fd51e74e1c00","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"ef3a02fb-b2b8-3d86-9718-b941d2771196":{"id":"ef3a02fb-b2b8-3d86-9718-b941d2771196","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"e702c812-5d62-3e81-a0ec-6459d853c8df":{"id":"e702c812-5d62-3e81-a0ec-6459d853c8df","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"629ba316-43de-384f-ad87-f60323f7f3aa":{"id":"629ba316-43de-384f-ad87-f60323f7f3aa","position":{"x":150.0,"y":8.0},"size":{"width":16.0,"height":16.0},"resizedByUser":false,"handleLayoutData":[]},"2340d319-ab8a-3a7a-9b1e-0ceb81ba7aef":{"id":"2340d319-ab8a-3a7a-9b1e-0ceb81ba7aef","position":{"x":-72.24162849157351,"y":72.17381050194126},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"168e537e-4c0e-3ee0-8080-12958a418427":{"id":"168e537e-4c0e-3ee0-8080-12958a418427","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"9d8c2985-1923-35a0-8e5f-24356b43581c":{"id":"9d8c2985-1923-35a0-8e5f-24356b43581c","position":{"x":84.4222327863801,"y":55.0},"size":{"width":16.0,"height":16.0},"resizedByUser":true,"handleLayoutData":[]},"cd7ae9fc-323f-3651-ade1-53afb745b897":{"id":"cd7ae9fc-323f-3651-ade1-53afb745b897","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"8834fe18-f9ed-331d-873d-9c339aae9e21":{"id":"8834fe18-f9ed-331d-873d-9c339aae9e21","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"d0bc855f-45d6-3ef5-bb1c-a7ec3d9ac154":{"id":"d0bc855f-45d6-3ef5-bb1c-a7ec3d9ac154","position":{"x":1.0,"y":112.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"1d363133-7216-393f-a90e-f73f88c1e0b0":{"id":"1d363133-7216-393f-a90e-f73f88c1e0b0","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"f251bef1-37dd-35b2-9184-e0622b31967a":{"id":"f251bef1-37dd-35b2-9184-e0622b31967a","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":141.5},"resizedByUser":true,"handleLayoutData":[]},"257b5d27-236c-3a41-90c8-3460175e3545":{"id":"257b5d27-236c-3a41-90c8-3460175e3545","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":141.5},"resizedByUser":true,"handleLayoutData":[]},"cb5895c9-9dae-3363-a4af-2c3ce1a43b33":{"id":"cb5895c9-9dae-3363-a4af-2c3ce1a43b33","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"9e62ae21-266b-3494-bdb7-9cc5421c7194":{"id":"9e62ae21-266b-3494-bdb7-9cc5421c7194","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":15.0},"resizedByUser":false,"handleLayoutData":[]},"613b89c0-d537-3f12-83c4-d44a21b61e6c":{"id":"613b89c0-d537-3f12-83c4-d44a21b61e6c","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"38e78f3b-1c70-3d88-9840-7ba38814cdf2":{"id":"38e78f3b-1c70-3d88-9840-7ba38814cdf2","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":150.0},"resizedByUser":true,"handleLayoutData":[]},"0a147189-cde2-3fb8-b054-70eeb275967a":{"id":"0a147189-cde2-3fb8-b054-70eeb275967a","position":{"x":173.56456027001437,"y":72.17381050194126},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"67ed97e8-fe0f-33eb-a7c8-4502ddca583b":{"id":"67ed97e8-fe0f-33eb-a7c8-4502ddca583b","position":{"x":-72.24162849157351,"y":265.67381050194126},"size":{"width":155.0,"height":60.0},"resizedByUser":false,"handleLayoutData":[]},"b1e80522-a402-364b-b285-1bbe74a10e1f":{"id":"b1e80522-a402-364b-b285-1bbe74a10e1f","position":{"x":0.0,"y":30.0},"size":{"width":214.0,"height":17.0},"resizedByUser":false,"handleLayoutData":[]},"786b85a4-c3ce-3ddf-9361-e0c47d21819f":{"id":"786b85a4-c3ce-3ddf-9361-e0c47d21819f","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"c36212ad-3ad8-37f3-8978-df062b76609a":{"id":"c36212ad-3ad8-37f3-8978-df062b76609a","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"29211b77-e40d-3824-aec3-f930e86f1a78":{"id":"29211b77-e40d-3824-aec3-f930e86f1a78","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":150.0},"resizedByUser":true,"handleLayoutData":[]},"a879c561-bccf-31c1-9745-803def4de17c":{"id":"a879c561-bccf-31c1-9745-803def4de17c","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"9e439892-cd4a-3885-88aa-5abc8338b019":{"id":"9e439892-cd4a-3885-88aa-5abc8338b019","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"7374d3a3-8b66-3136-90c6-5f9a972329db":{"id":"7374d3a3-8b66-3136-90c6-5f9a972329db","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"9f5cdb37-d10a-3210-bc13-3c240cabe4af":{"id":"9f5cdb37-d10a-3210-bc13-3c240cabe4af","position":{"x":1.0,"y":52.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"03050907-6571-3b03-970e-692401aeba32":{"id":"03050907-6571-3b03-970e-692401aeba32","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"ff9e0da4-c0df-3ed6-ad4e-98d30a62f3b4":{"id":"ff9e0da4-c0df-3ed6-ad4e-98d30a62f3b4","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"8a4916e2-7be4-31e2-a845-4a2c1fd950f3":{"id":"8a4916e2-7be4-31e2-a845-4a2c1fd950f3","position":{"x":1.0,"y":52.0},"size":{"width":155.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]},"c49b1479-bc3f-329c-8a93-81d533a55e2d":{"id":"c49b1479-bc3f-329c-8a93-81d533a55e2d","position":{"x":0.0,"y":30.0},"size":{"width":155.0,"height":17.0},"resizedByUser":false,"handleLayoutData":[]},"e2eda03f-4c34-3b59-8ad0-2bb7b09370b1":{"id":"e2eda03f-4c34-3b59-8ad0-2bb7b09370b1","position":{"x":0.0,"y":0.0},"size":{"width":214.0,"height":150.0},"resizedByUser":true,"handleLayoutData":[]},"c154b81c-f415-3b42-a3fb-d65d0dd69887":{"id":"c154b81c-f415-3b42-a3fb-d65d0dd69887","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":150.0},"resizedByUser":true,"handleLayoutData":[]},"bd667ce5-fbeb-3105-82ad-e59f3bd70cd9":{"id":"bd667ce5-fbeb-3105-82ad-e59f3bd70cd9","position":{"x":0.0,"y":0.0},"size":{"width":155.0,"height":60.0},"resizedByUser":true,"handleLayoutData":[]}},"edgeLayoutData":{"4fe6b010-254d-3503-a50e-478e80341287":{"id":"4fe6b010-254d-3503-a50e-478e80341287","bendingPoints":[],"edgeAnchorLayoutData":[]}},"labelLayoutData":{"c7ea37e4-6148-3a4a-80cc-b80ba80f5ed7":{"id":"c7ea37e4-6148-3a4a-80cc-b80ba80f5ed7","position":{"x":0.0,"y":0.0}},"14dad2ab-4b85-3a06-a264-a6b5ff49dfcf":{"id":"14dad2ab-4b85-3a06-a264-a6b5ff49dfcf","position":{"x":0.0,"y":0.0}}}}}', 'none', '2025.8.0-202506301700', '2025-10-10 08:03:06.623527+00', '2025-10-10 08:04:01.883796+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 ('c3b348b0-548e-4bee-b039-925a0a9eece0', 'http://www.eclipse.org/syson/sysml'); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/util/DescriptionNameGenerator.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/util/DescriptionNameGenerator.java index b7179b165..65b38a379 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/util/DescriptionNameGenerator.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/util/DescriptionNameGenerator.java @@ -56,6 +56,10 @@ protected String getBorderNodeName(String prefix, String type) { return this.getName(prefix, "BorderNode", type); } + protected String getInheritedBorderNodeName(String prefix, String type) { + return this.getName(prefix, "InheritedBorderNode", type); + } + protected String getCompartmentName(String prefix, String suffix) { return this.getName(prefix, "Compartment", suffix); } @@ -175,6 +179,19 @@ public String getBorderNodeName(EClass eClass) { return this.getBorderNodeName(this.getDiagramPrefix(), eClass.getName()); } + /** + * Returns the name of an inherited border {@link NodeDescription} starting with the diagram prefix and followed by the name of + * the given {@link EClass}. + * + * @param eClass + * the {@link EClass} used to compute the name of the border {@link NodeDescription}. + * @return a string starting with the diagram prefix and followed by the name of the given {@link EClass} + */ + @Override + public String getInheritedBorderNodeName(EClass eClass) { + return this.getInheritedBorderNodeName(this.getDiagramPrefix(), eClass.getName()); + } + /** * Returns the name of a compartment {@link NodeDescription} starting with the diagram prefix, followed by the name * of the given {@link EClass} and the name of the given {@link EReference}. diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/util/IDescriptionNameGenerator.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/util/IDescriptionNameGenerator.java index 9d0d7a91e..2a5d8d0e2 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/util/IDescriptionNameGenerator.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/util/IDescriptionNameGenerator.java @@ -94,6 +94,15 @@ default String getCreationToolName(EReference eReference) { */ String getBorderNodeName(EClass eClass); + /** + * Returns the name of an inherited border {@link NodeDescription} using the given {@link EClass}. + * + * @param eClass + * the {@link EClass} used to compute the name of the border {@link NodeDescription}. + * @return a string used to name an inherited border {@link NodeDescription}. + */ + String getInheritedBorderNodeName(EClass eClass); + /** * Returns the name of a compartment {@link NodeDescription} using the given {@link EClass} and {@link EReference}. * diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/AbstractPortUsageBorderNodeDescriptionProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/AbstractPortUsageBorderNodeDescriptionProvider.java index f2ddcb502..79df05162 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/AbstractPortUsageBorderNodeDescriptionProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/AbstractPortUsageBorderNodeDescriptionProvider.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Objects; +import org.eclipse.sirius.components.diagrams.description.EdgeDescription; import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; import org.eclipse.sirius.components.view.builder.providers.IColorProvider; import org.eclipse.sirius.components.view.diagram.ConditionalNodeStyle; @@ -24,7 +25,6 @@ import org.eclipse.sirius.components.view.diagram.NodePalette; import org.eclipse.sirius.components.view.diagram.NodeStyleDescription; import org.eclipse.sirius.components.view.diagram.OutsideLabelDescription; -import org.eclipse.sirius.components.view.diagram.OutsideLabelPosition; import org.eclipse.sirius.components.view.diagram.OutsideLabelStyle; import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; import org.eclipse.sirius.components.view.diagram.UserResizableDirection; @@ -55,16 +55,9 @@ public AbstractPortUsageBorderNodeDescriptionProvider(IColorProvider colorProvid */ protected abstract String getSemanticCandidatesExpression(); - /** - * Implementers should provide the list of edge tool descriptions used inside this {@link NodeDescription}. - * - * @param cache - * the cache used to retrieve node descriptions. - * @param nodeDescription - * the actual Usage node description. - * @return the list of edge tool descriptions. - */ - protected abstract List getEdgeTools(IViewDiagramElementFinder cache, NodeDescription nodeDescription); + protected abstract OutsideLabelDescription createOutsideLabelDescription(); + + protected abstract String getName(); @Override public NodeDescription create() { @@ -85,14 +78,7 @@ public NodeDescription create() { @Override public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { - var optPortUsageBorderNodeDescription = cache.getNodeDescription(this.getName()); - - NodeDescription nodeDescription = optPortUsageBorderNodeDescription.get(); - nodeDescription.setPalette(this.createNodePalette(cache, nodeDescription)); - } - - public String getName() { - return this.nameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage()); + cache.getNodeDescription(this.getName()).ifPresent(portUsageBorderNodeDescription -> portUsageBorderNodeDescription.setPalette(this.createNodePalette(cache, portUsageBorderNodeDescription))); } private NodeStyleDescription createPortUnsetNodeStyle() { @@ -103,15 +89,7 @@ private NodeStyleDescription createPortUnsetNodeStyle() { .build(); } - private OutsideLabelDescription createOutsideLabelDescription() { - return this.diagramBuilderHelper.newOutsideLabelDescription() - .labelExpression(AQLUtils.getSelfServiceCallExpression("getBorderNodeUsageLabel")) - .position(OutsideLabelPosition.BOTTOM_CENTER) - .style(this.createOutsideLabelStyle()) - .build(); - } - - private OutsideLabelStyle createOutsideLabelStyle() { + protected OutsideLabelStyle createOutsideLabelStyle() { return this.diagramBuilderHelper.newOutsideLabelStyle() .bold(false) .borderSize(0) @@ -167,4 +145,56 @@ private NodePalette createNodePalette(IViewDiagramElementFinder cache, NodeDescr .build(); } + private List getEdgeTools(IViewDiagramElementFinder cache, NodeDescription nodeDescription) { + if (cache.getNodeDescription(this.getName()).isPresent()) { + NodeDescription portBorderNode = cache.getNodeDescription(this.getName()).get(); + return List.of(this.createBindingConnectorAsUsageEdgeTool(List.of(nodeDescription, portBorderNode)), + this.createInterfaceUsageEdgeTool(List.of(nodeDescription, portBorderNode)), + this.createFlowUsageEdgeTool(List.of(nodeDescription, portBorderNode))); + } + return List.of(); + } + + private EdgeTool createBindingConnectorAsUsageEdgeTool(List targetElementDescriptions) { + var builder = this.diagramBuilderHelper.newEdgeTool(); + + var body = this.viewBuilderHelper.newChangeContext() + .expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createBindingConnectorAsUsage", EdgeDescription.SEMANTIC_EDGE_TARGET)); + + return builder + .name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getBindingConnectorAsUsage()) + " (bind)") + .iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getBindingConnectorAsUsage().getName() + ".svg") + .body(body.build()) + .targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new)) + .build(); + } + + private EdgeTool createInterfaceUsageEdgeTool(List targetElementDescriptions) { + var builder = this.diagramBuilderHelper.newEdgeTool(); + + var body = this.viewBuilderHelper.newChangeContext() + .expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createInterfaceUsage", EdgeDescription.SEMANTIC_EDGE_TARGET)); + + return builder + .name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getInterfaceUsage()) + " (connect)") + .iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getInterfaceUsage().getName() + ".svg") + .body(body.build()) + .targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new)) + .build(); + } + + private EdgeTool createFlowUsageEdgeTool(List targetElementDescriptions) { + var builder = this.diagramBuilderHelper.newEdgeTool(); + + var body = this.viewBuilderHelper.newChangeContext() + .expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createFlowUsage", EdgeDescription.SEMANTIC_EDGE_TARGET)); + + return builder + .name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getFlowUsage()) + " (flow)") + .iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getFlowUsage().getName() + ".svg") + .body(body.build()) + .targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new)) + .build(); + } + } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java index ccb1a0cab..84a41fcdf 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java @@ -93,6 +93,7 @@ import org.eclipse.syson.standard.diagrams.view.nodes.FakeNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.GeneralViewEmptyDiagramNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.GeneralViewNodeDescriptionProviderSwitch; +import org.eclipse.syson.standard.diagrams.view.nodes.InheritedPortUsageBorderNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.ItemUsageBorderNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.PerformActionsCompartmentItemNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.PerformActionsCompartmentNodeDescriptionProvider; @@ -349,6 +350,7 @@ private List> createDiagramElementDescript diagramElementDescriptionProviders.add(new GeneralViewEmptyDiagramNodeDescriptionProvider(colorProvider)); diagramElementDescriptionProviders.add(new DefinitionOwnedActionUsageEdgeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); diagramElementDescriptionProviders.add(new PortUsageBorderNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); + diagramElementDescriptionProviders.add(new InheritedPortUsageBorderNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); diagramElementDescriptionProviders.add(new ItemUsageBorderNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); diagramElementDescriptionProviders.addAll(this.createAllDefinitionOwnedUsageEdgeDescriptionProviders(colorProvider)); diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java index 7f085a712..a79a4a0f2 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java @@ -177,6 +177,8 @@ private void addCustomCompartmentsForParts(IViewDiagramElementFinder cache, IDes private void addReusableBorderedNode(IViewDiagramElementFinder cache, IDescriptionNameGenerator descriptionNameGenerator, List childrenNodes) { cache.getNodeDescription(descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())) .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())) + .ifPresent(childrenNodes::add); cache.getNodeDescription(descriptionNameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getItemUsage())) .ifPresent(childrenNodes::add); } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/InheritedPortUsageBorderNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/InheritedPortUsageBorderNodeDescriptionProvider.java new file mode 100644 index 000000000..4fff45465 --- /dev/null +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/InheritedPortUsageBorderNodeDescriptionProvider.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * 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.standard.diagrams.view.nodes; + +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.diagram.OutsideLabelDescription; +import org.eclipse.sirius.components.view.diagram.OutsideLabelPosition; +import org.eclipse.syson.diagram.common.view.nodes.AbstractPortUsageBorderNodeDescriptionProvider; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.util.AQLConstants; +import org.eclipse.syson.util.AQLUtils; +import org.eclipse.syson.util.IDescriptionNameGenerator; + +/** + * Used to create the inherited port usage border node description. + * + * @author frouene + */ +public class InheritedPortUsageBorderNodeDescriptionProvider extends AbstractPortUsageBorderNodeDescriptionProvider { + + public InheritedPortUsageBorderNodeDescriptionProvider(IColorProvider colorProvider, IDescriptionNameGenerator nameGenerator) { + super(colorProvider, nameGenerator); + } + + @Override + protected String getSemanticCandidatesExpression() { + return AQLUtils.getSelfServiceCallExpression("getInheritedCompartmentItems", "'" + SysmlPackage.eINSTANCE.getUsage_NestedPort().getName() + "'"); + } + + @Override + protected OutsideLabelDescription createOutsideLabelDescription() { + return this.diagramBuilderHelper.newOutsideLabelDescription() + .labelExpression(AQLConstants.AQL + "'^' + self.getBorderNodeUsageLabel()") + .position(OutsideLabelPosition.BOTTOM_CENTER) + .style(this.createOutsideLabelStyle()) + .build(); + } + + @Override + protected String getName() { + return this.nameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage()); + } +} diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PortUsageBorderNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PortUsageBorderNodeDescriptionProvider.java index c80a58d99..82f4dd432 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PortUsageBorderNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PortUsageBorderNodeDescriptionProvider.java @@ -12,13 +12,9 @@ *******************************************************************************/ package org.eclipse.syson.standard.diagrams.view.nodes; -import java.util.List; - -import org.eclipse.sirius.components.diagrams.description.EdgeDescription; -import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; import org.eclipse.sirius.components.view.builder.providers.IColorProvider; -import org.eclipse.sirius.components.view.diagram.EdgeTool; -import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.sirius.components.view.diagram.OutsideLabelDescription; +import org.eclipse.sirius.components.view.diagram.OutsideLabelPosition; import org.eclipse.syson.diagram.common.view.nodes.AbstractPortUsageBorderNodeDescriptionProvider; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.util.AQLConstants; @@ -42,53 +38,17 @@ protected String getSemanticCandidatesExpression() { } @Override - protected List getEdgeTools(IViewDiagramElementFinder cache, NodeDescription nodeDescription) { - NodeDescription portBorderNode = cache.getNodeDescription(this.nameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).get(); - return List.of(this.createBindingConnectorAsUsageEdgeTool(List.of(nodeDescription, portBorderNode)), - this.createInterfaceUsageEdgeTool(List.of(nodeDescription, portBorderNode)), - this.createFlowUsageEdgeTool(List.of(nodeDescription, portBorderNode))); - } - - private EdgeTool createBindingConnectorAsUsageEdgeTool(List targetElementDescriptions) { - var builder = this.diagramBuilderHelper.newEdgeTool(); - - var body = this.viewBuilderHelper.newChangeContext() - .expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createBindingConnectorAsUsage", EdgeDescription.SEMANTIC_EDGE_TARGET)); - - return builder - .name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getBindingConnectorAsUsage()) + " (bind)") - .iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getBindingConnectorAsUsage().getName() + ".svg") - .body(body.build()) - .targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new)) - .build(); - } - - private EdgeTool createInterfaceUsageEdgeTool(List targetElementDescriptions) { - var builder = this.diagramBuilderHelper.newEdgeTool(); - - var body = this.viewBuilderHelper.newChangeContext() - .expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createInterfaceUsage", EdgeDescription.SEMANTIC_EDGE_TARGET)); - - return builder - .name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getInterfaceUsage()) + " (connect)") - .iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getInterfaceUsage().getName() + ".svg") - .body(body.build()) - .targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new)) + protected OutsideLabelDescription createOutsideLabelDescription() { + return this.diagramBuilderHelper.newOutsideLabelDescription() + .labelExpression(AQLUtils.getSelfServiceCallExpression("getBorderNodeUsageLabel")) + .position(OutsideLabelPosition.BOTTOM_CENTER) + .style(this.createOutsideLabelStyle()) .build(); } - private EdgeTool createFlowUsageEdgeTool(List targetElementDescriptions) { - var builder = this.diagramBuilderHelper.newEdgeTool(); - - var body = this.viewBuilderHelper.newChangeContext() - .expression(AQLUtils.getServiceCallExpression(EdgeDescription.SEMANTIC_EDGE_SOURCE, "createFlowUsage", EdgeDescription.SEMANTIC_EDGE_TARGET)); - - return builder - .name(this.nameGenerator.getCreationToolName(SysmlPackage.eINSTANCE.getFlowUsage()) + " (flow)") - .iconURLsExpression("/icons/full/obj16/" + SysmlPackage.eINSTANCE.getFlowUsage().getName() + ".svg") - .body(body.build()) - .targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new)) - .build(); + @Override + protected String getName() { + return this.nameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage()); } } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java index 355dd1584..1425a799c 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/UsageNodeDescriptionProvider.java @@ -99,6 +99,7 @@ protected Set getReusedBorderNodes(IViewDiagramElementFinder ca listItems.forEach(eReference -> { if (eReference.equals(SysmlPackage.eINSTANCE.getUsage_NestedPort())) { cache.getNodeDescription(this.getDescriptionNameGenerator().getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(borderNodes::add); + cache.getNodeDescription(this.getDescriptionNameGenerator().getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage())).ifPresent(borderNodes::add); } }); } diff --git a/doc/content/modules/user-manual/assets/images/gv-inherited-port.png b/doc/content/modules/user-manual/assets/images/gv-inherited-port.png new file mode 100644 index 000000000..7c9d36a27 Binary files /dev/null and b/doc/content/modules/user-manual/assets/images/gv-inherited-port.png differ diff --git a/doc/content/modules/user-manual/pages/release-notes/2025.12.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2025.12.0.adoc index 488599c7a..a552dba93 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2025.12.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2025.12.0.adoc @@ -6,6 +6,10 @@ == New features +- In diagrams, inherited ports are now displayed as border nodes. + +image::gv-inherited-port.png[Inherited port, width=65%,height=65%] + == Bug fixes == Improvements