More loinc work
This commit is contained in:
parent
33554189a1
commit
30cd63b929
|
@ -36,32 +36,39 @@ import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||||
import ca.uhn.fhir.model.primitive.StringDt;
|
import ca.uhn.fhir.model.primitive.StringDt;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities for dealing with parameters resources
|
* Utilities for dealing with parameters resources in a version indepenedent way
|
||||||
*/
|
*/
|
||||||
public class ParametersUtil {
|
public class ParametersUtil {
|
||||||
|
|
||||||
public static void addParameterToParameters(FhirContext theContext, IBaseResource theTargetResource, Object sourceClientArgument, String theName) {
|
/**
|
||||||
RuntimeResourceDefinition def = theContext.getResourceDefinition(theTargetResource);
|
* Add a paratemer value to a Parameters resource
|
||||||
|
* @param theContext The FhirContext
|
||||||
|
* @param theParameters The Parameters resource
|
||||||
|
* @param theName The parametr name
|
||||||
|
* @param theValue The parameter value (can be a {@link IBaseResource resource} or a {@link IBaseDatatype datatype})
|
||||||
|
*/
|
||||||
|
public static void addParameterToParameters(FhirContext theContext, IBaseParameters theParameters, String theName, Object theValue) {
|
||||||
|
RuntimeResourceDefinition def = theContext.getResourceDefinition(theParameters);
|
||||||
BaseRuntimeChildDefinition paramChild = def.getChildByName("parameter");
|
BaseRuntimeChildDefinition paramChild = def.getChildByName("parameter");
|
||||||
BaseRuntimeElementCompositeDefinition<?> paramChildElem = (BaseRuntimeElementCompositeDefinition<?>) paramChild.getChildByName("parameter");
|
BaseRuntimeElementCompositeDefinition<?> paramChildElem = (BaseRuntimeElementCompositeDefinition<?>) paramChild.getChildByName("parameter");
|
||||||
|
|
||||||
addClientParameter(theContext, sourceClientArgument, theTargetResource, paramChild, paramChildElem, theName);
|
addClientParameter(theContext, theValue, theParameters, paramChild, paramChildElem, theName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addClientParameter(FhirContext theContext, Object theSourceClientArgument, IBaseResource theTargetResource, BaseRuntimeChildDefinition paramChild, BaseRuntimeElementCompositeDefinition<?> paramChildElem, String theName) {
|
private static void addClientParameter(FhirContext theContext, Object theValue, IBaseResource theTargetResource, BaseRuntimeChildDefinition paramChild, BaseRuntimeElementCompositeDefinition<?> paramChildElem, String theName) {
|
||||||
if (theSourceClientArgument instanceof IBaseResource) {
|
if (theValue instanceof IBaseResource) {
|
||||||
IBase parameter = createParameterRepetition(theContext, theTargetResource, paramChild, paramChildElem, theName);
|
IBase parameter = createParameterRepetition(theContext, theTargetResource, paramChild, paramChildElem, theName);
|
||||||
paramChildElem.getChildByName("resource").getMutator().addValue(parameter, (IBaseResource) theSourceClientArgument);
|
paramChildElem.getChildByName("resource").getMutator().addValue(parameter, (IBaseResource) theValue);
|
||||||
} else if (theSourceClientArgument instanceof IBaseDatatype) {
|
} else if (theValue instanceof IBaseDatatype) {
|
||||||
IBase parameter = createParameterRepetition(theContext, theTargetResource, paramChild, paramChildElem, theName);
|
IBase parameter = createParameterRepetition(theContext, theTargetResource, paramChild, paramChildElem, theName);
|
||||||
paramChildElem.getChildByName("value[x]").getMutator().addValue(parameter, (IBaseDatatype) theSourceClientArgument);
|
paramChildElem.getChildByName("value[x]").getMutator().addValue(parameter, (IBaseDatatype) theValue);
|
||||||
} else if (theSourceClientArgument instanceof Collection) {
|
} else if (theValue instanceof Collection) {
|
||||||
Collection<?> collection = (Collection<?>) theSourceClientArgument;
|
Collection<?> collection = (Collection<?>) theValue;
|
||||||
for (Object next : collection) {
|
for (Object next : collection) {
|
||||||
addClientParameter(theContext, next, theTargetResource, paramChild, paramChildElem, theName);
|
addClientParameter(theContext, next, theTargetResource, paramChild, paramChildElem, theName);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Don't know how to handle value of type " + theSourceClientArgument.getClass() + " for paramater " + theName);
|
throw new IllegalArgumentException("Don't know how to handle value of type " + theValue.getClass() + " for paramater " + theName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -914,11 +914,11 @@ public class GenericClient extends BaseClient implements IGenericClient {
|
||||||
IBaseParameters parameters = ParametersUtil.newInstance(myContext);
|
IBaseParameters parameters = ParametersUtil.newInstance(myContext);
|
||||||
switch (myOperation) {
|
switch (myOperation) {
|
||||||
case ADD:
|
case ADD:
|
||||||
ParametersUtil.addParameterToParameters(myContext, parameters, myMeta, "meta");
|
ParametersUtil.addParameterToParameters(myContext, parameters, "meta", myMeta);
|
||||||
invocation = OperationMethodBinding.createOperationInvocation(myContext, myId.getResourceType(), myId.getIdPart(), "$meta-add", parameters, false);
|
invocation = OperationMethodBinding.createOperationInvocation(myContext, myId.getResourceType(), myId.getIdPart(), "$meta-add", parameters, false);
|
||||||
break;
|
break;
|
||||||
case DELETE:
|
case DELETE:
|
||||||
ParametersUtil.addParameterToParameters(myContext, parameters, myMeta, "meta");
|
ParametersUtil.addParameterToParameters(myContext, parameters, "meta", myMeta);
|
||||||
invocation = OperationMethodBinding.createOperationInvocation(myContext, myId.getResourceType(), myId.getIdPart(), "$meta-delete", parameters, false);
|
invocation = OperationMethodBinding.createOperationInvocation(myContext, myId.getResourceType(), myId.getIdPart(), "$meta-delete", parameters, false);
|
||||||
break;
|
break;
|
||||||
case GET:
|
case GET:
|
||||||
|
|
|
@ -29,6 +29,7 @@ import java.util.Map;
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.hl7.fhir.instance.model.api.IBase;
|
import org.hl7.fhir.instance.model.api.IBase;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseParameters;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
|
|
||||||
|
@ -179,7 +180,7 @@ public class OperationParameter implements IParameter {
|
||||||
sourceClientArgument = myConverter.outgoingClient(sourceClientArgument);
|
sourceClientArgument = myConverter.outgoingClient(sourceClientArgument);
|
||||||
}
|
}
|
||||||
|
|
||||||
ParametersUtil.addParameterToParameters(theContext, theTargetResource, sourceClientArgument, myName);
|
ParametersUtil.addParameterToParameters(theContext, (IBaseParameters) theTargetResource, myName, sourceClientArgument);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ public class ValidateMethodBindingDstu2Plus extends OperationMethodBinding {
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createValidateInvocation(FhirContext theContext, IBaseResource theResource) {
|
public static BaseHttpClientInvocation createValidateInvocation(FhirContext theContext, IBaseResource theResource) {
|
||||||
IBaseParameters parameters = (IBaseParameters) theContext.getResourceDefinition("Parameters").newInstance();
|
IBaseParameters parameters = (IBaseParameters) theContext.getResourceDefinition("Parameters").newInstance();
|
||||||
ParametersUtil.addParameterToParameters(theContext, parameters, theResource, "resource");
|
ParametersUtil.addParameterToParameters(theContext, parameters, "resource", theResource);
|
||||||
|
|
||||||
String resourceName = theContext.getResourceDefinition(theResource).getName();
|
String resourceName = theContext.getResourceDefinition(theResource).getName();
|
||||||
String resourceId = theResource.getIdElement().getIdPart();
|
String resourceId = theResource.getIdElement().getIdPart();
|
||||||
|
|
|
@ -1,7 +1,18 @@
|
||||||
package ca.uhn.fhir.jpa.dao;
|
package ca.uhn.fhir.jpa.dao;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
|
import org.hl7.fhir.r4.model.BooleanType;
|
||||||
|
import org.hl7.fhir.r4.model.Parameters;
|
||||||
|
import org.hl7.fhir.r4.model.StringType;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
||||||
* HAPI FHIR JPA Server
|
* HAPI FHIR JPA Server
|
||||||
|
@ -21,9 +32,6 @@ import java.util.List;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
* #L%
|
* #L%
|
||||||
*/
|
*/
|
||||||
import org.hl7.fhir.instance.model.api.*;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
|
||||||
|
|
||||||
public interface IFhirResourceDaoCodeSystem<T extends IBaseResource, CD, CC> extends IFhirResourceDao<T> {
|
public interface IFhirResourceDaoCodeSystem<T extends IBaseResource, CD, CC> extends IFhirResourceDao<T> {
|
||||||
|
|
||||||
|
@ -31,7 +39,8 @@ public interface IFhirResourceDaoCodeSystem<T extends IBaseResource, CD, CC> ext
|
||||||
|
|
||||||
LookupCodeResult lookupCode(IPrimitiveType<String> theCode, IPrimitiveType<String> theSystem, CD theCoding, RequestDetails theRequestDetails);
|
LookupCodeResult lookupCode(IPrimitiveType<String> theCode, IPrimitiveType<String> theSystem, CD theCoding, RequestDetails theRequestDetails);
|
||||||
|
|
||||||
public class LookupCodeResult {
|
class LookupCodeResult {
|
||||||
|
|
||||||
private String myCodeDisplay;
|
private String myCodeDisplay;
|
||||||
private boolean myCodeIsAbstract;
|
private boolean myCodeIsAbstract;
|
||||||
private String myCodeSystemDisplayName;
|
private String myCodeSystemDisplayName;
|
||||||
|
@ -39,62 +48,87 @@ public interface IFhirResourceDaoCodeSystem<T extends IBaseResource, CD, CC> ext
|
||||||
private boolean myFound;
|
private boolean myFound;
|
||||||
private String mySearchedForCode;
|
private String mySearchedForCode;
|
||||||
private String mySearchedForSystem;
|
private String mySearchedForSystem;
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public LookupCodeResult() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
public String getCodeDisplay() {
|
public String getCodeDisplay() {
|
||||||
return myCodeDisplay;
|
return myCodeDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCodeSystemDisplayName() {
|
|
||||||
return myCodeSystemDisplayName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCodeSystemVersion() {
|
|
||||||
return myCodeSystemVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSearchedForCode() {
|
|
||||||
return mySearchedForCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSearchedForSystem() {
|
|
||||||
return mySearchedForSystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isCodeIsAbstract() {
|
|
||||||
return myCodeIsAbstract;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isFound() {
|
|
||||||
return myFound;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCodeDisplay(String theCodeDisplay) {
|
public void setCodeDisplay(String theCodeDisplay) {
|
||||||
myCodeDisplay = theCodeDisplay;
|
myCodeDisplay = theCodeDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCodeIsAbstract(boolean theCodeIsAbstract) {
|
public String getCodeSystemDisplayName() {
|
||||||
myCodeIsAbstract = theCodeIsAbstract;
|
return myCodeSystemDisplayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCodeSystemDisplayName(String theCodeSystemDisplayName) {
|
public void setCodeSystemDisplayName(String theCodeSystemDisplayName) {
|
||||||
myCodeSystemDisplayName = theCodeSystemDisplayName;
|
myCodeSystemDisplayName = theCodeSystemDisplayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCodeSystemVersion() {
|
||||||
|
return myCodeSystemVersion;
|
||||||
|
}
|
||||||
|
|
||||||
public void setCodeSystemVersion(String theCodeSystemVersion) {
|
public void setCodeSystemVersion(String theCodeSystemVersion) {
|
||||||
myCodeSystemVersion = theCodeSystemVersion;
|
myCodeSystemVersion = theCodeSystemVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFound(boolean theFound) {
|
public String getSearchedForCode() {
|
||||||
myFound = theFound;
|
return mySearchedForCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSearchedForCode(String theSearchedForCode) {
|
public void setSearchedForCode(String theSearchedForCode) {
|
||||||
mySearchedForCode = theSearchedForCode;
|
mySearchedForCode = theSearchedForCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSearchedForSystem() {
|
||||||
|
return mySearchedForSystem;
|
||||||
|
}
|
||||||
|
|
||||||
public void setSearchedForSystem(String theSearchedForSystem) {
|
public void setSearchedForSystem(String theSearchedForSystem) {
|
||||||
mySearchedForSystem = theSearchedForSystem;
|
mySearchedForSystem = theSearchedForSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isCodeIsAbstract() {
|
||||||
|
return myCodeIsAbstract;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCodeIsAbstract(boolean theCodeIsAbstract) {
|
||||||
|
myCodeIsAbstract = theCodeIsAbstract;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFound() {
|
||||||
|
return myFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFound(boolean theFound) {
|
||||||
|
myFound = theFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void throwNotFoundIfAppropriate() {
|
||||||
|
if (isFound() == false) {
|
||||||
|
throw new ResourceNotFoundException("Unable to find code[" + getSearchedForCode() + "] in system[" + getSearchedForSystem() + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Parameters toParameters() {
|
||||||
|
Parameters retVal = new Parameters();
|
||||||
|
|
||||||
|
retVal.addParameter().setName("name").setValue(new StringType(getCodeSystemDisplayName()));
|
||||||
|
if (isNotBlank(getCodeSystemVersion())) {
|
||||||
|
retVal.addParameter().setName("version").setValue(new StringType(getCodeSystemVersion()));
|
||||||
|
}
|
||||||
|
retVal.addParameter().setName("display").setValue(new StringType(getCodeDisplay()));
|
||||||
|
retVal.addParameter().setName("abstract").setValue(new BooleanType(isCodeIsAbstract()));
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,20 +225,13 @@ public class FhirResourceDaoCodeSystemDstu3 extends FhirResourceDaoDstu3<CodeSys
|
||||||
} else if (cs.getContent() == CodeSystemContentMode.COMPLETE || cs.getContent() == null) {
|
} else if (cs.getContent() == CodeSystemContentMode.COMPLETE || cs.getContent() == null) {
|
||||||
ourLog.info("CodeSystem {} has a status of {}, going to store concepts in terminology tables", retVal.getIdDt().getValue(), cs.getContentElement().getValueAsString());
|
ourLog.info("CodeSystem {} has a status of {}, going to store concepts in terminology tables", retVal.getIdDt().getValue(), cs.getContentElement().getValueAsString());
|
||||||
|
|
||||||
TermCodeSystemVersion persCs = myCsvDao.findByCodeSystemResourceAndVersion(codeSystemResourcePid, retVal.getVersion());
|
TermCodeSystemVersion persCs = new TermCodeSystemVersion();
|
||||||
if (persCs != null) {
|
|
||||||
ourLog.info("Code system version already exists in database");
|
|
||||||
} else {
|
|
||||||
|
|
||||||
persCs = new TermCodeSystemVersion();
|
|
||||||
persCs.setResource(retVal);
|
persCs.setResource(retVal);
|
||||||
persCs.getConcepts().addAll(toPersistedConcepts(cs.getConcept(), persCs));
|
persCs.getConcepts().addAll(toPersistedConcepts(cs.getConcept(), persCs));
|
||||||
ourLog.info("Code system has {} concepts", persCs.getConcepts().size());
|
ourLog.info("Code system has {} concepts", persCs.getConcepts().size());
|
||||||
myTerminologySvc.storeNewCodeSystemVersion(codeSystemResourcePid, codeSystemUrl, persCs);
|
myTerminologySvc.storeNewCodeSystemVersion(codeSystemResourcePid, codeSystemUrl, persCs);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
|
|
|
@ -219,7 +219,7 @@ public class FhirResourceDaoCodeSystemR4 extends FhirResourceDaoR4<CodeSystem> i
|
||||||
ourLog.info("CodeSystem {} has a status of {}, going to store concepts in terminology tables", retVal.getIdDt().getValue(), cs.getContentElement().getValueAsString());
|
ourLog.info("CodeSystem {} has a status of {}, going to store concepts in terminology tables", retVal.getIdDt().getValue(), cs.getContentElement().getValueAsString());
|
||||||
|
|
||||||
Long codeSystemResourcePid = retVal.getId();
|
Long codeSystemResourcePid = retVal.getId();
|
||||||
TermCodeSystemVersion persCs = myCsvDao.findByCodeSystemResourceAndVersion(codeSystemResourcePid, retVal.getVersion());
|
TermCodeSystemVersion persCs = myCsvDao.findCurrentVersionForCodeSystemResourcePid(codeSystemResourcePid);
|
||||||
if (persCs != null) {
|
if (persCs != null) {
|
||||||
ourLog.info("Code system version already exists in database");
|
ourLog.info("Code system version already exists in database");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -39,7 +39,7 @@ public abstract class BaseJpaSystemProviderDstu2Plus<T, MT> extends BaseJpaSyste
|
||||||
IBaseParameters retVal = ParametersUtil.newInstance(getContext());
|
IBaseParameters retVal = ParametersUtil.newInstance(getContext());
|
||||||
|
|
||||||
IPrimitiveType<?> string = ParametersUtil.createString(getContext(), "Marked " + count + " resources");
|
IPrimitiveType<?> string = ParametersUtil.createString(getContext(), "Marked " + count + " resources");
|
||||||
ParametersUtil.addParameterToParameters(getContext(), retVal, string, "status");
|
ParametersUtil.addParameterToParameters(getContext(), retVal, "status", string);
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ public abstract class BaseJpaSystemProviderDstu2Plus<T, MT> extends BaseJpaSyste
|
||||||
} else {
|
} else {
|
||||||
string = ParametersUtil.createString(getContext(), "Indexed " + count + " resources");
|
string = ParametersUtil.createString(getContext(), "Indexed " + count + " resources");
|
||||||
}
|
}
|
||||||
ParametersUtil.addParameterToParameters(getContext(), retVal, string, "status");
|
ParametersUtil.addParameterToParameters(getContext(), retVal, "status", string);
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
import org.hl7.fhir.convertors.VersionConvertor_30_40;
|
||||||
import org.hl7.fhir.dstu3.model.*;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.dao.IFhirResourceDaoCodeSystem;
|
import ca.uhn.fhir.jpa.dao.IFhirResourceDaoCodeSystem;
|
||||||
|
@ -32,6 +34,7 @@ import ca.uhn.fhir.rest.annotation.Operation;
|
||||||
import ca.uhn.fhir.rest.annotation.OperationParam;
|
import ca.uhn.fhir.rest.annotation.OperationParam;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
|
|
||||||
public class BaseJpaResourceProviderCodeSystemDstu3 extends JpaResourceProviderDstu3<CodeSystem> {
|
public class BaseJpaResourceProviderCodeSystemDstu3 extends JpaResourceProviderDstu3<CodeSystem> {
|
||||||
|
|
||||||
|
@ -56,17 +59,11 @@ public class BaseJpaResourceProviderCodeSystemDstu3 extends JpaResourceProviderD
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
LookupCodeResult result = dao.lookupCode(theCode, theSystem, theCoding, theRequestDetails);
|
LookupCodeResult result = dao.lookupCode(theCode, theSystem, theCoding, theRequestDetails);
|
||||||
if (result.isFound()==false) {
|
result.throwNotFoundIfAppropriate();
|
||||||
throw new ResourceNotFoundException("Unable to find code[" + result.getSearchedForCode() + "] in system[" + result.getSearchedForSystem() + "]");
|
org.hl7.fhir.r4.model.Parameters parametersR4 = result.toParameters();
|
||||||
}
|
return VersionConvertor_30_40.convertParameters(parametersR4);
|
||||||
Parameters retVal = new Parameters();
|
} catch (FHIRException e) {
|
||||||
retVal.addParameter().setName("name").setValue(new StringType(result.getCodeSystemDisplayName()));
|
throw new InternalErrorException(e);
|
||||||
if (isNotBlank(result.getCodeSystemVersion())) {
|
|
||||||
retVal.addParameter().setName("version").setValue(new StringType(result.getCodeSystemVersion()));
|
|
||||||
}
|
|
||||||
retVal.addParameter().setName("display").setValue(new StringType(result.getCodeDisplay()));
|
|
||||||
retVal.addParameter().setName("abstract").setValue(new BooleanType(result.isCodeIsAbstract()));
|
|
||||||
return retVal;
|
|
||||||
} finally {
|
} finally {
|
||||||
endRequest(theServletRequest);
|
endRequest(theServletRequest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,17 +56,8 @@ public class BaseJpaResourceProviderCodeSystemR4 extends JpaResourceProviderR4<C
|
||||||
try {
|
try {
|
||||||
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept> dao = (IFhirResourceDaoCodeSystem<CodeSystem, Coding, CodeableConcept>) getDao();
|
||||||
LookupCodeResult result = dao.lookupCode(theCode, theSystem, theCoding, theRequestDetails);
|
LookupCodeResult result = dao.lookupCode(theCode, theSystem, theCoding, theRequestDetails);
|
||||||
if (result.isFound()==false) {
|
result.throwNotFoundIfAppropriate();
|
||||||
throw new ResourceNotFoundException("Unable to find code[" + result.getSearchedForCode() + "] in system[" + result.getSearchedForSystem() + "]");
|
return result.toParameters();
|
||||||
}
|
|
||||||
Parameters retVal = new Parameters();
|
|
||||||
retVal.addParameter().setName("name").setValue(new StringType(result.getCodeSystemDisplayName()));
|
|
||||||
if (isNotBlank(result.getCodeSystemVersion())) {
|
|
||||||
retVal.addParameter().setName("version").setValue(new StringType(result.getCodeSystemVersion()));
|
|
||||||
}
|
|
||||||
retVal.addParameter().setName("display").setValue(new StringType(result.getCodeDisplay()));
|
|
||||||
retVal.addParameter().setName("abstract").setValue(new BooleanType(result.isCodeIsAbstract()));
|
|
||||||
return retVal;
|
|
||||||
} finally {
|
} finally {
|
||||||
endRequest(theServletRequest);
|
endRequest(theServletRequest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -299,8 +299,8 @@ public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private TermConcept fetchLoadedCode(Long theCodeSystemResourcePid, Long theCodeSystemVersionPid, String theCode) {
|
private TermConcept fetchLoadedCode(Long theCodeSystemResourcePid, String theCode) {
|
||||||
TermCodeSystemVersion codeSystem = myCodeSystemVersionDao.findByCodeSystemResourceAndVersion(theCodeSystemResourcePid, theCodeSystemVersionPid);
|
TermCodeSystemVersion codeSystem = myCodeSystemVersionDao.findCurrentVersionForCodeSystemResourcePid(theCodeSystemResourcePid);
|
||||||
return myConceptDao.findByCodeSystemAndCode(codeSystem, theCode);
|
return myConceptDao.findByCodeSystemAndCode(codeSystem, theCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc
|
||||||
public Set<TermConcept> findCodesAbove(Long theCodeSystemResourcePid, Long theCodeSystemVersionPid, String theCode) {
|
public Set<TermConcept> findCodesAbove(Long theCodeSystemResourcePid, Long theCodeSystemVersionPid, String theCode) {
|
||||||
StopWatch stopwatch = new StopWatch();
|
StopWatch stopwatch = new StopWatch();
|
||||||
|
|
||||||
TermConcept concept = fetchLoadedCode(theCodeSystemResourcePid, theCodeSystemVersionPid, theCode);
|
TermConcept concept = fetchLoadedCode(theCodeSystemResourcePid, theCode);
|
||||||
if (concept == null) {
|
if (concept == null) {
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
@ -361,7 +361,7 @@ public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc
|
||||||
public Set<TermConcept> findCodesBelow(Long theCodeSystemResourcePid, Long theCodeSystemVersionPid, String theCode) {
|
public Set<TermConcept> findCodesBelow(Long theCodeSystemResourcePid, Long theCodeSystemVersionPid, String theCode) {
|
||||||
Stopwatch stopwatch = Stopwatch.createStarted();
|
Stopwatch stopwatch = Stopwatch.createStarted();
|
||||||
|
|
||||||
TermConcept concept = fetchLoadedCode(theCodeSystemResourcePid, theCodeSystemVersionPid, theCode);
|
TermConcept concept = fetchLoadedCode(theCodeSystemResourcePid, theCode);
|
||||||
if (concept == null) {
|
if (concept == null) {
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ import static org.apache.commons.lang3.StringUtils.trim;
|
||||||
|
|
||||||
public class LoincDocumentOntologyHandler extends BaseHandler implements IRecordHandler {
|
public class LoincDocumentOntologyHandler extends BaseHandler implements IRecordHandler {
|
||||||
|
|
||||||
public static final String DOCUMENT_ONTOLOGY_CODES_VS_ID = "DOCUMENT_ONTOLOGY_CODES_VS";
|
public static final String DOCUMENT_ONTOLOGY_CODES_VS_ID = "DOCUMENT-ONTOLOGY-CODES-VS";
|
||||||
public static final String DOCUMENT_ONTOLOGY_CODES_VS_URI = "http://loinc.org/document-ontology-codes";
|
public static final String DOCUMENT_ONTOLOGY_CODES_VS_URI = "http://loinc.org/document-ontology-codes";
|
||||||
public static final String DOCUMENT_ONTOLOGY_CODES_VS_NAME = "LOINC Document Ontology Codes";
|
public static final String DOCUMENT_ONTOLOGY_CODES_VS_NAME = "LOINC Document Ontology Codes";
|
||||||
private final Map<String, TermConcept> myCode2Concept;
|
private final Map<String, TermConcept> myCode2Concept;
|
||||||
|
|
|
@ -20,7 +20,7 @@ import static org.apache.commons.lang3.StringUtils.trim;
|
||||||
|
|
||||||
public class LoincPartRelatedCodeMappingHandler implements IRecordHandler {
|
public class LoincPartRelatedCodeMappingHandler implements IRecordHandler {
|
||||||
|
|
||||||
public static final String LOINC_TO_SNOMED_CM_ID = "LOINC_TO_SNOMED_CM";
|
public static final String LOINC_TO_SNOMED_CM_ID = "LOINC-TO-SNOMED-CM";
|
||||||
private static final Logger ourLog = LoggerFactory.getLogger(LoincPartRelatedCodeMappingHandler.class);
|
private static final Logger ourLog = LoggerFactory.getLogger(LoincPartRelatedCodeMappingHandler.class);
|
||||||
private final Map<String, TermConcept> myCode2Concept;
|
private final Map<String, TermConcept> myCode2Concept;
|
||||||
private final TermCodeSystemVersion myCodeSystemVersion;
|
private final TermCodeSystemVersion myCodeSystemVersion;
|
||||||
|
|
|
@ -18,14 +18,14 @@ import static org.apache.commons.lang3.StringUtils.trim;
|
||||||
|
|
||||||
public class LoincRsnaPlaybookHandler implements IRecordHandler {
|
public class LoincRsnaPlaybookHandler implements IRecordHandler {
|
||||||
|
|
||||||
public static final String RSNA_CODES_VS_ID = "RSNA_LOINC_CODES_VS";
|
public static final String RSNA_CODES_VS_ID = "RSNA-LOINC-CODES-VS";
|
||||||
public static final String RSNA_CODES_VS_URI = "http://loinc.org/rsna-codes";
|
public static final String RSNA_CODES_VS_URI = "http://loinc.org/rsna-codes";
|
||||||
public static final String RSNA_CODES_VS_NAME = "RSNA Playbook";
|
public static final String RSNA_CODES_VS_NAME = "RSNA Playbook";
|
||||||
public static final String RID_MAPPING_CM_ID = "LOINC_TO_RID_CODES_CM";
|
public static final String RID_MAPPING_CM_ID = "LOINC-TO-RID-CODES-CM";
|
||||||
public static final String RID_MAPPING_CM_URI = "http://loinc.org/rid-codes";
|
public static final String RID_MAPPING_CM_URI = "http://loinc.org/rid-codes";
|
||||||
public static final String RID_MAPPING_CM_NAME = "RSNA Playbook RID Codes Mapping";
|
public static final String RID_MAPPING_CM_NAME = "RSNA Playbook RID Codes Mapping";
|
||||||
public static final String RID_CS_URI = "http://rid";
|
public static final String RID_CS_URI = "http://rid";
|
||||||
public static final String RPID_MAPPING_CM_ID = "LOINC_TO_RPID_CODES_CM";
|
public static final String RPID_MAPPING_CM_ID = "LOINC-TO-RPID-CODES-CM";
|
||||||
public static final String RPID_MAPPING_CM_URI = "http://loinc.org/rpid-codes";
|
public static final String RPID_MAPPING_CM_URI = "http://loinc.org/rpid-codes";
|
||||||
public static final String RPID_MAPPING_CM_NAME = "RSNA Playbook RPID Codes Mapping";
|
public static final String RPID_MAPPING_CM_NAME = "RSNA Playbook RPID Codes Mapping";
|
||||||
public static final String RPID_CS_URI = "http://rpid";
|
public static final String RPID_CS_URI = "http://rpid";
|
||||||
|
|
|
@ -8,7 +8,7 @@ import java.util.Map;
|
||||||
|
|
||||||
public class LoincTop2000LabResultsSiHandler extends BaseLoincTop2000LabResultsHandler {
|
public class LoincTop2000LabResultsSiHandler extends BaseLoincTop2000LabResultsHandler {
|
||||||
|
|
||||||
public static final String TOP_2000_SI_VS_ID = "TOP_2000_SI_VS_ID";
|
public static final String TOP_2000_SI_VS_ID = "TOP-2000-LABRESULTS-SI";
|
||||||
public static final String TOP_2000_SI_VS_URI = "http://loinc.org/top-2000-lab-results-si";
|
public static final String TOP_2000_SI_VS_URI = "http://loinc.org/top-2000-lab-results-si";
|
||||||
public static final String TOP_2000_SI_VS_NAME = "Top 2000 Lab Results SI";
|
public static final String TOP_2000_SI_VS_NAME = "Top 2000 Lab Results SI";
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import java.util.Map;
|
||||||
|
|
||||||
public class LoincTop2000LabResultsUsHandler extends BaseLoincTop2000LabResultsHandler {
|
public class LoincTop2000LabResultsUsHandler extends BaseLoincTop2000LabResultsHandler {
|
||||||
|
|
||||||
public static final String TOP_2000_US_VS_ID = "TOP_2000_LABRESULTS_US";
|
public static final String TOP_2000_US_VS_ID = "TOP-2000-LABRESULTS-US";
|
||||||
public static final String TOP_2000_US_VS_URI = "http://loinc.org/top-2000-lab-results-us";
|
public static final String TOP_2000_US_VS_URI = "http://loinc.org/top-2000-lab-results-us";
|
||||||
public static final String TOP_2000_US_VS_NAME = "Top 2000 Lab Results US";
|
public static final String TOP_2000_US_VS_NAME = "Top 2000 Lab Results US";
|
||||||
|
|
||||||
|
|
|
@ -1,34 +1,92 @@
|
||||||
package ca.uhn.fhir.jpa.term;
|
package ca.uhn.fhir.jpa.term;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
||||||
|
import ca.uhn.fhir.jpa.dao.IFhirResourceDaoCodeSystem;
|
||||||
import ca.uhn.fhir.jpa.dao.dstu3.BaseJpaDstu3Test;
|
import ca.uhn.fhir.jpa.dao.dstu3.BaseJpaDstu3Test;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
import org.hl7.fhir.convertors.VersionConvertor_30_40;
|
||||||
|
import org.hl7.fhir.dstu3.model.StringType;
|
||||||
|
import org.hl7.fhir.dstu3.model.ValueSet;
|
||||||
|
import org.hl7.fhir.dstu3.model.Parameters;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.containsInAnyOrder;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
public class TerminologyLoaderSvcIntegrationDstu3Test extends BaseJpaDstu3Test {
|
public class TerminologyLoaderSvcIntegrationDstu3Test extends BaseJpaDstu3Test {
|
||||||
|
|
||||||
|
private static final Logger ourLog = LoggerFactory.getLogger(TerminologyLoaderSvcIntegrationDstu3Test.class);
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TerminologyLoaderSvcImpl myLoader;
|
private IHapiTerminologyLoaderSvc myLoader;
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after() {
|
||||||
|
myDaoConfig.setDeferIndexingForCodesystemsOfSize(new DaoConfig().getDeferIndexingForCodesystemsOfSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
myDaoConfig.setDeferIndexingForCodesystemsOfSize(20000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExpandWithProperty() throws Exception {
|
||||||
|
ZipCollectionBuilder files = new ZipCollectionBuilder();
|
||||||
|
TerminologyLoaderSvcLoincTest.createLoincBundle(files);
|
||||||
|
myLoader.loadLoinc(files.getFiles(), mySrd);
|
||||||
|
|
||||||
|
ValueSet input = new ValueSet();
|
||||||
|
input
|
||||||
|
.getCompose()
|
||||||
|
.addInclude()
|
||||||
|
.setSystem(IHapiTerminologyLoaderSvc.LOINC_URL)
|
||||||
|
.addFilter()
|
||||||
|
.setProperty("SCALE_TYP")
|
||||||
|
.setOp(ValueSet.FilterOperator.EQUAL)
|
||||||
|
.setValue("Ord");
|
||||||
|
ValueSet expanded = myValueSetDao.expand(input, null);
|
||||||
|
Set<String> codes = toExpandedCodes(expanded);
|
||||||
|
ourLog.info(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(expanded));
|
||||||
|
assertThat(codes, containsInAnyOrder("1001-7", "61438-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLookupWithProperties() throws Exception {
|
||||||
|
ZipCollectionBuilder files = new ZipCollectionBuilder();
|
||||||
|
TerminologyLoaderSvcLoincTest.createLoincBundle(files);
|
||||||
|
myLoader.loadLoinc(files.getFiles(), mySrd);
|
||||||
|
|
||||||
|
IFhirResourceDaoCodeSystem.LookupCodeResult result = myCodeSystemDao.lookupCode(new StringType("10013-1"), new StringType(IHapiTerminologyLoaderSvc.LOINC_URL), null, mySrd);
|
||||||
|
org.hl7.fhir.r4.model.Parameters parametersR4 = result.toParameters();
|
||||||
|
Parameters parameters = VersionConvertor_30_40.convertParameters(parametersR4);
|
||||||
|
|
||||||
|
ourLog.info(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(parameters));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<String> toExpandedCodes(ValueSet theExpanded) {
|
||||||
|
return theExpanded
|
||||||
|
.getExpansion()
|
||||||
|
.getContains()
|
||||||
|
.stream()
|
||||||
|
.map(ValueSet.ValueSetExpansionContainsComponent::getCode)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
@AfterClass
|
@AfterClass
|
||||||
public static void afterClassClearContext() {
|
public static void afterClassClearContext() {
|
||||||
TestUtil.clearAllStaticFieldsForUnitTest();
|
TestUtil.clearAllStaticFieldsForUnitTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testLoadAndStoreLoinc() throws Exception {
|
|
||||||
ZipCollectionBuilder files = new ZipCollectionBuilder();
|
|
||||||
TerminologyLoaderSvcLoincTest.createLoincBundle(files);
|
|
||||||
|
|
||||||
myLoader.loadLoinc(files.getFiles(), mySrd);
|
|
||||||
|
|
||||||
Thread.sleep(120000);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,15 @@ public class TerminologyLoaderSvcLoincTest {
|
||||||
mySvc.loadLoinc(myFiles.getFiles(), details);
|
mySvc.loadLoinc(myFiles.getFiles(), details);
|
||||||
|
|
||||||
verify(myTermSvcDstu3, times(1)).storeNewCodeSystemVersion(mySystemCaptor.capture(), myCsvCaptor.capture(), any(RequestDetails.class), myValueSetsCaptor.capture(), myConceptMapCaptor.capture());
|
verify(myTermSvcDstu3, times(1)).storeNewCodeSystemVersion(mySystemCaptor.capture(), myCsvCaptor.capture(), any(RequestDetails.class), myValueSetsCaptor.capture(), myConceptMapCaptor.capture());
|
||||||
|
ValueSet input = new ValueSet();
|
||||||
|
input
|
||||||
|
.getCompose()
|
||||||
|
.addInclude()
|
||||||
|
.setSystem(IHapiTerminologyLoaderSvc.LOINC_URL)
|
||||||
|
.addFilter()
|
||||||
|
.setProperty("SCALE_TYP")
|
||||||
|
.setOp(ValueSet.FilterOperator.EQUAL)
|
||||||
|
.setValue("Ord");
|
||||||
|
|
||||||
TermCodeSystemVersion ver = myCsvCaptor.getValue();
|
TermCodeSystemVersion ver = myCsvCaptor.getValue();
|
||||||
|
|
||||||
|
|
12
pom.xml
12
pom.xml
|
@ -1114,18 +1114,10 @@
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.7.0</version>
|
<version>3.7.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>1.7</source>
|
<source>1.8</source>
|
||||||
<target>1.7</target>
|
<target>1.8</target>
|
||||||
<!--
|
|
||||||
We compile the unit tests at Java 8. Might as well since they
|
|
||||||
need Java 8 in order to run (Jetty needs 8) so this way we can
|
|
||||||
use nice java 8 features in tests at least
|
|
||||||
-->
|
|
||||||
<testSource>1.8</testSource>
|
|
||||||
<testTarget>1.8</testTarget>
|
|
||||||
<forceJavacCompilerUse>true</forceJavacCompilerUse>
|
<forceJavacCompilerUse>true</forceJavacCompilerUse>
|
||||||
<encoding>UTF-8</encoding>
|
<encoding>UTF-8</encoding>
|
||||||
|
|
||||||
<fork>true</fork>
|
<fork>true</fork>
|
||||||
<meminitial>500m</meminitial>
|
<meminitial>500m</meminitial>
|
||||||
<maxmem>2000m</maxmem>
|
<maxmem>2000m</maxmem>
|
||||||
|
|
Loading…
Reference in New Issue