public ProjectPatientMap getProjectPatientMap(
      String i2b2User, String i2b2Token, String i2b2Url, String i2b2Domain, String i2b2Project)
      throws FhirServerException {

    if (status.isComplete(i2b2Project)) {
      return getProjectPatientMapLocking(i2b2Project);
    }

    if (!(status.isProcessing(i2b2Project) || status.isComplete(i2b2Project))) {
      fetchPatientList(i2b2User, i2b2Token, i2b2Url, i2b2Domain, i2b2Project);
    }

    while (status.isProcessing(i2b2Project)) {
      logger.info("waiting on complete status");
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        logger.error(e.getMessage(), e);
      }
    }
    return getProjectPatientMap(i2b2User, i2b2Token, i2b2Url, i2b2Domain, i2b2Project);
  }