Skip to content

Commit

Permalink
[3021] Update the interface used to contribute representation descrip…
Browse files Browse the repository at this point in the history
…tions

Bug: #3021
Signed-off-by: Stéphane Bégaudeau <stephane.begaudeau@obeo.fr>
  • Loading branch information
sbegaudeau committed Feb 15, 2024
1 parent 1d7f104 commit f56728e
Show file tree
Hide file tree
Showing 16 changed files with 130 additions and 191 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.adoc
Expand Up @@ -45,6 +45,9 @@ Yet we are recommending using each individual services since this aggregated one
If you want to add your own custom behaviour, please use the new services, see the related ADR for more details.
- https://github.com/eclipse-sirius/sirius-web/issues/3066[#3066] [core] `IObjectSearchService`, `IIdentityService`, `ILabelService` now can also find/resolve representations.
This changes a core assumption from before where an element known to those services (i.e. an element for which `IIdentityService.getId` returned a non-null value) was a "semantic element" and thus *could not be* a representation.
- https://github.com/eclipse-sirius/sirius-web/issues/3021[#3021] [sirius-web] Remove the interfaces `IRepresentationDescriptionRegistry` and `IRepresentationDescriptionRegistryConfigurer` to replace them with `IEditingContextRepresentationDescriptionProvider` which provides the same feature but also gives access to the editing context for conditional registration of representation descriptions.
This new interface will move in the near future from `sirius-components-core` to `sirius-web-application`.
It's current location is only there to simplify the transition to the new Sirius Web architecture.


=== Dependency update
Expand All @@ -65,6 +68,7 @@ This changes a core assumption from before where an element known to those servi
- https://github.com/eclipse-sirius/sirius-web/issues/3063[#3063] [selection] Ensure Selections are always refreshed using the _current_ version of their target element
- https://github.com/eclipse-sirius/sirius-web/issues/2721[#2721] [diagram] Prevent labels to exceed their container
- https://github.com/eclipse-sirius/sirius-web/issues/3100[#3100] [diagram] Add support for drop on `IconLabelNode`
-

=== New Features

Expand Down
@@ -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
Expand All @@ -19,9 +19,8 @@
import org.eclipse.sirius.components.collaborative.forms.services.api.IPropertiesDescriptionRegistryConfigurer;
import org.eclipse.sirius.components.compatibility.services.api.ISiriusConfiguration;
import org.eclipse.sirius.components.compatibility.services.representations.ODesignReader;
import org.eclipse.sirius.components.compatibility.services.representations.SiriusRepresentationDescriptionProvider;
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistry;
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistryConfigurer;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IEditingContextRepresentationDescriptionProvider;
import org.eclipse.sirius.components.diagrams.description.DiagramDescription;
import org.eclipse.sirius.components.forms.description.FormDescription;
import org.eclipse.sirius.components.representations.IRepresentationDescription;
Expand All @@ -37,33 +36,33 @@
* @author hmarchadour
*/
@Configuration
public class SiriusRepresentationDescriptionRegistryConfigurer implements IRepresentationDescriptionRegistryConfigurer, IPropertiesDescriptionRegistryConfigurer {
public class SiriusRepresentationDescriptionProvider implements IEditingContextRepresentationDescriptionProvider, IPropertiesDescriptionRegistryConfigurer {

private final List<ISiriusConfiguration> siriusConfigurations;

private final ODesignReader oDesignReader;

private final SiriusRepresentationDescriptionProvider representationDescriptionProvider;
private final org.eclipse.sirius.components.compatibility.services.representations.SiriusRepresentationDescriptionProvider representationDescriptionProvider;

public SiriusRepresentationDescriptionRegistryConfigurer(List<ISiriusConfiguration> siriusConfigurations, ODesignReader oDesignReader,
SiriusRepresentationDescriptionProvider representationDescriptionProvider) {
public SiriusRepresentationDescriptionProvider(List<ISiriusConfiguration> siriusConfigurations, ODesignReader oDesignReader,
org.eclipse.sirius.components.compatibility.services.representations.SiriusRepresentationDescriptionProvider representationDescriptionProvider) {
this.siriusConfigurations = Objects.requireNonNull(siriusConfigurations);
this.oDesignReader = Objects.requireNonNull(oDesignReader);
this.representationDescriptionProvider = Objects.requireNonNull(representationDescriptionProvider);
}

@Override
public void addRepresentationDescriptions(IRepresentationDescriptionRegistry registry) {
public List<IRepresentationDescription> getRepresentationDescriptions(IEditingContext editingContext) {
// We should probably not filter only diagram and selection representations but instead of
// opening the floodgates, we will be conservative for now

this.siriusConfigurations.stream()
return this.siriusConfigurations.stream()
.map(ISiriusConfiguration::getODesignPaths)
.flatMap(List::stream)
.map(this::getRepresentationDescriptions)
.flatMap(List::stream)
.filter(description -> description instanceof DiagramDescription || description instanceof SelectionDescription)
.forEach(registry::add);
.toList();
}

@Override
Expand Down
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2019, 2020 Obeo.
* 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
Expand All @@ -10,16 +10,19 @@
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.sirius.components.core.configuration;
package org.eclipse.sirius.components.core.api;

import org.eclipse.sirius.components.annotations.PublicApi;
import java.util.List;

import org.eclipse.sirius.components.representations.IRepresentationDescription;

/**
* Interface to be implemented as a Spring configuration in order to configure the representation description registry.
* Used to provide the representation description of the editing context.
*
* Note: This interface will soon be moved into sirius-web-application
*
* @author sbegaudeau
*/
@PublicApi
public interface IRepresentationDescriptionRegistryConfigurer {
void addRepresentationDescriptions(IRepresentationDescriptionRegistry registry);
public interface IEditingContextRepresentationDescriptionProvider {
List<IRepresentationDescription> getRepresentationDescriptions(IEditingContext editingContext);
}

This file was deleted.

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2022, 2023 Obeo.
* Copyright (c) 2022, 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
Expand All @@ -12,14 +12,15 @@
*******************************************************************************/
package org.eclipse.sirius.components.formdescriptioneditors.configuration;

import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Function;
import java.util.function.Predicate;

import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IEditingContextRepresentationDescriptionProvider;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistry;
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistryConfigurer;
import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorDescription;
import org.eclipse.sirius.components.representations.IRepresentationDescription;
import org.eclipse.sirius.components.representations.VariableManager;
Expand All @@ -32,16 +33,16 @@
* @author arichard
*/
@Configuration
public class FormDescriptionEditorDescriptionRegistryConfigurer implements IRepresentationDescriptionRegistryConfigurer {
public class FormDescriptionEditorDescriptionProvider implements IEditingContextRepresentationDescriptionProvider {

private final IObjectService objectService;

public FormDescriptionEditorDescriptionRegistryConfigurer(IObjectService objectService) {
public FormDescriptionEditorDescriptionProvider(IObjectService objectService) {
this.objectService = Objects.requireNonNull(objectService);
}

@Override
public void addRepresentationDescriptions(IRepresentationDescriptionRegistry registry) {
public List<IRepresentationDescription> getRepresentationDescriptions(IEditingContext editingContext) {
UUID id = UUID.nameUUIDFromBytes("FormDescriptionEditor".getBytes());
String label = "FormDescriptionEditor";

Expand All @@ -59,7 +60,6 @@ public void addRepresentationDescriptions(IRepresentationDescriptionRegistry reg
.canCreatePredicate(canCreatePredicate)
.build();

registry.add(formDescriptionEditorDescription);
// @formatter:on
return List.of(formDescriptionEditorDescription);
}
}
Expand Up @@ -35,16 +35,16 @@
import org.eclipse.sirius.components.compatibility.services.ImageConstants;
import org.eclipse.sirius.components.core.URLParser;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IEditingContextRepresentationDescriptionProvider;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IURLParser;
import org.eclipse.sirius.components.core.api.SemanticKindConstants;
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.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;
import org.eclipse.sirius.components.representations.IRepresentationDescription;
import org.eclipse.sirius.components.representations.IStatus;
import org.eclipse.sirius.components.representations.VariableManager;
import org.eclipse.sirius.components.trees.description.TreeDescription;
Expand All @@ -58,7 +58,7 @@
* @author pcdavid
*/
@Service
public class ModelBrowsersDescriptionProvider implements IRepresentationDescriptionRegistryConfigurer {
public class ModelBrowsersDescriptionProvider implements IEditingContextRepresentationDescriptionProvider {

public static final String CONTAINER_DESCRIPTION_ID = UUID.nameUUIDFromBytes("model_browser_container_tree_description".getBytes()).toString();

Expand Down Expand Up @@ -87,18 +87,27 @@ public ModelBrowsersDescriptionProvider(IObjectService objectService, IURLParser
}

@Override
public void addRepresentationDescriptions(IRepresentationDescriptionRegistry registry) {
registry.add(this.getModelBrowserDescription(CONTAINER_DESCRIPTION_ID,
variableManager -> variableManager.get("treeId", String.class).map(treeId -> treeId.startsWith("modelBrowser://container")).orElse(false), variableManager -> {
EClass referenceKind = this.resolveReferenceEClass(variableManager).orElse(null);
return this.isContainerSelectable(variableManager, referenceKind);
}, this::getCreationScopeElements));
registry.add(this.getModelBrowserDescription(REFERENCE_DESCRIPTION_ID,
variableManager -> variableManager.get("treeId", String.class).map(treeId -> treeId.startsWith("modelBrowser://reference")).orElse(false), variableManager -> {
EClass targetType = this.resolveTargetType(variableManager).orElse(null);
boolean isContainment = this.resolveIsContainment(variableManager);
return this.isTypeSelectable(variableManager, targetType, isContainment);
}, this::getSearchScopeElements));
public List<IRepresentationDescription> getRepresentationDescriptions(IEditingContext editingContext) {
Predicate<VariableManager> containerDescriptionCanCreatePredicate = variableManager -> variableManager.get("treeId", String.class)
.map(treeId -> treeId.startsWith("modelBrowser://container"))
.orElse(false);
Function<VariableManager, Boolean> containerDescriptionIsSelectableProvider = variableManager -> {
EClass referenceKind = this.resolveReferenceEClass(variableManager).orElse(null);
return this.isContainerSelectable(variableManager, referenceKind);
};
var containerDescription = this.getModelBrowserDescription(CONTAINER_DESCRIPTION_ID, containerDescriptionCanCreatePredicate, containerDescriptionIsSelectableProvider, this::getCreationScopeElements);

Predicate<VariableManager> referenceDescriptionCanCreatePredicate = variableManager -> variableManager.get("treeId", String.class)
.map(treeId -> treeId.startsWith("modelBrowser://reference"))
.orElse(false);
Function<VariableManager, Boolean> referenceDescriptionIsSelectableProvider = variableManager -> {
EClass targetType = this.resolveTargetType(variableManager).orElse(null);
boolean isContainment = this.resolveIsContainment(variableManager);
return this.isTypeSelectable(variableManager, targetType, isContainment);
};
var referenceDescription = this.getModelBrowserDescription(REFERENCE_DESCRIPTION_ID, referenceDescriptionCanCreatePredicate, referenceDescriptionIsSelectableProvider, this::getSearchScopeElements);

return List.of(containerDescription, referenceDescription);
}

public TreeDescription getModelBrowserDescription(String descriptionId, Predicate<VariableManager> canCreatePredicate, Function<VariableManager, Boolean> isSelectableProvider,
Expand Down
Expand Up @@ -27,11 +27,12 @@
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistry;
import org.eclipse.sirius.components.core.configuration.IRepresentationDescriptionRegistryConfigurer;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IEditingContextRepresentationDescriptionProvider;
import org.eclipse.sirius.components.emf.services.IDAdapter;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.components.emf.utils.EMFResourceUtils;
import org.eclipse.sirius.components.representations.IRepresentationDescription;
import org.eclipse.sirius.components.view.View;
import org.eclipse.sirius.components.view.ViewPackage;
import org.eclipse.sirius.components.view.emf.IViewConverter;
Expand All @@ -45,21 +46,21 @@
* @author pcdavid
*/
@Configuration
public class ReferenceViewRepresentationDescriptionRegistryConfigurer implements IRepresentationDescriptionRegistryConfigurer {
public class ReferenceViewRepresentationDescriptionProvider implements IEditingContextRepresentationDescriptionProvider {
private final IViewConverter viewConverter;

private final EPackage.Registry ePackagesRegistry;

private final IInMemoryViewRegistry inMemoryViewRegistry;

public ReferenceViewRepresentationDescriptionRegistryConfigurer(IViewConverter viewConverter, Registry ePackagesRegistry, IInMemoryViewRegistry inMemoryViewRegistry) {
public ReferenceViewRepresentationDescriptionProvider(IViewConverter viewConverter, Registry ePackagesRegistry, IInMemoryViewRegistry inMemoryViewRegistry) {
this.viewConverter = viewConverter;
this.ePackagesRegistry = ePackagesRegistry;
this.inMemoryViewRegistry = inMemoryViewRegistry;
}

@Override
public void addRepresentationDescriptions(IRepresentationDescriptionRegistry registry) {
public List<IRepresentationDescription> getRepresentationDescriptions(IEditingContext editingContext) {
Optional<View> optionalView = this.load(new ClassPathResource("Reference_Test_Form.view"), List.of(ViewPackage.eINSTANCE), View.class);

if (optionalView.isPresent()) {
Expand All @@ -71,11 +72,14 @@ public void addRepresentationDescriptions(IRepresentationDescriptionRegistry reg

this.inMemoryViewRegistry.register(view);

List<EPackage> staticEPackages = this.ePackagesRegistry.values().stream().filter(EPackage.class::isInstance).map(EPackage.class::cast).collect(Collectors.toList());
List<EPackage> staticEPackages = this.ePackagesRegistry.values().stream()
.filter(EPackage.class::isInstance)
.map(EPackage.class::cast)
.collect(Collectors.toList());

var representationDescriptions = this.viewConverter.convert(List.of(view), staticEPackages);
representationDescriptions.forEach(registry::add);
return this.viewConverter.convert(List.of(view), staticEPackages);
}
return List.of();
}

private <T> Optional<T> load(ClassPathResource classPathResource, List<EPackage> requiredEPackages, Class<T> rootElementType) {
Expand Down
Expand Up @@ -58,7 +58,7 @@

/**
* Integration tests for the Slider custom widget. Depends on
* {@link ReferenceViewRepresentationDescriptionRegistryConfigurer} to register the "Reference Widget Test" form description.
* {@link ReferenceViewRepresentationDescriptionProvider} to register the "Reference Widget Test" form description.
*
* @author pcdavid
*/
Expand Down

0 comments on commit f56728e

Please sign in to comment.