Fix timeout issue in vsac

This commit is contained in:
Grahame Grieve 2023-11-24 08:46:23 +11:00
parent a86e3d2bdc
commit 1814a69826
5 changed files with 91 additions and 151 deletions

View File

@ -33,60 +33,6 @@ import org.hl7.fhir.utilities.json.model.JsonObject;
import org.hl7.fhir.utilities.json.model.JsonProperty; import org.hl7.fhir.utilities.json.model.JsonProperty;
public class VSACImporter extends OIDBasedValueSetImporter { public class VSACImporter extends OIDBasedValueSetImporter {
private static class StatsTracker {
private String runNumber;
private JsonObject stats;
private File file;
protected StatsTracker() throws IOException {
super();
file = new File(Utilities.path("[tmp]", "vsac.stats.json"));
if (file.exists() ) {
stats = org.hl7.fhir.utilities.json.parser.JsonParser.parseObject(file);
runNumber = ""+(stats.asInteger("last-run")+1);
} else {
stats = new JsonObject();
runNumber = "1";
}
stats.set("last-run", runNumber);
}
public void recordTime(String oid, boolean expand, int offset, long time) {
JsonArray arr = stats.forceObject(oid).forceObject(runNumber).forceArray(expand ? "e"+offset : "r");
arr.add(Long.toString(time));
}
public void recordError(String oid, boolean expand, int offset, String error) {
JsonArray arr = stats.forceObject(oid).forceObject(runNumber).forceArray(expand ? "e"+offset : "r");
arr.add(error.contains("time") ? "t" : error);
}
public boolean hasFailed(String oid) {
JsonObject obj = stats.forceObject(oid);
for (JsonProperty p : obj.getProperties()) {
if (p.getValue().isJsonObject()) {
JsonObject o = p.getValue().asJsonObject();
for (JsonProperty p1 : o.getProperties()) {
if (p1.getValue().isJsonArray()) {
JsonArray a = p1.getValue().asJsonArray();
for (String s : a.asStrings()) {
if ("t".equals(s)) {
return true;
}
}
}
}
}
}
return false;
}
public void save() throws IOException {
org.hl7.fhir.utilities.json.parser.JsonParser.compose(stats, file);
}
}
public VSACImporter() throws FHIRException, IOException { public VSACImporter() throws FHIRException, IOException {
super(); super();
@ -102,12 +48,11 @@ public class VSACImporter extends OIDBasedValueSetImporter {
CSVReader csv = new CSVReader(new FileInputStream(source)); CSVReader csv = new CSVReader(new FileInputStream(source));
csv.readHeaders(); csv.readHeaders();
Map<String, String> errs = new HashMap<>(); Map<String, String> errs = new HashMap<>();
StatsTracker st = new StatsTracker();
FHIRToolingClient fhirToolingClient = new FHIRToolingClient("https://cts.nlm.nih.gov/fhir", "fhir/vsac"); FHIRToolingClient fhirToolingClient = new FHIRToolingClient("https://cts.nlm.nih.gov/fhir", "fhir/vsac");
fhirToolingClient.setUsername("apikey"); fhirToolingClient.setUsername("apikey");
fhirToolingClient.setPassword(apiKey); fhirToolingClient.setPassword(apiKey);
fhirToolingClient.setTimeout(120000); fhirToolingClient.setTimeoutNormal(6000);
CapabilityStatement cs = fhirToolingClient.getCapabilitiesStatement(); CapabilityStatement cs = fhirToolingClient.getCapabilitiesStatement();
JsonParser json = new JsonParser(); JsonParser json = new JsonParser();
@ -117,9 +62,6 @@ public class VSACImporter extends OIDBasedValueSetImporter {
List<String> oids = new ArrayList<>(); List<String> oids = new ArrayList<>();
while (csv.line()) { while (csv.line()) {
String oid = csv.cell("OID"); String oid = csv.cell("OID");
if (st.hasFailed(oid)) {
oid = " "+oid; // do these first
}
oids.add(oid); oids.add(oid);
} }
Collections.sort(oids); Collections.sort(oids);
@ -128,18 +70,16 @@ public class VSACImporter extends OIDBasedValueSetImporter {
int j = 0; int j = 0;
for (String oid : oids) { for (String oid : oids) {
try { try {
j = processOid(dest, onlyNew, errs, st, fhirToolingClient, j, oid.trim()); j = processOid(dest, onlyNew, errs, fhirToolingClient, j, oid.trim());
i++; i++;
if (i % 100 == 0) { if (i % 100 == 0) {
System.out.println(":"+i+" ("+j+")"); System.out.println(":"+i+" ("+j+")");
st.save();
} }
} catch (Exception e) { } catch (Exception e) {
System.out.println("Unable to fetch OID " + oid + ": " + e.getMessage()); System.out.println("Unable to fetch OID " + oid + ": " + e.getMessage());
errs.put(oid, e.getMessage()); errs.put(oid, e.getMessage());
} }
} }
st.save();
OperationOutcome oo = new OperationOutcome(); OperationOutcome oo = new OperationOutcome();
for (String oid : errs.keySet()) { for (String oid : errs.keySet()) {
oo.addIssue().setSeverity(IssueSeverity.ERROR).setCode(IssueType.EXCEPTION).setDiagnostics(errs.get(oid)).addLocation(oid); oo.addIssue().setSeverity(IssueSeverity.ERROR).setCode(IssueType.EXCEPTION).setDiagnostics(errs.get(oid)).addLocation(oid);
@ -148,67 +88,36 @@ public class VSACImporter extends OIDBasedValueSetImporter {
System.out.println("Done. " + i + " ValueSets"); System.out.println("Done. " + i + " ValueSets");
} }
private int processOid(String dest, boolean onlyNew, Map<String, String> errs, StatsTracker st, private int processOid(String dest, boolean onlyNew, Map<String, String> errs, FHIRToolingClient fhirToolingClient, int j, String oid)
FHIRToolingClient fhirToolingClient, int j, String oid)
throws IOException, InterruptedException, FileNotFoundException { throws IOException, InterruptedException, FileNotFoundException {
if (!onlyNew || !(new File(Utilities.path(dest, "ValueSet-" + oid + ".json")).exists())) { if (!onlyNew || !(new File(Utilities.path(dest, "ValueSet-" + oid + ".json")).exists())) {
ValueSet vs = null; ValueSet vs = null;
try { try {
long t = System.currentTimeMillis();
vs = fhirToolingClient.read(ValueSet.class, oid); vs = fhirToolingClient.read(ValueSet.class, oid);
st.recordTime(oid, false, 0, System.currentTimeMillis()-t);
} catch (Exception e) { } catch (Exception e) {
st.recordError(oid, false, 0, e.getMessage()); errs.put(oid, "Read: " +e.getMessage());
errs.put(oid, "Read: " +e.getMessage()+". Try again"); System.out.println("Read "+oid+" failed: "+e.getMessage());
System.out.println("Read "+oid+" failed: "+e.getMessage()+". Try again after 10sec");
Thread.sleep(10000);
try {
long t = System.currentTimeMillis();
vs = fhirToolingClient.read(ValueSet.class, oid);
st.recordTime(oid, false, 0, System.currentTimeMillis()-t);
} catch (Exception e2) {
st.recordError(oid, false, 0, e2.getMessage());
errs.put(oid, "Read: " +e2.getMessage()+". Give up");
System.out.println("Read "+oid+" failed: "+e2.getMessage()+". Give up");
}
} }
if (vs != null) { if (vs != null) {
try { try {
long t = System.currentTimeMillis();
ValueSet vse = fhirToolingClient.expandValueset(vs.getUrl(), null); ValueSet vse = fhirToolingClient.expandValueset(vs.getUrl(), null);
st.recordTime(oid, true, 0, System.currentTimeMillis()-t);
vs.setExpansion(vse.getExpansion()); vs.setExpansion(vse.getExpansion());
j++; j++;
} catch (Exception e) { } catch (Exception e) {
st.recordError(oid, true, 0, e.getMessage()); errs.put(oid, "Expansion: " +e.getMessage());
errs.put(oid, "Expansion: " +e.getMessage()+". Try again"); System.out.println("Expand "+oid+" failed: "+e.getMessage());
System.out.println("Expand "+oid+" failed: "+e.getMessage()+". Try again");
try {
long t = System.currentTimeMillis();
ValueSet vse = fhirToolingClient.expandValueset(vs.getUrl(), null);
st.recordTime(oid, true, 0, System.currentTimeMillis()-t);
vs.setExpansion(vse.getExpansion());
j++;
} catch (Exception e2) {
st.recordError(oid, true, 0, e2.getMessage());
errs.put(oid, "Expansion: " +e2.getMessage()+". Give up");
System.out.println("Expand "+oid+" failed: "+e2.getMessage()+". Give up");
}
} }
while (isIncomplete(vs.getExpansion())) { while (isIncomplete(vs.getExpansion())) {
Parameters p = new Parameters(); Parameters p = new Parameters();
int offset = vs.getExpansion().getParameter("offset").getValueIntegerType().getValue() + vs.getExpansion().getParameter("count").getValueIntegerType().getValue(); int offset = vs.getExpansion().getParameter("offset").getValueIntegerType().getValue() + vs.getExpansion().getParameter("count").getValueIntegerType().getValue();
p.addParameter("offset", offset); p.addParameter("offset", offset);
try { try {
long t = System.currentTimeMillis();
ValueSet vse = fhirToolingClient.expandValueset(vs.getUrl(), p); ValueSet vse = fhirToolingClient.expandValueset(vs.getUrl(), p);
st.recordTime(oid, true, offset, System.currentTimeMillis()-t);
vs.getExpansion().getContains().addAll(vse.getExpansion().getContains()); vs.getExpansion().getContains().addAll(vse.getExpansion().getContains());
vs.getExpansion().setParameter(vse.getExpansion().getParameter()); vs.getExpansion().setParameter(vse.getExpansion().getParameter());
} catch (Exception e2) { } catch (Exception e2) {
st.recordError(oid, true, 0, e2.getMessage()); errs.put(oid, "Expansion: " +e2.getMessage()+" @ "+offset);
errs.put(oid, "Expansion: " +e2.getMessage()+" @ "+offset+". Give up"); System.out.println("Expand "+oid+" @ "+offset+" failed: "+e2.getMessage());
System.out.println("Expand "+oid+" @ "+offset+" failed: "+e2.getMessage()+". Give up");
} }
} }
vs.getExpansion().setOffsetElement(null); vs.getExpansion().setOffsetElement(null);

View File

@ -133,8 +133,8 @@ public class TerminologyClientR4 implements ITerminologyClient {
} }
@Override @Override
public ITerminologyClient setTimeout(int i) { public ITerminologyClient setTimeout(int i) { // #FIXME
client.setTimeout(i); client.setTimeoutNormal(i);
return this; return this;
} }

View File

@ -87,7 +87,7 @@ public class TerminologyClientR4 implements TerminologyClient {
@Override @Override
public void setTimeout(int i) { public void setTimeout(int i) {
client.setTimeout(i); client.setTimeoutNormal(i); // #FIXME
} }
@Override @Override

View File

@ -67,12 +67,12 @@ public class FHIRToolingClient {
public static final String hostKey = "http.proxyHost"; public static final String hostKey = "http.proxyHost";
public static final String portKey = "http.proxyPort"; public static final String portKey = "http.proxyPort";
private static final int TIMEOUT_NORMAL = 1500; private static final int DEFAULT_TIMEOUT_NORMAL = 1500;
private static final int TIMEOUT_OPERATION = 30000; private static final int DEFAULT_TIMEOUT_OPERATION = 30000;
private static final int TIMEOUT_ENTRY = 500; private static final int DEFAULT_TIMEOUT_ENTRY = 500;
private static final int TIMEOUT_OPERATION_LONG = 60000; private static final int DEFAULT_TIMEOUT_OPERATION_LONG = 60000;
private static final int TIMEOUT_OPERATION_EXPAND = 120000; private static final int DEFAULT_TIMEOUT_OPERATION_EXPAND = 120000;
private String base; private String base;
private ResourceAddress resourceAddress; private ResourceAddress resourceAddress;
private ResourceFormat preferredResourceFormat; private ResourceFormat preferredResourceFormat;
@ -84,6 +84,11 @@ public class FHIRToolingClient {
private String password; private String password;
private String userAgent; private String userAgent;
private String acceptLang; private String acceptLang;
private int timeoutNormal = DEFAULT_TIMEOUT_NORMAL;
private int timeoutOperation = DEFAULT_TIMEOUT_OPERATION;
private int timeoutEntry = DEFAULT_TIMEOUT_ENTRY;
private int timeoutLong = DEFAULT_TIMEOUT_OPERATION_LONG;
private int timeoutExpand = DEFAULT_TIMEOUT_OPERATION_EXPAND;
// Pass endpoint for client - URI // Pass endpoint for client - URI
public FHIRToolingClient(String baseServiceUrl, String userAgent) throws URISyntaxException { public FHIRToolingClient(String baseServiceUrl, String userAgent) throws URISyntaxException {
@ -134,7 +139,7 @@ public class FHIRToolingClient {
TerminologyCapabilities capabilities = null; TerminologyCapabilities capabilities = null;
try { try {
capabilities = (TerminologyCapabilities) client.issueGetResourceRequest(resourceAddress.resolveMetadataTxCaps(), capabilities = (TerminologyCapabilities) client.issueGetResourceRequest(resourceAddress.resolveMetadataTxCaps(),
getPreferredResourceFormat(), generateHeaders(), "TerminologyCapabilities", TIMEOUT_NORMAL).getReference(); getPreferredResourceFormat(), generateHeaders(), "TerminologyCapabilities", timeoutNormal).getReference();
} catch (Exception e) { } catch (Exception e) {
throw new FHIRException("Error fetching the server's terminology capabilities", e); throw new FHIRException("Error fetching the server's terminology capabilities", e);
} }
@ -145,7 +150,7 @@ public class FHIRToolingClient {
CapabilityStatement conformance = null; CapabilityStatement conformance = null;
try { try {
conformance = (CapabilityStatement) client.issueGetResourceRequest(resourceAddress.resolveMetadataUri(false), conformance = (CapabilityStatement) client.issueGetResourceRequest(resourceAddress.resolveMetadataUri(false),
getPreferredResourceFormat(), generateHeaders(), "CapabilitiesStatement", TIMEOUT_NORMAL).getReference(); getPreferredResourceFormat(), generateHeaders(), "CapabilitiesStatement", timeoutNormal).getReference();
} catch (Exception e) { } catch (Exception e) {
throw new FHIRException("Error fetching the server's conformance statement", e); throw new FHIRException("Error fetching the server's conformance statement", e);
} }
@ -157,7 +162,7 @@ public class FHIRToolingClient {
return capabilities; return capabilities;
try { try {
capabilities = (CapabilityStatement) client.issueGetResourceRequest(resourceAddress.resolveMetadataUri(true), capabilities = (CapabilityStatement) client.issueGetResourceRequest(resourceAddress.resolveMetadataUri(true),
getPreferredResourceFormat(), generateHeaders(), "CapabilitiesStatement-Quick", TIMEOUT_NORMAL) getPreferredResourceFormat(), generateHeaders(), "CapabilitiesStatement-Quick", timeoutNormal)
.getReference(); .getReference();
} catch (Exception e) { } catch (Exception e) {
throw new FHIRException("Error fetching the server's capability statement: " + e.getMessage(), e); throw new FHIRException("Error fetching the server's capability statement: " + e.getMessage(), e);
@ -170,7 +175,7 @@ public class FHIRToolingClient {
try { try {
result = client.issueGetResourceRequest(resourceAddress.resolveGetUriFromResourceClassAndId(resourceClass, id), result = client.issueGetResourceRequest(resourceAddress.resolveGetUriFromResourceClassAndId(resourceClass, id),
getPreferredResourceFormat(), generateHeaders(), "Read " + resourceClass + "/" + id, getPreferredResourceFormat(), generateHeaders(), "Read " + resourceClass + "/" + id,
TIMEOUT_NORMAL); timeoutNormal);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -186,7 +191,7 @@ public class FHIRToolingClient {
try { try {
result = client.issueGetResourceRequest(resourceAddress.resolveGetUriFromResourceClassAndId(resourceClass, id), result = client.issueGetResourceRequest(resourceAddress.resolveGetUriFromResourceClassAndId(resourceClass, id),
getPreferredResourceFormat(), generateHeaders(), "Read " + resourceClass.getName() + "/" + id, getPreferredResourceFormat(), generateHeaders(), "Read " + resourceClass.getName() + "/" + id,
TIMEOUT_NORMAL); timeoutNormal);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -203,7 +208,7 @@ public class FHIRToolingClient {
result = client.issueGetResourceRequest( result = client.issueGetResourceRequest(
resourceAddress.resolveGetUriFromResourceClassAndIdAndVersion(resourceClass, id, version), resourceAddress.resolveGetUriFromResourceClassAndIdAndVersion(resourceClass, id, version),
getPreferredResourceFormat(), generateHeaders(), getPreferredResourceFormat(), generateHeaders(),
"VRead " + resourceClass.getName() + "/" + id + "/?_history/" + version, TIMEOUT_NORMAL); "VRead " + resourceClass.getName() + "/" + id + "/?_history/" + version, timeoutNormal);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -220,7 +225,7 @@ public class FHIRToolingClient {
result = client.issueGetResourceRequest( result = client.issueGetResourceRequest(
resourceAddress.resolveGetUriFromResourceClassAndCanonical(resourceClass, canonicalURL), resourceAddress.resolveGetUriFromResourceClassAndCanonical(resourceClass, canonicalURL),
getPreferredResourceFormat(), generateHeaders(), "Read " + resourceClass.getName() + "?url=" + canonicalURL, getPreferredResourceFormat(), generateHeaders(), "Read " + resourceClass.getName() + "?url=" + canonicalURL,
TIMEOUT_NORMAL); timeoutNormal);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -243,7 +248,7 @@ public class FHIRToolingClient {
resourceAddress.resolveGetUriFromResourceClassAndId(resource.getClass(), resource.getId()), resourceAddress.resolveGetUriFromResourceClassAndId(resource.getClass(), resource.getId()),
ByteUtils.resourceToByteArray(resource, false, isJson(getPreferredResourceFormat())), ByteUtils.resourceToByteArray(resource, false, isJson(getPreferredResourceFormat())),
getPreferredResourceFormat(), generateHeaders(), "Update " + resource.fhirType() + "/" + resource.getId(), getPreferredResourceFormat(), generateHeaders(), "Update " + resource.fhirType() + "/" + resource.getId(),
TIMEOUT_OPERATION); timeoutOperation);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -272,7 +277,7 @@ public class FHIRToolingClient {
result = client.issuePutRequest(resourceAddress.resolveGetUriFromResourceClassAndId(resourceClass, id), result = client.issuePutRequest(resourceAddress.resolveGetUriFromResourceClassAndId(resourceClass, id),
ByteUtils.resourceToByteArray(resource, false, isJson(getPreferredResourceFormat())), ByteUtils.resourceToByteArray(resource, false, isJson(getPreferredResourceFormat())),
getPreferredResourceFormat(), generateHeaders(), "Update " + resource.fhirType() + "/" + id, getPreferredResourceFormat(), generateHeaders(), "Update " + resource.fhirType() + "/" + id,
TIMEOUT_OPERATION); timeoutOperation);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -309,10 +314,10 @@ public class FHIRToolingClient {
if (complex) { if (complex) {
byte[] body = ByteUtils.resourceToByteArray(params, false, isJson(getPreferredResourceFormat())); byte[] body = ByteUtils.resourceToByteArray(params, false, isJson(getPreferredResourceFormat()));
result = client.issuePostRequest(url, body, getPreferredResourceFormat(), generateHeaders(), result = client.issuePostRequest(url, body, getPreferredResourceFormat(), generateHeaders(),
"POST " + resourceClass.getName() + "/$" + name, TIMEOUT_OPERATION_LONG); "POST " + resourceClass.getName() + "/$" + name, timeoutLong);
} else { } else {
result = client.issueGetResourceRequest(url, getPreferredResourceFormat(), generateHeaders(), result = client.issueGetResourceRequest(url, getPreferredResourceFormat(), generateHeaders(),
"GET " + resourceClass.getName() + "/$" + name, TIMEOUT_OPERATION_LONG); "GET " + resourceClass.getName() + "/$" + name, timeoutLong);
} }
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
@ -332,7 +337,7 @@ public class FHIRToolingClient {
try { try {
transactionResult = client.postBatchRequest(resourceAddress.getBaseServiceUri(), transactionResult = client.postBatchRequest(resourceAddress.getBaseServiceUri(),
ByteUtils.resourceToByteArray(batch, false, isJson(getPreferredResourceFormat())), ByteUtils.resourceToByteArray(batch, false, isJson(getPreferredResourceFormat())),
getPreferredResourceFormat(), "transaction", TIMEOUT_OPERATION + (TIMEOUT_ENTRY * batch.getEntry().size())); getPreferredResourceFormat(), "transaction", timeoutOperation + (timeoutEntry * batch.getEntry().size()));
} catch (Exception e) { } catch (Exception e) {
handleException("An error occurred trying to process this transaction request", e); handleException("An error occurred trying to process this transaction request", e);
} }
@ -346,7 +351,7 @@ public class FHIRToolingClient {
result = client.issuePostRequest(resourceAddress.resolveValidateUri(resourceClass, id), result = client.issuePostRequest(resourceAddress.resolveValidateUri(resourceClass, id),
ByteUtils.resourceToByteArray(resource, false, isJson(getPreferredResourceFormat())), ByteUtils.resourceToByteArray(resource, false, isJson(getPreferredResourceFormat())),
getPreferredResourceFormat(), generateHeaders(), getPreferredResourceFormat(), generateHeaders(),
"POST " + resourceClass.getName() + (id != null ? "/" + id : "") + "/$validate", TIMEOUT_OPERATION_LONG); "POST " + resourceClass.getName() + (id != null ? "/" + id : "") + "/$validate", timeoutLong);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -389,7 +394,7 @@ public class FHIRToolingClient {
public Bundle fetchFeed(String url) { public Bundle fetchFeed(String url) {
Bundle feed = null; Bundle feed = null;
try { try {
feed = client.issueGetFeedRequest(new URI(url), getPreferredResourceFormat()); feed = client.issueGetFeedRequest(new URI(url), getPreferredResourceFormat(), timeoutLong);
} catch (Exception e) { } catch (Exception e) {
handleException("An error has occurred while trying to retrieve history since last update", e); handleException("An error has occurred while trying to retrieve history since last update", e);
} }
@ -414,7 +419,7 @@ public class FHIRToolingClient {
org.hl7.fhir.r4.utils.client.network.ResourceRequest<Resource> result = null; org.hl7.fhir.r4.utils.client.network.ResourceRequest<Resource> result = null;
try { try {
result = client.issueGetResourceRequest(resourceAddress.resolveOperationUri(ValueSet.class, "expand", parameters), result = client.issueGetResourceRequest(resourceAddress.resolveOperationUri(ValueSet.class, "expand", parameters),
getPreferredResourceFormat(), generateHeaders(), "ValueSet/$expand?url=" + vsUrl, TIMEOUT_OPERATION_EXPAND); getPreferredResourceFormat(), generateHeaders(), "ValueSet/$expand?url=" + vsUrl, timeoutExpand);
} catch (IOException e) { } catch (IOException e) {
throw new FHIRException(e); throw new FHIRException(e);
} }
@ -432,7 +437,7 @@ public class FHIRToolingClient {
try { try {
result = client.issuePostRequest(resourceAddress.resolveOperationUri(ValueSet.class, "expand"), result = client.issuePostRequest(resourceAddress.resolveOperationUri(ValueSet.class, "expand"),
ByteUtils.resourceToByteArray(p, false, isJson(getPreferredResourceFormat())), getPreferredResourceFormat(), ByteUtils.resourceToByteArray(p, false, isJson(getPreferredResourceFormat())), getPreferredResourceFormat(),
generateHeaders(), "ValueSet/$expand?url=" + source.getUrl(), TIMEOUT_OPERATION_EXPAND); generateHeaders(), "ValueSet/$expand?url=" + source.getUrl(), timeoutExpand);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -447,7 +452,7 @@ public class FHIRToolingClient {
org.hl7.fhir.r4.utils.client.network.ResourceRequest<Resource> result = null; org.hl7.fhir.r4.utils.client.network.ResourceRequest<Resource> result = null;
try { try {
result = client.issueGetResourceRequest(resourceAddress.resolveOperationUri(CodeSystem.class, "lookup", params), result = client.issueGetResourceRequest(resourceAddress.resolveOperationUri(CodeSystem.class, "lookup", params),
getPreferredResourceFormat(), generateHeaders(), "CodeSystem/$lookup", TIMEOUT_NORMAL); getPreferredResourceFormat(), generateHeaders(), "CodeSystem/$lookup", timeoutNormal);
} catch (IOException e) { } catch (IOException e) {
throw new FHIRException(e); throw new FHIRException(e);
} }
@ -471,7 +476,7 @@ public class FHIRToolingClient {
result = client.issuePostRequest(resourceAddress.resolveOperationUri(ValueSet.class, "expand", params), result = client.issuePostRequest(resourceAddress.resolveOperationUri(ValueSet.class, "expand", params),
ByteUtils.resourceToByteArray(p, false, isJson(getPreferredResourceFormat())), getPreferredResourceFormat(), ByteUtils.resourceToByteArray(p, false, isJson(getPreferredResourceFormat())), getPreferredResourceFormat(),
generateHeaders(), source == null ? "ValueSet/$expand" : "ValueSet/$expand?url=" + source.getUrl(), generateHeaders(), source == null ? "ValueSet/$expand" : "ValueSet/$expand?url=" + source.getUrl(),
TIMEOUT_OPERATION_EXPAND); timeoutExpand);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -500,7 +505,7 @@ public class FHIRToolingClient {
result = client.issuePostRequest( result = client.issuePostRequest(
resourceAddress.resolveOperationUri(null, "closure", new HashMap<String, String>()), resourceAddress.resolveOperationUri(null, "closure", new HashMap<String, String>()),
ByteUtils.resourceToByteArray(params, false, isJson(getPreferredResourceFormat())), ByteUtils.resourceToByteArray(params, false, isJson(getPreferredResourceFormat())),
getPreferredResourceFormat(), generateHeaders(), "Closure?name=" + name, TIMEOUT_NORMAL); getPreferredResourceFormat(), generateHeaders(), "Closure?name=" + name, timeoutNormal);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -520,7 +525,7 @@ public class FHIRToolingClient {
result = client.issuePostRequest( result = client.issuePostRequest(
resourceAddress.resolveOperationUri(null, "closure", new HashMap<String, String>()), resourceAddress.resolveOperationUri(null, "closure", new HashMap<String, String>()),
ByteUtils.resourceToByteArray(params, false, isJson(getPreferredResourceFormat())), ByteUtils.resourceToByteArray(params, false, isJson(getPreferredResourceFormat())),
getPreferredResourceFormat(), generateHeaders(), "UpdateClosure?name=" + name, TIMEOUT_OPERATION); getPreferredResourceFormat(), generateHeaders(), "UpdateClosure?name=" + name, timeoutOperation);
if (result.isUnsuccessfulRequest()) { if (result.isUnsuccessfulRequest()) {
throw new EFhirClientException("Server returned error code " + result.getHttpStatus(), throw new EFhirClientException("Server returned error code " + result.getHttpStatus(),
(OperationOutcome) result.getPayload()); (OperationOutcome) result.getPayload());
@ -547,14 +552,6 @@ public class FHIRToolingClient {
this.password = password; this.password = password;
} }
public long getTimeout() {
return client.getTimeout();
}
public void setTimeout(long timeout) {
client.setTimeout(timeout);
}
public ToolingClientLogger getLogger() { public ToolingClientLogger getLogger() {
return client.getLogger(); return client.getLogger();
} }
@ -631,7 +628,7 @@ public class FHIRToolingClient {
org.hl7.fhir.r4.utils.client.network.ResourceRequest<Resource> result = null; org.hl7.fhir.r4.utils.client.network.ResourceRequest<Resource> result = null;
try { try {
result = client.issueGetResourceRequest(resourceAddress.resolveGetResource(resourceClass, id), result = client.issueGetResourceRequest(resourceAddress.resolveGetResource(resourceClass, id),
getPreferredResourceFormat(), generateHeaders(), resourceClass.getName()+"/"+id, TIMEOUT_NORMAL); getPreferredResourceFormat(), generateHeaders(), resourceClass.getName()+"/"+id, timeoutNormal);
} catch (IOException e) { } catch (IOException e) {
throw new FHIRException(e); throw new FHIRException(e);
} }
@ -641,4 +638,46 @@ public class FHIRToolingClient {
} }
return (T) result.getPayload(); return (T) result.getPayload();
} }
public long getTimeoutNormal() {
return timeoutNormal;
}
public void setTimeoutNormal(int timeoutNormal) {
this.timeoutNormal = timeoutNormal;
}
public long getTimeoutOperation() {
return timeoutOperation;
}
public void setTimeoutOperation(int timeoutOperation) {
this.timeoutOperation = timeoutOperation;
}
public long getTimeoutEntry() {
return timeoutEntry;
}
public void setTimeoutEntry(int timeoutEntry) {
this.timeoutEntry = timeoutEntry;
}
public long getTimeoutLong() {
return timeoutLong;
}
public void setTimeoutLong(int timeoutLong) {
this.timeoutLong = timeoutLong;
}
public long getTimeoutExpand() {
return timeoutExpand;
}
public void setTimeoutExpand(int timeoutExpand) {
this.timeoutExpand = timeoutExpand;
}
} }

View File

@ -16,13 +16,13 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
public class Client { public class Client {
public static final String DEFAULT_CHARSET = "UTF-8"; public static final String DEFAULT_CHARSET = "UTF-8";
private static final long DEFAULT_TIMEOUT = 5000;
private ToolingClientLogger logger; private ToolingClientLogger logger;
private FhirLoggingInterceptor fhirLoggingInterceptor; private FhirLoggingInterceptor fhirLoggingInterceptor;
private int retryCount; private int retryCount;
private long timeout = DEFAULT_TIMEOUT;
private String base; private String base;
public String getBase() { public String getBase() {
@ -51,14 +51,6 @@ public class Client {
this.retryCount = retryCount; this.retryCount = retryCount;
} }
public long getTimeout() {
return timeout;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
public <T extends Resource> ResourceRequest<T> issueOptionsRequest(URI optionsUri, String resourceFormat, public <T extends Resource> ResourceRequest<T> issueOptionsRequest(URI optionsUri, String resourceFormat,
String message, long timeout) throws IOException { String message, long timeout) throws IOException {
Request.Builder request = new Request.Builder().method("OPTIONS", null).url(optionsUri.toURL()); Request.Builder request = new Request.Builder().method("OPTIONS", null).url(optionsUri.toURL());
@ -107,20 +99,20 @@ public class Client {
return executeFhirRequest(request, resourceFormat, headers, message, retryCount, timeout); return executeFhirRequest(request, resourceFormat, headers, message, retryCount, timeout);
} }
public boolean issueDeleteRequest(URI resourceUri) throws IOException { public boolean issueDeleteRequest(URI resourceUri, int timeout) throws IOException {
Request.Builder request = new Request.Builder().url(resourceUri.toURL()).delete(); Request.Builder request = new Request.Builder().url(resourceUri.toURL()).delete();
return executeFhirRequest(request, null, new Headers.Builder().build(), null, retryCount, timeout) return executeFhirRequest(request, null, new Headers.Builder().build(), null, retryCount, timeout)
.isSuccessfulRequest(); .isSuccessfulRequest();
} }
public Bundle issueGetFeedRequest(URI resourceUri, String resourceFormat) throws IOException { public Bundle issueGetFeedRequest(URI resourceUri, String resourceFormat, int timeout) throws IOException {
Request.Builder request = new Request.Builder().url(resourceUri.toURL()); Request.Builder request = new Request.Builder().url(resourceUri.toURL());
return executeBundleRequest(request, resourceFormat, new Headers.Builder().build(), null, retryCount, timeout); return executeBundleRequest(request, resourceFormat, new Headers.Builder().build(), null, retryCount, timeout);
} }
public Bundle issuePostFeedRequest(URI resourceUri, Map<String, String> parameters, String resourceName, public Bundle issuePostFeedRequest(URI resourceUri, Map<String, String> parameters, String resourceName,
Resource resource, String resourceFormat) throws IOException { Resource resource, String resourceFormat, int timeout) throws IOException {
String boundary = "----WebKitFormBoundarykbMUo6H8QaUnYtRy"; String boundary = "----WebKitFormBoundarykbMUo6H8QaUnYtRy";
byte[] payload = ByteUtils.encodeFormSubmission(parameters, resourceName, resource, boundary); byte[] payload = ByteUtils.encodeFormSubmission(parameters, resourceName, resource, boundary);
RequestBody body = RequestBody.create(MediaType.parse(resourceFormat + ";charset=" + DEFAULT_CHARSET), payload); RequestBody body = RequestBody.create(MediaType.parse(resourceFormat + ";charset=" + DEFAULT_CHARSET), payload);