@Override
 public void done(String message, Exception e) {
   if (emitOutput) {
     System.out.println(
         '\n'
             + "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
     System.out.println("  RunBook : " + runbook.getRunBookPath() + "  |  " + " State : COMPLETE");
     System.out.println("  Error Reason :");
     e.printStackTrace();
     System.out.println(
         "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"
             + '\n');
   }
   try {
     execStatus.setEndTime(System.currentTimeMillis());
     // TODO: handle exception later.
     execStatus.setComplete(true);
     execStatus.setFinerStatus(message);
     execStatus.setState(ExecState.FAILED);
     store.update(execStatus);
     store.done();
   } finally {
     barrier.release(blockingKey);
   }
 }
 @Override
 public StepExecutionStatus pausedItem(DtRunbookItem runbookItem) {
   StepExecutionStatus itemStatus = new StepExecutionStatus(runbookItem.getItemId());
   itemStatus.setStartTime(System.currentTimeMillis());
   itemStatus.setState(ExecState.PAUSED);
   execStatus.addItemStatus(runbookItem.getItemId(), itemStatus);
   store.update(execStatus);
   return itemStatus;
 }
 @Override
 public StepExecutionStatus resumedItem(DtRunbookItem runbookItem) {
   StepExecutionStatus itemStatus =
       (StepExecutionStatus) execStatus.getItemStatus(runbookItem.getItemId());
   itemStatus.setComplete(false);
   itemStatus.setState(ExecState.RESUMED);
   store.update(itemStatus);
   return itemStatus;
 }
 public RunBookApiCallback(
     DtRunbook runbook,
     RunBookOutput runBookOutput,
     String executionId,
     OutputStore store,
     TransformedRunBook transformedRunbook,
     ConditionalBarrier<String> barrier,
     String blockingKey,
     boolean emitOutput) {
   this.runbook = runbook;
   this.runBookOutput = runBookOutput;
   this.executionId = executionId;
   this.store = store;
   this.barrier = barrier;
   this.blockingKey = blockingKey;
   this.emitOutput = emitOutput;
   execStatus = new RunBookApiExecStatus();
   execStatus.setExecutionId(executionId);
   // execStatus.setNodesMap(nodesMap);
   execStatus.setTransformedRunbook(transformedRunbook);
 }
 @Override
 public void done(String message) {
   if (emitOutput) {
     System.out.println(
         '\n'
             + "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
     System.out.println("  RunBook : " + runbook.getRunBookPath() + "  |  " + " COMPLETE");
     System.out.println(
         "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"
             + '\n');
   }
   try {
     execStatus.setEndTime(System.currentTimeMillis());
     execStatus.setComplete(true);
     execStatus.setState(didLatestStepFail() ? ExecState.FAILED : ExecState.SUCCESSFUL);
     execStatus.setFinerStatus(message);
     store.update(execStatus);
     store.done();
   } finally {
     barrier.release(blockingKey);
   }
 }
 @Override
 public void started() {
   if (emitOutput) {
     System.out.println(
         '\n'
             + "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
     System.out.println("  RunBook : " + runbook.getRunBookPath() + "  |  " + " STARTED");
     System.out.println(
         "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"
             + '\n');
   }
   execStatus.setStartTime(System.currentTimeMillis());
   store.create(execStatus);
 }
 private void appendToOutputMap(NodeOutputChunk nodeOutputChunk) {
   Map<String, Map<String, String>> outputMap = execStatus.getOutputMap();
   if (!outputMap.containsKey(nodeOutputChunk.getRunbookItemId())) {
     outputMap.put(nodeOutputChunk.getRunbookItemId(), new ConcurrentHashMap<>());
   }
   if (!outputMap
       .get(nodeOutputChunk.getRunbookItemId())
       .containsKey(nodeOutputChunk.getDisplayId())) {
     outputMap.get(nodeOutputChunk.getRunbookItemId()).put(nodeOutputChunk.getDisplayId(), "");
   }
   String currentOutput =
       outputMap.get(nodeOutputChunk.getRunbookItemId()).get(nodeOutputChunk.getDisplayId());
   outputMap
       .get(nodeOutputChunk.getRunbookItemId())
       .put(nodeOutputChunk.getDisplayId(), currentOutput + nodeOutputChunk.getOutputChunk());
 }
  @Override
  public StepExecutionStatus completedItem(DtRunbookItem runbookItem) {
    StepExecutionStatus itemStatus =
        (StepExecutionStatus) execStatus.getItemStatus(runbookItem.getItemId());
    itemStatus.setComplete(true);
    itemStatus.setEndTime(System.currentTimeMillis());
    System.out.println(
        '\n'
            + "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
    System.out.println("  Step : " + runbookItem.getId() + "  |  " + " COMPLETE");
    System.out.println(
        "-----------------------------------------------------------------------------------"
            + '\n');

    store.update(execStatus);
    return itemStatus;
  }
  @Override
  public StepExecutionStatus executingItem(DtRunbookItem runbookItem) {
    if (emitOutput) {
      System.out.println(
          '\n'
              + "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
      System.out.println("  Step : " + runbookItem.getId() + "  |  " + " STARTED");
      System.out.println(
          "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
              + '\n');
    }

    StepExecutionStatus itemStatus = new StepExecutionStatus(runbookItem.getItemId());
    itemStatus.setStartTime(System.currentTimeMillis());
    execStatus.addItemStatus(runbookItem.getItemId(), itemStatus);
    store.create(itemStatus);
    return itemStatus;
  }
  @Override
  public void itemExecOnNodeDone(String itemId, String nodeId, int statusCode, String message) {
    synchronized (this) {
      if (statusCode != 0) {
        latestStepFailed = true;
      } else {
        if (!latestStepFailed) {
          latestStepFailed = false;
        }
      }

      if (emitOutput) {
        System.out.println(
            '\n'
                + ". - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . -");
        System.out.println(
            "  Node : "
                + nodeId
                + "  |  "
                + " "
                + (latestStepFailed ? "FAILED" : "SUCCESSFUL")
                + (latestStepFailed ? "  |  REASON : " + message : ""));
        System.out.println(
            ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ."
                + '\n');

        Map<String, Map<String, String>> runBookOutputMap = runBookOutput.getOutputMap();
        Map<String, String> stepOutputMap = runBookOutputMap.get(itemId);
        String nodeOutput = stepOutputMap.get(nodeId);
        System.out.println(nodeOutput);
      }

      StepExecutionStatus itemStatus = (StepExecutionStatus) execStatus.getItemStatus(itemId);
      itemStatus.addNodeStatus(nodeId, statusCode, message);
      if (message != null) {
        NodeOutputChunk outputChunk = new NodeOutputChunk(nodeId, message, itemId);
        output(outputChunk);
      }
    }
  }