
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