Only use FHIRPath to validate searchparameterr paths in R4
This commit is contained in:
parent
7f6f06dddf
commit
c81a59bb9a
|
@ -2,7 +2,6 @@ package ca.uhn.fhir.jpa.dao.r4;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.fluentpath.IFluentPath;
|
|
||||||
import ca.uhn.fhir.jpa.dao.BaseSearchParamExtractor;
|
import ca.uhn.fhir.jpa.dao.BaseSearchParamExtractor;
|
||||||
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
||||||
import ca.uhn.fhir.jpa.dao.IFhirResourceDaoSearchParameter;
|
import ca.uhn.fhir.jpa.dao.IFhirResourceDaoSearchParameter;
|
||||||
|
@ -106,6 +105,40 @@ public class FhirResourceDaoSearchParameterR4 extends FhirResourceDaoR4<SearchPa
|
||||||
|
|
||||||
throw new UnprocessableEntityException("SearchParameter.expression is missing");
|
throw new UnprocessableEntityException("SearchParameter.expression is missing");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
theExpression = theExpression.trim();
|
||||||
|
|
||||||
|
if (!theContext.getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.R4)) {
|
||||||
|
String[] expressionSplit = BaseSearchParamExtractor.SPLIT.split(theExpression);
|
||||||
|
for (String nextPath : expressionSplit) {
|
||||||
|
nextPath = nextPath.trim();
|
||||||
|
|
||||||
|
int dotIdx = nextPath.indexOf('.');
|
||||||
|
if (dotIdx == -1) {
|
||||||
|
throw new UnprocessableEntityException("Invalid SearchParameter.expression value \"" + nextPath + "\". Must start with a resource name");
|
||||||
|
}
|
||||||
|
|
||||||
|
String resourceName = nextPath.substring(0, dotIdx);
|
||||||
|
try {
|
||||||
|
theContext.getResourceDefinition(resourceName);
|
||||||
|
} catch (DataFormatException e) {
|
||||||
|
throw new UnprocessableEntityException("Invalid SearchParameter.expression value \"" + nextPath + "\": " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theContext.getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.DSTU3)) {
|
||||||
|
if (theDaoConfig.isValidateSearchParameterExpressionsOnSave()) {
|
||||||
|
IBaseResource temporaryInstance = theContext.getResourceDefinition(resourceName).newInstance();
|
||||||
|
try {
|
||||||
|
theContext.newFluentPath().evaluate(temporaryInstance, nextPath, IBase.class);
|
||||||
|
} catch (Exception e) {
|
||||||
|
String msg = theContext.getLocalizer().getMessage(FhirResourceDaoSearchParameterR4.class, "invalidSearchParamExpression", nextPath, e.getMessage());
|
||||||
|
throw new UnprocessableEntityException(msg, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
FHIRPathEngine fhirPathEngine = new FHIRPathEngine(new HapiWorkerContext(theContext, VALIDATION_SUPPORT));
|
FHIRPathEngine fhirPathEngine = new FHIRPathEngine(new HapiWorkerContext(theContext, VALIDATION_SUPPORT));
|
||||||
|
@ -115,6 +148,7 @@ public class FhirResourceDaoSearchParameterR4 extends FhirResourceDaoR4<SearchPa
|
||||||
throw new UnprocessableEntityException("Invalid SearchParameter.expression value \"" + theExpression + "\": " + e.getMessage());
|
throw new UnprocessableEntityException("Invalid SearchParameter.expression value \"" + theExpression + "\": " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
} // if have expression
|
} // if have expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue