Tracks
/
FHIR
FHIR
/
Exercises
/
Bulk Data $export (Java)
Bulk Data $export (Java)

Bulk Data $export (Java)

Medium

Instructions

FHIR's Bulk Data Access ($export) hands you a whole population of resources as newline-delimited JSON (NDJSON) files. Because assembling those files can take minutes, the operation is asynchronous: a client kicks it off, polls until the server is done, then downloads the files the server lists.

This kata is the offline, deterministic version of Batch-1 Day 19, Assignment 24 (Topic 20.5.2, FHIR Bulk Data $export). You model the three steps of the async request pattern against captured HttpResponse values β€” no sockets, no clock.

The async $export pattern

  1. Kickoff. The client GETs [base]/Patient/$export. A successful kickoff returns 202 Accepted with a Content-Location header whose value is the status (poll) URL. The response has no useful body yet.
  2. Poll. The client repeatedly GETs the status URL:
    • 202 Accepted β€” still in progress; wait and poll again.
    • 200 OK β€” export complete; the body is the manifest.
  3. Complete. The manifest is a JSON object with an output array. Each entry describes one produced file: a type and a url pointing at an NDJSON file. The client downloads every url, in the order listed.

A manifest looks like:

{
  "transactionTime": "2024-01-01T00:00:00Z",
  "request": "https://ex/fhir/Patient/$export",
  "requiresAccessToken": true,
  "output": [
    { "type": "Patient",     "url": "http://ex/Patient.ndjson" },
    { "type": "Observation", "url": "http://ex/Observation.ndjson" }
  ],
  "error": []
}

Your task

Implement BulkExport with:

  • static String kickoff(HttpResponse response) β€” return the Content-Location header value. If the status is not 202, or the header is missing, throw IllegalStateException.
  • static List<String> pollUntilComplete(Iterator<HttpResponse> polls) β€” consume responses in order:
    • 202 β†’ still in progress; move on to the next response.
    • 200 β†’ complete; parse the manifest body and return the url of every object in the output array, in document order.
    • any other status β†’ throw IllegalStateException.
    • iterator exhausted before a 200 arrives β†’ throw IllegalStateException.

The provided nested HttpResponse type is already implemented (constructor, plus status(), header(name) with case-insensitive lookup, and body()); leave it as-is. Do not add a JSON library β€” extract the urls with java.util.regex, e.g. the pattern "url"\s*:\s*"([^"]*)".


Source

Batch-1 Day 19 Week 4 Assignment 24 / Topic 20.5.2 (FHIR Bulk Data $export), refactored to an offline async-export state-machine kata.
Edit via GitHub The link opens in a new window or tab
FHIR Exercism

Ready to start Bulk Data $export (Java)?

Sign up to Exercism to learn and master FHIR with 9 exercises, and real human mentoring, all for free.