/**
   * Invokes the given search Url and writes the results to a file in the specified job folder.
   *
   * @param searchUrl
   * @param serverBase
   * @param jobDir
   * @param fileName
   * @throws IOException
   */
  private int retrieveAndStoreData(
      String searchUrl, String serverBase, File jobDir, String fileName) throws IOException {

    int numRecords = 0;

    final String url = urlEncodeQueryParams(searchUrl);

    LOG.info(
        "retrieveAndStoreData, serverBase: {}  searchUrl: {} encoded query: {}",
        serverBase,
        searchUrl,
        url);

    final ServerAuthorization serverAuthorization =
        AuthorizationUtil.findServerAuthorization(serverAuthorizations, serverBase);

    BearerTokenAuthInterceptor authInterceptor = null;
    if (serverAuthorization != null) {
      // register authorization interceptor with the client
      LOG.info("assigning bearing token interceptor, {}", serverAuthorization.getAccessToken());
      authInterceptor = new BearerTokenAuthInterceptor(serverAuthorization.getAccessToken());
      fhirRestClient.registerInterceptor(authInterceptor);
    }
    try {
      // Perform a search
      final Bundle searchResults =
          fhirRestClient.search().byUrl(url).returnBundle(Bundle.class).execute();

      // Split the bundle into its component resources
      final SearchResultSplitter resultSplitter = new SearchResultSplitter();
      final List<Resource> resources = resultSplitter.splitBundle(searchResults);

      final File dataFile = createDataSourceFile(jobDir, fileName);
      writeData(dataFile, resources, serverBase, true);
      numRecords = resources.size();

      // retrieve other pages of search results
      Bundle nextResults = searchResults;
      while (nextResults.getLink(Bundle.LINK_NEXT) != null) {
        nextResults = fhirRestClient.loadPage().next(nextResults).execute();
        List<Resource> nextResources = resultSplitter.splitBundle(nextResults);
        writeData(dataFile, nextResources, serverBase, false);
        numRecords += nextResources.size();
      }
    } finally {
      if (authInterceptor != null) {
        // unregister authorization interceptor with the client
        fhirRestClient.unregisterInterceptor(authInterceptor);
      }
    }
    return numRecords;
  }