Added example demonstrating how to retrieve a complete bundle
This commit is contained in:
parent
589059256f
commit
4118fcc03d
|
@ -0,0 +1,65 @@
|
|||
package example;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.model.dstu2.resource.Bundle;
|
||||
import ca.uhn.fhir.model.dstu2.resource.RelatedPerson;
|
||||
import ca.uhn.fhir.rest.client.IGenericClient;
|
||||
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
||||
|
||||
/**
|
||||
* @author Bill de Beaubien on 1/13/2016.
|
||||
*/
|
||||
public class BundleFetcher {
|
||||
public static void fetchRestOfBundle(IGenericClient theClient, Bundle theBundle) {
|
||||
// we need to keep track of which resources are already in the bundle so that if other resources (e.g. Practitioner) are _included,
|
||||
// we don't end up with multiple copies
|
||||
Set<String> resourcesAlreadyAdded = new HashSet<String>();
|
||||
addInitialUrlsToSet(theBundle, resourcesAlreadyAdded);
|
||||
Bundle partialBundle = theBundle;
|
||||
for (;;) {
|
||||
if (partialBundle.getLink(IBaseBundle.LINK_NEXT) != null) {
|
||||
partialBundle = theClient.loadPage().next(partialBundle).execute();
|
||||
addAnyResourcesNotAlreadyPresentToBundle(theBundle, partialBundle, resourcesAlreadyAdded);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// the self and next links for the aggregated bundle aren't really valid anymore, so remove them
|
||||
theBundle.getLink().clear();
|
||||
}
|
||||
|
||||
private static void addInitialUrlsToSet(Bundle theBundle, Set<String> theResourcesAlreadyAdded) {
|
||||
for (Bundle.Entry entry : theBundle.getEntry()) {
|
||||
theResourcesAlreadyAdded.add(entry.getFullUrl());
|
||||
}
|
||||
}
|
||||
|
||||
private static void addAnyResourcesNotAlreadyPresentToBundle(Bundle theAggregatedBundle, Bundle thePartialBundle, Set<String> theResourcesAlreadyAdded) {
|
||||
for (Bundle.Entry entry : thePartialBundle.getEntry()) {
|
||||
if (!theResourcesAlreadyAdded.contains(entry.getFullUrl())) {
|
||||
theResourcesAlreadyAdded.add(entry.getFullUrl());
|
||||
theAggregatedBundle.getEntry().add(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
FhirContext ctx = FhirContext.forDstu2();
|
||||
String serverBase = "http://fhirtest.uhn.ca/baseDstu2";
|
||||
IGenericClient client = ctx.newRestfulGenericClient(serverBase);
|
||||
// use RelatedPerson because there aren't that many on the server
|
||||
Bundle bundle = client.search().forResource(RelatedPerson.class).returnBundle(Bundle.class).execute();
|
||||
BundleFetcher.fetchRestOfBundle(client, bundle);
|
||||
if (bundle.getTotal() != bundle.getEntry().size()) {
|
||||
System.out.println("Counts didn't match! Expected " + bundle.getTotal() + " but bundle only had " + bundle.getEntry().size() + " entries!");
|
||||
}
|
||||
|
||||
// IParser parser = ctx.newXmlParser().setPrettyPrint(true);
|
||||
// System.out.println(parser.encodeResourceToString(bundle));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue