private void withdrawFromAccount(
      String transactionId, String accountId, double amountToWithdraw, boolean independentTest)
      throws Throwable {
    Throwable[] ex = new Throwable[1];
    if (independentTest) {
      this.host.testStart(1);
    }
    BankAccountServiceRequest body = new BankAccountServiceRequest();
    body.kind = BankAccountServiceRequest.Kind.WITHDRAW;
    body.amount = amountToWithdraw;
    Operation patch = createWithdrawOperation(transactionId, accountId, amountToWithdraw);
    patch.setCompletion(
        (o, e) -> {
          if (operationFailed(o, e)) {
            if (e instanceof IllegalStateException) {
              ex[0] = e;
              this.host.completeIteration();
            } else {
              this.host.failIteration(e);
            }
            return;
          }
          this.host.completeIteration();
        });
    this.host.send(patch);
    if (independentTest) {
      this.host.testWait();
    }

    if (ex[0] != null) {
      throw ex[0];
    }
  }
  private Operation createWithdrawOperation(String transactionId, String accountId, double amount) {
    BankAccountServiceRequest body = new BankAccountServiceRequest();
    body.kind = BankAccountServiceRequest.Kind.WITHDRAW;
    body.amount = amount;
    Operation patch = Operation.createPatch(buildAccountUri(accountId)).setBody(body);
    if (transactionId != null) {
      patch.setTransactionId(transactionId);
    }

    return patch;
  }