Skip to content

Commit

Permalink
[2889] Add an interface to identify EMF aware editing context
Browse files Browse the repository at this point in the history
Bug: #2889
Signed-off-by: Stéphane Bégaudeau <stephane.begaudeau@obeo.fr>
  • Loading branch information
sbegaudeau committed Jan 9, 2024
1 parent 017e3ed commit 985ed26
Show file tree
Hide file tree
Showing 45 changed files with 215 additions and 181 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.adoc
Expand Up @@ -139,6 +139,9 @@ This is a preliminary work to add some proper support for outside labels in the
- https://github.com/eclipse-sirius/sirius-web/issues/2869[#2869] [diagram] Add `diagramContext` variable to accessible variables when computing semantic candidates expression.
- https://github.com/eclipse-sirius/sirius-web/issues/2774[#2774] [gantt] Rework the gantt representation front-end to follow best practises.
- https://github.com/eclipse-sirius/sirius-web/issues/2872[#2872] [diagram] Reduce the time needed to retrieve a diagram description, thus leading to reduce the duration of diagrams opening.
- https://github.com/eclipse-sirius/sirius-web/issues/2889[#2889] [emf] Add the `IEMFEditingContext` interface in order to let any editing context be an EMF aware one.
After this change, we will be able to delete the `EditingContext` class from `sirius-components-emf` and add new interfaces to describe the various capabilities of an editing context.
Among those capabilities, we should find the list of view models to consider during the lifecycle of the editing context.

== v2023.12.0

Expand Down
Expand Up @@ -30,7 +30,7 @@
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IRepresentationMetadataSearchService;
import org.eclipse.sirius.components.emf.services.EditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.components.interpreter.AQLInterpreter;
import org.eclipse.sirius.components.representations.IStatus;
import org.eclipse.sirius.components.representations.VariableManager;
Expand Down Expand Up @@ -95,9 +95,9 @@ public IStatus handle(Map<String, Object> variables) {
.map(EObject.class::cast);

Optional<EditingDomain> optionalEditingDomain = Optional.of(variables.get(IEditingContext.EDITING_CONTEXT))
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.map(EditingContext::getDomain);
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain);
// @formatter:on

Matcher matcher = SEPARATOR.matcher(typeName);
Expand Down
Expand Up @@ -34,7 +34,7 @@
import org.eclipse.sirius.components.core.api.IPayload;
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
import org.eclipse.sirius.components.core.api.SemanticKindConstants;
import org.eclipse.sirius.components.emf.services.EditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFKindService;
import org.eclipse.sirius.components.emf.services.messages.IEMFMessageService;
import org.eclipse.sirius.components.representations.IRepresentationDescription;
Expand Down Expand Up @@ -141,8 +141,8 @@ private Optional<Object> resolveKind(IEditingContext editingContext, String kind
}

private Optional<Registry> getPackageRegistry(IEditingContext editingContext) {
if (editingContext instanceof EditingContext) {
Registry packageRegistry = ((EditingContext) editingContext).getDomain().getResourceSet().getPackageRegistry();
if (editingContext instanceof IEMFEditingContext) {
Registry packageRegistry = ((IEMFEditingContext) editingContext).getDomain().getResourceSet().getPackageRegistry();
return Optional.of(packageRegistry);
} else {
return Optional.empty();
Expand Down
Expand Up @@ -27,7 +27,7 @@
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.emf.services.EditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;

/**
* An utility class providing various query services.
Expand All @@ -37,28 +37,23 @@
public final class EditingContextServices {

public Collection<EObject> allContents(IEditingContext editingContext) {
// @formatter:off
return this.getResourceset(editingContext)
.stream()
.flatMap(this::collectAllContent)
.toList();
// @formatter:on
}

public Collection<EObject> contents(IEditingContext editingContext) {
//@formatter:off
return this.getResourceset(editingContext)
.stream()
.map(ResourceSet::getResources)
.flatMap(EList::stream)
.map(Resource::getContents)
.flatMap(EList::stream)
.toList();
//@formatter:on
}

public EObject getObjectById(IEditingContext editingContext, String id) {
//@formatter:off
return this.getResourceset(editingContext)
.stream()
.map(ResourceSet::getResources)
Expand All @@ -67,25 +62,20 @@ public EObject getObjectById(IEditingContext editingContext, String id) {
.filter(Objects::nonNull)
.findFirst()
.orElse(null);
//@formatter:on
}

private Optional<ResourceSet> getResourceset(IEditingContext editingContext) {
//@formatter:off
return Optional.of(editingContext)
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.map(EditingContext::getDomain)
.map(EditingDomain::getResourceSet);
//@formatter:on
return Optional.of(editingContext)
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain)
.map(EditingDomain::getResourceSet);
}

private Stream<EObject> collectAllContent(ResourceSet resourceSet) {
Spliterator<Notifier> spliterator = Spliterators.spliteratorUnknownSize(resourceSet.getAllContents(), Spliterator.ORDERED);
//@formatter:off
return StreamSupport.stream(spliterator, false)
.filter(EObject.class::isInstance)
.map(EObject.class::cast);
//@formatter:on
}
}
Expand Up @@ -47,6 +47,7 @@
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IFeedbackMessageService;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFKindService;
import org.eclipse.sirius.components.emf.services.messages.IEMFMessageService;
import org.eclipse.sirius.components.representations.Message;
Expand Down Expand Up @@ -96,9 +97,9 @@ private Optional<EClass> getEClass(EPackage.Registry ePackageRegistry, String ki

private Optional<EPackage.Registry> getPackageRegistry(IEditingContext editingContext) {
return Optional.of(editingContext)
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.map(EditingContext::getDomain)
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain)
.map(EditingDomain::getResourceSet)
.map(ResourceSet::getPackageRegistry);
}
Expand Down Expand Up @@ -161,9 +162,9 @@ public List<ChildCreationDescription> getChildCreationDescriptions(IEditingConte
@Override
public Optional<Object> createChild(IEditingContext editingContext, Object object, String childCreationDescriptionId) {
var optionalEditingDomain = Optional.of(editingContext)
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.map(EditingContext::getDomain);
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain);

Optional<EObject> optionalEObject = Optional.of(object)
.filter(EObject.class::isInstance)
Expand Down Expand Up @@ -271,9 +272,9 @@ public Optional<Object> createRootObject(IEditingContext editingContext, UUID do
var optionalEClass = this.getMatchingEClass(editingContext, domainId, rootObjectCreationDescriptionId);

var optionalEditingDomain = Optional.of(editingContext)
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.map(EditingContext::getDomain);
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain);

if (optionalEClass.isPresent() && optionalEditingDomain.isPresent()) {
EClass eClass = optionalEClass.get();
Expand All @@ -298,9 +299,9 @@ public Optional<Object> createRootObject(IEditingContext editingContext, UUID do

private Optional<EClass> getMatchingEClass(IEditingContext editingContext, String domainId, String rootObjectCreationDescriptionId) {
return Optional.of(editingContext)
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.map(EditingContext::getDomain)
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain)
.map(EditingDomain::getResourceSet)
.map(ResourceSet::getPackageRegistry)
.map(packageRegistry -> packageRegistry.getEPackage(domainId))
Expand Down
Expand Up @@ -36,6 +36,7 @@
import org.eclipse.emf.edit.provider.ReflectiveItemProvider;
import org.eclipse.sirius.components.core.api.IDefaultObjectService;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFKindService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -199,9 +200,9 @@ private List<String> findImagePath(Object image) {
@Override
public Optional<Object> getObject(IEditingContext editingContext, String objectId) {
return Optional.of(editingContext)
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.map(EditingContext::getDomain)
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain)
.map(EditingDomain::getResourceSet)
.flatMap(resourceSet -> {
Optional<EObject> optionalEObject = Optional.empty();
Expand Down
Expand Up @@ -30,6 +30,7 @@
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.sirius.components.collaborative.validation.api.IValidationService;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.springframework.stereotype.Service;

/**
Expand All @@ -53,8 +54,8 @@ public EMFValidationService(EValidator.Registry eValidatorRegistry, ComposedAdap
public List<Object> validate(IEditingContext editingContext) {
// @formatter:off
return Optional.of(editingContext)
.filter(EditingContext.class::isInstance)
.map(EditingContext.class::cast)
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(this::validate)
.orElseGet(List::of);
// @formatter:on
Expand Down Expand Up @@ -99,7 +100,7 @@ private boolean filterDiagnosticByFeature(Diagnostic diagnostic, Object feature)
return false;
}

private List<Object> validate(EditingContext editingContext) {
private List<Object> validate(IEMFEditingContext editingContext) {
AdapterFactoryEditingDomain domain = editingContext.getDomain();

Map<Object, Object> options = new HashMap<>();
Expand Down
Expand Up @@ -20,6 +20,7 @@

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.emfjson.resource.JsonResource;
import org.eclipse.sirius.emfjson.resource.JsonResourceImpl;

Expand Down Expand Up @@ -69,6 +70,6 @@ public JsonResource createResourceFromPath(String path) {
*/
public URI createResourceURI(String resourceId) {
// There are three slashes because the URI authority is empty
return URI.createURI(EditingContext.RESOURCE_SCHEME + ":///" + resourceId);
return URI.createURI(IEMFEditingContext.RESOURCE_SCHEME + ":///" + resourceId);
}
}
@@ -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.components.emf.services.api;

import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.sirius.components.core.api.IEditingContext;

/**
* Used to identify editing context using EMF.
*
* @author sbegaudeau
*/
public interface IEMFEditingContext extends IEditingContext {
/**
* This scheme should be used to create an URI of a resource that corresponds to a document added in the
* EditingContext ResourceSet.
*/
String RESOURCE_SCHEME = "sirius";

AdapterFactoryEditingDomain getDomain();
}
Expand Up @@ -38,10 +38,10 @@
import org.eclipse.sirius.components.core.api.ErrorPayload;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IPayload;
import org.eclipse.sirius.components.emf.services.EditingContext;
import org.eclipse.sirius.components.emf.services.EditingDomainFactory;
import org.eclipse.sirius.components.emf.services.IDAdapter;
import org.eclipse.sirius.components.emf.services.IEditingContextEPackageService;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.junit.jupiter.api.Test;

/**
Expand Down Expand Up @@ -90,7 +90,7 @@ public List<EPackage> getEPackages(String editingContextId) {

@Test
public void testEMFQueryServiceGetObjectById() {
EditingContext editingContext = this.createEditingContext();
var editingContext = this.createEditingContext();

IEditingContextEPackageService editingContextEPackageService = new IEditingContextEPackageService() {
@Override
Expand Down Expand Up @@ -125,11 +125,23 @@ public List<EPackage> getEPackages(String editingContextId) {
assertTrue(payload instanceof ErrorPayload);
}

private EditingContext createEditingContext() {
private IEMFEditingContext createEditingContext() {
Resource resource = this.createResourceWith4Elements();
Resource resource2 = this.createResourceWith4Elements();

var editingContextId = UUID.randomUUID().toString();
AdapterFactoryEditingDomain editingDomain = new EditingDomainFactory().create(resource, resource2);
return new EditingContext(UUID.randomUUID().toString(), editingDomain, Map.of());
return new IEMFEditingContext() {
@Override
public String getId() {
return editingContextId;
}

@Override
public AdapterFactoryEditingDomain getDomain() {
return editingDomain;
}
};
}

private Resource createResourceWith4Elements() {
Expand Down

0 comments on commit 985ed26

Please sign in to comment.