diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index c8cad855ce..0ce57bf8e5 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -31,6 +31,7 @@ For example, Diagram & Form domains are not root domains because `DiagramDescrip - https://github.com/eclipse-sirius/sirius-web/issues/2456[#2456] [sirius-web] The GraphQL field `CreateChildSuccessPayload` now expects to have a list of messages. - https://github.com/eclipse-sirius/sirius-web/issues/1982[#1982] [diagram] Change the diagram structure. The Node's 'label' attribute has been renamed into 'insideLabel' and its type changed from `Label` to `InsideLabel` (which is currently identical to `Label` except for the name). - https://github.com/eclipse-sirius/sirius-web/issues/2388[#2388] [core] The `IObjectService.getImagePath` API changed and now must return a list containing all the image paths to compose/overlay. +- https://github.com/eclipse-sirius/sirius-web/issues/2460[#2460] [form] The reference widget no longer declares a `createElementHandlerProvider`, this feature is delegated to the new service `IReferenceWidgetCreateElementHandler`. === Dependency update diff --git a/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/NonContainmentReferenceIfDescriptionProvider.java b/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/NonContainmentReferenceIfDescriptionProvider.java index 6e08c1e6bd..a2499703e8 100644 --- a/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/NonContainmentReferenceIfDescriptionProvider.java +++ b/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/NonContainmentReferenceIfDescriptionProvider.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.UUID; import java.util.function.Function; import org.eclipse.emf.common.util.EList; @@ -29,8 +28,6 @@ import org.eclipse.sirius.components.collaborative.api.ChangeKind; import org.eclipse.sirius.components.compatibility.emf.properties.api.IPropertiesValidationProvider; import org.eclipse.sirius.components.compatibility.forms.WidgetIdProvider; -import org.eclipse.sirius.components.core.api.IEditService; -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.IEMFKindService; @@ -67,13 +64,11 @@ public class NonContainmentReferenceIfDescriptionProvider { private final IFeedbackMessageService feedbackMessageService; - private final IEditService editService; - public NonContainmentReferenceIfDescriptionProvider(ComposedAdapterFactory composedAdapterFactory, IObjectService objectService, IEditService editService, IEMFKindService emfKindService, + public NonContainmentReferenceIfDescriptionProvider(ComposedAdapterFactory composedAdapterFactory, IObjectService objectService, IEMFKindService emfKindService, IFeedbackMessageService feedbackMessageService, IPropertiesValidationProvider propertiesValidationProvider, Function semanticTargetIdProvider) { this.composedAdapterFactory = Objects.requireNonNull(composedAdapterFactory); this.objectService = Objects.requireNonNull(objectService); - this.editService = Objects.requireNonNull(editService); this.propertiesValidationProvider = Objects.requireNonNull(propertiesValidationProvider); this.semanticTargetIdProvider = Objects.requireNonNull(semanticTargetIdProvider); this.emfKindService = Objects.requireNonNull(emfKindService); @@ -120,7 +115,6 @@ private ReferenceWidgetDescription getReferenceWidgetDescription() { .itemRemoveHandlerProvider(this::handleRemoveValue) .setHandlerProvider(this::handleSetReference) .addHandlerProvider(this::handleAddReferenceValues) - .createElementHandlerProvider(this::handleCreateElement) .moveHandlerProvider(this::handleMoveReferenceValue) .build(); } @@ -306,24 +300,6 @@ private IStatus handleAddReferenceValues(VariableManager variableManager) { return result; } - private Object handleCreateElement(VariableManager variableManager) { - Optional result = Optional.empty(); - Optional optionalIsChild = variableManager.get(ReferenceWidgetComponent.IS_CHILD_CREATION_VARIABLE, Boolean.class); - var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class); - String creationDescriptionId = variableManager.get(ReferenceWidgetComponent.CREATION_DESCRIPTION_ID_VARIABLE, String.class).orElse(""); - if (optionalIsChild.isPresent() && optionalEditingContext.isPresent()) { - if (optionalIsChild.get()) { - EObject parent = variableManager.get(ReferenceWidgetComponent.PARENT_VARIABLE, EObject.class).orElse(null); - result = this.editService.createChild(optionalEditingContext.get(), parent, creationDescriptionId); - } else { - UUID documentId = variableManager.get(ReferenceWidgetComponent.DOCUMENT_ID_VARIABLE, UUID.class).orElse(UUID.randomUUID()); - String domainId = variableManager.get(ReferenceWidgetComponent.DOMAIN_ID_VARIABLE, String.class).orElse(""); - result = this.editService.createRootObject(optionalEditingContext.get(), documentId, domainId, creationDescriptionId); - } - } - return result.orElse(null); - } - private IStatus handleMoveReferenceValue(VariableManager variableManager) { IStatus result = this.createErrorStatus("Something went wrong while reordering reference values."); EObject referenceOwner = variableManager.get(VariableManager.SELF, EObject.class).orElse(null); diff --git a/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/PropertiesDefaultDescriptionProvider.java b/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/PropertiesDefaultDescriptionProvider.java index 6af2d38808..c771a2ffc5 100644 --- a/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/PropertiesDefaultDescriptionProvider.java +++ b/packages/compatibility/backend/sirius-components-compatibility-emf/src/main/java/org/eclipse/sirius/components/compatibility/emf/properties/PropertiesDefaultDescriptionProvider.java @@ -29,7 +29,6 @@ import org.eclipse.sirius.components.collaborative.forms.PropertiesEventProcessorFactory; import org.eclipse.sirius.components.collaborative.forms.api.IPropertiesDefaultDescriptionProvider; import org.eclipse.sirius.components.compatibility.emf.properties.api.IPropertiesValidationProvider; -import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.emf.services.api.IEMFKindService; @@ -55,8 +54,6 @@ public class PropertiesDefaultDescriptionProvider implements IPropertiesDefaultD private final IObjectService objectService; - private final IEditService editService; - private final IEMFKindService emfKindService; private final IFeedbackMessageService feedbackMessageService; @@ -69,10 +66,9 @@ public class PropertiesDefaultDescriptionProvider implements IPropertiesDefaultD private final Function semanticTargetIdProvider; - public PropertiesDefaultDescriptionProvider(IObjectService objectService, IEditService editService, IEMFKindService emfKindService, IFeedbackMessageService feedbackMessageService, ComposedAdapterFactory composedAdapterFactory, IPropertiesValidationProvider propertiesValidationProvider, + public PropertiesDefaultDescriptionProvider(IObjectService objectService, IEMFKindService emfKindService, IFeedbackMessageService feedbackMessageService, ComposedAdapterFactory composedAdapterFactory, IPropertiesValidationProvider propertiesValidationProvider, IEMFMessageService emfMessageService) { this.objectService = Objects.requireNonNull(objectService); - this.editService = Objects.requireNonNull(editService); this.emfKindService = Objects.requireNonNull(emfKindService); this.feedbackMessageService = Objects.requireNonNull(feedbackMessageService); this.composedAdapterFactory = Objects.requireNonNull(composedAdapterFactory); @@ -173,7 +169,7 @@ private GroupDescription getGroupDescription() { ifDescriptions.add(new EBooleanIfDescriptionProvider(this.composedAdapterFactory, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); ifDescriptions.add(new EEnumIfDescriptionProvider(this.composedAdapterFactory, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); - ifDescriptions.add(new NonContainmentReferenceIfDescriptionProvider(this.composedAdapterFactory, this.objectService, this.editService, this.emfKindService, this.feedbackMessageService, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); + ifDescriptions.add(new NonContainmentReferenceIfDescriptionProvider(this.composedAdapterFactory, this.objectService, this.emfKindService, this.feedbackMessageService, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); // @formatter:off var numericDataTypes = List.of( diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/ReferenceWidgetDefaultCreateElementHandler.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/ReferenceWidgetDefaultCreateElementHandler.java new file mode 100644 index 0000000000..4fa499c605 --- /dev/null +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/ReferenceWidgetDefaultCreateElementHandler.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.widget.reference; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IEditService; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.widget.reference.IReferenceWidgetCreateElementHandler; +import org.springframework.stereotype.Service; + +/** + * * Default implementation of {@link IReferenceWidgetCreateElementHandler}. + * * This implementation use {@link IEditService}. + * + * @author frouene + */ +@Service +public class ReferenceWidgetDefaultCreateElementHandler implements IReferenceWidgetCreateElementHandler { + + private final IEditService editService; + + public ReferenceWidgetDefaultCreateElementHandler(IEditService editService) { + this.editService = Objects.requireNonNull(editService); + } + + @Override + public boolean canHandle(String descriptionId) { + return false; // Default implementation, it'll be used if no other service can handle the descriptionId + } + + @Override + public List getRootCreationDescriptions(IEditingContext editingContext, String domainId, String referenceKind, String descriptionId) { + return this.editService.getRootCreationDescriptions(editingContext, domainId, false, referenceKind); + } + + @Override + public List getChildCreationDescriptions(IEditingContext editingContext, String kind, String referenceKind, String descriptionId) { + return this.editService.getChildCreationDescriptions(editingContext, kind, referenceKind); + } + + @Override + public Optional createRootObject(IEditingContext editingContext, UUID documentId, String domainId, String rootObjectCreationDescriptionId, String descriptionId) { + return this.editService.createRootObject(editingContext, documentId, domainId, rootObjectCreationDescriptionId); + } + + @Override + public Optional createChild(IEditingContext editingContext, Object object, String childCreationDescriptionId, String descriptionId) { + return this.editService.createChild(editingContext, object, childCreationDescriptionId); + } +} diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/ReferenceWidgetDescriptionConverterSwitch.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/ReferenceWidgetDescriptionConverterSwitch.java index 06ad401669..a814a8d8ac 100644 --- a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/ReferenceWidgetDescriptionConverterSwitch.java +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/ReferenceWidgetDescriptionConverterSwitch.java @@ -18,7 +18,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.UUID; import java.util.function.Function; import org.eclipse.emf.common.notify.AdapterFactory; @@ -36,7 +35,6 @@ import org.eclipse.sirius.components.compatibility.forms.WidgetIdProvider; import org.eclipse.sirius.components.compatibility.utils.StringValueProvider; import org.eclipse.sirius.components.core.api.IEditService; -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.IEMFKindService; @@ -135,7 +133,6 @@ public AbstractWidgetDescription caseReferenceWidgetDescription(ReferenceWidgetD .itemRemoveHandlerProvider(variableManager -> this.handleItemRemove(variableManager, referenceDescription)) .setHandlerProvider(variableManager -> this.handleSetReference(variableManager, referenceDescription)) .addHandlerProvider(variableManager -> this.handleAddReference(variableManager, referenceDescription)) - .createElementHandlerProvider(variableManager -> this.handleCreateElement(variableManager, referenceDescription)).styleProvider(styleProvider) .moveHandlerProvider(variableManager -> this.handleMoveReferenceValue(variableManager, referenceDescription)); if (referenceDescription.getHelpExpression() != null && !referenceDescription.getHelpExpression().isBlank()) { @@ -357,24 +354,6 @@ private IStatus handleAddReference(VariableManager variableManager, ReferenceWid return result; } - private Object handleCreateElement(VariableManager variableManager, ReferenceWidgetDescription referenceDescription) { - Optional result = Optional.empty(); - Optional optionalIsChild = variableManager.get(ReferenceWidgetComponent.IS_CHILD_CREATION_VARIABLE, Boolean.class); - var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class); - String creationDescriptionId = variableManager.get(ReferenceWidgetComponent.CREATION_DESCRIPTION_ID_VARIABLE, String.class).orElse(""); - if (optionalIsChild.isPresent() && optionalEditingContext.isPresent()) { - if (optionalIsChild.get()) { - EObject parent = variableManager.get(ReferenceWidgetComponent.PARENT_VARIABLE, EObject.class).orElse(null); - result = this.editService.createChild(optionalEditingContext.get(), parent, creationDescriptionId); - } else { - UUID documentId = variableManager.get(ReferenceWidgetComponent.DOCUMENT_ID_VARIABLE, UUID.class).orElse(UUID.randomUUID()); - String domainId = variableManager.get(ReferenceWidgetComponent.DOMAIN_ID_VARIABLE, String.class).orElse(""); - result = this.editService.createRootObject(optionalEditingContext.get(), documentId, domainId, creationDescriptionId); - } - } - return result.orElse(null); - } - private IStatus handleMoveReferenceValue(VariableManager variableManager, ReferenceWidgetDescription referenceDescription) { IStatus result = this.createErrorStatus("Something went wrong while reordering reference values."); EObject owner = this.getReferenceOwner(variableManager, referenceDescription.getReferenceOwnerExpression()); diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ModelBrowsersDescriptionProvider.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ModelBrowsersDescriptionProvider.java index 46056dcd25..fb1d4fb9fe 100644 --- a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ModelBrowsersDescriptionProvider.java +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ModelBrowsersDescriptionProvider.java @@ -50,8 +50,6 @@ import org.eclipse.sirius.components.trees.description.TreeDescription; import org.eclipse.sirius.components.trees.renderer.TreeRenderer; import org.eclipse.sirius.components.widget.reference.IReferenceWidgetRootCandidateSearchProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** @@ -70,8 +68,6 @@ public class ModelBrowsersDescriptionProvider implements IRepresentationDescript public static final String TREE_KIND = "modelBrowser://"; - private final Logger logger = LoggerFactory.getLogger(ModelBrowsersDescriptionProvider.class); - private final IObjectService objectService; private final IURLParser urlParser; @@ -80,11 +76,14 @@ public class ModelBrowsersDescriptionProvider implements IRepresentationDescript private final List candidateProviders; - public ModelBrowsersDescriptionProvider(IObjectService objectService, IURLParser urlParser, IEMFKindService emfKindService, List candidateProviders) { + private final ReferenceWidgetDefaultCandidateSearchProvider defaultCandidateProvider; + + public ModelBrowsersDescriptionProvider(IObjectService objectService, IURLParser urlParser, IEMFKindService emfKindService, List candidateProviders, ReferenceWidgetDefaultCandidateSearchProvider defaultCandidateProvider) { this.objectService = Objects.requireNonNull(objectService); this.urlParser = Objects.requireNonNull(urlParser); this.emfKindService = Objects.requireNonNull(emfKindService); this.candidateProviders = Objects.requireNonNull(candidateProviders); + this.defaultCandidateProvider = Objects.requireNonNull(defaultCandidateProvider); } @Override @@ -297,12 +296,9 @@ private List getSearchScopeElements(VariableManager variableMa return this.candidateProviders.stream() .filter(provider -> provider.canHandle(descriptionId)) - .map(provider -> provider.getRootElementsForReference(semanticOwner, descriptionId, optionalEditingContext.get())) .findFirst() - .orElseGet(() -> { - this.logger.warn("Unable to find a proper implementation of IReferenceWidgetRootCandidateSeachProvider for widget {}", descriptionId); - return List.of(); - }); + .orElse(this.defaultCandidateProvider) + .getRootElementsForReference(semanticOwner, descriptionId, optionalEditingContext.get()); } return Collections.emptyList(); } diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ReferenceWidgetDefaultCandidateSearchProvider.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ReferenceWidgetDefaultCandidateSearchProvider.java index 45996fde0f..8a59090964 100644 --- a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ReferenceWidgetDefaultCandidateSearchProvider.java +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/browser/ReferenceWidgetDefaultCandidateSearchProvider.java @@ -25,7 +25,6 @@ import org.springframework.stereotype.Service; /** - * * Default implementation of {@link IReferenceWidgetRootCandidateSearchProvider}. * This implementation returns all root resources from the current model. * @@ -36,7 +35,7 @@ public class ReferenceWidgetDefaultCandidateSearchProvider implements IReference @Override public boolean canHandle(String descriptionId) { - return true; + return false; // Default implementation, it'll be used if no other service can handle the descriptionId } @Override diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/CreateElementInput.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/CreateElementInput.java index 67f67c7aaf..7a94ce7a9b 100644 --- a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/CreateElementInput.java +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/CreateElementInput.java @@ -21,6 +21,7 @@ * * @author Jerome Gout */ -public record CreateElementInput(UUID id, String editingContextId, String representationId, String referenceWidgetId, String containerId, String domainId, String creationDescriptionId) implements IFormInput { +public record CreateElementInput(UUID id, String editingContextId, String representationId, String referenceWidgetId, String containerId, String domainId, + String creationDescriptionId, String descriptionId) implements IFormInput { } diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/dto/CreateElementInReferenceHandlerParameters.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/ReferenceWidgetChildCreationDescriptionsInput.java similarity index 58% rename from packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/dto/CreateElementInReferenceHandlerParameters.java rename to packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/ReferenceWidgetChildCreationDescriptionsInput.java index ca3ffb906f..34efcf4f33 100644 --- a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/dto/CreateElementInReferenceHandlerParameters.java +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/ReferenceWidgetChildCreationDescriptionsInput.java @@ -10,17 +10,17 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -package org.eclipse.sirius.components.widget.reference.dto; +package org.eclipse.sirius.components.collaborative.widget.reference.dto; import java.util.UUID; -import org.eclipse.emf.ecore.EObject; +import org.eclipse.sirius.components.core.api.IInput; /** - * Input object to pass inputs to the createElementInReferenceHandler field of ReferenceWidget. + * Input object for the query to retrieve the child creation descriptions. * - * @author Jerome Gout + * @author frouene */ -public record CreateElementInReferenceHandlerParameters(UUID documentId, String domainId, EObject parent, String creationDescriptionId) { +public record ReferenceWidgetChildCreationDescriptionsInput(UUID id, String editingContextId, String kind, String referenceKind, String descriptionId) implements IInput { } diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/ReferenceWidgetRootCreationDescriptionsInput.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/ReferenceWidgetRootCreationDescriptionsInput.java new file mode 100644 index 0000000000..6a91d37f84 --- /dev/null +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/dto/ReferenceWidgetRootCreationDescriptionsInput.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.widget.reference.dto; + +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IInput; + +/** + * Input object for the query to retrieve the root creation descriptions. + * + * @author frouene + */ +public record ReferenceWidgetRootCreationDescriptionsInput(UUID id, String editingContextId, String domainId, String referenceKind, String descriptionId) implements IInput { + +} diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandler.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandler.java index 66a0981500..39479befc4 100644 --- a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandler.java +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandler.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.sirius.components.collaborative.widget.reference.handlers; +import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -23,6 +24,7 @@ import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler; import org.eclipse.sirius.components.collaborative.forms.api.IFormInput; import org.eclipse.sirius.components.collaborative.forms.api.IFormQueryService; +import org.eclipse.sirius.components.collaborative.widget.reference.ReferenceWidgetDefaultCreateElementHandler; import org.eclipse.sirius.components.collaborative.widget.reference.dto.CreateElementInReferenceSuccessPayload; import org.eclipse.sirius.components.collaborative.widget.reference.dto.CreateElementInput; import org.eclipse.sirius.components.collaborative.widget.reference.messages.IReferenceMessageService; @@ -32,8 +34,8 @@ import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.core.api.IPayload; import org.eclipse.sirius.components.forms.Form; +import org.eclipse.sirius.components.widget.reference.IReferenceWidgetCreateElementHandler; import org.eclipse.sirius.components.widget.reference.ReferenceWidget; -import org.eclipse.sirius.components.widget.reference.dto.CreateElementInReferenceHandlerParameters; import org.springframework.stereotype.Service; import io.micrometer.core.instrument.Counter; @@ -55,14 +57,20 @@ public class CreateElementEventHandler implements IFormEventHandler { private final IObjectService objectService; + private final List referenceWidgetCreateElementHandlers; + + private final ReferenceWidgetDefaultCreateElementHandler defaultReferenceWidgetCreateElementHandler; + private final Counter counter; private final IFeedbackMessageService feedbackMessageService; - public CreateElementEventHandler(IFormQueryService formQueryService, IReferenceMessageService messageService, IObjectService objectService, MeterRegistry meterRegistry, IFeedbackMessageService feedbackMessageService) { + public CreateElementEventHandler(IFormQueryService formQueryService, IReferenceMessageService messageService, IObjectService objectService, List referenceWidgetCreateElementHandlers, ReferenceWidgetDefaultCreateElementHandler defaultReferenceWidgetCreateElementHandler, MeterRegistry meterRegistry, IFeedbackMessageService feedbackMessageService) { this.formQueryService = Objects.requireNonNull(formQueryService); this.messageService = Objects.requireNonNull(messageService); this.objectService = Objects.requireNonNull(objectService); + this.referenceWidgetCreateElementHandlers = Objects.requireNonNull(referenceWidgetCreateElementHandlers); + this.defaultReferenceWidgetCreateElementHandler = Objects.requireNonNull(defaultReferenceWidgetCreateElementHandler); this.feedbackMessageService = Objects.requireNonNull(feedbackMessageService); this.counter = Counter.builder(Monitoring.EVENT_HANDLER).tag(Monitoring.NAME, this.getClass().getSimpleName()).register(meterRegistry); @@ -87,8 +95,12 @@ public void handle(One payloadSink, Many changeDesc if (optionalWidget.isPresent() && optionalWidget.get().isReadOnly()) { payload = new ErrorPayload(input.id(), this.messageService.unableToEditReadOnlyWidget()); } else { - var handlerInput = this.getHandlerInput(editingContext, input); - Optional optionalObject = optionalWidget.map(ReferenceWidget::getCreateElementHandler).map(handler -> handler.apply(handlerInput)); + IReferenceWidgetCreateElementHandler handler = this.referenceWidgetCreateElementHandlers.stream() + .filter(provider -> provider.canHandle(input.descriptionId())) + .findFirst() + .orElse(this.defaultReferenceWidgetCreateElementHandler); + + var optionalObject = this.createElement(editingContext, handler, input); if (optionalObject.isPresent()) { payload = new CreateElementInReferenceSuccessPayload(formInput.id(), optionalObject.get(), this.feedbackMessageService.getFeedbackMessages()); @@ -103,16 +115,16 @@ public void handle(One payloadSink, Many changeDesc payloadSink.tryEmitValue(payload); } - private CreateElementInReferenceHandlerParameters getHandlerInput(IEditingContext editingContext, CreateElementInput input) { - if (input.domainId() != null) { - return new CreateElementInReferenceHandlerParameters(UUID.fromString(input.containerId()), input.domainId(), null, input.creationDescriptionId()); - } else { - // this is child creation => containerId = parent object id + private Optional createElement(IEditingContext editingContext, IReferenceWidgetCreateElementHandler handler, CreateElementInput input) { + if (input.domainId() == null) { EObject parent = this.objectService.getObject(editingContext, input.containerId()) .filter(EObject.class::isInstance) .map(EObject.class::cast) .orElse(null); - return new CreateElementInReferenceHandlerParameters(null, null, parent, input.creationDescriptionId()); + return handler.createChild(editingContext, parent, input.creationDescriptionId(), input.descriptionId()); + } else { + return handler.createRootObject(editingContext, UUID.fromString(input.containerId()), input.domainId(), input.creationDescriptionId(), input.descriptionId()); } } + } diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/ReferenceWidgetChildCreationDescriptionsEventHandler.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/ReferenceWidgetChildCreationDescriptionsEventHandler.java new file mode 100644 index 0000000000..ea8e9e82ad --- /dev/null +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/ReferenceWidgetChildCreationDescriptionsEventHandler.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.widget.reference.handlers; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventHandler; +import org.eclipse.sirius.components.collaborative.api.Monitoring; +import org.eclipse.sirius.components.collaborative.dto.EditingContextChildObjectCreationDescriptionsPayload; +import org.eclipse.sirius.components.collaborative.widget.reference.ReferenceWidgetDefaultCreateElementHandler; +import org.eclipse.sirius.components.collaborative.widget.reference.dto.ReferenceWidgetChildCreationDescriptionsInput; +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.widget.reference.IReferenceWidgetCreateElementHandler; +import org.springframework.stereotype.Service; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import reactor.core.publisher.Sinks; + +/** + * Handler used to retrieve the child creation descriptions from a reference widget. + * + * @author frouene + */ +@Service +public class ReferenceWidgetChildCreationDescriptionsEventHandler implements IEditingContextEventHandler { + + private final List referenceWidgetCreateElementHandlers; + + private final ReferenceWidgetDefaultCreateElementHandler defaultReferenceWidgetCreateElementHandler; + + private final Counter counter; + + public ReferenceWidgetChildCreationDescriptionsEventHandler(List referenceWidgetCreateElementHandlers, ReferenceWidgetDefaultCreateElementHandler defaultReferenceWidgetCreateElementHandler, MeterRegistry meterRegistry) { + this.referenceWidgetCreateElementHandlers = Objects.requireNonNull(referenceWidgetCreateElementHandlers); + this.defaultReferenceWidgetCreateElementHandler = Objects.requireNonNull(defaultReferenceWidgetCreateElementHandler); + this.counter = Counter.builder(Monitoring.EVENT_HANDLER).tag(Monitoring.NAME, this.getClass().getSimpleName()).register(meterRegistry); + } + + @Override + public boolean canHandle(IEditingContext editingContext, IInput input) { + return input instanceof ReferenceWidgetChildCreationDescriptionsInput; + } + + @Override + public void handle(Sinks.One payloadSink, Sinks.Many changeDescriptionSink, IEditingContext editingContext, IInput input) { + this.counter.increment(); + + List childCreationDescriptions = List.of(); + if (input instanceof ReferenceWidgetChildCreationDescriptionsInput castInput) { + + childCreationDescriptions = this.referenceWidgetCreateElementHandlers.stream() + .filter(provider -> provider.canHandle(castInput.descriptionId())) + .findFirst() + .orElse(this.defaultReferenceWidgetCreateElementHandler) + .getChildCreationDescriptions(editingContext, castInput.kind(), castInput.referenceKind(), castInput.descriptionId()); + } + payloadSink.tryEmitValue(new EditingContextChildObjectCreationDescriptionsPayload(input.id(), childCreationDescriptions)); + } + +} diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/ReferenceWidgetRootCreationDescriptionsEventHandler.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/ReferenceWidgetRootCreationDescriptionsEventHandler.java new file mode 100644 index 0000000000..5a1cf84ef4 --- /dev/null +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/main/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/ReferenceWidgetRootCreationDescriptionsEventHandler.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2023 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.collaborative.widget.reference.handlers; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventHandler; +import org.eclipse.sirius.components.collaborative.api.Monitoring; +import org.eclipse.sirius.components.collaborative.dto.EditingContextRootObjectCreationDescriptionsPayload; +import org.eclipse.sirius.components.collaborative.widget.reference.ReferenceWidgetDefaultCreateElementHandler; +import org.eclipse.sirius.components.collaborative.widget.reference.dto.ReferenceWidgetRootCreationDescriptionsInput; +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.widget.reference.IReferenceWidgetCreateElementHandler; +import org.springframework.stereotype.Service; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import reactor.core.publisher.Sinks; + +/** + * Handler used to retrieve the root creation descriptions from a reference widget. + * + * @author frouene + */ +@Service +public class ReferenceWidgetRootCreationDescriptionsEventHandler implements IEditingContextEventHandler { + + private final List referenceWidgetCreateElementHandlers; + + private final ReferenceWidgetDefaultCreateElementHandler defaultReferenceWidgetCreateElementHandler; + private final Counter counter; + + public ReferenceWidgetRootCreationDescriptionsEventHandler(List referenceWidgetCreateElementHandlers, ReferenceWidgetDefaultCreateElementHandler defaultReferenceWidgetCreateElementHandler, MeterRegistry meterRegistry) { + this.referenceWidgetCreateElementHandlers = Objects.requireNonNull(referenceWidgetCreateElementHandlers); + this.defaultReferenceWidgetCreateElementHandler = Objects.requireNonNull(defaultReferenceWidgetCreateElementHandler); + this.counter = Counter.builder(Monitoring.EVENT_HANDLER).tag(Monitoring.NAME, this.getClass().getSimpleName()).register(meterRegistry); + } + + @Override + public boolean canHandle(IEditingContext editingContext, IInput input) { + return input instanceof ReferenceWidgetRootCreationDescriptionsInput; + } + + @Override + public void handle(Sinks.One payloadSink, Sinks.Many changeDescriptionSink, IEditingContext editingContext, IInput input) { + this.counter.increment(); + + List childCreationDescriptions = List.of(); + if (input instanceof ReferenceWidgetRootCreationDescriptionsInput castInput) { + + childCreationDescriptions = this.referenceWidgetCreateElementHandlers.stream() + .filter(provider -> provider.canHandle(castInput.descriptionId())) + .findFirst() + .orElse(this.defaultReferenceWidgetCreateElementHandler) + .getRootCreationDescriptions(editingContext, castInput.domainId(), castInput.referenceKind(), castInput.descriptionId()); + } + payloadSink.tryEmitValue(new EditingContextRootObjectCreationDescriptionsPayload(input.id(), childCreationDescriptions)); + } + +} diff --git a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/test/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandlerTests.java b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/test/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandlerTests.java index f954c78e8d..fd548fe6cc 100644 --- a/packages/forms/backend/sirius-components-collaborative-widget-reference/src/test/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandlerTests.java +++ b/packages/forms/backend/sirius-components-collaborative-widget-reference/src/test/java/org/eclipse/sirius/components/collaborative/widget/reference/handlers/CreateElementEventHandlerTests.java @@ -15,21 +15,20 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Function; import org.eclipse.sirius.components.collaborative.api.ChangeDescription; import org.eclipse.sirius.components.collaborative.api.ChangeKind; import org.eclipse.sirius.components.collaborative.forms.api.IFormQueryService; +import org.eclipse.sirius.components.collaborative.widget.reference.ReferenceWidgetDefaultCreateElementHandler; import org.eclipse.sirius.components.collaborative.widget.reference.dto.CreateElementInReferenceSuccessPayload; import org.eclipse.sirius.components.collaborative.widget.reference.dto.CreateElementInput; import org.eclipse.sirius.components.collaborative.widget.reference.messages.IReferenceMessageService; import org.eclipse.sirius.components.core.api.ErrorPayload; +import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; @@ -38,10 +37,9 @@ import org.eclipse.sirius.components.forms.Form; import org.eclipse.sirius.components.forms.Group; import org.eclipse.sirius.components.forms.Page; -import org.eclipse.sirius.components.representations.Success; +import org.eclipse.sirius.components.widget.reference.IReferenceWidgetCreateElementHandler; import org.eclipse.sirius.components.widget.reference.ReferenceValue; import org.eclipse.sirius.components.widget.reference.ReferenceWidget; -import org.eclipse.sirius.components.widget.reference.dto.CreateElementInReferenceHandlerParameters; import org.junit.jupiter.api.Test; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; @@ -58,15 +56,13 @@ public class CreateElementEventHandlerTests { private static final String REF_WIDGET_ID = "RefWidget id"; - private static final String CHANGE_DESCRIPTION_PARAMETER_KEY = "change_description_parameter_key"; - @Test public void testCreateElementInReference() { String referenceValueId = "ReferenceValue Id"; String changeKind = ChangeKind.SEMANTIC_CHANGE; var input = new CreateElementInput(UUID.randomUUID(), FORM_ID.toString(), UUID.randomUUID() - .toString(), REF_WIDGET_ID, "864d9074-86a6-451a-871f-8fbe1cae1ae2", "domainId", "creationDescriptionId"); + .toString(), REF_WIDGET_ID, "864d9074-86a6-451a-871f-8fbe1cae1ae2", "domainId", "creationDescriptionId", "descriptionId"); AtomicBoolean hasBeenExecuted = new AtomicBoolean(); ReferenceValue referenceValue = ReferenceValue.newReferenceValue(referenceValueId) @@ -74,13 +70,6 @@ public void testCreateElementInReference() { .kind("") .build(); - Function createHandler = (inputParameter) -> { - hasBeenExecuted.set(true); - Map parameters = new HashMap<>(); - parameters.put(CHANGE_DESCRIPTION_PARAMETER_KEY, referenceValueId); - return referenceValue; - }; - IObjectService objectService = new IObjectService.NoOp() { @Override public Optional getObject(IEditingContext editingContext, String objectId) { @@ -100,7 +89,6 @@ public Optional getObject(IEditingContext editingContext, String objectI .referenceKind("") .many(false) .containment(false) - .createElementHandler(createHandler) .build(); Group group = Group.newGroup("groupId") @@ -127,7 +115,16 @@ public Optional findWidget(Form form, String widgetId) { } }; - CreateElementEventHandler handler = new CreateElementEventHandler(formQueryService, new IReferenceMessageService.NoOp(), objectService, new SimpleMeterRegistry(), + IReferenceWidgetCreateElementHandler referenceWidgetCreateElementHandler = new IReferenceWidgetCreateElementHandler.NoOp() { + @Override + public Optional createRootObject(IEditingContext editingContext, UUID documentId, String domainId, String rootObjectCreationDescriptionId, String descriptionId) { + hasBeenExecuted.set(true); + return Optional.of(referenceValue); + } + }; + + CreateElementEventHandler handler = new CreateElementEventHandler(formQueryService, new IReferenceMessageService.NoOp(), objectService, List.of(referenceWidgetCreateElementHandler), + new ReferenceWidgetDefaultCreateElementHandler(new IEditService.NoOp()), new SimpleMeterRegistry(), new IFeedbackMessageService.NoOp()); assertThat(handler.canHandle(input)).isTrue(); @@ -147,19 +144,11 @@ public Optional findWidget(Form form, String widgetId) { @Test public void testCreateElementInReferenceReadOnly() { - String referenceValueId = "ReferenceValue Id"; - String changeKind = ChangeKind.SEMANTIC_CHANGE; - Map parameters = new HashMap<>(); - parameters.put(CHANGE_DESCRIPTION_PARAMETER_KEY, referenceValueId); var input = new CreateElementInput(UUID.randomUUID(), FORM_ID.toString(), UUID.randomUUID() - .toString(), REF_WIDGET_ID, "864d9074-86a6-451a-871f-8fbe1cae1ae2", "domainId", "creationDescriptionId"); + .toString(), REF_WIDGET_ID, "864d9074-86a6-451a-871f-8fbe1cae1ae2", "domainId", "creationDescriptionId", "descriptionId"); AtomicBoolean hasBeenExecuted = new AtomicBoolean(); - Function createHandler = (inputParameter) -> { - hasBeenExecuted.set(true); - return new Success(changeKind, parameters); - }; ReferenceWidget referenceWidget = ReferenceWidget.newReferenceWidget(REF_WIDGET_ID) .diagnostics(Collections.emptyList()) @@ -173,7 +162,6 @@ public void testCreateElementInReferenceReadOnly() { .referenceKind("") .many(false) .containment(false) - .createElementHandler(createHandler) .build(); Group group = Group.newGroup("groupId") @@ -207,7 +195,7 @@ public String unableToEditReadOnlyWidget() { } }; - CreateElementEventHandler handler = new CreateElementEventHandler(formQueryService, messageService, new IObjectService.NoOp(), new SimpleMeterRegistry(), new IFeedbackMessageService.NoOp()); + CreateElementEventHandler handler = new CreateElementEventHandler(formQueryService, messageService, new IObjectService.NoOp(), List.of(), new ReferenceWidgetDefaultCreateElementHandler(new IEditService.NoOp()), new SimpleMeterRegistry(), new IFeedbackMessageService.NoOp()); assertThat(handler.canHandle(input)).isTrue(); Sinks.Many changeDescriptionSink = Sinks.many().unicast().onBackpressureBuffer(); diff --git a/packages/forms/backend/sirius-components-widget-reference-graphql/src/main/java/org/eclipse/sirius/components/widget/reference/graphql/datafetchers/query/ReferenceWidgetChildCreationDescriptionsDataFetcher.java b/packages/forms/backend/sirius-components-widget-reference-graphql/src/main/java/org/eclipse/sirius/components/widget/reference/graphql/datafetchers/query/ReferenceWidgetChildCreationDescriptionsDataFetcher.java new file mode 100644 index 0000000000..cd3805657a --- /dev/null +++ b/packages/forms/backend/sirius-components-widget-reference-graphql/src/main/java/org/eclipse/sirius/components/widget/reference/graphql/datafetchers/query/ReferenceWidgetChildCreationDescriptionsDataFetcher.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2023 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.widget.reference.graphql.datafetchers.query; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.sirius.components.annotations.spring.graphql.QueryDataFetcher; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventProcessorRegistry; +import org.eclipse.sirius.components.collaborative.dto.EditingContextChildObjectCreationDescriptionsPayload; +import org.eclipse.sirius.components.collaborative.widget.reference.dto.ReferenceWidgetChildCreationDescriptionsInput; +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.graphql.api.IDataFetcherWithFieldCoordinates; + +import graphql.schema.DataFetchingEnvironment; + +/** + * The data fetcher used to retrieve referenceWidgetChildCreationDescriptions. + * + * @author frouene + */ +@QueryDataFetcher(type = "EditingContext", field = "referenceWidgetChildCreationDescriptions") +public class ReferenceWidgetChildCreationDescriptionsDataFetcher implements IDataFetcherWithFieldCoordinates>> { + + private static final String KIND_ARGUMENT = "kind"; + private static final String REFERENCE_KIND_ARGUMENT = "referenceKind"; + private static final String WIDGET_DESCRIPTION_ID_ARGUMENT = "descriptionId"; + + private final IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry; + + public ReferenceWidgetChildCreationDescriptionsDataFetcher(IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry) { + this.editingContextEventProcessorRegistry = Objects.requireNonNull(editingContextEventProcessorRegistry); + } + + @Override + public CompletableFuture> get(DataFetchingEnvironment environment) throws Exception { + String editingContextId = environment.getSource(); + String kind = environment.getArgument(KIND_ARGUMENT); + String referenceKind = environment.getArgument(REFERENCE_KIND_ARGUMENT); + String descriptionId = environment.getArgument(WIDGET_DESCRIPTION_ID_ARGUMENT); + + ReferenceWidgetChildCreationDescriptionsInput input = new ReferenceWidgetChildCreationDescriptionsInput(UUID.randomUUID(), editingContextId, kind, + referenceKind, descriptionId); + + return this.editingContextEventProcessorRegistry.dispatchEvent(input.editingContextId(), input) + .filter(EditingContextChildObjectCreationDescriptionsPayload.class::isInstance) + .map(EditingContextChildObjectCreationDescriptionsPayload.class::cast) + .map(EditingContextChildObjectCreationDescriptionsPayload::childCreationDescriptions) + .toFuture(); + } + +} diff --git a/packages/forms/backend/sirius-components-widget-reference-graphql/src/main/java/org/eclipse/sirius/components/widget/reference/graphql/datafetchers/query/ReferenceWidgetRootCreationDescriptionsDataFetcher.java b/packages/forms/backend/sirius-components-widget-reference-graphql/src/main/java/org/eclipse/sirius/components/widget/reference/graphql/datafetchers/query/ReferenceWidgetRootCreationDescriptionsDataFetcher.java new file mode 100644 index 0000000000..4f6edeea5b --- /dev/null +++ b/packages/forms/backend/sirius-components-widget-reference-graphql/src/main/java/org/eclipse/sirius/components/widget/reference/graphql/datafetchers/query/ReferenceWidgetRootCreationDescriptionsDataFetcher.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2023 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.widget.reference.graphql.datafetchers.query; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.sirius.components.annotations.spring.graphql.QueryDataFetcher; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventProcessorRegistry; +import org.eclipse.sirius.components.collaborative.dto.EditingContextRootObjectCreationDescriptionsPayload; +import org.eclipse.sirius.components.collaborative.widget.reference.dto.ReferenceWidgetRootCreationDescriptionsInput; +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.graphql.api.IDataFetcherWithFieldCoordinates; + +import graphql.schema.DataFetchingEnvironment; + +/** + * The data fetcher used to retrieve referenceWidgetRootCreationDescriptions. + * + * @author frouene + */ +@QueryDataFetcher(type = "EditingContext", field = "referenceWidgetRootCreationDescriptions") +public class ReferenceWidgetRootCreationDescriptionsDataFetcher implements IDataFetcherWithFieldCoordinates>> { + + private static final String DOMAIN_ID_ARGUMENT = "domainId"; + + private static final String REFERENCE_KIND_ARGUMENT = "referenceKind"; + private static final String WIDGET_DESCRIPTION_ID = "descriptionId"; + + private final IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry; + + public ReferenceWidgetRootCreationDescriptionsDataFetcher(IEditingContextEventProcessorRegistry editingContextEventProcessorRegistry) { + this.editingContextEventProcessorRegistry = Objects.requireNonNull(editingContextEventProcessorRegistry); + } + + @Override + public CompletableFuture> get(DataFetchingEnvironment environment) throws Exception { + String editingContextId = environment.getSource(); + String domainId = environment.getArgument(DOMAIN_ID_ARGUMENT); + String referenceKind = environment.getArgument(REFERENCE_KIND_ARGUMENT); + String descriptionId = environment.getArgument(WIDGET_DESCRIPTION_ID); + + ReferenceWidgetRootCreationDescriptionsInput input = new ReferenceWidgetRootCreationDescriptionsInput(UUID.randomUUID(), editingContextId, domainId, + referenceKind, descriptionId); + + return this.editingContextEventProcessorRegistry.dispatchEvent(input.editingContextId(), input) + .filter(EditingContextRootObjectCreationDescriptionsPayload.class::isInstance) + .map(EditingContextRootObjectCreationDescriptionsPayload.class::cast) + .map(EditingContextRootObjectCreationDescriptionsPayload::childCreationDescriptions) + .toFuture(); + } + +} diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/IReferenceWidgetCreateElementHandler.java b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/IReferenceWidgetCreateElementHandler.java new file mode 100644 index 0000000000..d7e32f7125 --- /dev/null +++ b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/IReferenceWidgetCreateElementHandler.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2023 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.widget.reference; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.ChildCreationDescription; +import org.eclipse.sirius.components.core.api.IEditingContext; + +/** + * Handle a reference widget create element operations. + * + * @author frouene + */ +public interface IReferenceWidgetCreateElementHandler { + + boolean canHandle(String descriptionId); + + List getRootCreationDescriptions(IEditingContext editingContext, String domainId, String referenceKind, String descriptionId); + + List getChildCreationDescriptions(IEditingContext editingContext, String kind, String referenceKind, String descriptionId); + + Optional createRootObject(IEditingContext editingContext, UUID documentId, String domainId, String rootObjectCreationDescriptionId, String descriptionId); + + Optional createChild(IEditingContext editingContext, Object object, String childCreationDescriptionId, String descriptionId); + + /** + * Implementation which does nothing, used for mocks in unit tests. + * + * @author frouene + */ + class NoOp implements IReferenceWidgetCreateElementHandler { + + @Override + public boolean canHandle(String descriptionId) { + return true; + } + + @Override + public List getRootCreationDescriptions(IEditingContext editingContext, String domainId, String referenceKind, String descriptionId) { + return List.of(); + } + + @Override + public List getChildCreationDescriptions(IEditingContext editingContext, String kind, String referenceKind, String descriptionId) { + return List.of(); + } + + @Override + public Optional createRootObject(IEditingContext editingContext, UUID documentId, String domainId, String rootObjectCreationDescriptionId, String descriptionId) { + return Optional.empty(); + } + + @Override + public Optional createChild(IEditingContext editingContext, Object object, String childCreationDescriptionId, String descriptionId) { + return Optional.empty(); + } + } + +} diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceElementProps.java b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceElementProps.java index 0b551d332c..af11d394c3 100644 --- a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceElementProps.java +++ b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceElementProps.java @@ -22,7 +22,6 @@ import org.eclipse.sirius.components.representations.Element; import org.eclipse.sirius.components.representations.IProps; import org.eclipse.sirius.components.representations.IStatus; -import org.eclipse.sirius.components.widget.reference.dto.CreateElementInReferenceHandlerParameters; import org.eclipse.sirius.components.widget.reference.dto.MoveReferenceValueHandlerParameters; /** @@ -71,8 +70,6 @@ public final class ReferenceElementProps implements IProps { private Function, IStatus> addHandler; - private Function createElementHandler; - private Function moveHandler; private ReferenceElementProps() { @@ -151,10 +148,6 @@ public Function, IStatus> getAddHandler() { return this.addHandler; } - public Function getCreateElementHandler() { - return this.createElementHandler; - } - public Function getMoveHandler() { return this.moveHandler; } @@ -210,8 +203,6 @@ public static final class Builder { private Function, IStatus> addHandler; - private Function createElementHandler; - private Function moveHandler; private String descriptionId; @@ -300,11 +291,6 @@ public Builder addHandler(Function, IStatus> addHandler) { return this; } - public Builder createElementHandler(Function createElementHandler) { - this.createElementHandler = Objects.requireNonNull(createElementHandler); - return this; - } - public Builder moveHandler(Function moveHandler) { this.moveHandler = Objects.requireNonNull(moveHandler); return this; @@ -335,7 +321,6 @@ public ReferenceElementProps build() { referenceElementProps.clearHandler = this.clearHandler; // Optional on purpose referenceElementProps.setHandler = this.setHandler; // Optional on purpose referenceElementProps.addHandler = this.addHandler; // Optional on purpose - referenceElementProps.createElementHandler = this.createElementHandler; // Optional on purpose referenceElementProps.moveHandler = this.moveHandler; // Optional on purpose return referenceElementProps; } diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidget.java b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidget.java index 131e497c63..056666dc48 100644 --- a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidget.java +++ b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidget.java @@ -22,7 +22,6 @@ import org.eclipse.sirius.components.forms.AbstractWidget; import org.eclipse.sirius.components.forms.validation.Diagnostic; import org.eclipse.sirius.components.representations.IStatus; -import org.eclipse.sirius.components.widget.reference.dto.CreateElementInReferenceHandlerParameters; import org.eclipse.sirius.components.widget.reference.dto.MoveReferenceValueHandlerParameters; /** @@ -55,8 +54,6 @@ public final class ReferenceWidget extends AbstractWidget { private Function, IStatus> addHandler; - private Function createElementHandler; - private Function moveHandler; private String descriptionId; @@ -117,10 +114,6 @@ public Function, IStatus> getAddHandler() { return this.addHandler; } - public Function getCreateElementHandler() { - return this.createElementHandler; - } - public Function getMoveHandler() { return this.moveHandler; } @@ -171,8 +164,6 @@ public static final class Builder { private Function, IStatus> addHandler; - private Function createElementHandler; - private Function moveHandler; private String descriptionId; @@ -261,11 +252,6 @@ public Builder addHandler(Function, IStatus> addHandler) { return this; } - public Builder createElementHandler(Function createElementHandler) { - this.createElementHandler = Objects.requireNonNull(createElementHandler); - return this; - } - public Builder moveHandler(Function moveHandler) { this.moveHandler = Objects.requireNonNull(moveHandler); return this; @@ -296,7 +282,6 @@ public ReferenceWidget build() { referenceWidget.clearHandler = this.clearHandler; // Optional on purpose referenceWidget.setHandler = this.setHandler; // Optional on purpose referenceWidget.addHandler = this.addHandler; // Optional on purpose - referenceWidget.createElementHandler = this.createElementHandler; // Optional on purpose referenceWidget.moveHandler = this.moveHandler; // Optional on purpose return referenceWidget; } diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetComponent.java b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetComponent.java index 8cc0d935a0..7e3c3481eb 100644 --- a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetComponent.java +++ b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetComponent.java @@ -25,7 +25,6 @@ import org.eclipse.sirius.components.representations.IComponent; import org.eclipse.sirius.components.representations.IStatus; import org.eclipse.sirius.components.representations.VariableManager; -import org.eclipse.sirius.components.widget.reference.dto.CreateElementInReferenceHandlerParameters; import org.eclipse.sirius.components.widget.reference.dto.MoveReferenceValueHandlerParameters; /** @@ -45,16 +44,6 @@ public class ReferenceWidgetComponent implements IComponent { public static final String CLICK_EVENT_KIND_VARIABLE = "onClickEventKind"; - public static final String DOCUMENT_ID_VARIABLE = "documentId"; - - public static final String DOMAIN_ID_VARIABLE = "domainId"; - - public static final String PARENT_VARIABLE = "parent"; - - public static final String CREATION_DESCRIPTION_ID_VARIABLE = "creationDescriptionId"; - - public static final String IS_CHILD_CREATION_VARIABLE = "isChildCreation"; - private final ReferenceWidgetComponentProps props; public ReferenceWidgetComponent(ReferenceWidgetComponentProps props) { @@ -131,25 +120,6 @@ public Element render() { }; builder.moveHandler(moveHandler); } - if (referenceDescription.getCreateElementHandlerProvider() != null) { - Function createElementHandler = input -> { - VariableManager childVariableManager = variableManager.createChild(); - if (input.documentId() != null) { - // root creation - childVariableManager.put(IS_CHILD_CREATION_VARIABLE, false); - childVariableManager.put(DOMAIN_ID_VARIABLE, input.domainId()); - childVariableManager.put(CREATION_DESCRIPTION_ID_VARIABLE, input.creationDescriptionId()); - childVariableManager.put(DOCUMENT_ID_VARIABLE, input.documentId()); - } else { - // child creation - childVariableManager.put(IS_CHILD_CREATION_VARIABLE, true); - childVariableManager.put(PARENT_VARIABLE, input.parent()); - childVariableManager.put(CREATION_DESCRIPTION_ID_VARIABLE, input.creationDescriptionId()); - } - return referenceDescription.getCreateElementHandlerProvider().apply(childVariableManager); - }; - builder.createElementHandler(createElementHandler); - } if (readOnly != null) { builder.readOnly(readOnly); diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescription.java b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescription.java index c57cb15602..b92b8bfc2a 100644 --- a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescription.java +++ b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescription.java @@ -71,8 +71,6 @@ public final class ReferenceWidgetDescription extends AbstractWidgetDescription private Function addHandlerProvider; - private Function createElementHandlerProvider; - private Function moveHandlerProvider; private ReferenceWidgetDescription() { @@ -163,10 +161,6 @@ public Function getAddHandlerProvider() { return this.addHandlerProvider; } - public Function getCreateElementHandlerProvider() { - return this.createElementHandlerProvider; - } - public Function getMoveHandlerProvider() { return this.moveHandlerProvider; } @@ -237,8 +231,6 @@ public static final class Builder { private Function addHandlerProvider; - private Function createElementHandlerProvider; - private Function moveHandlerProvider; private Builder(String id) { @@ -375,11 +367,6 @@ public Builder addHandlerProvider(Function addHandlerP return this; } - public Builder createElementHandlerProvider(Function createElementHandlerProvider) { - this.createElementHandlerProvider = Objects.requireNonNull(createElementHandlerProvider); - return this; - } - public Builder moveHandlerProvider(Function moveHandlerProvider) { this.moveHandlerProvider = Objects.requireNonNull(moveHandlerProvider); return this; @@ -414,7 +401,6 @@ public ReferenceWidgetDescription build() { referenceWidgetDescription.itemRemoveHandlerProvider = this.itemRemoveHandlerProvider; // Optional on purpose referenceWidgetDescription.setHandlerProvider = this.setHandlerProvider; // Optional on purpose referenceWidgetDescription.addHandlerProvider = this.addHandlerProvider; // Optional on purpose - referenceWidgetDescription.createElementHandlerProvider = this.createElementHandlerProvider; // Optional on purpose referenceWidgetDescription.moveHandlerProvider = this.moveHandlerProvider; // Optional on purpose return referenceWidgetDescription; } diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescriptor.java b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescriptor.java index 703aeee2e3..6ebf6ceff2 100644 --- a/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescriptor.java +++ b/packages/forms/backend/sirius-components-widget-reference/src/main/java/org/eclipse/sirius/components/widget/reference/ReferenceWidgetDescriptor.java @@ -83,7 +83,6 @@ public Optional instanciate(String type, IProps elementProps, List new Success()) .setHandlerProvider(variableManager -> new Success()) .addHandlerProvider(variableManager -> new Success()) - .createElementHandlerProvider(variableManager -> new Success()) .moveHandlerProvider(variableManager -> new Success()) .styleProvider(variableManager -> ReferenceWidgetPreviewConverterProvider.this.getWidgetStyle(referenceDescription, variableManager)) .diagnosticsProvider(variableManager -> List.of()) diff --git a/packages/forms/backend/sirius-components-widget-reference/src/main/resources/schema/reference.graphqls b/packages/forms/backend/sirius-components-widget-reference/src/main/resources/schema/reference.graphqls index 799704d011..ccd80ee855 100644 --- a/packages/forms/backend/sirius-components-widget-reference/src/main/resources/schema/reference.graphqls +++ b/packages/forms/backend/sirius-components-widget-reference/src/main/resources/schema/reference.graphqls @@ -2,6 +2,11 @@ extend type FormDescription { referenceValueOptions(referenceWidgetId: ID!): [ReferenceValue!]! } +extend type EditingContext { + referenceWidgetRootCreationDescriptions(domainId: ID!, referenceKind: String, descriptionId: String!): [ChildCreationDescription!]! + referenceWidgetChildCreationDescriptions(kind: ID!, referenceKind: String, descriptionId: String!): [ChildCreationDescription!]! +} + type ReferenceWidget implements Widget { id: ID! descriptionId: String! @@ -111,6 +116,7 @@ input CreateElementInReferenceInput { """ domainId: ID creationDescriptionId: ID! + descriptionId: ID! } union CreateElementInReferencePayload = CreateElementInReferenceSuccessPayload | ErrorPayload diff --git a/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.tsx b/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.tsx index 183cbc11c6..ae25c1f45f 100644 --- a/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.tsx +++ b/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.tsx @@ -107,10 +107,19 @@ const createElementInReferenceMutation = gql` `; const getChildCreationDescriptionsQuery = gql` - query getChildCreationDescriptions($editingContextId: ID!, $kind: ID!, $referenceKind: String) { + query getChildCreationDescriptions( + $editingContextId: ID! + $kind: ID! + $referenceKind: String + $descriptionId: String! + ) { viewer { editingContext(editingContextId: $editingContextId) { - childCreationDescriptions(kind: $kind, referenceKind: $referenceKind) { + referenceWidgetChildCreationDescriptions( + kind: $kind + referenceKind: $referenceKind + descriptionId: $descriptionId + ) { id label iconURL @@ -124,12 +133,16 @@ const getRootObjectCreationDescriptionsQuery = gql` query getRootObjectCreationDescriptions( $editingContextId: ID! $domainId: ID! - $suggested: Boolean! $referenceKind: String + $descriptionId: String! ) { viewer { editingContext(editingContextId: $editingContextId) { - rootObjectCreationDescriptions(domainId: $domainId, suggested: $suggested, referenceKind: $referenceKind) { + referenceWidgetRootCreationDescriptions( + domainId: $domainId + referenceKind: $referenceKind + descriptionId: $descriptionId + ) { id label iconURL @@ -297,6 +310,7 @@ export const CreateModal = ({ editingContextId, widget, onClose, formId }: Creat containerId, domainId: null, creationDescriptionId: selectedChildCreationDescriptionId, + descriptionId: widget.descriptionId, }; } else if (createModal === 'validForRoot') { dispatch({ type: 'CREATE_ROOT' } as CreateRootEvent); @@ -308,6 +322,7 @@ export const CreateModal = ({ editingContextId, widget, onClose, formId }: Creat containerId, domainId: selectedDomainId, creationDescriptionId: selectedChildCreationDescriptionId, + descriptionId: widget.descriptionId, }; } createElementInReference({ variables: { input } }); @@ -335,6 +350,7 @@ export const CreateModal = ({ editingContextId, widget, onClose, formId }: Creat editingContextId, kind: containerKind, referenceKind: widget.reference.referenceKind, + descriptionId: widget.descriptionId, }, }); } @@ -346,8 +362,8 @@ export const CreateModal = ({ editingContextId, widget, onClose, formId }: Creat variables: { editingContextId, domainId: selectedDomainId, - suggested: false, referenceKind: widget.reference.referenceKind, + descriptionId: widget.descriptionId, }, }); } diff --git a/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.types.ts b/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.types.ts index 98e68c1d45..7aaefe011f 100644 --- a/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.types.ts +++ b/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModal.types.ts @@ -28,6 +28,7 @@ export interface GQLGetChildCreationDescriptionsQueryVariables { editingContextId: string; kind: string; referenceKind?: string; + descriptionId: string; } export interface GQLGetChildCreationDescriptionsQueryData { @@ -39,7 +40,7 @@ export interface GQLViewer { } export interface GQLEditingContext { - childCreationDescriptions: GQLChildCreationDescription[]; + referenceWidgetChildCreationDescriptions: GQLChildCreationDescription[]; } export interface GQLChildCreationDescription { @@ -59,8 +60,8 @@ export interface GQLGetDomainsQueryData { export interface GQLGetRootObjectCreationDescriptionsQueryVariables { editingContextId: string; domainId: string; - suggested: boolean; referenceKind?: string; + descriptionId: string; } export interface GQLGetRootObjectCreationDescriptionsQueryData { @@ -72,7 +73,7 @@ export interface GQLRootViewer { } export interface GQLRootEditingContext { - rootObjectCreationDescriptions: GQLRootChildCreationDescription[]; + referenceWidgetRootCreationDescriptions: GQLRootChildCreationDescription[]; domains: GQLDomain[]; } @@ -116,6 +117,7 @@ export interface GQLCreateElementInReferenceInput { containerId: string; domainId: string | null; creationDescriptionId: string; + descriptionId: string; } export interface GQLCreateElementInReferenceMutationData { diff --git a/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModalMachine.ts b/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModalMachine.ts index 8489d04f26..3d93f1cd78 100644 --- a/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModalMachine.ts +++ b/packages/forms/frontend/sirius-components-widget-reference/src/modals/CreateModalMachine.ts @@ -350,17 +350,17 @@ export const createModalMachine = Machine { const { data } = event as FetchedChildCreationDescriptionsEvent; - const { childCreationDescriptions } = data.viewer.editingContext; + const { referenceWidgetChildCreationDescriptions } = data.viewer.editingContext; const selectedChildCreationDescriptionId = - childCreationDescriptions.length > 0 ? childCreationDescriptions[0].id : ''; - return { creationDescriptions: childCreationDescriptions, selectedChildCreationDescriptionId }; + referenceWidgetChildCreationDescriptions.length > 0 ? referenceWidgetChildCreationDescriptions[0].id : ''; + return { creationDescriptions: referenceWidgetChildCreationDescriptions, selectedChildCreationDescriptionId }; }), updateRootChildCreationDescriptions: assign((_, event) => { const { data } = event as FetchedRootObjectCreationDescriptionsEvent; - const { rootObjectCreationDescriptions } = data.viewer.editingContext; + const { referenceWidgetRootCreationDescriptions } = data.viewer.editingContext; const selectedChildCreationDescriptionId = - rootObjectCreationDescriptions.length > 0 ? rootObjectCreationDescriptions[0].id : ''; - return { creationDescriptions: rootObjectCreationDescriptions, selectedChildCreationDescriptionId }; + referenceWidgetRootCreationDescriptions.length > 0 ? referenceWidgetRootCreationDescriptions[0].id : ''; + return { creationDescriptions: referenceWidgetRootCreationDescriptions, selectedChildCreationDescriptionId }; }), updateChildCreationDescription: assign((_, event) => { const { childCreationDescriptionId } = event as ChangeChildCreationDescriptionEvent; diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/tests/ViewDetailsRenderingIntegrationTests.java b/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/tests/ViewDetailsRenderingIntegrationTests.java index a38b7443b1..c3e4b68fe2 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/tests/ViewDetailsRenderingIntegrationTests.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/test/java/org/eclipse/sirius/web/sample/tests/ViewDetailsRenderingIntegrationTests.java @@ -37,7 +37,6 @@ import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; import org.eclipse.sirius.components.compatibility.emf.properties.api.IPropertiesValidationProvider; import org.eclipse.sirius.components.core.URLParser; -import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; @@ -109,7 +108,7 @@ public void setup() { EMFKindService emfKindService = new EMFKindService(new URLParser()); IObjectService objectService = new ObjectService(emfKindService, composedAdapterFactory, new LabelFeatureProviderRegistry()); - ViewPropertiesDescriptionServiceConfiguration parameters = new ViewPropertiesDescriptionServiceConfiguration(objectService, new IEditService.NoOp(), emfKindService, new IFeedbackMessageService.NoOp()); + ViewPropertiesDescriptionServiceConfiguration parameters = new ViewPropertiesDescriptionServiceConfiguration(objectService, emfKindService, new IFeedbackMessageService.NoOp()); // @formatter:off List customizers = List.of( diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/ViewPropertiesDescriptionRegistryConfigurer.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/ViewPropertiesDescriptionRegistryConfigurer.java index 32b5e9d123..fcf63bd9b6 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/ViewPropertiesDescriptionRegistryConfigurer.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/ViewPropertiesDescriptionRegistryConfigurer.java @@ -36,7 +36,6 @@ import org.eclipse.sirius.components.compatibility.emf.properties.NonContainmentReferenceIfDescriptionProvider; import org.eclipse.sirius.components.compatibility.emf.properties.NumberIfDescriptionProvider; import org.eclipse.sirius.components.compatibility.emf.properties.api.IPropertiesValidationProvider; -import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.emf.services.api.IEMFKindService; @@ -99,12 +98,10 @@ public class ViewPropertiesDescriptionRegistryConfigurer implements IPropertiesD private final IFeedbackMessageService feedbackMessageService; - private final IEditService editService; public ViewPropertiesDescriptionRegistryConfigurer(ViewPropertiesDescriptionServiceConfiguration parameters, ComposedAdapterFactory composedAdapterFactory, IPropertiesValidationProvider propertiesValidationProvider, IEMFMessageService emfMessageService, List customizers) { this.objectService = Objects.requireNonNull(parameters.getObjectService()); - this.editService = Objects.requireNonNull(parameters.getEditService()); this.composedAdapterFactory = Objects.requireNonNull(composedAdapterFactory); this.propertiesValidationProvider = Objects.requireNonNull(propertiesValidationProvider); this.emfMessageService = Objects.requireNonNull(emfMessageService); @@ -209,7 +206,7 @@ public boolean handles(EAttribute eAttribute) { ifDescriptions.add(new EBooleanIfDescriptionProvider(this.composedAdapterFactory, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); ifDescriptions.add(new EEnumIfDescriptionProvider(this.composedAdapterFactory, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); - ifDescriptions.add(new NonContainmentReferenceIfDescriptionProvider(this.composedAdapterFactory, this.objectService, this.editService, this.emfKindService, this.feedbackMessageService, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); + ifDescriptions.add(new NonContainmentReferenceIfDescriptionProvider(this.composedAdapterFactory, this.objectService, this.emfKindService, this.feedbackMessageService, this.propertiesValidationProvider, this.semanticTargetIdProvider).getIfDescription()); var numericDataTypes = List.of( EcorePackage.Literals.EINT, diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/compatibility/PropertiesWidgetCreationService.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/compatibility/PropertiesWidgetCreationService.java index 6a7f73943d..093de9c7d8 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/compatibility/PropertiesWidgetCreationService.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/compatibility/PropertiesWidgetCreationService.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.UUID; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Function; @@ -29,8 +28,6 @@ import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.sirius.components.collaborative.api.ChangeKind; -import org.eclipse.sirius.components.core.api.IEditService; -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.IEMFKindService; @@ -63,7 +60,6 @@ public class PropertiesWidgetCreationService implements IPropertiesWidgetCreatio private static final String EMPTY = ""; private final IPropertiesConfigurerService propertiesConfigurerService; private final IObjectService objectService; - private final IEditService editService; private final IEMFKindService emfKindService; private final IFeedbackMessageService feedbackMessageService; private final AQLTextfieldCustomizer aqlTextfieldCustomizer; @@ -71,7 +67,6 @@ public class PropertiesWidgetCreationService implements IPropertiesWidgetCreatio public PropertiesWidgetCreationService(IPropertiesConfigurerService propertiesConfigurerService, ViewPropertiesDescriptionServiceConfiguration parameters, AQLTextfieldCustomizer aqlTextfieldCustomizer) { this.propertiesConfigurerService = Objects.requireNonNull(propertiesConfigurerService); this.objectService = Objects.requireNonNull(parameters.getObjectService()); - this.editService = Objects.requireNonNull(parameters.getEditService()); this.emfKindService = Objects.requireNonNull(parameters.getEmfKindService()); this.feedbackMessageService = Objects.requireNonNull(parameters.getFeedbackMessageService()); this.aqlTextfieldCustomizer = Objects.requireNonNull(aqlTextfieldCustomizer); @@ -202,7 +197,6 @@ public ReferenceWidgetDescription createReferenceWidget(String id, String label, .itemRemoveHandlerProvider(variableManager -> this.handleRemoveValue(variableManager, feature)) .setHandlerProvider(variableManager -> this.handleSetReference(variableManager, feature)) .addHandlerProvider(variableManager -> this.handleAddReferenceValues(variableManager, feature)) - .createElementHandlerProvider(variableManager -> this.handleCreateElement(variableManager, feature)) .moveHandlerProvider(variableManager -> this.handleMoveReferenceValue(variableManager, feature)) .build(); } @@ -341,24 +335,6 @@ private IStatus handleAddReferenceValues(VariableManager variableManager, Object return result; } - private Object handleCreateElement(VariableManager variableManager, Object feature) { - Optional result = Optional.empty(); - Optional optionalIsChild = variableManager.get(ReferenceWidgetComponent.IS_CHILD_CREATION_VARIABLE, Boolean.class); - var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class); - String creationDescriptionId = variableManager.get(ReferenceWidgetComponent.CREATION_DESCRIPTION_ID_VARIABLE, String.class).orElse(""); - if (optionalIsChild.isPresent() && optionalEditingContext.isPresent()) { - if (optionalIsChild.get()) { - EObject parent = variableManager.get(ReferenceWidgetComponent.PARENT_VARIABLE, EObject.class).orElse(null); - result = this.editService.createChild(optionalEditingContext.get(), parent, creationDescriptionId); - } else { - UUID documentId = variableManager.get(ReferenceWidgetComponent.DOCUMENT_ID_VARIABLE, UUID.class).orElse(UUID.randomUUID()); - String domainId = variableManager.get(ReferenceWidgetComponent.DOMAIN_ID_VARIABLE, String.class).orElse(""); - result = this.editService.createRootObject(optionalEditingContext.get(), documentId, domainId, creationDescriptionId); - } - } - return result.orElse(null); - } - private IStatus handleMoveReferenceValue(VariableManager variableManager, Object feature) { IStatus result = this.createErrorStatus("Something went wrong while reordering reference values."); EObject referenceOwner = variableManager.get(VariableManager.SELF, EObject.class).orElse(null); diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewPropertiesDescriptionServiceConfiguration.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewPropertiesDescriptionServiceConfiguration.java index 9538d971a4..7ffca79fe2 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewPropertiesDescriptionServiceConfiguration.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewPropertiesDescriptionServiceConfiguration.java @@ -14,7 +14,6 @@ import java.util.Objects; -import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.emf.services.api.IEMFKindService; @@ -30,15 +29,12 @@ public class ViewPropertiesDescriptionServiceConfiguration { private final IObjectService objectService; - private final IEditService editService; - private final IEMFKindService emfKindService; private final IFeedbackMessageService feedbackMessageService; - public ViewPropertiesDescriptionServiceConfiguration(IObjectService objectService, IEditService editService, IEMFKindService emfKindService, IFeedbackMessageService feedbackMessageService) { + public ViewPropertiesDescriptionServiceConfiguration(IObjectService objectService, IEMFKindService emfKindService, IFeedbackMessageService feedbackMessageService) { this.objectService = Objects.requireNonNull(objectService); - this.editService = Objects.requireNonNull(editService); this.emfKindService = Objects.requireNonNull(emfKindService); this.feedbackMessageService = Objects.requireNonNull(feedbackMessageService); } @@ -47,10 +43,6 @@ public IObjectService getObjectService() { return this.objectService; } - public IEditService getEditService() { - return this.editService; - } - public IEMFKindService getEmfKindService() { return this.emfKindService; }