diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationApplicationService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationApplicationService.java index ef937f49c6..f084791a4c 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationApplicationService.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationApplicationService.java @@ -22,7 +22,7 @@ import org.eclipse.sirius.web.application.UUIDParser; import org.eclipse.sirius.web.application.representation.services.api.IRepresentationApplicationService; import org.eclipse.sirius.web.domain.boundedcontexts.project.Project; -import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationData; +import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataMetadataOnly; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationDataSearchService; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -49,10 +49,10 @@ public RepresentationApplicationService(IRepresentationDataSearchService represe public Page findAllByEditingContextId(String editingContextId, Pageable pageable) { var representationData = new UUIDParser().parse(editingContextId) .map(AggregateReference::to) - .map(this.representationDataSearchService::findAllByProject) + .map(this.representationDataSearchService::findAllMetadataByProject) .orElse(List.of()) .stream() - .sorted(Comparator.comparing(RepresentationData::getLabel)) + .sorted(Comparator.comparing(RepresentationDataMetadataOnly::label)) .toList(); int startIndex = (int) pageable.getOffset() * pageable.getPageSize(); @@ -63,8 +63,8 @@ public Page findAllByEditingContextId(String editingCont return new PageImpl<>(representationMetadata, pageable, representationData.size()); } - private RepresentationMetadata toRepresentationMetadata(RepresentationData representationData) { - return new RepresentationMetadata(representationData.getId().toString(), representationData.getKind(), representationData.getLabel(), representationData.getDescriptionId()); + private RepresentationMetadata toRepresentationMetadata(RepresentationDataMetadataOnly representationData) { + return new RepresentationMetadata(representationData.id().toString(), representationData.kind(), representationData.label(), representationData.descriptionId()); } @Override diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationMetadataSearchService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationMetadataSearchService.java index d6b7a8ae64..407d4bb0a4 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationMetadataSearchService.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationMetadataSearchService.java @@ -55,9 +55,9 @@ public Optional findByRepresentation(IRepresentation rep @Override public List findAllByTargetObjectId(IEditingContext editingContext, String targetObjectId) { - return this.representationDataSearchService.findAllByTargetObjectId(targetObjectId) + return this.representationDataSearchService.findAllMetadataByTargetObjectId(targetObjectId) .stream() - .map(representation -> new RepresentationMetadata(representation.getId().toString(), representation.getKind(), representation.getLabel(), representation.getDescriptionId())) + .map(representation -> new RepresentationMetadata(representation.id().toString(), representation.kind(), representation.label(), representation.descriptionId())) .toList(); } } diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationSearchService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationSearchService.java index 52fb3e2c34..b6358f3f61 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationSearchService.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/representation/services/RepresentationSearchService.java @@ -28,7 +28,7 @@ import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.representations.IRepresentation; import org.eclipse.sirius.web.application.UUIDParser; -import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationData; +import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataContentOnly; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationDataSearchService; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationDataUpdateService; import org.slf4j.Logger; @@ -60,7 +60,7 @@ public RepresentationSearchService(IRepresentationDataSearchService representati @Override public Optional findById(IEditingContext editingContext, String representationId, Class representationClass) { return new UUIDParser().parse(representationId) - .flatMap(this.representationDataSearchService::findById) + .flatMap(this.representationDataSearchService::findContentById) .map(this::migratedContent) .flatMap(this::toRepresentation) .filter(representationClass::isInstance) @@ -80,11 +80,11 @@ private Optional toRepresentation(String content) { return optionalRepresentation; } - private String migratedContent(RepresentationData representationData) { + private String migratedContent(RepresentationDataContentOnly representationData) { List applicableParticipants = this.getApplicableMigrationParticipants(representationData); if (!applicableParticipants.isEmpty()) { try { - JsonNode rootJsonNode = this.objectMapper.readTree(representationData.getContent()); + JsonNode rootJsonNode = this.objectMapper.readTree(representationData.content()); ObjectNode rootObjectNode = (ObjectNode) rootJsonNode; var migrationService = new RepresentationMigrationService(applicableParticipants, rootObjectNode); migrationService.parseProperties(rootObjectNode, this.objectMapper); @@ -93,13 +93,13 @@ private String migratedContent(RepresentationData representationData) { this.logger.warn(exception.getMessage()); } } - return representationData.getContent(); + return representationData.content(); } - private List getApplicableMigrationParticipants(RepresentationData representationData) { - var migrationVersion = representationData.getMigrationVersion(); - var kind = representationData.getKind(); + private List getApplicableMigrationParticipants(RepresentationDataContentOnly representationData) { + var migrationVersion = representationData.migrationVersion(); + var kind = representationData.kind(); return this.migrationParticipants.stream() .filter(migrationParticipant -> Objects.equals(migrationParticipant.getKind(), kind)) diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/explorer/services/ExplorerNavigationService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/explorer/services/ExplorerNavigationService.java index 3fc1682ef0..87cbd2f86e 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/explorer/services/ExplorerNavigationService.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/explorer/services/ExplorerNavigationService.java @@ -24,7 +24,7 @@ import org.eclipse.sirius.components.core.api.IObjectSearchService; import org.eclipse.sirius.web.application.UUIDParser; import org.eclipse.sirius.web.application.views.explorer.services.api.IExplorerNavigationService; -import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationData; +import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataMetadataOnly; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationDataSearchService; import org.springframework.stereotype.Service; @@ -52,13 +52,13 @@ public ExplorerNavigationService(IIdentityService identityService, IObjectSearch public List getAncestors(IEditingContext editingContext, String treeItemId) { List ancestorsIds = new ArrayList<>(); - var optionalRepresentation = new UUIDParser().parse(treeItemId).flatMap(this.representationDataSearchService::findById); + var optionalRepresentationMetadata = new UUIDParser().parse(treeItemId).flatMap(this.representationDataSearchService::findMetadataById); var optionalSemanticObject = this.objectSearchService.getObject(editingContext, treeItemId); Optional optionalObject = Optional.empty(); - if (optionalRepresentation.isPresent()) { + if (optionalRepresentationMetadata.isPresent()) { // The first parent of a representation item is the item for its targetObject. - optionalObject = optionalRepresentation.map(RepresentationData::getTargetObjectId) + optionalObject = optionalRepresentationMetadata.map(RepresentationDataMetadataOnly::targetObjectId) .flatMap(objectId -> this.objectSearchService.getObject(editingContext, objectId)); } else if (optionalSemanticObject.isPresent()) { // The first parent of a semantic object item is the item for its actual container diff --git a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/ProjectUpdateService.java b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/ProjectUpdateService.java index af6244f7ed..5723389b78 100644 --- a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/ProjectUpdateService.java +++ b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/ProjectUpdateService.java @@ -62,7 +62,41 @@ public IResult renameProject(UUID projectId, String newName) { result = new Success<>(null); } + return result; + } + + @Override + public IResult addNature(UUID projectId, String natureName) { + IResult result = null; + + var optionalProject = this.projectRepository.findById(projectId); + if (optionalProject.isEmpty()) { + result = new Failure<>(this.messageService.notFound()); + } else { + var project = optionalProject.get(); + project.addNature(natureName); + + this.projectRepository.save(project); + result = new Success<>(null); + } + return result; + } + + @Override + public IResult removeNature(UUID projectId, String natureName) { + IResult result = null; + + var optionalProject = this.projectRepository.findById(projectId); + if (optionalProject.isEmpty()) { + result = new Failure<>(this.messageService.notFound()); + } else { + var project = optionalProject.get(); + project.removeNature(natureName); + + this.projectRepository.save(project); + result = new Success<>(null); + } return result; } diff --git a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/api/IProjectUpdateService.java b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/api/IProjectUpdateService.java index 08ff42c20d..a9d6694d0b 100644 --- a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/api/IProjectUpdateService.java +++ b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/project/services/api/IProjectUpdateService.java @@ -23,4 +23,8 @@ */ public interface IProjectUpdateService { IResult renameProject(UUID projectId, String newName); + + IResult addNature(UUID projectId, String natureName); + + IResult removeNature(UUID projectId, String natureName); } diff --git a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/projections/RepresentationDataContentOnly.java b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/projections/RepresentationDataContentOnly.java new file mode 100644 index 0000000000..003939e7ae --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/projections/RepresentationDataContentOnly.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2024 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections; + +/** + * Projection used to retrieve only the content and its associated data from the representation data. + * + * @author sbegaudeau + */ +public record RepresentationDataContentOnly( + String kind, + String content, + String lastMigrationPerformed, + String migrationVersion) { +} diff --git a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/repositories/IRepresentationDataRepository.java b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/repositories/IRepresentationDataRepository.java index 17eeaa9dd9..9d54b9b9f8 100644 --- a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/repositories/IRepresentationDataRepository.java +++ b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/repositories/IRepresentationDataRepository.java @@ -17,6 +17,7 @@ import java.util.UUID; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationData; +import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataContentOnly; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataMetadataOnly; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.ListCrudRepository; @@ -31,25 +32,32 @@ @Repository public interface IRepresentationDataRepository extends ListPagingAndSortingRepository, ListCrudRepository { @Query(""" - SELECT id, label, kind, target_object_id, description_id - FROM representation_data representationData - WHERE representationData.id = :id - """) + SELECT id, label, kind, target_object_id, description_id + FROM representation_data representationData + WHERE representationData.id = :id + """) Optional findMetadataById(UUID id); @Query(""" - SELECT * + SELECT id, label, kind, target_object_id, description_id FROM representation_data representationData WHERE representationData.project_id = :projectId """) - List findAllByProjectId(UUID projectId); + List findAllMetadataByProjectId(UUID projectId); @Query(""" SELECT id, label, kind, target_object_id, description_id FROM representation_data representationData - WHERE representationData.project_id = :projectId + WHERE representationData.target_object_id = :targetObjectId """) - List findAllMetadataByProjectId(UUID projectId); + List findAllMetadataByTargetObjectId(String targetObjectId); + + @Query(""" + SELECT kind, content, last_migration_performed, migration_version + FROM representation_data representationData + WHERE representationData.id = :id + """) + Optional findContentById(UUID id); @Query(""" SELECT representationData.project_id @@ -64,11 +72,4 @@ SELECT CASE WHEN COUNT(*) > 0 THEN true ELSE false END WHERE representationData.target_object_id = :targetObjectId """) boolean existAnyRepresentationForTargetObjectId(String targetObjectId); - - @Query(""" - SELECT * - FROM representation_data representationData - WHERE representationData.target_object_id = :targetObjectId - """) - List findAllByTargetObjectId(String targetObjectId); } diff --git a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/RepresentationDataSearchService.java b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/RepresentationDataSearchService.java index 8042424439..1a981cea8a 100644 --- a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/RepresentationDataSearchService.java +++ b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/RepresentationDataSearchService.java @@ -18,7 +18,7 @@ import java.util.UUID; import org.eclipse.sirius.web.domain.boundedcontexts.project.Project; -import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationData; +import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataContentOnly; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataMetadataOnly; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.repositories.IRepresentationDataRepository; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationDataSearchService; @@ -45,8 +45,8 @@ public boolean existsById(UUID id) { } @Override - public Optional findById(UUID id) { - return this.representationDataRepository.findById(id); + public Optional findContentById(UUID id) { + return this.representationDataRepository.findContentById(id); } @Override @@ -54,24 +54,19 @@ public Optional findMetadataById(UUID id) { return this.representationDataRepository.findMetadataById(id); } - @Override - public List findAllByProject(AggregateReference project) { - return this.representationDataRepository.findAllByProjectId(project.getId()); - } - @Override public List findAllMetadataByProject(AggregateReference project) { return this.representationDataRepository.findAllMetadataByProjectId(project.getId()); } @Override - public boolean existAnyRepresentationForTargetObjectId(String targetObjectId) { - return this.representationDataRepository.existAnyRepresentationForTargetObjectId(targetObjectId); + public List findAllMetadataByTargetObjectId(String targetObjectId) { + return this.representationDataRepository.findAllMetadataByTargetObjectId(targetObjectId); } @Override - public List findAllByTargetObjectId(String targetObjectId) { - return this.representationDataRepository.findAllByTargetObjectId(targetObjectId); + public boolean existAnyRepresentationForTargetObjectId(String targetObjectId) { + return this.representationDataRepository.existAnyRepresentationForTargetObjectId(targetObjectId); } @Override diff --git a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/api/IRepresentationDataSearchService.java b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/api/IRepresentationDataSearchService.java index 540d4b416c..2055899db9 100644 --- a/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/api/IRepresentationDataSearchService.java +++ b/packages/sirius-web/backend/sirius-web-domain/src/main/java/org/eclipse/sirius/web/domain/boundedcontexts/representationdata/services/api/IRepresentationDataSearchService.java @@ -17,7 +17,7 @@ import java.util.UUID; import org.eclipse.sirius.web.domain.boundedcontexts.project.Project; -import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationData; +import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataContentOnly; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.projections.RepresentationDataMetadataOnly; import org.springframework.data.jdbc.core.mapping.AggregateReference; @@ -30,17 +30,15 @@ public interface IRepresentationDataSearchService { boolean existsById(UUID id); - Optional findById(UUID id); + Optional findContentById(UUID id); Optional findMetadataById(UUID id); - List findAllByProject(AggregateReference project); - List findAllMetadataByProject(AggregateReference project); - boolean existAnyRepresentationForTargetObjectId(String targetObjectId); + List findAllMetadataByTargetObjectId(String targetObjectId); - List findAllByTargetObjectId(String targetObjectId); + boolean existAnyRepresentationForTargetObjectId(String targetObjectId); Optional> findProjectByRepresentationId(UUID representationId); } diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/representations/RepresentationLifecycleControllerIntegrationTests.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/representations/RepresentationLifecycleControllerIntegrationTests.java index 3de3e0eb32..71766814eb 100644 --- a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/representations/RepresentationLifecycleControllerIntegrationTests.java +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/representations/RepresentationLifecycleControllerIntegrationTests.java @@ -120,7 +120,7 @@ public void givenRepresentationToCreateWhenMutationIsPerformedThenTheRepresentat var event = this.domainEventCollector.getDomainEvents().get(0); assertThat(event).isInstanceOf(RepresentationDataCreatedEvent.class); - assertThat(this.representationDataSearchService.findById(UUID.fromString(representationId))).isPresent(); + assertThat(this.representationDataSearchService.existsById(UUID.fromString(representationId))).isTrue(); } @Test @@ -159,7 +159,7 @@ public void givenRepresentationToRenameWhenMutationIsPerformedThenTheRepresentat public void givenRepresentationToDeleteWhenMutationIsPerformedThenTheRepresentationHasBeenDeleted() { this.givenCommittedTransaction.commit(); - assertThat(this.representationDataSearchService.findById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION)).isPresent(); + assertThat(this.representationDataSearchService.existsById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION)).isTrue(); var input = new DeleteRepresentationInput(UUID.randomUUID(), TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION.toString()); var result = this.deleteRepresentationMutationRunner.run(input); @@ -170,7 +170,7 @@ public void givenRepresentationToDeleteWhenMutationIsPerformedThenTheRepresentat String typename = JsonPath.read(result, "$.data.deleteRepresentation.__typename"); assertThat(typename).isEqualTo(DeleteRepresentationSuccessPayload.class.getSimpleName()); - assertThat(this.representationDataSearchService.findById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION)).isEmpty(); + assertThat(this.representationDataSearchService.existsById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION)).isFalse(); assertThat(this.domainEventCollector.getDomainEvents()).hasSize(1); var event = this.domainEventCollector.getDomainEvents().get(0); diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/services/ProjectNatureTests.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/services/ProjectNatureTests.java new file mode 100644 index 0000000000..9f3fbaac57 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/services/ProjectNatureTests.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2024 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.web.application.services; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.eclipse.sirius.web.AbstractIntegrationTests; +import org.eclipse.sirius.web.data.TestIdentifiers; +import org.eclipse.sirius.web.domain.boundedcontexts.project.Nature; +import org.eclipse.sirius.web.domain.boundedcontexts.project.Project; +import org.eclipse.sirius.web.domain.boundedcontexts.project.services.api.IProjectSearchService; +import org.eclipse.sirius.web.domain.boundedcontexts.project.services.api.IProjectUpdateService; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; +import org.springframework.transaction.annotation.Transactional; + +/** + * Used to test the manipulation of project nature. + * + * @author sbegaudeau + */ +@Transactional +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class ProjectNatureTests extends AbstractIntegrationTests { + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IProjectSearchService projectSearchService; + + @Autowired + private IProjectUpdateService projectUpdateService; + + @Test + @DisplayName("Given a project, when a nature is added, then the new nature is visible") + @Sql(scripts = {"/scripts/initialize.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"/scripts/cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + public void givenProjectWhenNatureIsAddedThenTheNewNatureIsVisible() { + var optionalProject = this.projectSearchService.findById(TestIdentifiers.SYSML_SAMPLE_PROJECT); + assertThat(optionalProject) + .isPresent() + .get() + .satisfies(project -> assertThat(project.getNatures()).hasSize(1)); + + var projectId = optionalProject.map(Project::getId).orElseThrow(IllegalStateException::new); + this.projectUpdateService.addNature(projectId, "new nature"); + + optionalProject = this.projectSearchService.findById(TestIdentifiers.SYSML_SAMPLE_PROJECT); + assertThat(optionalProject) + .isPresent() + .get() + .satisfies(project -> assertThat(project.getNatures()).hasSize(2)); + } + + @Test + @DisplayName("Given a project, when a nature is removed, then the nature is not visible anymore") + @Sql(scripts = {"/scripts/initialize.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"/scripts/cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + public void givenProjectWhenNatureIsRemovedThenTheNatureIsNotVisibleAnymore() { + var optionalProject = this.projectSearchService.findById(TestIdentifiers.SYSML_SAMPLE_PROJECT); + assertThat(optionalProject) + .isPresent() + .get() + .satisfies(project -> assertThat(project.getNatures()).hasSize(1)); + + var projectId = optionalProject.map(Project::getId).orElseThrow(IllegalStateException::new); + var existingNature = optionalProject.flatMap(project -> project.getNatures().stream().map(Nature::name).findFirst()) + .orElseThrow(IllegalStateException::new); + this.projectUpdateService.removeNature(projectId, existingNature); + + optionalProject = this.projectSearchService.findById(TestIdentifiers.SYSML_SAMPLE_PROJECT); + assertThat(optionalProject) + .isPresent() + .get() + .satisfies(project -> assertThat(project.getNatures()).hasSize(0)); + } +} diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/domain/DomainEventsTest.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/domain/DomainEventsTest.java index 870a5f8d70..e9730529e3 100644 --- a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/domain/DomainEventsTest.java +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/domain/DomainEventsTest.java @@ -202,14 +202,15 @@ public void givenDocumentWhenContentModifiedDomainEventPublished() { @Sql(scripts = {"/scripts/cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) public void givenRepresentationWhenContentModifiedDomainEventPublished() { assertThat(this.domainEventCollector.getDomainEvents()).isEmpty(); - var optionalRepresentationData = this.representationDataSearchService.findById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION); + var optionalRepresentationData = this.representationDataSearchService.findContentById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION); assertThat(optionalRepresentationData).isPresent(); var representationData = optionalRepresentationData.get(); - var originalContent = representationData.getContent(); + var originalContent = representationData.content(); var newContent = originalContent + "modified"; - this.representationDataUpdateService.updateContent(representationData.getId(), newContent); + + this.representationDataUpdateService.updateContent(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION, newContent); TestTransaction.flagForCommit(); TestTransaction.end(); @@ -224,13 +225,13 @@ public void givenRepresentationWhenContentModifiedDomainEventPublished() { @Sql(scripts = {"/scripts/cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) public void givenRepresentationWhenContentNotModifiedNoDomainEventPublished() { assertThat(this.domainEventCollector.getDomainEvents()).isEmpty(); - var optionalRepresentationData = this.representationDataSearchService.findById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION); + var optionalRepresentationData = this.representationDataSearchService.findContentById(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION); assertThat(optionalRepresentationData).isPresent(); var representationData = optionalRepresentationData.get(); - var newContent = representationData.getContent(); - this.representationDataUpdateService.updateContent(representationData.getId(), newContent); + var newContent = representationData.content(); + this.representationDataUpdateService.updateContent(TestIdentifiers.EPACKAGE_PORTAL_REPRESENTATION, newContent); TestTransaction.flagForCommit(); TestTransaction.end(); diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/migration/RepresentationMigrationParticipantTests.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/migration/RepresentationMigrationParticipantTests.java index ba0fd0b6d6..82f210f691 100644 --- a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/migration/RepresentationMigrationParticipantTests.java +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/migration/RepresentationMigrationParticipantTests.java @@ -14,15 +14,12 @@ import static org.assertj.core.api.Assertions.assertThat; -import java.util.Optional; - import org.eclipse.sirius.components.charts.hierarchy.Hierarchy; import org.eclipse.sirius.components.collaborative.api.IRepresentationPersistenceService; import org.eclipse.sirius.components.collaborative.api.IRepresentationSearchService; import org.eclipse.sirius.components.core.api.IEditingContextSearchService; import org.eclipse.sirius.web.AbstractIntegrationTests; import org.eclipse.sirius.web.data.MigrationIdentifiers; -import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationData; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationDataSearchService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -69,13 +66,13 @@ public void givenProjectWithAnOldHierarchyRepresentationWhenTheRepresentationIsL this.representationPersistenceService.save(optionalEditingContext.get(), optionalRepresentation.get()); - Optional optionalUpdatedRepresentationData = this.representationDataSearchService.findById(MigrationIdentifiers.MIGRATION_STUDIO_DIAGRAM_HIERARCHY); + var optionalUpdatedRepresentationData = this.representationDataSearchService.findContentById(MigrationIdentifiers.MIGRATION_STUDIO_DIAGRAM_HIERARCHY); assertThat(optionalUpdatedRepresentationData).isPresent(); var updatedRepresentationData = optionalUpdatedRepresentationData.get(); - assertThat(updatedRepresentationData.getMigrationVersion()).isEqualTo("2024.4.3-202405130907"); - assertThat(updatedRepresentationData.getLastMigrationPerformed()).isEqualTo("HierarchyChildrenAttributeMigration"); + assertThat(updatedRepresentationData.migrationVersion()).isEqualTo("2024.4.3-202405130907"); + assertThat(updatedRepresentationData.lastMigrationPerformed()).isEqualTo("HierarchyChildrenAttributeMigration"); } } diff --git a/scripts/check-coverage.jsh b/scripts/check-coverage.jsh index 8336237be5..b812d132a9 100644 --- a/scripts/check-coverage.jsh +++ b/scripts/check-coverage.jsh @@ -35,23 +35,23 @@ var moduleCoverageData = List.of( new ModuleCoverage("sirius-components-representations", 76.0), new ModuleCoverage("sirius-components-core", 73.0), new ModuleCoverage("sirius-components-collaborative", 88.0), - new ModuleCoverage("sirius-components-graphql-api", 53.0), + new ModuleCoverage("sirius-components-graphql-api", 58.0), new ModuleCoverage("sirius-components-charts", 76.0), - new ModuleCoverage("sirius-components-collaborative-charts", 81.0), - new ModuleCoverage("sirius-components-diagrams", 79.0), + new ModuleCoverage("sirius-components-collaborative-charts", 84.0), + new ModuleCoverage("sirius-components-diagrams", 80.0), new ModuleCoverage("sirius-components-collaborative-diagrams", 75.0), new ModuleCoverage("sirius-components-diagrams-graphql", 38.0), - new ModuleCoverage("sirius-components-gantt", 88.0), - new ModuleCoverage("sirius-components-collaborative-gantt", 65.0), - new ModuleCoverage("sirius-components-gantt-graphql", 77.0), + new ModuleCoverage("sirius-components-gantt", 91.0), + new ModuleCoverage("sirius-components-collaborative-gantt", 74.0), + new ModuleCoverage("sirius-components-gantt-graphql", 85.0), new ModuleCoverage("sirius-components-deck", 90.0), - new ModuleCoverage("sirius-components-collaborative-deck", 46.0), + new ModuleCoverage("sirius-components-collaborative-deck", 47.0), new ModuleCoverage("sirius-components-deck-graphql", 55.0), new ModuleCoverage("sirius-components-forms", 82.0), new ModuleCoverage("sirius-components-collaborative-forms", 92.0), new ModuleCoverage("sirius-components-forms-graphql", 76.0), new ModuleCoverage("sirius-components-widget-reference", 83.0), - new ModuleCoverage("sirius-components-collaborative-widget-reference", 55.0), + new ModuleCoverage("sirius-components-collaborative-widget-reference", 56.0), new ModuleCoverage("sirius-components-widget-reference-graphql", 44.0), new ModuleCoverage("sirius-components-formdescriptioneditors", 76.0), new ModuleCoverage("sirius-components-collaborative-formdescriptioneditors", 86.0), @@ -80,26 +80,26 @@ var moduleCoverageData = List.of( new ModuleCoverage("sirius-components-domain-design", 29.0), new ModuleCoverage("sirius-components-domain-emf", 98.0), new ModuleCoverage("sirius-components-view", 63.0), - new ModuleCoverage("sirius-components-view-edit", 32.0), + new ModuleCoverage("sirius-components-view-edit", 39.0), new ModuleCoverage("sirius-components-view-diagram", 58.0), - new ModuleCoverage("sirius-components-view-diagram-edit", 17.0), + new ModuleCoverage("sirius-components-view-diagram-edit", 20.0), new ModuleCoverage("sirius-components-view-form", 49.0), new ModuleCoverage("sirius-components-view-form-edit", 1.0), new ModuleCoverage("sirius-components-widget-reference-view", 34.0), new ModuleCoverage("sirius-components-widget-reference-view-edit", 4.0), - new ModuleCoverage("sirius-components-view-gantt", 50.0), + new ModuleCoverage("sirius-components-view-gantt", 57.0), new ModuleCoverage("sirius-components-view-gantt-edit", 7.0), new ModuleCoverage("sirius-components-view-deck", 44.0), new ModuleCoverage("sirius-components-view-deck-edit", 4.0), new ModuleCoverage("sirius-components-view-emf", 71.0), - new ModuleCoverage("sirius-components-view-builder", 38.0), + new ModuleCoverage("sirius-components-view-builder", 39.0), new ModuleCoverage("sirius-components-task", 58.0), new ModuleCoverage("sirius-components-task-edit", 3.0), new ModuleCoverage("sirius-components-task-starter", 73.0), new ModuleCoverage("sirius-components-flow-starter", 79.0), new ModuleCoverage("sirius-components-view-diagram-customnodes", 57.0), new ModuleCoverage("sirius-components-view-diagram-customnodes-edit", 62.0), - new ModuleCoverage("sirius-web-domain", 88.0), + new ModuleCoverage("sirius-web-domain", 91.0), new ModuleCoverage("sirius-web-application", 93.0), new ModuleCoverage("sirius-web-infrastructure", 88.0), new ModuleCoverage("sirius-web-starter", 98.0),