use of io.camunda.zeebe.util.Either in project zeebe by zeebe-io.
the class BpmnDecisionBehavior method evaluateDecision.
/**
* Evaluate a decision during the processing of a bpmn element.
*
* @param element the called decision of the current bpmn element
* @param context process instance-related data of the element that is executed
* @return either an evaluated decision's result or a failure
*/
public Either<Failure, DecisionEvaluationResult> evaluateDecision(final ExecutableCalledDecision element, final BpmnElementContext context) {
final var scopeKey = context.getElementInstanceKey();
final var decisionIdOrFailure = evalDecisionIdExpression(element, scopeKey);
if (decisionIdOrFailure.isLeft()) {
return Either.left(decisionIdOrFailure.getLeft());
}
final var decisionId = decisionIdOrFailure.get();
// todo(#8571): avoid parsing drg every time
final var decisionOrFailure = findDecisionById(decisionId);
final var resultOrFailure = decisionOrFailure.flatMap(this::findDrgByDecision).mapLeft(failure -> new Failure("Expected to evaluate decision '%s', but %s".formatted(decisionId, failure.getMessage()))).flatMap(drg -> parseDrg(drg.getResource())).mapLeft(f -> new Failure(f.getMessage(), ErrorType.CALLED_DECISION_ERROR, scopeKey)).flatMap(drg -> {
final var evaluationResult = evaluateDecisionInDrg(drg, decisionId, scopeKey);
final var decision = decisionOrFailure.get();
writeDecisionEvaluationEvent(decision, evaluationResult, context);
if (evaluationResult.isFailure()) {
metrics.increaseFailedEvaluatedDmnElements(evaluationResult.getEvaluatedDecisions().size());
return Either.left(new Failure(evaluationResult.getFailureMessage(), ErrorType.DECISION_EVALUATION_ERROR, scopeKey));
} else {
metrics.increaseSuccessfullyEvaluatedDmnElements(evaluationResult.getEvaluatedDecisions().size());
return Either.right(evaluationResult);
}
});
resultOrFailure.ifRight(result -> {
// The output mapping behavior determines what to do with the decision result. Since the
// output mapping may fail and raise an incident, we need to write the variable to a
// record. This is because we want to evaluate the decision on element activation, while
// the output mapping happens on element completion. We don't want to re-evaluate the
// decision for output mapping related incidents.
triggerProcessEventWithResultVariable(context, element.getResultVariable(), result);
});
return resultOrFailure;
}
use of io.camunda.zeebe.util.Either in project zeebe by camunda.
the class QueryApiRequestHandlerTest method processFound.
@DisplayName("should respond with bpmnProcessId when process found")
@Test
void processFound() throws ClosedServiceException {
// given
final QueryApiRequestHandler sut = createQueryApiRequestHandler(true);
final var bpmnProcessId = BufferUtil.wrapString("OneProcessToFindThem");
final var queryService = mock(QueryService.class);
sut.addPartition(1, queryService);
when(queryService.getBpmnProcessIdForProcess(1)).thenReturn(Optional.of(bpmnProcessId));
// when
final Either<ErrorResponse, ExecuteQueryResponse> response = new AsyncExecuteQueryRequestSender(sut).sendRequest(new ExecuteQueryRequest().setPartitionId(1).setKey(1).setValueType(ValueType.PROCESS)).join();
// then
EitherAssert.assertThat(response).isRight().extracting(Either::get).extracting(ExecuteQueryResponse::getBpmnProcessId).isEqualTo("OneProcessToFindThem");
}
use of io.camunda.zeebe.util.Either in project zeebe by camunda.
the class QueryApiRequestHandlerTest method processNotFound.
@DisplayName("should respond with PROCESS_NOT_FOUND when no process with key exists")
@Test
void processNotFound() {
// given
final QueryApiRequestHandler sut = createQueryApiRequestHandler(true);
sut.addPartition(1, mock(QueryService.class));
// when
final Either<ErrorResponse, ExecuteQueryResponse> response = new AsyncExecuteQueryRequestSender(sut).sendRequest(new ExecuteQueryRequest().setPartitionId(1).setKey(1).setValueType(ValueType.PROCESS)).join();
// then
EitherAssert.assertThat(response).isLeft().extracting(Either::getLeft).extracting(ErrorResponse::getErrorCode, error -> BufferUtil.bufferAsString(error.getErrorData())).containsExactly(ErrorCode.PROCESS_NOT_FOUND, "Expected to find the process ID for resource of type PROCESS with key 1, but no such " + "resource was found");
}
use of io.camunda.zeebe.util.Either in project zeebe by camunda.
the class QueryApiRequestHandlerTest method jobNotFound.
@DisplayName("should respond with PROCESS_NOT_FOUND when no job with key exists")
@Test
void jobNotFound() {
// given
final QueryApiRequestHandler sut = createQueryApiRequestHandler(true);
sut.addPartition(1, mock(QueryService.class));
// when
final Either<ErrorResponse, ExecuteQueryResponse> response = new AsyncExecuteQueryRequestSender(sut).sendRequest(new ExecuteQueryRequest().setPartitionId(1).setKey(1).setValueType(ValueType.JOB)).join();
// then
EitherAssert.assertThat(response).isLeft().extracting(Either::getLeft).extracting(ErrorResponse::getErrorCode, error -> BufferUtil.bufferAsString(error.getErrorData())).containsExactly(ErrorCode.PROCESS_NOT_FOUND, "Expected to find the process ID for resource of type JOB with key 1, but no such " + "resource was found");
}
use of io.camunda.zeebe.util.Either in project zeebe by camunda.
the class QueryApiRequestHandlerTest method processInstanceNotFound.
@DisplayName("should respond with PROCESS_NOT_FOUND when no process instance with key exists")
@Test
void processInstanceNotFound() {
// given
final QueryApiRequestHandler sut = createQueryApiRequestHandler(true);
sut.addPartition(1, mock(QueryService.class));
// when
final Either<ErrorResponse, ExecuteQueryResponse> response = new AsyncExecuteQueryRequestSender(sut).sendRequest(new ExecuteQueryRequest().setPartitionId(1).setKey(1).setValueType(ValueType.PROCESS_INSTANCE)).join();
// then
EitherAssert.assertThat(response).isLeft().extracting(Either::getLeft).extracting(ErrorResponse::getErrorCode, error -> BufferUtil.bufferAsString(error.getErrorData())).containsExactly(ErrorCode.PROCESS_NOT_FOUND, "Expected to find the process ID for resource of type PROCESS_INSTANCE with key 1, but " + "no such resource was found");
}
Aggregations