/**
  * This method builds a state object which can be used to submit a stage progress self-patch.
  *
  * @param stage Supplies the stage that the current service instance is moving to.
  * @param errorResponse Supplies the {@link ServiceErrorResponse} response object
  * @return Returns a patch state object that the current service instance is moving to.
  */
 private State buildPatch(
     TaskState.TaskStage stage, @Nullable ServiceErrorResponse errorResponse) {
   State state = new State();
   state.taskState = new TaskState();
   state.taskState.stage = stage;
   state.taskState.failure = errorResponse;
   return state;
 }
  /**
   * This method applies a patch to a state object.
   *
   * @param startState Supplies the start state object.
   * @param patchState Supplies the patch state object.
   */
  private State applyPatch(State startState, State patchState) {
    if (patchState.taskState != null) {
      if (patchState.taskState.stage != startState.taskState.stage) {
        ServiceUtils.logInfo(this, "Moving to stage %s", patchState.taskState.stage);
      }

      startState.taskState = patchState.taskState;
    }

    return startState;
  }
  @VisibleForTesting
  protected State buildPatch(TaskState.TaskStage stage, @Nullable Throwable t) {
    State patchState = new State();
    patchState.taskState = new TaskState();
    patchState.taskState.stage = stage;

    if (null != t) {
      patchState.taskState.failure = Utils.toServiceErrorResponse(t);
    }

    return patchState;
  }
  private State applyPatch(State currentState, State patchState) {
    if (patchState.taskState.stage != currentState.taskState.stage) {
      ServiceUtils.logInfo(this, "Moving to stage %s", patchState.taskState.stage);
      currentState.taskState = patchState.taskState;
    }

    if (patchState.tenantServiceLink != null) {
      currentState.tenantServiceLink = patchState.tenantServiceLink;
    }

    return currentState;
  }