in saga-spring/src/main/java/org/apache/servicecomb/saga/spring/SagaExecutionQueryService.java [105:145]
public SagaExecutionDetail querySagaExecutionDetail(String sagaId) {
SagaEventEntity[] entities = repo.findBySagaId(sagaId).toArray(new SagaEventEntity[0]);
Optional<SagaEventEntity> sagaStartEvent = Arrays.stream(entities)
.filter(entity -> SagaStartedEvent.class.getSimpleName().equals(entity.type())).findFirst();
Map<String, HashSet<String>> router = new HashMap<>();
Map<String, String> status = new HashMap<>();
Map<String, String> error = new HashMap<>();
if (sagaStartEvent.isPresent()) {
SagaDefinition definition = fromJsonFormat.fromJson(sagaStartEvent.get().contentJson());
SingleLeafDirectedAcyclicGraph<SagaRequest> graph = graphBuilder
.build(definition.requests());
loopLoadGraphNodes(router, graph.root());
Collection<SagaEventEntity> transactionAbortEvents = Arrays.stream(entities)
.filter(entity -> TransactionAbortedEvent.class.getSimpleName().equals(entity.type())).collect(
Collectors.toList());
for (SagaEventEntity transactionAbortEvent : transactionAbortEvents) {
try {
JsonNode root = mapper.readTree(transactionAbortEvent.contentJson());
String id = root.at("/request/id").asText();
status.put(id, "Failed");
error.put(id, root.at("/response/body").asText());
} catch (IOException ex) {
throw new InvocationException(INTERNAL_SERVER_ERROR, "illegal json content");
}
}
Collection<SagaEventEntity> transactionEndEvents = Arrays.stream(entities)
.filter(entity -> TransactionEndedEvent.class.getSimpleName().equals(entity.type())).collect(
Collectors.toList());
for (SagaEventEntity transactionEndEvent : transactionEndEvents) {
try {
JsonNode root = mapper.readTree(transactionEndEvent.contentJson());
status.put(root.at("/request/id").asText(), "OK");
} catch (IOException ex) {
throw new InvocationException(INTERNAL_SERVER_ERROR, "illegal json content");
}
}
}
return new SagaExecutionDetail(router, status, error);
}