From 02856298a30c2e9f1c74f6d07d249f5273a546b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20ROU=C3=8BN=C3=89?= Date: Tue, 9 Jan 2024 11:25:45 +0100 Subject: [PATCH] [2796] Convert flow to view DSL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: https://github.com/eclipse-sirius/sirius-web/issues/2796 Signed-off-by: Florian ROUËNÉ --- CHANGELOG.adoc | 3 +- .../diagrams/diagram-selection-dialog.cy.js | 7 +- .../e2e/project/diagrams/diagram.cy.js | 3 +- .../cypress/e2e/project/flow/flow.cy.ts | 65 +++ .../sirius-web-sample-application/pom.xml | 35 +- .../configuration/SampleEMFConfiguration.java | 22 +- .../SampleSiriusConfiguration.java | 4 +- ...ereotypeDescriptionRegistryConfigurer.java | 31 +- .../services/EditingContextActionHandler.java | 74 +--- .../EditingContextActionProvider.java | 15 - .../main/resources/application-dev.properties | 10 +- .../src/main/resources/application.properties | 10 +- .../papaya/ActorHuman.png | Bin .../papaya/FunctionInputPort.png | Bin .../papaya/FunctionOutputPort.png | Bin .../EditingContextActionHandlerTests.java | 6 +- packages/starters/backend/pom.xml | 1 + .../README.adoc | 5 + .../sirius-components-flow-starter/pom.xml | 166 ++++++++ .../configuration/FlowEMFConfiguration.java | 48 +++ .../configuration/FlowEditableSwitch.java | 5 +- .../configuration/FlowLabelFeatureSwitch.java | 5 +- .../FlowProjectTemplatesInitializer.java | 12 +- .../FlowProjectTemplatesProvider.java | 6 +- ...ereotypeDescriptionRegistryConfigurer.java | 76 ++++ .../FlowViewRegistryConfiguration.java | 116 ++++++ .../flow/starter/helper/ColorProvider.java | 46 +++ .../starter/helper/StereotypeBuilder.java | 116 ++++++ .../FlowEditingContextActionHandler.java | 153 +++++++ .../FlowEditingContextActionProvider.java | 57 +++ .../services/FlowJavaServiceProvider.java | 42 ++ .../flow/starter/services/FlowService.java | 83 ++++ ...ronizedViewDiagramDescriptionProvider.java | 177 +++++++++ ...ographyViewDiagramDescriptionProvider.java | 147 +++++++ ...oLayoutViewDiagramDescriptionProvider.java | 147 +++++++ .../flow/starter/view/FlowViewBuilder.java | 101 +++++ .../view/ViewDiagramElementFinder.java | 76 ++++ .../DataSourceDescriptionProvider.java | 99 +++++ ...rceToProcessorEdgeDescriptionProvider.java | 101 +++++ .../descriptions/FanDescriptionProvider.java | 83 ++++ .../ProcessorDescriptionProvider.java | 143 +++++++ ...sorToProcessorEdgeDescriptionProvider.java | 100 +++++ .../SystemDescriptionProvider.java | 293 ++++++++++++++ .../main/resources/customImages/antenna.svg | 63 +++ .../main/resources/customImages/camera.svg | 8 + .../resources/customImages/chipset2_high.svg | 12 + .../resources/customImages/chipset2_low.svg | 12 + .../resources/customImages/chipset2_over.svg | 12 + .../customImages/chipset2_standard.svg | 12 + .../customImages/chipset2_unused.svg | 12 + .../resources/customImages/chipset_high.svg | 11 + .../resources/customImages/chipset_low.svg | 11 + .../resources/customImages/chipset_over.svg | 11 + .../customImages/chipset_standard.svg | 11 + .../resources/customImages/chipset_unused.svg | 11 + .../src/main/resources/customImages/cpu.svg | 248 ++++++++++++ .../src/main/resources/customImages/cpu2.svg | 243 ++++++++++++ .../main/resources/customImages/cpu_high.svg | 8 + .../main/resources/customImages/cpu_low.svg | 8 + .../main/resources/customImages/cpu_over.svg | 8 + .../resources/customImages/cpu_standard.svg | 8 + .../resources/customImages/cpu_unused.svg | 8 + .../src/main/resources/customImages/dsp.svg | 373 ++++++++++++++++++ .../src/main/resources/customImages/fan.svg | 30 ++ .../src/main/resources/customImages/high.svg | 276 +++++++++++++ .../resources/customImages/power_input.svg | 7 + .../resources/customImages/power_output.svg | 7 + .../src/main/resources/customImages/radar.svg | 11 + .../main/resources/customImages/sensor.svg | 13 + .../architecture/ArchitectureConstants.java | 36 ++ .../architecture/CodingRulesTests.java | 42 ++ .../architecture/SpringCodingRulesTests.java | 36 ++ .../FlowEditingContextActionHandlerTests.java | 40 ++ 73 files changed, 4079 insertions(+), 198 deletions(-) create mode 100644 integration-tests/cypress/e2e/project/flow/flow.cy.ts rename packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/{icons => customImages}/papaya/ActorHuman.png (100%) rename packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/{icons => customImages}/papaya/FunctionInputPort.png (100%) rename packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/{icons => customImages}/papaya/FunctionOutputPort.png (100%) create mode 100644 packages/starters/backend/sirius-components-flow-starter/README.adoc create mode 100644 packages/starters/backend/sirius-components-flow-starter/pom.xml create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowEMFConfiguration.java rename packages/{sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample => starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter}/configuration/FlowEditableSwitch.java (91%) rename packages/{sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample => starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter}/configuration/FlowLabelFeatureSwitch.java (94%) rename packages/{sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample => starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter}/configuration/FlowProjectTemplatesInitializer.java (95%) rename packages/{sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample => starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter}/configuration/FlowProjectTemplatesProvider.java (90%) create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowStereotypeDescriptionRegistryConfigurer.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowViewRegistryConfiguration.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/ColorProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/StereotypeBuilder.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandler.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowJavaServiceProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowService.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyUnsynchronizedViewDiagramDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyViewDiagramDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyWithAutoLayoutViewDiagramDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowViewBuilder.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/ViewDiagramElementFinder.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceToProcessorEdgeDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/FanDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorToProcessorEdgeDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/SystemDescriptionProvider.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/antenna.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/camera.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_high.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_low.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_over.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_standard.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_unused.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_high.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_low.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_over.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_standard.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_unused.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu2.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_high.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_low.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_over.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_standard.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_unused.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/dsp.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/fan.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/high.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_input.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_output.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/radar.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/sensor.svg create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/ArchitectureConstants.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/CodingRulesTests.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/SpringCodingRulesTests.java create mode 100644 packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandlerTests.java diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index a08a5bdbdfb..57e60f5d81e 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -79,6 +79,7 @@ Additional changes to this interface will propably occur in the near future in o - https://github.com/eclipse-sirius/sirius-web/issues/2889[#2889] [emf] Remove the default implementation of the editing context from the `sirius-components-emf` module. The default implementation of the editing context for Sirius Web, which had Sirius Web specific code already, will be owned by `sirius-web-services`. This default implementation will now also contain all the view models properly loaded which should be considered during the lifecycle of the editing context. +- https://github.com/eclipse-sirius/sirius-web/issues/2796[#2796] [sirius-web] All Flow related configurations have been moved to `sirius-components-flow-starter` module. === Dependency update @@ -149,7 +150,7 @@ After this change, we will be able to delete the `EditingContext` class from `si Among those capabilities, we should find the list of view models to consider during the lifecycle of the editing context. - https://github.com/eclipse-sirius/sirius-web/issues/2889[#2889] [view] Load view models only once during the lifecycle of the editing context. This change makes the editing context the single source of truth for the state of the view models. - +- https://github.com/eclipse-sirius/sirius-web/issues/2796[#2796] [sirius-web] Flow diagram description has been converted to the view DSL. == v2023.12.0 diff --git a/integration-tests/cypress/e2e/project/diagrams/diagram-selection-dialog.cy.js b/integration-tests/cypress/e2e/project/diagrams/diagram-selection-dialog.cy.js index 993f9b7f743..b5b6cc72466 100644 --- a/integration-tests/cypress/e2e/project/diagrams/diagram-selection-dialog.cy.js +++ b/integration-tests/cypress/e2e/project/diagrams/diagram-selection-dialog.cy.js @@ -1,7 +1,7 @@ /******************************************************************************* - * Copyright (c) 2021, 2023 Obeo. + * Copyright (c) 2021, 2024 Obeo. * This program and the accompanying materials - * are made available under the erms of the Eclipse Public License v2.0 + * 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/ * @@ -10,7 +10,8 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -describe('/projects/:projectId/edit - Diagram', () => { +// Flow diagram description does not have selection tools after the view DSL conversion +describe.skip('/projects/:projectId/edit - Diagram', () => { beforeEach(() => { cy.deleteAllProjects(); cy.createProject('Cypress Project').then((res) => { diff --git a/integration-tests/cypress/e2e/project/diagrams/diagram.cy.js b/integration-tests/cypress/e2e/project/diagrams/diagram.cy.js index 02e5a631316..fb138cf1feb 100644 --- a/integration-tests/cypress/e2e/project/diagrams/diagram.cy.js +++ b/integration-tests/cypress/e2e/project/diagrams/diagram.cy.js @@ -91,8 +91,7 @@ describe('/projects/:projectId/edit - Diagram', () => { cy.getByTestId('Topography with auto layout').click(); cy.getByTestId('create-representation').click(); - cy.get('#diagram>svg text.sprotty-label').should('have.length', 23); - cy.get('#diagram>svg foreignObject.sprotty-label').should('have.length', 2); + cy.get('#diagram>svg text.sprotty-label').should('have.length', 25); cy.get('#diagram>svg g.sprotty-edge').should('have.length', 7); cy.get('#diagram>svg image').should('have.length', 10); cy.get('#diagram rect').should('have.length', 18); diff --git a/integration-tests/cypress/e2e/project/flow/flow.cy.ts b/integration-tests/cypress/e2e/project/flow/flow.cy.ts new file mode 100644 index 00000000000..e182e5d3aea --- /dev/null +++ b/integration-tests/cypress/e2e/project/flow/flow.cy.ts @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2024 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 + *******************************************************************************/ + +import { Project } from '../../../pages/Project'; +import { Flow } from '../../../usecases/Flow'; +import { Explorer } from '../../../workbench/Explorer'; +import { Diagram } from '../../../workbench/Diagram'; + +const projectName = 'Cypress - flow'; + +describe('Flow', () => { + context('Given a flow project with a robot document', () => { + let projectId: string = ''; + beforeEach(() => + new Flow().createRobotProject(projectName).then((createdProjectData) => { + projectId = createdProjectData.projectId; + new Project().visit(projectId); + }) + ); + + afterEach(() => cy.deleteProject(projectId)); + + context('When we interact with the flow diagram', () => { + it('Then I can create a topography diagram', () => { + const explorer = new Explorer(); + const diagram = new Diagram(); + explorer.getExplorerView().contains('robot'); + explorer.expand('robot'); + explorer.createRepresentation('Robot', 'Topography', 'diagramTopography'); + diagram.getDiagram('diagramTopography').should('exist'); + diagram.getNodes('diagramTopography', 'Central_Unit').should('exist'); + }); + + it('Then I can create a topography unsynchronized diagram', () => { + const explorer = new Explorer(); + const diagram = new Diagram(); + explorer.getExplorerView().contains('robot'); + explorer.expand('robot'); + explorer.createRepresentation('Robot', 'Topography unsynchronized', 'diagramTopographyUnsynchronized'); + diagram.getDiagram('diagramTopographyUnsynchronized').should('exist'); + diagram.getNodes('diagramTopographyUnsynchronized', 'Central_Unit').should('not.exist'); + }); + + it('Then I can create a topography with auto layout diagram', () => { + const explorer = new Explorer(); + const diagram = new Diagram(); + explorer.getExplorerView().contains('robot'); + explorer.expand('robot'); + explorer.createRepresentation('Robot', 'Topography with auto layout', 'diagramTopographyWithAutoLayout'); + diagram.getDiagram('diagramTopographyWithAutoLayout').should('exist'); + diagram.getNodes('diagramTopographyWithAutoLayout', 'Description').should('exist'); + }); + }); + }); +}); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/pom.xml b/packages/sirius-web/backend/sirius-web-sample-application/pom.xml index cc5e1b315e0..2ab1ede88ea 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/pom.xml +++ b/packages/sirius-web/backend/sirius-web-sample-application/pom.xml @@ -29,7 +29,6 @@ 17 - 1.0.11-SNAPSHOT 4.0.3-SNAPSHOT 2.1.5-SNAPSHOT @@ -156,23 +155,13 @@ org.eclipse.sirius - sirius-components-view-deck - 2023.12.8 - - - fr.obeo.dsl.designer.sample.flow - fr.obeo.dsl.designer.sample.flow - ${flow.version} - - - fr.obeo.dsl.designer.sample.flow - fr.obeo.dsl.designer.sample.flow.edit - ${flow.version} + sirius-components-flow-starter + 2023.12.8 - fr.obeo.dsl.designer.sample.flow - fr.obeo.dsl.designer.sample.flow.design - ${flow.version} + org.eclipse.sirius + sirius-components-view-deck + 2023.12.8 BPMN2 @@ -269,13 +258,13 @@ 2023.12.8 test - - org.eclipse.sirius - sirius-components-view-deck-edit - 2023.12.8 - compile - - + + org.eclipse.sirius + sirius-components-view-deck-edit + 2023.12.8 + compile + + diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleEMFConfiguration.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleEMFConfiguration.java index bf36fdcdab1..a16a0efa9fb 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleEMFConfiguration.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleEMFConfiguration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2023 Obeo. + * Copyright (c) 2019, 2024 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -12,16 +12,11 @@ *******************************************************************************/ package org.eclipse.sirius.web.sample.configuration; -import fr.obeo.dsl.designer.sample.flow.FlowPackage; -import fr.obeo.dsl.designer.sample.flow.provider.FlowItemProviderAdapterFactory; - import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.EPackage; import org.eclipse.sirius.components.domain.DomainPackage; import org.eclipse.sirius.components.domain.provider.DomainItemProviderAdapterFactory; import org.eclipse.sirius.components.emf.configuration.ChildExtenderProvider; -import org.eclipse.sirius.components.emf.services.ILabelFeatureProvider; -import org.eclipse.sirius.components.emf.services.LabelFeatureProvider; import org.eclipse.sirius.components.view.ViewPackage; import org.eclipse.sirius.components.view.diagram.DiagramPackage; import org.eclipse.sirius.components.view.diagram.provider.DiagramItemProviderAdapterFactory; @@ -44,21 +39,6 @@ @Configuration public class SampleEMFConfiguration { - @Bean - public AdapterFactory flowAdapterFactory() { - return new FlowItemProviderAdapterFactory(); - } - - @Bean - public EPackage flowEPackage() { - return FlowPackage.eINSTANCE; - } - - @Bean - public ILabelFeatureProvider flowLabelFeatureProvider() { - return new LabelFeatureProvider(FlowPackage.eINSTANCE.getNsURI(), new FlowLabelFeatureSwitch(), new FlowEditableSwitch()); - } - @Bean @ConditionalOnProperty(prefix = "org.eclipse.sirius.web.features", name = "studioDefinition") public EPackage domainEPackage() { diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleSiriusConfiguration.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleSiriusConfiguration.java index 2b9d640e866..c42e2b438dc 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleSiriusConfiguration.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/SampleSiriusConfiguration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2022 Obeo. + * Copyright (c) 2019, 2024 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 @@ -29,7 +29,7 @@ public class SampleSiriusConfiguration implements ISiriusConfiguration { @Override public List getODesignPaths() { - return List.of("description/flow.odesign"); + return List.of(); } @Bean diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StereotypeDescriptionRegistryConfigurer.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StereotypeDescriptionRegistryConfigurer.java index 681dba97ac7..02a03dd0748 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StereotypeDescriptionRegistryConfigurer.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StereotypeDescriptionRegistryConfigurer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2023 Obeo. + * Copyright (c) 2019, 2024 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -12,8 +12,6 @@ *******************************************************************************/ package org.eclipse.sirius.web.sample.configuration; -import fr.obeo.dsl.designer.sample.flow.FlowFactory; - import java.util.List; import java.util.UUID; @@ -30,7 +28,6 @@ import org.eclipse.sirius.web.sample.papaya.view.PapayaViewProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; import io.micrometer.core.instrument.MeterRegistry; @@ -46,18 +43,6 @@ public class StereotypeDescriptionRegistryConfigurer implements IStereotypeDescr public static final String EMPTY_LABEL = "Others..."; - public static final UUID EMPTY_FLOW_ID = UUID.nameUUIDFromBytes("empty_flow".getBytes()); - - public static final String EMPTY_FLOW_LABEL = "Flow"; - - public static final UUID ROBOT_FLOW_ID = UUID.nameUUIDFromBytes("robot_flow".getBytes()); - - public static final String ROBOT_FLOW_LABEL = "Robot Flow"; - - public static final UUID BIG_GUY_FLOW_ID = UUID.nameUUIDFromBytes("big_guy_flow".getBytes()); - - public static final String BIG_GUY_FLOW_LABEL = "Big Guy Flow (17k elements)"; - public static final UUID EMPTY_VIEW_ID = UUID.nameUUIDFromBytes("empty_view".getBytes()); public static final String EMPTY_VIEW_LABEL = "View"; @@ -90,15 +75,12 @@ public StereotypeDescriptionRegistryConfigurer(MeterRegistry meterRegistry, @Val @Override public void addStereotypeDescriptions(IStereotypeDescriptionRegistry registry) { - registry.add(new StereotypeDescription(EMPTY_FLOW_ID, EMPTY_FLOW_LABEL, this::getEmptyFlowContent)); if (this.studiosEnabled) { registry.add(new StereotypeDescription(EMPTY_DOMAIN_ID, EMPTY_DOMAIN_LABEL, this::getEmptyDomainContent)); registry.add(new StereotypeDescription(EMPTY_VIEW_ID, EMPTY_VIEW_LABEL, this::getEmptyViewContent)); registry.add(new StereotypeDescription(PAPAYA_DOMAIN_ID, PAPAYA_DOMAIN_LABEL, this::getPapayaDomainContent)); registry.add(new StereotypeDescription(PAPAYA_VIEW_ID, PAPAYA_VIEW_LABEL, this::getPapayaViewContent)); } - registry.add(new StereotypeDescription(ROBOT_FLOW_ID, ROBOT_FLOW_LABEL, this::getRobotFlowContent)); - registry.add(new StereotypeDescription(BIG_GUY_FLOW_ID, BIG_GUY_FLOW_LABEL, this::getBigGuyFlowContent)); registry.add(new StereotypeDescription(EMPTY_ID, EMPTY_LABEL, "New", this::getEmptyContent)); } @@ -130,15 +112,4 @@ private String getEmptyContent() { return this.stereotypeBuilder.getStereotypeBody(List.of()); } - private String getEmptyFlowContent() { - return this.stereotypeBuilder.getStereotypeBody(List.of(FlowFactory.eINSTANCE.createSystem())); - } - - private String getRobotFlowContent() { - return this.stereotypeBuilder.getStereotypeBody(new ClassPathResource("robot.flow")); - } - - private String getBigGuyFlowContent() { - return this.stereotypeBuilder.getStereotypeBody(new ClassPathResource("Big_Guy.flow")); - } } diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandler.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandler.java index f60e6def0e5..e4eda7bced1 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandler.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandler.java @@ -12,32 +12,19 @@ *******************************************************************************/ package org.eclipse.sirius.web.sample.services; -import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.BIG_GUY_FLOW_ID; import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.EMPTY_ACTION_ID; import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.EMPTY_DOMAIN_ID; -import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.EMPTY_FLOW_ID; import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.EMPTY_VIEW_ID; import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.PAPAYA_DOMAIN_ID; import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.PAPAYA_VIEW_ID; -import static org.eclipse.sirius.web.sample.services.EditingContextActionProvider.ROBOT_FLOW_ID; -import fr.obeo.dsl.designer.sample.flow.FlowFactory; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.function.Consumer; -import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; -import org.eclipse.emf.ecore.xmi.XMLParserPool; -import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; -import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.sirius.components.collaborative.api.ChangeKind; import org.eclipse.sirius.components.collaborative.api.IEditingContextActionHandler; @@ -47,7 +34,6 @@ import org.eclipse.sirius.components.emf.ResourceMetadataAdapter; import org.eclipse.sirius.components.emf.services.JSONResourceFactory; import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext; -import org.eclipse.sirius.components.emf.utils.EMFResourceUtils; import org.eclipse.sirius.components.representations.Failure; import org.eclipse.sirius.components.representations.IStatus; import org.eclipse.sirius.components.representations.Success; @@ -61,7 +47,6 @@ import org.eclipse.sirius.web.sample.papaya.view.PapayaViewProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; @@ -73,9 +58,7 @@ @Service public class EditingContextActionHandler implements IEditingContextActionHandler { - private static final XMLParserPool PARSER_POOL = new XMLParserPoolImpl(); - - private static final List HANDLED_ACTIONS = List.of(EMPTY_ACTION_ID, EMPTY_FLOW_ID, ROBOT_FLOW_ID, BIG_GUY_FLOW_ID, + private static final List HANDLED_ACTIONS = List.of(EMPTY_ACTION_ID, EMPTY_DOMAIN_ID, PAPAYA_DOMAIN_ID, EMPTY_VIEW_ID, PAPAYA_VIEW_ID); private final Logger logger = LoggerFactory.getLogger(EditingContextActionHandler.class); @@ -105,9 +88,6 @@ public IStatus handle(IEditingContext editingContext, String actionId) { private IStatus performActionOnResourceSet(ResourceSet resourceSet, String actionId) { return switch (actionId) { case EMPTY_ACTION_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createEmptyResource); - case EMPTY_FLOW_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createEmptyFlowResource); - case ROBOT_FLOW_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createRobotFlowResource); - case BIG_GUY_FLOW_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createBigGuyFlowResource); case EMPTY_DOMAIN_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createEmptyDomainResource); case PAPAYA_DOMAIN_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createPapayaDomainResource); case EMPTY_VIEW_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createEmptyViewResource); @@ -128,13 +108,6 @@ private void createEmptyResource(ResourceSet resourceSet) { resourceSet.getResources().add(resource); } - private void createEmptyFlowResource(ResourceSet resourceSet) { - JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); - resource.getContents().add(FlowFactory.eINSTANCE.createSystem()); - resource.eAdapters().add(new ResourceMetadataAdapter("Flow")); - resourceSet.getResources().add(resource); - } - private void createEmptyDomainResource(ResourceSet resourceSet) { JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); Domain domain = DomainFactory.eINSTANCE.createDomain(); @@ -171,49 +144,4 @@ private void createPapayaViewResource(ResourceSet resourceSet) { resourceSet.getResources().add(resource); } - - private void createRobotFlowResource(ResourceSet resourceSet) { - this.getResourceFromClassPathResource(new ClassPathResource("robot.flow")).ifPresent(resource -> { - resource.eAdapters().add(new ResourceMetadataAdapter("Robot Flow")); - resourceSet.getResources().add(resource); - }); - } - - private void createBigGuyFlowResource(ResourceSet resourceSet) { - this.getResourceFromClassPathResource(new ClassPathResource("Big_Guy.flow")).ifPresent(resource -> { - resource.eAdapters().add(new ResourceMetadataAdapter("Big Guy Flow (17k elements)")); - resourceSet.getResources().add(resource); - }); - } - - public Optional getResourceFromClassPathResource(ClassPathResource classPathResource) { - - try (var inputStream = classPathResource.getInputStream()) { - URI uri = new JSONResourceFactory().createResourceURI(UUID.randomUUID().toString()); - return Optional.of(this.loadFromXMIAndTransformToJSONResource(uri, inputStream)); - } catch (IOException exception) { - this.logger.error(exception.getMessage(), exception); - return Optional.empty(); - } - } - - private Resource loadFromXMIAndTransformToJSONResource(URI uri, InputStream inputStream) throws IOException { - Resource inputResource = new XMIResourceImpl(uri); - Map xmiLoadOptions = new EMFResourceUtils().getXMILoadOptions(PARSER_POOL); - inputResource.load(inputStream, xmiLoadOptions); - return this.transformToJSON(uri, inputResource); - } - - private JsonResource transformToJSON(URI uri, Resource inputResource) throws IOException { - JsonResource outputResource = new JSONResourceFactory().createResource(uri); - outputResource.getContents().addAll(inputResource.getContents()); - try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - Map jsonSaveOptions = new EMFResourceUtils().getFastJSONSaveOptions(); - jsonSaveOptions.put(JsonResource.OPTION_ENCODING, JsonResource.ENCODING_UTF_8); - jsonSaveOptions.put(JsonResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); - outputResource.save(outputStream, jsonSaveOptions); - } - return outputResource; - } - } diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionProvider.java index 56bab458ff6..231bee54d65 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionProvider.java @@ -34,12 +34,6 @@ public class EditingContextActionProvider implements IEditingContextActionProvid public static final String EMPTY_ACTION_ID = "empty"; - public static final String EMPTY_FLOW_ID = "empty_flow"; - - public static final String ROBOT_FLOW_ID = "robot_flow"; - - public static final String BIG_GUY_FLOW_ID = "big_guy_flow"; - public static final String EMPTY_DOMAIN_ID = "empty_domain"; public static final String PAPAYA_DOMAIN_ID = "papaya_domain"; @@ -50,12 +44,6 @@ public class EditingContextActionProvider implements IEditingContextActionProvid private static final EditingContextAction EMPTY_EDITING_CONTEXT_ACTION = new EditingContextAction(EMPTY_ACTION_ID, "Others..."); - private static final EditingContextAction EMPTY_FLOW_EDITING_CONTEXT_ACTION = new EditingContextAction(EMPTY_FLOW_ID, "Flow"); - - private static final EditingContextAction ROBOT_FLOW_EDITING_CONTEXT_ACTION = new EditingContextAction(ROBOT_FLOW_ID, "Robot Flow"); - - private static final EditingContextAction BIG_GUY_FLOW_EDITING_CONTEXT_ACTION = new EditingContextAction(BIG_GUY_FLOW_ID, "Big Guy Flow (17k elements)"); - private static final EditingContextAction EMPTY_DOMAIN_EDITING_CONTEXT_ACTION = new EditingContextAction(EMPTY_DOMAIN_ID, "Domain"); private static final EditingContextAction PAPAYA_DOMAIN_EDITING_CONTEXT_ACTION = new EditingContextAction(PAPAYA_DOMAIN_ID, "Papaya Domain"); @@ -78,9 +66,6 @@ public List getEditingContextAction(IEditingContext editin var containsDomain = nsURIs.contains(DomainPackage.eNS_URI); var containsView = nsURIs.contains(ViewPackage.eNS_URI); - actions.add(EMPTY_FLOW_EDITING_CONTEXT_ACTION); - actions.add(ROBOT_FLOW_EDITING_CONTEXT_ACTION); - actions.add(BIG_GUY_FLOW_EDITING_CONTEXT_ACTION); if (containsDomain) { actions.add(EMPTY_DOMAIN_EDITING_CONTEXT_ACTION); } diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application-dev.properties b/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application-dev.properties index 9859682e638..ee420f08d2c 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application-dev.properties +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application-dev.properties @@ -1,5 +1,5 @@ -################################################################################################ -# Copyright (c) 2019, 2022 Obeo. +################################################################################ +# Copyright (c) 2019, 2024 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 @@ -9,7 +9,7 @@ # # Contributors: # Obeo - initial API and implementation -################################################################################################ +################################################################################# ################################################## # @@ -21,7 +21,7 @@ server.port=8080 spring.mvc.pathmatch.matching-strategy=ant-path-matcher logging.level.org.eclipse.sirius.web.diagrams.layout.LayoutService=OFF -org.eclipse.sirius.web.customImages.pattern=classpath:/icons/papaya/** +org.eclipse.sirius.web.customImages.pattern=classpath*:/customImages/** ################################################## # @@ -30,7 +30,7 @@ org.eclipse.sirius.web.customImages.pattern=classpath:/icons/papaya/** ################################################## -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.properties.hibernate.session.events.log.LOG_QUERIES_SLOWER_THAN_MS=20 spring.jpa.hibernate.ddl-auto=none spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application.properties b/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application.properties index 41ce0ed19cd..5b6800e218d 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application.properties +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/application.properties @@ -1,5 +1,5 @@ -################################################################################################ -# Copyright (c) 2019, 2020 Obeo. +################################################################################ +# Copyright (c) 2019, 2024 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 @@ -9,9 +9,9 @@ # # Contributors: # Obeo - initial API and implementation -################################################################################################ +################################################################################# spring.mvc.pathmatch.matching-strategy=ant-path-matcher -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=none spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl @@ -28,4 +28,4 @@ sirius.components.cors.allowedOriginPatterns=* org.eclipse.sirius.web.features.studioDefinition=true logging.level.org.eclipse.sirius.web.diagrams.layout.LayoutService=OFF -org.eclipse.sirius.web.customImages.pattern=classpath:/icons/papaya/** \ No newline at end of file +org.eclipse.sirius.web.customImages.pattern=classpath*:/customImages/** diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/icons/papaya/ActorHuman.png b/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/customImages/papaya/ActorHuman.png similarity index 100% rename from packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/icons/papaya/ActorHuman.png rename to packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/customImages/papaya/ActorHuman.png diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/icons/papaya/FunctionInputPort.png b/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/customImages/papaya/FunctionInputPort.png similarity index 100% rename from packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/icons/papaya/FunctionInputPort.png rename to packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/customImages/papaya/FunctionInputPort.png diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/icons/papaya/FunctionOutputPort.png b/packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/customImages/papaya/FunctionOutputPort.png similarity index 100% rename from packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/icons/papaya/FunctionOutputPort.png rename to packages/sirius-web/backend/sirius-web-sample-application/src/main/resources/customImages/papaya/FunctionOutputPort.png diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandlerTests.java b/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandlerTests.java index 883c83e5461..b7d88e29376 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandlerTests.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandlerTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023 Obeo. + * Copyright (c) 2023, 2024 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 @@ -25,14 +25,14 @@ public class EditingContextActionHandlerTests { @ParameterizedTest - @ValueSource(strings = {"empty", "empty_flow", "robot_flow", "big_guy_flow", "empty_domain", "papaya_domain", "empty_view", "papaya_view"}) + @ValueSource(strings = { "empty", "empty_domain", "papaya_domain", "empty_view", "papaya_view" }) void testCanHandle(String actionId) { EditingContextActionHandler handler = new EditingContextActionHandler(); assertThat(handler.canHandle(null, actionId)).isTrue(); } @ParameterizedTest - @ValueSource(strings = {"", "wrong_action", "other", "EMPTY"}) + @ValueSource(strings = { "", "wrong_action", "other", "EMPTY", "empty_flow", "robot_flow", "big_guy_flow" }) void testCanNotHandle(String actionId) { EditingContextActionHandler handler = new EditingContextActionHandler(); assertThat(handler.canHandle(null, actionId)).isFalse(); diff --git a/packages/starters/backend/pom.xml b/packages/starters/backend/pom.xml index 0f8b8dc986b..34015208381 100644 --- a/packages/starters/backend/pom.xml +++ b/packages/starters/backend/pom.xml @@ -34,5 +34,6 @@ sirius-components-starter sirius-components-task-starter + sirius-components-flow-starter diff --git a/packages/starters/backend/sirius-components-flow-starter/README.adoc b/packages/starters/backend/sirius-components-flow-starter/README.adoc new file mode 100644 index 00000000000..e4d60772133 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/README.adoc @@ -0,0 +1,5 @@ += sirius-components-flow-starter + +== Goal + +This project provides an autoconfiguration for Flow related MM. diff --git a/packages/starters/backend/sirius-components-flow-starter/pom.xml b/packages/starters/backend/sirius-components-flow-starter/pom.xml new file mode 100644 index 00000000000..6d501ebabb7 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/pom.xml @@ -0,0 +1,166 @@ + + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.1.2 + + + org.eclipse.sirius + sirius-components-flow-starter + 2023.12.8 + sirius-components-flow-starter + Sirius Components Flow Starter + + + 17 + 1.0.11-SNAPSHOT + + + + + github + Apache Maven Packages + https://maven.pkg.github.com/eclipse-sirius/sirius-web + + + + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework + spring-context + + + org.eclipse.sirius + sirius-components-view-builder + 2023.12.8 + + + org.eclipse.sirius + sirius-components-view + 2023.12.8 + + + org.eclipse.sirius + sirius-components-core + 2023.12.8 + + + org.eclipse.sirius + sirius-components-view-emf + 2023.12.8 + + + org.eclipse.sirius + sirius-web-services-api + 2023.12.8 + + + org.eclipse.sirius + sirius-web-persistence + 2023.12.8 + + + fr.obeo.dsl.designer.sample.flow + fr.obeo.dsl.designer.sample.flow + ${flow.version} + + + fr.obeo.dsl.designer.sample.flow + fr.obeo.dsl.designer.sample.flow.edit + ${flow.version} + + + org.eclipse.sirius + sirius-components-tests + 2023.12.8 + test + + + org.eclipse.sirius + sirius-components-spring-tests + 2023.12.8 + test + + + org.eclipse.sirius + sirius-web-services + 2023.12.8 + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.2.0 + + ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml + true + true + true + + + + validate + validate + + check + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.10 + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowEMFConfiguration.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowEMFConfiguration.java new file mode 100644 index 00000000000..89f4e9a2983 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowEMFConfiguration.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.configuration; + +import fr.obeo.dsl.designer.sample.flow.FlowPackage; +import fr.obeo.dsl.designer.sample.flow.provider.FlowItemProviderAdapterFactory; + +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.sirius.components.emf.services.ILabelFeatureProvider; +import org.eclipse.sirius.components.emf.services.LabelFeatureProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration of the EMF support for Flow MM. + * + * @author frouene + */ +@Configuration +public class FlowEMFConfiguration { + + @Bean + public AdapterFactory flowAdapterFactory() { + return new FlowItemProviderAdapterFactory(); + } + + @Bean + public EPackage flowEPackage() { + return FlowPackage.eINSTANCE; + } + + @Bean + public ILabelFeatureProvider flowLabelFeatureProvider() { + return new LabelFeatureProvider(FlowPackage.eINSTANCE.getNsURI(), new FlowLabelFeatureSwitch(), new FlowEditableSwitch()); + } + +} diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowEditableSwitch.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowEditableSwitch.java similarity index 91% rename from packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowEditableSwitch.java rename to packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowEditableSwitch.java index 0038b1a7565..90f19440879 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowEditableSwitch.java +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowEditableSwitch.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2023 Obeo. + * Copyright (c) 2019, 2024 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 @@ -10,7 +10,7 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -package org.eclipse.sirius.web.sample.configuration; +package org.eclipse.sirius.components.flow.starter.configuration; import fr.obeo.dsl.designer.sample.flow.Named; import fr.obeo.dsl.designer.sample.flow.util.FlowSwitch; @@ -24,6 +24,7 @@ * @author arichard */ public class FlowEditableSwitch extends FlowSwitch { + @Override public Boolean caseNamed(Named object) { return true; diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowLabelFeatureSwitch.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowLabelFeatureSwitch.java similarity index 94% rename from packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowLabelFeatureSwitch.java rename to packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowLabelFeatureSwitch.java index a81b596d4f5..84f49ea39fe 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowLabelFeatureSwitch.java +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowLabelFeatureSwitch.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2023 Obeo. + * Copyright (c) 2019, 2024 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 @@ -10,7 +10,7 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -package org.eclipse.sirius.web.sample.configuration; +package org.eclipse.sirius.components.flow.starter.configuration; import fr.obeo.dsl.designer.sample.flow.DataFlow; import fr.obeo.dsl.designer.sample.flow.Fan; @@ -28,6 +28,7 @@ * @author arichard */ public class FlowLabelFeatureSwitch extends FlowSwitch { + @Override public EAttribute caseNamed(Named object) { return FlowPackage.eINSTANCE.getNamed_Name(); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesInitializer.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowProjectTemplatesInitializer.java similarity index 95% rename from packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesInitializer.java rename to packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowProjectTemplatesInitializer.java index f72a0e57f62..53d15a110c6 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesInitializer.java +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowProjectTemplatesInitializer.java @@ -10,7 +10,7 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -package org.eclipse.sirius.web.sample.configuration; +package org.eclipse.sirius.components.flow.starter.configuration; import fr.obeo.dsl.designer.sample.flow.CompositeProcessor; import fr.obeo.dsl.designer.sample.flow.DataFlow; @@ -39,6 +39,7 @@ import org.eclipse.sirius.components.emf.ResourceMetadataAdapter; import org.eclipse.sirius.components.emf.services.JSONResourceFactory; import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext; +import org.eclipse.sirius.components.flow.starter.helper.StereotypeBuilder; import org.eclipse.sirius.emfjson.resource.JsonResource; import org.eclipse.sirius.web.persistence.entities.DocumentEntity; import org.eclipse.sirius.web.persistence.repositories.IDocumentRepository; @@ -58,6 +59,7 @@ */ @Configuration public class FlowProjectTemplatesInitializer implements IProjectTemplateInitializer { + private static final String DOCUMENT_TITLE = "FlowNewModel"; private final Logger logger = LoggerFactory.getLogger(FlowProjectTemplatesInitializer.class); @@ -75,7 +77,7 @@ public class FlowProjectTemplatesInitializer implements IProjectTemplateInitiali private final StereotypeBuilder stereotypeBuilder; public FlowProjectTemplatesInitializer(IProjectRepository projectRepository, IDocumentRepository documentRepository, IRepresentationDescriptionSearchService representationDescriptionSearchService, - IDiagramCreationService diagramCreationService, IRepresentationPersistenceService representationPersistenceService, MeterRegistry meterRegistry) { + IDiagramCreationService diagramCreationService, IRepresentationPersistenceService representationPersistenceService, MeterRegistry meterRegistry) { this.projectRepository = Objects.requireNonNull(projectRepository); this.documentRepository = Objects.requireNonNull(documentRepository); this.representationDescriptionSearchService = Objects.requireNonNull(representationDescriptionSearchService); @@ -99,12 +101,10 @@ public Optional handle(String templateId, IEditingContex private Optional initializeFlowProject(IEditingContext editingContext) { Optional result = Optional.empty(); - // @formatter:off Optional optionalEditingDomain = Optional.of(editingContext) .filter(IEMFEditingContext.class::isInstance) .map(IEMFEditingContext.class::cast) .map(IEMFEditingContext::getDomain); - // @formatter:on Optional editingContextUUID = new IDParser().parse(editingContext.getId()); if (optionalEditingDomain.isPresent() && editingContextUUID.isPresent()) { AdapterFactoryEditingDomain adapterFactoryEditingDomain = optionalEditingDomain.get(); @@ -183,13 +183,11 @@ private String getRobotFlowContent() { } private Optional findDiagramDescription(IEditingContext editingContext, String label) { - // @formatter:off return this.representationDescriptionSearchService.findAll(editingContext).values().stream() .filter(DiagramDescription.class::isInstance) .map(DiagramDescription.class::cast) - .filter(diagramDescrpition -> Objects.equals(label, diagramDescrpition.getLabel())) + .filter(diagramDescription -> Objects.equals(label, diagramDescription.getLabel())) .findFirst(); - // @formatter:on } } diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowProjectTemplatesProvider.java similarity index 90% rename from packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesProvider.java rename to packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowProjectTemplatesProvider.java index 96c4aab8242..717a960a139 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesProvider.java +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowProjectTemplatesProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023 Obeo. + * Copyright (c) 2023, 2024 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 @@ -10,7 +10,7 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -package org.eclipse.sirius.web.sample.configuration; +package org.eclipse.sirius.components.flow.starter.configuration; import java.util.List; @@ -30,13 +30,11 @@ public class FlowProjectTemplatesProvider implements IProjectTemplateProvider { @Override public List getProjectTemplates() { - // @formatter:off var flowTemplate = ProjectTemplate.newProjectTemplate(FLOW_TEMPLATE_ID) .label("Flow") .imageURL("/images/Flow-Template.png") .natures(List.of()) .build(); - // @formatter:on return List.of(flowTemplate); } diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowStereotypeDescriptionRegistryConfigurer.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowStereotypeDescriptionRegistryConfigurer.java new file mode 100644 index 00000000000..5649a5ec8ad --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowStereotypeDescriptionRegistryConfigurer.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2019, 2024 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.sirius.components.flow.starter.configuration; + +import fr.obeo.dsl.designer.sample.flow.FlowFactory; + +import java.util.List; +import java.util.UUID; + +import org.eclipse.sirius.components.core.configuration.IStereotypeDescriptionRegistry; +import org.eclipse.sirius.components.core.configuration.IStereotypeDescriptionRegistryConfigurer; +import org.eclipse.sirius.components.core.configuration.StereotypeDescription; +import org.eclipse.sirius.components.flow.starter.helper.StereotypeBuilder; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; + +import io.micrometer.core.instrument.MeterRegistry; + +/** + * Configuration used to register new stereotype descriptions. + * + * @author sbegaudeau + */ +@Configuration +public class FlowStereotypeDescriptionRegistryConfigurer implements IStereotypeDescriptionRegistryConfigurer { + + + public static final UUID EMPTY_FLOW_ID = UUID.nameUUIDFromBytes("empty_flow".getBytes()); + + public static final String EMPTY_FLOW_LABEL = "Flow"; + + public static final UUID ROBOT_FLOW_ID = UUID.nameUUIDFromBytes("robot_flow".getBytes()); + + public static final String ROBOT_FLOW_LABEL = "Robot Flow"; + + public static final UUID BIG_GUY_FLOW_ID = UUID.nameUUIDFromBytes("big_guy_flow".getBytes()); + + public static final String BIG_GUY_FLOW_LABEL = "Big Guy Flow (17k elements)"; + + private static final String TIMER_NAME = "flow_siriusweb_stereotype_load"; + + private final StereotypeBuilder stereotypeBuilder; + + public FlowStereotypeDescriptionRegistryConfigurer(MeterRegistry meterRegistry) { + this.stereotypeBuilder = new StereotypeBuilder(TIMER_NAME, meterRegistry); + } + + @Override + public void addStereotypeDescriptions(IStereotypeDescriptionRegistry registry) { + registry.add(new StereotypeDescription(EMPTY_FLOW_ID, EMPTY_FLOW_LABEL, this::getEmptyFlowContent)); + registry.add(new StereotypeDescription(ROBOT_FLOW_ID, ROBOT_FLOW_LABEL, this::getRobotFlowContent)); + registry.add(new StereotypeDescription(BIG_GUY_FLOW_ID, BIG_GUY_FLOW_LABEL, this::getBigGuyFlowContent)); + } + + private String getEmptyFlowContent() { + return this.stereotypeBuilder.getStereotypeBody(List.of(FlowFactory.eINSTANCE.createSystem())); + } + + private String getRobotFlowContent() { + return this.stereotypeBuilder.getStereotypeBody(new ClassPathResource("robot.flow")); + } + + private String getBigGuyFlowContent() { + return this.stereotypeBuilder.getStereotypeBody(new ClassPathResource("Big_Guy.flow")); + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowViewRegistryConfiguration.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowViewRegistryConfiguration.java new file mode 100644 index 00000000000..ae87b467f09 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/configuration/FlowViewRegistryConfiguration.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.configuration; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistry; +import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistryConfigurer; +import org.eclipse.sirius.components.emf.ResourceMetadataAdapter; +import org.eclipse.sirius.components.emf.services.IDAdapter; +import org.eclipse.sirius.components.emf.services.JSONResourceFactory; +import org.eclipse.sirius.components.flow.starter.helper.ColorProvider; +import org.eclipse.sirius.components.flow.starter.view.FlowTopographyUnsynchronizedViewDiagramDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.FlowTopographyViewDiagramDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.FlowTopographyWithAutoLayoutViewDiagramDescriptionProvider; +import org.eclipse.sirius.components.view.ColorPalette; +import org.eclipse.sirius.components.view.FixedColor; +import org.eclipse.sirius.components.view.View; +import org.eclipse.sirius.components.view.ViewFactory; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilder; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.emf.IViewConverter; +import org.eclipse.sirius.emfjson.resource.JsonResource; +import org.eclipse.sirius.web.services.api.representations.IInMemoryViewRegistry; +import org.springframework.context.annotation.Configuration; + +/** + * Register the Flow diagram in the application. + * + * @author frouene + */ +@Configuration +public class FlowViewRegistryConfiguration implements IRepresentationDescriptionRegistryConfigurer { + + private static final String FLOW_VIEW_DIAGRAM_ID = "FlowDiagram"; + private final IViewConverter viewConverter; + + private final EPackage.Registry ePackagesRegistry; + private final IInMemoryViewRegistry inMemoryViewRegistry; + + public FlowViewRegistryConfiguration(IViewConverter viewConverter, EPackage.Registry ePackagesRegistry, IInMemoryViewRegistry inMemoryViewRegistry) { + this.viewConverter = Objects.requireNonNull(viewConverter); + this.ePackagesRegistry = Objects.requireNonNull(ePackagesRegistry); + this.inMemoryViewRegistry = Objects.requireNonNull(inMemoryViewRegistry); + } + + @Override + public void addRepresentationDescriptions(IRepresentationDescriptionRegistry registry) { + + ViewBuilder viewBuilder = new ViewBuilder(); + View view = viewBuilder.build(); + IColorProvider colorProvider = new ColorProvider(view); + + view.getColorPalettes().add(this.createColorPalette()); + + view.getDescriptions().add(new FlowTopographyViewDiagramDescriptionProvider().create(colorProvider)); + view.getDescriptions().add(new FlowTopographyWithAutoLayoutViewDiagramDescriptionProvider().create(colorProvider)); + view.getDescriptions().add(new FlowTopographyUnsynchronizedViewDiagramDescriptionProvider().create(colorProvider)); + + // Add an ID to all view elements + view.eAllContents().forEachRemaining(eObject -> { + eObject.eAdapters().add(new IDAdapter(UUID.nameUUIDFromBytes(EcoreUtil.getURI(eObject).toString().getBytes()))); + }); + + // All programmatic Views need to be stored in a Resource and registered in IInMemoryViewRegistry + String resourcePath = UUID.nameUUIDFromBytes(FLOW_VIEW_DIAGRAM_ID.getBytes()).toString(); + JsonResource resource = new JSONResourceFactory().createResourceFromPath(resourcePath); + resource.eAdapters().add(new ResourceMetadataAdapter(FLOW_VIEW_DIAGRAM_ID)); + resource.getContents().add(view); + this.inMemoryViewRegistry.register(view); + + // Convert org.eclipse.sirius.components.view.RepresentationDescription to org.eclipse.sirius.components.representations.IRepresentationDescription + List staticEPackages = this.ePackagesRegistry.values().stream().filter(EPackage.class::isInstance).map(EPackage.class::cast).toList(); + var representationDescriptions = this.viewConverter.convert(List.of(view), staticEPackages); + + // Register org.eclipse.sirius.components.representations.IRepresentationDescription + representationDescriptions.forEach(registry::add); + } + + private ColorPalette createColorPalette() { + var colorPalette = ViewFactory.eINSTANCE.createColorPalette(); + + + colorPalette.getColors().add(this.createFixedColor("Flow_White", "#FFFFFF")); + colorPalette.getColors().add(this.createFixedColor("Flow_Gray", "#B1BCBE")); + colorPalette.getColors().add(this.createFixedColor("Flow_Orange", "#FBA600")); + colorPalette.getColors().add(this.createFixedColor("Flow_Red", "#DE1000")); + colorPalette.getColors().add(this.createFixedColor("Flow_Black", "#002B3C")); + colorPalette.getColors().add(this.createFixedColor("Flow_LightGray", "#F0F0F0")); + + + return colorPalette; + } + + private FixedColor createFixedColor(String name, String value) { + var fixedColor = ViewFactory.eINSTANCE.createFixedColor(); + fixedColor.setName(name); + fixedColor.setValue(value); + + return fixedColor; + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/ColorProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/ColorProvider.java new file mode 100644 index 00000000000..4629af3880b --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/ColorProvider.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2023, 2024 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.sirius.components.flow.starter.helper; + +import java.util.Collection; +import java.util.Objects; + +import org.eclipse.sirius.components.view.ColorPalette; +import org.eclipse.sirius.components.view.UserColor; +import org.eclipse.sirius.components.view.View; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; + +/** + * Used to find a color in the palette. + * + * @author sbegaudeau + */ +public class ColorProvider implements IColorProvider { + + private final View view; + + public ColorProvider(View view) { + this.view = Objects.requireNonNull(view); + } + + @Override + public UserColor getColor(String colorName) { + return this.view.getColorPalettes() + .stream() + .map(ColorPalette::getColors) + .flatMap(Collection::stream) + .filter(userColor -> userColor.getName().equals(colorName)) + .findFirst() + .orElse(null); + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/StereotypeBuilder.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/StereotypeBuilder.java new file mode 100644 index 00000000000..621b52b1302 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/helper/StereotypeBuilder.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.helper; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.xmi.XMLParserPool; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; +import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl; +import org.eclipse.sirius.components.emf.services.JSONResourceFactory; +import org.eclipse.sirius.components.emf.utils.EMFResourceUtils; +import org.eclipse.sirius.emfjson.resource.JsonResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Timer; + +/** + * Helper to create a document stereotype from an EMF model. + * + * @author pcdavid + */ +public class StereotypeBuilder { + + private static final XMLParserPool XML_PARSER_POOL = new XMLParserPoolImpl(); + + private final Logger logger = LoggerFactory.getLogger(StereotypeBuilder.class); + + private final Timer timer; + + public StereotypeBuilder(String timerName, MeterRegistry meterRegistry) { + this.timer = Timer.builder(timerName).register(meterRegistry); + } + + public String getStereotypeBody(List rootEObjects) { + JsonResource resource = new JSONResourceFactory().createResourceFromPath("inmemory"); + if (rootEObjects != null) { + resource.getContents().addAll(rootEObjects); + } + + String content = ""; + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + Map options = new HashMap<>(); + options.put(JsonResource.OPTION_ENCODING, JsonResource.ENCODING_UTF_8); + options.put(JsonResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); + + resource.save(outputStream, options); + + content = outputStream.toString(); + } catch (IOException exception) { + this.logger.error(exception.getMessage(), exception); + } + return content; + } + + public String getStereotypeBody(ClassPathResource classPathResource) { + long start = System.currentTimeMillis(); + + String content = ""; + try (var inputStream = classPathResource.getInputStream()) { + URI uri = new JSONResourceFactory().createResourceURI(classPathResource.getFilename()); + Resource inputResource = this.loadFromXMI(uri, inputStream); + content = this.saveAsJSON(uri, inputResource); + } catch (IOException exception) { + this.logger.error(exception.getMessage(), exception); + } + + long end = System.currentTimeMillis(); + this.timer.record(end - start, TimeUnit.MILLISECONDS); + + return content; + } + + private Resource loadFromXMI(URI uri, InputStream inputStream) throws IOException { + Resource inputResource = new XMIResourceImpl(uri); + Map xmiLoadOptions = new EMFResourceUtils().getXMILoadOptions(XML_PARSER_POOL); + inputResource.load(inputStream, xmiLoadOptions); + return inputResource; + } + + private String saveAsJSON(URI uri, Resource inputResource) throws IOException { + String content; + JsonResource ouputResource = new JSONResourceFactory().createResource(uri); + ouputResource.getContents().addAll(inputResource.getContents()); + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + Map jsonSaveOptions = new EMFResourceUtils().getFastJSONSaveOptions(); + jsonSaveOptions.put(JsonResource.OPTION_ENCODING, JsonResource.ENCODING_UTF_8); + jsonSaveOptions.put(JsonResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); + ouputResource.save(outputStream, jsonSaveOptions); + content = outputStream.toString(StandardCharsets.UTF_8); + } + return content; + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandler.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandler.java new file mode 100644 index 00000000000..6f8dacfc5fa --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandler.java @@ -0,0 +1,153 @@ +/******************************************************************************* + * Copyright (c) 2023, 2024 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.sirius.components.flow.starter.services; + + +import static org.eclipse.sirius.components.flow.starter.services.FlowEditingContextActionProvider.BIG_GUY_FLOW_ID; +import static org.eclipse.sirius.components.flow.starter.services.FlowEditingContextActionProvider.EMPTY_FLOW_ID; +import static org.eclipse.sirius.components.flow.starter.services.FlowEditingContextActionProvider.ROBOT_FLOW_ID; + +import fr.obeo.dsl.designer.sample.flow.FlowFactory; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Consumer; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.xmi.XMLParserPool; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; +import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl; +import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; +import org.eclipse.sirius.components.collaborative.api.ChangeKind; +import org.eclipse.sirius.components.collaborative.api.IEditingContextActionHandler; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.emf.ResourceMetadataAdapter; +import org.eclipse.sirius.components.emf.services.JSONResourceFactory; +import org.eclipse.sirius.components.emf.utils.EMFResourceUtils; +import org.eclipse.sirius.components.representations.Failure; +import org.eclipse.sirius.components.representations.IStatus; +import org.eclipse.sirius.components.representations.Success; +import org.eclipse.sirius.emfjson.resource.JsonResource; +import org.eclipse.sirius.web.services.editingcontext.EditingContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; + + +/** + * Handler used to perform an action on the editingContext. + * + * @author frouene + */ +@Service +public class FlowEditingContextActionHandler implements IEditingContextActionHandler { + + private static final XMLParserPool PARSER_POOL = new XMLParserPoolImpl(); + + private static final List HANDLED_ACTIONS = List.of(EMPTY_FLOW_ID, ROBOT_FLOW_ID, BIG_GUY_FLOW_ID); + + private final Logger logger = LoggerFactory.getLogger(FlowEditingContextActionHandler.class); + + @Override + public boolean canHandle(IEditingContext editingContext, String actionId) { + return HANDLED_ACTIONS.contains(actionId); + } + + @Override + public IStatus handle(IEditingContext editingContext, String actionId) { + return Optional.of(editingContext) + .filter(EditingContext.class::isInstance) + .map(EditingContext.class::cast) + .map(EditingContext::getDomain) + .map(AdapterFactoryEditingDomain::getResourceSet) + .map(resourceSet -> this.performActionOnResourceSet(resourceSet, actionId)) + .orElse(new Failure("Something went wrong while handling this action.")); + } + + private IStatus performActionOnResourceSet(ResourceSet resourceSet, String actionId) { + return switch (actionId) { + case EMPTY_FLOW_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createEmptyFlowResource); + case ROBOT_FLOW_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createRobotFlowResource); + case BIG_GUY_FLOW_ID -> this.createResourceAndReturnSuccess(resourceSet, this::createBigGuyFlowResource); + default -> new Failure("Unknown action."); + }; + + } + + private IStatus createResourceAndReturnSuccess(ResourceSet resourceSet, Consumer createResource) { + createResource.accept(resourceSet); + return new Success(ChangeKind.SEMANTIC_CHANGE, Map.of()); + } + + + private void createEmptyFlowResource(ResourceSet resourceSet) { + JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); + resource.getContents().add(FlowFactory.eINSTANCE.createSystem()); + resource.eAdapters().add(new ResourceMetadataAdapter("Flow")); + resourceSet.getResources().add(resource); + } + + + private void createRobotFlowResource(ResourceSet resourceSet) { + this.getResourceFromClassPathResource(new ClassPathResource("robot.flow")).ifPresent(resource -> { + resource.eAdapters().add(new ResourceMetadataAdapter("Robot Flow")); + resourceSet.getResources().add(resource); + }); + } + + private void createBigGuyFlowResource(ResourceSet resourceSet) { + this.getResourceFromClassPathResource(new ClassPathResource("Big_Guy.flow")).ifPresent(resource -> { + resource.eAdapters().add(new ResourceMetadataAdapter("Big Guy Flow (17k elements)")); + resourceSet.getResources().add(resource); + }); + } + + public Optional getResourceFromClassPathResource(ClassPathResource classPathResource) { + + try (var inputStream = classPathResource.getInputStream()) { + URI uri = new JSONResourceFactory().createResourceURI(UUID.randomUUID().toString()); + return Optional.of(this.loadFromXMIAndTransformToJSONResource(uri, inputStream)); + } catch (IOException exception) { + this.logger.error(exception.getMessage(), exception); + return Optional.empty(); + } + } + + private Resource loadFromXMIAndTransformToJSONResource(URI uri, InputStream inputStream) throws IOException { + Resource inputResource = new XMIResourceImpl(uri); + Map xmiLoadOptions = new EMFResourceUtils().getXMILoadOptions(PARSER_POOL); + inputResource.load(inputStream, xmiLoadOptions); + return this.transformToJSON(uri, inputResource); + } + + private JsonResource transformToJSON(URI uri, Resource inputResource) throws IOException { + JsonResource outputResource = new JSONResourceFactory().createResource(uri); + outputResource.getContents().addAll(inputResource.getContents()); + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + Map jsonSaveOptions = new EMFResourceUtils().getFastJSONSaveOptions(); + jsonSaveOptions.put(JsonResource.OPTION_ENCODING, JsonResource.ENCODING_UTF_8); + jsonSaveOptions.put(JsonResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); + outputResource.save(outputStream, jsonSaveOptions); + } + return outputResource; + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionProvider.java new file mode 100644 index 00000000000..79c21370e40 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionProvider.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023, 2024 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.sirius.components.flow.starter.services; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.sirius.components.collaborative.api.IEditingContextActionProvider; +import org.eclipse.sirius.components.collaborative.dto.EditingContextAction; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.web.services.editingcontext.EditingContext; +import org.springframework.stereotype.Service; + +/** + * Provides the list of possible actions on the editingContext. + * + * @author frouene + */ +@Service +public class FlowEditingContextActionProvider implements IEditingContextActionProvider { + + + public static final String EMPTY_FLOW_ID = "empty_flow"; + + public static final String ROBOT_FLOW_ID = "robot_flow"; + + public static final String BIG_GUY_FLOW_ID = "big_guy_flow"; + + + private static final EditingContextAction EMPTY_FLOW_EDITING_CONTEXT_ACTION = new EditingContextAction(EMPTY_FLOW_ID, "Flow"); + + private static final EditingContextAction ROBOT_FLOW_EDITING_CONTEXT_ACTION = new EditingContextAction(ROBOT_FLOW_ID, "Robot Flow"); + + private static final EditingContextAction BIG_GUY_FLOW_EDITING_CONTEXT_ACTION = new EditingContextAction(BIG_GUY_FLOW_ID, "Big Guy Flow (17k elements)"); + + + @Override + public List getEditingContextAction(IEditingContext editingContext) { + var actions = new ArrayList(); + if (editingContext instanceof EditingContext) { + actions.add(EMPTY_FLOW_EDITING_CONTEXT_ACTION); + actions.add(ROBOT_FLOW_EDITING_CONTEXT_ACTION); + actions.add(BIG_GUY_FLOW_EDITING_CONTEXT_ACTION); + } + return actions; + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowJavaServiceProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowJavaServiceProvider.java new file mode 100644 index 00000000000..2fe81f875d9 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowJavaServiceProvider.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2022, 2024 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.sirius.components.flow.starter.services; + +import java.util.List; + +import org.eclipse.sirius.components.view.View; +import org.eclipse.sirius.components.view.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.emf.IJavaServiceProvider; +import org.springframework.stereotype.Service; + +/** + * Used to provide services for the Flow view. + * + * @author frouene + */ +@Service +public class FlowJavaServiceProvider implements IJavaServiceProvider { + + @Override + public List> getServiceClasses(View view) { + boolean isFlowView = view.getDescriptions().stream() + .filter(DiagramDescription.class::isInstance) + .map(DiagramDescription.class::cast) + .anyMatch(diagramDescription -> diagramDescription.getDomainType().equals("flow::System")); + if (isFlowView) { + return List.of(FlowService.class); + } + return List.of(); + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowService.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowService.java new file mode 100644 index 00000000000..2157fefbe07 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/services/FlowService.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.services; + +import fr.obeo.dsl.designer.sample.flow.DataSource; + +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramContext; +import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.diagrams.Node; +import org.eclipse.sirius.components.diagrams.ViewCreationRequest; +import org.eclipse.sirius.components.diagrams.components.NodeContainmentKind; +import org.eclipse.sirius.components.view.diagram.NodeDescription; + +/** + * Java Service for the Flow view. + * + * @author frouene + */ +public class FlowService { + + private final IObjectService objectService; + + public FlowService(IObjectService objectService) { + this.objectService = Objects.requireNonNull(objectService); + } + + public EObject drop(EObject self, Node selectedNode, IDiagramContext diagramContext, + Map convertedNodes) { + var parentElementId = Optional.ofNullable(selectedNode) + .map(Node::getId) + .orElse(diagramContext.getDiagram().getId()); + + var targetObjectId = this.objectService.getId(self); + + String nodeDescriptionName; + if (self.eClass().getName().equals("CompositeProcessor")) { + nodeDescriptionName = "System Node"; + } else { + nodeDescriptionName = self.eClass().getName() + " Node"; + } + + var descriptionId = convertedNodes.entrySet().stream() + .filter(entry -> entry.getKey().getName().equals(nodeDescriptionName)) + .findFirst() + .map(entry -> entry.getValue().getId()) + .orElse(null); + + if (parentElementId != null && targetObjectId != null && descriptionId != null) { + var viewCreationRequest = ViewCreationRequest.newViewCreationRequest() + .parentElementId(parentElementId) + .targetObjectId(targetObjectId) + .descriptionId(descriptionId) + .containmentKind(NodeContainmentKind.CHILD_NODE) + .build(); + diagramContext.getViewCreationRequests().add(viewCreationRequest); + } + + return self; + } + + public int computeDataSourceHeight(DataSource self) { + if (self.getName().equals("Camera") || self.getName().equals("Radar") || self.getName().equals("Sensor")) { + return self.getVolume() * 15; + } + return self.getVolume() * 11; + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyUnsynchronizedViewDiagramDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyUnsynchronizedViewDiagramDescriptionProvider.java new file mode 100644 index 00000000000..bff99a9e99f --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyUnsynchronizedViewDiagramDescriptionProvider.java @@ -0,0 +1,177 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view; + +import java.util.List; + +import org.eclipse.sirius.components.flow.starter.view.descriptions.DataSourceDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.DataSourceToProcessorEdgeDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.FanDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.ProcessorDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.ProcessorToProcessorEdgeDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.SystemDescriptionProvider; +import org.eclipse.sirius.components.view.RepresentationDescription; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.IDiagramElementDescriptionProvider; +import org.eclipse.sirius.components.view.builder.providers.IRepresentationDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.DiagramPalette; +import org.eclipse.sirius.components.view.diagram.DiagramToolSection; +import org.eclipse.sirius.components.view.diagram.DropTool; +import org.eclipse.sirius.components.view.diagram.NodeTool; +import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; + +/** + * Used to create Flow view. + * + * @author frouene + */ +@SuppressWarnings("checkstyle:MultipleStringLiterals") +public class FlowTopographyUnsynchronizedViewDiagramDescriptionProvider implements IRepresentationDescriptionProvider { + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + + @Override + public RepresentationDescription create(IColorProvider colorProvider) { + var diagramDescriptionBuilder = this.diagramBuilderHelper.newDiagramDescription(); + var diagramDescription = diagramDescriptionBuilder + .autoLayout(false) + .domainType("flow::System") + .name("Topography unsynchronized") + .titleExpression("Topography unsynchronized").build(); + + + var cache = new ViewDiagramElementFinder(); + var diagramElementDescriptionProviders = List.of( + new DataSourceDescriptionProvider(colorProvider, SynchronizationPolicy.UNSYNCHRONIZED), + new ProcessorDescriptionProvider(colorProvider, SynchronizationPolicy.UNSYNCHRONIZED), + new FanDescriptionProvider(colorProvider, SynchronizationPolicy.UNSYNCHRONIZED), + new SystemDescriptionProvider(colorProvider, SynchronizationPolicy.UNSYNCHRONIZED, false), + new DataSourceToProcessorEdgeDescriptionProvider(colorProvider), + new ProcessorToProcessorEdgeDescriptionProvider(colorProvider) + ); + + diagramElementDescriptionProviders.stream().map(IDiagramElementDescriptionProvider::create).forEach(cache::put); + + diagramElementDescriptionProviders.forEach(diagramElementDescriptionProvider -> diagramElementDescriptionProvider.link(diagramDescription, cache)); + + var palette = this.createDiagramPalette(cache); + diagramDescription.setPalette(palette); + + return diagramDescription; + } + + private DiagramPalette createDiagramPalette(IViewDiagramElementFinder cache) { + return this.diagramBuilderHelper.newDiagramPalette() + .toolSections(this.createDiagramToolSection(cache)) + .dropTool(this.createDropTool(cache)) + .build(); + } + + private DiagramToolSection createDiagramToolSection(IViewDiagramElementFinder cache) { + return this.diagramBuilderHelper.newDiagramToolSection() + .name("Creation Tools") + .nodeTools(this.createNodeToolCreateCompositeProcessor(cache), + this.createNodeToolCreateDataSource(cache)) + .build(); + } + + private NodeTool createNodeToolCreateCompositeProcessor(IViewDiagramElementFinder cache) { + + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'CompositeProcessor' + self.eContainer().eContents()->filter(flow::CompositeProcessor)->size()"); + + cache.getNodeDescription(SystemDescriptionProvider.NAME).ifPresent(dataSourceNodeDescription -> { + var createView = this.diagramBuilderHelper.newCreateView() + .parentViewExpression("aql:selectedNode") + .semanticElementExpression("aql:newInstance") + .elementDescription(dataSourceNodeDescription); + + setValueName.children(createView.build()); + }); + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::CompositeProcessor") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Composite Processor") + .iconURLsExpression("/icons/full/obj16/System.gif") + .body(createInstance.build()) + .build(); + } + + private NodeTool createNodeToolCreateDataSource(IViewDiagramElementFinder cache) { + + var setValueVolume = this.viewBuilderHelper.newSetValue() + .featureName("volume") + .valueExpression("6"); + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'DataSource' + self.eContainer().eContents()->filter(flow::DataSource)->size()"); + + cache.getNodeDescription(DataSourceDescriptionProvider.NAME).ifPresent(dataSourceNodeDescription -> { + var createView = this.diagramBuilderHelper.newCreateView() + .parentViewExpression("aql:selectedNode") + .semanticElementExpression("aql:newInstance") + .elementDescription(dataSourceNodeDescription); + + setValueName.children(createView.build()); + }); + + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueVolume.build(), setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::DataSource") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Data Source") + .iconURLsExpression("/icons/full/obj16/DataSource_active.gif") + .body(createInstance.build()) + .build(); + } + + private DropTool createDropTool(IViewDiagramElementFinder cache) { + var changeContext = this.viewBuilderHelper.newChangeContext() + .expression("aql:self.drop(selectedNode, diagramContext, convertedNodes)"); + + return this.diagramBuilderHelper.newDropTool() + .name("Drop Tool") + .body(changeContext.build()) + .build(); + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyViewDiagramDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyViewDiagramDescriptionProvider.java new file mode 100644 index 00000000000..8883235f138 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyViewDiagramDescriptionProvider.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view; + +import java.util.List; + +import org.eclipse.sirius.components.flow.starter.view.descriptions.DataSourceDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.DataSourceToProcessorEdgeDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.FanDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.ProcessorDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.ProcessorToProcessorEdgeDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.SystemDescriptionProvider; +import org.eclipse.sirius.components.view.RepresentationDescription; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.IDiagramElementDescriptionProvider; +import org.eclipse.sirius.components.view.builder.providers.IRepresentationDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.DiagramPalette; +import org.eclipse.sirius.components.view.diagram.DiagramToolSection; +import org.eclipse.sirius.components.view.diagram.NodeTool; +import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; + +/** + * Used to create Flow view. + * + * @author frouene + */ +@SuppressWarnings("checkstyle:MultipleStringLiterals") +public class FlowTopographyViewDiagramDescriptionProvider implements IRepresentationDescriptionProvider { + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + + @Override + public RepresentationDescription create(IColorProvider colorProvider) { + var diagramDescriptionBuilder = this.diagramBuilderHelper.newDiagramDescription(); + var diagramDescription = diagramDescriptionBuilder + .autoLayout(false) + .domainType("flow::System") + .name("Topography") + .titleExpression("Topography").build(); + + + var cache = new ViewDiagramElementFinder(); + var diagramElementDescriptionProviders = List.of( + new DataSourceDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED), + new ProcessorDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED), + new FanDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED), + new SystemDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED, false), + new DataSourceToProcessorEdgeDescriptionProvider(colorProvider), + new ProcessorToProcessorEdgeDescriptionProvider(colorProvider) + ); + + diagramElementDescriptionProviders.stream().map(IDiagramElementDescriptionProvider::create).forEach(cache::put); + + diagramElementDescriptionProviders.forEach(diagramElementDescriptionProvider -> diagramElementDescriptionProvider.link(diagramDescription, cache)); + + var palette = this.createDiagramPalette(cache); + diagramDescription.setPalette(palette); + + return diagramDescription; + } + + private DiagramPalette createDiagramPalette(IViewDiagramElementFinder cache) { + return this.diagramBuilderHelper.newDiagramPalette() + .toolSections(this.createDiagramToolSection(cache)) + .build(); + } + + private DiagramToolSection createDiagramToolSection(IViewDiagramElementFinder cache) { + return this.diagramBuilderHelper.newDiagramToolSection() + .name("Creation Tools") + .nodeTools(this.createNodeToolCreateCompositeProcessor(), + this.createNodeToolCreateDataSource()) + .build(); + } + + private NodeTool createNodeToolCreateCompositeProcessor() { + + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'CompositeProcessor' + self.eContainer().eContents()->filter(flow::CompositeProcessor)->size()"); + + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::CompositeProcessor") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Composite Processor") + .iconURLsExpression("/icons/full/obj16/System.gif") + .body(createInstance.build()) + .build(); + } + + private NodeTool createNodeToolCreateDataSource() { + + var setValueVolume = this.viewBuilderHelper.newSetValue() + .featureName("volume") + .valueExpression("6"); + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'DataSource' + self.eContainer().eContents()->filter(flow::DataSource)->size()"); + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueVolume.build(), setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::DataSource") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Data Source") + .iconURLsExpression("/icons/full/obj16/DataSource_active.gif") + .body(createInstance.build()) + .build(); + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyWithAutoLayoutViewDiagramDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyWithAutoLayoutViewDiagramDescriptionProvider.java new file mode 100644 index 00000000000..1185f0f49e6 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowTopographyWithAutoLayoutViewDiagramDescriptionProvider.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view; + +import java.util.List; + +import org.eclipse.sirius.components.flow.starter.view.descriptions.DataSourceDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.DataSourceToProcessorEdgeDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.FanDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.ProcessorDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.ProcessorToProcessorEdgeDescriptionProvider; +import org.eclipse.sirius.components.flow.starter.view.descriptions.SystemDescriptionProvider; +import org.eclipse.sirius.components.view.RepresentationDescription; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.IDiagramElementDescriptionProvider; +import org.eclipse.sirius.components.view.builder.providers.IRepresentationDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.DiagramPalette; +import org.eclipse.sirius.components.view.diagram.DiagramToolSection; +import org.eclipse.sirius.components.view.diagram.NodeTool; +import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; + +/** + * Used to create Flow view. + * + * @author frouene + */ +@SuppressWarnings("checkstyle:MultipleStringLiterals") +public class FlowTopographyWithAutoLayoutViewDiagramDescriptionProvider implements IRepresentationDescriptionProvider { + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + + @Override + public RepresentationDescription create(IColorProvider colorProvider) { + var diagramDescriptionBuilder = this.diagramBuilderHelper.newDiagramDescription(); + var diagramDescription = diagramDescriptionBuilder + .autoLayout(true) + .domainType("flow::System") + .name("Topography with auto layout") + .titleExpression("Topography with auto layout").build(); + + + var cache = new ViewDiagramElementFinder(); + var diagramElementDescriptionProviders = List.of( + new DataSourceDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED), + new ProcessorDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED), + new FanDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED), + new SystemDescriptionProvider(colorProvider, SynchronizationPolicy.SYNCHRONIZED, true), + new DataSourceToProcessorEdgeDescriptionProvider(colorProvider), + new ProcessorToProcessorEdgeDescriptionProvider(colorProvider) + ); + + diagramElementDescriptionProviders.stream().map(IDiagramElementDescriptionProvider::create).forEach(cache::put); + + diagramElementDescriptionProviders.forEach(diagramElementDescriptionProvider -> diagramElementDescriptionProvider.link(diagramDescription, cache)); + + var palette = this.createDiagramPalette(cache); + diagramDescription.setPalette(palette); + + return diagramDescription; + } + + private DiagramPalette createDiagramPalette(IViewDiagramElementFinder cache) { + return this.diagramBuilderHelper.newDiagramPalette() + .toolSections(this.createDiagramToolSection(cache)) + .build(); + } + + private DiagramToolSection createDiagramToolSection(IViewDiagramElementFinder cache) { + return this.diagramBuilderHelper.newDiagramToolSection() + .name("Creation Tools") + .nodeTools(this.createNodeToolCreateCompositeProcessor(), + this.createNodeToolCreateDataSource()) + .build(); + } + + private NodeTool createNodeToolCreateCompositeProcessor() { + + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'CompositeProcessor' + self.eContainer().eContents()->filter(flow::CompositeProcessor)->size()"); + + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::CompositeProcessor") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Composite Processor") + .iconURLsExpression("/icons/full/obj16/System.gif") + .body(createInstance.build()) + .build(); + } + + private NodeTool createNodeToolCreateDataSource() { + + var setValueVolume = this.viewBuilderHelper.newSetValue() + .featureName("volume") + .valueExpression("6"); + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'DataSource' + self.eContainer().eContents()->filter(flow::DataSource)->size()"); + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueVolume.build(), setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::DataSource") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Data Source") + .iconURLsExpression("/icons/full/obj16/DataSource_active.gif") + .body(createInstance.build()) + .build(); + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowViewBuilder.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowViewBuilder.java new file mode 100644 index 00000000000..1c9f935b7bc --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/FlowViewBuilder.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view; + +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.diagram.DeleteTool; +import org.eclipse.sirius.components.view.diagram.EdgeTool; +import org.eclipse.sirius.components.view.diagram.ImageNodeStyleDescription; +import org.eclipse.sirius.components.view.diagram.LabelEditTool; +import org.eclipse.sirius.components.view.diagram.NodeDescription; + +/** + * Used to help creating the Flow view. + * + * @author frouene + */ +public class FlowViewBuilder { + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + public ImageNodeStyleDescription createImageNodeStyleDescription(String shapeId, IColorProvider colorProvider) { + return this.diagramBuilderHelper.newImageNodeStyleDescription() + .shape(shapeId) + .color(colorProvider.getColor("transparent")) + .borderColor(colorProvider.getColor("transparent")) + .labelColor(colorProvider.getColor("Flow_Black")) + .build(); + } + + public DeleteTool createDeleteTool() { + var changeContext = this.viewBuilderHelper.newChangeContext() + .expression("aql:self.defaultDelete()"); + + return this.diagramBuilderHelper.newDeleteTool() + .name("Delete from Model") + .body(changeContext.build()) + .build(); + } + + public LabelEditTool createLabelEditTool() { + var callEditService = this.viewBuilderHelper.newChangeContext() + .expression("aql:self.defaultEditLabel(newLabel)"); + + return this.diagramBuilderHelper.newLabelEditTool() + .name("Edit") + .body(callEditService.build()) + .build(); + } + + public EdgeTool createEdgeToProcessorTool(NodeDescription processorNodeDescription) { + + var setValueCapacity = this.viewBuilderHelper.newSetValue() + .featureName("capacity") + .valueExpression("6"); + var setValueLoad = this.viewBuilderHelper.newSetValue() + .featureName("load") + .valueExpression("6"); + + var setValueSource = this.viewBuilderHelper.newSetValue() + .featureName("source") + .valueExpression("var:semanticEdgeSource"); + + var setValueTarget = this.viewBuilderHelper.newSetValue() + .featureName("target") + .valueExpression("var:semanticEdgeTarget"); + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueTarget.build(), setValueSource.build(), setValueCapacity.build(), setValueLoad.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow.DataFlow") + .referenceName("outgoingFlows") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + var changeContext = this.viewBuilderHelper.newChangeContext() + .expression("var:semanticEdgeSource") + .children(createInstance.build()); + + return this.diagramBuilderHelper.newEdgeTool() + .name("Indirect Dependencies") + .targetElementDescriptions(processorNodeDescription) + .body(changeContext.build()) + .build(); + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/ViewDiagramElementFinder.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/ViewDiagramElementFinder.java new file mode 100644 index 00000000000..39ac8f6de22 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/ViewDiagramElementFinder.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.IViewObjectCache; +import org.eclipse.sirius.components.view.diagram.EdgeDescription; +import org.eclipse.sirius.components.view.diagram.NodeDescription; + +/** + * Store and retrieve created element. + * + * @author mcharfadi + */ +public class ViewDiagramElementFinder implements IViewObjectCache, IViewDiagramElementFinder { + + private final Map> data = new HashMap<>(); + + @Override + public void put(EObject eObject) { + var eObjects = this.data.getOrDefault(eObject.eClass().getName(), new ArrayList<>()); + eObjects.add(eObject); + this.data.put(eObject.eClass().getName(), eObjects); + } + + @Override + public Optional getNodeDescription(String name) { + return this.data.getOrDefault("NodeDescription", List.of()).stream() + .filter(NodeDescription.class::isInstance) + .map(NodeDescription.class::cast) + .filter(nodeDescription -> nodeDescription.getName().equals(name)) + .findFirst(); + } + + @Override + public Optional getEdgeDescription(String name) { + return this.data.getOrDefault("EdgeDescription", List.of()).stream() + .filter(EdgeDescription.class::isInstance) + .map(EdgeDescription.class::cast) + .filter(edgeDescription -> edgeDescription.getName().equals(name)) + .findFirst(); + } + + @Override + public List getNodeDescriptions() { + return this.data.getOrDefault("NodeDescription", List.of()).stream() + .filter(NodeDescription.class::isInstance) + .map(NodeDescription.class::cast) + .toList(); + } + + @Override + public List getEdgeDescriptions() { + return this.data.getOrDefault("EdgeDescription", List.of()).stream() + .filter(EdgeDescription.class::isInstance) + .map(EdgeDescription.class::cast) + .toList(); + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceDescriptionProvider.java new file mode 100644 index 00000000000..522a94a5efa --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceDescriptionProvider.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view.descriptions; + +import java.util.Objects; + +import org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.INodeDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.diagram.DiagramFactory; +import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.sirius.components.view.diagram.NodePalette; +import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; + +/** + * Used to create the DataSource node description. + * + * @author frouene + */ +@SuppressWarnings("checkstyle:MultipleStringLiterals") +public class DataSourceDescriptionProvider implements INodeDescriptionProvider { + + public static final String NAME = "DataSource Node"; + + private final IColorProvider colorProvider; + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final FlowViewBuilder flowViewBuilder = new FlowViewBuilder(); + + private final SynchronizationPolicy synchronizationPolicy; + + public DataSourceDescriptionProvider(IColorProvider colorProvider, SynchronizationPolicy synchronizationPolicy) { + this.colorProvider = Objects.requireNonNull(colorProvider); + this.synchronizationPolicy = Objects.requireNonNull(synchronizationPolicy); + } + + + @Override + public NodeDescription create() { + + return this.diagramBuilderHelper.newNodeDescription() + .name(NAME) + .domainType("flow::DataSource") + .semanticCandidatesExpression("feature:elements") + .childrenLayoutStrategy(DiagramFactory.eINSTANCE.createFreeFormLayoutStrategyDescription()) + .labelExpression("aql:self.name") + .defaultHeightExpression("aql:self.volume*15") + .defaultWidthExpression("aql:self.computeDataSourceHeight()") + .keepAspectRatio(true) + .style(this.flowViewBuilder.createImageNodeStyleDescription("03b31fa9-7559-3be8-99e6-1b0e961e97a0", this.colorProvider)) + .synchronizationPolicy(this.synchronizationPolicy) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.name.contains('Camera')") + .style(this.flowViewBuilder.createImageNodeStyleDescription("5854f600-0cc7-34ce-89f7-1451337031dc", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.name.contains('Radar')") + .style(this.flowViewBuilder.createImageNodeStyleDescription("a9bd424c-1bda-3566-a091-db55e4ea3403", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.name.contains('Wifi')") + .style(this.flowViewBuilder.createImageNodeStyleDescription("f35a77fd-5baa-3c91-a918-646ecef0c21f", this.colorProvider)) + .build()) + .build(); + } + + @Override + public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { + cache.getNodeDescription(NAME).ifPresent(nodeDescription -> { + diagramDescription.getNodeDescriptions().add(nodeDescription); + cache.getNodeDescription(ProcessorDescriptionProvider.NAME).ifPresent(processorNodeDescription -> nodeDescription.setPalette(this.createNodePalette(processorNodeDescription))); + }); + } + + private NodePalette createNodePalette(NodeDescription processorNodeDescription) { + + return this.diagramBuilderHelper.newNodePalette() + .deleteTool(this.flowViewBuilder.createDeleteTool()) + .labelEditTool(this.flowViewBuilder.createLabelEditTool()) + .edgeTools(this.flowViewBuilder.createEdgeToProcessorTool(processorNodeDescription)) + .build(); + } + + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceToProcessorEdgeDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceToProcessorEdgeDescriptionProvider.java new file mode 100644 index 00000000000..5e68f9b0a80 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/DataSourceToProcessorEdgeDescriptionProvider.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view.descriptions; + +import java.util.Objects; + +import org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.IEdgeDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.ArrowStyle; +import org.eclipse.sirius.components.view.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.diagram.EdgeDescription; +import org.eclipse.sirius.components.view.diagram.EdgePalette; +import org.eclipse.sirius.components.view.diagram.LabelEditTool; +import org.eclipse.sirius.components.view.diagram.LineStyle; + +/** + * Used to create the datasource to processor edge description. + * + * @author frouene + */ +public class DataSourceToProcessorEdgeDescriptionProvider implements IEdgeDescriptionProvider { + + public static final String NAME = "DataSource To Processor"; + + private final IColorProvider colorProvider; + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final FlowViewBuilder flowViewBuilder = new FlowViewBuilder(); + + public DataSourceToProcessorEdgeDescriptionProvider(IColorProvider colorProvider) { + this.colorProvider = Objects.requireNonNull(colorProvider); + } + + @Override + public EdgeDescription create() { + return this.diagramBuilderHelper.newEdgeDescription() + .name(NAME) + .domainType("flow::DataFlow") + .semanticCandidatesExpression("aql:self.elements.eAllContents(flow::DataFlow)") + .targetNodesExpression("feature:target") + .sourceNodesExpression("feature:source") + .isDomainBasedEdge(true) + .labelExpression("aql:self.capacity") + .style(this.diagramBuilderHelper.newEdgeStyle() + .lineStyle(LineStyle.DASH) + .color(this.colorProvider.getColor("Flow_Gray")) + .targetArrowStyle(ArrowStyle.INPUT_CLOSED_ARROW) + .build()) + .palette(this.createEdgePalette()) + .build(); + } + + @Override + public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { + var optionalDataSourceToProcessorEdgeDescription = cache.getEdgeDescription(NAME); + var optionalDataSourceNodeDescription = cache.getNodeDescription(DataSourceDescriptionProvider.NAME); + var optionalProcessorNodeDescription = cache.getNodeDescription(ProcessorDescriptionProvider.NAME); + + if (optionalDataSourceToProcessorEdgeDescription.isPresent() && optionalDataSourceNodeDescription.isPresent() && optionalProcessorNodeDescription.isPresent()) { + diagramDescription.getEdgeDescriptions().add(optionalDataSourceToProcessorEdgeDescription.get()); + optionalDataSourceToProcessorEdgeDescription.get().getSourceNodeDescriptions().add(optionalDataSourceNodeDescription.get()); + optionalDataSourceToProcessorEdgeDescription.get().getTargetNodeDescriptions().add(optionalProcessorNodeDescription.get()); + } + } + + private EdgePalette createEdgePalette() { + + return this.diagramBuilderHelper.newEdgePalette() + .deleteTool(this.flowViewBuilder.createDeleteTool()) + .centerLabelEditTool(this.createLabelEditTool()) + .build(); + } + + public LabelEditTool createLabelEditTool() { + var setValueCapacity = this.viewBuilderHelper.newSetValue() + .featureName("capacity") + .valueExpression("aql:newLabel"); + + return this.diagramBuilderHelper.newLabelEditTool() + .name("Edit") + .body(setValueCapacity.build()) + .build(); + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/FanDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/FanDescriptionProvider.java new file mode 100644 index 00000000000..c2f46c57fcf --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/FanDescriptionProvider.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view.descriptions; + +import java.util.Objects; + +import org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.INodeDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.diagram.DiagramFactory; +import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.sirius.components.view.diagram.NodePalette; +import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; + +/** + * Used to create the fan node description. + * + * @author frouene + */ +@SuppressWarnings("checkstyle:MultipleStringLiterals") +public class FanDescriptionProvider implements INodeDescriptionProvider { + + public static final String NAME = "Fan Node"; + + private final IColorProvider colorProvider; + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final FlowViewBuilder flowViewBuilder = new FlowViewBuilder(); + + private final SynchronizationPolicy synchronizationPolicy; + + public FanDescriptionProvider(IColorProvider colorProvider, SynchronizationPolicy synchronizationPolicy) { + this.colorProvider = Objects.requireNonNull(colorProvider); + this.synchronizationPolicy = Objects.requireNonNull(synchronizationPolicy); + } + + + @Override + public NodeDescription create() { + + return this.diagramBuilderHelper.newNodeDescription() + .name(NAME) + .domainType("flow::Fan") + .semanticCandidatesExpression("feature:elements") + .childrenLayoutStrategy(DiagramFactory.eINSTANCE.createFreeFormLayoutStrategyDescription()) + .labelExpression("feature:speed") + .defaultHeightExpression("aql:self.speed/2") + .defaultWidthExpression("aql:self.speed/2") + .keepAspectRatio(true) + .style(this.flowViewBuilder.createImageNodeStyleDescription("36a758b7-92bb-323d-b255-74c30980e077", this.colorProvider)) + .synchronizationPolicy(this.synchronizationPolicy) + .palette(this.createNodePalette()) + .build(); + } + + @Override + public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { + cache.getNodeDescription(NAME).ifPresent(nodeDescription -> diagramDescription.getNodeDescriptions().add(nodeDescription)); + } + + private NodePalette createNodePalette() { + + return this.diagramBuilderHelper.newNodePalette() + .deleteTool(this.flowViewBuilder.createDeleteTool()) + .labelEditTool(this.flowViewBuilder.createLabelEditTool()) + .build(); + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorDescriptionProvider.java new file mode 100644 index 00000000000..1195c33819c --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorDescriptionProvider.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view.descriptions; + +import java.util.Objects; + +import org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.INodeDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.diagram.DiagramFactory; +import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.sirius.components.view.diagram.NodePalette; +import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; + +/** + * Used to create the processor node description. + * + * @author frouene + */ +public class ProcessorDescriptionProvider implements INodeDescriptionProvider { + + public static final String NAME = "Processor Node"; + + private final IColorProvider colorProvider; + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final FlowViewBuilder flowViewBuilder = new FlowViewBuilder(); + + private final SynchronizationPolicy synchronizationPolicy; + + public ProcessorDescriptionProvider(IColorProvider colorProvider, SynchronizationPolicy synchronizationPolicy) { + this.colorProvider = Objects.requireNonNull(colorProvider); + this.synchronizationPolicy = Objects.requireNonNull(synchronizationPolicy); + } + + @Override + public NodeDescription create() { + return this.diagramBuilderHelper.newNodeDescription() + .name(NAME) + .domainType("flow::Processor") + .semanticCandidatesExpression("feature:elements") + .childrenLayoutStrategy(DiagramFactory.eINSTANCE.createFreeFormLayoutStrategyDescription()) + .labelExpression("aql:self.name") + .defaultHeightExpression("aql:self.capacity*15") + .defaultWidthExpression("aql:self.capacity*15") + .keepAspectRatio(true) + .style(this.flowViewBuilder.createImageNodeStyleDescription("45a6cb0d-6ddf-3d87-91a8-b6de9028020e", this.colorProvider)) + .synchronizationPolicy(this.synchronizationPolicy) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('Engine') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::unused") + .style(this.flowViewBuilder.createImageNodeStyleDescription("dbfdb9b7-eece-307c-b440-7f8b8a64b943", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('Engine') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::low") + .style(this.flowViewBuilder.createImageNodeStyleDescription("c2741813-91b5-39c7-b3d2-e1292fd5d7cd", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('Engine') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::standard") + .style(this.flowViewBuilder.createImageNodeStyleDescription("4f0347a1-d50f-3534-a94b-5287ecc22dd0", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('Engine') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::high") + .style(this.flowViewBuilder.createImageNodeStyleDescription("a320deaf-25df-367d-9c52-f5a13890e08b", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('Engine') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::over") + .style(this.flowViewBuilder.createImageNodeStyleDescription("3d292721-74ae-3f48-b121-833fb125fc8f", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('DSP') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::unused") + .style(this.flowViewBuilder.createImageNodeStyleDescription("aa222d0a-7fd3-31f8-906d-7d9546ff0ad5", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('DSP') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::low") + .style(this.flowViewBuilder.createImageNodeStyleDescription("a2f99f91-8489-39dd-bffa-881825496a20", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('DSP') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::standard") + .style(this.flowViewBuilder.createImageNodeStyleDescription("bd7ad6fa-26f4-3755-9c5b-b62301585fc6", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('DSP') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::high") + .style(this.flowViewBuilder.createImageNodeStyleDescription("3a2f0668-7cdf-32fd-a6ed-91e4f41a8c79", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.name.contains('DSP') and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::over") + .style(this.flowViewBuilder.createImageNodeStyleDescription("658bc561-e138-3b1f-87b4-6fe35526338d", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::unused") + .style(this.flowViewBuilder.createImageNodeStyleDescription("50c0639d-68d4-3757-b74f-e180edf5fe50", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::low") + .style(this.flowViewBuilder.createImageNodeStyleDescription("d0884e65-d658-3d23-b431-75567143a74d", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::standard") + .style(this.flowViewBuilder.createImageNodeStyleDescription("dccac4c3-f4d3-3a23-b947-fd31f737312d", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::high") + .style(this.flowViewBuilder.createImageNodeStyleDescription("5e1545cd-1b41-32d0-b91b-3dcef647ba8a", this.colorProvider)) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclIsKindOf(flow::Processor) and self.oclAsType(flow::Processor).usage = flow::FlowElementUsage::over") + .style(this.flowViewBuilder.createImageNodeStyleDescription("f85c3495-71f8-3309-8fd9-32cf6fa38156", this.colorProvider)) + .build()) + .build(); + } + + @Override + public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { + cache.getNodeDescription(NAME).ifPresent(nodeDescription -> { + diagramDescription.getNodeDescriptions().add(nodeDescription); + cache.getNodeDescription(ProcessorDescriptionProvider.NAME).ifPresent(processorNodeDescription -> nodeDescription.setPalette(this.createNodePalette(processorNodeDescription))); + }); + } + + private NodePalette createNodePalette(NodeDescription processorNodeDescription) { + + return this.diagramBuilderHelper.newNodePalette() + .deleteTool(this.flowViewBuilder.createDeleteTool()) + .labelEditTool(this.flowViewBuilder.createLabelEditTool()) + .edgeTools(this.flowViewBuilder.createEdgeToProcessorTool(processorNodeDescription)) + .build(); + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorToProcessorEdgeDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorToProcessorEdgeDescriptionProvider.java new file mode 100644 index 00000000000..57c5a8e6f8a --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/ProcessorToProcessorEdgeDescriptionProvider.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view.descriptions; + +import java.util.Objects; + +import org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.IEdgeDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.ArrowStyle; +import org.eclipse.sirius.components.view.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.diagram.EdgeDescription; +import org.eclipse.sirius.components.view.diagram.EdgePalette; +import org.eclipse.sirius.components.view.diagram.LabelEditTool; +import org.eclipse.sirius.components.view.diagram.LineStyle; + +/** + * Used to create the processor to processor edge description. + * + * @author frouene + */ +public class ProcessorToProcessorEdgeDescriptionProvider implements IEdgeDescriptionProvider { + + public static final String NAME = "Processor To Processor"; + + private final IColorProvider colorProvider; + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final FlowViewBuilder flowViewBuilder = new FlowViewBuilder(); + + public ProcessorToProcessorEdgeDescriptionProvider(IColorProvider colorProvider) { + this.colorProvider = Objects.requireNonNull(colorProvider); + } + + @Override + public EdgeDescription create() { + return this.diagramBuilderHelper.newEdgeDescription() + .name(NAME) + .domainType("flow::DataFlow") + .semanticCandidatesExpression("aql:self.elements.eAllContents(flow::DataFlow)") + .targetNodesExpression("feature:target") + .sourceNodesExpression("feature:source") + .isDomainBasedEdge(true) + .labelExpression("aql:self.capacity") + .style(this.diagramBuilderHelper.newEdgeStyle() + .lineStyle(LineStyle.SOLID) + .color(this.colorProvider.getColor("Flow_Gray")) + .targetArrowStyle(ArrowStyle.INPUT_ARROW) + .build()) + .palette(this.createEdgePalette()) + .build(); + } + + @Override + public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { + var optionalDataSourceToProcessorEdgeDescription = cache.getEdgeDescription(NAME); + var optionalProcessorNodeDescription = cache.getNodeDescription(ProcessorDescriptionProvider.NAME); + + if (optionalDataSourceToProcessorEdgeDescription.isPresent() && optionalProcessorNodeDescription.isPresent()) { + diagramDescription.getEdgeDescriptions().add(optionalDataSourceToProcessorEdgeDescription.get()); + optionalDataSourceToProcessorEdgeDescription.get().getSourceNodeDescriptions().add(optionalProcessorNodeDescription.get()); + optionalDataSourceToProcessorEdgeDescription.get().getTargetNodeDescriptions().add(optionalProcessorNodeDescription.get()); + } + } + + private EdgePalette createEdgePalette() { + + return this.diagramBuilderHelper.newEdgePalette() + .deleteTool(this.flowViewBuilder.createDeleteTool()) + .centerLabelEditTool(this.createLabelEditTool()) + .build(); + } + + public LabelEditTool createLabelEditTool() { + var setValueCapacity = this.viewBuilderHelper.newSetValue() + .featureName("capacity") + .valueExpression("aql:newLabel"); + + return this.diagramBuilderHelper.newLabelEditTool() + .name("Edit") + .body(setValueCapacity.build()) + .build(); + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/SystemDescriptionProvider.java b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/SystemDescriptionProvider.java new file mode 100644 index 00000000000..1dcae652fae --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/java/org/eclipse/sirius/components/flow/starter/view/descriptions/SystemDescriptionProvider.java @@ -0,0 +1,293 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.view.descriptions; + +import java.util.Objects; + +import org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.INodeDescriptionProvider; +import org.eclipse.sirius.components.view.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.diagram.DiagramFactory; +import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.sirius.components.view.diagram.NodePalette; +import org.eclipse.sirius.components.view.diagram.NodeTool; +import org.eclipse.sirius.components.view.diagram.NodeToolSection; +import org.eclipse.sirius.components.view.diagram.RectangularNodeStyleDescription; +import org.eclipse.sirius.components.view.diagram.SynchronizationPolicy; + +/** + * Used to create the system node description. + * + * @author frouene + */ +@SuppressWarnings("checkstyle:MultipleStringLiterals") +public class SystemDescriptionProvider implements INodeDescriptionProvider { + + public static final String NAME = "System Node"; + + private final IColorProvider colorProvider; + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final FlowViewBuilder flowViewBuilder = new FlowViewBuilder(); + + private final SynchronizationPolicy synchronizationPolicy; + + private final boolean autoLayout; + + public SystemDescriptionProvider(IColorProvider colorProvider, SynchronizationPolicy synchronizationPolicy, boolean autoLayout) { + this.colorProvider = Objects.requireNonNull(colorProvider); + this.synchronizationPolicy = Objects.requireNonNull(synchronizationPolicy); + this.autoLayout = autoLayout; + } + + @Override + public NodeDescription create() { + var nodeDescription = this.diagramBuilderHelper.newNodeDescription() + .name(NAME) + .domainType("flow::System") + .semanticCandidatesExpression("feature:elements") + .childrenLayoutStrategy(DiagramFactory.eINSTANCE.createFreeFormLayoutStrategyDescription()) + .labelExpression("aql:self.name") + .defaultHeightExpression("70") + .defaultWidthExpression("150") + .keepAspectRatio(false) + .style(this.getRectangularNodeStyleDescription("Flow_Gray", "Flow_Black")) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclAsType(flow::System).temperature>40") + .style(this.getRectangularNodeStyleDescription("Flow_Red", "Flow_Red")) + .build()) + .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() + .condition("aql:self.oclAsType(flow::System).temperature>30") + .style(this.getRectangularNodeStyleDescription("Flow_Orange", "Flow_Orange")) + .build()) + .synchronizationPolicy(this.synchronizationPolicy) + .reusedChildNodeDescriptions(); + + if (this.autoLayout) { + nodeDescription.childrenDescriptions(this.createDescriptionNode()); + } + + return nodeDescription.build(); + } + + @Override + public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { + var optionalSystemNodeDescription = cache.getNodeDescription(NAME); + var optionalProcessorNodeDescription = cache.getNodeDescription(ProcessorDescriptionProvider.NAME); + var optionalFanNodeDescription = cache.getNodeDescription(FanDescriptionProvider.NAME); + var optionalDataSourceNodeDescription = cache.getNodeDescription(DataSourceDescriptionProvider.NAME); + + if (optionalSystemNodeDescription.isPresent() && optionalProcessorNodeDescription.isPresent() + && optionalFanNodeDescription.isPresent() && optionalDataSourceNodeDescription.isPresent()) { + diagramDescription.getNodeDescriptions().add(optionalSystemNodeDescription.get()); + optionalSystemNodeDescription.get().getReusedChildNodeDescriptions().add(optionalProcessorNodeDescription.get()); + optionalSystemNodeDescription.get().getReusedChildNodeDescriptions().add(optionalFanNodeDescription.get()); + optionalSystemNodeDescription.get().getReusedChildNodeDescriptions().add(optionalDataSourceNodeDescription.get()); + optionalSystemNodeDescription.get().setPalette(this.createNodePalette(cache)); + } + } + + private RectangularNodeStyleDescription getRectangularNodeStyleDescription(String borderColor, String labelColor) { + return this.diagramBuilderHelper.newRectangularNodeStyleDescription() + .color(this.colorProvider.getColor("Flow_LightGray")) + .borderColor(this.colorProvider.getColor(borderColor)) + .labelColor(this.colorProvider.getColor(labelColor)) + .bold(true) + .borderRadius(0) + .withHeader(true) + .displayHeaderSeparator(false) + .build(); + } + + private NodePalette createNodePalette(IViewDiagramElementFinder cache) { + + return this.diagramBuilderHelper.newNodePalette() + .deleteTool(this.flowViewBuilder.createDeleteTool()) + .labelEditTool(this.flowViewBuilder.createLabelEditTool()) + .toolSections(this.createNodeToolSection(cache)) + .build(); + } + + private NodeToolSection createNodeToolSection(IViewDiagramElementFinder cache) { + return this.diagramBuilderHelper.newNodeToolSection() + .name("Creation Tools") + .nodeTools(this.createNodeToolCreateFan(cache), + this.createNodeToolProcessor(cache), + this.createNodeToolCreateDataSource(cache)) + .build(); + } + + private NodeTool createNodeToolCreateFan(IViewDiagramElementFinder cache) { + + var setValueSpeed = this.viewBuilderHelper.newSetValue() + .featureName("speed") + .valueExpression("200"); + + if (this.synchronizationPolicy.equals(SynchronizationPolicy.UNSYNCHRONIZED)) { + cache.getNodeDescription(FanDescriptionProvider.NAME).ifPresent(dataSourceNodeDescription -> { + var createView = this.diagramBuilderHelper.newCreateView() + .parentViewExpression("aql:selectedNode") + .semanticElementExpression("aql:newInstance") + .elementDescription(dataSourceNodeDescription); + + setValueSpeed.children(createView.build()); + }); + } + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueSpeed.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::Fan") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Fan") + .iconURLsExpression("/icons/full/obj16/Fan.gif") + .body(createInstance.build()) + .build(); + } + + private NodeTool createNodeToolProcessor(IViewDiagramElementFinder cache) { + + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'Processor' + self.eContainer().eContents()->filter(flow::Processor)->size()"); + + if (this.synchronizationPolicy.equals(SynchronizationPolicy.UNSYNCHRONIZED)) { + cache.getNodeDescription(ProcessorDescriptionProvider.NAME).ifPresent(dataSourceNodeDescription -> { + var createView = this.diagramBuilderHelper.newCreateView() + .parentViewExpression("aql:selectedNode") + .semanticElementExpression("aql:newInstance") + .elementDescription(dataSourceNodeDescription); + + setValueName.children(createView.build()); + }); + } + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::Processor") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Processor") + .iconURLsExpression("/icons/full/obj16/Processor_active.gif") + .body(createInstance.build()) + .build(); + } + + private NodeTool createNodeToolCreateDataSource(IViewDiagramElementFinder cache) { + + var setValueVolume = this.viewBuilderHelper.newSetValue() + .featureName("volume") + .valueExpression("6"); + var setValueStatus = this.viewBuilderHelper.newSetValue() + .featureName("status") + .valueExpression("active"); + var setValueName = this.viewBuilderHelper.newSetValue() + .featureName("name") + .valueExpression("aql:'DataSource' + self.eContainer().eContents()->filter(flow::DataSource)->size()"); + + if (this.synchronizationPolicy.equals(SynchronizationPolicy.UNSYNCHRONIZED)) { + cache.getNodeDescription(DataSourceDescriptionProvider.NAME).ifPresent(dataSourceNodeDescription -> { + var createView = this.diagramBuilderHelper.newCreateView() + .parentViewExpression("aql:selectedNode") + .semanticElementExpression("aql:newInstance") + .elementDescription(dataSourceNodeDescription); + + setValueName.children(createView.build()); + }); + } + + var changeContextNewInstance = this.viewBuilderHelper.newChangeContext() + .expression("aql:newInstance") + .children(setValueVolume.build(), setValueStatus.build(), setValueName.build()); + + var createInstance = this.viewBuilderHelper.newCreateInstance() + .typeName("flow::DataSource") + .referenceName("elements") + .variableName("newInstance") + .children(changeContextNewInstance.build()); + + return this.diagramBuilderHelper.newNodeTool() + .name("Data Source") + .iconURLsExpression("/icons/full/obj16/DataSource_active.gif") + .body(createInstance.build()) + .build(); + } + + private NodeDescription createDescriptionNode() { + var weightNodeDescription = + this.diagramBuilderHelper.newNodeDescription() + .name("Weight Node") + .semanticCandidatesExpression("aql:self") + .labelExpression("aql:'Weight: ' + self.weight") + .style(this.diagramBuilderHelper.newIconLabelNodeStyleDescription() + .labelColor(this.colorProvider.getColor("Flow_Black")) + .showIcon(false) + .build()) + .build(); + + var temperatureNodeDescription = + this.diagramBuilderHelper.newNodeDescription() + .name("Temperature Node") + .semanticCandidatesExpression("aql:self") + .labelExpression("aql:'Temperature: ' + self.temperature") + .style(this.diagramBuilderHelper.newIconLabelNodeStyleDescription() + .labelColor(this.colorProvider.getColor("Flow_Black")) + .showIcon(false) + .build()) + .build(); + + return this.diagramBuilderHelper.newNodeDescription() + .name("Description Node") + .domainType("flow::CompositeProcessor") + .semanticCandidatesExpression("aql:self") + .childrenLayoutStrategy(this.diagramBuilderHelper.newListLayoutStrategyDescription().areChildNodesDraggableExpression("aql:false").build()) + .labelExpression("Description") + .defaultHeightExpression("50") + .defaultWidthExpression("120") + .keepAspectRatio(false) + .style(this.diagramBuilderHelper.newRectangularNodeStyleDescription() + .color(this.colorProvider.getColor("Flow_White")) + .borderColor(this.colorProvider.getColor("Flow_Black")) + .labelColor(this.colorProvider.getColor("Flow_Black")) + .bold(false) + .borderRadius(3) + .withHeader(true) + .displayHeaderSeparator(true) + .build()) + .synchronizationPolicy(this.synchronizationPolicy) + .childrenDescriptions(weightNodeDescription, temperatureNodeDescription) + .build(); + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/antenna.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/antenna.svg new file mode 100644 index 00000000000..85fb45e2fc9 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/antenna.svg @@ -0,0 +1,63 @@ + + icon + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/camera.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/camera.svg new file mode 100644 index 00000000000..36b7fb563ba --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/camera.svg @@ -0,0 +1,8 @@ + + icon + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_high.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_high.svg new file mode 100644 index 00000000000..368f3e48a85 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_high.svg @@ -0,0 +1,12 @@ + + icon + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_low.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_low.svg new file mode 100644 index 00000000000..6f3b7fff420 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_low.svg @@ -0,0 +1,12 @@ + + icon + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_over.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_over.svg new file mode 100644 index 00000000000..ec46bbeffb8 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_over.svg @@ -0,0 +1,12 @@ + + icon + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_standard.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_standard.svg new file mode 100644 index 00000000000..21f500009af --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_standard.svg @@ -0,0 +1,12 @@ + + icon + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_unused.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_unused.svg new file mode 100644 index 00000000000..a118b122b1b --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset2_unused.svg @@ -0,0 +1,12 @@ + + icon + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_high.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_high.svg new file mode 100644 index 00000000000..5ec090ab7c5 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_high.svg @@ -0,0 +1,11 @@ + + icon + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_low.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_low.svg new file mode 100644 index 00000000000..b50273f7931 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_low.svg @@ -0,0 +1,11 @@ + + icon + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_over.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_over.svg new file mode 100644 index 00000000000..ea18111cfd8 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_over.svg @@ -0,0 +1,11 @@ + + icon + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_standard.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_standard.svg new file mode 100644 index 00000000000..51e0d1ca51b --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_standard.svg @@ -0,0 +1,11 @@ + + icon + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_unused.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_unused.svg new file mode 100644 index 00000000000..7f9e786adb2 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/chipset_unused.svg @@ -0,0 +1,11 @@ + + icon + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu.svg new file mode 100644 index 00000000000..39bfe42ee1c --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu.svg @@ -0,0 +1,248 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu2.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu2.svg new file mode 100644 index 00000000000..2f942d5367e --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu2.svg @@ -0,0 +1,243 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_high.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_high.svg new file mode 100644 index 00000000000..416c93cedf1 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_high.svg @@ -0,0 +1,8 @@ + + icon + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_low.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_low.svg new file mode 100644 index 00000000000..60ddabf5cd2 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_low.svg @@ -0,0 +1,8 @@ + + icon + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_over.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_over.svg new file mode 100644 index 00000000000..1b78785cbef --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_over.svg @@ -0,0 +1,8 @@ + + icon + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_standard.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_standard.svg new file mode 100644 index 00000000000..ee9eaf6a57b --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_standard.svg @@ -0,0 +1,8 @@ + + icon + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_unused.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_unused.svg new file mode 100644 index 00000000000..eb8858237fa --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/cpu_unused.svg @@ -0,0 +1,8 @@ + + icon + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/dsp.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/dsp.svg new file mode 100644 index 00000000000..505da6e5d1d --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/dsp.svg @@ -0,0 +1,373 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/fan.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/fan.svg new file mode 100644 index 00000000000..8dc9a68817a --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/fan.svg @@ -0,0 +1,30 @@ + + icon + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/high.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/high.svg new file mode 100644 index 00000000000..f0b9d867879 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/high.svg @@ -0,0 +1,276 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_input.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_input.svg new file mode 100644 index 00000000000..88cff9ab332 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_input.svg @@ -0,0 +1,7 @@ + + icon + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_output.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_output.svg new file mode 100644 index 00000000000..75378159348 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/power_output.svg @@ -0,0 +1,7 @@ + + icon + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/radar.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/radar.svg new file mode 100644 index 00000000000..8f1c0ecb38f --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/radar.svg @@ -0,0 +1,11 @@ + + icon + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/sensor.svg b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/sensor.svg new file mode 100644 index 00000000000..857ace47054 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/main/resources/customImages/sensor.svg @@ -0,0 +1,13 @@ + + icon + + + + + + + + + + + diff --git a/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/ArchitectureConstants.java b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/ArchitectureConstants.java new file mode 100644 index 00000000000..6fcae5c396f --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/ArchitectureConstants.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.architecture; + +import com.tngtech.archunit.core.domain.JavaClasses; +import com.tngtech.archunit.core.importer.ClassFileImporter; +import com.tngtech.archunit.core.importer.ImportOption; + +/** + * Constants shared across multiple tests. + * + * @author frouene + */ +public final class ArchitectureConstants { + + public static final String SIRIUS_COMPONENTS_FLOW_STARTER_ROOT_PACKAGE = "org.eclipse.sirius.components.flow.starter.."; + + public static final JavaClasses CLASSES = new ClassFileImporter() + .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_JARS) + .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) + .importPackages(SIRIUS_COMPONENTS_FLOW_STARTER_ROOT_PACKAGE); + + private ArchitectureConstants() { + // Prevent instantiation + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/CodingRulesTests.java b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/CodingRulesTests.java new file mode 100644 index 00000000000..200f0917d5d --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/CodingRulesTests.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.architecture; + +import com.tngtech.archunit.core.domain.JavaClasses; + +import org.eclipse.sirius.components.tests.architecture.AbstractCodingRulesTests; +import org.junit.jupiter.api.Test; + +/** + * Coding rules tests. + * + * @author frouene + */ +public class CodingRulesTests extends AbstractCodingRulesTests { + + @Override + protected String getProjectRootPackage() { + return ArchitectureConstants.SIRIUS_COMPONENTS_FLOW_STARTER_ROOT_PACKAGE; + } + + @Override + protected JavaClasses getClasses() { + return ArchitectureConstants.CLASSES; + } + + @Test + @Override + public void noClassesShouldUseApacheCommons() { + super.noClassesShouldUseApacheCommons(); + } +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/SpringCodingRulesTests.java b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/SpringCodingRulesTests.java new file mode 100644 index 00000000000..3d6fe5b38f2 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/architecture/SpringCodingRulesTests.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.architecture; + +import com.tngtech.archunit.core.domain.JavaClasses; + +import org.eclipse.sirius.components.spring.tests.architecture.AbstractSpringCodingRulesTests; + +/** + * Spring coding rules tests. + * + * @author frouene + */ +public class SpringCodingRulesTests extends AbstractSpringCodingRulesTests { + + @Override + protected String getProjectRootPackage() { + return ArchitectureConstants.SIRIUS_COMPONENTS_FLOW_STARTER_ROOT_PACKAGE; + } + + @Override + protected JavaClasses getClasses() { + return ArchitectureConstants.CLASSES; + } + +} diff --git a/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandlerTests.java b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandlerTests.java new file mode 100644 index 00000000000..211172e01f5 --- /dev/null +++ b/packages/starters/backend/sirius-components-flow-starter/src/test/java/org/eclipse/sirius/components/flow/starter/services/FlowEditingContextActionHandlerTests.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2024 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.sirius.components.flow.starter.services; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +/** + * Test used to validate the action handled by EditingContextActionHandler. + * + * @author frouene + */ +public class FlowEditingContextActionHandlerTests { + + @ParameterizedTest + @ValueSource(strings = { "empty_flow", "robot_flow", "big_guy_flow" }) + void testCanHandle(String actionId) { + FlowEditingContextActionHandler handler = new FlowEditingContextActionHandler(); + assertThat(handler.canHandle(null, actionId)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = { "empty", "", "wrong_action", "other", "EMPTY", "empty_domain", "papaya_domain", "empty_view", "papaya_view" }) + void testCanNotHandle(String actionId) { + FlowEditingContextActionHandler handler = new FlowEditingContextActionHandler(); + assertThat(handler.canHandle(null, actionId)).isFalse(); + } +}