Added and enhanced tests plus fixes arising from tests.
This commit is contained in:
parent
f9f8bf6515
commit
4216cee8c6
|
@ -183,24 +183,6 @@ public interface IValidationSupport {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates that the given code exists and if possible returns a display
|
|
||||||
* name. This method is called to check codes which are found in "example"
|
|
||||||
* binding fields (e.g. <code>Observation.code</code> in the default profile.
|
|
||||||
*
|
|
||||||
* @param theValidationSupportContext The validation support module will be passed in to this method. This is convenient in cases where the operation needs to make calls to
|
|
||||||
* other method in the support chain, so that they can be passed through the entire chain. Implementations of this interface may always safely ignore this parameter.
|
|
||||||
* @param theOptions Provides options controlling the validation
|
|
||||||
* @param theCodeSystem The code system, e.g. "<code>http://loinc.org</code>"
|
|
||||||
* @param theCode The code, e.g. "<code>1234-5</code>"
|
|
||||||
* @param theDisplay The display name, if it should also be validated
|
|
||||||
* @param theSystemVersion The code system version.
|
|
||||||
* @return Returns a validation result object
|
|
||||||
*/
|
|
||||||
default CodeValidationResult validateCode(ValidationSupportContext theValidationSupportContext, ConceptValidationOptions theOptions, String theCodeSystem, String theCode, String theDisplay, String theValueSetUrl, String theSystemVersion) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates that the given code exists and if possible returns a display
|
* Validates that the given code exists and if possible returns a display
|
||||||
* name. This method is called to check codes which are found in "example"
|
* name. This method is called to check codes which are found in "example"
|
||||||
|
|
|
@ -145,7 +145,7 @@ ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotCreateDuplicateCodeSystemUrlAndVe
|
||||||
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotCreateDuplicateConceptMapUrl=Can not create multiple ConceptMap resources with ConceptMap.url "{0}", already have one with resource ID: {1}
|
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotCreateDuplicateConceptMapUrl=Can not create multiple ConceptMap resources with ConceptMap.url "{0}", already have one with resource ID: {1}
|
||||||
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotCreateDuplicateValueSetUrl=Can not create multiple ValueSet resources with ValueSet.url "{0}", already have one with resource ID: {1}
|
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotCreateDuplicateValueSetUrl=Can not create multiple ValueSet resources with ValueSet.url "{0}", already have one with resource ID: {1}
|
||||||
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.expansionTooLarge=Expansion of ValueSet produced too many codes (maximum {0}) - Operation aborted!
|
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.expansionTooLarge=Expansion of ValueSet produced too many codes (maximum {0}) - Operation aborted!
|
||||||
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotCreateDuplicateValueSetUrlAndVersion=Can not create multiple CodeSystem resources with CodeSystem.url "{0}" and CodeSystem.version "{1}", already have one with resource ID: {2}
|
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotCreateDuplicateValueSetUrlAndVersion=Can not create multiple ValueSet resources with ValueSet.url "{0}" and ValueSet.version "{1}", already have one with resource ID: {2}
|
||||||
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotUpdateUrlOrVersionForValueSetResource=Cannot update URL or version for ValueSet resource. Existing ValueSet resource with resource ID {0} found with ValueSet.url "{1}" and ValueSet.version "{2}"
|
ca.uhn.fhir.jpa.term.BaseTermReadSvcImpl.cannotUpdateUrlOrVersionForValueSetResource=Cannot update URL or version for ValueSet resource. Existing ValueSet resource with resource ID {0} found with ValueSet.url "{1}" and ValueSet.version "{2}"
|
||||||
|
|
||||||
ca.uhn.fhir.jpa.patch.JsonPatchUtils.failedToApplyPatch=Failed to apply JSON patch to {0}: {1}
|
ca.uhn.fhir.jpa.patch.JsonPatchUtils.failedToApplyPatch=Failed to apply JSON patch to {0}: {1}
|
||||||
|
|
|
@ -61,7 +61,12 @@ public class BaseJpaResourceProviderCodeSystemDstu3 extends JpaResourceProviderD
|
||||||
startRequest(theServletRequest);
|
startRequest(theServletRequest);
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
IValidationSupport.LookupCodeResult result = dao.lookupCode(theCode, theSystem, theCoding, theVersion, theRequestDetails);
|
IValidationSupport.LookupCodeResult result;
|
||||||
|
if (theVersion != null) {
|
||||||
|
result = dao.lookupCode(theCode, theSystem, theCoding, theVersion, theRequestDetails);
|
||||||
|
} else {
|
||||||
|
result = dao.lookupCode(theCode, theSystem, theCoding, theRequestDetails);
|
||||||
|
}
|
||||||
result.throwNotFoundIfAppropriate();
|
result.throwNotFoundIfAppropriate();
|
||||||
return (Parameters) result.toParameters(theRequestDetails.getFhirContext(), theProperties);
|
return (Parameters) result.toParameters(theRequestDetails.getFhirContext(), theProperties);
|
||||||
} catch (FHIRException e) {
|
} catch (FHIRException e) {
|
||||||
|
@ -92,7 +97,12 @@ public class BaseJpaResourceProviderCodeSystemDstu3 extends JpaResourceProviderD
|
||||||
startRequest(theServletRequest);
|
startRequest(theServletRequest);
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
IFhirResourceDaoCodeSystem.SubsumesResult result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theVersion, theRequestDetails);
|
IFhirResourceDaoCodeSystem.SubsumesResult result;
|
||||||
|
if (theVersion != null || (theCodingA != null && theCodingA.hasVersion()) || (theCodingB != null &&theCodingB.hasVersion())) {
|
||||||
|
result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theVersion, theRequestDetails);
|
||||||
|
} else {
|
||||||
|
result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theRequestDetails);
|
||||||
|
}
|
||||||
return (Parameters) result.toParameters(theRequestDetails.getFhirContext());
|
return (Parameters) result.toParameters(theRequestDetails.getFhirContext());
|
||||||
} finally {
|
} finally {
|
||||||
endRequest(theServletRequest);
|
endRequest(theServletRequest);
|
||||||
|
|
|
@ -46,7 +46,7 @@ public class BaseJpaResourceProviderValueSetDstu3 extends JpaResourceProviderDst
|
||||||
// Note: url is correct and identifier is not, but identifier was only added as
|
// Note: url is correct and identifier is not, but identifier was only added as
|
||||||
// of 3.1.0 so we'll leave url for now. See: https://groups.google.com/d/msgid/hapi-fhir/CAN2Cfy8kW%2BAOkgC6VjPsU3gRCpExCNZBmJdi-k5R_TWeyWH4tA%40mail.gmail.com?utm_medium=email&utm_source=footer
|
// of 3.1.0 so we'll leave url for now. See: https://groups.google.com/d/msgid/hapi-fhir/CAN2Cfy8kW%2BAOkgC6VjPsU3gRCpExCNZBmJdi-k5R_TWeyWH4tA%40mail.gmail.com?utm_medium=email&utm_source=footer
|
||||||
@OperationParam(name = "url", min = 0, max = 1) UriType theUrl,
|
@OperationParam(name = "url", min = 0, max = 1) UriType theUrl,
|
||||||
@OperationParam(name = "valueSetVersion", min = 0, max = 1) org.hl7.fhir.r4.model.StringType theValueSetVersion,
|
@OperationParam(name = "valueSetVersion", min = 0, max = 1) StringType theValueSetVersion,
|
||||||
@OperationParam(name = "identifier", min = 0, max = 1) UriType theIdentifier,
|
@OperationParam(name = "identifier", min = 0, max = 1) UriType theIdentifier,
|
||||||
@OperationParam(name = "filter", min = 0, max = 1) StringType theFilter,
|
@OperationParam(name = "filter", min = 0, max = 1) StringType theFilter,
|
||||||
@OperationParam(name = "offset", min = 0, max = 1) IntegerType theOffset,
|
@OperationParam(name = "offset", min = 0, max = 1) IntegerType theOffset,
|
||||||
|
|
|
@ -63,7 +63,12 @@ public class BaseJpaResourceProviderCodeSystemR4 extends JpaResourceProviderR4<C
|
||||||
startRequest(theServletRequest);
|
startRequest(theServletRequest);
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
IValidationSupport.LookupCodeResult result = dao.lookupCode(theCode, theSystem, theCoding, theVersion, theRequestDetails);
|
IValidationSupport.LookupCodeResult result;
|
||||||
|
if (theVersion != null) {
|
||||||
|
result = dao.lookupCode(theCode, theSystem, theCoding, theVersion, theRequestDetails);
|
||||||
|
} else {
|
||||||
|
result = dao.lookupCode(theCode, theSystem, theCoding, theRequestDetails);
|
||||||
|
}
|
||||||
result.throwNotFoundIfAppropriate();
|
result.throwNotFoundIfAppropriate();
|
||||||
return (Parameters) result.toParameters(theRequestDetails.getFhirContext(), theProperties);
|
return (Parameters) result.toParameters(theRequestDetails.getFhirContext(), theProperties);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -92,7 +97,12 @@ public class BaseJpaResourceProviderCodeSystemR4 extends JpaResourceProviderR4<C
|
||||||
startRequest(theServletRequest);
|
startRequest(theServletRequest);
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
IFhirResourceDaoCodeSystem.SubsumesResult result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theVersion, theRequestDetails);
|
IFhirResourceDaoCodeSystem.SubsumesResult result;
|
||||||
|
if (theVersion != null || (theCodingA != null && theCodingA.hasVersion()) || (theCodingB != null &&theCodingB.hasVersion())) {
|
||||||
|
result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theVersion, theRequestDetails);
|
||||||
|
} else {
|
||||||
|
result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theRequestDetails);
|
||||||
|
}
|
||||||
return (Parameters) result.toParameters(theRequestDetails.getFhirContext());
|
return (Parameters) result.toParameters(theRequestDetails.getFhirContext());
|
||||||
} finally {
|
} finally {
|
||||||
endRequest(theServletRequest);
|
endRequest(theServletRequest);
|
||||||
|
|
|
@ -63,7 +63,12 @@ public class BaseJpaResourceProviderCodeSystemR5 extends JpaResourceProviderR5<C
|
||||||
startRequest(theServletRequest);
|
startRequest(theServletRequest);
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
IValidationSupport.LookupCodeResult result = dao.lookupCode(theCode, theSystem, theCoding, theVersion, theRequestDetails);
|
IValidationSupport.LookupCodeResult result;
|
||||||
|
if (theVersion != null) {
|
||||||
|
result = dao.lookupCode(theCode, theSystem, theCoding, theVersion, theRequestDetails);
|
||||||
|
} else {
|
||||||
|
result = dao.lookupCode(theCode, theSystem, theCoding, theRequestDetails);
|
||||||
|
}
|
||||||
result.throwNotFoundIfAppropriate();
|
result.throwNotFoundIfAppropriate();
|
||||||
return (Parameters) result.toParameters(theRequestDetails.getFhirContext(), theProperties);
|
return (Parameters) result.toParameters(theRequestDetails.getFhirContext(), theProperties);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -92,7 +97,12 @@ public class BaseJpaResourceProviderCodeSystemR5 extends JpaResourceProviderR5<C
|
||||||
startRequest(theServletRequest);
|
startRequest(theServletRequest);
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
IFhirResourceDaoCodeSystem.SubsumesResult result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theVersion, theRequestDetails);
|
IFhirResourceDaoCodeSystem.SubsumesResult result;
|
||||||
|
if (theVersion != null || (theCodingA != null && theCodingA.hasVersion()) || (theCodingB != null &&theCodingB.hasVersion())) {
|
||||||
|
result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theVersion, theRequestDetails);
|
||||||
|
} else {
|
||||||
|
result = dao.subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, theRequestDetails);
|
||||||
|
}
|
||||||
return (Parameters) result.toParameters(theRequestDetails.getFhirContext());
|
return (Parameters) result.toParameters(theRequestDetails.getFhirContext());
|
||||||
} finally {
|
} finally {
|
||||||
endRequest(theServletRequest);
|
endRequest(theServletRequest);
|
||||||
|
|
|
@ -250,7 +250,11 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc {
|
||||||
String code = theConcept.getCode();
|
String code = theConcept.getCode();
|
||||||
String display = theConcept.getDisplay();
|
String display = theConcept.getDisplay();
|
||||||
Collection<TermConceptDesignation> designations = theConcept.getDesignations();
|
Collection<TermConceptDesignation> designations = theConcept.getDesignations();
|
||||||
|
if (StringUtils.isNotEmpty(codeSystemVersion)) {
|
||||||
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, designations, theAdd, theCodeCounter, codeSystem, codeSystemVersion, code, display);
|
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, designations, theAdd, theCodeCounter, codeSystem, codeSystemVersion, code, display);
|
||||||
|
} else {
|
||||||
|
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, designations, theAdd, theCodeCounter, codeSystem, code, display);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addCodeIfNotAlreadyAdded(IValueSetConceptAccumulator theValueSetCodeAccumulator, Set<String> theAddedCodes, Collection<TermConceptDesignation> theDesignations, boolean theAdd, AtomicInteger theCodeCounter, String theCodeSystem, String theCodeSystemVersion, String theCode, String theDisplay) {
|
private void addCodeIfNotAlreadyAdded(IValueSetConceptAccumulator theValueSetCodeAccumulator, Set<String> theAddedCodes, Collection<TermConceptDesignation> theDesignations, boolean theAdd, AtomicInteger theCodeCounter, String theCodeSystem, String theCodeSystemVersion, String theCode, String theDisplay) {
|
||||||
|
@ -771,7 +775,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc {
|
||||||
// This will happen if we're expanding against a built-in (part of FHIR) ValueSet that
|
// This will happen if we're expanding against a built-in (part of FHIR) ValueSet that
|
||||||
// isn't actually in the database anywhere
|
// isn't actually in the database anywhere
|
||||||
Collection<TermConceptDesignation> emptyCollection = Collections.emptyList();
|
Collection<TermConceptDesignation> emptyCollection = Collections.emptyList();
|
||||||
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, emptyCollection, theAdd, theCodeCounter, nextConcept.getSystem(), nextConcept.getCode(), nextConcept.getDisplay());
|
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, emptyCollection, theAdd, theCodeCounter, nextConcept.getSystem(), nextConcept.getSystemVersion(), nextConcept.getCode(), nextConcept.getDisplay());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isNoneBlank(nextConcept.getSystem(), nextConcept.getCode()) && !theAdd && theAddedCodes.remove(nextConcept.getSystem() + "|" + nextConcept.getCode())) {
|
if (isNoneBlank(nextConcept.getSystem(), nextConcept.getCode()) && !theAdd && theAddedCodes.remove(nextConcept.getSystem() + "|" + nextConcept.getCode())) {
|
||||||
|
@ -1251,7 +1255,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc {
|
||||||
|
|
||||||
if (theInclude.getConcept().isEmpty()) {
|
if (theInclude.getConcept().isEmpty()) {
|
||||||
for (TermConcept next : theVersion.getConcepts()) {
|
for (TermConcept next : theVersion.getConcepts()) {
|
||||||
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, null, theAdd, theCodeCounter, theSystem, next.getCode(), next.getDisplay());
|
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, null, theAdd, theCodeCounter, theSystem, theVersion.getCodeSystemVersionId(), next.getCode(), next.getDisplay());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1259,7 +1263,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc {
|
||||||
if (!theSystem.equals(theInclude.getSystem()) && isNotBlank(theSystem)) {
|
if (!theSystem.equals(theInclude.getSystem()) && isNotBlank(theSystem)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, null, theAdd, theCodeCounter, theSystem, next.getCode(), next.getDisplay());
|
addCodeIfNotAlreadyAdded(theValueSetCodeAccumulator, theAddedCodes, null, theAdd, theCodeCounter, theSystem, theVersion.getCodeSystemVersionId(), next.getCode(), next.getDisplay());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1862,6 +1866,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional
|
||||||
public IFhirResourceDaoCodeSystem.SubsumesResult subsumes(IPrimitiveType<String> theCodeA, IPrimitiveType<String> theCodeB,
|
public IFhirResourceDaoCodeSystem.SubsumesResult subsumes(IPrimitiveType<String> theCodeA, IPrimitiveType<String> theCodeB,
|
||||||
IPrimitiveType<String> theSystem, IBaseCoding theCodingA, IBaseCoding theCodingB) {
|
IPrimitiveType<String> theSystem, IBaseCoding theCodingA, IBaseCoding theCodingB) {
|
||||||
return subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, null, null, null);
|
return subsumes(theCodeA, theCodeB, theSystem, theCodingA, theCodingB, null, null, null);
|
||||||
|
@ -2463,21 +2468,6 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc {
|
||||||
return new VersionIndependentConcept(system, code, null, systemVersion);
|
return new VersionIndependentConcept(system, code, null, systemVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* private static class VersionIndependentConceptWithSystemVersion extends VersionIndependentConcept {
|
|
||||||
|
|
||||||
String myCodeSystemVersion;
|
|
||||||
|
|
||||||
public VersionIndependentConceptWithSystemVersion(String theSystem, String theCode, String theSystemVersion) {
|
|
||||||
super(theSystem, theCode);
|
|
||||||
myCodeSystemVersion = theSystemVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCodeSystemVersion() {
|
|
||||||
return myCodeSystemVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* This method is present only for unit tests, do not call from client code
|
* This method is present only for unit tests, do not call from client code
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package ca.uhn.fhir.jpa.dao.dstu2;
|
package ca.uhn.fhir.jpa.dao.dstu2;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.support.IValidationSupport;
|
import ca.uhn.fhir.context.support.IValidationSupport;
|
||||||
|
import ca.uhn.fhir.jpa.api.dao.IFhirResourceDaoCodeSystem;
|
||||||
|
import ca.uhn.fhir.jpa.dao.FhirResourceDaoValueSetDstu2;
|
||||||
import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt;
|
import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt;
|
||||||
import ca.uhn.fhir.model.dstu2.composite.CodingDt;
|
import ca.uhn.fhir.model.dstu2.composite.CodingDt;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.ValueSet;
|
import ca.uhn.fhir.model.dstu2.resource.ValueSet;
|
||||||
|
@ -8,6 +10,7 @@ import ca.uhn.fhir.model.primitive.CodeDt;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.model.primitive.StringDt;
|
import ca.uhn.fhir.model.primitive.StringDt;
|
||||||
import ca.uhn.fhir.model.primitive.UriDt;
|
import ca.uhn.fhir.model.primitive.UriDt;
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
@ -22,6 +25,8 @@ import static org.hamcrest.Matchers.stringContainsInOrder;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
|
||||||
public class FhirResourceDaoValueSetDstu2Test extends BaseJpaDstu2Test {
|
public class FhirResourceDaoValueSetDstu2Test extends BaseJpaDstu2Test {
|
||||||
|
|
||||||
|
@ -228,5 +233,26 @@ public class FhirResourceDaoValueSetDstu2Test extends BaseJpaDstu2Test {
|
||||||
assertThat(resp, not(containsString("<code value=\"8450-9\"/>")));
|
assertThat(resp, not(containsString("<code value=\"8450-9\"/>")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void unsupportedMethodsThrowException() {
|
||||||
|
IFhirResourceDaoCodeSystem<ValueSet, CodingDt, CodeableConceptDt> testFhirResourceDaoValueSet = new FhirResourceDaoValueSetDstu2();
|
||||||
|
// Multi-version lookupCode method
|
||||||
|
try {
|
||||||
|
testFhirResourceDaoValueSet.lookupCode(null, null, null, null, null);
|
||||||
|
fail();
|
||||||
|
} catch (UnsupportedOperationException theE) {
|
||||||
|
// Success
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multi-version subsumes method
|
||||||
|
try {
|
||||||
|
testFhirResourceDaoValueSet.subsumes(null, null, null, null, null, null, null);
|
||||||
|
fail();
|
||||||
|
} catch (UnsupportedOperationException theE) {
|
||||||
|
// Success
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome;
|
||||||
import ca.uhn.fhir.jpa.dao.data.ITermValueSetConceptDao;
|
import ca.uhn.fhir.jpa.dao.data.ITermValueSetConceptDao;
|
||||||
import ca.uhn.fhir.jpa.entity.TermValueSet;
|
import ca.uhn.fhir.jpa.entity.TermValueSet;
|
||||||
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||||
import org.hl7.fhir.r4.model.CodeSystem;
|
import org.hl7.fhir.r4.model.CodeSystem;
|
||||||
import org.hl7.fhir.r4.model.ValueSet;
|
import org.hl7.fhir.r4.model.ValueSet;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
@ -218,5 +219,28 @@ public class FhirResourceDaoR4ValueSetMultiVersionTest extends BaseJpaR4Test {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExpandWithNoResultsInLocalValueSet() {
|
||||||
|
Set<String> valueSetConcepts = new HashSet<>();
|
||||||
|
valueSetConcepts.add("hello");
|
||||||
|
valueSetConcepts.add("goodbye");
|
||||||
|
|
||||||
|
createLocalCsAndVs("1", valueSetConcepts);
|
||||||
|
|
||||||
|
ValueSet vs = new ValueSet();
|
||||||
|
ValueSet.ConceptSetComponent include = vs.getCompose().addInclude();
|
||||||
|
include.setSystem(URL_MY_CODE_SYSTEM + "AA");
|
||||||
|
include.setVersion("1");
|
||||||
|
include.addConcept().setCode("A");
|
||||||
|
|
||||||
|
try {
|
||||||
|
myValueSetDao.expand(vs, null);
|
||||||
|
fail();
|
||||||
|
} catch (PreconditionFailedException e) {
|
||||||
|
assertEquals("Unknown CodeSystem URI \"http://example.com/my_code_systemAA\" referenced from ValueSet", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,282 @@
|
||||||
|
package ca.uhn.fhir.jpa.dao.r5;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.support.IValidationSupport;
|
||||||
|
import ca.uhn.fhir.jpa.api.config.DaoConfig;
|
||||||
|
import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc;
|
||||||
|
import ca.uhn.fhir.jpa.term.custom.CustomTerminologySet;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
|
import org.hl7.fhir.r5.model.CodeSystem;
|
||||||
|
import org.hl7.fhir.r5.model.CodeType;
|
||||||
|
import org.hl7.fhir.r5.model.CodeableConcept;
|
||||||
|
import org.hl7.fhir.r5.model.Coding;
|
||||||
|
import org.hl7.fhir.r5.model.IdType;
|
||||||
|
import org.hl7.fhir.r5.model.StringType;
|
||||||
|
import org.hl7.fhir.r5.model.UriType;
|
||||||
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
import static org.hamcrest.Matchers.stringContainsInOrder;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
public class FhirResourceDaoR5ValueSetTest extends BaseJpaR5Test {
|
||||||
|
|
||||||
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoR5ValueSetTest.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
protected ITermDeferredStorageSvc myTerminologyDeferredStorageSvc;
|
||||||
|
|
||||||
|
private IIdType myExtensionalVsId;
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void after() {
|
||||||
|
myDaoConfig.setPreExpandValueSets(new DaoConfig().isPreExpandValueSets());
|
||||||
|
myDaoConfig.setMaximumExpansionSize(new DaoConfig().getMaximumExpansionSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
@Transactional
|
||||||
|
public void before02() throws IOException {
|
||||||
|
ValueSet upload = loadResourceFromClasspath(ValueSet.class, "/extensional-case-3-vs.xml");
|
||||||
|
myExtensionalVsId = myValueSetDao.create(upload, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
CodeSystem upload2 = loadResourceFromClasspath(CodeSystem.class, "/extensional-case-3-cs.xml");
|
||||||
|
myCodeSystemDao.create(upload2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationNoValueSet() {
|
||||||
|
UriType valueSetIdentifier = null;
|
||||||
|
IdType id = null;
|
||||||
|
CodeType code = new CodeType("8450-9-XXX");
|
||||||
|
UriType system = new UriType("http://acme.org");
|
||||||
|
StringType display = null;
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = null;
|
||||||
|
try {
|
||||||
|
myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
fail();
|
||||||
|
} catch (InvalidRequestException e) {
|
||||||
|
assertEquals("Either ValueSet ID or ValueSet identifier or system and code must be provided. Unable to validate.", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationByIdentifierAndCodeAndSystem() {
|
||||||
|
UriType valueSetIdentifier = new UriType("http://www.healthintersections.com.au/fhir/ValueSet/extensional-case-2");
|
||||||
|
IdType id = null;
|
||||||
|
CodeType code = new CodeType("11378-7");
|
||||||
|
UriType system = new UriType("http://acme.org");
|
||||||
|
StringType display = null;
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = null;
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationByIdentifierAndCodeAndSystemAndBadDisplay() {
|
||||||
|
UriType valueSetIdentifier = new UriType("http://www.healthintersections.com.au/fhir/ValueSet/extensional-case-2");
|
||||||
|
IdType id = null;
|
||||||
|
CodeType code = new CodeType("11378-7");
|
||||||
|
UriType system = new UriType("http://acme.org");
|
||||||
|
StringType display = new StringType("Systolic blood pressure at First encounterXXXX");
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = null;
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertFalse(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
assertEquals("Concept Display \"Systolic blood pressure at First encounterXXXX\" does not match expected \"Systolic blood pressure at First encounter\"", result.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationByIdentifierAndCodeAndSystemAndGoodDisplay() {
|
||||||
|
UriType valueSetIdentifier = new UriType("http://www.healthintersections.com.au/fhir/ValueSet/extensional-case-2");
|
||||||
|
IdType id = null;
|
||||||
|
CodeType code = new CodeType("11378-7");
|
||||||
|
UriType system = new UriType("http://acme.org");
|
||||||
|
StringType display = new StringType("Systolic blood pressure at First encounter");
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = null;
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationByResourceIdAndCodeableConcept() {
|
||||||
|
UriType valueSetIdentifier = null;
|
||||||
|
IIdType id = myExtensionalVsId;
|
||||||
|
CodeType code = null;
|
||||||
|
UriType system = null;
|
||||||
|
StringType display = null;
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = new CodeableConcept();
|
||||||
|
codeableConcept.addCoding().setSystem("http://acme.org").setCode("11378-7");
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationByResourceIdAndCodeableConceptWithExistingValueSetAndPreExpansionEnabled() {
|
||||||
|
myDaoConfig.setPreExpandValueSets(true);
|
||||||
|
|
||||||
|
UriType valueSetIdentifier = null;
|
||||||
|
IIdType id = myExtensionalVsId;
|
||||||
|
CodeType code = null;
|
||||||
|
UriType system = null;
|
||||||
|
StringType display = null;
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = new CodeableConcept();
|
||||||
|
codeableConcept.addCoding().setSystem("http://acme.org").setCode("11378-7");
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
|
||||||
|
myTerminologyDeferredStorageSvc.saveDeferred();
|
||||||
|
result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
|
||||||
|
myTermSvc.preExpandDeferredValueSetsToTerminologyTables();
|
||||||
|
result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationByResourceIdAndCodeAndSystem() {
|
||||||
|
UriType valueSetIdentifier = null;
|
||||||
|
IIdType id = myExtensionalVsId;
|
||||||
|
CodeType code = new CodeType("11378-7");
|
||||||
|
UriType system = new UriType("http://acme.org");
|
||||||
|
StringType display = null;
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = null;
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeOperationByResourceIdAndCodeAndSystemWithExistingValueSetAndPreExpansionEnabled() {
|
||||||
|
myDaoConfig.setPreExpandValueSets(true);
|
||||||
|
|
||||||
|
UriType valueSetIdentifier = null;
|
||||||
|
IIdType id = myExtensionalVsId;
|
||||||
|
CodeType code = new CodeType("11378-7");
|
||||||
|
UriType system = new UriType("http://acme.org");
|
||||||
|
StringType display = null;
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = null;
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
|
||||||
|
myTerminologyDeferredStorageSvc.saveDeferred();
|
||||||
|
result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
|
||||||
|
myTermSvc.preExpandDeferredValueSetsToTerminologyTables();
|
||||||
|
result = myValueSetDao.validateCode(valueSetIdentifier, id, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
assertTrue(result.isOk());
|
||||||
|
assertEquals("Systolic blood pressure at First encounter", result.getDisplay());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExpandById() {
|
||||||
|
String resp;
|
||||||
|
|
||||||
|
ValueSet expanded = myValueSetDao.expand(myExtensionalVsId, null, mySrd);
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(expanded);
|
||||||
|
ourLog.info(resp);
|
||||||
|
assertThat(resp, containsString("<ValueSet xmlns=\"http://hl7.org/fhir\">"));
|
||||||
|
assertThat(resp, containsString("<expansion>"));
|
||||||
|
assertThat(resp, containsString("<contains>"));
|
||||||
|
assertThat(resp, containsString("<system value=\"http://acme.org\"/>"));
|
||||||
|
assertThat(resp, containsString("<code value=\"8450-9\"/>"));
|
||||||
|
assertThat(resp, containsString("<display value=\"Systolic blood pressure--expiration\"/>"));
|
||||||
|
assertThat(resp, containsString("</contains>"));
|
||||||
|
assertThat(resp, containsString("<contains>"));
|
||||||
|
assertThat(resp, containsString("<system value=\"http://acme.org\"/>"));
|
||||||
|
assertThat(resp, containsString("<code value=\"11378-7\"/>"));
|
||||||
|
assertThat(resp, containsString("<display value=\"Systolic blood pressure at First encounter\"/>"));
|
||||||
|
assertThat(resp, containsString("</contains>"));
|
||||||
|
assertThat(resp, containsString("</expansion>"));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Filter with display name
|
||||||
|
*/
|
||||||
|
|
||||||
|
expanded = myValueSetDao.expand(myExtensionalVsId, ("systolic"), mySrd);
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(expanded);
|
||||||
|
ourLog.info(resp);
|
||||||
|
//@formatter:off
|
||||||
|
assertThat(resp, stringContainsInOrder(
|
||||||
|
"<code value=\"11378-7\"/>",
|
||||||
|
"<display value=\"Systolic blood pressure at First encounter\"/>"));
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExpandByValueSet_ExceedsMaxSize() {
|
||||||
|
// Add a bunch of codes
|
||||||
|
CustomTerminologySet codesToAdd = new CustomTerminologySet();
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
codesToAdd.addRootConcept("CODE" + i, "Display " + i);
|
||||||
|
}
|
||||||
|
myTermCodeSystemStorageSvc.applyDeltaCodeSystemsAdd("http://loinc.org", codesToAdd);
|
||||||
|
myDaoConfig.setMaximumExpansionSize(50);
|
||||||
|
|
||||||
|
ValueSet vs = new ValueSet();
|
||||||
|
vs.setUrl("http://example.com/fhir/ValueSet/observation-vitalsignresult");
|
||||||
|
vs.getCompose().addInclude().setSystem("http://loinc.org");
|
||||||
|
myValueSetDao.create(vs);
|
||||||
|
|
||||||
|
try {
|
||||||
|
myValueSetDao.expand(vs, null);
|
||||||
|
fail();
|
||||||
|
} catch (InternalErrorException e) {
|
||||||
|
assertEquals("Expansion of ValueSet produced too many codes (maximum 50) - Operation aborted!", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidateCodeAgainstBuiltInValueSetAndCodeSystemWithValidCode() {
|
||||||
|
IPrimitiveType<String> display = null;
|
||||||
|
Coding coding = null;
|
||||||
|
CodeableConcept codeableConcept = null;
|
||||||
|
StringType vsIdentifier = new StringType("http://hl7.org/fhir/ValueSet/administrative-gender");
|
||||||
|
StringType code = new StringType("male");
|
||||||
|
StringType system = new StringType("http://hl7.org/fhir/administrative-gender");
|
||||||
|
IValidationSupport.CodeValidationResult result = myValueSetDao.validateCode(vsIdentifier, null, code, system, display, coding, codeableConcept, mySrd);
|
||||||
|
|
||||||
|
ourLog.info(result.getMessage());
|
||||||
|
assertTrue(result.isOk(), result.getMessage());
|
||||||
|
assertEquals("Male", result.getDisplay());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,9 @@ import ca.uhn.fhir.jpa.dao.dstu3.FhirResourceDaoDstu3TerminologyTest;
|
||||||
import ca.uhn.fhir.jpa.term.TermReindexingSvcImpl;
|
import ca.uhn.fhir.jpa.term.TermReindexingSvcImpl;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
|
||||||
import org.hl7.fhir.dstu3.model.*;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
|
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.junit.jupiter.api.AfterAll;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
|
@ -0,0 +1,761 @@
|
||||||
|
package ca.uhn.fhir.jpa.provider.dstu3;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome;
|
||||||
|
import ca.uhn.fhir.jpa.dao.dstu3.FhirResourceDaoDstu3TerminologyTest;
|
||||||
|
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||||
|
import ca.uhn.fhir.jpa.model.util.JpaConstants;
|
||||||
|
import ca.uhn.fhir.jpa.provider.dstu3.BaseResourceProviderDstu3Test;
|
||||||
|
import ca.uhn.fhir.jpa.provider.dstu3.ResourceProviderDstu3ValueSetTest;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
|
import org.apache.http.client.methods.HttpPut;
|
||||||
|
import org.apache.http.entity.ContentType;
|
||||||
|
import org.apache.http.entity.StringEntity;
|
||||||
|
import org.hl7.fhir.dstu3.model.BooleanType;
|
||||||
|
import org.hl7.fhir.dstu3.model.CodeSystem;
|
||||||
|
import org.hl7.fhir.dstu3.model.CodeType;
|
||||||
|
import org.hl7.fhir.dstu3.model.Coding;
|
||||||
|
import org.hl7.fhir.dstu3.model.Enumerations;
|
||||||
|
import org.hl7.fhir.dstu3.model.Parameters;
|
||||||
|
import org.hl7.fhir.dstu3.model.StringType;
|
||||||
|
import org.hl7.fhir.dstu3.model.UriType;
|
||||||
|
//import org.hl7.fhir.dstu3.model.codesystems.ConceptSubsumptionOutcome;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
public class ResourceProviderDstu3CodeSystemVersionedTest extends BaseResourceProviderDstu3Test {
|
||||||
|
|
||||||
|
private static final String SYSTEM_PARENTCHILD = "http://parentchild";
|
||||||
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderDstu3CodeSystemVersionedTest.class);
|
||||||
|
private long parentChildCs1Id;
|
||||||
|
private long parentChildCs2Id;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
@Transactional
|
||||||
|
public void before02() throws IOException {
|
||||||
|
CodeSystem cs = loadResourceFromClasspath(CodeSystem.class, "/extensional-case-3-cs.xml");
|
||||||
|
cs.setVersion("1");
|
||||||
|
for(CodeSystem.ConceptDefinitionComponent conceptDefinitionComponent : cs.getConcept()) {
|
||||||
|
conceptDefinitionComponent.setDisplay(conceptDefinitionComponent.getDisplay() + " v1");
|
||||||
|
}
|
||||||
|
myCodeSystemDao.create(cs, mySrd);
|
||||||
|
|
||||||
|
cs = loadResourceFromClasspath(CodeSystem.class, "/extensional-case-3-cs.xml");
|
||||||
|
cs.setVersion("2");
|
||||||
|
for(CodeSystem.ConceptDefinitionComponent conceptDefinitionComponent : cs.getConcept()) {
|
||||||
|
conceptDefinitionComponent.setDisplay(conceptDefinitionComponent.getDisplay() + " v2");
|
||||||
|
}
|
||||||
|
myCodeSystemDao.create(cs, mySrd);
|
||||||
|
|
||||||
|
CodeSystem parentChildCs = new CodeSystem();
|
||||||
|
parentChildCs.setUrl(SYSTEM_PARENTCHILD);
|
||||||
|
parentChildCs.setVersion("1");
|
||||||
|
parentChildCs.setName("Parent Child CodeSystem 1");
|
||||||
|
parentChildCs.setStatus(Enumerations.PublicationStatus.ACTIVE);
|
||||||
|
parentChildCs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE);
|
||||||
|
parentChildCs.setHierarchyMeaning(CodeSystem.CodeSystemHierarchyMeaning.ISA);
|
||||||
|
|
||||||
|
CodeSystem.ConceptDefinitionComponent parentA = parentChildCs.addConcept().setCode("ParentA").setDisplay("Parent A");
|
||||||
|
parentA.addConcept().setCode("ChildAA").setDisplay("Child AA");
|
||||||
|
parentA.addConcept().setCode("ParentC").setDisplay("Parent C");
|
||||||
|
parentChildCs.addConcept().setCode("ParentB").setDisplay("Parent B");
|
||||||
|
|
||||||
|
DaoMethodOutcome parentChildCsOutcome = myCodeSystemDao.create(parentChildCs);
|
||||||
|
parentChildCs1Id = ((ResourceTable)parentChildCsOutcome.getEntity()).getId();
|
||||||
|
|
||||||
|
parentChildCs = new CodeSystem();
|
||||||
|
parentChildCs.setVersion("2");
|
||||||
|
parentChildCs.setName("Parent Child CodeSystem 2");
|
||||||
|
parentChildCs.setUrl(SYSTEM_PARENTCHILD);
|
||||||
|
parentChildCs.setStatus(Enumerations.PublicationStatus.ACTIVE);
|
||||||
|
parentChildCs.setContent(CodeSystem.CodeSystemContentMode.COMPLETE);
|
||||||
|
parentChildCs.setHierarchyMeaning(CodeSystem.CodeSystemHierarchyMeaning.ISA);
|
||||||
|
|
||||||
|
parentA = parentChildCs.addConcept().setCode("ParentA").setDisplay("Parent A v2");
|
||||||
|
parentA.addConcept().setCode("ChildAA").setDisplay("Child AA v2");
|
||||||
|
parentA.addConcept().setCode("ParentB").setDisplay("Parent B v2");
|
||||||
|
parentChildCs.addConcept().setCode("ParentC").setDisplay("Parent C v2");
|
||||||
|
|
||||||
|
parentChildCsOutcome = myCodeSystemDao.create(parentChildCs);
|
||||||
|
parentChildCs2Id = ((ResourceTable)parentChildCsOutcome.getEntity()).getId();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLookupOnExternalCodeMultiVersion() {
|
||||||
|
ResourceProviderDstu3ValueSetVersionedTest.createExternalCs(myCodeSystemDao, myResourceTableDao, myTermCodeSystemStorageSvc, mySrd, "1");
|
||||||
|
ResourceProviderDstu3ValueSetVersionedTest.createExternalCs(myCodeSystemDao, myResourceTableDao, myTermCodeSystemStorageSvc, mySrd, "2");
|
||||||
|
|
||||||
|
// First test with no version specified (should return from last version created)
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(FhirResourceDaoDstu3TerminologyTest.URL_MY_CODE_SYSTEM))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("SYSTEM NAME", ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("2", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals("Parent A2", ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// With HTTP GET
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(FhirResourceDaoDstu3TerminologyTest.URL_MY_CODE_SYSTEM))
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("SYSTEM NAME"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals(("2"), ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals("Parent A2", ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version 1 specified.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(FhirResourceDaoDstu3TerminologyTest.URL_MY_CODE_SYSTEM))
|
||||||
|
.andParameter("version", new StringType("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("SYSTEM NAME", ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("1", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals("Parent A1", ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// With HTTP GET
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(FhirResourceDaoDstu3TerminologyTest.URL_MY_CODE_SYSTEM))
|
||||||
|
.andParameter("version", new StringType("1"))
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("SYSTEM NAME"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals(("1"), ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals("Parent A1", ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version 2 specified.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(FhirResourceDaoDstu3TerminologyTest.URL_MY_CODE_SYSTEM))
|
||||||
|
.andParameter("version", new StringType("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("SYSTEM NAME", ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("2", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals("Parent A2", ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// With HTTP GET
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(FhirResourceDaoDstu3TerminologyTest.URL_MY_CODE_SYSTEM))
|
||||||
|
.andParameter("version", new StringType("2"))
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("SYSTEM NAME"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals(("2"), ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals("Parent A2", ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLookupOperationByCodeAndSystemUserDefinedCode() {
|
||||||
|
// First test with no version specified (should return from last version created)
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("8450-9"))
|
||||||
|
.andParameter("system", new UriType("http://acme.org"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("ACME Codes"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("2", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals(("Systolic blood pressure--expiration v2"), ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version 1 specified.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("8450-9"))
|
||||||
|
.andParameter("system", new UriType("http://acme.org"))
|
||||||
|
.andParameter("version", new StringType("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("ACME Codes"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("1", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals(("Systolic blood pressure--expiration v1"), ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version 2 specified
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("8450-9"))
|
||||||
|
.andParameter("system", new UriType("http://acme.org"))
|
||||||
|
.andParameter("version", new StringType("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("ACME Codes"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("2", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals(("Systolic blood pressure--expiration v2"), ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLookupOperationByCodeAndSystemUserDefinedNonExistentVersion() {
|
||||||
|
try {
|
||||||
|
ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "code", new CodeType("8450-9"))
|
||||||
|
.andParameter("system", new UriType("http://acme.org"))
|
||||||
|
.andParameter("version", new StringType("3"))
|
||||||
|
.execute();
|
||||||
|
fail();
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
ourLog.info("Lookup failed as expected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLookupOperationByCoding() {
|
||||||
|
// First test with no version specified (should return from last version created)
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "coding", new Coding().setSystem("http://acme.org").setCode("8450-9"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("ACME Codes"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("2", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals(("Systolic blood pressure--expiration v2"), ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 1
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "coding", new Coding().setSystem("http://acme.org").setCode("8450-9").setVersion("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("ACME Codes"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("1", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals(("Systolic blood pressure--expiration v1"), ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 2
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named("lookup")
|
||||||
|
.withParameter(Parameters.class, "coding", new Coding().setSystem("http://acme.org").setCode("8450-9").setVersion("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals("name", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals(("ACME Codes"), ((StringType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
assertEquals("version", respParam.getParameter().get(1).getName());
|
||||||
|
assertEquals("2", ((StringType) respParam.getParameter().get(1).getValue()).getValue());
|
||||||
|
assertEquals("display", respParam.getParameter().get(2).getName());
|
||||||
|
assertEquals(("Systolic blood pressure--expiration v2"), ((StringType) respParam.getParameter().get(2).getValue()).getValue());
|
||||||
|
assertEquals("abstract", respParam.getParameter().get(3).getName());
|
||||||
|
assertEquals(false, ((BooleanType) respParam.getParameter().get(3).getValue()).getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubsumesOnCodes_Subsumes() {
|
||||||
|
// First test with no version specified (should return result for last version created).
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentB"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumes", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 1.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentC"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.andParameter("version", new StringType("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumes", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 2.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentB"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentA"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.andParameter("version", new StringType("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumes", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubsumesOnCodes_Subsumedby() {
|
||||||
|
// First test with no version specified (should return result for last version created).
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentA"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentB"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumed-by", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 1.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentA"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentC"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.andParameter("version", new StringType("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumed-by", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 2.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentA"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentB"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.andParameter("version", new StringType("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumed-by", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubsumesOnCodes_Disjoint() {
|
||||||
|
// First test with no version specified (should return result for last version created).
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentA"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentC"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("not-subsumed", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 1
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentA"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentB"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.andParameter("version", new StringType("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("not-subsumed", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 2
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codeA", new CodeType("ParentA"))
|
||||||
|
.andParameter("codeB", new CodeType("ParentC"))
|
||||||
|
.andParameter("system", new UriType(SYSTEM_PARENTCHILD))
|
||||||
|
.andParameter("version", new StringType("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("not-subsumed", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubsumesOnCodings_MismatchedCsVersions() {
|
||||||
|
try {
|
||||||
|
ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ChildAA").setVersion("1"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA").setVersion("2"))
|
||||||
|
.execute();
|
||||||
|
fail();
|
||||||
|
} catch (InvalidRequestException e) {
|
||||||
|
assertEquals("HTTP 400 Bad Request: Unable to test subsumption across different code system versions", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubsumesOnCodings_Subsumes() {
|
||||||
|
// First test with no version specified (should return result for last version created).
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentB"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumes", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 1.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentC").setVersion("1"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA").setVersion("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumes", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 2.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentB").setVersion("2"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA").setVersion("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumes", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubsumesOnCodings_Subsumedby() {
|
||||||
|
// First test with no version specified (should return result for last version created).
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentB"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumed-by", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 1.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA").setVersion("1"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentC").setVersion("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumed-by", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 2.
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA").setVersion("2"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentB").setVersion("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("subsumed-by", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubsumesOnCodings_Disjoint() {
|
||||||
|
// First test with no version specified (should return result for last version created).
|
||||||
|
Parameters respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentC"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
String resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("not-subsumed", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 1
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA").setVersion("1"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentB").setVersion("1"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("not-subsumed", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
// Test with version set to 2
|
||||||
|
respParam = ourClient
|
||||||
|
.operation()
|
||||||
|
.onType(CodeSystem.class)
|
||||||
|
.named(JpaConstants.OPERATION_SUBSUMES)
|
||||||
|
.withParameter(Parameters.class, "codingA", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentA").setVersion("2"))
|
||||||
|
.andParameter("codingB", new Coding().setSystem(SYSTEM_PARENTCHILD).setCode("ParentC").setVersion("2"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
resp = myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(respParam);
|
||||||
|
ourLog.info(resp);
|
||||||
|
|
||||||
|
assertEquals(1, respParam.getParameter().size());
|
||||||
|
assertEquals("outcome", respParam.getParameter().get(0).getName());
|
||||||
|
assertEquals("not-subsumed", ((CodeType) respParam.getParameter().get(0).getValue()).getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateCodeSystemName() throws IOException {
|
||||||
|
|
||||||
|
CodeSystem initialCodeSystem = ourClient.read().resource(CodeSystem.class).withId(parentChildCs1Id).execute();
|
||||||
|
assertEquals("Parent Child CodeSystem 1", initialCodeSystem.getName());
|
||||||
|
initialCodeSystem.setName("Updated Parent Child CodeSystem 1");
|
||||||
|
String encoded = myFhirCtx.newJsonParser().encodeResourceToString(initialCodeSystem);
|
||||||
|
HttpPut putRequest = new HttpPut(ourServerBase + "/CodeSystem/" + parentChildCs1Id);
|
||||||
|
putRequest.setEntity(new StringEntity(encoded, ContentType.parse("application/json+fhir")));
|
||||||
|
CloseableHttpResponse resp = ourHttpClient.execute(putRequest);
|
||||||
|
try {
|
||||||
|
assertEquals(200, resp.getStatusLine().getStatusCode());
|
||||||
|
} finally {
|
||||||
|
IOUtils.closeQuietly(resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeSystem updatedCodeSystem = ourClient.read().resource(CodeSystem.class).withId(parentChildCs1Id).execute();
|
||||||
|
assertEquals("Updated Parent Child CodeSystem 1", updatedCodeSystem.getName());
|
||||||
|
|
||||||
|
initialCodeSystem = ourClient.read().resource(CodeSystem.class).withId(parentChildCs2Id).execute();
|
||||||
|
assertEquals("Parent Child CodeSystem 2", initialCodeSystem.getName());
|
||||||
|
initialCodeSystem.setName("Updated Parent Child CodeSystem 2");
|
||||||
|
encoded = myFhirCtx.newJsonParser().encodeResourceToString(initialCodeSystem);
|
||||||
|
putRequest = new HttpPut(ourServerBase + "/CodeSystem/" + parentChildCs2Id);
|
||||||
|
putRequest.setEntity(new StringEntity(encoded, ContentType.parse("application/json+fhir")));
|
||||||
|
resp = ourHttpClient.execute(putRequest);
|
||||||
|
try {
|
||||||
|
assertEquals(200, resp.getStatusLine().getStatusCode());
|
||||||
|
} finally {
|
||||||
|
IOUtils.closeQuietly(resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedCodeSystem = ourClient.read().resource(CodeSystem.class).withId(parentChildCs2Id).execute();
|
||||||
|
assertEquals("Updated Parent Child CodeSystem 2", updatedCodeSystem.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -89,8 +89,8 @@ public class ResourceProviderR4CodeSystemVersionedTest extends BaseResourceProvi
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLookupOnExternalCodeMultiVersion() {
|
public void testLookupOnExternalCodeMultiVersion() {
|
||||||
ResourceProviderR4ValueSetTest.createExternalCs(myCodeSystemDao, myResourceTableDao, myTermCodeSystemStorageSvc, mySrd, "1");
|
ResourceProviderR4ValueSetVersionedTest.createExternalCs(myCodeSystemDao, myResourceTableDao, myTermCodeSystemStorageSvc, mySrd, "1");
|
||||||
ResourceProviderR4ValueSetTest.createExternalCs(myCodeSystemDao, myResourceTableDao, myTermCodeSystemStorageSvc, mySrd, "2");
|
ResourceProviderR4ValueSetVersionedTest.createExternalCs(myCodeSystemDao, myResourceTableDao, myTermCodeSystemStorageSvc, mySrd, "2");
|
||||||
|
|
||||||
// First test with no version specified (should return from last version created)
|
// First test with no version specified (should return from last version created)
|
||||||
Parameters respParam = myClient
|
Parameters respParam = myClient
|
||||||
|
|
|
@ -1098,38 +1098,4 @@ public class ResourceProviderR4ValueSetTest extends BaseResourceProviderR4Test {
|
||||||
return codeSystem;
|
return codeSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CodeSystem createExternalCs(IFhirResourceDao<CodeSystem> theCodeSystemDao, IResourceTableDao theResourceTableDao, ITermCodeSystemStorageSvc theTermCodeSystemStorageSvc, ServletRequestDetails theRequestDetails, String theCodeSystemVersion) {
|
|
||||||
CodeSystem codeSystem = new CodeSystem();
|
|
||||||
codeSystem.setUrl(URL_MY_CODE_SYSTEM);
|
|
||||||
codeSystem.setContent(CodeSystemContentMode.NOTPRESENT);
|
|
||||||
codeSystem.setVersion(theCodeSystemVersion);
|
|
||||||
IIdType id = theCodeSystemDao.create(codeSystem, theRequestDetails).getId().toUnqualified();
|
|
||||||
|
|
||||||
ResourceTable table = theResourceTableDao.findById(id.getIdPartAsLong()).orElseThrow(IllegalStateException::new);
|
|
||||||
|
|
||||||
TermCodeSystemVersion cs = new TermCodeSystemVersion();
|
|
||||||
cs.setResource(table);
|
|
||||||
|
|
||||||
TermConcept parentA = new TermConcept(cs, "ParentA").setDisplay("Parent A" + theCodeSystemVersion);
|
|
||||||
cs.getConcepts().add(parentA);
|
|
||||||
|
|
||||||
TermConcept childAA = new TermConcept(cs, "childAA").setDisplay("Child AA" + theCodeSystemVersion);
|
|
||||||
parentA.addChild(childAA, RelationshipTypeEnum.ISA);
|
|
||||||
|
|
||||||
TermConcept childAAA = new TermConcept(cs, "childAAA").setDisplay("Child AAA" + theCodeSystemVersion);
|
|
||||||
childAA.addChild(childAAA, RelationshipTypeEnum.ISA);
|
|
||||||
|
|
||||||
TermConcept childAAB = new TermConcept(cs, "childAAB").setDisplay("Child AAB" + theCodeSystemVersion);
|
|
||||||
childAA.addChild(childAAB, RelationshipTypeEnum.ISA);
|
|
||||||
|
|
||||||
TermConcept childAB = new TermConcept(cs, "childAB").setDisplay("Child AB" + theCodeSystemVersion);
|
|
||||||
parentA.addChild(childAB, RelationshipTypeEnum.ISA);
|
|
||||||
|
|
||||||
TermConcept parentB = new TermConcept(cs, "ParentB").setDisplay("Parent B" + theCodeSystemVersion);
|
|
||||||
cs.getConcepts().add(parentB);
|
|
||||||
|
|
||||||
theTermCodeSystemStorageSvc.storeNewCodeSystemVersion(new ResourcePersistentId(table.getId()), URL_MY_CODE_SYSTEM, "SYSTEM NAME", theCodeSystemVersion, cs, table);
|
|
||||||
return codeSystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc;
|
||||||
import ca.uhn.fhir.rest.api.server.storage.ResourcePersistentId;
|
import ca.uhn.fhir.rest.api.server.storage.ResourcePersistentId;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
import ca.uhn.fhir.util.UrlUtil;
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
import org.apache.commons.io.Charsets;
|
import org.apache.commons.io.Charsets;
|
||||||
|
@ -1339,6 +1340,19 @@ public class ResourceProviderR4ValueSetVersionedTest extends BaseResourceProvide
|
||||||
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateDuplicatValueSetVersion() {
|
||||||
|
createExternalCsAndLocalVs();
|
||||||
|
try {
|
||||||
|
persistLocalVs(createLocalVs(URL_MY_CODE_SYSTEM, "1"));
|
||||||
|
fail();
|
||||||
|
} catch (UnprocessableEntityException theE) {
|
||||||
|
assertThat(theE.getMessage(), containsString("Can not create multiple ValueSet resources with ValueSet.url \"" + URL_MY_VALUE_SET + "\" and ValueSet.version \"1\", already have one with resource ID: "));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@AfterEach
|
@AfterEach
|
||||||
public void afterResetPreExpansionDefault() {
|
public void afterResetPreExpansionDefault() {
|
||||||
myDaoConfig.setPreExpandValueSets(new DaoConfig().isPreExpandValueSets());
|
myDaoConfig.setPreExpandValueSets(new DaoConfig().isPreExpandValueSets());
|
||||||
|
@ -1378,7 +1392,7 @@ public class ResourceProviderR4ValueSetVersionedTest extends BaseResourceProvide
|
||||||
return codeSystem;
|
return codeSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CodeSystem createExternalCs(IFhirResourceDao<CodeSystem> theCodeSystemDao, IResourceTableDao theResourceTableDao, ITermCodeSystemStorageSvc theTermCodeSystemStorageSvc, ServletRequestDetails theRequestDetails, String theCodeSystemVersion) {
|
public static CodeSystem createExternalCs(IFhirResourceDao<CodeSystem> theCodeSystemDao, IResourceTableDao theResourceTableDao, ITermCodeSystemStorageSvc theTermCodeSystemStorageSvc, ServletRequestDetails theRequestDetails, String theCodeSystemVersion) {
|
||||||
CodeSystem codeSystem = new CodeSystem();
|
CodeSystem codeSystem = new CodeSystem();
|
||||||
codeSystem.setUrl(URL_MY_CODE_SYSTEM);
|
codeSystem.setUrl(URL_MY_CODE_SYSTEM);
|
||||||
codeSystem.setVersion(theCodeSystemVersion);
|
codeSystem.setVersion(theCodeSystemVersion);
|
||||||
|
|
Loading…
Reference in New Issue