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 16, 2024
1 parent d4886bb commit 68c8f59
Show file tree
Hide file tree
Showing 19 changed files with 169 additions and 315 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 @@ -18,10 +18,10 @@
import org.eclipse.sirius.components.collaborative.forms.services.api.IPropertiesDescriptionRegistry;
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.api.ISiriusDesktopRepresentationDescriptionConverter;
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 +37,32 @@
* @author hmarchadour
*/
@Configuration
public class SiriusRepresentationDescriptionRegistryConfigurer implements IRepresentationDescriptionRegistryConfigurer, IPropertiesDescriptionRegistryConfigurer {
public class SiriusDesktopRepresentationDescriptionProvider implements IEditingContextRepresentationDescriptionProvider, IPropertiesDescriptionRegistryConfigurer {

private final List<ISiriusConfiguration> siriusConfigurations;

private final ODesignReader oDesignReader;

private final SiriusRepresentationDescriptionProvider representationDescriptionProvider;
private final ISiriusDesktopRepresentationDescriptionConverter representationDescriptionConverter;

public SiriusRepresentationDescriptionRegistryConfigurer(List<ISiriusConfiguration> siriusConfigurations, ODesignReader oDesignReader,
SiriusRepresentationDescriptionProvider representationDescriptionProvider) {
public SiriusDesktopRepresentationDescriptionProvider(List<ISiriusConfiguration> siriusConfigurations, ODesignReader oDesignReader, ISiriusDesktopRepresentationDescriptionConverter representationDescriptionConverter) {
this.siriusConfigurations = Objects.requireNonNull(siriusConfigurations);
this.oDesignReader = Objects.requireNonNull(oDesignReader);
this.representationDescriptionProvider = Objects.requireNonNull(representationDescriptionProvider);
this.representationDescriptionConverter = Objects.requireNonNull(representationDescriptionConverter);
}

@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 All @@ -82,7 +81,7 @@ public void addPropertiesDescriptions(IPropertiesDescriptionRegistry registry) {

private List<IRepresentationDescription> getRepresentationDescriptions(String odesignPath) {
return this.oDesignReader.read(new ClassPathResource(odesignPath))
.map(this.representationDescriptionProvider::getRepresentationDescriptions)
.map(this.representationDescriptionConverter::getRepresentationDescriptions)
.orElse(List.of());
}
}
@@ -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,18 @@
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.sirius.components.core.configuration;
package org.eclipse.sirius.components.compatibility.services.api;

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

import org.eclipse.sirius.components.representations.IRepresentationDescription;
import org.eclipse.sirius.viewpoint.description.Group;

/**
* Interface to be implemented as a Spring configuration in order to configure the representation description registry.
* Used to convert Sirius representation descriptions.
*
* @author sbegaudeau
*/
@PublicApi
public interface IRepresentationDescriptionRegistryConfigurer {
void addRepresentationDescriptions(IRepresentationDescriptionRegistry registry);
public interface ISiriusDesktopRepresentationDescriptionConverter {
List<IRepresentationDescription> getRepresentationDescriptions(Group group);
}
@@ -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 @@ -20,6 +20,7 @@
import java.util.stream.Stream;

import org.eclipse.sirius.components.compatibility.services.SelectModelElementVariableProvider;
import org.eclipse.sirius.components.compatibility.services.api.ISiriusDesktopRepresentationDescriptionConverter;
import org.eclipse.sirius.components.compatibility.services.diagrams.api.IDiagramDescriptionConverter;
import org.eclipse.sirius.components.compatibility.services.forms.api.IViewExtensionDescriptionConverter;
import org.eclipse.sirius.components.compatibility.services.selection.api.ISelectModelElementVariableConverter;
Expand All @@ -42,21 +43,22 @@
* @author sbegaudeau
*/
@Service
public class SiriusRepresentationDescriptionProvider {
public class SiriusDesktopRepresentationDescriptionConverter implements ISiriusDesktopRepresentationDescriptionConverter {

private final IDiagramDescriptionConverter diagramDescriptionConverter;

private final IViewExtensionDescriptionConverter viewExtensionDescriptionConverter;

private final ISelectModelElementVariableConverter selectModelElementVariableConverter;

public SiriusRepresentationDescriptionProvider(IDiagramDescriptionConverter diagramDescriptionConverter, IViewExtensionDescriptionConverter viewExtensionDescriptionConverter,
ISelectModelElementVariableConverter selectModelElementVariableConverter) {
public SiriusDesktopRepresentationDescriptionConverter(IDiagramDescriptionConverter diagramDescriptionConverter, IViewExtensionDescriptionConverter viewExtensionDescriptionConverter,
ISelectModelElementVariableConverter selectModelElementVariableConverter) {
this.diagramDescriptionConverter = Objects.requireNonNull(diagramDescriptionConverter);
this.viewExtensionDescriptionConverter = Objects.requireNonNull(viewExtensionDescriptionConverter);
this.selectModelElementVariableConverter = Objects.requireNonNull(selectModelElementVariableConverter);
}

@Override
public List<IRepresentationDescription> getRepresentationDescriptions(Group group) {
List<Viewpoint> viewpoints = group.getOwnedViewpoints();

Expand Down
@@ -0,0 +1,28 @@
/*******************************************************************************
* 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.core.api;

import java.util.List;

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

/**
* Used to provide the representation description of the editing context.
*
* Note: This interface will soon be moved into sirius-web-application
*
* @author sbegaudeau
*/
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

0 comments on commit 68c8f59

Please sign in to comment.