Skip to content

Commit

Permalink
[2125] Add the possibility to programmatically order and filter pages…
Browse files Browse the repository at this point in the history
… of a form.

Bug: #2125
Signed-off-by: Florian ROUËNÉ <florian.rouene@obeosoft.com>
  • Loading branch information
frouene committed Jul 4, 2023
1 parent b97aab1 commit c69b48b
Show file tree
Hide file tree
Showing 9 changed files with 215 additions and 86 deletions.
Expand Up @@ -27,7 +27,9 @@
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventProcessor;
import org.eclipse.sirius.components.collaborative.forms.api.IFormInput;
import org.eclipse.sirius.components.collaborative.forms.api.IFormProcessor;
import org.eclipse.sirius.components.collaborative.forms.api.IWidgetSubscriptionManager;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration;
import org.eclipse.sirius.components.collaborative.forms.dto.FormRefreshedEventPayload;
import org.eclipse.sirius.components.collaborative.forms.dto.RenameFormInput;
import org.eclipse.sirius.components.collaborative.forms.dto.UpdateWidgetFocusInput;
Expand Down Expand Up @@ -84,17 +86,20 @@ public class FormEventProcessor implements IFormEventProcessor {

private final AtomicReference<Form> currentForm = new AtomicReference<>();

public FormEventProcessor(IEditingContext editingContext, FormCreationParameters formCreationParameters, List<IWidgetDescriptor> widgetDescriptors, List<IFormEventHandler> formEventHandlers,
ISubscriptionManager subscriptionManager, IWidgetSubscriptionManager widgetSubscriptionManager, IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry) {
this.logger.trace("Creating the form event processor {}", formCreationParameters.getId());
private final IFormProcessor formProcessor;

this.editingContext = Objects.requireNonNull(editingContext);
this.formCreationParameters = Objects.requireNonNull(formCreationParameters);
this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors);
this.formEventHandlers = Objects.requireNonNull(formEventHandlers);
public FormEventProcessor(FormEventProcessorConfiguration configuration,
ISubscriptionManager subscriptionManager, IWidgetSubscriptionManager widgetSubscriptionManager, IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry, IFormProcessor formProcessor) {
this.logger.trace("Creating the form event processor {}", configuration.formCreationParameters().getId());

this.editingContext = Objects.requireNonNull(configuration.editingContext());
this.formCreationParameters = Objects.requireNonNull(configuration.formCreationParameters());
this.widgetDescriptors = Objects.requireNonNull(configuration.widgetDescriptors());
this.formEventHandlers = Objects.requireNonNull(configuration.formEventHandlers());
this.subscriptionManager = Objects.requireNonNull(subscriptionManager);
this.widgetSubscriptionManager = Objects.requireNonNull(widgetSubscriptionManager);
this.representationRefreshPolicyRegistry = Objects.requireNonNull(representationRefreshPolicyRegistry);
this.formProcessor = formProcessor;

Form form = this.refreshForm();
this.currentForm.set(form);
Expand All @@ -114,16 +119,13 @@ public ISubscriptionManager getSubscriptionManager() {
@Override
public void handle(One<IPayload> payloadSink, Many<ChangeDescription> changeDescriptionSink, IRepresentationInput representationInput) {
IRepresentationInput effectiveInput = representationInput;
if (representationInput instanceof RenameRepresentationInput) {
RenameRepresentationInput renameRepresentationInput = (RenameRepresentationInput) representationInput;
if (representationInput instanceof RenameRepresentationInput renameRepresentationInput) {
effectiveInput = new RenameFormInput(renameRepresentationInput.id(), renameRepresentationInput.editingContextId(), renameRepresentationInput.representationId(),
renameRepresentationInput.newLabel());
}
if (effectiveInput instanceof IFormInput) {
IFormInput formInput = (IFormInput) effectiveInput;
if (effectiveInput instanceof IFormInput formInput) {

if (formInput instanceof UpdateWidgetFocusInput) {
UpdateWidgetFocusInput input = (UpdateWidgetFocusInput) formInput;
if (formInput instanceof UpdateWidgetFocusInput input) {
this.widgetSubscriptionManager.handle(input);

payloadSink.tryEmitValue(new UpdateWidgetFocusSuccessPayload(input.id(), input.widgetId()));
Expand Down Expand Up @@ -159,11 +161,9 @@ public void refresh(ChangeDescription changeDescription) {
}

private boolean shouldRefresh(ChangeDescription changeDescription) {
// @formatter:off
return this.representationRefreshPolicyRegistry.getRepresentationRefreshPolicy(this.formCreationParameters.getFormDescription())
.orElseGet(this::getDefaultRefreshPolicy)
.shouldRefresh(changeDescription);
// @formatter:on

}

Expand All @@ -182,6 +182,10 @@ private Form refreshForm() {
Element element = new Element(FormComponent.class, formComponentProps);
Form form = new FormRenderer(this.widgetDescriptors).render(element);

if (this.formProcessor != null) {
form = this.formProcessor.process(form, variableManager);
}

this.logger.trace("Form refreshed: {}", form.getId());

return form;
Expand All @@ -192,13 +196,11 @@ public Flux<IPayload> getOutputEvents(IInput input) {
var initialRefresh = Mono.fromCallable(() -> new FormRefreshedEventPayload(input.id(), this.currentForm.get()));
var refreshEventFlux = Flux.concat(initialRefresh, this.sink.asFlux());

// @formatter:off
return Flux.merge(
refreshEventFlux,
this.widgetSubscriptionManager.getFlux(input),
this.subscriptionManager.getFlux(input)
);
// @formatter:on
);
}

@Override
Expand Down
Expand Up @@ -27,7 +27,10 @@
import org.eclipse.sirius.components.collaborative.forms.api.FormCreationParameters;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventProcessor;
import org.eclipse.sirius.components.collaborative.forms.api.IFormProcessor;
import org.eclipse.sirius.components.collaborative.forms.api.IWidgetSubscriptionManagerFactory;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
Expand Down Expand Up @@ -61,16 +64,18 @@ public class FormEventProcessorFactory implements IRepresentationEventProcessorF

private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry;

public FormEventProcessorFactory(RepresentationEventProcessorFactoryConfiguration configuration, IObjectService objectService, List<IWidgetDescriptor> widgetDescriptors,
List<IFormEventHandler> formEventHandlers, IWidgetSubscriptionManagerFactory widgetSubscriptionManagerFactory) {
private final Optional<IFormProcessor> optionalFormProcessor;

public FormEventProcessorFactory(RepresentationEventProcessorFactoryConfiguration configuration, List<IWidgetDescriptor> widgetDescriptors, FormEventProcessorFactoryConfiguration formConfiguration) {
this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService());
this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService());
this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory());
this.objectService = Objects.requireNonNull(objectService);
this.objectService = Objects.requireNonNull(formConfiguration.getObjectService());
this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors);
this.formEventHandlers = Objects.requireNonNull(formEventHandlers);
this.widgetSubscriptionManagerFactory = Objects.requireNonNull(widgetSubscriptionManagerFactory);
this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers());
this.widgetSubscriptionManagerFactory = Objects.requireNonNull(formConfiguration.getWidgetSubscriptionManagerFactory());
this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry());
this.optionalFormProcessor = Objects.requireNonNull(formConfiguration.getOptionalFormProcessor());
}

@Override
Expand All @@ -81,39 +86,34 @@ public <T extends IRepresentationEventProcessor> boolean canHandle(Class<T> repr
@Override
public <T extends IRepresentationEventProcessor> Optional<T> createRepresentationEventProcessor(Class<T> representationEventProcessorClass, IRepresentationConfiguration configuration,
IEditingContext editingContext) {
if (IFormEventProcessor.class.isAssignableFrom(representationEventProcessorClass) && configuration instanceof FormConfiguration) {
FormConfiguration formConfiguration = (FormConfiguration) configuration;
if (IFormEventProcessor.class.isAssignableFrom(representationEventProcessorClass) && configuration instanceof FormConfiguration formConfiguration) {

Optional<Form> optionalForm = this.representationSearchService.findById(editingContext, formConfiguration.getId(), Form.class);
if (optionalForm.isPresent()) {
Form form = optionalForm.get();
// @formatter:off
Optional<FormDescription> optionalFormDescription = this.representationDescriptionSearchService.findById(editingContext, form.getDescriptionId())
.filter(FormDescription.class::isInstance)
.map(FormDescription.class::cast);
// @formatter:on
Optional<Object> optionalObject = this.objectService.getObject(editingContext, form.getTargetObjectId());
if (optionalFormDescription.isPresent() && optionalObject.isPresent()) {
FormDescription formDescription = optionalFormDescription.get();
Object object = optionalObject.get();

// @formatter:off
FormCreationParameters formCreationParameters = FormCreationParameters.newFormCreationParameters(formConfiguration.getId())
.editingContext(editingContext)
.formDescription(formDescription)
.object(object)
.selection(List.of())
.build();
// @formatter:on

IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(editingContext, formCreationParameters, this.widgetDescriptors, this.formEventHandlers,
this.subscriptionManagerFactory.create(), this.widgetSubscriptionManagerFactory.create(), this.representationRefreshPolicyRegistry);
IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(new FormEventProcessorConfiguration(editingContext, formCreationParameters, this.widgetDescriptors,
this.formEventHandlers),
this.subscriptionManagerFactory.create(), this.widgetSubscriptionManagerFactory.create(), this.representationRefreshPolicyRegistry,
this.optionalFormProcessor.orElse(null));

// @formatter:off
return Optional.of(formEventProcessor)
.filter(representationEventProcessorClass::isInstance)
.map(representationEventProcessorClass::cast);
// @formatter:on

}
}
Expand Down
Expand Up @@ -26,10 +26,13 @@
import org.eclipse.sirius.components.collaborative.forms.api.FormCreationParameters;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventProcessor;
import org.eclipse.sirius.components.collaborative.forms.api.IFormProcessor;
import org.eclipse.sirius.components.collaborative.forms.api.IPropertiesDefaultDescriptionProvider;
import org.eclipse.sirius.components.collaborative.forms.api.IPropertiesDescriptionService;
import org.eclipse.sirius.components.collaborative.forms.api.IWidgetSubscriptionManagerFactory;
import org.eclipse.sirius.components.collaborative.forms.api.PropertiesConfiguration;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.forms.description.FormDescription;
Expand All @@ -44,6 +47,7 @@
*/
@Service
public class PropertiesEventProcessorFactory implements IRepresentationEventProcessorFactory {

public static final String DETAILS_VIEW_ID = UUID.nameUUIDFromBytes("details-view".getBytes()).toString();

private final IPropertiesDescriptionService propertiesDescriptionService;
Expand All @@ -62,17 +66,19 @@ public class PropertiesEventProcessorFactory implements IRepresentationEventProc

private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry;

public PropertiesEventProcessorFactory(IPropertiesDescriptionService propertiesDescriptionService, IPropertiesDefaultDescriptionProvider propertiesDefaultDescriptionProvider,
IObjectService objectService, List<IWidgetDescriptor> widgetDescriptors, List<IFormEventHandler> formEventHandlers, RepresentationEventProcessorFactoryConfiguration configuration,
IWidgetSubscriptionManagerFactory widgetSubscriptionManagerFactory) {
private final Optional<IFormProcessor> optionalFormProcessor;

public PropertiesEventProcessorFactory(IPropertiesDescriptionService propertiesDescriptionService, IPropertiesDefaultDescriptionProvider propertiesDefaultDescriptionProvider, List<IWidgetDescriptor> widgetDescriptors,
RepresentationEventProcessorFactoryConfiguration configuration, FormEventProcessorFactoryConfiguration formConfiguration) {
this.propertiesDescriptionService = Objects.requireNonNull(propertiesDescriptionService);
this.propertiesDefaultDescriptionProvider = Objects.requireNonNull(propertiesDefaultDescriptionProvider);
this.objectService = Objects.requireNonNull(objectService);
this.objectService = Objects.requireNonNull(formConfiguration.getObjectService());
this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors);
this.formEventHandlers = Objects.requireNonNull(formEventHandlers);
this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers());
this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory());
this.widgetSubscriptionManagerFactory = Objects.requireNonNull(widgetSubscriptionManagerFactory);
this.widgetSubscriptionManagerFactory = Objects.requireNonNull(formConfiguration.getWidgetSubscriptionManagerFactory());
this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry());
this.optionalFormProcessor = Objects.requireNonNull(formConfiguration.getOptionalFormProcessor());
}

@Override
Expand All @@ -83,40 +89,34 @@ public <T extends IRepresentationEventProcessor> boolean canHandle(Class<T> repr
@Override
public <T extends IRepresentationEventProcessor> Optional<T> createRepresentationEventProcessor(Class<T> representationEventProcessorClass, IRepresentationConfiguration configuration,
IEditingContext editingContext) {
if (IFormEventProcessor.class.isAssignableFrom(representationEventProcessorClass) && configuration instanceof PropertiesConfiguration) {
PropertiesConfiguration propertiesConfiguration = (PropertiesConfiguration) configuration;
if (IFormEventProcessor.class.isAssignableFrom(representationEventProcessorClass) && configuration instanceof PropertiesConfiguration propertiesConfiguration) {

List<PageDescription> pageDescriptions = this.propertiesDescriptionService.getPropertiesDescriptions();
// @formatter:off
var objects = propertiesConfiguration.getObjectIds().stream()
.map(objectId -> this.objectService.getObject(editingContext, objectId))
.flatMap(Optional::stream)
.toList();
// @formatter:on
if (!objects.isEmpty()) {
Optional<FormDescription> optionalFormDescription = Optional.empty();
if (!pageDescriptions.isEmpty()) {
optionalFormDescription = new FormDescriptionAggregator().aggregate(pageDescriptions, objects, this.objectService);
}
FormDescription formDescription = optionalFormDescription.orElse(this.propertiesDefaultDescriptionProvider.getFormDescription());

// @formatter:off
FormCreationParameters formCreationParameters = FormCreationParameters.newFormCreationParameters(propertiesConfiguration.getId())
.editingContext(editingContext)
.formDescription(formDescription)
.object(objects.get(0))
.selection(objects)
.build();
// @formatter:on

IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(editingContext, formCreationParameters, this.widgetDescriptors, this.formEventHandlers,
this.subscriptionManagerFactory.create(), this.widgetSubscriptionManagerFactory.create(), this.representationRefreshPolicyRegistry);
IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(new FormEventProcessorConfiguration(editingContext, formCreationParameters,
this.widgetDescriptors, this.formEventHandlers),
this.subscriptionManagerFactory.create(), this.widgetSubscriptionManagerFactory.create(), this.representationRefreshPolicyRegistry, this.optionalFormProcessor.orElse(null));

// @formatter:off
return Optional.of(formEventProcessor)
.filter(representationEventProcessorClass::isInstance)
.map(representationEventProcessorClass::cast);
// @formatter:on
}
}
return Optional.empty();
Expand Down

0 comments on commit c69b48b

Please sign in to comment.