All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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