/** * 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; }