
com.xlrit.gears.engine.flowable.CancellationHandler Maven / Gradle / Ivy
package com.xlrit.gears.engine.flowable;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xlrit.gears.engine.facade.EngineFacade;
import com.xlrit.gears.engine.form.FormInfo;
import com.xlrit.gears.engine.form.GearsFormEngine;
import lombok.RequiredArgsConstructor;
import org.flowable.common.engine.api.delegate.event.*;
import org.flowable.engine.delegate.event.FlowableMessageEvent;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class CancellationHandler extends AbstractFlowableEventListener {
private static final Logger LOG = LoggerFactory.getLogger(CancellationHandler.class);
private static final String EVENT_CANCEL = "cancel";
private static final String VAR_CANCELLING = "__cancelling__";
private final GearsFormEngine formEngine;
private final ObjectMapper objectMapper;
@Override
public void onEvent(FlowableEvent event) {
if (event instanceof FlowableMessageEvent messageEvent
&& messageEvent.getType() == FlowableEngineEventType.ACTIVITY_MESSAGE_RECEIVED
&& EVENT_CANCEL.equals(messageEvent.getMessageName())) {
onCancelEventReceived(messageEvent.getExecutionId());
}
else if (event instanceof FlowableEngineEntityEvent entityEvent
&& event.getType() == FlowableEngineEventType.TASK_CREATED
&& entityEvent.getEntity() instanceof TaskEntity task) {
onTaskCreated(task);
}
}
@Override
public boolean isFailOnException() {
return false;
}
private void onCancelEventReceived(String executionId) {
ExecutionEntity executionEntity = getExecutionEntity(executionId);
executionEntity.setTransientVariable(VAR_CANCELLING, true);
}
private void onTaskCreated(TaskEntity task) {
ExecutionEntity executionEntity = getExecutionEntity(task.getExecutionId());
if (executionEntity.getTransientVariable(VAR_CANCELLING) == null)
return;
String formKey = task.getFormKey();
Object form = task.getVariable(formKey);
if (form != null) {
LOG.info("Existing form for formKey {}: {}", formKey, form);
FormInfo formInfo = formEngine.getFormInfo(formKey);
JsonNode formValue = formInfo.toFormValue(form, objectMapper);
task.setVariableLocal(EngineFacade.TASK_VAR_SAVED_VALUES, formValue);
}
}
private static ExecutionEntity getExecutionEntity(String executionId) {
return CommandContextUtil.getExecutionEntityManager(CommandContextUtil.getCommandContext()).findById(executionId);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy