Merge branch 'master' of github.com:jamesagnew/hapi-fhir
This commit is contained in:
commit
030b33a0f2
|
@ -638,7 +638,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
}
|
}
|
||||||
|
|
||||||
if (myDaoConfig.isMarkResourcesForReindexingUponSearchParameterChange()) {
|
if (myDaoConfig.isMarkResourcesForReindexingUponSearchParameterChange()) {
|
||||||
if (isNotBlank(theExpression)) {
|
if (isNotBlank(theExpression) && theExpression.contains(".")) {
|
||||||
final String resourceType = theExpression.substring(0, theExpression.indexOf('.'));
|
final String resourceType = theExpression.substring(0, theExpression.indexOf('.'));
|
||||||
ourLog.debug("Marking all resources of type {} for reindexing due to updated search parameter with path: {}", resourceType, theExpression);
|
ourLog.debug("Marking all resources of type {} for reindexing due to updated search parameter with path: {}", resourceType, theExpression);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -108,13 +107,48 @@ public class FhirResourceDaoSearchParameterR4 extends FhirResourceDaoR4<SearchPa
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
FHIRPathEngine fhirPathEngine = new FHIRPathEngine(new HapiWorkerContext(theContext, VALIDATION_SUPPORT));
|
theExpression = theExpression.trim();
|
||||||
try {
|
|
||||||
fhirPathEngine.parse(theExpression);
|
|
||||||
} catch (FHIRLexer.FHIRLexerException e) {
|
|
||||||
throw new UnprocessableEntityException("Invalid SearchParameter.expression value \"" + theExpression + "\": " + e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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 {
|
||||||
|
|
||||||
|
FHIRPathEngine fhirPathEngine = new FHIRPathEngine(new HapiWorkerContext(theContext, VALIDATION_SUPPORT));
|
||||||
|
try {
|
||||||
|
fhirPathEngine.parse(theExpression);
|
||||||
|
} catch (FHIRLexer.FHIRLexerException e) {
|
||||||
|
throw new UnprocessableEntityException("Invalid SearchParameter.expression value \"" + theExpression + "\": " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
} // if have expression
|
} // if have expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,7 @@ import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.hl7.fhir.r4.model.*;
|
import org.hl7.fhir.r4.model.*;
|
||||||
import org.hl7.fhir.r4.model.Appointment.AppointmentStatus;
|
import org.hl7.fhir.r4.model.Appointment.AppointmentStatus;
|
||||||
import org.hl7.fhir.r4.model.Enumerations.AdministrativeGender;
|
import org.hl7.fhir.r4.model.Enumerations.AdministrativeGender;
|
||||||
import org.junit.After;
|
import org.junit.*;
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.internal.util.collections.ListUtil;
|
import org.mockito.internal.util.collections.ListUtil;
|
||||||
import org.springframework.transaction.TransactionStatus;
|
import org.springframework.transaction.TransactionStatus;
|
||||||
import org.springframework.transaction.support.TransactionCallback;
|
import org.springframework.transaction.support.TransactionCallback;
|
||||||
|
@ -61,6 +58,7 @@ public class FhirResourceDaoR4SearchCustomSearchParamTest extends BaseJpaR4Test
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore
|
||||||
public void testCreateInvalidParamInvalidResourceName() {
|
public void testCreateInvalidParamInvalidResourceName() {
|
||||||
SearchParameter fooSp = new SearchParameter();
|
SearchParameter fooSp = new SearchParameter();
|
||||||
fooSp.addBase("Patient");
|
fooSp.addBase("Patient");
|
||||||
|
@ -96,6 +94,7 @@ public class FhirResourceDaoR4SearchCustomSearchParamTest extends BaseJpaR4Test
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore
|
||||||
public void testCreateInvalidParamNoResourceName() {
|
public void testCreateInvalidParamNoResourceName() {
|
||||||
SearchParameter fooSp = new SearchParameter();
|
SearchParameter fooSp = new SearchParameter();
|
||||||
fooSp.addBase("Patient");
|
fooSp.addBase("Patient");
|
||||||
|
@ -243,29 +242,7 @@ public class FhirResourceDaoR4SearchCustomSearchParamTest extends BaseJpaR4Test
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIndexFailsIfInvalidSearchParameterExists() {
|
|
||||||
myDaoConfig.setValidateSearchParameterExpressionsOnSave(false);
|
|
||||||
|
|
||||||
SearchParameter threadIdSp = new SearchParameter();
|
|
||||||
threadIdSp.addBase("Communication");
|
|
||||||
threadIdSp.setCode("has-attachments");
|
|
||||||
threadIdSp.setType(Enumerations.SearchParamType.REFERENCE);
|
|
||||||
threadIdSp.setExpression("Communication.payload[1].contentAttachment is not null");
|
|
||||||
threadIdSp.setXpathUsage(SearchParameter.XPathUsageType.NORMAL);
|
|
||||||
threadIdSp.setStatus(Enumerations.PublicationStatus.ACTIVE);
|
|
||||||
mySearchParameterDao.create(threadIdSp, mySrd);
|
|
||||||
mySearchParamRegsitry.forceRefresh();
|
|
||||||
|
|
||||||
Communication com = new Communication();
|
|
||||||
com.setStatus(Communication.CommunicationStatus.INPROGRESS);
|
|
||||||
try {
|
|
||||||
myCommunicationDao.create(com, mySrd);
|
|
||||||
fail();
|
|
||||||
} catch (InternalErrorException e) {
|
|
||||||
assertThat(e.getMessage(), startsWith("Failed to extract values from resource using FHIRPath \"Communication.payload[1].contentAttachment is not null\": org.hl7.fhir"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOverrideAndDisableBuiltInSearchParametersWithOverridingDisabled() {
|
public void testOverrideAndDisableBuiltInSearchParametersWithOverridingDisabled() {
|
||||||
|
@ -430,7 +407,7 @@ public class FhirResourceDaoR4SearchCustomSearchParamTest extends BaseJpaR4Test
|
||||||
mySearchParameterDao.create(threadIdSp, mySrd);
|
mySearchParameterDao.create(threadIdSp, mySrd);
|
||||||
fail();
|
fail();
|
||||||
} catch (UnprocessableEntityException e) {
|
} catch (UnprocessableEntityException e) {
|
||||||
assertThat(e.getMessage(), startsWith("The expression \"Communication.payload[1].contentAttachment is not null\" can not be evaluated and may be invalid: "));
|
assertThat(e.getMessage(), startsWith("Invalid SearchParameter.expression value \"Communication.payload[1].contentAttachment is not null\""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue