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..6344bc864d9 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,9 @@
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
-describe('/projects/:projectId/edit - Diagram', () => {
+// Flow diagram description does not have selection tools after the view DSL conversion
+// These tests can be reactivated when selection support is added to React-Flow
+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/.checkstyle b/packages/starters/backend/sirius-components-flow-starter/.checkstyle
new file mode 100644
index 00000000000..f62c550f181
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.checkstyle
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/starters/backend/sirius-components-flow-starter/.classpath b/packages/starters/backend/sirius-components-flow-starter/.classpath
new file mode 100644
index 00000000000..2a5a91b976c
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.classpath
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/starters/backend/sirius-components-flow-starter/.project b/packages/starters/backend/sirius-components-flow-starter/.project
new file mode 100644
index 00000000000..a1bd138f05e
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.project
@@ -0,0 +1,34 @@
+
+
+ sirius-components-flow-starter
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.springframework.ide.eclipse.boot.validation.springbootbuilder
+
+
+
+
+ net.sf.eclipsecs.core.CheckstyleBuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.jdt.core.javanature
+ net.sf.eclipsecs.core.CheckstyleNature
+
+
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.core.resources.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..f9fe34593fc
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/test/java=UTF-8
+encoding/=UTF-8
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.core.runtime.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 00000000000..a287fefdba8
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#Mon Sep 24 15:04:19 CEST 2007
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.apt.core.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.apt.core.prefs
new file mode 100644
index 00000000000..d4313d4b25e
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.apt.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.apt.aptEnabled=false
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.core.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..2ab93cd0a5b
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,505 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.annotationPath.allLocations=disabled
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant=0
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter=0
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type=49
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assertion_message=0
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_record_components=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=200
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.text_block_indentation=0
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.ui.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..f789e687ad4
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,210 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=true
+cleanup.always_use_this_for_non_static_method_access=true
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=true
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=false
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=false
+cleanup_profile=_Sirius
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Sirius
+formatter_settings_version=21
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=com;fr;java;javax;org;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=/*******************************************************************************\n * Copyright (c) ${year} Obeo.\n * This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v2.0\n * which accompanies this distribution, and is available at\n * https\://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier\: EPL-2.0\n *\n * Contributors\:\n * Obeo - initial API and implementation\n *******************************************************************************//**\n * @author ${user}\n *//**\n * \n *//**\n * ${tags}\n *//**\n * ${tags}\n * ${see_to_target}\n */${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}\n\n\n\n${exception_var}.printStackTrace();${body_statement}${body_statement}return ${field};${field} \= ${param};/**\n * @author ${user}\n *\n * ${tags}\n */\n
+sp_cleanup.add_all=false
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=true
+sp_cleanup.always_use_this_for_non_static_method_access=true
+sp_cleanup.array_with_curly=false
+sp_cleanup.arrays_fill=false
+sp_cleanup.bitwise_conditional_expression=false
+sp_cleanup.boolean_literal=false
+sp_cleanup.boolean_value_rather_than_comparison=false
+sp_cleanup.break_loop=false
+sp_cleanup.collection_cloning=false
+sp_cleanup.comparing_on_criteria=false
+sp_cleanup.comparison_statement=false
+sp_cleanup.controlflow_merge=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
+sp_cleanup.convert_to_switch_expressions=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.do_while_rather_than_while=false
+sp_cleanup.double_negation=false
+sp_cleanup.else_if=false
+sp_cleanup.embedded_if=false
+sp_cleanup.evaluate_nullable=false
+sp_cleanup.extract_increment=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.hash=false
+sp_cleanup.if_condition=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.instanceof=false
+sp_cleanup.instanceof_keyword=false
+sp_cleanup.invert_equals=false
+sp_cleanup.join=false
+sp_cleanup.lazy_logical_operator=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.map_cloning=false
+sp_cleanup.merge_conditional_blocks=false
+sp_cleanup.multi_catch=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.no_string_creation=false
+sp_cleanup.no_super=false
+sp_cleanup.number_suffix=false
+sp_cleanup.objects_equals=false
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+sp_cleanup.operand_factorization=false
+sp_cleanup.organize_imports=true
+sp_cleanup.overridden_assignment=false
+sp_cleanup.overridden_assignment_move_decl=false
+sp_cleanup.plain_replacement=false
+sp_cleanup.precompile_regex=false
+sp_cleanup.primitive_comparison=false
+sp_cleanup.primitive_parsing=false
+sp_cleanup.primitive_rather_than_wrapper=false
+sp_cleanup.primitive_serialization=false
+sp_cleanup.pull_out_if_from_if_else=false
+sp_cleanup.pull_up_assignment=false
+sp_cleanup.push_down_negation=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.reduce_indentation=false
+sp_cleanup.redundant_comparator=false
+sp_cleanup.redundant_falling_through_block_end=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_array_creation=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_method_parameters=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.return_expression=false
+sp_cleanup.simplify_lambda_expression_and_method_ref=false
+sp_cleanup.single_used_field=false
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.standard_comparison=false
+sp_cleanup.static_inner_class=false
+sp_cleanup.strictly_equal_or_different=false
+sp_cleanup.stringbuffer_to_stringbuilder=false
+sp_cleanup.stringbuilder=false
+sp_cleanup.stringbuilder_for_local_vars=false
+sp_cleanup.stringconcat_to_textblock=false
+sp_cleanup.substring=false
+sp_cleanup.switch=false
+sp_cleanup.system_property=false
+sp_cleanup.system_property_boolean=false
+sp_cleanup.system_property_file_encoding=false
+sp_cleanup.system_property_file_separator=false
+sp_cleanup.system_property_line_separator=false
+sp_cleanup.system_property_path_separator=false
+sp_cleanup.ternary_operator=false
+sp_cleanup.try_with_resource=false
+sp_cleanup.unlooped_while=false
+sp_cleanup.unreachable_block=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_autoboxing=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_directly_map_method=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_string_is_blank=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=false
+sp_cleanup.use_unboxing=false
+sp_cleanup.use_var=false
+sp_cleanup.useless_continue=false
+sp_cleanup.useless_return=false
+sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.m2e.core.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 00000000000..96b30f9805c
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=pom.xml
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.springframework.ide.eclipse.boot.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.springframework.ide.eclipse.boot.prefs
new file mode 100644
index 00000000000..b5811b137d0
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.springframework.ide.eclipse.boot.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+spring.boot.launch.profile.history=dev;
diff --git a/packages/starters/backend/sirius-components-flow-starter/.settings/org.springframework.ide.eclipse.prefs b/packages/starters/backend/sirius-components-flow-starter/.settings/org.springframework.ide.eclipse.prefs
new file mode 100644
index 00000000000..a12794d68f2
--- /dev/null
+++ b/packages/starters/backend/sirius-components-flow-starter/.settings/org.springframework.ide.eclipse.prefs
@@ -0,0 +1,2 @@
+boot.validation.initialized=true
+eclipse.preferences.version=1
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..920e8f19b46
--- /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,84 @@
+/*******************************************************************************
+ * 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 fr.obeo.dsl.designer.sample.flow.FlowPackage;
+
+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() == FlowPackage.Literals.COMPOSITE_PROCESSOR) {
+ 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..4e4dc3db501
--- /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,122 @@
+/*******************************************************************************
+ * 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 {
+
+ public static final String ANTENNA_SVG_ID = "594ba1cf-6e77-311b-a2ab-660c5eabf015";
+ public static final String CAMERA_SVG_ID = "ae1a67e3-d455-3198-9f35-372ef2a3006d";
+ public static final String RADAR_SVG_ID = "a6e0845d-971f-33c7-ae25-6ac4f47056dc";
+ public static final String SENSOR_SVG_ID = "6c07834a-5ff6-3819-8326-0614d3dcd674";
+ public static final String FAN_SVG_ID = "9019f843-5511-3318-8f89-0e50994c98e8";
+ public static final String ENGINE_HIGH_SVG_ID = "0449ce13-3eed-3426-a9f7-d1f68c8a2b8f";
+ public static final String ENGINE_LOW_SVG_ID = "b0617610-43e0-3636-b7eb-c77aec046f5f";
+ public static final String ENGINE_OVER_SVG_ID = "a960705f-dab1-3dbb-b1e4-ce8d71b51317";
+ public static final String ENGINE_STANDARD_SVG_ID = "716d8b5c-015b-3591-984c-d5ed5ee80353";
+ public static final String ENGINE_UNUSED_SVG_ID = "91feeafe-b539-3d85-a6f3-27e8aa4049de";
+ public static final String DSP_HIGH_SVG_ID = "aed8c38e-1af1-3158-a100-dfb866c8ee41";
+ public static final String DSP_LOW_SVG_ID = "c225260a-3b75-3ae6-b88c-037d675553e6";
+ public static final String DSP_OVER_SVG_ID = "7b8fe180-0203-345f-a32a-ae6c86c1d1f8";
+ public static final String DSP_STANDARD_SVG_ID = "6072ed0b-5df2-3348-ad88-90c9d0fbb3ca";
+ public static final String DSP_UNUSED_SVG_ID = "6e63d73e-4005-3bcb-aab5-ad85dcd01881";
+ public static final String CPU_HIGH_SVG_ID = "20494133-0e68-3bd6-b2fe-c83cb4241085";
+ public static final String CPU_LOW_SVG_ID = "5a705cd6-82cc-30f5-b5c8-26fbc9fae8e8";
+ public static final String CPU_OVER_SVG_ID = "499082ab-cf8e-37c8-9c06-52ce8cce6746";
+ public static final String CPU_STANDARD_SVG_ID = "7f7de740-1ad1-3060-ba8a-3d7f31e885f7";
+ public static final String CPU_UNUSED_SVG_ID = "fe439901-ad7a-3baa-b3b7-44c6cd53afcb";
+
+ 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..51dd466fd91
--- /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,104 @@
+/*******************************************************************************
+ * 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 static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.ANTENNA_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.CAMERA_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.RADAR_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.SENSOR_SVG_ID;
+
+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(SENSOR_SVG_ID, this.colorProvider))
+ .synchronizationPolicy(this.synchronizationPolicy)
+ .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle()
+ .condition("aql:self.name.contains('Camera')")
+ .style(this.flowViewBuilder.createImageNodeStyleDescription(CAMERA_SVG_ID, this.colorProvider))
+ .build())
+ .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle()
+ .condition("aql:self.name.contains('Radar')")
+ .style(this.flowViewBuilder.createImageNodeStyleDescription(RADAR_SVG_ID, this.colorProvider))
+ .build())
+ .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle()
+ .condition("aql:self.name.contains('Wifi')")
+ .style(this.flowViewBuilder.createImageNodeStyleDescription(ANTENNA_SVG_ID, 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..02d72d74e80
--- /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,85 @@
+/*******************************************************************************
+ * 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 static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.FAN_SVG_ID;
+
+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(FAN_SVG_ID, 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..7540fb3a321
--- /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,159 @@
+/*******************************************************************************
+ * 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 static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.CPU_HIGH_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.CPU_LOW_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.CPU_OVER_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.CPU_STANDARD_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.CPU_UNUSED_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.DSP_HIGH_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.DSP_LOW_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.DSP_OVER_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.DSP_STANDARD_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.DSP_UNUSED_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.ENGINE_HIGH_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.ENGINE_LOW_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.ENGINE_OVER_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.ENGINE_STANDARD_SVG_ID;
+import static org.eclipse.sirius.components.flow.starter.view.FlowViewBuilder.ENGINE_UNUSED_SVG_ID;
+
+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(CPU_UNUSED_SVG_ID, 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(ENGINE_UNUSED_SVG_ID, 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(ENGINE_LOW_SVG_ID, 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(ENGINE_STANDARD_SVG_ID, 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(ENGINE_HIGH_SVG_ID, 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(ENGINE_OVER_SVG_ID, 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(DSP_UNUSED_SVG_ID, 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(DSP_LOW_SVG_ID, 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(DSP_STANDARD_SVG_ID, 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(DSP_HIGH_SVG_ID, 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(DSP_OVER_SVG_ID, 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(CPU_UNUSED_SVG_ID, 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(CPU_LOW_SVG_ID, 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(CPU_STANDARD_SVG_ID, 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(CPU_HIGH_SVG_ID, 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(CPU_OVER_SVG_ID, 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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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 @@
+
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();
+ }
+}