diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 54f26bbd560..e5b714196d2 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -6,12 +6,19 @@ - Filter tree based representations - Add pages to form in the view DSL +- Simplify the programmatic creation of view models +- Add the ability to convert an odesign to a view model +- Provide a view-based version of Flow +- Add support for the features of the compatibility layer not supported in the view DSL +- Add an example showing how to contribute to the details view with the View DSL === Architectural decision records +- [ADR-098] Use the editing context to compute the metamodels + === Breaking changes -- https://github.com/eclipse-sirius/sirius-components/issues/1897[1897] [diagram] ToolSection are not using records +- https://github.com/eclipse-sirius/sirius-components/issues/1897[1897] [diagram] ToolSection are now using records - https://github.com/eclipse-sirius/sirius-components/issues/1616[#1616] [core] Use Java records for all our payloads - https://github.com/eclipse-sirius/sirius-components/issues/1848[#1848] [project] Remove the frontend dependency to `uuid` in favor of `crypto.randomUUID` - https://github.com/eclipse-sirius/sirius-components/issues/1907[#1907] [view] The management of colors is changing, it is not possible anymore to use color directly represented by a string in the _styleDescription_. @@ -34,6 +41,11 @@ In the _styleDescription_, the definition of a color are now a select list of al === New Features +- https://github.com/eclipse-sirius/sirius-components/issues/1883[#1883] [sirius-web] Add the possibility to programmatically set some metadate such as specifics natures to a project. +These natures can be used later to enable or not some capabilities on a project. +This work will start by adding the ability to filter the project's domains. +A large set of features will have to be updated in order to stop considering the list of metamodels available in an editing context as a certainty. + === Improvements - https://github.com/eclipse-sirius/sirius-components/issues/1869[#1869] [tree] Navigate to the first child with the right arrow if a node is expanded. diff --git a/doc/adrs/098_use_the_editing_context_to_compute_the_metamodels.adoc b/doc/adrs/098_use_the_editing_context_to_compute_the_metamodels.adoc new file mode 100644 index 00000000000..af45176c972 --- /dev/null +++ b/doc/adrs/098_use_the_editing_context_to_compute_the_metamodels.adoc @@ -0,0 +1,28 @@ += ADR-098 - Use the editing context to compute the metamodels + +== Context + +Up until now, in Sirius Web, the metamodels available for an editing context were a mix of global metamodels available all the time and the domains converted when the editing context was loaded. + +There are no specific features related to the metamodels converted from a domain. +Only the global metamodels have some dedicated features such as the creation of dedicated resources (robot flow, domain and view sample etc) + +If we ever want to consider specific features for any metamodel, we should embrace the fact that, all the editing contexts do not have the same metamodels. + +== Decision + +In Sirius Web, we will only use the `EPackage.Registry` of the editing context in order to find the available metamodels. +Sirius Components will stop considering a set of global EPackages as special and available everywhere. + +In order to force ourselves to properly consider the impact of this use case, some metadata will be added to Sirius Web projects. +We will only keep a list of natures in these project metadata for now. +A nature will be defined as an identifier. + +We will introduce the nature `siriusWeb://nature?kind=studio` in order to identify Sirius Web projects created using the studio template. + +Those projects will be the only one with all metamodels, view and domain included. +No other project should be able to create domains or views. + +== Status + +Accepted diff --git a/doc/iterations/2023.6/shapes/add_missing_features_in_the_view_support.adoc b/doc/iterations/2023.6/shapes/add_missing_features_in_the_view_support.adoc new file mode 100644 index 00000000000..18b56dba500 --- /dev/null +++ b/doc/iterations/2023.6/shapes/add_missing_features_in_the_view_support.adoc @@ -0,0 +1,34 @@ += (M) Add support for the features of the compatibility layer not supported in the view DSL + +== Problem + +Some odesign concepts are not implemented in View (like selection dialogs or icons support). + +== Key Result + +Each new feature works and can be used by the end user, the new flow version is updated to use those features, integration tests of those features are available + +== Solution + +For each concepts we should provide an adrs that will explain the solution if more details. + +We should also provide some mock ui in these adrs. + +=== Scenario + +An user will be able to use the newly implemented concept that was available in odesign models in updated views. + +=== Breadboarding + +Futurs ui changes will be discussed in their respective adrs. + +=== Cutting backs + +Some concepts may be challenging to implement. We will discuss it further in specific adrs. + +== Rabbit holes + +Some concepts may be challenging to implement. We will discuss it further in specific adrs. + +== No-gos + diff --git a/doc/iterations/2023.6/shapes/odesign_to_view_converter_api.adoc b/doc/iterations/2023.6/shapes/odesign_to_view_converter_api.adoc new file mode 100644 index 00000000000..0786d179b5c --- /dev/null +++ b/doc/iterations/2023.6/shapes/odesign_to_view_converter_api.adoc @@ -0,0 +1,48 @@ += (M) Add the ability to convert an odesign to a view model + +== Problem + +We can create representations descriptions programmatically, with the view model and with the compatibility layer that converts to odesign files in representation descriptions. +It will be more efficient to concentrate our efforts in the creation of representation description programmatically and with the view model. +As such the odesign will be converted to a view. +Using plain old Java code, we should be able to transform an odesign model into a view model while converting the diagram and form descriptions. + +== Key Result + +A first version of flow, simplified, is available (potentially behind a flag), integration tests are available to validate the result. + +== Solution + +This code should be provided in a dedicated project named `sirius-components-odesign-converter`. + +``` +package org.eclipse.sirius.components.odesign.converter; + +import org.eclipse.sirius.viewpoint.description.Group; +import org.eclipse.sirius.components.view.View; + +public interface IOdesignConverter { + Optional convert(Group group); +} +``` + +The implementation will use an iterative transformation approach meaning that the API should be decomposed in smaller APIS that convert specific entities and that it should be possible to add more entities to be converted in the future. +The implementation will use the the soon to be introduced view creation API. + +=== Scenario + +A user will be able to use the new interface IOdesignConverter to convert an odesign file to a view model. + +=== Breadboarding + +No ui changes + +=== Cutting backs + +We will be able to support more concepts of the odesign model in the view model in a near future + +== Rabbit holes + +== No-gos + + diff --git a/doc/iterations/2023.6/shapes/provide_a_view_based_version_of_flow.adoc b/doc/iterations/2023.6/shapes/provide_a_view_based_version_of_flow.adoc new file mode 100644 index 00000000000..023900a95e2 --- /dev/null +++ b/doc/iterations/2023.6/shapes/provide_a_view_based_version_of_flow.adoc @@ -0,0 +1,38 @@ += (M) Provide a view-based version of Flow + +== Problem + +In order to include a test which covers the odesign to view transformation, we will migrate the existing flow model. + +== Key Result + +The new view-based version of flow is fully equivalent to the previous odesign based version, all integrations tests of the odesign version of flow are working on the new version + +== Solution + +We will use the same maven package flow's dependencies. +We will offer an interface that if implemented will convert the odesign from their path to Views. + +=== Scenario + +The end user will open Sirius Web and not see any single change at all. + +Everything will work as before including our Cypress integration tests. + +=== Breadboarding + +no ui changes + +=== Cutting backs + +Some concepts might not be available in the first implementation of the odesign converter. +They will be added back progressively + +== Rabbit holes + +== No-gos + + + + + diff --git a/doc/iterations/2023.6/shapes/simplify_the_programmatic_creation_of_view_models.adoc b/doc/iterations/2023.6/shapes/simplify_the_programmatic_creation_of_view_models.adoc new file mode 100644 index 00000000000..989234d4790 --- /dev/null +++ b/doc/iterations/2023.6/shapes/simplify_the_programmatic_creation_of_view_models.adoc @@ -0,0 +1,49 @@ += (L) Simplify the programmatic creation of view models + +== Problem + +We can create representations descriptions programmatically, with the view model and with the compatibility layer that converts odesign files in representation descriptions. +Another use case is to create view models programmatically but we don't have an API to create complex models easily. + + +== Key Result + +The Papaya View will be created with this new API and offer the same functionalities than before this implementation. +All the tests will still work. + + +== Solution + +In a project `sirius-components-view-builder`, depending only on `sirius-components-view`, we should provide utility classes to help the creation of view based models. +We will need to synthesize how other applications using Sirius Web implements some parts of the future API. +The detailed ADR will gather some feedback first. + + +=== Scenario + +Some features that the API will offer are : + +* Helpers for creating diagrams, nodes and edges +* Helpers for creating element's style and conditional style +* Helpers for creating unsynchronized nodes (including unsynchronized children or recursively with reused node description) +* Easy access to previously declared elements to use them as reference to other elements (for example an edge description will need some node description) +* Helpers for creating tools (node & edge creation, delete, direct edit, drag & drop, simple or complex tools) +* Helpers for creating and reusing AQL expressions that will be used in previous scenarios. + + +=== Breadboarding + +no ui changes + +=== Cutting backs + +The AQL expressions API could be reused for scenarios other than diagram, tool, node and edge creation. + +As such, it will probably need specific ADR and might be too large to implement completely in this scope. + +== Rabbit holes + +== No-gos + +The API will not generate a complete diagram description from a metamodel, we want to explicitly control what's created. + diff --git a/doc/iterations/2023.6/shapes/view-based_details_view.adoc b/doc/iterations/2023.6/shapes/view-based_details_view.adoc new file mode 100644 index 00000000000..ed24f545ff8 --- /dev/null +++ b/doc/iterations/2023.6/shapes/view-based_details_view.adoc @@ -0,0 +1,62 @@ += (S) Add an example showing how to contribute to the details view with the View DSL + +== Problem + +The default rules used for the _Details_ view provide a good generic solution, but in practice applications often need more specific details views for (some of) their elements. + +It is possible override these default rules by providing more specific custom `FormDescription` which apply to specific elements using the `IPropertiesDescriptionRegistryConfigurer` API. +Indeed, we already use this capability ourselves in `NodeStylePropertiesConfigurer`. +However this is not documented, and relatively cumbersome as it requires creating a fully programmatic `FormDescription` instance. + +We already support the definition of _Forms_ using the View DSL, which providers nicer APIs for this. +We should provide an end-to-end example showing how to use a View-based Form definition to customize the _Details_ view for specific elements. + +== Key Result + +A studio maker who wants to provide custom _Details_ view for some types will find a clear documented path to do it by leveraging the View DSL to define the contents of the _Details_ views in question. + +== Solution + +We will rewrite the `NodeStylePropertiesConfigurer` to create its `FormDescription` as View-based Forms which are converted at startup into a programmatic `FormDescription` instance. + +We will organize its implementation to clearly separate the *definition* of the various View-based forms (which will be different in every use case) from their *conversion* and *registration* (which will be the same "glue code" in most/all cases). + +The definition part is specific to this case, while the conversion and registration parts are generic and will be lifted into reusable and documented helpers. + +=== Scenario + +A studio maker who wants to provide custom Details view for some types will then need to: + +1. Write a Java class which builds a View-based Form using the EMF API for the View DSL (maybe with some simple helpers). +2. If the AQL expressions used by this Form need them, write the AQL Service classes needed. +3. Define a Spring `@Component` which extends `IPropertiesDescriptionRegistryConfigurer` and in its `addPropertiesDescriptions` method uses a helper (that we will provide) to convert the result of the two steps above into a fully functional API-base `FormDescriptionEditor`. + +=== Breadboarding + +No UI changes. + +=== Cutting backs + +Allow the definition of these "details view" from a `.view` resource loaded on startup, which could have been designed graphically using the FormDescriptionEditor. +The workflow would be: + +1. Design a Form visually using the FormDescriptionEditor. +2. Test it at runtime as an actual Form representation. +3. Once satisfied, download the _Form_ as a local file, put it in the `src/main/resources` folder of the application as a `.view` model. +4. Follow the same steps as in the scenario above, except that instead of creating the View model using plain Java and EMF, it is loaded "fully formed" from the file. + +Note that this scenario is more "user friendly" but less powerful as it does not allow the use of custom Java services in the definition of the Form. +Or more precisely it allow their use (AQL expressions are just strings) but features which use them can not be tested. + +== Rabbit holes + +- NodeStylePropertiesConfigurer uses various advanced techniques (for example to support images and their previous) which may or may not translate easily in View-based Forms. +In particular the AQL expressions used by the Forms will need to depend on Java services to be extracted and provided to the converter. + +- Building a high-level API on top of the EMF-based one to ease the creation of these View-based FormDescriptions. +We may extract some helpers here and there, but the goal is not to try and design a nicer API for this. +This may come later after https://github.com/eclipse-sirius/sirius-components/issues/1921 has done something like this for View-based diagrams. + +== No-gos + +It is not in the scope of this shape to register a FormDescription defined *in a studio* as the one to be used for the _Details_ view of elements for a given domain. diff --git a/integration-tests/cypress/e2e/project/edit/document-context-menu.cy.js b/integration-tests/cypress/e2e/project/edit/document-context-menu.cy.js index 85dc80f7f2a..6cbfd4972e3 100644 --- a/integration-tests/cypress/e2e/project/edit/document-context-menu.cy.js +++ b/integration-tests/cypress/e2e/project/edit/document-context-menu.cy.js @@ -38,7 +38,7 @@ describe('/projects/:projectId/edit - Document Context Menu', () => { cy.getByTestId('create-object').click(); - cy.getByTestId('explorerTree').contains('Domain'); + cy.getByTestId('explorerTree').contains('System'); }); //fails during build @@ -49,8 +49,8 @@ describe('/projects/:projectId/edit - Document Context Menu', () => { cy.getByTestId('create-object').click(); - cy.getByTestId('explorerTree').contains('Domain'); - cy.getByTestId('selected').contains('Domain'); + cy.getByTestId('explorerTree').contains('System'); + cy.getByTestId('selected').contains('System'); }); it('can delete a document', () => { diff --git a/integration-tests/cypress/e2e/project/edit/explorer.cy.js b/integration-tests/cypress/e2e/project/edit/explorer.cy.js index 121d53ae188..8f35ffb2a4f 100644 --- a/integration-tests/cypress/e2e/project/edit/explorer.cy.js +++ b/integration-tests/cypress/e2e/project/edit/explorer.cy.js @@ -161,7 +161,7 @@ describe('/projects/:projectId/edit - Explorer', () => { it('documents are alphabetically ordered (case insensitive order)', () => { // Create Flow Model - cy.getByTestId('08e5c635-7d98-37e9-847c-df286e3b2f16').click(); + cy.getByTestId('empty_flow').click(); // Check documents order cy.getByTestId('tree-root-elements').children().first().contains('Flow').should('exist'); cy.getByTestId('tree-root-elements').children().last().contains('robot').should('exist'); diff --git a/integration-tests/cypress/e2e/project/edit/formdescriptioneditor.cy.js b/integration-tests/cypress/e2e/project/edit/formdescriptioneditor.cy.js index 3d5f9f6b674..06d91a177e7 100644 --- a/integration-tests/cypress/e2e/project/edit/formdescriptioneditor.cy.js +++ b/integration-tests/cypress/e2e/project/edit/formdescriptioneditor.cy.js @@ -13,8 +13,8 @@ describe('/projects/:projectId/edit - FormDescriptionEditor', () => { beforeEach(() => { cy.deleteAllProjects(); - cy.createProject('Cypress Project').then((res) => { - const projectId = res.body.data.createProject.project.id; + cy.createProjectFromTemplate('studio-template').then((res) => { + const projectId = res.body.data.createProjectFromTemplate.project.id; const view_document_id = 'ea57f74d-bc7b-3a7a-81e0-8aef4ee85770'; cy.createDocument(projectId, view_document_id, 'ViewDocument').then(() => { cy.visit(`/projects/${projectId}/edit`); diff --git a/integration-tests/cypress/e2e/project/edit/onboarding.cy.js b/integration-tests/cypress/e2e/project/edit/onboarding.cy.js index c80c94b4690..2848aa6dc2b 100644 --- a/integration-tests/cypress/e2e/project/edit/onboarding.cy.js +++ b/integration-tests/cypress/e2e/project/edit/onboarding.cy.js @@ -20,9 +20,8 @@ describe('/projects/:projectId/edit - Onboarding', () => { }); }); - it('Create a new model', () => { - const empty_flow_id = '08e5c635-7d98-37e9-847c-df286e3b2f16'; - cy.getByTestId(empty_flow_id).click(); + it('Create a new model', () => { + cy.getByTestId('empty_flow').click(); cy.getByTestId('explorerTree').contains('Flow'); }); }); diff --git a/integration-tests/cypress/e2e/project/edit/studio.cy.js b/integration-tests/cypress/e2e/project/edit/studio.cy.js index 7a1391a20b2..8899835e785 100644 --- a/integration-tests/cypress/e2e/project/edit/studio.cy.js +++ b/integration-tests/cypress/e2e/project/edit/studio.cy.js @@ -37,4 +37,12 @@ describe('/projects/:projectId/edit - Studio', () => { .then((value) => expect(value).to.match(/translate\(.*, .*\) translate\(.*, .*\)/)); }); }); + + it('Check the new object domain list', () => { + cy.getByTestId('DomainNewModel-more').click(); + cy.getByTestId('new-object').click(); + cy.getByTestId('domain').click().get('[data-value="http://www.eclipse.org/sirius-web/domain"]').should('exist'); + cy.getByTestId('domain').get('[data-value="http://www.eclipse.org/sirius-web/view"]').should('exist'); + cy.getByTestId('domain').get('[data-value="http://www.obeo.fr/dsl/designer/sample/flow"]').should('exist'); + }); }); diff --git a/packages/charts/backend/sirius-components-charts/.settings/org.eclipse.jdt.ui.prefs b/packages/charts/backend/sirius-components-charts/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/charts/backend/sirius-components-charts/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/charts/backend/sirius-components-charts/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/charts/backend/sirius-components-collaborative-charts/.settings/org.eclipse.jdt.ui.prefs b/packages/charts/backend/sirius-components-collaborative-charts/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/charts/backend/sirius-components-collaborative-charts/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/charts/backend/sirius-components-collaborative-charts/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/compatibility/backend/sirius-components-compatibility-emf/.settings/org.eclipse.jdt.ui.prefs b/packages/compatibility/backend/sirius-components-compatibility-emf/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/compatibility/backend/sirius-components-compatibility-emf/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/compatibility/backend/sirius-components-compatibility-emf/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/compatibility/backend/sirius-components-compatibility/.settings/org.eclipse.jdt.ui.prefs b/packages/compatibility/backend/sirius-components-compatibility/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/compatibility/backend/sirius-components-compatibility/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/compatibility/backend/sirius-components-compatibility/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/core/backend/sirius-components-annotations-spring/.settings/org.eclipse.jdt.ui.prefs b/packages/core/backend/sirius-components-annotations-spring/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/core/backend/sirius-components-annotations-spring/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/core/backend/sirius-components-annotations-spring/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/core/backend/sirius-components-annotations/.settings/org.eclipse.jdt.ui.prefs b/packages/core/backend/sirius-components-annotations/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/core/backend/sirius-components-annotations/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/core/backend/sirius-components-annotations/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/core/backend/sirius-components-collaborative/.settings/org.eclipse.jdt.ui.prefs b/packages/core/backend/sirius-components-collaborative/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/core/backend/sirius-components-collaborative/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/core/backend/sirius-components-collaborative/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextChildObjectCreationDescriptionsInput.java b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextChildObjectCreationDescriptionsInput.java new file mode 100644 index 00000000000..09fe8944242 --- /dev/null +++ b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextChildObjectCreationDescriptionsInput.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.dto; + +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IInput; + +/** + * The input object for the query field childCreationDescriptions. + * + * @author frouene + */ +public record EditingContextChildObjectCreationDescriptionsInput(UUID id, String editingContextId, String kindArgument) implements IInput { +} diff --git a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextChildObjectCreationDescriptionsPayload.java b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextChildObjectCreationDescriptionsPayload.java new file mode 100644 index 00000000000..1a178685a51 --- /dev/null +++ b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextChildObjectCreationDescriptionsPayload.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.dto; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IPayload; + +/** + * The payload object for the query field childCreationDescriptions. + * + * @author frouene + */ +public record EditingContextChildObjectCreationDescriptionsPayload(UUID id, List childCreationDescriptions) implements IPayload { + + public EditingContextChildObjectCreationDescriptionsPayload { + Objects.requireNonNull(id); + Objects.requireNonNull(childCreationDescriptions); + } +} diff --git a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextDomainsInput.java b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextDomainsInput.java new file mode 100644 index 00000000000..4ecf133653a --- /dev/null +++ b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextDomainsInput.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.dto; + +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IInput; + +/** + * The input object for the query field domains. + * + * @author frouene + */ +public record EditingContextDomainsInput(UUID id, String editingContextId) implements IInput { +} diff --git a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextDomainsPayload.java b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextDomainsPayload.java new file mode 100644 index 00000000000..fd4f5f02b4f --- /dev/null +++ b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextDomainsPayload.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.dto; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.Domain; +import org.eclipse.sirius.components.core.api.IPayload; + +/** + * The payload object for the query field domains. + * + * @author frouene + */ +public record EditingContextDomainsPayload(UUID id, List domains) implements IPayload { + + public EditingContextDomainsPayload { + Objects.requireNonNull(id); + Objects.requireNonNull(domains); + } +} diff --git a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextRootObjectCreationDescriptionsInput.java b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextRootObjectCreationDescriptionsInput.java new file mode 100644 index 00000000000..d1cec667cb1 --- /dev/null +++ b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextRootObjectCreationDescriptionsInput.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.dto; + +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IInput; + +/** + * The input object for the query field rootObjectCreationDescriptions. + * + * @author frouene + */ +public record EditingContextRootObjectCreationDescriptionsInput(UUID id, String editingContextId, String domainId, Boolean suggested) implements IInput { +} diff --git a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextRootObjectCreationDescriptionsPayload.java b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextRootObjectCreationDescriptionsPayload.java new file mode 100644 index 00000000000..27c1a325d1d --- /dev/null +++ b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextRootObjectCreationDescriptionsPayload.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.dto; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IPayload; + +/** + * The payload object for the query field rootObjectCreationDescriptions. + * + * @author frouene + */ +public record EditingContextRootObjectCreationDescriptionsPayload(UUID id, List childCreationDescriptions) implements IPayload { + + public EditingContextRootObjectCreationDescriptionsPayload { + Objects.requireNonNull(id); + Objects.requireNonNull(childCreationDescriptions); + } +} diff --git a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/GetEditingContextActionsEventHandler.java b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/GetEditingContextActionsEventHandler.java index 4d86c3df7f3..dbd1014ad4e 100644 --- a/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/GetEditingContextActionsEventHandler.java +++ b/packages/core/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/GetEditingContextActionsEventHandler.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.sirius.components.collaborative.handlers; +import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -72,13 +73,12 @@ public void handle(One payloadSink, Many changeDesc IPayload payload = new ErrorPayload(input.id(), message); ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, editingContext.getId(), input); - if (input instanceof GetEditingContextActionsInput) { - GetEditingContextActionsInput editingContextActionsInput = (GetEditingContextActionsInput) input; + if (input instanceof GetEditingContextActionsInput editingContextActionsInput) { // @formatter:off List editingContextActions = this.editingContextActionProviders.stream() .flatMap(provider -> provider.getEditingContextAction(editingContext).stream()) - .sorted((a1, a2) -> a1.getLabel().compareTo(a2.getLabel())) + .sorted(Comparator.comparing(EditingContextAction::getLabel)) .toList(); // @formatter:on diff --git a/packages/core/backend/sirius-components-core/.settings/org.eclipse.jdt.ui.prefs b/packages/core/backend/sirius-components-core/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/core/backend/sirius-components-core/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/core/backend/sirius-components-core/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IDomainSearchService.java b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IDomainSearchService.java new file mode 100644 index 00000000000..de2d27e8fdc --- /dev/null +++ b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IDomainSearchService.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2023 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.core.api; + +import java.util.List; + +/** + * Used to find domains. + * + * @author frouene + */ +public interface IDomainSearchService { + List findAllByEditingContext(IEditingContext editingContext); +} diff --git a/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IEditService.java b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IEditService.java index 6ae4665a648..c93c7efa880 100644 --- a/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IEditService.java +++ b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IEditService.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2021 Obeo. + * Copyright (c) 2019, 2023 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 @@ -23,11 +23,9 @@ */ public interface IEditService { - List getDomains(String editingContextId); + List getRootCreationDescriptions(IEditingContext editingContext, String domainId, boolean suggested); - List getRootCreationDescriptions(String editingContextId, String domainId, boolean suggested); - - List getChildCreationDescriptions(String editingContextId, String kind); + List getChildCreationDescriptions(IEditingContext editingContext, String kind); Optional createChild(IEditingContext editingContext, Object object, String childCreationDescriptionId); @@ -45,17 +43,12 @@ public interface IEditService { class NoOp implements IEditService { @Override - public List getDomains(String editingContextId) { - return List.of(); - } - - @Override - public List getRootCreationDescriptions(String editingContextId, String domainId, boolean suggested) { + public List getRootCreationDescriptions(IEditingContext editingContext, String domainId, boolean suggested) { return List.of(); } @Override - public List getChildCreationDescriptions(String editingContextId, String classId) { + public List getChildCreationDescriptions(IEditingContext editingContext, String classId) { return List.of(); } diff --git a/packages/core/backend/sirius-components-graphql-api/.settings/org.eclipse.jdt.ui.prefs b/packages/core/backend/sirius-components-graphql-api/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/core/backend/sirius-components-graphql-api/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/core/backend/sirius-components-graphql-api/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/core/backend/sirius-components-representations/.settings/org.eclipse.jdt.ui.prefs b/packages/core/backend/sirius-components-representations/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/core/backend/sirius-components-representations/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/core/backend/sirius-components-representations/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/.settings/org.eclipse.jdt.ui.prefs b/packages/diagrams/backend/sirius-components-collaborative-diagrams/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/diagrams/backend/sirius-components-collaborative-diagrams/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/diagrams/backend/sirius-components-diagrams-graphql/.settings/org.eclipse.jdt.ui.prefs b/packages/diagrams/backend/sirius-components-diagrams-graphql/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/diagrams/backend/sirius-components-diagrams-graphql/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/diagrams/backend/sirius-components-diagrams-graphql/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/diagrams/backend/sirius-components-diagrams-layout-api/.settings/org.eclipse.jdt.ui.prefs b/packages/diagrams/backend/sirius-components-diagrams-layout-api/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/diagrams/backend/sirius-components-diagrams-layout-api/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/diagrams/backend/sirius-components-diagrams-layout-api/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/diagrams/backend/sirius-components-diagrams-layout/.settings/org.eclipse.jdt.ui.prefs b/packages/diagrams/backend/sirius-components-diagrams-layout/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/diagrams/backend/sirius-components-diagrams-layout/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/diagrams/backend/sirius-components-diagrams-layout/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/diagrams/backend/sirius-components-diagrams-tests/.settings/org.eclipse.jdt.ui.prefs b/packages/diagrams/backend/sirius-components-diagrams-tests/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/diagrams/backend/sirius-components-diagrams-tests/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/diagrams/backend/sirius-components-diagrams-tests/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/diagrams/backend/sirius-components-diagrams/.settings/org.eclipse.jdt.ui.prefs b/packages/diagrams/backend/sirius-components-diagrams/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/diagrams/backend/sirius-components-diagrams/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/diagrams/backend/sirius-components-diagrams/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/domain/backend/sirius-components-domain-design/.settings/org.eclipse.jdt.ui.prefs b/packages/domain/backend/sirius-components-domain-design/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/domain/backend/sirius-components-domain-design/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/domain/backend/sirius-components-domain-design/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/domain/backend/sirius-components-domain-edit/.settings/org.eclipse.jdt.ui.prefs b/packages/domain/backend/sirius-components-domain-edit/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/domain/backend/sirius-components-domain-edit/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/domain/backend/sirius-components-domain-edit/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/domain/backend/sirius-components-domain-emf/.settings/org.eclipse.jdt.ui.prefs b/packages/domain/backend/sirius-components-domain-emf/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/domain/backend/sirius-components-domain-emf/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/domain/backend/sirius-components-domain-emf/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/domain/backend/sirius-components-domain/.settings/org.eclipse.jdt.ui.prefs b/packages/domain/backend/sirius-components-domain/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/domain/backend/sirius-components-domain/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/domain/backend/sirius-components-domain/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/emf/backend/sirius-components-emf/.settings/org.eclipse.jdt.ui.prefs b/packages/emf/backend/sirius-components-emf/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/emf/backend/sirius-components-emf/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/emf/backend/sirius-components-emf/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextChildObjectCreationDescriptionsEventHandler.java b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextChildObjectCreationDescriptionsEventHandler.java new file mode 100644 index 00000000000..e15d35a08df --- /dev/null +++ b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextChildObjectCreationDescriptionsEventHandler.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2023 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.emf.handlers; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventHandler; +import org.eclipse.sirius.components.collaborative.dto.EditingContextChildObjectCreationDescriptionsInput; +import org.eclipse.sirius.components.collaborative.dto.EditingContextChildObjectCreationDescriptionsPayload; +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IEditService; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.core.api.IPayload; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Sinks; + +/** + * Event handler to find/compute all the child object accessible from a given editing context. + * + * @author frouene + */ +@Service +public class EditingContextChildObjectCreationDescriptionsEventHandler implements IEditingContextEventHandler { + + private final IEditService editService; + + public EditingContextChildObjectCreationDescriptionsEventHandler(IEditService editService) { + this.editService = Objects.requireNonNull(editService); + } + + @Override + public boolean canHandle(IEditingContext editingContext, IInput input) { + return input instanceof EditingContextChildObjectCreationDescriptionsInput; + } + + @Override + public void handle(Sinks.One payloadSink, Sinks.Many changeDescriptionSink, IEditingContext editingContext, IInput input) { + List childCreationDescriptions = List.of(); + if (input instanceof EditingContextChildObjectCreationDescriptionsInput editingContextChildObjectCreationDescriptionsInput) { + childCreationDescriptions = editService.getChildCreationDescriptions(editingContext, editingContextChildObjectCreationDescriptionsInput.kindArgument()); + } + payloadSink.tryEmitValue(new EditingContextChildObjectCreationDescriptionsPayload(input.id(), childCreationDescriptions)); + } +} diff --git a/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextDomainsEventHandler.java b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextDomainsEventHandler.java new file mode 100644 index 00000000000..dded218f92d --- /dev/null +++ b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextDomainsEventHandler.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2023 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.emf.handlers; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventHandler; +import org.eclipse.sirius.components.collaborative.dto.EditingContextDomainsInput; +import org.eclipse.sirius.components.collaborative.dto.EditingContextDomainsPayload; +import org.eclipse.sirius.components.core.api.Domain; +import org.eclipse.sirius.components.core.api.IDomainSearchService; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.core.api.IPayload; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Sinks; + +import java.util.List; +import java.util.Objects; + +/** + * Event handler to find/compute all the domains accessible from a given editing context. + * + * @author frouene + */ +@Service +public class EditingContextDomainsEventHandler implements IEditingContextEventHandler { + + private final IDomainSearchService domainSearchService; + + public EditingContextDomainsEventHandler(IDomainSearchService domainSearchService) { + this.domainSearchService = Objects.requireNonNull(domainSearchService); + } + + @Override + public boolean canHandle(IEditingContext editingContext, IInput input) { + return input instanceof EditingContextDomainsInput; + } + + @Override + public void handle(Sinks.One payloadSink, Sinks.Many changeDescriptionSink, IEditingContext editingContext, IInput input) { + List domains = List.of(); + if (input instanceof EditingContextDomainsInput) { + domains = domainSearchService.findAllByEditingContext(editingContext); + } + payloadSink.tryEmitValue(new EditingContextDomainsPayload(input.id(), domains)); + } +} diff --git a/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextRootObjectCreationDescriptionsEventHandler.java b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextRootObjectCreationDescriptionsEventHandler.java new file mode 100644 index 00000000000..2352ae51a96 --- /dev/null +++ b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/handlers/EditingContextRootObjectCreationDescriptionsEventHandler.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2023 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.emf.handlers; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventHandler; +import org.eclipse.sirius.components.collaborative.dto.EditingContextRootObjectCreationDescriptionsInput; +import org.eclipse.sirius.components.collaborative.dto.EditingContextRootObjectCreationDescriptionsPayload; +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IEditService; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.core.api.IPayload; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Sinks; + +/** + * Event handler to find/compute all the root object accessible from a given editing context. + * + * @author frouene + */ +@Service +public class EditingContextRootObjectCreationDescriptionsEventHandler implements IEditingContextEventHandler { + + private final IEditService editService; + + public EditingContextRootObjectCreationDescriptionsEventHandler(IEditService editService) { + this.editService = Objects.requireNonNull(editService); + } + + @Override + public boolean canHandle(IEditingContext editingContext, IInput input) { + return input instanceof EditingContextRootObjectCreationDescriptionsInput; + } + + @Override + public void handle(Sinks.One payloadSink, Sinks.Many changeDescriptionSink, IEditingContext editingContext, IInput input) { + List childCreationDescriptions = List.of(); + if (input instanceof EditingContextRootObjectCreationDescriptionsInput editingContextRootObjectCreationDescriptionsInput) { + childCreationDescriptions = editService.getRootCreationDescriptions(editingContext, editingContextRootObjectCreationDescriptionsInput.domainId(), + editingContextRootObjectCreationDescriptionsInput.suggested()); + } + payloadSink.tryEmitValue(new EditingContextRootObjectCreationDescriptionsPayload(input.id(), childCreationDescriptions)); + } +} diff --git a/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/services/EditService.java b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/services/EditService.java index 6f6a8f80583..e40956e960e 100644 --- a/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/services/EditService.java +++ b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/services/EditService.java @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -31,7 +30,6 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -44,7 +42,6 @@ import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.IEditingDomainItemProvider; import org.eclipse.sirius.components.core.api.ChildCreationDescription; -import org.eclipse.sirius.components.core.api.Domain; import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.emf.services.api.IEMFKindService; @@ -60,22 +57,15 @@ @Service public class EditService implements IEditService { - private final IEditingContextEPackageService editingContextEPackageService; - private final IEMFKindService emfKindService; private final ComposedAdapterFactory composedAdapterFactory; - private final EPackage.Registry globalEPackageRegistry; - private final ISuggestedRootObjectTypesProvider suggestedRootObjectTypesProvider; - public EditService(IEditingContextEPackageService editingContextEPackageService, IEMFKindService emfKindService, ComposedAdapterFactory composedAdapterFactory, - EPackage.Registry globalEPackageRegistry, ISuggestedRootObjectTypesProvider suggestedRootObjectsProvider) { - this.editingContextEPackageService = Objects.requireNonNull(editingContextEPackageService); + public EditService(IEMFKindService emfKindService, ComposedAdapterFactory composedAdapterFactory, ISuggestedRootObjectTypesProvider suggestedRootObjectsProvider) { this.emfKindService = Objects.requireNonNull(emfKindService); this.composedAdapterFactory = Objects.requireNonNull(composedAdapterFactory); - this.globalEPackageRegistry = Objects.requireNonNull(globalEPackageRegistry); this.suggestedRootObjectTypesProvider = Objects.requireNonNull(suggestedRootObjectsProvider); } @@ -91,59 +81,59 @@ private Optional getEClass(EPackage.Registry ePackageRegistry, String ki // @formatter:on } - private EPackage.Registry getPackageRegistry(String editingContextId) { - EPackageRegistryImpl ePackageRegistry = new EPackageRegistryImpl(); - this.globalEPackageRegistry.forEach(ePackageRegistry::put); - List additionalEPackages = this.editingContextEPackageService.getEPackages(editingContextId); - additionalEPackages.forEach(ePackage -> ePackageRegistry.put(ePackage.getNsURI(), ePackage)); - return ePackageRegistry; + private Optional getPackageRegistry(IEditingContext editingContext) { + return Optional.of(editingContext) + .filter(EditingContext.class::isInstance) + .map(EditingContext.class::cast) + .map(EditingContext::getDomain) + .map(EditingDomain::getResourceSet) + .map(ResourceSet::getPackageRegistry); } @Override - public List getChildCreationDescriptions(String editingContextId, String kind) { + public List getChildCreationDescriptions(IEditingContext editingContext, String kind) { List childCreationDescriptions = new ArrayList<>(); - EPackage.Registry ePackageRegistry = this.getPackageRegistry(editingContextId); + this.getPackageRegistry(editingContext).ifPresent(ePackageRegistry -> { - AdapterFactoryEditingDomain editingDomain = new AdapterFactoryEditingDomain(this.composedAdapterFactory, new BasicCommandStack()); - ResourceSet resourceSet = editingDomain.getResourceSet(); - resourceSet.setPackageRegistry(ePackageRegistry); - Resource resource = new JsonResourceImpl(URI.createURI("inmemory"), Map.of()); - resourceSet.getResources().add(resource); + AdapterFactoryEditingDomain editingDomain = new AdapterFactoryEditingDomain(this.composedAdapterFactory, new BasicCommandStack()); + ResourceSet resourceSet = editingDomain.getResourceSet(); + resourceSet.setPackageRegistry(ePackageRegistry); + Resource resource = new JsonResourceImpl(URI.createURI("inmemory"), Map.of()); + resourceSet.getResources().add(resource); - // @formatter:off - var optionalEClass = this.getEClass(ePackageRegistry, kind) - .filter(eClass -> !eClass.isAbstract() && !eClass.isInterface()); - // @formatter:on + // @formatter:off + var optionalEClass = this.getEClass(ePackageRegistry, kind) + .filter(eClass -> !eClass.isAbstract() && !eClass.isInterface()); + // @formatter:on - if (optionalEClass.isPresent()) { - EClass eClass = optionalEClass.get(); - EObject eObject = EcoreUtil.create(eClass); - resource.getContents().add(eObject); + if (optionalEClass.isPresent()) { + EClass eClass = optionalEClass.get(); + EObject eObject = EcoreUtil.create(eClass); + resource.getContents().add(eObject); - Collection newChildDescriptors = editingDomain.getNewChildDescriptors(eObject, null); + Collection newChildDescriptors = editingDomain.getNewChildDescriptors(eObject, null); - // @formatter:off - List commandParameters = newChildDescriptors.stream() - .filter(CommandParameter.class::isInstance) - .map(CommandParameter.class::cast) - .toList(); - // @formatter:on + // @formatter:off + List commandParameters = newChildDescriptors.stream() + .filter(CommandParameter.class::isInstance) + .map(CommandParameter.class::cast) + .toList(); + // @formatter:on - Adapter adapter = editingDomain.getAdapterFactory().adapt(eObject, IEditingDomainItemProvider.class); + Adapter adapter = editingDomain.getAdapterFactory().adapt(eObject, IEditingDomainItemProvider.class); - if (adapter instanceof IEditingDomainItemProvider) { - IEditingDomainItemProvider editingDomainItemProvider = (IEditingDomainItemProvider) adapter; - if (editingDomainItemProvider instanceof Helper) { - Helper helper = (Helper) editingDomainItemProvider; - for (CommandParameter commandParameter : commandParameters) { - String text = helper.getCreateChildText(eObject, commandParameter.getFeature(), commandParameter.getValue(), null); - ChildCreationDescription childCreationDescription = new ChildCreationDescription(text, text); - childCreationDescriptions.add(childCreationDescription); + if (adapter instanceof IEditingDomainItemProvider editingDomainItemProvider) { + if (editingDomainItemProvider instanceof Helper helper) { + for (CommandParameter commandParameter : commandParameters) { + String text = helper.getCreateChildText(eObject, commandParameter.getFeature(), commandParameter.getValue(), null); + ChildCreationDescription childCreationDescription = new ChildCreationDescription(text, text); + childCreationDescriptions.add(childCreationDescription); + } } } } - } + }); return childCreationDescriptions; } @@ -175,10 +165,8 @@ public Optional createChild(IEditingContext editingContext, Object objec // @formatter:on Adapter adapter = editingDomain.getAdapterFactory().adapt(eObject, IEditingDomainItemProvider.class); - if (adapter instanceof IEditingDomainItemProvider) { - IEditingDomainItemProvider editingDomainItemProvider = (IEditingDomainItemProvider) adapter; - if (editingDomainItemProvider instanceof Helper) { - Helper helper = (Helper) editingDomainItemProvider; + if (adapter instanceof IEditingDomainItemProvider editingDomainItemProvider) { + if (editingDomainItemProvider instanceof Helper helper) { for (CommandParameter commandParameter : commandParameters) { String text = helper.getCreateChildText(eObject, commandParameter.getFeature(), commandParameter.getValue(), null); @@ -218,43 +206,27 @@ public void delete(Object object) { } @Override - public List getDomains(String editingContextId) { - Map nsURI2EPackages = new LinkedHashMap<>(); - - this.globalEPackageRegistry.keySet().forEach(nsURI -> nsURI2EPackages.put(nsURI, this.globalEPackageRegistry.getEPackage(nsURI))); - - // @formatter:off - this.editingContextEPackageService.getEPackages(editingContextId).stream() - .forEach(ePackage -> nsURI2EPackages.put(ePackage.getNsURI(), ePackage)); - - return nsURI2EPackages.values().stream() - .map(ePackage -> new Domain(ePackage.getNsURI(), ePackage.getNsURI())) - .sorted() - .toList(); - // @formatter:on - } - - @Override - public List getRootCreationDescriptions(String editingContextId, String domainId, boolean suggested) { + public List getRootCreationDescriptions(IEditingContext editingContext, String domainId, boolean suggested) { List rootObjectCreationDescription = new ArrayList<>(); - EPackage.Registry ePackageRegistry = this.getPackageRegistry(editingContextId); + this.getPackageRegistry(editingContext).ifPresent(ePackageRegistry -> { - EPackage ePackage = ePackageRegistry.getEPackage(domainId); - if (ePackage != null) { - List classes = new ArrayList<>(); - if (suggested) { - classes = this.suggestedRootObjectTypesProvider.getSuggestedRootObjectTypes(ePackage); - if (classes.isEmpty()) { + EPackage ePackage = ePackageRegistry.getEPackage(domainId); + if (ePackage != null) { + List classes; + if (suggested) { + classes = this.suggestedRootObjectTypesProvider.getSuggestedRootObjectTypes(ePackage); + if (classes.isEmpty()) { + classes = this.getConcreteClasses(ePackage); + } + } else { classes = this.getConcreteClasses(ePackage); } - } else { - classes = this.getConcreteClasses(ePackage); - } - for (EClass suggestedClass : classes) { - rootObjectCreationDescription.add(new ChildCreationDescription(suggestedClass.getName(), suggestedClass.getName())); + for (EClass suggestedClass : classes) { + rootObjectCreationDescription.add(new ChildCreationDescription(suggestedClass.getName(), suggestedClass.getName())); + } } - } + }); return rootObjectCreationDescription; } diff --git a/packages/emf/backend/sirius-components-interpreter/.settings/org.eclipse.jdt.ui.prefs b/packages/emf/backend/sirius-components-interpreter/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/emf/backend/sirius-components-interpreter/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/emf/backend/sirius-components-interpreter/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors-graphql/.settings/org.eclipse.jdt.ui.prefs b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors-graphql/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors-graphql/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors-graphql/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/forms/backend/sirius-components-collaborative-forms/.settings/org.eclipse.jdt.ui.prefs b/packages/forms/backend/sirius-components-collaborative-forms/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/forms/backend/sirius-components-collaborative-forms/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/forms/backend/sirius-components-forms-graphql/.settings/org.eclipse.jdt.ui.prefs b/packages/forms/backend/sirius-components-forms-graphql/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/forms/backend/sirius-components-forms-graphql/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/forms/backend/sirius-components-forms-graphql/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/forms/backend/sirius-components-forms-tests/.settings/org.eclipse.jdt.ui.prefs b/packages/forms/backend/sirius-components-forms-tests/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/forms/backend/sirius-components-forms-tests/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/forms/backend/sirius-components-forms-tests/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/forms/backend/sirius-components-forms/.settings/org.eclipse.jdt.ui.prefs b/packages/forms/backend/sirius-components-forms/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/forms/backend/sirius-components-forms/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/forms/backend/sirius-components-forms/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/selection/backend/sirius-components-collaborative-selection/.settings/org.eclipse.jdt.ui.prefs b/packages/selection/backend/sirius-components-collaborative-selection/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/selection/backend/sirius-components-collaborative-selection/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/selection/backend/sirius-components-collaborative-selection/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/selection/backend/sirius-components-selection-graphql/.settings/org.eclipse.jdt.ui.prefs b/packages/selection/backend/sirius-components-selection-graphql/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/selection/backend/sirius-components-selection-graphql/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/selection/backend/sirius-components-selection-graphql/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/selection/backend/sirius-components-selection/.settings/org.eclipse.jdt.ui.prefs b/packages/selection/backend/sirius-components-selection/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/selection/backend/sirius-components-selection/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/selection/backend/sirius-components-selection/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/backend/sirius-web-frontend/.settings/org.eclipse.jdt.ui.prefs b/packages/sirius-web/backend/sirius-web-frontend/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/sirius-web/backend/sirius-web-frontend/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/sirius-web/backend/sirius-web-frontend/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/backend/sirius-web-graphql/.settings/org.eclipse.jdt.ui.prefs b/packages/sirius-web/backend/sirius-web-graphql/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/sirius-web/backend/sirius-web-graphql/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/sirius-web/backend/sirius-web-graphql/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextActionsDataFetcher.java b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextActionsDataFetcher.java index 236455d3238..755ef3aa3c7 100644 --- a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextActionsDataFetcher.java +++ b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextActionsDataFetcher.java @@ -71,8 +71,7 @@ private Connection toConnection(GetEditingContextActionsSu .map(representationDescription -> { String value = Base64.getEncoder().encodeToString(representationDescription.getId().getBytes()); ConnectionCursor cursor = new DefaultConnectionCursor(value); - Edge edge = new DefaultEdge<>(representationDescription, cursor); - return edge; + return (Edge) new DefaultEdge<>(representationDescription, cursor); }) .toList(); // @formatter:on diff --git a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextChildCreationDescriptionsDataFetcher.java b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextChildCreationDescriptionsDataFetcher.java index dac7e700157..3bdfcc5ffc4 100644 --- a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextChildCreationDescriptionsDataFetcher.java +++ b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextChildCreationDescriptionsDataFetcher.java @@ -14,10 +14,14 @@ import java.util.List; import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; import org.eclipse.sirius.components.annotations.spring.graphql.QueryDataFetcher; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventProcessorRegistry; +import org.eclipse.sirius.components.collaborative.dto.EditingContextChildObjectCreationDescriptionsInput; +import org.eclipse.sirius.components.collaborative.dto.EditingContextChildObjectCreationDescriptionsPayload; import org.eclipse.sirius.components.core.api.ChildCreationDescription; -import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.graphql.api.IDataFetcherWithFieldCoordinates; import graphql.schema.DataFetchingEnvironment; @@ -37,20 +41,26 @@ * @author hmarchadour */ @QueryDataFetcher(type = "EditingContext", field = "childCreationDescriptions") -public class EditingContextChildCreationDescriptionsDataFetcher implements IDataFetcherWithFieldCoordinates> { +public class EditingContextChildCreationDescriptionsDataFetcher implements IDataFetcherWithFieldCoordinates>> { private static final String KIND_ARGUMENT = "kind"; - private final IEditService editService; + private final IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry; - public EditingContextChildCreationDescriptionsDataFetcher(IEditService editService) { - this.editService = Objects.requireNonNull(editService); + public EditingContextChildCreationDescriptionsDataFetcher(IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry) { + this.editingContextEventProcessorRegistry = Objects.requireNonNull(editingContextEventProcessorRegistry); } @Override - public List get(DataFetchingEnvironment environment) throws Exception { + public CompletableFuture> get(DataFetchingEnvironment environment) throws Exception { String editingContextId = environment.getSource(); String kindArgument = environment.getArgument(KIND_ARGUMENT); - return this.editService.getChildCreationDescriptions(editingContextId, kindArgument); + EditingContextChildObjectCreationDescriptionsInput input = new EditingContextChildObjectCreationDescriptionsInput(UUID.randomUUID(), editingContextId, kindArgument); + + return this.editingContextEventProcessorRegistry.dispatchEvent(input.editingContextId(), input) + .filter(EditingContextChildObjectCreationDescriptionsPayload.class::isInstance) + .map(EditingContextChildObjectCreationDescriptionsPayload.class::cast) + .map(EditingContextChildObjectCreationDescriptionsPayload::childCreationDescriptions) + .toFuture(); } } diff --git a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextDomainsDataFetcher.java b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextDomainsDataFetcher.java index 802b79f95a0..03f6e7f2b9f 100644 --- a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextDomainsDataFetcher.java +++ b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextDomainsDataFetcher.java @@ -14,10 +14,14 @@ import java.util.List; import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; import org.eclipse.sirius.components.annotations.spring.graphql.QueryDataFetcher; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventProcessorRegistry; +import org.eclipse.sirius.components.collaborative.dto.EditingContextDomainsInput; +import org.eclipse.sirius.components.collaborative.dto.EditingContextDomainsPayload; import org.eclipse.sirius.components.core.api.Domain; -import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.graphql.api.IDataFetcherWithFieldCoordinates; import graphql.schema.DataFetchingEnvironment; @@ -37,16 +41,23 @@ * @author lfasani */ @QueryDataFetcher(type = "EditingContext", field = "domains") -public class EditingContextDomainsDataFetcher implements IDataFetcherWithFieldCoordinates> { - private final IEditService editService; +public class EditingContextDomainsDataFetcher implements IDataFetcherWithFieldCoordinates>> { + private final IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry; - public EditingContextDomainsDataFetcher(IEditService editService) { - this.editService = Objects.requireNonNull(editService); + public EditingContextDomainsDataFetcher(IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry) { + this.editingContextEventProcessorRegistry = Objects.requireNonNull(editingContextEventProcessorRegistry); } @Override - public List get(DataFetchingEnvironment environment) throws Exception { + public CompletableFuture> get(DataFetchingEnvironment environment) throws Exception { String editingContextId = environment.getSource(); - return this.editService.getDomains(editingContextId); + + EditingContextDomainsInput input = new EditingContextDomainsInput(UUID.randomUUID(), editingContextId); + + return this.editingContextEventProcessorRegistry.dispatchEvent(input.editingContextId(), input) + .filter(EditingContextDomainsPayload.class::isInstance) + .map(EditingContextDomainsPayload.class::cast) + .map(EditingContextDomainsPayload::domains) + .toFuture(); } } diff --git a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextRootObjectCreationDescriptionsDataFetcher.java b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextRootObjectCreationDescriptionsDataFetcher.java index 8775ea72c0d..d98dc6d78f0 100644 --- a/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextRootObjectCreationDescriptionsDataFetcher.java +++ b/packages/sirius-web/backend/sirius-web-graphql/src/main/java/org/eclipse/sirius/web/graphql/datafetchers/editingcontext/EditingContextRootObjectCreationDescriptionsDataFetcher.java @@ -14,10 +14,14 @@ import java.util.List; import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; import org.eclipse.sirius.components.annotations.spring.graphql.QueryDataFetcher; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventProcessorRegistry; +import org.eclipse.sirius.components.collaborative.dto.EditingContextRootObjectCreationDescriptionsInput; +import org.eclipse.sirius.components.collaborative.dto.EditingContextRootObjectCreationDescriptionsPayload; import org.eclipse.sirius.components.core.api.ChildCreationDescription; -import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.graphql.api.IDataFetcherWithFieldCoordinates; import graphql.schema.DataFetchingEnvironment; @@ -37,24 +41,30 @@ * @author hmarchadour */ @QueryDataFetcher(type = "EditingContext", field = "rootObjectCreationDescriptions") -public class EditingContextRootObjectCreationDescriptionsDataFetcher implements IDataFetcherWithFieldCoordinates> { +public class EditingContextRootObjectCreationDescriptionsDataFetcher implements IDataFetcherWithFieldCoordinates>> { private static final String DOMAIN_ID_ARGUMENT = "domainId"; private static final String SUGGESTED_ARGUMENT = "suggested"; - private final IEditService editService; + private final IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry; - public EditingContextRootObjectCreationDescriptionsDataFetcher(IEditService editService) { - this.editService = Objects.requireNonNull(editService); + public EditingContextRootObjectCreationDescriptionsDataFetcher(IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry) { + this.editingContextEventProcessorRegistry = Objects.requireNonNull(editingContextEventProcessorRegistry); } @Override - public List get(DataFetchingEnvironment environment) throws Exception { + public CompletableFuture> get(DataFetchingEnvironment environment) throws Exception { String editingContextId = environment.getSource(); String domainId = environment.getArgument(DOMAIN_ID_ARGUMENT); Boolean suggested = environment.getArgument(SUGGESTED_ARGUMENT); - return this.editService.getRootCreationDescriptions(editingContextId, domainId, suggested); + EditingContextRootObjectCreationDescriptionsInput input = new EditingContextRootObjectCreationDescriptionsInput(UUID.randomUUID(), editingContextId, domainId, suggested); + + return this.editingContextEventProcessorRegistry.dispatchEvent(input.editingContextId(), input) + .filter(EditingContextRootObjectCreationDescriptionsPayload.class::isInstance) + .map(EditingContextRootObjectCreationDescriptionsPayload.class::cast) + .map(EditingContextRootObjectCreationDescriptionsPayload::childCreationDescriptions) + .toFuture(); } } diff --git a/packages/sirius-web/backend/sirius-web-persistence/.settings/org.eclipse.jdt.ui.prefs b/packages/sirius-web/backend/sirius-web-persistence/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/sirius-web/backend/sirius-web-persistence/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/sirius-web/backend/sirius-web-persistence/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/entities/DocumentEntity.java b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/entities/DocumentEntity.java index e22f3b33753..23ed7a7f4b6 100644 --- a/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/entities/DocumentEntity.java +++ b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/entities/DocumentEntity.java @@ -15,9 +15,10 @@ import java.text.MessageFormat; import java.util.UUID; +import org.hibernate.annotations.GenericGenerator; + import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; @@ -33,7 +34,8 @@ public class DocumentEntity { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GenericGenerator(name = "customReuseIdIfSetUUIDGenerator", strategy = "org.eclipse.sirius.web.persistence.generators.CustomReuseIdIfSetUUIDGenerator") + @GeneratedValue(generator = "customReuseIdIfSetUUIDGenerator") private UUID id; @ManyToOne diff --git a/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/entities/ProjectNatureEntity.java b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/entities/ProjectNatureEntity.java new file mode 100644 index 00000000000..c7879949ab9 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/entities/ProjectNatureEntity.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.persistence.entities; + +import java.text.MessageFormat; +import java.util.UUID; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +/** + * Project's nature entity used by the persistence layer. + * + * @author frouene + */ +@Entity +@Table(name = "ProjectNature") +public class ProjectNatureEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private UUID id; + + @ManyToOne + @JoinColumn(name = "project_id") + private ProjectEntity project; + + private String name; + + public UUID getId() { + return this.id; + } + + public void setId(UUID id) { + this.id = id; + } + + public ProjectEntity getProject() { + return this.project; + } + + public void setProject(ProjectEntity project) { + this.project = project; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, name: {2}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.name); + } + +} diff --git a/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/generators/CustomReuseIdIfSetUUIDGenerator.java b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/generators/CustomReuseIdIfSetUUIDGenerator.java new file mode 100644 index 00000000000..a1c285badb6 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/generators/CustomReuseIdIfSetUUIDGenerator.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.persistence.generators; + +import java.util.Objects; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.id.UUIDGenerator; + +/** + * Custom UUID generator to generate a new UUID only if the entity does not have already one. + * + * @author frouene + */ +public class CustomReuseIdIfSetUUIDGenerator extends UUIDGenerator { + + @Override + public Object generate(SharedSessionContractImplementor session, Object object) throws HibernateException { + Object id = session.getEntityPersister(null, object).getIdentifier(object, session); + if (Objects.nonNull(id)) { + return id; + } + return super.generate(session, object); + } +} diff --git a/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/repositories/IProjectNatureRepository.java b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/repositories/IProjectNatureRepository.java new file mode 100644 index 00000000000..510094aa6ea --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-persistence/src/main/java/org/eclipse/sirius/web/persistence/repositories/IProjectNatureRepository.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.persistence.repositories; + +import java.util.List; +import java.util.UUID; + +import org.eclipse.sirius.components.annotations.Audited; +import org.eclipse.sirius.web.persistence.entities.ProjectNatureEntity; +import org.springframework.data.repository.ListCrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; + +/** + * * Persistence layer used to manipulate project's nature. + * + * @author frouene + */ +@Repository +public interface IProjectNatureRepository extends PagingAndSortingRepository, ListCrudRepository { + + @Audited + @Override + S save(S projectNatureEntity); + + @Audited + List findAllByProjectId(UUID projectId); + +} diff --git a/packages/sirius-web/backend/sirius-web-persistence/src/main/resources/db/changelog/sirius-web-schema.sql b/packages/sirius-web/backend/sirius-web-persistence/src/main/resources/db/changelog/sirius-web-schema.sql index d3f330e1520..dbf5e683bd1 100644 --- a/packages/sirius-web/backend/sirius-web-persistence/src/main/resources/db/changelog/sirius-web-schema.sql +++ b/packages/sirius-web/backend/sirius-web-persistence/src/main/resources/db/changelog/sirius-web-schema.sql @@ -59,4 +59,13 @@ CREATE TABLE CustomImage ( content BYTEA NOT NULL, CONSTRAINT pk_customimage_id PRIMARY KEY (id), CONSTRAINT fk_customimage_project_id_id FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE +); + +CREATE TABLE ProjectNature ( + id UUID NOT NULL, + project_id uuid NOT NULL, + name text NOT NULL, + CONSTRAINT pk_projectnature_id PRIMARY KEY (id), + CONSTRAINT fk_projectnature_project_id_id FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE, + CONSTRAINT projectnature_name_length CHECK (((char_length(name) > 0) AND (char_length(name) <= 1024))) ); \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web-sample-application/.settings/org.eclipse.jdt.ui.prefs b/packages/sirius-web/backend/sirius-web-sample-application/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/sirius-web/backend/sirius-web-sample-application/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesProvider.java index 47c65ee85f0..96c4aab8242 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/FlowProjectTemplatesProvider.java @@ -34,6 +34,7 @@ public List getProjectTemplates() { 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/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StudioProjectTemplatesProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StudioProjectTemplatesProvider.java index 00a801ec45c..07e4f65ebc5 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StudioProjectTemplatesProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/configuration/StudioProjectTemplatesProvider.java @@ -15,6 +15,7 @@ import java.util.List; import org.eclipse.sirius.web.services.api.projects.IProjectTemplateProvider; +import org.eclipse.sirius.web.services.api.projects.Nature; import org.eclipse.sirius.web.services.api.projects.ProjectTemplate; import org.springframework.context.annotation.Configuration; @@ -34,6 +35,7 @@ public List getProjectTemplates() { var studioTemplate = ProjectTemplate.newProjectTemplate(STUDIO_TEMPLATE_ID) .label("Studio") .imageURL("/images/Studio-Template.png") + .natures(List.of(new Nature("siriusComponents://nature?kind=studio"))) .build(); // @formatter:on return List.of(studioTemplate); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/PapayaStudioTemplateProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/PapayaStudioTemplateProvider.java index 13cf9dd803a..1fa3fb53907 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/PapayaStudioTemplateProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/PapayaStudioTemplateProvider.java @@ -34,6 +34,7 @@ public List getProjectTemplates() { var studioTemplate = ProjectTemplate.newProjectTemplate(STUDIO_TEMPLATE_ID) .label("Papaya Studio") .imageURL("/images/Papaya-Template.svg") + .natures(List.of()) .build(); // @formatter:on return List.of(studioTemplate); 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 new file mode 100644 index 00000000000..fd035d53063 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandler.java @@ -0,0 +1,207 @@ +/******************************************************************************* + * Copyright (c) 2023 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.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; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.domain.DomainFactory; +import org.eclipse.sirius.components.emf.services.EditingContext; +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.components.view.DiagramDescription; +import org.eclipse.sirius.components.view.View; +import org.eclipse.sirius.components.view.ViewFactory; +import org.eclipse.sirius.emfjson.resource.JsonResource; +import org.eclipse.sirius.web.sample.papaya.domain.PapayaDomainProvider; +import org.eclipse.sirius.web.sample.papaya.view.PapayaViewProvider; +import org.eclipse.sirius.web.services.documents.DocumentMetadataAdapter; +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 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, + EMPTY_DOMAIN_ID, PAPAYA_DOMAIN_ID, EMPTY_VIEW_ID, PAPAYA_VIEW_ID); + private final Logger logger = LoggerFactory.getLogger(EditingContextActionHandler.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_ACTION_ID -> createResourceAndReturnSuccess(resourceSet, this::createEmptyResource); + case EMPTY_FLOW_ID -> createResourceAndReturnSuccess(resourceSet, this::createEmptyFlowResource); + case ROBOT_FLOW_ID -> createResourceAndReturnSuccess(resourceSet, this::createRobotFlowResource); + case BIG_GUY_FLOW_ID -> createResourceAndReturnSuccess(resourceSet, this::createBigGuyFlowResource); + case EMPTY_DOMAIN_ID -> createResourceAndReturnSuccess(resourceSet, this::createEmptyDomainResource); + case PAPAYA_DOMAIN_ID -> createResourceAndReturnSuccess(resourceSet, this::createPapayaDomainResource); + case EMPTY_VIEW_ID -> createResourceAndReturnSuccess(resourceSet, this::createEmptyViewResource); + case PAPAYA_VIEW_ID -> createResourceAndReturnSuccess(resourceSet, this::createPapayaViewResource); + 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 createEmptyResource(ResourceSet resourceSet) { + JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); + resource.eAdapters().add(new DocumentMetadataAdapter("Others...")); + 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 DocumentMetadataAdapter("Flow")); + resourceSet.getResources().add(resource); + } + + private void createEmptyDomainResource(ResourceSet resourceSet) { + JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); + resource.getContents().add(DomainFactory.eINSTANCE.createDomain()); + resource.eAdapters().add(new DocumentMetadataAdapter("Domain")); + resourceSet.getResources().add(resource); + } + + private void createPapayaDomainResource(ResourceSet resourceSet) { + JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); + new PapayaDomainProvider().getDomains().forEach(resource.getContents()::add); + resource.eAdapters().add(new DocumentMetadataAdapter("Papaya Domain")); + resourceSet.getResources().add(resource); + } + + private void createEmptyViewResource(ResourceSet resourceSet) { + View newView = ViewFactory.eINSTANCE.createView(); + DiagramDescription diagramDescription = ViewFactory.eINSTANCE.createDiagramDescription(); + diagramDescription.setName("New Diagram Description"); + newView.getDescriptions().add(diagramDescription); + JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); + resource.getContents().add(newView); + resource.eAdapters().add(new DocumentMetadataAdapter("View")); + resourceSet.getResources().add(resource); + } + + private void createPapayaViewResource(ResourceSet resourceSet) { + + JsonResource resource = new JSONResourceFactory().createResourceFromPath(UUID.randomUUID().toString()); + resource.getContents().add(new PapayaViewProvider().getView()); + resource.eAdapters().add(new DocumentMetadataAdapter("Papaya View")); + resourceSet.getResources().add(resource); + } + + + private void createRobotFlowResource(ResourceSet resourceSet) { + getResourceFromClassPathResource(new ClassPathResource("robot.flow")).ifPresent(resource -> { + resource.eAdapters().add(new DocumentMetadataAdapter("Robot Flow")); + resourceSet.getResources().add(resource); + }); + } + + private void createBigGuyFlowResource(ResourceSet resourceSet) { + getResourceFromClassPathResource(new ClassPathResource("Big_Guy.flow")).ifPresent(resource -> { + resource.eAdapters().add(new DocumentMetadataAdapter("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 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 new file mode 100644 index 00000000000..e522dd4309e --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/services/EditingContextActionProvider.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.sample.services; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.emf.ecore.EPackage; +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.components.domain.DomainPackage; +import org.eclipse.sirius.components.emf.services.EditingContext; +import org.eclipse.sirius.components.view.ViewPackage; +import org.springframework.stereotype.Service; + +/** + * Provides the list of possible actions on the editingContext. + * + * @author frouene + */ +@Service +public class EditingContextActionProvider implements IEditingContextActionProvider { + + 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"; + + public static final String EMPTY_VIEW_ID = "empty_view"; + + public static final String PAPAYA_VIEW_ID = "papaya_view"; + + 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"); + + private static final EditingContextAction EMPTY_VIEW_EDITING_CONTEXT_ACTION = new EditingContextAction(EMPTY_VIEW_ID, "View"); + + private static final EditingContextAction PAPAYA_VIEW_EDITING_CONTEXT_ACTION = new EditingContextAction(PAPAYA_VIEW_ID, "Papaya View"); + + @Override + public List getEditingContextAction(IEditingContext editingContext) { + var actions = new ArrayList(); + if (editingContext instanceof EditingContext emfEditingContext) { + var nsURIs = emfEditingContext.getDomain().getResourceSet().getPackageRegistry().values() + .stream() + .filter(EPackage.class::isInstance) + .map(EPackage.class::cast) + .map(EPackage::getNsURI) + .toList(); + + 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); + } + if (containsView) { + actions.add(EMPTY_VIEW_EDITING_CONTEXT_ACTION); + } + if (containsDomain) { + actions.add(PAPAYA_DOMAIN_EDITING_CONTEXT_ACTION); + } + if (containsView) { + actions.add(PAPAYA_VIEW_EDITING_CONTEXT_ACTION); + } + actions.add(EMPTY_EDITING_CONTEXT_ACTION); + } + return actions; + } +} 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 new file mode 100644 index 00000000000..883c83e5461 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/services/EditingContextActionHandlerTests.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.sample.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 EditingContextActionHandlerTests { + + @ParameterizedTest + @ValueSource(strings = {"empty", "empty_flow", "robot_flow", "big_guy_flow", "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"}) + void testCanNotHandle(String actionId) { + EditingContextActionHandler handler = new EditingContextActionHandler(); + assertThat(handler.canHandle(null, actionId)).isFalse(); + } +} diff --git a/packages/sirius-web/backend/sirius-web-services-api/.settings/org.eclipse.jdt.ui.prefs b/packages/sirius-web/backend/sirius-web-services-api/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/sirius-web/backend/sirius-web-services-api/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/sirius-web/backend/sirius-web-services-api/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/backend/sirius-web-services-api/src/main/java/org/eclipse/sirius/web/services/api/projects/Nature.java b/packages/sirius-web/backend/sirius-web-services-api/src/main/java/org/eclipse/sirius/web/services/api/projects/Nature.java new file mode 100644 index 00000000000..aa0010ef4f6 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-services-api/src/main/java/org/eclipse/sirius/web/services/api/projects/Nature.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.services.api.projects; + +import java.util.Objects; + +/** + * The project's nature. + * + * @author frouene + */ +public record Nature(String natureId) { + public Nature { + Objects.requireNonNull(natureId); + } +} diff --git a/packages/sirius-web/backend/sirius-web-services-api/src/main/java/org/eclipse/sirius/web/services/api/projects/ProjectTemplate.java b/packages/sirius-web/backend/sirius-web-services-api/src/main/java/org/eclipse/sirius/web/services/api/projects/ProjectTemplate.java index 5206c31fa34..3271cdb849c 100644 --- a/packages/sirius-web/backend/sirius-web-services-api/src/main/java/org/eclipse/sirius/web/services/api/projects/ProjectTemplate.java +++ b/packages/sirius-web/backend/sirius-web-services-api/src/main/java/org/eclipse/sirius/web/services/api/projects/ProjectTemplate.java @@ -13,6 +13,7 @@ package org.eclipse.sirius.web.services.api.projects; import java.text.MessageFormat; +import java.util.List; import java.util.Objects; import org.eclipse.sirius.components.annotations.Immutable; @@ -30,6 +31,8 @@ public final class ProjectTemplate { private String imageURL; + private List natures; + private ProjectTemplate() { // Prevent instantiation } @@ -46,6 +49,10 @@ public String getImageURL() { return this.imageURL; } + public List getNatures() { + return this.natures; + } + public static Builder newProjectTemplate(String id) { return new Builder(id); } @@ -70,6 +77,8 @@ public static final class Builder { private String imageURL; + private List natures; + private Builder(String id) { this.id = Objects.requireNonNull(id); } @@ -84,10 +93,16 @@ public Builder imageURL(String imageURL) { return this; } + public Builder natures(List natures) { + this.natures = Objects.requireNonNull(natures); + return this; + } + public ProjectTemplate build() { ProjectTemplate projectTemplate = new ProjectTemplate(); projectTemplate.id = Objects.requireNonNull(this.id); projectTemplate.label = Objects.requireNonNull(this.label); + projectTemplate.natures = Objects.requireNonNull(this.natures); projectTemplate.imageURL = this.imageURL; return projectTemplate; } diff --git a/packages/sirius-web/backend/sirius-web-services/.settings/org.eclipse.jdt.ui.prefs b/packages/sirius-web/backend/sirius-web-services/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/sirius-web/backend/sirius-web-services/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/sirius-web/backend/sirius-web-services/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/DomainSearchService.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/DomainSearchService.java new file mode 100644 index 00000000000..4d04e6fbf92 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/DomainSearchService.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.services.editingcontext; + +import java.util.List; +import java.util.Optional; + +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.sirius.components.core.api.Domain; +import org.eclipse.sirius.components.core.api.IDomainSearchService; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.emf.services.EditingContext; +import org.springframework.stereotype.Service; + +/** + * Service used to search the domains available. + * + * @author frouene + */ +@Service +public class DomainSearchService implements IDomainSearchService { + @Override + public List findAllByEditingContext(IEditingContext editingContext) { + return Optional.of(editingContext) + .filter(EditingContext.class::isInstance) + .map(EditingContext.class::cast) + .map(EditingContext::getDomain) + .map(EditingDomain::getResourceSet) + .map(ResourceSet::getPackageRegistry) + .map(EPackage.Registry::values) + .orElse(List.of()) + .stream() + .filter(EPackage.class::isInstance) + .map(EPackage.class::cast) + .map(ePackage -> new Domain(ePackage.getNsURI(), ePackage.getNsURI())) + .sorted() + .toList(); + } +} diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceService.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceService.java index 2d33f64129a..b1f10179567 100644 --- a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceService.java +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceService.java @@ -19,10 +19,10 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.UUID; import java.util.concurrent.TimeUnit; import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IEditingContextPersistenceService; import org.eclipse.sirius.components.emf.services.EObjectIDManager; @@ -30,10 +30,12 @@ import org.eclipse.sirius.emfjson.resource.JsonResource; import org.eclipse.sirius.web.persistence.entities.DocumentEntity; import org.eclipse.sirius.web.persistence.repositories.IDocumentRepository; +import org.eclipse.sirius.web.persistence.repositories.IProjectRepository; import org.eclipse.sirius.web.services.api.document.Document; import org.eclipse.sirius.web.services.api.events.DocumentsModifiedEvent; import org.eclipse.sirius.web.services.api.id.IDParser; import org.eclipse.sirius.web.services.documents.DocumentMapper; +import org.eclipse.sirius.web.services.documents.DocumentMetadataAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationEventPublisher; @@ -56,12 +58,15 @@ public class EditingContextPersistenceService implements IEditingContextPersiste private final IDocumentRepository documentRepository; + private final IProjectRepository projectRepository; + private final ApplicationEventPublisher applicationEventPublisher; private final Timer timer; - public EditingContextPersistenceService(IDocumentRepository documentRepository, ApplicationEventPublisher applicationEventPublisher, MeterRegistry meterRegistry) { + public EditingContextPersistenceService(IDocumentRepository documentRepository, IProjectRepository projectRepository, ApplicationEventPublisher applicationEventPublisher, MeterRegistry meterRegistry) { this.documentRepository = Objects.requireNonNull(documentRepository); + this.projectRepository = Objects.requireNonNull(projectRepository); this.applicationEventPublisher = Objects.requireNonNull(applicationEventPublisher); this.timer = Timer.builder(TIMER_NAME).register(meterRegistry); @@ -72,8 +77,7 @@ public void persist(IEditingContext editingContext) { long start = System.currentTimeMillis(); if (editingContext instanceof EditingContext) { - EditingDomain editingDomain = ((EditingContext) editingContext).getDomain(); - List documentEntities = this.persist(editingDomain); + List documentEntities = this.persistResources((EditingContext) editingContext); List documents = documentEntities.stream().map(new DocumentMapper()::toDTO).toList(); // @formatter:off new IDParser().parse(editingContext.getId()) @@ -86,11 +90,11 @@ public void persist(IEditingContext editingContext) { this.timer.record(end - start, TimeUnit.MILLISECONDS); } - private List persist(EditingDomain editingDomain) { + private List persistResources(EditingContext editingContext) { List result = new ArrayList<>(); // @formatter:off - List resources = editingDomain.getResourceSet().getResources().stream() + List resources = editingContext.getDomain().getResourceSet().getResources().stream() .filter(res -> { if (res.getURI() != null) { return EditingContext.RESOURCE_SCHEME.equals(res.getURI().scheme()); @@ -101,12 +105,12 @@ private List persist(EditingDomain editingDomain) { // @formatter:on for (Resource resource : resources) { - this.save(resource).ifPresent(result::add); + this.save(resource, editingContext.getId()).ifPresent(result::add); } return result; } - private Optional save(Resource resource) { + private Optional save(Resource resource, String editingContextId) { Optional result = Optional.empty(); HashMap options = new HashMap<>(); options.put(JsonResource.OPTION_ID_MANAGER, new EObjectIDManager()); @@ -122,12 +126,14 @@ private Optional save(Resource resource) { this.logger.warn(error.getMessage()); } - byte[] bytes = outputStream.toByteArray(); - String content = new String(bytes); + String content = outputStream.toString(); + + var optionalResourceUUID = new IDParser().parse(resource.getURI().path().substring(1)); // @formatter:off - result = new IDParser().parse(resource.getURI().path().substring(1)) + result = optionalResourceUUID .flatMap(this.documentRepository::findById) + .or(() -> createNewDocumentEntityWithoutContent(resource, editingContextId, optionalResourceUUID)) .map(entity -> { entity.setContent(content); return this.documentRepository.save(entity); @@ -139,4 +145,24 @@ private Optional save(Resource resource) { } return result; } + + private Optional createNewDocumentEntityWithoutContent(Resource resource, String editingContextId, Optional optionalResourceUUID) { + return new IDParser().parse(editingContextId) + .flatMap(this.projectRepository::findById) + .map(projectEntity -> { + var name = resource.eAdapters().stream() + .filter(DocumentMetadataAdapter.class::isInstance) + .map(DocumentMetadataAdapter.class::cast) + .findFirst().map(DocumentMetadataAdapter::getName) + .orElse(""); + + DocumentEntity documentEntity = new DocumentEntity(); + documentEntity.setId(optionalResourceUUID.orElseGet(UUID::randomUUID)); + documentEntity.setProject(projectEntity); + documentEntity.setName(name); + return documentEntity; + }); + + + } } diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingDomainFactoryService.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingDomainFactoryService.java index b4f5b24924e..00e6cbd3ad1 100644 --- a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingDomainFactoryService.java +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/editingcontext/EditingDomainFactoryService.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 Obeo. + * Copyright (c) 2023 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 @@ -15,6 +15,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.stream.Stream; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.ecore.EPackage; @@ -24,12 +25,15 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.sirius.components.domain.DomainPackage; import org.eclipse.sirius.components.emf.services.IEditingContextEPackageService; +import org.eclipse.sirius.components.view.ViewPackage; +import org.eclipse.sirius.web.services.api.projects.Nature; +import org.eclipse.sirius.web.services.projects.api.IEditingContextMetadataProvider; import org.springframework.stereotype.Service; /** - * This class is used to create the editing domain used as editing context.
- * It instantiates the ResourceSet with the right configuration. + * This class is used to create the editing domain used as editing context.
It instantiates the ResourceSet with the right configuration. * * @author lfasani */ @@ -38,34 +42,45 @@ public class EditingDomainFactoryService { private final IEditingContextEPackageService editingContextEPackageService; + private final IEditingContextMetadataProvider editingContextMetadataProvider; + private final ComposedAdapterFactory composedAdapterFactory; private final EPackage.Registry globalEPackageRegistry; - private final Optional resourceFactoryRegistryOpt; + private final Optional optionalResourceFactoryRegistry; - public EditingDomainFactoryService(IEditingContextEPackageService editingContextEPackageService, ComposedAdapterFactory composedAdapterFactory, EPackage.Registry globalEPackageRegistry, - Optional resourceFactoryRegistryOpt) { + public EditingDomainFactoryService(IEditingContextEPackageService editingContextEPackageService, IEditingContextMetadataProvider editingContextMetadataProvider, + ComposedAdapterFactory composedAdapterFactory, EPackage.Registry globalEPackageRegistry, Optional optionalResourceFactoryRegistry) { this.editingContextEPackageService = Objects.requireNonNull(editingContextEPackageService); + this.editingContextMetadataProvider = Objects.requireNonNull(editingContextMetadataProvider); this.composedAdapterFactory = Objects.requireNonNull(composedAdapterFactory); this.globalEPackageRegistry = Objects.requireNonNull(globalEPackageRegistry); - this.resourceFactoryRegistryOpt = resourceFactoryRegistryOpt; + this.optionalResourceFactoryRegistry = optionalResourceFactoryRegistry; } public AdapterFactoryEditingDomain createEditingDomain(String editingContextId) { AdapterFactoryEditingDomain editingDomain = new AdapterFactoryEditingDomain(this.composedAdapterFactory, new BasicCommandStack()); ResourceSet resourceSet = editingDomain.getResourceSet(); + var isStudioProjectNature = this.editingContextMetadataProvider.getMetadata(editingContextId).natures().stream().map(Nature::natureId) + .anyMatch("siriusComponents://nature?kind=studio"::equals); + EPackageRegistryImpl ePackageRegistry = new EPackageRegistryImpl(); - this.globalEPackageRegistry.forEach(ePackageRegistry::put); List additionalEPackages = this.editingContextEPackageService.getEPackages(editingContextId); - additionalEPackages.forEach(ePackage -> ePackageRegistry.put(ePackage.getNsURI(), ePackage)); + Stream.concat(findGlobalEPackages(), additionalEPackages.stream()) + .filter(ePackage -> isStudioProjectNature || !List.of(DomainPackage.eNS_URI, ViewPackage.eNS_URI).contains(ePackage.getNsURI())) + .forEach(ePackage -> ePackageRegistry.put(ePackage.getNsURI(), ePackage)); resourceSet.setPackageRegistry(ePackageRegistry); - if (this.resourceFactoryRegistryOpt.isPresent()) { - resourceSet.setResourceFactoryRegistry(this.resourceFactoryRegistryOpt.get()); - } + this.optionalResourceFactoryRegistry.ifPresent(resourceSet::setResourceFactoryRegistry); return editingDomain; } + + private Stream findGlobalEPackages() { + return this.globalEPackageRegistry.values().stream() + .filter(EPackage.class::isInstance) + .map(EPackage.class::cast); + } } diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/EditingContextMetadataProvider.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/EditingContextMetadataProvider.java new file mode 100644 index 00000000000..d5faebaea40 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/EditingContextMetadataProvider.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.services.projects; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.web.persistence.entities.ProjectNatureEntity; +import org.eclipse.sirius.web.persistence.repositories.IProjectNatureRepository; +import org.eclipse.sirius.web.services.api.id.IDParser; +import org.eclipse.sirius.web.services.api.projects.Nature; +import org.eclipse.sirius.web.services.projects.api.EditingContextMetadata; +import org.eclipse.sirius.web.services.projects.api.IEditingContextMetadataProvider; +import org.springframework.stereotype.Service; + +/** + * Provides the metadata of a editingContext. + * + * @author frouene + */ +@Service +public class EditingContextMetadataProvider implements IEditingContextMetadataProvider { + + private final IProjectNatureRepository projectNatureRepository; + + public EditingContextMetadataProvider(IProjectNatureRepository projectNatureRepository) { + this.projectNatureRepository = Objects.requireNonNull(projectNatureRepository); + } + + @Override + public EditingContextMetadata getMetadata(String editingContextId) { + var natures = new IDParser().parse(editingContextId) + .map(this.projectNatureRepository::findAllByProjectId) + .orElse(List.of()) + .stream() + .map(ProjectNatureEntity::getName) + .map(Nature::new) + .toList(); + return new EditingContextMetadata(natures); + } +} diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/ProjectService.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/ProjectService.java index 80253f7735f..5085d52d3b8 100644 --- a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/ProjectService.java +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/ProjectService.java @@ -24,6 +24,8 @@ import org.eclipse.sirius.components.core.api.IEditingContextSearchService; import org.eclipse.sirius.components.core.api.IPayload; import org.eclipse.sirius.web.persistence.entities.ProjectEntity; +import org.eclipse.sirius.web.persistence.entities.ProjectNatureEntity; +import org.eclipse.sirius.web.persistence.repositories.IProjectNatureRepository; import org.eclipse.sirius.web.persistence.repositories.IProjectRepository; import org.eclipse.sirius.web.services.api.projects.CreateProjectFromTemplateInput; import org.eclipse.sirius.web.services.api.projects.CreateProjectFromTemplateSuccessPayload; @@ -49,6 +51,8 @@ public class ProjectService implements IProjectService { private final IProjectRepository projectRepository; + private final IProjectNatureRepository projectNatureRepository; + private final IProjectTemplateService projectTemplateService; private final IEditingContextSearchService editingContextSearchService; @@ -57,10 +61,12 @@ public class ProjectService implements IProjectService { private final ProjectMapper projectMapper; - public ProjectService(IServicesMessageService messageService, IProjectRepository projectRepository, IProjectTemplateService projectTemplateService, + public ProjectService(IServicesMessageService messageService, IProjectRepository projectRepository, IProjectNatureRepository projectNatureRepository, + IProjectTemplateService projectTemplateService, IEditingContextSearchService editingContextSearchService, IEditingContextPersistenceService editingContextPersistenceService) { this.messageService = Objects.requireNonNull(messageService); this.projectRepository = Objects.requireNonNull(projectRepository); + this.projectNatureRepository = Objects.requireNonNull(projectNatureRepository); this.projectTemplateService = Objects.requireNonNull(projectTemplateService); this.editingContextSearchService = Objects.requireNonNull(editingContextSearchService); this.editingContextPersistenceService = Objects.requireNonNull(editingContextPersistenceService); @@ -123,6 +129,10 @@ public IPayload createProject(CreateProjectFromTemplateInput input) { if (payload instanceof CreateProjectSuccessPayload createProjectSuccessPayload) { var projectId = createProjectSuccessPayload.project().getId(); + template.getNatures().stream() + .map(nature -> this.createProjectNatureEntity(projectId, nature.natureId())) + .forEach(this.projectNatureRepository::save); + var optionalEditingContext = this.editingContextSearchService.findById(projectId.toString()); if (optionalEditingContext.isPresent()) { var editingContext = optionalEditingContext.get(); @@ -138,6 +148,15 @@ public IPayload createProject(CreateProjectFromTemplateInput input) { return result; } + private ProjectNatureEntity createProjectNatureEntity(UUID projectId, String natureName) { + ProjectNatureEntity projectNatureEntity = new ProjectNatureEntity(); + projectNatureEntity.setName(natureName); + var projectEntity = new ProjectEntity(); + projectEntity.setId(projectId); + projectNatureEntity.setProject(projectEntity); + return projectNatureEntity; + } + private ProjectEntity createProjectEntity(String projectName) { ProjectEntity projectEntity = new ProjectEntity(); projectEntity.setName(projectName); diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/api/EditingContextMetadata.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/api/EditingContextMetadata.java new file mode 100644 index 00000000000..93b578e65ec --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/api/EditingContextMetadata.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.services.projects.api; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.web.services.api.projects.Nature; + +/** + * The metadata of a project. + * + * @author frouene + */ +public record EditingContextMetadata(List natures) { + public EditingContextMetadata { + Objects.requireNonNull(natures); + } +} diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/api/IEditingContextMetadataProvider.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/api/IEditingContextMetadataProvider.java new file mode 100644 index 00000000000..5ba80823e85 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/projects/api/IEditingContextMetadataProvider.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.services.projects.api; + +/** + * Use to provide metadata to project. + * + * @author frouene + */ +public interface IEditingContextMetadataProvider { + EditingContextMetadata getMetadata(String editingContextId); +} diff --git a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceServiceTests.java b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceServiceTests.java index d5bbfa73e69..ad63b6c29d4 100644 --- a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceServiceTests.java +++ b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextPersistenceServiceTests.java @@ -31,6 +31,7 @@ import org.eclipse.sirius.web.persistence.entities.DocumentEntity; import org.eclipse.sirius.web.persistence.entities.ProjectEntity; import org.eclipse.sirius.web.persistence.repositories.IDocumentRepository; +import org.eclipse.sirius.web.persistence.repositories.IProjectRepository; import org.eclipse.sirius.web.services.documents.DocumentMetadataAdapter; import org.eclipse.sirius.web.services.documents.EditingDomainFactory; import org.junit.jupiter.api.Test; @@ -46,28 +47,15 @@ public class EditingContextPersistenceServiceTests { @Test public void testDocumentPersistence() { UUID projectId = UUID.randomUUID(); - String name = "New Document"; UUID id = UUID.randomUUID(); - JsonResource resource = new JSONResourceFactory().createResourceFromPath(id.toString()); - resource.eAdapters().add(new DocumentMetadataAdapter(name)); - - EClass eClass = EcoreFactory.eINSTANCE.createEClass(); - eClass.setName("Concept"); - resource.getContents().add(eClass); - AdapterFactoryEditingDomain editingDomain = new EditingDomainFactory().create(); - editingDomain.getResourceSet().getResources().add(resource); ProjectEntity projectEntity = new ProjectEntity(); projectEntity.setId(projectId); projectEntity.setName(""); - DocumentEntity existingEntity = new DocumentEntity(); - existingEntity.setId(id); - existingEntity.setProject(projectEntity); - existingEntity.setName(name); - existingEntity.setContent(""); + var existingEntity = this.createFakeDocument(name, id, projectEntity, editingDomain); List entities = new ArrayList<>(); IDocumentRepository documentRepository = new NoOpDocumentRepository() { @@ -82,7 +70,12 @@ public Optional findById(UUID id) { return Optional.of(existingEntity); } }; - IEditingContextPersistenceService editingContextPersistenceService = new EditingContextPersistenceService(documentRepository, new NoOpApplicationEventPublisher(), new SimpleMeterRegistry()); + IProjectRepository projectRepository = new NoOpProjectRepository(); + + IEditingContextPersistenceService editingContextPersistenceService = new EditingContextPersistenceService(documentRepository, + projectRepository, + new NoOpApplicationEventPublisher(), + new SimpleMeterRegistry()); assertThat(entities).hasSize(0); IEditingContext editingContext = new EditingContext(UUID.randomUUID().toString(), editingDomain, Map.of()); @@ -95,4 +88,76 @@ public Optional findById(UUID id) { assertThat(documentEntity.getName()).isEqualTo(name); assertThat(documentEntity.getProject().getId()).isEqualTo(projectId); } + + + @Test + public void testUnkownDocumentPersistence() { + + UUID projectId = UUID.randomUUID(); + String name = "New Document"; + UUID id = UUID.randomUUID(); + AdapterFactoryEditingDomain editingDomain = new EditingDomainFactory().create(); + + ProjectEntity existingProject = new ProjectEntity(); + existingProject.setId(projectId); + existingProject.setName("Existing project"); + + + this.createFakeDocument(name, id, existingProject, editingDomain); + + List entities = new ArrayList<>(); + IDocumentRepository documentRepository = new NoOpDocumentRepository() { + @Override + public S save(S entity) { + entities.add(entity); + return entity; + } + + }; + + + IProjectRepository projectRepository = new NoOpProjectRepository() { + @Override + public Optional findById(UUID id) { + return Optional.of(existingProject); + } + }; + + IEditingContextPersistenceService editingContextPersistenceService = new EditingContextPersistenceService(documentRepository, + projectRepository, + new NoOpApplicationEventPublisher(), + new SimpleMeterRegistry()); + + assertThat(entities).hasSize(0); + + IEditingContext editingContext = new EditingContext(UUID.randomUUID().toString(), editingDomain, Map.of()); + + editingContextPersistenceService.persist(editingContext); + assertThat(entities).hasSize(1); + + DocumentEntity documentEntity = entities.get(0); + assertThat(documentEntity.getId()).isEqualTo(id); + assertThat(documentEntity.getName()).isEqualTo(name); + assertThat(documentEntity.getProject().getId()).isEqualTo(projectId); + + } + + private DocumentEntity createFakeDocument(String documentName, UUID documentId, ProjectEntity projectEntity, AdapterFactoryEditingDomain editingDomain) { + JsonResource resource = new JSONResourceFactory().createResourceFromPath(documentId.toString()); + resource.eAdapters().add(new DocumentMetadataAdapter(documentName)); + + EClass eClass = EcoreFactory.eINSTANCE.createEClass(); + eClass.setName("Concept"); + resource.getContents().add(eClass); + + editingDomain.getResourceSet().getResources().add(resource); + + DocumentEntity existingEntity = new DocumentEntity(); + existingEntity.setId(documentId); + existingEntity.setProject(projectEntity); + existingEntity.setName(documentName); + existingEntity.setContent(""); + + return existingEntity; + } } diff --git a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextSearchServiceTests.java b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextSearchServiceTests.java index 38d4e03c669..52f69f20aea 100644 --- a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextSearchServiceTests.java +++ b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingContextSearchServiceTests.java @@ -36,6 +36,8 @@ import org.eclipse.sirius.web.persistence.repositories.IProjectRepository; import org.eclipse.sirius.web.services.documents.DocumentMetadataAdapter; import org.eclipse.sirius.web.services.editingcontext.api.IDynamicRepresentationDescriptionService; +import org.eclipse.sirius.web.services.projects.api.EditingContextMetadata; +import org.eclipse.sirius.web.services.projects.api.IEditingContextMetadataProvider; import org.junit.jupiter.api.Test; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; @@ -46,6 +48,7 @@ * @author sbegaudeau */ public class EditingContextSearchServiceTests { + // @formatter:off private static final String CONTENT = """ { @@ -90,7 +93,10 @@ public void testEditingContextWithNoDocuments() { IEditingContextEPackageService editingContextEPackageService = editingContextId -> List.of(); - EditingDomainFactoryService editingDomainFactoryService = new EditingDomainFactoryService(editingContextEPackageService, composedAdapterFactory, ePackageRegistry, Optional.empty()); + var editingContextMetadata = new EditingContextMetadata(List.of()); + IEditingContextMetadataProvider editingContextMetadataProvider = editingContextId -> editingContextMetadata; + + EditingDomainFactoryService editingDomainFactoryService = new EditingDomainFactoryService(editingContextEPackageService, editingContextMetadataProvider, composedAdapterFactory, ePackageRegistry, Optional.empty()); IEditingContextSearchService editingContextSearchService = new EditingContextSearchService(projectRepository, documentRepository, editingDomainFactoryService, List.of(), new IDynamicRepresentationDescriptionService.NoOp(), new SimpleMeterRegistry()); IEditingContext editingContext = editingContextSearchService.findById(projectId).get(); @@ -133,7 +139,11 @@ public List findAllByProjectId(UUID projectId) { ePackageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE); IEditingContextEPackageService editingContextEPackageService = editingContextId -> List.of(); - EditingDomainFactoryService editingDomainFactoryService = new EditingDomainFactoryService(editingContextEPackageService, composedAdapterFactory, ePackageRegistry, Optional.empty()); + + var editingContextMetadata = new EditingContextMetadata(List.of()); + IEditingContextMetadataProvider editingContextMetadataProvider = editingContextId -> editingContextMetadata; + + EditingDomainFactoryService editingDomainFactoryService = new EditingDomainFactoryService(editingContextEPackageService, editingContextMetadataProvider, composedAdapterFactory, ePackageRegistry, Optional.empty()); IEditingContextSearchService editingContextSearchService = new EditingContextSearchService(projectRepository, documentRepository, editingDomainFactoryService, List.of(), new IDynamicRepresentationDescriptionService.NoOp(), new SimpleMeterRegistry()); IEditingContext editingContext = editingContextSearchService.findById(projectId.toString()).get(); diff --git a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingDomainFactoryServiceTests.java b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingDomainFactoryServiceTests.java new file mode 100644 index 00000000000..0c15982449d --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/editingcontext/EditingDomainFactoryServiceTests.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.services.editingcontext; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EcoreFactory; +import org.eclipse.emf.ecore.EcorePackage; +import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; +import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.sirius.components.domain.DomainPackage; +import org.eclipse.sirius.components.emf.services.IEditingContextEPackageService; +import org.eclipse.sirius.components.view.ViewPackage; +import org.eclipse.sirius.web.services.api.projects.Nature; +import org.eclipse.sirius.web.services.projects.api.EditingContextMetadata; +import org.eclipse.sirius.web.services.projects.api.IEditingContextMetadataProvider; +import org.junit.jupiter.api.Test; + +/** + * Unit tests of the editing context factory service. + * + * @author frouene + */ +public class EditingDomainFactoryServiceTests { + + public static final String EPACKAGE_NS_URI_FLOW = "flowURI"; + + @Test + public void testCreateEditingDomainWithoutStudioNature() { + ComposedAdapterFactory composedAdapterFactory = new ComposedAdapterFactory(); + EPackage.Registry ePackageRegistry = generateGlobalEPackages(); + + String projectId = UUID.randomUUID().toString(); + + IEditingContextEPackageService editingContextEPackageService = generateAdditionalEPackages(); + + var editingContextMetadata = new EditingContextMetadata(List.of()); + IEditingContextMetadataProvider editingContextMetadataProvider = editingContextId -> editingContextMetadata; + + EditingDomainFactoryService editingDomainFactoryService = new EditingDomainFactoryService(editingContextEPackageService, editingContextMetadataProvider, composedAdapterFactory, + ePackageRegistry, Optional.empty()); + + AdapterFactoryEditingDomain adapterFactoryEditingDomain = editingDomainFactoryService.createEditingDomain(projectId); + + assertThat(adapterFactoryEditingDomain).isNotNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry()).hasSize(2); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(EcorePackage.eNS_URI)).isNotNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(ViewPackage.eNS_URI)).isNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(DomainPackage.eNS_URI)).isNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(EPACKAGE_NS_URI_FLOW)).isNotNull(); + } + + @Test + public void testCreateEditingDomainWithStudioNature() { + ComposedAdapterFactory composedAdapterFactory = new ComposedAdapterFactory(); + EPackage.Registry ePackageRegistry = generateGlobalEPackages(); + + String projectId = UUID.randomUUID().toString(); + + IEditingContextEPackageService editingContextEPackageService = generateAdditionalEPackages(); + + var editingContextMetadata = new EditingContextMetadata(List.of(new Nature("siriusComponents://nature?kind=studio"))); + IEditingContextMetadataProvider editingContextMetadataProvider = editingContextId -> editingContextMetadata; + + EditingDomainFactoryService editingDomainFactoryService = new EditingDomainFactoryService(editingContextEPackageService, editingContextMetadataProvider, composedAdapterFactory, + ePackageRegistry, Optional.empty()); + + AdapterFactoryEditingDomain adapterFactoryEditingDomain = editingDomainFactoryService.createEditingDomain(projectId); + + assertThat(adapterFactoryEditingDomain).isNotNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry()).hasSize(4); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(EcorePackage.eNS_URI)).isNotNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(ViewPackage.eNS_URI)).isNotNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(DomainPackage.eNS_URI)).isNotNull(); + assertThat(adapterFactoryEditingDomain.getResourceSet().getPackageRegistry().getEPackage(EPACKAGE_NS_URI_FLOW)).isNotNull(); + } + + private static EPackage.Registry generateGlobalEPackages() { + EPackage.Registry ePackageRegistry = new EPackageRegistryImpl(); + ePackageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE); + var globalPackageView = EcoreFactory.eINSTANCE.createEPackage(); + globalPackageView.setName("view"); + globalPackageView.setNsURI(ViewPackage.eNS_URI); + ePackageRegistry.put(ViewPackage.eNS_URI, globalPackageView); + return ePackageRegistry; + } + + private static IEditingContextEPackageService generateAdditionalEPackages() { + var additionalPackageDomain = EcoreFactory.eINSTANCE.createEPackage(); + additionalPackageDomain.setName("domain"); + additionalPackageDomain.setNsURI(DomainPackage.eNS_URI); + var additionalPackageFlow = EcoreFactory.eINSTANCE.createEPackage(); + additionalPackageFlow.setName("flow"); + additionalPackageFlow.setNsURI(EPACKAGE_NS_URI_FLOW); + return editingContextId -> List.of(additionalPackageDomain, additionalPackageFlow); + } +} diff --git a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/projects/NoOpProjectNatureRepository.java b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/projects/NoOpProjectNatureRepository.java new file mode 100644 index 00000000000..a6aad088b93 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/projects/NoOpProjectNatureRepository.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2023 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.web.services.projects; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.eclipse.sirius.web.persistence.entities.ProjectNatureEntity; +import org.eclipse.sirius.web.persistence.repositories.IProjectNatureRepository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +/** + *Implementation of the project nature repository which does nothing. + * + * @author frouene + */ +public class NoOpProjectNatureRepository implements IProjectNatureRepository { + + @Override + public Iterable findAll(Sort sort) { + return null; + } + + @Override + public Page findAll(Pageable pageable) { + return null; + } + + @Override + public List saveAll(Iterable entities) { + return List.of(); + } + + @Override + public Optional findById(UUID id) { + return Optional.empty(); + } + + @Override + public boolean existsById(UUID id) { + return false; + } + + @Override + public List findAll() { + return List.of(); + } + + @Override + public List findAllById(Iterable ids) { + return List.of(); + } + + @Override + public long count() { + return 0; + } + + @Override + public void deleteById(UUID id) { + } + + @Override + public void delete(ProjectNatureEntity entity) { + } + + @Override + public void deleteAllById(Iterable ids) { + } + + @Override + public void deleteAll(Iterable entities) { + } + + @Override + public void deleteAll() { + } + + @Override + public S save(S projectNatureEntity) { + return null; + } + + @Override + public List findAllByProjectId(UUID projectId) { + return null; + } + +} diff --git a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/projects/ProjectServiceTests.java b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/projects/ProjectServiceTests.java index 34123a8f7f1..cfbb7ee2641 100644 --- a/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/projects/ProjectServiceTests.java +++ b/packages/sirius-web/backend/sirius-web-services/src/test/java/org/eclipse/sirius/web/services/projects/ProjectServiceTests.java @@ -23,6 +23,7 @@ import org.eclipse.sirius.components.core.api.IEditingContextSearchService; import org.eclipse.sirius.components.core.api.IPayload; import org.eclipse.sirius.web.persistence.entities.ProjectEntity; +import org.eclipse.sirius.web.persistence.repositories.IProjectNatureRepository; import org.eclipse.sirius.web.persistence.repositories.IProjectRepository; import org.eclipse.sirius.web.services.api.projects.CreateProjectInput; import org.eclipse.sirius.web.services.api.projects.CreateProjectSuccessPayload; @@ -62,7 +63,9 @@ public boolean existsById(String editingContextId) { } }; - private ProjectService projectService = new ProjectService(this.noOpMessageService, this.noOpProjectRepository, new IProjectTemplateService.NoOp(), this.noOpEditingContextSearchService, + private IProjectNatureRepository noOpProjectNatureRepository = new NoOpProjectNatureRepository(); + + private ProjectService projectService = new ProjectService(this.noOpMessageService, this.noOpProjectRepository, this.noOpProjectNatureRepository, new IProjectTemplateService.NoOp(), this.noOpEditingContextSearchService, new IEditingContextPersistenceService.NoOp()); @Test diff --git a/packages/sirius-web/backend/sirius-web-spring/.settings/org.eclipse.jdt.ui.prefs b/packages/sirius-web/backend/sirius-web-spring/.settings/org.eclipse.jdt.ui.prefs index 0df830c546f..f789e687ad4 100644 --- a/packages/sirius-web/backend/sirius-web-spring/.settings/org.eclipse.jdt.ui.prefs +++ b/packages/sirius-web/backend/sirius-web-spring/.settings/org.eclipse.jdt.ui.prefs @@ -96,7 +96,7 @@ 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=true +sp_cleanup.correct_indentation=false sp_cleanup.do_while_rather_than_while=false sp_cleanup.double_negation=false sp_cleanup.else_if=false diff --git a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx index a0b658da240..a976468847b 100644 --- a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx @@ -24,8 +24,6 @@ import { makeStyles } from '@material-ui/core/styles'; import { Close as CloseIcon, NoteAdd } from '@material-ui/icons'; import { useEffect, useState } from 'react'; import { - GQLCreateDocumentMutationInput, - GQLCreateDocumentMutationVariables, GQLInvokeEditingContextActionInput, GQLInvokeEditingContextActionVariables, NewDocumentAreaProps, @@ -42,17 +40,6 @@ const useNewDocumentAreaStyles = makeStyles((theme) => ({ }, })); -const createDocumentMutation = gql` - mutation createDocument($input: CreateDocumentInput!) { - createDocument(input: $input) { - __typename - ... on ErrorPayload { - message - } - } - } -`; - const invokeEditingContextActionMutation = gql` mutation invokeEditingContextAction($input: InvokeEditingContextActionInput!) { invokeEditingContextAction(input: $input) { @@ -64,47 +51,12 @@ const invokeEditingContextActionMutation = gql` } `; -export const NewDocumentArea = ({ - editingContextId, - stereotypeDescriptions, - editingContextActions, - readOnly, -}: NewDocumentAreaProps) => { +export const NewDocumentArea = ({ editingContextId, editingContextActions, readOnly }: NewDocumentAreaProps) => { const classes = useNewDocumentAreaStyles(); const [state, setState] = useState({ message: null, }); - // Document creation - const [createDocument, { loading, data, error }] = useMutation(createDocumentMutation); - const onCreateDocument = (stereotypeDescriptionId: string) => { - const selected = stereotypeDescriptions.find((candidate) => candidate.id === stereotypeDescriptionId); - const input: GQLCreateDocumentMutationInput = { - id: crypto.randomUUID(), - editingContextId, - name: selected.documentName, - stereotypeDescriptionId, - }; - const variables: GQLCreateDocumentMutationVariables = { - input, - }; - createDocument({ variables }); - }; - - useEffect(() => { - if (!loading) { - if (error) { - setState({ message: 'An unexpected error has occurred, please refresh the page' }); - } - if (data) { - const { createDocument } = data; - if (createDocument.__typename === 'ErrorPayload') { - setState({ message: createDocument.message }); - } - } - } - }, [loading, error, data]); - // EditingContext Action invocation const [ invokeEditingContextAction, @@ -146,26 +98,6 @@ export const NewDocumentArea = ({ {readOnly ? 'You need edit access to create models' : 'Select the model to create'} - {readOnly - ? null - : stereotypeDescriptions.map((stereotypeDescription) => { - return ( - { - onCreateDocument(stereotypeDescription.id); - }}> - - - - - - ); - })} {readOnly ? null : editingContextActions.map((editingContextAction) => { diff --git a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.types.ts b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.types.ts index f2f7b013589..2cf3ef847fb 100644 --- a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.types.ts +++ b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.types.ts @@ -15,11 +15,6 @@ import { Selection } from '@eclipse-sirius/sirius-components-core'; export interface NewDocumentAreaState { message: string; } -export interface StereotypeDescription { - id: string; - label: string; - documentName: string; -} export interface EditingContextAction { id: string; @@ -28,7 +23,6 @@ export interface EditingContextAction { export interface NewDocumentAreaProps { editingContextId: string; - stereotypeDescriptions: StereotypeDescription[]; editingContextActions: EditingContextAction[]; setSelection: (selection: Selection) => void; readOnly: boolean; diff --git a/packages/sirius-web/frontend/sirius-web/src/onboarding/OnboardArea.tsx b/packages/sirius-web/frontend/sirius-web/src/onboarding/OnboardArea.tsx index a05d3a1ce9f..1f9ef4d994c 100644 --- a/packages/sirius-web/frontend/sirius-web/src/onboarding/OnboardArea.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/onboarding/OnboardArea.tsx @@ -22,15 +22,6 @@ const getOnboardDataQuery = gql` query getOnboardData($editingContextId: ID!, $objectId: ID!) { viewer { editingContext(editingContextId: $editingContextId) { - stereotypeDescriptions { - edges { - node { - id - label - documentName - } - } - } representationDescriptions(objectId: $objectId) { edges { node { @@ -63,7 +54,6 @@ const getOnboardDataQuery = gql` `; const INITIAL_STATE = { - stereotypeDescriptions: [], editingContextActions: [], representationDescriptions: [], representations: [], @@ -89,7 +79,7 @@ const useOnboardAreaStyles = makeStyles((theme) => ({ export const OnboardArea = ({ editingContextId, selection, setSelection, readOnly }: MainAreaComponentProps) => { const classes = useOnboardAreaStyles(); const [state, setState] = useState(INITIAL_STATE); - const { stereotypeDescriptions, editingContextActions, representationDescriptions, representations } = state; + const { editingContextActions, representationDescriptions, representations } = state; const objectId = selection.entries.length > 0 ? selection.entries[0].id : ''; @@ -101,7 +91,6 @@ export const OnboardArea = ({ editingContextId, selection, setSelection, readOnl if (!loading && !error && data?.viewer) { const { viewer } = data; const representations = viewer.editingContext.representations.edges.map((edge) => edge.node); - const stereotypeDescriptions = viewer.editingContext.stereotypeDescriptions.edges.map((edge) => edge.node); const editingContextActions = viewer.editingContext.actions.edges.map((edge) => edge.node); const representationDescriptions = viewer.editingContext.representationDescriptions.edges.map( (edge) => edge.node @@ -109,7 +98,6 @@ export const OnboardArea = ({ editingContextId, selection, setSelection, readOnl setState({ representations, - stereotypeDescriptions, editingContextActions, representationDescriptions, }); @@ -121,7 +109,6 @@ export const OnboardArea = ({ editingContextId, selection, setSelection, readOnl