diff --git a/packages/emf/backend/sirius-components-emf/pom.xml b/packages/emf/backend/sirius-components-emf/pom.xml
index 5c471a2b8a..533ba9caf9 100644
--- a/packages/emf/backend/sirius-components-emf/pom.xml
+++ b/packages/emf/backend/sirius-components-emf/pom.xml
@@ -102,7 +102,7 @@
org.eclipse.sirius.emfjson
org.eclipse.sirius.emfjson
- 2.3.6-SNAPSHOT
+ 2.3.7-SNAPSHOT
org.springframework.boot
diff --git a/packages/sirius-web/backend/sirius-web-application/pom.xml b/packages/sirius-web/backend/sirius-web-application/pom.xml
index dc78a55be3..3a6ec273a4 100644
--- a/packages/sirius-web/backend/sirius-web-application/pom.xml
+++ b/packages/sirius-web/backend/sirius-web-application/pom.xml
@@ -144,6 +144,11 @@
sirius-components-view-gantt-edit
2024.1.5
+
+ org.eclipse.sirius
+ sirius-components-domain-emf
+ 2024.1.5
+
diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentData.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentData.java
new file mode 100644
index 0000000000..8ed8e57c82
--- /dev/null
+++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentData.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.application.editingcontext.services;
+
+import java.util.List;
+
+import org.eclipse.sirius.web.domain.boundedcontexts.semanticdata.Document;
+
+/**
+ * The data retrieved from the serialization of a document.
+ *
+ * @author sbegaudeau
+ */
+public record DocumentData(Document document, List ePackageEntries) {
+}
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
new file mode 100644
index 0000000000..c914dcc6c0
--- /dev/null
+++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/DocumentToResourceService.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+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.web.application.editingcontext.services.api.IDocumentToResourceService;
+import org.eclipse.sirius.web.domain.boundedcontexts.semanticdata.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * Used to load documents as resources.
+ *
+ * @author sbegaudeau
+ */
+@Service
+public class DocumentToResourceService implements IDocumentToResourceService {
+
+ private final Logger logger = LoggerFactory.getLogger(DocumentToResourceService.class);
+
+ @Override
+ public Optional toResource(ResourceSet resourceSet, Document document) {
+ Optional optionalResource = Optional.empty();
+
+ 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.eAdapters().add(new ResourceMetadataAdapter(document.getName()));
+
+ optionalResource = Optional.of(resource);
+ } catch (IOException | IllegalArgumentException exception) {
+ this.logger.warn("An error occured while loading document {}: {}.", document.getId(), exception.getMessage());
+ resourceSet.getResources().remove(resource);
+ }
+
+ return optionalResource;
+ }
+}
diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EPackageEntry.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EPackageEntry.java
new file mode 100644
index 0000000000..6f485ebd94
--- /dev/null
+++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EPackageEntry.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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;
+
+/**
+ * Used to store the EPackage used in a JsonResource.
+ *
+ * @author sbegaudeau
+ */
+public record EPackageEntry(String nsPrefix, String nsURI) {
+}
diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextPersistenceService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextPersistenceService.java
index 6b8b5c5036..cc57b4c7b0 100644
--- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextPersistenceService.java
+++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextPersistenceService.java
@@ -12,6 +12,7 @@
*******************************************************************************/
package org.eclipse.sirius.web.application.editingcontext.services;
+import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
@@ -24,6 +25,7 @@
import org.eclipse.sirius.web.application.UUIDParser;
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;
@@ -65,11 +67,20 @@ public void persist(IEditingContext editingContext) {
new UUIDParser().parse(editingContext.getId())
.map(AggregateReference::to)
.ifPresent(project -> {
- var documents = emfEditingContext.getDomain().getResourceSet().getResources().stream()
+ var documentData = emfEditingContext.getDomain().getResourceSet().getResources().stream()
.map(this.resourceToDocumentService::toDocument)
.flatMap(Optional::stream)
.collect(Collectors.toSet());
- this.semanticDataUpdateService.updateDocuments(project, documents);
+
+ var documents = new LinkedHashSet();
+ var domainUris = new LinkedHashSet();
+
+ documentData.forEach(data -> {
+ documents.add(data.document());
+ domainUris.addAll(data.ePackageEntries().stream().map(EPackageEntry::nsURI).toList());
+ });
+
+ this.semanticDataUpdateService.updateDocuments(project, documents, domainUris);
});
}
diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextSearchService.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextSearchService.java
index 959afeb1e3..e6505c9415 100644
--- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextSearchService.java
+++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/EditingContextSearchService.java
@@ -12,8 +12,6 @@
*******************************************************************************/
package org.eclipse.sirius.web.application.editingcontext.services;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -28,12 +26,11 @@
import org.eclipse.sirius.components.core.api.IEditingContextProcessor;
import org.eclipse.sirius.components.core.api.IEditingContextRepresentationDescriptionProvider;
import org.eclipse.sirius.components.core.api.IEditingContextSearchService;
-import org.eclipse.sirius.components.emf.ResourceMetadataAdapter;
import org.eclipse.sirius.components.emf.services.EditingContextCrossReferenceAdapter;
-import org.eclipse.sirius.components.emf.services.JSONResourceFactory;
import org.eclipse.sirius.emfjson.resource.JsonResource;
import org.eclipse.sirius.web.application.UUIDParser;
import org.eclipse.sirius.web.application.editingcontext.EditingContext;
+import org.eclipse.sirius.web.application.editingcontext.services.api.IDocumentToResourceService;
import org.eclipse.sirius.web.application.editingcontext.services.api.IEditingDomainFactory;
import org.eclipse.sirius.web.domain.boundedcontexts.project.Project;
import org.eclipse.sirius.web.domain.boundedcontexts.project.services.api.IProjectSearchService;
@@ -63,6 +60,8 @@ public class EditingContextSearchService implements IEditingContextSearchService
private final ISemanticDataSearchService semanticDataSearchService;
+ private final IDocumentToResourceService documentToResourceService;
+
private final IEditingDomainFactory editingDomainFactory;
private final List representationDescriptionProviders;
@@ -71,10 +70,11 @@ public class EditingContextSearchService implements IEditingContextSearchService
private final Timer timer;
- public EditingContextSearchService(IProjectSearchService projectSearchService, ISemanticDataSearchService semanticDataSearchService, IEditingDomainFactory editingDomainFactory,
+ public EditingContextSearchService(IProjectSearchService projectSearchService, ISemanticDataSearchService semanticDataSearchService, IDocumentToResourceService documentToResourceService, IEditingDomainFactory editingDomainFactory,
List representationDescriptionProviders, List editingContextProcessors, MeterRegistry meterRegistry) {
this.projectSearchService = Objects.requireNonNull(projectSearchService);
this.semanticDataSearchService = Objects.requireNonNull(semanticDataSearchService);
+ this.documentToResourceService = Objects.requireNonNull(documentToResourceService);
this.editingDomainFactory = Objects.requireNonNull(editingDomainFactory);
this.representationDescriptionProviders = Objects.requireNonNull(representationDescriptionProviders);
this.editingContextProcessors = Objects.requireNonNull(editingContextProcessors);
@@ -125,20 +125,7 @@ private void loadSemanticData(EditingContext editingContext, SemanticData semant
ResourceSet resourceSet = editingContext.getDomain().getResourceSet();
resourceSet.getLoadOptions().put(JsonResource.OPTION_SCHEMA_LOCATION, true);
- var documents = semanticData.getDocuments();
- for (var document : documents) {
- 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.eAdapters().add(new ResourceMetadataAdapter(document.getName()));
- } catch (IOException | IllegalArgumentException exception) {
- this.logger.warn("An error occured while loading document {}: {}.", document.getId(), exception.getMessage());
- resourceSet.getResources().remove(resource);
- }
- }
+ semanticData.getDocuments().forEach(document -> this.documentToResourceService.toResource(resourceSet, document));
// The ECrossReferenceAdapter must be set after the resource loading because it needs to resolve proxies in case
// of inter-resources references
diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/JsonResourceSerializationListener.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/JsonResourceSerializationListener.java
new file mode 100644
index 0000000000..a7d1c9ec37
--- /dev/null
+++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/editingcontext/services/JsonResourceSerializationListener.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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;
+
+import com.google.gson.JsonElement;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.sirius.emfjson.resource.JsonResource;
+
+/**
+ * Used to collect serialization data from JsonResource.
+ *
+ * @author sbegaudeau
+ */
+public class JsonResourceSerializationListener implements JsonResource.ISerializationListener {
+
+ private final List ePackageEntries = new ArrayList<>();
+
+ @Override
+ public void onNsHeaderEntryAdded(String nsPrefix, String nsURI) {
+ this.ePackageEntries.add(new EPackageEntry(nsPrefix, nsURI));
+ }
+
+ @Override
+ public void onObjectSerialized(EObject eObject, JsonElement jsonElement) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCrossReferenceURICreated(EObject eObject, EReference eReference, String s) {
+ // Do nothing
+ }
+
+ public List getePackageEntries() {
+ return this.ePackageEntries;
+ }
+}
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 b1b0793649..6cb3f0546c 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
@@ -40,12 +40,15 @@ public class ResourceToDocumentService implements IResourceToDocumentService {
private final Logger logger = LoggerFactory.getLogger(ResourceToDocumentService.class);
@Override
- public Optional toDocument(Resource resource) {
+ public Optional toDocument(Resource resource) {
+ var serializationListener = new JsonResourceSerializationListener();
+
HashMap