Test fixes
This commit is contained in:
parent
9672dac827
commit
78a323f105
|
@ -18,27 +18,6 @@ public class ResourceProviderDstu3BundleTest extends BaseResourceProviderDstu3Te
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderDstu3BundleTest.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderDstu3BundleTest.class);
|
||||||
|
|
||||||
/**
|
|
||||||
* See #401
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testBundlePreservesFullUrl() {
|
|
||||||
|
|
||||||
Bundle bundle = new Bundle();
|
|
||||||
bundle.setType(BundleType.DOCUMENT);
|
|
||||||
|
|
||||||
Composition composition = new Composition();
|
|
||||||
composition.setTitle("Visit Summary");
|
|
||||||
bundle.addEntry().setFullUrl("http://foo").setResource(composition);
|
|
||||||
|
|
||||||
IIdType id = ourClient.create().resource(bundle).execute().getId();
|
|
||||||
|
|
||||||
Bundle retBundle = ourClient.read().resource(Bundle.class).withId(id).execute();
|
|
||||||
ourLog.info(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(retBundle));
|
|
||||||
|
|
||||||
assertEquals("http://foo", bundle.getEntry().get(0).getFullUrl());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testProcessMessage() {
|
public void testProcessMessage() {
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import org.hl7.fhir.r4.model.Bundle;
|
||||||
import org.hl7.fhir.r4.model.Bundle.BundleType;
|
import org.hl7.fhir.r4.model.Bundle.BundleType;
|
||||||
import org.hl7.fhir.r4.model.Composition;
|
import org.hl7.fhir.r4.model.Composition;
|
||||||
import org.hl7.fhir.r4.model.Parameters;
|
import org.hl7.fhir.r4.model.Parameters;
|
||||||
|
import org.hl7.fhir.r4.model.Patient;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -25,11 +26,11 @@ public class ResourceProviderR4BundleTest extends BaseResourceProviderR4Test {
|
||||||
public void testBundlePreservesFullUrl() {
|
public void testBundlePreservesFullUrl() {
|
||||||
|
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
bundle.setType(BundleType.DOCUMENT);
|
bundle.setType(BundleType.COLLECTION);
|
||||||
|
|
||||||
Composition composition = new Composition();
|
Patient composition = new Patient();
|
||||||
composition.setTitle("Visit Summary");
|
composition.setActive(true);
|
||||||
bundle.addEntry().setFullUrl("http://foo").setResource(composition);
|
bundle.addEntry().setFullUrl("http://foo/").setResource(composition);
|
||||||
|
|
||||||
IIdType id = ourClient.create().resource(bundle).execute().getId();
|
IIdType id = ourClient.create().resource(bundle).execute().getId();
|
||||||
|
|
||||||
|
@ -37,7 +38,7 @@ public class ResourceProviderR4BundleTest extends BaseResourceProviderR4Test {
|
||||||
|
|
||||||
ourLog.info(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(retBundle));
|
ourLog.info(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(retBundle));
|
||||||
|
|
||||||
assertEquals("http://foo", bundle.getEntry().get(0).getFullUrl());
|
assertEquals("http://foo/", bundle.getEntry().get(0).getFullUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -400,6 +400,13 @@ public abstract class BaseSearchParamExtractor implements ISearchParamExtractor
|
||||||
for (String nextPath : nextPathsSplit) {
|
for (String nextPath : nextPathsSplit) {
|
||||||
List<? extends IBase> allValues;
|
List<? extends IBase> allValues;
|
||||||
|
|
||||||
|
// This path is hard to parse and isn't likely to produce anything useful anyway
|
||||||
|
if (myContext.getVersion().getVersion().equals(FhirVersionEnum.DSTU2)) {
|
||||||
|
if (nextPath.equals("Bundle.entry.resource(0)")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nextPath = trim(nextPath);
|
nextPath = trim(nextPath);
|
||||||
IValueExtractor allValuesFunc = getPathValueExtractor(theResource, nextPath);
|
IValueExtractor allValuesFunc = getPathValueExtractor(theResource, nextPath);
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -39,9 +39,12 @@ import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.instance.model.api.*;
|
import org.hl7.fhir.instance.model.api.IBase;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseExtension;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseReference;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.hl7.fhir.r4.model.CanonicalType;
|
import org.hl7.fhir.r4.model.CanonicalType;
|
||||||
import org.hl7.fhir.r4.model.Reference;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@ -100,8 +103,8 @@ public class ResourceLinkExtractor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void extractResourceLinks(ResourceIndexedSearchParams theParams, ResourceTable theEntity, Date theUpdateTime, IResourceLinkResolver theResourceLinkResolver, String theResourceType, RuntimeSearchParam nextSpDef, String theNextPathsUnsplit, boolean theMultiType, PathAndRef nextPathAndRef, boolean theFailOnInvalidReference, RequestDetails theRequest) {
|
private void extractResourceLinks(ResourceIndexedSearchParams theParams, ResourceTable theEntity, Date theUpdateTime, IResourceLinkResolver theResourceLinkResolver, String theResourceType, RuntimeSearchParam theRuntimeSearchParam, String thePath, boolean theMultiType, PathAndRef thePathAndRef, boolean theFailOnInvalidReference, RequestDetails theRequest) {
|
||||||
Object nextObject = nextPathAndRef.getRef();
|
Object nextObject = thePathAndRef.getRef();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A search parameter on an extension field that contains
|
* A search parameter on an extension field that contains
|
||||||
|
@ -142,35 +145,40 @@ public class ResourceLinkExtractor {
|
||||||
nextId = nextValue.getResource().getIdElement();
|
nextId = nextValue.getResource().getIdElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nextId.isEmpty() || nextId.getValue().startsWith("#")) {
|
|
||||||
// This is a blank or contained resource reference
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (nextObject instanceof IBaseResource) {
|
} else if (nextObject instanceof IBaseResource) {
|
||||||
nextId = ((IBaseResource) nextObject).getIdElement();
|
nextId = ((IBaseResource) nextObject).getIdElement().toUnqualified();
|
||||||
if (nextId == null || nextId.hasIdPart() == false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (myContext.getElementDefinition((Class<? extends IBase>) nextObject.getClass()).getName().equals("uri")) {
|
|
||||||
return;
|
|
||||||
} else if (theResourceType.equals("Consent") && nextPathAndRef.getPath().equals("Consent.source")) {
|
|
||||||
// Consent#source-identifier has a path that isn't typed - This is a one-off to deal with that
|
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
if (!theMultiType) {
|
@SuppressWarnings("unchecked")
|
||||||
if (nextSpDef.getName().equals("sourceuri")) {
|
Class<? extends IBase> clazz = (Class<? extends IBase>) nextObject.getClass();
|
||||||
|
if (myContext.getElementDefinition(clazz).getName().equals("uri")) {
|
||||||
|
return;
|
||||||
|
} else if (theResourceType.equals("Consent") && thePathAndRef.getPath().equals("Consent.source")) {
|
||||||
|
// Consent#source-identifier has a path that isn't typed - This is a one-off to deal with that
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (!theMultiType) {
|
||||||
|
if (theRuntimeSearchParam.getName().equals("sourceuri")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new ConfigurationException("Search param " + theRuntimeSearchParam.getName() + " is of unexpected datatype: " + nextObject.getClass());
|
||||||
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
throw new ConfigurationException("Search param " + nextSpDef.getName() + " is of unexpected datatype: " + nextObject.getClass());
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
theParams.myPopulatedResourceLinkParameters.add(nextSpDef.getName());
|
if (nextId == null ||
|
||||||
|
nextId.isEmpty() ||
|
||||||
|
nextId.hasIdPart() == false ||
|
||||||
|
nextId.getValue().startsWith("#") ||
|
||||||
|
nextId.getValue().startsWith("urn:")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
theParams.myPopulatedResourceLinkParameters.add(theRuntimeSearchParam.getName());
|
||||||
|
|
||||||
if (LogicalReferenceHelper.isLogicalReference(myModelConfig, nextId)) {
|
if (LogicalReferenceHelper.isLogicalReference(myModelConfig, nextId)) {
|
||||||
ResourceLink resourceLink = new ResourceLink(nextPathAndRef.getPath(), theEntity, nextId, theUpdateTime);
|
ResourceLink resourceLink = new ResourceLink(thePathAndRef.getPath(), theEntity, nextId, theUpdateTime);
|
||||||
if (theParams.myLinks.add(resourceLink)) {
|
if (theParams.myLinks.add(resourceLink)) {
|
||||||
ourLog.debug("Indexing remote resource reference URL: {}", nextId);
|
ourLog.debug("Indexing remote resource reference URL: {}", nextId);
|
||||||
}
|
}
|
||||||
|
@ -180,7 +188,7 @@ public class ResourceLinkExtractor {
|
||||||
String baseUrl = nextId.getBaseUrl();
|
String baseUrl = nextId.getBaseUrl();
|
||||||
String typeString = nextId.getResourceType();
|
String typeString = nextId.getResourceType();
|
||||||
if (isBlank(typeString)) {
|
if (isBlank(typeString)) {
|
||||||
String msg = "Invalid resource reference found at path[" + theNextPathsUnsplit + "] - Does not contain resource type - " + nextId.getValue();
|
String msg = "Invalid resource reference found at path[" + thePath + "] - Does not contain resource type - " + nextId.getValue();
|
||||||
if (theFailOnInvalidReference) {
|
if (theFailOnInvalidReference) {
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
} else {
|
} else {
|
||||||
|
@ -192,7 +200,7 @@ public class ResourceLinkExtractor {
|
||||||
try {
|
try {
|
||||||
resourceDefinition = myContext.getResourceDefinition(typeString);
|
resourceDefinition = myContext.getResourceDefinition(typeString);
|
||||||
} catch (DataFormatException e) {
|
} catch (DataFormatException e) {
|
||||||
String msg = "Invalid resource reference found at path[" + theNextPathsUnsplit + "] - Resource type is unknown or not supported on this server - " + nextId.getValue();
|
String msg = "Invalid resource reference found at path[" + thePath + "] - Resource type is unknown or not supported on this server - " + nextId.getValue();
|
||||||
if (theFailOnInvalidReference) {
|
if (theFailOnInvalidReference) {
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
} else {
|
} else {
|
||||||
|
@ -201,12 +209,18 @@ public class ResourceLinkExtractor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!theRuntimeSearchParam.getTargets().isEmpty()) {
|
||||||
|
if (!theRuntimeSearchParam.getTargets().contains(typeString)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isNotBlank(baseUrl)) {
|
if (isNotBlank(baseUrl)) {
|
||||||
if (!myModelConfig.getTreatBaseUrlsAsLocal().contains(baseUrl) && !myModelConfig.isAllowExternalReferences()) {
|
if (!myModelConfig.getTreatBaseUrlsAsLocal().contains(baseUrl) && !myModelConfig.isAllowExternalReferences()) {
|
||||||
String msg = myContext.getLocalizer().getMessage(BaseSearchParamExtractor.class, "externalReferenceNotAllowed", nextId.getValue());
|
String msg = myContext.getLocalizer().getMessage(BaseSearchParamExtractor.class, "externalReferenceNotAllowed", nextId.getValue());
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
} else {
|
} else {
|
||||||
ResourceLink resourceLink = new ResourceLink(nextPathAndRef.getPath(), theEntity, nextId, theUpdateTime);
|
ResourceLink resourceLink = new ResourceLink(thePathAndRef.getPath(), theEntity, nextId, theUpdateTime);
|
||||||
if (theParams.myLinks.add(resourceLink)) {
|
if (theParams.myLinks.add(resourceLink)) {
|
||||||
ourLog.debug("Indexing remote resource reference URL: {}", nextId);
|
ourLog.debug("Indexing remote resource reference URL: {}", nextId);
|
||||||
}
|
}
|
||||||
|
@ -217,7 +231,7 @@ public class ResourceLinkExtractor {
|
||||||
Class<? extends IBaseResource> type = resourceDefinition.getImplementingClass();
|
Class<? extends IBaseResource> type = resourceDefinition.getImplementingClass();
|
||||||
String id = nextId.getIdPart();
|
String id = nextId.getIdPart();
|
||||||
if (StringUtils.isBlank(id)) {
|
if (StringUtils.isBlank(id)) {
|
||||||
String msg = "Invalid resource reference found at path[" + theNextPathsUnsplit + "] - Does not contain resource ID - " + nextId.getValue();
|
String msg = "Invalid resource reference found at path[" + thePath + "] - Does not contain resource ID - " + nextId.getValue();
|
||||||
if (theFailOnInvalidReference) {
|
if (theFailOnInvalidReference) {
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
} else {
|
} else {
|
||||||
|
@ -227,7 +241,7 @@ public class ResourceLinkExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
theResourceLinkResolver.validateTypeOrThrowException(type);
|
theResourceLinkResolver.validateTypeOrThrowException(type);
|
||||||
ResourceLink resourceLink = createResourceLink(theEntity, theUpdateTime, theResourceLinkResolver, nextSpDef, theNextPathsUnsplit, nextPathAndRef, nextId, typeString, type, id, theRequest);
|
ResourceLink resourceLink = createResourceLink(theEntity, theUpdateTime, theResourceLinkResolver, theRuntimeSearchParam, thePath, thePathAndRef, nextId, typeString, type, id, theRequest);
|
||||||
if (resourceLink == null) return;
|
if (resourceLink == null) return;
|
||||||
theParams.myLinks.add(resourceLink);
|
theParams.myLinks.add(resourceLink);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue