Skip to content

Commit

Permalink
Aphl 969 refactor endpoint (#463)
Browse files Browse the repository at this point in the history
* Refactor terminologyEndpoint param handling

-Removed unneeded EndpointCredentials class, now using Extensions under Endpoint class

* Refactor - throw specific errors for missing credentials and cast terminologyEndpoint

* Add tests to validate credential handling
  • Loading branch information
Chris0296 committed May 24, 2024
1 parent e7e2d84 commit 59aecb6
Show file tree
Hide file tree
Showing 9 changed files with 219 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,8 @@ private Constants() {}
public static final String VSM_WORKFLOW_CODES_CODE_SYSTEM_URL =
"http:https://aphl.org/fhir/vsm/CodeSystem/vsm-workflow-codes";
public static final String VSM_VALUE_SET_TAG_VSM_AUTHORED_CODE = "vsm-authored";

public static final String VSAC_USERNAME = "vsacUsername";

public static final String APIKEY = "apiKey";
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public IBaseResource visit(LibraryAdapter library, Repository repository, IBaseP
&& !endpointUri.get().isEmpty())
|| endpoint.isPresent()) {
throw new NotImplementedOperationException(
"This repository is not implementing custom Content and Terminology endpoints at this time");
"This repository is not implementing custom Content and endpoints at this time");
}
if (packageOnly.isPresent()) {
throw new NotImplementedOperationException("This repository is not implementing packageOnly at this time");
Expand Down Expand Up @@ -134,7 +134,7 @@ protected void handleValueSetReferenceExtensions(
(org.hl7.fhir.dstu3.model.MetadataResource) resource,
((org.hl7.fhir.dstu3.model.Bundle) packagedBundle).getEntry(),
repository,
terminologyEndpoint);
terminologyEndpoint.map(te -> (org.hl7.fhir.dstu3.model.Endpoint) te));
break;
case R4:
org.opencds.cqf.fhir.utility.visitor.r4.KnowledgeArtifactPackageVisitor packageVisitorR4 =
Expand All @@ -143,7 +143,7 @@ protected void handleValueSetReferenceExtensions(
(org.hl7.fhir.r4.model.MetadataResource) resource,
((org.hl7.fhir.r4.model.Bundle) packagedBundle).getEntry(),
repository,
terminologyEndpoint);
terminologyEndpoint.map(te -> (org.hl7.fhir.r4.model.Endpoint) te));
break;
case R5:
org.opencds.cqf.fhir.utility.visitor.r5.KnowledgeArtifactPackageVisitor packageVisitorR5 =
Expand All @@ -152,7 +152,7 @@ protected void handleValueSetReferenceExtensions(
(org.hl7.fhir.r5.model.MetadataResource) resource,
((org.hl7.fhir.r5.model.Bundle) packagedBundle).getEntry(),
repository,
terminologyEndpoint);
terminologyEndpoint.map(te -> (org.hl7.fhir.r5.model.Endpoint) te));
break;
default:
throw new IllegalArgumentException(String.format(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.hl7.fhir.dstu3.model.RelatedArtifact;
import org.hl7.fhir.dstu3.model.Resource;
import org.hl7.fhir.dstu3.model.ResourceType;
import org.hl7.fhir.dstu3.model.StringType;
import org.hl7.fhir.dstu3.model.StructureDefinition;
import org.hl7.fhir.dstu3.model.UsageContext;
import org.hl7.fhir.dstu3.model.ValueSet;
Expand Down Expand Up @@ -214,7 +213,7 @@ public void handleValueSetReferenceExtensions(
MetadataResource manifest,
List<BundleEntryComponent> bundleEntries,
Repository repository,
Optional<IBaseResource> terminologyEndpoint)
Optional<Endpoint> terminologyEndpoint)
throws UnprocessableEntityException, IllegalArgumentException {
KnowledgeArtifactAdapter adapter = AdapterFactory.forFhirVersion(manifest.getStructureFhirVersionEnum())
.createKnowledgeArtifactAdapter(manifest);
Expand Down Expand Up @@ -281,7 +280,7 @@ public void handleValueSetReferenceExtensions(
}

protected void expandValueSet(
ValueSet valueSet, Parameters expansionParameters, Optional<IBaseResource> terminologyEndpoint) {
ValueSet valueSet, Parameters expansionParameters, Optional<Endpoint> terminologyEndpoint) {
// Gather the Terminology Service from the valueSet's authoritativeSourceUrl.
Extension authoritativeSource = valueSet.getExtensionByUrl(Constants.AUTHORITATIVE_SOURCE_URL);
String authoritativeSourceUrl = authoritativeSource != null && authoritativeSource.hasValue()
Expand Down Expand Up @@ -314,29 +313,27 @@ protected void expandValueSet(
}
valueSet.setExpansion(expansion);
} else {
Optional<StringType> username = Optional.empty();
Optional<StringType> apiKey = Optional.empty();
String username;
String apiKey;
if (terminologyEndpoint.isPresent()) {
Endpoint endPnt = (Endpoint) terminologyEndpoint.get();
username = endPnt.getHeader().stream()
.filter(h -> h.getId().equals("username"))
.findFirst();
apiKey = endPnt.getHeader().stream()
.filter(h -> h.getId().equals("apiKey"))
.findFirst();
}

if (!username.isPresent() || !apiKey.isPresent()) {
username = terminologyEndpoint.get().getExtensionsByUrl(Constants.VSAC_USERNAME).stream()
.findFirst()
.map(ext -> ext.getValue().toString())
.orElseThrow(() -> new UnprocessableEntityException(
"Cannot expand ValueSet without VSAC Username: " + valueSet.getId()));
apiKey = terminologyEndpoint.get().getExtensionsByUrl(Constants.APIKEY).stream()
.findFirst()
.map(ext -> ext.getValue().toString())
.orElseThrow(() -> new UnprocessableEntityException(
"Cannot expand ValueSet without VSAC API Key: " + valueSet.getId()));
} else {
throw new UnprocessableEntityException(
"Cannot expand ValueSet without credentials: " + valueSet.getId());
}

try {
expandedValueSet = terminologyServerClient.expand(
valueSet,
authoritativeSourceUrl,
expansionParameters,
username.get().getValue(),
apiKey.get().getValue());
valueSet, authoritativeSourceUrl, expansionParameters, username, apiKey);
valueSet.setExpansion(expandedValueSet.getExpansion());
} catch (Exception ex) {
System.out.println("Terminology Server expansion failed: {"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.hl7.fhir.r4.model.Bundle.BundleType;
import org.hl7.fhir.r4.model.CodeableConcept;
import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.Endpoint;
import org.hl7.fhir.r4.model.Extension;
import org.hl7.fhir.r4.model.Library;
import org.hl7.fhir.r4.model.MetadataResource;
Expand All @@ -25,14 +26,12 @@
import org.hl7.fhir.r4.model.RelatedArtifact;
import org.hl7.fhir.r4.model.Resource;
import org.hl7.fhir.r4.model.ResourceType;
import org.hl7.fhir.r4.model.StringType;
import org.hl7.fhir.r4.model.StructureDefinition;
import org.hl7.fhir.r4.model.UsageContext;
import org.hl7.fhir.r4.model.ValueSet;
import org.opencds.cqf.fhir.api.Repository;
import org.opencds.cqf.fhir.utility.Canonicals;
import org.opencds.cqf.fhir.utility.Constants;
import org.opencds.cqf.fhir.utility.EndpointCredentials;
import org.opencds.cqf.fhir.utility.adapter.AdapterFactory;
import org.opencds.cqf.fhir.utility.adapter.KnowledgeArtifactAdapter;
import org.opencds.cqf.fhir.utility.client.TerminologyServerClient;
Expand Down Expand Up @@ -226,7 +225,7 @@ public void handleValueSetReferenceExtensions(
MetadataResource manifest,
List<BundleEntryComponent> bundleEntries,
Repository repository,
Optional<IBaseResource> terminologyEndpoint)
Optional<Endpoint> terminologyEndpoint)
throws UnprocessableEntityException, IllegalArgumentException {
KnowledgeArtifactAdapter adapter = AdapterFactory.forFhirVersion(manifest.getStructureFhirVersionEnum())
.createKnowledgeArtifactAdapter(manifest);
Expand Down Expand Up @@ -293,7 +292,7 @@ public void handleValueSetReferenceExtensions(
}

protected void expandValueSet(
ValueSet valueSet, Parameters expansionParameters, Optional<IBaseResource> terminologyEndpoint) {
ValueSet valueSet, Parameters expansionParameters, Optional<Endpoint> terminologyEndpoint) {
// Gather the Terminology Service from the valueSet's authoritativeSourceUrl.
Extension authoritativeSource = valueSet.getExtensionByUrl(Constants.AUTHORITATIVE_SOURCE_URL);
String authoritativeSourceUrl = authoritativeSource != null && authoritativeSource.hasValue()
Expand Down Expand Up @@ -326,25 +325,27 @@ protected void expandValueSet(
}
valueSet.setExpansion(expansion);
} else {
Optional<StringType> username = Optional.empty();
Optional<StringType> apiKey = Optional.empty();
String username;
String apiKey;
if (terminologyEndpoint.isPresent()) {
EndpointCredentials endPnt = (EndpointCredentials) terminologyEndpoint.get();
username = Optional.of(endPnt.getVsacUsername());
apiKey = Optional.of(endPnt.getApiKey());
}

if (!username.isPresent() || !apiKey.isPresent()) {
username = terminologyEndpoint.get().getExtensionsByUrl(Constants.VSAC_USERNAME).stream()
.findFirst()
.map(ext -> ext.getValue().toString())
.orElseThrow(() -> new UnprocessableEntityException(
"Cannot expand ValueSet without VSAC Username: " + valueSet.getId()));
apiKey = terminologyEndpoint.get().getExtensionsByUrl(Constants.APIKEY).stream()
.findFirst()
.map(ext -> ext.getValue().toString())
.orElseThrow(() -> new UnprocessableEntityException(
"Cannot expand ValueSet without VSAC API Key: " + valueSet.getId()));
} else {
throw new UnprocessableEntityException(
"Cannot expand ValueSet without credentials: " + valueSet.getId());
}

try {
expandedValueSet = terminologyServerClient.expand(
valueSet,
authoritativeSourceUrl,
expansionParameters,
username.get().getValue(),
apiKey.get().getValue());
valueSet, authoritativeSourceUrl, expansionParameters, username, apiKey);
valueSet.setExpansion(expandedValueSet.getExpansion());
} catch (Exception ex) {
System.out.println("Terminology Server expansion failed: {"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import org.hl7.fhir.r5.model.RelatedArtifact;
import org.hl7.fhir.r5.model.Resource;
import org.hl7.fhir.r5.model.ResourceType;
import org.hl7.fhir.r5.model.StringType;
import org.hl7.fhir.r5.model.StructureDefinition;
import org.hl7.fhir.r5.model.UsageContext;
import org.hl7.fhir.r5.model.ValueSet;
Expand Down Expand Up @@ -222,7 +221,7 @@ public void handleValueSetReferenceExtensions(
MetadataResource manifest,
List<Bundle.BundleEntryComponent> bundleEntries,
Repository repository,
Optional<IBaseResource> terminologyEndpoint)
Optional<Endpoint> terminologyEndpoint)
throws UnprocessableEntityException, IllegalArgumentException {
KnowledgeArtifactAdapter adapter = AdapterFactory.forFhirVersion(manifest.getStructureFhirVersionEnum())
.createKnowledgeArtifactAdapter(manifest);
Expand Down Expand Up @@ -289,7 +288,7 @@ public void handleValueSetReferenceExtensions(
}

protected void expandValueSet(
ValueSet valueSet, Parameters expansionParameters, Optional<IBaseResource> terminologyEndpoint) {
ValueSet valueSet, Parameters expansionParameters, Optional<Endpoint> terminologyEndpoint) {
// Gather the Terminology Service from the valueSet's authoritativeSourceUrl.
Extension authoritativeSource = valueSet.getExtensionByUrl(Constants.AUTHORITATIVE_SOURCE_URL);
String authoritativeSourceUrl = authoritativeSource != null && authoritativeSource.hasValue()
Expand Down Expand Up @@ -322,29 +321,27 @@ protected void expandValueSet(
}
valueSet.setExpansion(expansion);
} else {
Optional<StringType> username = Optional.empty();
Optional<StringType> apiKey = Optional.empty();
String username;
String apiKey;
if (terminologyEndpoint.isPresent()) {
Endpoint endPnt = (Endpoint) terminologyEndpoint.get();
username = endPnt.getHeader().stream()
.filter(h -> h.getId().equals("username"))
.findFirst();
apiKey = endPnt.getHeader().stream()
.filter(h -> h.getId().equals("apiKey"))
.findFirst();
}

if (!username.isPresent() || !apiKey.isPresent()) {
username = terminologyEndpoint.get().getExtensionsByUrl(Constants.VSAC_USERNAME).stream()
.findFirst()
.map(ext -> ext.getValue().toString())
.orElseThrow(() -> new UnprocessableEntityException(
"Cannot expand ValueSet without VSAC Username: " + valueSet.getId()));
apiKey = terminologyEndpoint.get().getExtensionsByUrl(Constants.APIKEY).stream()
.findFirst()
.map(ext -> ext.getValue().toString())
.orElseThrow(() -> new UnprocessableEntityException(
"Cannot expand ValueSet without VSAC API Key: " + valueSet.getId()));
} else {
throw new UnprocessableEntityException(
"Cannot expand ValueSet without credentials: " + valueSet.getId());
}

try {
expandedValueSet = terminologyServerClient.expand(
valueSet,
authoritativeSourceUrl,
expansionParameters,
username.get().getValue(),
apiKey.get().getValue());
valueSet, authoritativeSourceUrl, expansionParameters, username, apiKey);
valueSet.setExpansion(expandedValueSet.getExpansion());
} catch (Exception ex) {
System.out.println("Terminology Server expansion failed: {"
Expand Down
Loading

0 comments on commit 59aecb6

Please sign in to comment.