Skip to content

Commit

Permalink
[3019] Restore the automatic loading of the default palette in studios
Browse files Browse the repository at this point in the history
Bug: #3019
Signed-off-by: Stéphane Bégaudeau <stephane.begaudeau@obeo.fr>
  • Loading branch information
sbegaudeau committed Mar 19, 2024
1 parent 2c93cf3 commit 036fd3a
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 63 deletions.
Expand Up @@ -13,6 +13,7 @@
package org.eclipse.sirius.web.application.editingcontext.services;

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
Expand All @@ -23,12 +24,11 @@
import org.eclipse.sirius.components.core.api.IEditingContextPersistenceService;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.web.application.UUIDParser;
import org.eclipse.sirius.web.application.editingcontext.services.api.IEditingContextPersistenceFilter;
import org.eclipse.sirius.web.application.editingcontext.services.api.IResourceToDocumentService;
import org.eclipse.sirius.web.domain.boundedcontexts.project.Project;
import org.eclipse.sirius.web.domain.boundedcontexts.semanticdata.Document;
import org.eclipse.sirius.web.domain.boundedcontexts.semanticdata.services.api.ISemanticDataUpdateService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.jdbc.core.mapping.AggregateReference;
import org.springframework.stereotype.Service;

Expand All @@ -49,13 +49,14 @@ public class EditingContextPersistenceService implements IEditingContextPersiste

private final IResourceToDocumentService resourceToDocumentService;

private final Timer timer;
private final List<IEditingContextPersistenceFilter> persistenceFilters;

private final Logger logger = LoggerFactory.getLogger(EditingContextPersistenceService.class);
private final Timer timer;

public EditingContextPersistenceService(ISemanticDataUpdateService semanticDataUpdateService, IResourceToDocumentService resourceToDocumentService, MeterRegistry meterRegistry) {
public EditingContextPersistenceService(ISemanticDataUpdateService semanticDataUpdateService, IResourceToDocumentService resourceToDocumentService, List<IEditingContextPersistenceFilter> persistenceFilters, MeterRegistry meterRegistry) {
this.semanticDataUpdateService = Objects.requireNonNull(semanticDataUpdateService);
this.resourceToDocumentService = Objects.requireNonNull(resourceToDocumentService);
this.persistenceFilters = Objects.requireNonNull(persistenceFilters);
this.timer = Timer.builder(TIMER_NAME).register(meterRegistry);
}

Expand All @@ -67,7 +68,10 @@ public void persist(IEditingContext editingContext) {
new UUIDParser().parse(editingContext.getId())
.map(AggregateReference::<Project, UUID>to)
.ifPresent(project -> {

var documentData = emfEditingContext.getDomain().getResourceSet().getResources().stream()
.filter(resource -> IEMFEditingContext.RESOURCE_SCHEME.equals(resource.getURI().scheme()))
.filter(resource -> this.persistenceFilters.stream().allMatch(filter -> filter.shouldPersist(resource)))
.map(this.resourceToDocumentService::toDocument)
.flatMap(Optional::stream)
.collect(Collectors.toSet());
Expand Down
@@ -0,0 +1,24 @@
/*******************************************************************************
* 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.editingcontext.services.api;

import org.eclipse.emf.ecore.resource.Resource;

/**
* Used to indicate if some resources should be persisted or not.
*
* @author sbegaudeau
*/
public interface IEditingContextPersistenceFilter {
boolean shouldPersist(Resource resource);
}

This file was deleted.

@@ -0,0 +1,100 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.sirius.web.application.studio.services;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IEditingContextProcessor;
import org.eclipse.sirius.components.domain.DomainPackage;
import org.eclipse.sirius.components.emf.ResourceMetadataAdapter;
import org.eclipse.sirius.components.emf.services.JSONResourceFactory;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.components.view.View;
import org.eclipse.sirius.components.view.ViewPackage;
import org.eclipse.sirius.components.view.deck.DeckPackage;
import org.eclipse.sirius.components.view.deck.adapters.DeckColorAdapter;
import org.eclipse.sirius.components.view.diagram.DiagramPackage;
import org.eclipse.sirius.components.view.diagram.adapters.DiagramColorAdapter;
import org.eclipse.sirius.components.view.form.FormPackage;
import org.eclipse.sirius.components.view.form.adapters.FormColorAdapter;
import org.eclipse.sirius.components.view.gantt.GanttPackage;
import org.eclipse.sirius.web.application.studio.services.api.IStudioCapableEditingContextPredicate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

/**
* Used to provide the studio related features for the relevant editing context.
*
* @author sbegaudeau
*/
@Service
public class StudioEditingContextInitializer implements IEditingContextProcessor {

private final IStudioCapableEditingContextPredicate studioCapableEditingContextPredicate;

private final Logger logger = LoggerFactory.getLogger(StudioEditingContextInitializer.class);

public StudioEditingContextInitializer(IStudioCapableEditingContextPredicate studioCapableEditingContextPredicate) {
this.studioCapableEditingContextPredicate = Objects.requireNonNull(studioCapableEditingContextPredicate);
}

@Override
public void preProcess(IEditingContext editingContext) {
var isStudio = this.studioCapableEditingContextPredicate.test(editingContext);
if (isStudio && editingContext instanceof IEMFEditingContext emfEditingContext) {
var packageRegistry = emfEditingContext.getDomain().getResourceSet().getPackageRegistry();
packageRegistry.put(DomainPackage.eNS_URI, DomainPackage.eINSTANCE);
packageRegistry.put(ViewPackage.eNS_URI, ViewPackage.eINSTANCE);
packageRegistry.put(DeckPackage.eNS_URI, DeckPackage.eINSTANCE);
packageRegistry.put(DiagramPackage.eNS_URI, DiagramPackage.eINSTANCE);
packageRegistry.put(FormPackage.eNS_URI, FormPackage.eINSTANCE);
packageRegistry.put(GanttPackage.eNS_URI, GanttPackage.eINSTANCE);

var resourceSet = emfEditingContext.getDomain().getResourceSet();
this.loadStudioColorPalettes(resourceSet).ifPresent(view -> {
resourceSet.eAdapters().add(new DiagramColorAdapter(view));
resourceSet.eAdapters().add(new FormColorAdapter(view));
resourceSet.eAdapters().add(new DeckColorAdapter(view));
});
}
}

private Optional<View> loadStudioColorPalettes(ResourceSet resourceSet) {
ClassPathResource classPathResource = new ClassPathResource("studioColorPalettes.json");
URI uri = URI.createURI(IEMFEditingContext.RESOURCE_SCHEME + ":///" + UUID.nameUUIDFromBytes(classPathResource.getPath().getBytes()));
var resource = new JSONResourceFactory().createResource(uri);
try (var inputStream = new ByteArrayInputStream(classPathResource.getContentAsByteArray())) {
resourceSet.getResources().add(resource);
resource.load(inputStream, null);
resource.eAdapters().add(new ResourceMetadataAdapter("studioColorPalettes"));
} catch (IOException exception) {
this.logger.warn("An error occured while loading document studioColorPalettes.json: {}.", exception.getMessage());
resourceSet.getResources().remove(resource);
}

return resource.getContents()
.stream()
.filter(View.class::isInstance)
.map(View.class::cast)
.findFirst();
}
}
@@ -0,0 +1,31 @@
/*******************************************************************************
* 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.studio.services;

import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.sirius.components.view.util.services.ColorPaletteService;
import org.eclipse.sirius.web.application.editingcontext.services.api.IEditingContextPersistenceFilter;
import org.springframework.stereotype.Service;

/**
* Used to ensure that the default palette is never persisted.
*
* @author sbegaudeau
*/
@Service
public class StudioEditingContextPersistenceFilter implements IEditingContextPersistenceFilter {
@Override
public boolean shouldPersist(Resource resource) {
return !ColorPaletteService.SIRIUS_STUDIO_COLOR_PALETTES_URI.equals(resource.getURI().toString());
}
}
Expand Up @@ -186,7 +186,6 @@ public void givenProjectWhenAnEditingContextActionIsInvokedThenTheEditingContext
var editingContextEventInput = new EditingContextEventInput(UUID.randomUUID(), TestIdentifiers.EMPTY_STUDIO_PROJECT.toString());
var flux = this.graphQLRequestor.subscribe(GET_EDITING_CONTEXT_EVENT_SUBSCRIPTION, editingContextEventInput);


Consumer<InvokeEditingContextActionInput> invokeEditingContextActionTask = (input) -> {
var result = this.graphQLRequestor.execute(INVOKE_EDITING_CONTEXT_ACTION, input);

Expand Down
Expand Up @@ -154,6 +154,6 @@ public void givenProjectToCreateFromTemplateWhenMutationIsPerformedThenTheProjec
assertThat(editingContext).isInstanceOf(IEMFEditingContext.class);

var emfEditingContext = (IEMFEditingContext) editingContext;
assertThat(emfEditingContext.getDomain().getResourceSet().getResources()).hasSize(2);
assertThat(emfEditingContext.getDomain().getResourceSet().getResources()).hasSize(3);
}
}
Expand Up @@ -17,6 +17,7 @@

import org.eclipse.sirius.components.core.api.IEditingContextSearchService;
import org.eclipse.sirius.components.view.form.FormDescription;
import org.eclipse.sirius.components.view.util.services.ColorPaletteService;
import org.eclipse.sirius.web.AbstractIntegrationTests;
import org.eclipse.sirius.web.TestIdentifiers;
import org.eclipse.sirius.web.application.editingcontext.EditingContext;
Expand Down Expand Up @@ -81,4 +82,24 @@ public void givenRegularProjectWhenItIsLoadedThenTheViewsFromAllStudiosAreAvaila
fail("Invalid editing context");
}
}

@Test
@DisplayName("Given a studio, when it is loaded, then the palette is available")
@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 givenStudioWhenItIsLoadedThenThenPaletteIsAvailable() {
var optionalEditingContext = this.editingContextSearchService.findById(TestIdentifiers.EMPTY_STUDIO_PROJECT.toString());
assertThat(optionalEditingContext).isPresent();

var editingContext = optionalEditingContext.get();
if (editingContext instanceof EditingContext siriusWebEditingContext) {
var resourceSet = siriusWebEditingContext.getDomain().getResourceSet();
assertThat(resourceSet.getResources()).hasSize(1);

var resource = resourceSet.getResources().get(0);
assertThat(resource.getURI().toString()).isEqualTo(ColorPaletteService.SIRIUS_STUDIO_COLOR_PALETTES_URI);
} else {
fail("Invalid editing context");
}
}
}

0 comments on commit 036fd3a

Please sign in to comment.