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 4dcdf4c
Show file tree
Hide file tree
Showing 44 changed files with 199 additions and 177 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 @@ -41,7 +41,7 @@
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistry;
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistryConfigurer;
import org.eclipse.sirius.components.emf.ResourceMetadataAdapter;
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.representations.Failure;
import org.eclipse.sirius.components.representations.GetOrCreateRandomIdProvider;
Expand Down Expand Up @@ -131,7 +131,7 @@ private boolean isContainerSelectable(VariableManager variableManager, EClass re
if (self instanceof Resource) {
isSelectable = true;
} else if (self instanceof EObject selfEObject && referenceKind != null) {
var optionalEditingDomain = variableManager.get(IEditingContext.EDITING_CONTEXT, EditingContext.class).map(EditingContext::getDomain);
var optionalEditingDomain = variableManager.get(IEditingContext.EDITING_CONTEXT, IEMFEditingContext.class).map(IEMFEditingContext::getDomain);
if (optionalEditingDomain.isPresent()) {
Collection<?> newChildDescriptors = optionalEditingDomain.get().getNewChildDescriptors(selfEObject, null);

Expand All @@ -154,7 +154,7 @@ private boolean isTypeSelectable(VariableManager variableManager, EClass targetT

private Optional<EObject> resolveOwnerEObject(VariableManager variableManager) {
var optionalTreeId = variableManager.get(GetOrCreateRandomIdProvider.PREVIOUS_REPRESENTATION_ID, String.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, EditingContext.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEMFEditingContext.class);
if (optionalTreeId.isPresent() && optionalTreeId.get().startsWith(TREE_KIND) && optionalEditingContext.isPresent()) {
Map<String, List<String>> parameters = new URLParser().getParameterValues(optionalTreeId.get());
String ownerId = parameters.get("ownerId").get(0);
Expand All @@ -167,7 +167,7 @@ private Optional<EObject> resolveOwnerEObject(VariableManager variableManager) {

private Optional<EClass> resolveReferenceEClass(VariableManager variableManager) {
var optionalTreeId = variableManager.get(GetOrCreateRandomIdProvider.PREVIOUS_REPRESENTATION_ID, String.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, EditingContext.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEMFEditingContext.class);
if (optionalTreeId.isPresent() && optionalTreeId.get().startsWith(TREE_KIND) && optionalEditingContext.isPresent()) {
Registry ePackageRegistry = optionalEditingContext.get().getDomain().getResourceSet().getPackageRegistry();
Map<String, List<String>> parameters = new URLParser().getParameterValues(optionalTreeId.get());
Expand All @@ -184,7 +184,7 @@ private Optional<EClass> resolveReferenceEClass(VariableManager variableManager)

private Optional<EClass> resolveTargetType(VariableManager variableManager) {
var optionalTreeId = variableManager.get(GetOrCreateRandomIdProvider.PREVIOUS_REPRESENTATION_ID, String.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, EditingContext.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEMFEditingContext.class);
if (optionalTreeId.isPresent() && optionalTreeId.get().startsWith(TREE_KIND) && optionalEditingContext.isPresent()) {
Registry ePackageRegistry = optionalEditingContext.get().getDomain().getResourceSet().getPackageRegistry();
Map<String, List<String>> parameters = new URLParser().getParameterValues(optionalTreeId.get());
Expand Down Expand Up @@ -287,7 +287,7 @@ private List<String> getImageURL(VariableManager variableManager) {

private List<? extends Object> getSearchScopeElements(VariableManager variableManager) {
var optionalTreeId = variableManager.get(GetOrCreateRandomIdProvider.PREVIOUS_REPRESENTATION_ID, String.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, EditingContext.class);
var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEMFEditingContext.class);
if (optionalTreeId.isPresent() && optionalTreeId.get().startsWith(TREE_KIND) && optionalEditingContext.isPresent()) {
Map<String, List<String>> parameters = new URLParser().getParameterValues(optionalTreeId.get());
String descriptionId = parameters.get("descriptionId").get(0);
Expand All @@ -304,14 +304,14 @@ private List<? extends Object> getSearchScopeElements(VariableManager variableMa
}

private List<? extends Object> getCreationScopeElements(VariableManager variableManager) {
var optionalResourceSet = variableManager.get(IEditingContext.EDITING_CONTEXT, EditingContext.class)
.map(EditingContext::getDomain)
var optionalResourceSet = variableManager.get(IEditingContext.EDITING_CONTEXT, IEMFEditingContext.class)
.map(IEMFEditingContext::getDomain)
.map(EditingDomain::getResourceSet);

if (optionalResourceSet.isPresent()) {
var resourceSet = optionalResourceSet.get();
return resourceSet.getResources().stream()
.filter(resource -> resource.getURI() != null && EditingContext.RESOURCE_SCHEME.equals(resource.getURI().scheme()))
.filter(resource -> resource.getURI() != null && IEMFEditingContext.RESOURCE_SCHEME.equals(resource.getURI().scheme()))
.sorted(Comparator.nullsLast(Comparator.comparing(this::getResourceLabel, String.CASE_INSENSITIVE_ORDER)))
.toList();
}
Expand Down

0 comments on commit 4dcdf4c

Please sign in to comment.