From 33207fabc3f4565ab9c13e7e9d687558902f739d Mon Sep 17 00:00:00 2001 From: Michael Charfadi Date: Thu, 4 Apr 2024 17:15:37 +0200 Subject: [PATCH] [3333] Add JsonResourceMigrationVersionProcessor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: https://github.com/eclipse-sirius/sirius-web/issues/3333 Signed-off-by: Michaƫl Charfadi --- CHANGELOG.adoc | 1 + .../emf/ResourceMetadataAdapter.java | 23 ++++++- .../services/DocumentToResourceService.java | 9 ++- .../services/ResourceToDocumentService.java | 4 ++ ...JsonResourceMigrationVersionProcessor.java | 63 +++++++++++++++++++ 5 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/api/JsonResourceMigrationVersionProcessor.java diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 743ed758a2..759f042974 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -75,6 +75,7 @@ image:doc/screenshots/inside_outside_labels.png[Isinde outside label example, 70 - https://github.com/eclipse-sirius/sirius-web/issues/3279[#3279] [gantt] The expressions `TaskDescription#startTimeExpression` and `TaskDescription#endTimeExpression` can now both accept `String` values as a result if those values can be parsed by `java.timeInstant#parse`. They still support returning an `java.time.Instant` object directly. - https://github.com/eclipse-sirius/sirius-web/issues/3309[#3309] [diagram] Hide header border-bottom when the node is collapsed +- https://github.com/eclipse-sirius/sirius-web/issues/3333[#3333] [sirius-web] Now, store the last migration performed in a document == v2024.3.0 diff --git a/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/ResourceMetadataAdapter.java b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/ResourceMetadataAdapter.java index 37f7cc21a4..e382988acd 100644 --- a/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/ResourceMetadataAdapter.java +++ b/packages/emf/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/ResourceMetadataAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2023 Obeo. + * Copyright (c) 2019, 2024 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -33,12 +33,15 @@ public class ResourceMetadataAdapter implements Adapter { private String name; + private String lastMigrationPerformed = ""; + + private String migrationVersion = ""; + private Notifier notifier; public ResourceMetadataAdapter(String name) { this.name = Objects.requireNonNull(name); } - public String getName() { return this.name; } @@ -47,6 +50,22 @@ public void setName(String name) { this.name = name; } + public String getLastMigrationPerformed() { + return lastMigrationPerformed; + } + + public void setLastMigrationPerformed(String lastMigrationPerformed) { + this.lastMigrationPerformed = lastMigrationPerformed; + } + + public String getMigrationVersion() { + return migrationVersion; + } + + public void setMigrationVersion(String migrationVersion) { + this.migrationVersion = migrationVersion; + } + @Override public void notifyChanged(Notification notification) { // do nothing diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentToResourceService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentToResourceService.java index c914dcc6c0..2a7562a14c 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentToResourceService.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentToResourceService.java @@ -14,13 +14,16 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.util.HashMap; import java.util.Optional; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.sirius.components.emf.ResourceMetadataAdapter; import org.eclipse.sirius.components.emf.services.JSONResourceFactory; +import org.eclipse.sirius.emfjson.resource.JsonResource; import org.eclipse.sirius.web.application.editingcontext.services.api.IDocumentToResourceService; +import org.eclipse.sirius.web.application.editingcontext.services.api.JsonResourceMigrationVersionProcessor; import org.eclipse.sirius.web.domain.boundedcontexts.semanticdata.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,11 +42,15 @@ public class DocumentToResourceService implements IDocumentToResourceService { @Override public Optional toResource(ResourceSet resourceSet, Document document) { Optional optionalResource = Optional.empty(); + var jsonResourceProcessor = new JsonResourceMigrationVersionProcessor(); + + HashMap options = new HashMap<>(); + options.put(JsonResource.OPTION_JSON_RESSOURCE_PROCESSOR, jsonResourceProcessor); var resource = new JSONResourceFactory().createResourceFromPath(document.getId().toString()); try (var inputStream = new ByteArrayInputStream(document.getContent().getBytes())) { resourceSet.getResources().add(resource); - resource.load(inputStream, null); + resource.load(inputStream, options); resource.eAdapters().add(new ResourceMetadataAdapter(document.getName())); diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/ResourceToDocumentService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/ResourceToDocumentService.java index 6cb3f0546c..17685b24b8 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/ResourceToDocumentService.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/ResourceToDocumentService.java @@ -24,9 +24,11 @@ import org.eclipse.sirius.emfjson.resource.JsonResource; import org.eclipse.sirius.web.application.UUIDParser; import org.eclipse.sirius.web.application.editingcontext.services.api.IResourceToDocumentService; +import org.eclipse.sirius.web.application.editingcontext.services.api.JsonResourceMigrationVersionProcessor; import org.eclipse.sirius.web.domain.boundedcontexts.semanticdata.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.stereotype.Service; /** @@ -42,11 +44,13 @@ public class ResourceToDocumentService implements IResourceToDocumentService { @Override public Optional toDocument(Resource resource) { var serializationListener = new JsonResourceSerializationListener(); + var jsonResourceProcessor = new JsonResourceMigrationVersionProcessor(); HashMap options = new HashMap<>(); options.put(JsonResource.OPTION_ID_MANAGER, new EObjectIDManager()); options.put(JsonResource.OPTION_SCHEMA_LOCATION, true); options.put(JsonResource.OPTION_SERIALIZATION_LISTENER, serializationListener); + options.put(JsonResource.OPTION_JSON_RESSOURCE_PROCESSOR, jsonResourceProcessor); Optional optionalDocumentData = Optional.empty(); try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/api/JsonResourceMigrationVersionProcessor.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/api/JsonResourceMigrationVersionProcessor.java new file mode 100644 index 0000000000..567aed624d --- /dev/null +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/api/JsonResourceMigrationVersionProcessor.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * 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.sirius.components.emf.ResourceMetadataAdapter; +import org.eclipse.sirius.emfjson.resource.JsonResource; + +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; + +/** + * Used to load and serialize document version. + * + * @author mcharfadi + */ +public class JsonResourceMigrationVersionProcessor implements JsonResource.IJsonResourceProcessor { + @Override + public void preDeserialization(JsonResource resource, JsonObject jsonObject) { + var optionalResourceMetadataAdapter = resource.eAdapters().stream() + .filter(ResourceMetadataAdapter.class::isInstance) + .map(ResourceMetadataAdapter.class::cast) + .findFirst(); + var migrationObject = jsonObject.getAsJsonObject("migration"); + if (migrationObject != null) { + var lastMigrationPerformed = migrationObject.get("lastMigrationPerformed"); + var migrationVersion = migrationObject.get("migrationVersion"); + if (lastMigrationPerformed != null && migrationVersion != null) { + optionalResourceMetadataAdapter.ifPresent(resourceMetadataAdapter -> resourceMetadataAdapter.setMigrationVersion(migrationVersion.getAsString())); + optionalResourceMetadataAdapter.ifPresent(resourceMetadataAdapter -> resourceMetadataAdapter.setLastMigrationPerformed(lastMigrationPerformed.getAsString())); + System.out.println(migrationVersion.getAsString()); + System.out.println(lastMigrationPerformed.getAsString()); + } + } + } + + @Override + public void postSerialization(JsonResource resource, JsonObject jsonObject) { + var version = resource.eAdapters().stream() + .filter(ResourceMetadataAdapter.class::isInstance) + .map(ResourceMetadataAdapter.class::cast) + .findFirst(); + + version.ifPresent(resourceMetadataAdapter -> { + var rootMigration = new JsonObject(); + var migrationVersionElement = new JsonPrimitive(resourceMetadataAdapter.getMigrationVersion()); + rootMigration.add("version", migrationVersionElement); + var migrationLastPerformed = new JsonPrimitive(resourceMetadataAdapter.getLastMigrationPerformed()); + rootMigration.add("lastMigrationPerformed", migrationLastPerformed); + + jsonObject.add("migration", rootMigration); + }); + } +}