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

org.cloudfoundry.multiapps.controller.process.util.ProcessHelper Maven / Gradle / Ivy

package org.cloudfoundry.multiapps.controller.process.util;

import java.util.List;
import java.util.Optional;

import jakarta.inject.Inject;
import jakarta.inject.Named;

import org.cloudfoundry.multiapps.controller.api.model.Operation;
import org.cloudfoundry.multiapps.controller.api.model.Operation.State;
import org.cloudfoundry.multiapps.controller.persistence.OrderDirection;
import org.cloudfoundry.multiapps.controller.persistence.model.HistoricOperationEvent;
import org.cloudfoundry.multiapps.controller.persistence.services.HistoricOperationEventService;
import org.cloudfoundry.multiapps.controller.process.flowable.FlowableFacade;
import org.flowable.engine.runtime.ProcessInstance;

@Named
public class ProcessHelper {

    private final FlowableFacade flowableFacade;
    private final HistoricOperationEventService historicOperationEventService;

    @Inject
    public ProcessHelper(FlowableFacade flowableFacade, HistoricOperationEventService historicOperationEventService) {
        this.flowableFacade = flowableFacade;
        this.historicOperationEventService = historicOperationEventService;
    }

    public Operation.State computeProcessState(String processId) {
        if (isInAbortedState(processId)) {
            return State.ABORTED;
        }

        if (isInErrorState(processId)) {
            return State.ERROR;
        }

        if (isInReceiveTask(processId)) {
            return State.ACTION_REQUIRED;
        }

        if (isInRunningState(processId)) {
            return State.RUNNING;
        }
        return State.FINISHED;
    }

    private boolean isInReceiveTask(String processId) {
        return flowableFacade.isProcessInstanceAtReceiveTask(processId);
    }

    private boolean isInAbortedState(String processId) {
        List historicOperationEvents = getHistoricOperationEventByProcessId(processId);
        return historicOperationEvents.stream()
                                      .anyMatch(event -> event.getType() == HistoricOperationEvent.EventType.ABORTED);
    }

    public List getHistoricOperationEventByProcessId(String processId) {
        return historicOperationEventService.createQuery()
                                            .processId(processId)
                                            .orderByTimestamp(OrderDirection.ASCENDING)
                                            .list();
    }

    private boolean isInErrorState(String processId) {
        return flowableFacade.hasDeadLetterJobs(processId);
    }

    private boolean isInRunningState(String processId) {
        Optional processInstanceOptional = getProcessInstance(processId);
        return processInstanceOptional.isPresent();
    }

    private Optional getProcessInstance(String processId) {
        return Optional.ofNullable(flowableFacade.getProcessInstance(processId));
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy