Skip to content

Commit 4e0b2b5

Browse files
AxelRICHARDsbegaudeau
authored andcommitted
[3693] Fix getReferenceOptions on ReferenceWidget converter switch
Bug: #3693 Signed-off-by: Axel RICHARD <axel.richard@obeo.fr>
1 parent f62012b commit 4e0b2b5

File tree

3 files changed

+97
-10
lines changed

3 files changed

+97
-10
lines changed

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ More existing APIs will be migrated to this new common pattern.
6969
- https://github.com/eclipse-sirius/sirius-web/issues/3630[#3630] [sirius-web] Restore support for the deletion of dangling representations
7070
- https://github.com/eclipse-sirius/sirius-web/issues/3666[#3666] [core] Enable EMF's intrinsicIDToEObjectMap for JSON resources to support languages which use modeled identifiers (e.g. SysMLv2).
7171
- https://github.com/eclipse-sirius/sirius-web/issues/3664[#3664] [core] The Default.svg image is no longer displayed with the new architecture.
72+
- https://github.com/eclipse-sirius/sirius-web/issues/3693[#3693] [view] Fix the computation of the candidates for the ReferenceWidget.
7273

7374
=== New Features
7475

packages/view/backend/sirius-components-view-emf-widget-reference/src/main/java/org/eclipse/sirius/components/view/emf/widget/reference/ReferenceWidgetDescriptionConverterSwitch.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@
5151
import org.eclipse.sirius.components.view.emf.OperationInterpreter;
5252
import org.eclipse.sirius.components.view.emf.form.IFormIdProvider;
5353
import org.eclipse.sirius.components.view.form.FormElementDescription;
54-
import org.eclipse.sirius.components.widget.reference.ReferenceWidgetComponent;
55-
import org.eclipse.sirius.components.widget.reference.ReferenceWidgetStyle;
5654
import org.eclipse.sirius.components.view.widget.reference.ReferenceWidgetDescription;
5755
import org.eclipse.sirius.components.view.widget.reference.ReferenceWidgetDescriptionStyle;
5856
import org.eclipse.sirius.components.view.widget.reference.util.ReferenceSwitch;
57+
import org.eclipse.sirius.components.widget.reference.ReferenceWidgetComponent;
58+
import org.eclipse.sirius.components.widget.reference.ReferenceWidgetStyle;
5959
import org.slf4j.Logger;
6060
import org.slf4j.LoggerFactory;
6161

@@ -201,24 +201,22 @@ private List<?> getReferenceValue(ReferenceWidgetDescription referenceDescriptio
201201
}
202202

203203
private List<?> getReferenceOptions(ReferenceWidgetDescription referenceDescription, VariableManager variableManager) {
204-
var optionalEObject = variableManager.get(VariableManager.SELF, EObject.class);
205204
EObject owner = this.getReferenceOwner(variableManager, referenceDescription.getReferenceOwnerExpression());
206205
String referenceName = this.getStringValueProvider(referenceDescription.getReferenceNameExpression()).apply(variableManager);
207-
if (optionalEObject.isPresent() && owner != null && owner.eClass().getEStructuralFeature(referenceName) instanceof EReference eReference) {
208-
EObject eObject = optionalEObject.get();
209-
Object adapter = this.adapterFactory.adapt(eObject, IItemPropertySource.class);
206+
if (owner != null && owner.eClass().getEStructuralFeature(referenceName) instanceof EReference eReference) {
207+
Object adapter = this.adapterFactory.adapt(owner, IItemPropertySource.class);
210208
if (adapter instanceof IItemPropertySource itemPropertySource) {
211-
IItemPropertyDescriptor descriptor = itemPropertySource.getPropertyDescriptor(eObject, eReference);
209+
IItemPropertyDescriptor descriptor = itemPropertySource.getPropertyDescriptor(owner, eReference);
212210
List<?> referenceOptions;
213211
if (descriptor != null) {
214-
referenceOptions = descriptor.getChoiceOfValues(eObject).stream()
212+
referenceOptions = descriptor.getChoiceOfValues(owner).stream()
215213
.filter(Objects::nonNull)
216214
.toList();
217215
} else {
218-
referenceOptions = Arrays.asList(ItemPropertyDescriptor.getReachableObjectsOfType(eObject, eReference.getEReferenceType()).toArray());
216+
referenceOptions = Arrays.asList(ItemPropertyDescriptor.getReachableObjectsOfType(owner, eReference.getEReferenceType()).toArray());
219217
}
220218
return referenceOptions.stream()
221-
.filter(option -> !this.isOptionAncestorAndContainmentReference((EObject) option, eObject, eReference))
219+
.filter(option -> !this.isOptionAncestorAndContainmentReference((EObject) option, owner, eReference))
222220
.toList();
223221
}
224222
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.sirius.components.view.emf.widget.reference.architecture;
14+
15+
import static org.junit.jupiter.api.Assertions.assertEquals;
16+
import static org.junit.jupiter.api.Assertions.assertFalse;
17+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
18+
import static org.junit.jupiter.api.Assertions.assertNotNull;
19+
import static org.junit.jupiter.api.Assertions.assertTrue;
20+
21+
import java.util.List;
22+
import java.util.Optional;
23+
24+
import org.eclipse.emf.ecore.EClass;
25+
import org.eclipse.emf.ecore.EOperation;
26+
import org.eclipse.emf.ecore.EPackage;
27+
import org.eclipse.emf.ecore.EcoreFactory;
28+
import org.eclipse.emf.ecore.EcorePackage;
29+
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
30+
import org.eclipse.emf.ecore.util.EcoreAdapterFactory;
31+
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
32+
import org.eclipse.sirius.components.core.api.IEditService;
33+
import org.eclipse.sirius.components.core.api.IFeedbackMessageService;
34+
import org.eclipse.sirius.components.core.api.IObjectService;
35+
import org.eclipse.sirius.components.emf.services.api.IEMFKindService;
36+
import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription;
37+
import org.eclipse.sirius.components.interpreter.AQLInterpreter;
38+
import org.eclipse.sirius.components.representations.VariableManager;
39+
import org.eclipse.sirius.components.view.emf.form.IFormIdProvider;
40+
import org.eclipse.sirius.components.view.emf.widget.reference.ReferenceWidgetDescriptionConverterSwitch;
41+
import org.eclipse.sirius.components.view.widget.reference.ReferenceFactory;
42+
import org.eclipse.sirius.components.view.widget.reference.ReferenceWidgetDescription;
43+
import org.junit.jupiter.api.Test;
44+
45+
/**
46+
* Converts a View-based ReferenceWidgetDescription into its API equivalent.
47+
*
48+
* @author pcdavid
49+
*/
50+
public class ReferenceWidgetDescriptionConverterSwitchTest {
51+
52+
@Test
53+
public void testReferenceOptions() {
54+
var interpreter = new AQLInterpreter(List.of(), List.of(EcorePackage.eINSTANCE));
55+
var objectService = new IObjectService.NoOp();
56+
var editService = new IEditService.NoOp();
57+
var emfKindService = new IEMFKindService.NoOp();
58+
var feedbackMessageService = new IFeedbackMessageService.NoOp();
59+
var composedAdapterFactory = new ComposedAdapterFactory();
60+
composedAdapterFactory.addAdapterFactory(new EcoreAdapterFactory());
61+
composedAdapterFactory.addAdapterFactory(new EcoreItemProviderAdapterFactory());
62+
var widgetIdProvider = new IFormIdProvider.NoOp();
63+
var converterSwitch = new ReferenceWidgetDescriptionConverterSwitch(interpreter, objectService, editService, emfKindService, feedbackMessageService, composedAdapterFactory, widgetIdProvider);
64+
65+
EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
66+
EClass eClass = EcoreFactory.eINSTANCE.createEClass();
67+
EOperation eOperation = EcoreFactory.eINSTANCE.createEOperation();
68+
ePackage.getEClassifiers().add(eClass);
69+
eClass.getEOperations().add(eOperation);
70+
71+
VariableManager variableManager = new VariableManager();
72+
variableManager.put("self", ePackage);
73+
74+
ReferenceWidgetDescription referenceWidgetDescription = ReferenceFactory.eINSTANCE.createReferenceWidgetDescription();
75+
referenceWidgetDescription.setName("TEST");
76+
referenceWidgetDescription.setLabelExpression("TEST");
77+
referenceWidgetDescription.setReferenceNameExpression("eOperations");
78+
referenceWidgetDescription.setReferenceOwnerExpression("aql:self.eClassifiers->first()");
79+
Optional<AbstractWidgetDescription> widgetDescription = converterSwitch.caseReferenceWidgetDescription(referenceWidgetDescription);
80+
assertTrue(widgetDescription.isPresent());
81+
AbstractWidgetDescription abstractWidgetDescription = widgetDescription.get();
82+
assertInstanceOf(org.eclipse.sirius.components.widget.reference.ReferenceWidgetDescription.class, abstractWidgetDescription);
83+
List<?> options = ((org.eclipse.sirius.components.widget.reference.ReferenceWidgetDescription) abstractWidgetDescription).getOptionsProvider().apply(variableManager);
84+
assertNotNull(options);
85+
assertFalse(options.isEmpty());
86+
assertEquals(eOperation, options.get(0));
87+
}
88+
}

0 commit comments

Comments
 (0)