public SagaExecutionDetail querySagaExecutionDetail()

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);
  }