Fix $everything operation in generic client if the server returns JSON
This commit is contained in:
parent
11d22b1b1f
commit
3280375486
|
@ -1221,15 +1221,8 @@ public class JsonParser extends BaseParser implements IParser {
|
||||||
assertObjectOfType(resourceTypeObj, JsonValue.ValueType.STRING, "resourceType");
|
assertObjectOfType(resourceTypeObj, JsonValue.ValueType.STRING, "resourceType");
|
||||||
String resourceType = ((JsonString) resourceTypeObj).getString();
|
String resourceType = ((JsonString) resourceTypeObj).getString();
|
||||||
|
|
||||||
RuntimeResourceDefinition def;
|
ParserState<? extends IBaseResource> state = ParserState.getPreResourceInstance(theResourceType, myContext, true, getErrorHandler());
|
||||||
if (theResourceType != null) {
|
state.enteringNewElement(null, resourceType);
|
||||||
def = myContext.getResourceDefinition(theResourceType);
|
|
||||||
} else {
|
|
||||||
def = myContext.getResourceDefinition(resourceType);
|
|
||||||
}
|
|
||||||
|
|
||||||
ParserState<? extends IBaseResource> state = ParserState.getPreResourceInstance(def.getImplementingClass(), myContext, true, getErrorHandler());
|
|
||||||
state.enteringNewElement(null, def.getName());
|
|
||||||
|
|
||||||
parseChildren(object, state);
|
parseChildren(object, state);
|
||||||
|
|
||||||
|
|
|
@ -488,7 +488,7 @@ class ParserState<T> {
|
||||||
} else if ("author".equals(theLocalPart)) {
|
} else if ("author".equals(theLocalPart)) {
|
||||||
push(new AtomAuthorState(myEntry));
|
push(new AtomAuthorState(myEntry));
|
||||||
} else if ("content".equals(theLocalPart)) {
|
} else if ("content".equals(theLocalPart)) {
|
||||||
push(new PreResourceStateHapi(myEntry, myResourceType));
|
push(new PreResourceStateHapi(myEntry, myResourceType).setRequireResourceType(false));
|
||||||
} else if ("summary".equals(theLocalPart)) {
|
} else if ("summary".equals(theLocalPart)) {
|
||||||
push(new XhtmlState(getPreResourceState(), myEntry.getSummary(), false));
|
push(new XhtmlState(getPreResourceState(), myEntry.getSummary(), false));
|
||||||
} else if ("category".equals(theLocalPart)) {
|
} else if ("category".equals(theLocalPart)) {
|
||||||
|
@ -794,7 +794,6 @@ class ParserState<T> {
|
||||||
myPreResourceState = thePreResourceState;
|
myPreResourceState = thePreResourceState;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public void attributeValue(String theName, String theValue) throws DataFormatException {
|
public void attributeValue(String theName, String theValue) throws DataFormatException {
|
||||||
myErrorHandler.unknownAttribute(null, theName);
|
myErrorHandler.unknownAttribute(null, theName);
|
||||||
}
|
}
|
||||||
|
@ -803,7 +802,6 @@ class ParserState<T> {
|
||||||
// ignore by default
|
// ignore by default
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public void enteringNewElement(String theNamespaceURI, String theLocalPart) throws DataFormatException {
|
public void enteringNewElement(String theNamespaceURI, String theLocalPart) throws DataFormatException {
|
||||||
myErrorHandler.unknownElement(null, theLocalPart);
|
myErrorHandler.unknownElement(null, theLocalPart);
|
||||||
}
|
}
|
||||||
|
@ -1053,7 +1051,7 @@ class ParserState<T> {
|
||||||
} else if ("score".equals(theLocalPart)) {
|
} else if ("score".equals(theLocalPart)) {
|
||||||
push(new PrimitiveState(getPreResourceState(), myEntry.getScore()));
|
push(new PrimitiveState(getPreResourceState(), myEntry.getScore()));
|
||||||
} else if ("resource".equals(theLocalPart)) {
|
} else if ("resource".equals(theLocalPart)) {
|
||||||
push(new PreResourceStateHapi(myEntry, myResourceType));
|
push(new PreResourceStateHapi(myEntry, myResourceType).setRequireResourceType(false));
|
||||||
} else if ("deleted".equals(theLocalPart)) {
|
} else if ("deleted".equals(theLocalPart)) {
|
||||||
push(new BundleEntryDeletedState(getPreResourceState(), myEntry));
|
push(new BundleEntryDeletedState(getPreResourceState(), myEntry));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1987,6 +1985,12 @@ class ParserState<T> {
|
||||||
private IBaseResource myInstance;
|
private IBaseResource myInstance;
|
||||||
private FhirVersionEnum myParentVersion;
|
private FhirVersionEnum myParentVersion;
|
||||||
private Class<? extends IBaseResource> myResourceType;
|
private Class<? extends IBaseResource> myResourceType;
|
||||||
|
private boolean myRequireResourceType = true;
|
||||||
|
|
||||||
|
public ParserState<T>.PreResourceState setRequireResourceType(boolean theRequireResourceType) {
|
||||||
|
myRequireResourceType = theRequireResourceType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public PreResourceState(Class<? extends IBaseResource> theResourceType) {
|
public PreResourceState(Class<? extends IBaseResource> theResourceType) {
|
||||||
super(null);
|
super(null);
|
||||||
|
@ -2020,6 +2024,9 @@ class ParserState<T> {
|
||||||
} else {
|
} else {
|
||||||
definition = myContext.getResourceDefinition(myResourceType);
|
definition = myContext.getResourceDefinition(myResourceType);
|
||||||
if (!StringUtils.equals(theLocalPart, definition.getName())) {
|
if (!StringUtils.equals(theLocalPart, definition.getName())) {
|
||||||
|
if (myRequireResourceType) {
|
||||||
|
throw new DataFormatException(myContext.getLocalizer().getMessage(ParserState.class, "wrongResourceTypeFound", definition.getName(), theLocalPart));
|
||||||
|
}
|
||||||
definition = myContext.getResourceDefinition(theLocalPart);
|
definition = myContext.getResourceDefinition(theLocalPart);
|
||||||
if (!(definition instanceof RuntimeResourceDefinition)) {
|
if (!(definition instanceof RuntimeResourceDefinition)) {
|
||||||
throw new DataFormatException("Element '" + theLocalPart + "' is not a resource, expected a resource at this position");
|
throw new DataFormatException("Element '" + theLocalPart + "' is not a resource, expected a resource at this position");
|
||||||
|
@ -2573,13 +2580,19 @@ class ParserState<T> {
|
||||||
return myDt;
|
return myDt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enteringNewElement(String theNamespaceURI, String theLocalPart) throws DataFormatException {
|
||||||
|
// IGNORE - don't handle this as an error, we process these as XML events
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void attributeValue(String theName, String theValue) throws DataFormatException {
|
public void attributeValue(String theName, String theValue) throws DataFormatException {
|
||||||
if (myJsonMode) {
|
if (myJsonMode) {
|
||||||
myDt.setValueAsString(theValue);
|
myDt.setValueAsString(theValue);
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
// IGNORE - don't handle this as an error, we process these as XML events
|
||||||
}
|
}
|
||||||
super.attributeValue(theName, theValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void doPop() {
|
protected void doPop() {
|
||||||
|
|
|
@ -1144,7 +1144,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
|
||||||
BaseHttpClientInvocation invocation = OperationMethodBinding.createOperationInvocation(myContext, resourceName, id, myOperationName, myParameters, myUseHttpGet);
|
BaseHttpClientInvocation invocation = OperationMethodBinding.createOperationInvocation(myContext, resourceName, id, myOperationName, myParameters, myUseHttpGet);
|
||||||
|
|
||||||
IClientResponseHandler handler;
|
IClientResponseHandler handler;
|
||||||
handler = new ResourceResponseHandler(myParameters.getClass(), null);
|
handler = new ResourceResponseHandler(null, null);
|
||||||
|
|
||||||
Object retVal = invoke(null, handler, invocation);
|
Object retVal = invoke(null, handler, invocation);
|
||||||
if (myContext.getResourceDefinition((IBaseResource) retVal).getName().equals("Parameters")) {
|
if (myContext.getResourceDefinition((IBaseResource) retVal).getName().equals("Parameters")) {
|
||||||
|
|
|
@ -25,6 +25,8 @@ ca.uhn.fhir.rest.method.SearchMethodBinding.invalidSpecialParamName=Method [{0}]
|
||||||
ca.uhn.fhir.rest.method.SearchMethodBinding.idWithoutCompartment=Method [{0}] in provider [{1}] has an @IdParam parameter. This is only allowable for compartment search (e.g. @Search(compartment="foo") )
|
ca.uhn.fhir.rest.method.SearchMethodBinding.idWithoutCompartment=Method [{0}] in provider [{1}] has an @IdParam parameter. This is only allowable for compartment search (e.g. @Search(compartment="foo") )
|
||||||
ca.uhn.fhir.rest.method.SearchMethodBinding.idNullForCompartmentSearch=ID parameter can not be null or empty for compartment search
|
ca.uhn.fhir.rest.method.SearchMethodBinding.idNullForCompartmentSearch=ID parameter can not be null or empty for compartment search
|
||||||
|
|
||||||
|
ca.uhn.fhir.parser.ParserState.wrongResourceTypeFound=Incorrect resource type found, expected "{0}" but found "{1}"
|
||||||
|
|
||||||
ca.uhn.fhir.rest.server.RestfulServer.getPagesNonHttpGet=Requests for _getpages must use HTTP GET
|
ca.uhn.fhir.rest.server.RestfulServer.getPagesNonHttpGet=Requests for _getpages must use HTTP GET
|
||||||
|
|
||||||
ca.uhn.fhir.validation.FhirValidator.noPhlocWarningOnStartup=Phloc-schematron library not found on classpath, will not attempt to perform schematron validation
|
ca.uhn.fhir.validation.FhirValidator.noPhlocWarningOnStartup=Phloc-schematron library not found on classpath, will not attempt to perform schematron validation
|
||||||
|
|
|
@ -76,6 +76,7 @@ import ca.uhn.fhir.model.valueset.BundleTypeEnum;
|
||||||
import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
|
import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
|
||||||
import ca.uhn.fhir.rest.api.MethodOutcome;
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.client.IGenericClient;
|
import ca.uhn.fhir.rest.client.IGenericClient;
|
||||||
|
import ca.uhn.fhir.rest.client.ServerValidationModeEnum;
|
||||||
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
|
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
|
||||||
import ca.uhn.fhir.rest.gclient.StringClientParam;
|
import ca.uhn.fhir.rest.gclient.StringClientParam;
|
||||||
import ca.uhn.fhir.rest.gclient.TokenClientParam;
|
import ca.uhn.fhir.rest.gclient.TokenClientParam;
|
||||||
|
@ -388,6 +389,7 @@ public class ResourceProviderDstu2Test {
|
||||||
assertEquals(Patient.class, found.getEntries().get(0).getResource().getClass());
|
assertEquals(Patient.class, found.getEntries().get(0).getResource().getClass());
|
||||||
assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntries().get(0).getSearchMode().getValueAsEnum());
|
assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntries().get(0).getSearchMode().getValueAsEnum());
|
||||||
assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntries().get(0).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE));
|
assertEquals(BundleEntrySearchModeEnum.MATCH, found.getEntries().get(0).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE));
|
||||||
|
assertThat(found.getEntries().get(0).getResource().getText().getDiv().getValueAsString(), containsString("<table class=\"hapiPropertyTable"));
|
||||||
assertEquals(Organization.class, found.getEntries().get(1).getResource().getClass());
|
assertEquals(Organization.class, found.getEntries().get(1).getResource().getClass());
|
||||||
assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntries().get(1).getSearchMode().getValueAsEnum());
|
assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntries().get(1).getSearchMode().getValueAsEnum());
|
||||||
assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntries().get(1).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE));
|
assertEquals(BundleEntrySearchModeEnum.INCLUDE, found.getEntries().get(1).getResource().getResourceMetadata().get(ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE));
|
||||||
|
@ -981,6 +983,7 @@ public class ResourceProviderDstu2Test {
|
||||||
ourServer.setHandler(proxyHandler);
|
ourServer.setHandler(proxyHandler);
|
||||||
ourServer.start();
|
ourServer.start();
|
||||||
|
|
||||||
|
ourFhirCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER);
|
||||||
ourFhirCtx.getRestfulClientFactory().setSocketTimeout(1200 * 1000);
|
ourFhirCtx.getRestfulClientFactory().setSocketTimeout(1200 * 1000);
|
||||||
ourClient = ourFhirCtx.newRestfulGenericClient(ourServerBase);
|
ourClient = ourFhirCtx.newRestfulGenericClient(ourServerBase);
|
||||||
// ourClient.registerInterceptor(new LoggingInterceptor(true));
|
// ourClient.registerInterceptor(new LoggingInterceptor(true));
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -75,77 +75,6 @@ public class XmlParserTest {
|
||||||
|
|
||||||
private static FhirContext ourCtx;
|
private static FhirContext ourCtx;
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParserTest.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParserTest.class);
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseErrorHandlerNoError() {
|
|
||||||
String input = "<Patient></Patient>";
|
|
||||||
ourCtx.newXmlParser().setParserErrorHandler(new StrictErrorHandler()).parseResource(Patient.class, input);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseErrorHandlerUnexpectedElement() {
|
|
||||||
String input = "<Patient><foo><bar/></foo><name><family value=\"AAA\"/></name></Patient>";
|
|
||||||
try {
|
|
||||||
ourCtx.newXmlParser().setParserErrorHandler(new StrictErrorHandler()).parseResource(Patient.class, input);
|
|
||||||
fail();
|
|
||||||
} catch (DataFormatException e) {
|
|
||||||
assertThat(e.getMessage(), containsString("'foo'"));
|
|
||||||
}
|
|
||||||
|
|
||||||
Patient p = ourCtx.newXmlParser().setParserErrorHandler(new LenientErrorHandler()).parseResource(Patient.class, input);
|
|
||||||
assertEquals(p.getName().get(0).getFamily().get(0).getValue(), "AAA");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseErrorHandlerUnexpectedAttribute() {
|
|
||||||
String input = "<Patient><name><family foo=\"FOO\" value=\"AAA\" bar=\"BAR\"/></name></Patient>";
|
|
||||||
try {
|
|
||||||
ourCtx.newXmlParser().setParserErrorHandler(new StrictErrorHandler()).parseResource(Patient.class, input);
|
|
||||||
fail();
|
|
||||||
} catch (DataFormatException e) {
|
|
||||||
assertThat(e.getMessage(), containsString("'foo'"));
|
|
||||||
}
|
|
||||||
|
|
||||||
Patient p = ourCtx.newXmlParser().setParserErrorHandler(new LenientErrorHandler()).parseResource(Patient.class, input);
|
|
||||||
assertEquals(p.getName().get(0).getFamily().get(0).getValue(), "AAA");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* see #144 and #146
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testParseContained() {
|
|
||||||
|
|
||||||
FhirContext c = FhirContext.forDstu1();
|
|
||||||
IParser parser = c.newXmlParser().setPrettyPrint(true);
|
|
||||||
|
|
||||||
Observation o = new Observation();
|
|
||||||
o.getName().setText("obs text");
|
|
||||||
|
|
||||||
Patient p = new Patient();
|
|
||||||
p.addName().addFamily("patient family");
|
|
||||||
o.getSubject().setResource(p);
|
|
||||||
|
|
||||||
String enc = parser.encodeResourceToString(o);
|
|
||||||
ourLog.info(enc);
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
assertThat(enc, stringContainsInOrder(
|
|
||||||
"<Observation xmlns=\"http://hl7.org/fhir\">",
|
|
||||||
"<contained>",
|
|
||||||
"<Patient xmlns=\"http://hl7.org/fhir\" id=\"1\">",
|
|
||||||
"</contained>",
|
|
||||||
"<reference value=\"#1\"/>"
|
|
||||||
));
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
o = parser.parseResource(Observation.class, enc);
|
|
||||||
assertEquals("obs text", o.getName().getText().getValue());
|
|
||||||
|
|
||||||
assertNotNull(o.getSubject().getResource());
|
|
||||||
p = (Patient) o.getSubject().getResource();
|
|
||||||
assertEquals("patient family", p.getNameFirstRep().getFamilyAsSingleString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testComposition() {
|
public void testComposition() {
|
||||||
|
@ -163,39 +92,76 @@ public class XmlParserTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See #131
|
* Test for #82 - Not yet enabled because the test won't pass
|
||||||
|
*/
|
||||||
|
// @Test
|
||||||
|
public void testCustomTypeInExtension() throws DataFormatException {
|
||||||
|
|
||||||
|
MyPatient patient = new MyPatient();
|
||||||
|
patient.addName().addFamily("PatientName");
|
||||||
|
|
||||||
|
MyOrganization org = new MyOrganization();
|
||||||
|
org.setName("OrgName");
|
||||||
|
patient.getSomeOrganization().setResource(org);
|
||||||
|
|
||||||
|
String str = ourCtx.newXmlParser().encodeResourceToString(patient);
|
||||||
|
ourLog.info(str);
|
||||||
|
|
||||||
|
assertThat(
|
||||||
|
str,
|
||||||
|
Matchers.stringContainsInOrder("<Patient xmlns=\"http://hl7.org/fhir\"><extension url=\"http://foo/someOrg\"><valueResource><reference value=\"#1\"/></valueResource></extension><contained><Organization xmlns=\"http://hl7.org/fhir\" id=\"1\"><name value=\"OrgName\"/></Organization></contained><name><family value=\"PatientName\"/></name></Patient>"));
|
||||||
|
|
||||||
|
MyPatient parse = ourCtx.newXmlParser().parseResource(MyPatient.class, str);
|
||||||
|
assertEquals("PatientName", parse.getNameFirstRep().getFamilyAsSingleString());
|
||||||
|
assertEquals("OrgName", ((MyOrganization) parse.getSomeOrganization().getResource()).getName().getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for #82 - Not yet enabled because the test won't pass
|
||||||
|
*/
|
||||||
|
// @Test
|
||||||
|
public void testCustomTypeInReplaceParent() throws DataFormatException {
|
||||||
|
|
||||||
|
MyPatient patient = new MyPatient();
|
||||||
|
patient.addName().addFamily("PatientName");
|
||||||
|
|
||||||
|
MyOrganization org = new MyOrganization();
|
||||||
|
org.setName("OrgName");
|
||||||
|
patient.getManagingOrganization().setResource(org);
|
||||||
|
|
||||||
|
String str = ourCtx.newXmlParser().encodeResourceToString(patient);
|
||||||
|
ourLog.info(str);
|
||||||
|
|
||||||
|
assertThat(
|
||||||
|
str,
|
||||||
|
Matchers.stringContainsInOrder("<Patient xmlns=\"http://hl7.org/fhir\"><contained><Organization xmlns=\"http://hl7.org/fhir\" id=\"1\"><name value=\"OrgName\"/></Organization></contained><name><family value=\"PatientName\"/></name><managingOrganization><reference value=\"#1\"/></managingOrganization></Patient>"));
|
||||||
|
|
||||||
|
MyPatient parse = ourCtx.newXmlParser().parseResource(MyPatient.class, str);
|
||||||
|
assertEquals("PatientName", parse.getNameFirstRep().getFamilyAsSingleString());
|
||||||
|
assertEquals("OrgName", ((MyOrganization) parse.getManagingOrganization().getResource()).getName().getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See #91
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testParseAndReencodeCondition() {
|
public void testCustomTypeWithUnoderedExtensions() {
|
||||||
FhirContext ctx = FhirContext.forDstu1();
|
MyPatientWithUnorderedExtensions pat = new MyPatientWithUnorderedExtensions();
|
||||||
ctx.setNarrativeGenerator(new DefaultThymeleafNarrativeGenerator());
|
pat.getExtAtt1().setValue(true);
|
||||||
InputStreamReader reader = new InputStreamReader(XmlParserTest.class.getResourceAsStream("/condition.xml"));
|
pat.getExtAtt2().setValue("val2");
|
||||||
Condition cond = ctx.newXmlParser().parseResource(Condition.class, reader);
|
pat.getExtAtt3().setValueAsString("20110102");
|
||||||
|
|
||||||
String enc = ctx.newXmlParser().setPrettyPrint(true).encodeResourceToString(cond);
|
String string = ourCtx.newXmlParser().encodeResourceToString(pat);
|
||||||
ourLog.info(enc);
|
ourLog.info(string);
|
||||||
|
|
||||||
assertThat(enc, not(containsString("generated")));
|
//@formatter:off
|
||||||
}
|
assertThat(string, stringContainsInOrder(Arrays.asList(
|
||||||
|
"<extension url=\"urn:ex1\"><valueBoolean value=\"true\"/></extension>",
|
||||||
@Test
|
"<extension url=\"urn:ex2\"><valueString value=\"val2\"/></extension>",
|
||||||
public void testEncodeOmitsVersionAndBase() {
|
"<extension url=\"urn:ex3\"><valueDate value=\"20110102\"/></extension>"
|
||||||
Patient p = new Patient();
|
)));
|
||||||
p.getManagingOrganization().setReference("http://example.com/base/Patient/1/_history/2");
|
//@formatter:on
|
||||||
|
|
||||||
String enc;
|
|
||||||
|
|
||||||
enc = ourCtx.newXmlParser().encodeResourceToString(p);
|
|
||||||
ourLog.info(enc);
|
|
||||||
assertThat(enc, containsString("\"http://example.com/base/Patient/1\""));
|
|
||||||
|
|
||||||
enc = ourCtx.newXmlParser().setServerBaseUrl("http://example.com/base").encodeResourceToString(p);
|
|
||||||
ourLog.info(enc);
|
|
||||||
assertThat(enc, containsString("\"Patient/1\""));
|
|
||||||
|
|
||||||
enc = ourCtx.newXmlParser().setServerBaseUrl("http://example.com/base2").encodeResourceToString(p);
|
|
||||||
ourLog.info(enc);
|
|
||||||
assertThat(enc, containsString("\"http://example.com/base/Patient/1\""));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -217,43 +183,6 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeBinaryResource() {
|
|
||||||
|
|
||||||
Binary patient = new Binary();
|
|
||||||
patient.setContentType("foo");
|
|
||||||
patient.setContent(new byte[] { 1, 2, 3, 4 });
|
|
||||||
|
|
||||||
String val = ourCtx.newXmlParser().encodeResourceToString(patient);
|
|
||||||
assertEquals("<Binary xmlns=\"http://hl7.org/fhir\" contentType=\"foo\">AQIDBA==</Binary>", val);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeBinaryWithNoContentType() {
|
|
||||||
Binary b = new Binary();
|
|
||||||
b.setContent(new byte[] { 1, 2, 3, 4 });
|
|
||||||
|
|
||||||
String output = ourCtx.newXmlParser().encodeResourceToString(b);
|
|
||||||
ourLog.info(output);
|
|
||||||
|
|
||||||
assertEquals("<Binary xmlns=\"http://hl7.org/fhir\">AQIDBA==</Binary>", output);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeBoundCode() {
|
|
||||||
|
|
||||||
Patient patient = new Patient();
|
|
||||||
patient.addAddress().setUse(AddressUseEnum.HOME);
|
|
||||||
|
|
||||||
patient.getGender().setValueAsEnum(AdministrativeGenderCodesEnum.M);
|
|
||||||
|
|
||||||
String val = ourCtx.newXmlParser().encodeResourceToString(patient);
|
|
||||||
ourLog.info(val);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeAndParseExtensions() throws Exception {
|
public void testEncodeAndParseExtensions() throws Exception {
|
||||||
|
|
||||||
|
@ -301,8 +230,10 @@ public class XmlParserTest {
|
||||||
enc,
|
enc,
|
||||||
containsString("<extension url=\"http://example.com#parent\"><extension url=\"http://example.com#child\"><valueString value=\"value1\"/></extension><extension url=\"http://example.com#child\"><valueString value=\"value2\"/></extension></extension>"));
|
containsString("<extension url=\"http://example.com#parent\"><extension url=\"http://example.com#child\"><valueString value=\"value1\"/></extension><extension url=\"http://example.com#child\"><valueString value=\"value2\"/></extension></extension>"));
|
||||||
assertThat(enc, containsString("<given value=\"Joe\"><extension url=\"http://examples.com#givenext\"><valueString value=\"given\"/></extension></given>"));
|
assertThat(enc, containsString("<given value=\"Joe\"><extension url=\"http://examples.com#givenext\"><valueString value=\"given\"/></extension></given>"));
|
||||||
assertThat(enc, containsString("<given value=\"Shmoe\"><extension url=\"http://examples.com#givenext_parent\"><extension url=\"http://examples.com#givenext_child\"><valueString value=\"CHILD\"/></extension></extension></given>"));
|
assertThat(
|
||||||
|
enc,
|
||||||
|
containsString("<given value=\"Shmoe\"><extension url=\"http://examples.com#givenext_parent\"><extension url=\"http://examples.com#givenext_child\"><valueString value=\"CHILD\"/></extension></extension></given>"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now parse this back
|
* Now parse this back
|
||||||
*/
|
*/
|
||||||
|
@ -341,6 +272,91 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See #103
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testEncodeAndReEncodeContainedJson() {
|
||||||
|
Composition comp = new Composition();
|
||||||
|
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
||||||
|
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
||||||
|
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
||||||
|
|
||||||
|
IParser parser = ourCtx.newJsonParser().setPrettyPrint(true);
|
||||||
|
|
||||||
|
String string = parser.encodeResourceToString(comp);
|
||||||
|
ourLog.info(string);
|
||||||
|
|
||||||
|
Composition parsed = parser.parseResource(Composition.class, string);
|
||||||
|
parsed.getSection().remove(0);
|
||||||
|
|
||||||
|
string = parser.encodeResourceToString(parsed);
|
||||||
|
ourLog.info(string);
|
||||||
|
|
||||||
|
parsed = parser.parseResource(Composition.class, string);
|
||||||
|
assertEquals(2, parsed.getContained().getContainedResources().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See #103
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testEncodeAndReEncodeContainedXml() {
|
||||||
|
Composition comp = new Composition();
|
||||||
|
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
||||||
|
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
||||||
|
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
||||||
|
|
||||||
|
IParser parser = ourCtx.newXmlParser().setPrettyPrint(true);
|
||||||
|
|
||||||
|
String string = parser.encodeResourceToString(comp);
|
||||||
|
ourLog.info(string);
|
||||||
|
|
||||||
|
Composition parsed = parser.parseResource(Composition.class, string);
|
||||||
|
parsed.getSection().remove(0);
|
||||||
|
|
||||||
|
string = parser.encodeResourceToString(parsed);
|
||||||
|
ourLog.info(string);
|
||||||
|
|
||||||
|
parsed = parser.parseResource(Composition.class, string);
|
||||||
|
assertEquals(2, parsed.getContained().getContainedResources().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeBinaryResource() {
|
||||||
|
|
||||||
|
Binary patient = new Binary();
|
||||||
|
patient.setContentType("foo");
|
||||||
|
patient.setContent(new byte[] { 1, 2, 3, 4 });
|
||||||
|
|
||||||
|
String val = ourCtx.newXmlParser().encodeResourceToString(patient);
|
||||||
|
assertEquals("<Binary xmlns=\"http://hl7.org/fhir\" contentType=\"foo\">AQIDBA==</Binary>", val);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeBinaryWithNoContentType() {
|
||||||
|
Binary b = new Binary();
|
||||||
|
b.setContent(new byte[] { 1, 2, 3, 4 });
|
||||||
|
|
||||||
|
String output = ourCtx.newXmlParser().encodeResourceToString(b);
|
||||||
|
ourLog.info(output);
|
||||||
|
|
||||||
|
assertEquals("<Binary xmlns=\"http://hl7.org/fhir\">AQIDBA==</Binary>", output);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeBoundCode() {
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addAddress().setUse(AddressUseEnum.HOME);
|
||||||
|
|
||||||
|
patient.getGender().setValueAsEnum(AdministrativeGenderCodesEnum.M);
|
||||||
|
|
||||||
|
String val = ourCtx.newXmlParser().encodeResourceToString(patient);
|
||||||
|
ourLog.info(val);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeBundle() throws InterruptedException {
|
public void testEncodeBundle() throws InterruptedException {
|
||||||
|
@ -761,6 +777,26 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeOmitsVersionAndBase() {
|
||||||
|
Patient p = new Patient();
|
||||||
|
p.getManagingOrganization().setReference("http://example.com/base/Patient/1/_history/2");
|
||||||
|
|
||||||
|
String enc;
|
||||||
|
|
||||||
|
enc = ourCtx.newXmlParser().encodeResourceToString(p);
|
||||||
|
ourLog.info(enc);
|
||||||
|
assertThat(enc, containsString("\"http://example.com/base/Patient/1\""));
|
||||||
|
|
||||||
|
enc = ourCtx.newXmlParser().setServerBaseUrl("http://example.com/base").encodeResourceToString(p);
|
||||||
|
ourLog.info(enc);
|
||||||
|
assertThat(enc, containsString("\"Patient/1\""));
|
||||||
|
|
||||||
|
enc = ourCtx.newXmlParser().setServerBaseUrl("http://example.com/base2").encodeResourceToString(p);
|
||||||
|
ourLog.info(enc);
|
||||||
|
assertThat(enc, containsString("\"http://example.com/base/Patient/1\""));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodePrettyPrint() throws DataFormatException {
|
public void testEncodePrettyPrint() throws DataFormatException {
|
||||||
|
|
||||||
|
@ -940,56 +976,6 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Test for #82 - Not yet enabled because the test won't pass
|
|
||||||
*/
|
|
||||||
// @Test
|
|
||||||
public void testCustomTypeInReplaceParent() throws DataFormatException {
|
|
||||||
|
|
||||||
MyPatient patient = new MyPatient();
|
|
||||||
patient.addName().addFamily("PatientName");
|
|
||||||
|
|
||||||
MyOrganization org = new MyOrganization();
|
|
||||||
org.setName("OrgName");
|
|
||||||
patient.getManagingOrganization().setResource(org);
|
|
||||||
|
|
||||||
String str = ourCtx.newXmlParser().encodeResourceToString(patient);
|
|
||||||
ourLog.info(str);
|
|
||||||
|
|
||||||
assertThat(
|
|
||||||
str,
|
|
||||||
Matchers.stringContainsInOrder("<Patient xmlns=\"http://hl7.org/fhir\"><contained><Organization xmlns=\"http://hl7.org/fhir\" id=\"1\"><name value=\"OrgName\"/></Organization></contained><name><family value=\"PatientName\"/></name><managingOrganization><reference value=\"#1\"/></managingOrganization></Patient>"));
|
|
||||||
|
|
||||||
MyPatient parse = ourCtx.newXmlParser().parseResource(MyPatient.class, str);
|
|
||||||
assertEquals("PatientName", parse.getNameFirstRep().getFamilyAsSingleString());
|
|
||||||
assertEquals("OrgName", ((MyOrganization) parse.getManagingOrganization().getResource()).getName().getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test for #82 - Not yet enabled because the test won't pass
|
|
||||||
*/
|
|
||||||
// @Test
|
|
||||||
public void testCustomTypeInExtension() throws DataFormatException {
|
|
||||||
|
|
||||||
MyPatient patient = new MyPatient();
|
|
||||||
patient.addName().addFamily("PatientName");
|
|
||||||
|
|
||||||
MyOrganization org = new MyOrganization();
|
|
||||||
org.setName("OrgName");
|
|
||||||
patient.getSomeOrganization().setResource(org);
|
|
||||||
|
|
||||||
String str = ourCtx.newXmlParser().encodeResourceToString(patient);
|
|
||||||
ourLog.info(str);
|
|
||||||
|
|
||||||
assertThat(
|
|
||||||
str,
|
|
||||||
Matchers.stringContainsInOrder("<Patient xmlns=\"http://hl7.org/fhir\"><extension url=\"http://foo/someOrg\"><valueResource><reference value=\"#1\"/></valueResource></extension><contained><Organization xmlns=\"http://hl7.org/fhir\" id=\"1\"><name value=\"OrgName\"/></Organization></contained><name><family value=\"PatientName\"/></name></Patient>"));
|
|
||||||
|
|
||||||
MyPatient parse = ourCtx.newXmlParser().parseResource(MyPatient.class, str);
|
|
||||||
assertEquals("PatientName", parse.getNameFirstRep().getFamilyAsSingleString());
|
|
||||||
assertEquals("OrgName", ((MyOrganization) parse.getSomeOrganization().getResource()).getName().getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoadAndAncodeMessage() throws SAXException, IOException {
|
public void testLoadAndAncodeMessage() throws SAXException, IOException {
|
||||||
|
|
||||||
|
@ -1246,14 +1232,14 @@ public class XmlParserTest {
|
||||||
INarrativeGenerator gen = new INarrativeGenerator() {
|
INarrativeGenerator gen = new INarrativeGenerator() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateNarrative(String theProfile, IBaseResource theResource, BaseNarrativeDt<?> theNarrative) throws DataFormatException {
|
public void generateNarrative(IBaseResource theResource, BaseNarrativeDt<?> theNarrative) {
|
||||||
theNarrative.getDiv().setValueAsString("<div>help</div>");
|
throw new UnsupportedOperationException();
|
||||||
theNarrative.getStatus().setValueAsString("generated");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateNarrative(IBaseResource theResource, BaseNarrativeDt<?> theNarrative) {
|
public void generateNarrative(String theProfile, IBaseResource theResource, BaseNarrativeDt<?> theNarrative) throws DataFormatException {
|
||||||
throw new UnsupportedOperationException();
|
theNarrative.getDiv().setValueAsString("<div>help</div>");
|
||||||
|
theNarrative.getStatus().setValueAsString("generated");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1325,6 +1311,22 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See #131
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testParseAndReencodeCondition() {
|
||||||
|
FhirContext ctx = FhirContext.forDstu1();
|
||||||
|
ctx.setNarrativeGenerator(new DefaultThymeleafNarrativeGenerator());
|
||||||
|
InputStreamReader reader = new InputStreamReader(XmlParserTest.class.getResourceAsStream("/condition.xml"));
|
||||||
|
Condition cond = ctx.newXmlParser().parseResource(Condition.class, reader);
|
||||||
|
|
||||||
|
String enc = ctx.newXmlParser().setPrettyPrint(true).encodeResourceToString(cond);
|
||||||
|
ourLog.info(enc);
|
||||||
|
|
||||||
|
assertThat(enc, not(containsString("generated")));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseBinaryResource() {
|
public void testParseBinaryResource() {
|
||||||
|
|
||||||
|
@ -1515,6 +1517,43 @@ public class XmlParserTest {
|
||||||
assertEquals(Organization.class, b.getEntries().get(2).getResource().getClass());
|
assertEquals(Organization.class, b.getEntries().get(2).getResource().getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* see #144 and #146
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testParseContained() {
|
||||||
|
|
||||||
|
FhirContext c = FhirContext.forDstu1();
|
||||||
|
IParser parser = c.newXmlParser().setPrettyPrint(true);
|
||||||
|
|
||||||
|
Observation o = new Observation();
|
||||||
|
o.getName().setText("obs text");
|
||||||
|
|
||||||
|
Patient p = new Patient();
|
||||||
|
p.addName().addFamily("patient family");
|
||||||
|
o.getSubject().setResource(p);
|
||||||
|
|
||||||
|
String enc = parser.encodeResourceToString(o);
|
||||||
|
ourLog.info(enc);
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
assertThat(enc, stringContainsInOrder(
|
||||||
|
"<Observation xmlns=\"http://hl7.org/fhir\">",
|
||||||
|
"<contained>",
|
||||||
|
"<Patient xmlns=\"http://hl7.org/fhir\" id=\"1\">",
|
||||||
|
"</contained>",
|
||||||
|
"<reference value=\"#1\"/>"
|
||||||
|
));
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
o = parser.parseResource(Observation.class, enc);
|
||||||
|
assertEquals("obs text", o.getName().getText().getValue());
|
||||||
|
|
||||||
|
assertNotNull(o.getSubject().getResource());
|
||||||
|
p = (Patient) o.getSubject().getResource();
|
||||||
|
assertEquals("patient family", p.getNameFirstRep().getFamilyAsSingleString());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thanks to Alexander Kley!
|
* Thanks to Alexander Kley!
|
||||||
*/
|
*/
|
||||||
|
@ -1597,6 +1636,40 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseErrorHandlerNoError() {
|
||||||
|
String input = "<Patient></Patient>";
|
||||||
|
ourCtx.newXmlParser().setParserErrorHandler(new StrictErrorHandler()).parseResource(Patient.class, input);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseErrorHandlerUnexpectedAttribute() {
|
||||||
|
String input = "<Patient><name><family foo=\"FOO\" value=\"AAA\" bar=\"BAR\"/></name></Patient>";
|
||||||
|
try {
|
||||||
|
ourCtx.newXmlParser().setParserErrorHandler(new StrictErrorHandler()).parseResource(Patient.class, input);
|
||||||
|
fail();
|
||||||
|
} catch (DataFormatException e) {
|
||||||
|
assertThat(e.getMessage(), containsString("'foo'"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Patient p = ourCtx.newXmlParser().setParserErrorHandler(new LenientErrorHandler()).parseResource(Patient.class, input);
|
||||||
|
assertEquals(p.getName().get(0).getFamily().get(0).getValue(), "AAA");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseErrorHandlerUnexpectedElement() {
|
||||||
|
String input = "<Patient><foo><bar/></foo><name><family value=\"AAA\"/></name></Patient>";
|
||||||
|
try {
|
||||||
|
ourCtx.newXmlParser().setParserErrorHandler(new StrictErrorHandler()).parseResource(Patient.class, input);
|
||||||
|
fail();
|
||||||
|
} catch (DataFormatException e) {
|
||||||
|
assertThat(e.getMessage(), containsString("'foo'"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Patient p = ourCtx.newXmlParser().setParserErrorHandler(new LenientErrorHandler()).parseResource(Patient.class, input);
|
||||||
|
assertEquals(p.getName().get(0).getFamily().get(0).getValue(), "AAA");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseFeedWithListResource() throws ConfigurationException, DataFormatException, IOException {
|
public void testParseFeedWithListResource() throws ConfigurationException, DataFormatException, IOException {
|
||||||
|
|
||||||
|
@ -1646,6 +1719,17 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseWithIncorrectResourceType() {
|
||||||
|
String input = "<Patient><foo><bar/></foo><name><family value=\"AAA\"/></name></Patient>";
|
||||||
|
try {
|
||||||
|
ourCtx.newXmlParser().parseResource(Organization.class, input);
|
||||||
|
fail();
|
||||||
|
} catch (DataFormatException e) {
|
||||||
|
assertThat(e.getMessage(), containsString("expected \"Organization\" but found \"Patient\""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseWithXmlHeader() throws ConfigurationException, DataFormatException {
|
public void testParseWithXmlHeader() throws ConfigurationException, DataFormatException {
|
||||||
IParser p = ourCtx.newXmlParser();
|
IParser p = ourCtx.newXmlParser();
|
||||||
|
@ -1695,29 +1779,6 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* See #91
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testCustomTypeWithUnoderedExtensions() {
|
|
||||||
MyPatientWithUnorderedExtensions pat = new MyPatientWithUnorderedExtensions();
|
|
||||||
pat.getExtAtt1().setValue(true);
|
|
||||||
pat.getExtAtt2().setValue("val2");
|
|
||||||
pat.getExtAtt3().setValueAsString("20110102");
|
|
||||||
|
|
||||||
String string = ourCtx.newXmlParser().encodeResourceToString(pat);
|
|
||||||
ourLog.info(string);
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
assertThat(string, stringContainsInOrder(Arrays.asList(
|
|
||||||
"<extension url=\"urn:ex1\"><valueBoolean value=\"true\"/></extension>",
|
|
||||||
"<extension url=\"urn:ex2\"><valueString value=\"val2\"/></extension>",
|
|
||||||
"<extension url=\"urn:ex3\"><valueDate value=\"20110102\"/></extension>"
|
|
||||||
)));
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSimpleResourceEncodeWithCustomType() throws IOException, SAXException {
|
public void testSimpleResourceEncodeWithCustomType() throws IOException, SAXException {
|
||||||
|
|
||||||
|
@ -1816,60 +1877,10 @@ public class XmlParserTest {
|
||||||
XMLUnit.setIgnoreWhitespace(true);
|
XMLUnit.setIgnoreWhitespace(true);
|
||||||
ourCtx = new FhirContext();
|
ourCtx = new FhirContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeClass2() {
|
public static void beforeClass2() {
|
||||||
System.setProperty("file.encoding", "ISO-8859-1");
|
System.setProperty("file.encoding", "ISO-8859-1");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* See #103
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testEncodeAndReEncodeContainedXml() {
|
|
||||||
Composition comp = new Composition();
|
|
||||||
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
|
||||||
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
|
||||||
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
|
||||||
|
|
||||||
IParser parser = ourCtx.newXmlParser().setPrettyPrint(true);
|
|
||||||
|
|
||||||
String string = parser.encodeResourceToString(comp);
|
|
||||||
ourLog.info(string);
|
|
||||||
|
|
||||||
Composition parsed = parser.parseResource(Composition.class, string);
|
|
||||||
parsed.getSection().remove(0);
|
|
||||||
|
|
||||||
string = parser.encodeResourceToString(parsed);
|
|
||||||
ourLog.info(string);
|
|
||||||
|
|
||||||
parsed = parser.parseResource(Composition.class, string);
|
|
||||||
assertEquals(2, parsed.getContained().getContainedResources().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See #103
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testEncodeAndReEncodeContainedJson() {
|
|
||||||
Composition comp = new Composition();
|
|
||||||
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
|
||||||
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
|
||||||
comp.addSection().getContent().setResource(new AllergyIntolerance().addIdentifier("foo", "bar"));
|
|
||||||
|
|
||||||
IParser parser = ourCtx.newJsonParser().setPrettyPrint(true);
|
|
||||||
|
|
||||||
String string = parser.encodeResourceToString(comp);
|
|
||||||
ourLog.info(string);
|
|
||||||
|
|
||||||
Composition parsed = parser.parseResource(Composition.class, string);
|
|
||||||
parsed.getSection().remove(0);
|
|
||||||
|
|
||||||
string = parser.encodeResourceToString(parsed);
|
|
||||||
ourLog.info(string);
|
|
||||||
|
|
||||||
parsed = parser.parseResource(Composition.class, string);
|
|
||||||
assertEquals(2, parsed.getContained().getContainedResources().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -16,6 +16,7 @@ import org.apache.commons.io.input.ReaderInputStream;
|
||||||
import org.apache.http.HttpEntityEnclosingRequest;
|
import org.apache.http.HttpEntityEnclosingRequest;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.ProtocolVersion;
|
import org.apache.http.ProtocolVersion;
|
||||||
|
import org.apache.http.client.ClientProtocolException;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
||||||
import org.apache.http.client.methods.HttpUriRequest;
|
import org.apache.http.client.methods.HttpUriRequest;
|
||||||
|
@ -37,9 +38,11 @@ import ca.uhn.fhir.model.api.Include;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.Observation;
|
import ca.uhn.fhir.model.dstu2.resource.Observation;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.Parameters;
|
import ca.uhn.fhir.model.dstu2.resource.Parameters;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.Patient;
|
import ca.uhn.fhir.model.dstu2.resource.Patient;
|
||||||
|
import ca.uhn.fhir.model.primitive.DateDt;
|
||||||
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.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
|
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
import ca.uhn.fhir.rest.server.Constants;
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
import ca.uhn.fhir.rest.server.EncodingEnum;
|
||||||
|
|
||||||
|
@ -48,11 +51,6 @@ public class GenericClientDstu2Test {
|
||||||
private HttpClient myHttpClient;
|
private HttpClient myHttpClient;
|
||||||
private HttpResponse myHttpResponse;
|
private HttpResponse myHttpResponse;
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public static void beforeClass() {
|
|
||||||
ourCtx = FhirContext.forDstu2();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
myHttpClient = mock(HttpClient.class, new ReturnsDeepStubs());
|
myHttpClient = mock(HttpClient.class, new ReturnsDeepStubs());
|
||||||
|
@ -61,30 +59,9 @@ public class GenericClientDstu2Test {
|
||||||
myHttpResponse = mock(HttpResponse.class, new ReturnsDeepStubs());
|
myHttpResponse = mock(HttpResponse.class, new ReturnsDeepStubs());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
private String extractBody(ArgumentCaptor<HttpUriRequest> capt, int count) throws IOException {
|
||||||
@Test
|
String body = IOUtils.toString(((HttpEntityEnclosingRequestBase) capt.getAllValues().get(count)).getEntity().getContent(), "UTF-8");
|
||||||
public void testSearchWithReverseInclude() throws Exception {
|
return body;
|
||||||
|
|
||||||
String msg = getPatientFeedWithOneResult();
|
|
||||||
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
|
||||||
when(myHttpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")));
|
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
Bundle response = client.search()
|
|
||||||
.forResource(Patient.class)
|
|
||||||
.encodedJson()
|
|
||||||
.revInclude(new Include("Provenance:target"))
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
assertEquals("http://example.com/fhir/Patient?_revinclude=Provenance%3Atarget&_format=json", capt.getValue().getURI().toString());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getPatientFeedWithOneResult() {
|
private String getPatientFeedWithOneResult() {
|
||||||
|
@ -108,6 +85,122 @@ public class GenericClientDstu2Test {
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreate() throws Exception {
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), Constants.STATUS_HTTP_204_NO_CONTENT, ""));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<ReaderInputStream>() {
|
||||||
|
@Override
|
||||||
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
|
return new ReaderInputStream(new StringReader(""), Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
Patient p = new Patient();
|
||||||
|
p.addName().addFamily("FOOFAMILY");
|
||||||
|
|
||||||
|
client.create().resource(p).execute();
|
||||||
|
|
||||||
|
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
||||||
|
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
||||||
|
assertThat(extractBody(capt, idx), containsString("<family value=\"FOOFAMILY\"/>"));
|
||||||
|
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
||||||
|
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
p.setId("123");
|
||||||
|
|
||||||
|
client.create().resource(p).execute();
|
||||||
|
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
||||||
|
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
||||||
|
String body = extractBody(capt, idx);
|
||||||
|
assertThat(body, containsString("<family value=\"FOOFAMILY\"/>"));
|
||||||
|
assertThat(body, not(containsString("123")));
|
||||||
|
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
||||||
|
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateConditional() throws Exception {
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), Constants.STATUS_HTTP_204_NO_CONTENT, ""));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<ReaderInputStream>() {
|
||||||
|
@Override
|
||||||
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
|
return new ReaderInputStream(new StringReader(""), Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
Patient p = new Patient();
|
||||||
|
p.addName().addFamily("FOOFAMILY");
|
||||||
|
|
||||||
|
client.create().resource(p).conditionalByUrl("Patient?name=foo").execute();
|
||||||
|
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
||||||
|
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
||||||
|
assertThat(extractBody(capt, idx), containsString("<family value=\"FOOFAMILY\"/>"));
|
||||||
|
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
||||||
|
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_IF_NONE_EXIST).getValue());
|
||||||
|
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
client.create().resource(p).conditional().where(Patient.NAME.matches().value("foo")).execute();
|
||||||
|
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
||||||
|
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
||||||
|
assertThat(extractBody(capt, idx), containsString("<family value=\"FOOFAMILY\"/>"));
|
||||||
|
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
||||||
|
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_IF_NONE_EXIST).getValue());
|
||||||
|
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteConditional() throws Exception {
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), Constants.STATUS_HTTP_204_NO_CONTENT, ""));
|
||||||
|
// when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type",
|
||||||
|
// Constants.CT_TEXT + "; charset=UTF-8"));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<ReaderInputStream>() {
|
||||||
|
@Override
|
||||||
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
|
return new ReaderInputStream(new StringReader(""), Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
client.delete().resourceById(new IdDt("Patient/123")).execute();
|
||||||
|
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
|
||||||
|
assertEquals("http://example.com/fhir/Patient/123", capt.getAllValues().get(idx).getURI().toString());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
client.delete().resourceConditionalByUrl("Patient?name=foo").execute();
|
||||||
|
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
|
||||||
|
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getURI().toString());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
client.delete().resourceConditionalByType("Patient").where(Patient.NAME.matches().value("foo")).execute();
|
||||||
|
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
|
||||||
|
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getURI().toString());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHistory() throws Exception {
|
public void testHistory() throws Exception {
|
||||||
|
|
||||||
|
@ -164,27 +257,253 @@ public class GenericClientDstu2Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchByString() throws Exception {
|
public void testOperationAsGetWithInParameters() throws Exception {
|
||||||
String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
|
IParser p = ourCtx.newXmlParser();
|
||||||
|
|
||||||
|
Parameters inParams = new Parameters();
|
||||||
|
inParams.addParameter().setName("param1").setValue(new StringDt("STRINGVALIN1"));
|
||||||
|
inParams.addParameter().setName("param1").setValue(new StringDt("STRINGVALIN1b"));
|
||||||
|
inParams.addParameter().setName("param2").setValue(new StringDt("STRINGVALIN2"));
|
||||||
|
|
||||||
|
Parameters outParams = new Parameters();
|
||||||
|
outParams.addParameter().setValue(new StringDt("STRINGVALOUT1"));
|
||||||
|
outParams.addParameter().setValue(new StringDt("STRINGVALOUT2"));
|
||||||
|
final String respString = p.encodeResourceToString(outParams);
|
||||||
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")));
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
|
@Override
|
||||||
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
Bundle response = client.search()
|
Parameters resp = client
|
||||||
.forResource("Patient")
|
.operation()
|
||||||
.where(Patient.NAME.matches().value("james"))
|
.onServer()
|
||||||
.execute();
|
.named("$SOMEOPERATION")
|
||||||
//@formatter:on
|
.withParameters(inParams)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
assertEquals(respString, p.encodeResourceToString(resp));
|
||||||
|
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
assertEquals("http://example.com/fhir/Patient?name=james", capt.getValue().getURI().toString());
|
//@formatter:off
|
||||||
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass());
|
resp = client
|
||||||
|
.operation()
|
||||||
|
.onType(Patient.class)
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withParameters(inParams)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/Patient/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
assertEquals(respString, p.encodeResourceToString(resp));
|
||||||
|
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
resp = client
|
||||||
|
.operation()
|
||||||
|
.onInstance(new IdDt("Patient", "123"))
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withParameters(inParams)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
assertEquals(respString, p.encodeResourceToString(resp));
|
||||||
|
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
// @formatter:off
|
||||||
|
resp = client
|
||||||
|
.operation()
|
||||||
|
.onInstance(new IdDt("http://foo.com/bar/baz/Patient/123/_history/22"))
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withParameters(inParams)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
// @formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOperationAsGetWithNoInParameters() throws Exception {
|
||||||
|
IParser p = ourCtx.newXmlParser();
|
||||||
|
|
||||||
|
Parameters outParams = new Parameters();
|
||||||
|
outParams.addParameter().setValue(new StringDt("STRINGVALOUT1"));
|
||||||
|
outParams.addParameter().setValue(new StringDt("STRINGVALOUT2"));
|
||||||
|
final String respString = p.encodeResourceToString(outParams);
|
||||||
|
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
|
@Override
|
||||||
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
Parameters resp = client
|
||||||
|
.operation()
|
||||||
|
.onServer()
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withNoParameters(Parameters.class)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
assertEquals(respString, p.encodeResourceToString(resp));
|
||||||
|
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
resp = client
|
||||||
|
.operation()
|
||||||
|
.onType(Patient.class)
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withNoParameters(Parameters.class)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/Patient/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
assertEquals(respString, p.encodeResourceToString(resp));
|
||||||
|
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
resp = client
|
||||||
|
.operation()
|
||||||
|
.onInstance(new IdDt("Patient", "123"))
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withNoParameters(Parameters.class)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
assertEquals(respString, p.encodeResourceToString(resp));
|
||||||
|
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
// @formatter:off
|
||||||
|
resp = client
|
||||||
|
.operation()
|
||||||
|
.onInstance(new IdDt("http://foo.com/bar/baz/Patient/123/_history/22"))
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withNoParameters(Parameters.class)
|
||||||
|
.useHttpGet()
|
||||||
|
.execute();
|
||||||
|
// @formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOperationWithBundleResponseXml() throws Exception {
|
||||||
|
IParser p = ourCtx.newXmlParser();
|
||||||
|
|
||||||
|
Parameters inParams = new Parameters();
|
||||||
|
inParams.addParameter().setValue(new StringDt("STRINGVALIN1"));
|
||||||
|
inParams.addParameter().setValue(new StringDt("STRINGVALIN2"));
|
||||||
|
String reqString = p.encodeResourceToString(inParams);
|
||||||
|
|
||||||
|
ca.uhn.fhir.model.dstu2.resource.Bundle outParams = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
||||||
|
outParams.setTotal(123);
|
||||||
|
final String respString = p.encodeResourceToString(outParams);
|
||||||
|
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
|
@Override
|
||||||
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
Parameters resp = client
|
||||||
|
.operation()
|
||||||
|
.onServer()
|
||||||
|
.named("$SOMEOPERATION")
|
||||||
|
.withParameters(inParams).execute();
|
||||||
|
//@formatter:on
|
||||||
|
assertEquals("http://example.com/fhir/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
||||||
|
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
||||||
|
assertEquals(extractBody(capt, idx), reqString);
|
||||||
|
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
||||||
|
assertEquals(1, resp.getParameter().size());
|
||||||
|
assertEquals(ca.uhn.fhir.model.dstu2.resource.Bundle.class, resp.getParameter().get(0).getResource().getClass());
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOperationWithBundleResponseJson() throws Exception {
|
||||||
|
|
||||||
|
final String resp = "{\n" +
|
||||||
|
" \"resourceType\":\"Bundle\",\n" +
|
||||||
|
" \"id\":\"8cef5f2a-0ba9-43a5-be26-c8dde9ff0e19\",\n" +
|
||||||
|
" \"base\":\"http://fhirtest.uhn.ca/baseDstu2\"\n" +
|
||||||
|
"}";
|
||||||
|
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
|
@Override
|
||||||
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
|
return new ReaderInputStream(new StringReader(resp), Charset.forName("UTF-8"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://fhirtest.uhn.ca/baseDstu2");
|
||||||
|
|
||||||
|
client.registerInterceptor(new LoggingInterceptor(true));
|
||||||
|
|
||||||
|
// Create the input parameters to pass to the server
|
||||||
|
Parameters inParams = new Parameters();
|
||||||
|
inParams.addParameter().setName("start").setValue(new DateDt("2001-01-01"));
|
||||||
|
inParams.addParameter().setName("end").setValue(new DateDt("2015-03-01"));
|
||||||
|
|
||||||
|
// Invoke $everything on "Patient/1"
|
||||||
|
Parameters outParams = client.operation().onInstance(new IdDt("Patient", "18066")).named("$everything").withParameters(inParams).execute();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that the $everything operation returns a Bundle instead of a Parameters resource. The client operation methods return a Parameters instance however, so HAPI creates a Parameters object
|
||||||
|
* with a single parameter containing the value.
|
||||||
|
*/
|
||||||
|
ca.uhn.fhir.model.dstu2.resource.Bundle responseBundle = (ca.uhn.fhir.model.dstu2.resource.Bundle) outParams.getParameter().get(0).getResource();
|
||||||
|
|
||||||
|
// Print the response bundle
|
||||||
|
assertEquals("8cef5f2a-0ba9-43a5-be26-c8dde9ff0e19", responseBundle.getId().getIdPart());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -352,14 +671,7 @@ public class GenericClientDstu2Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOperationAsGetWithNoInParameters() throws Exception {
|
public void testPageNext() throws Exception {
|
||||||
IParser p = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
Parameters outParams = new Parameters();
|
|
||||||
outParams.addParameter().setValue(new StringDt("STRINGVALOUT1"));
|
|
||||||
outParams.addParameter().setValue(new StringDt("STRINGVALOUT2"));
|
|
||||||
final String respString = p.encodeResourceToString(outParams);
|
|
||||||
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
|
@ -367,7 +679,7 @@ public class GenericClientDstu2Test {
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(getPatientFeedWithOneResult()), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -375,158 +687,37 @@ public class GenericClientDstu2Test {
|
||||||
|
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
|
|
||||||
|
ca.uhn.fhir.model.dstu2.resource.Bundle sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
||||||
|
sourceBundle.getLinkOrCreate(IBaseBundle.LINK_PREV).setUrl("http://foo.bar/prev");
|
||||||
|
sourceBundle.getLinkOrCreate(IBaseBundle.LINK_NEXT).setUrl("http://foo.bar/next");
|
||||||
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
Parameters resp = client
|
ca.uhn.fhir.model.dstu2.resource.Bundle resp = client
|
||||||
.operation()
|
.loadPage()
|
||||||
.onServer()
|
.next(sourceBundle)
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withNoParameters(Parameters.class)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
.execute();
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
assertEquals("http://example.com/fhir/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
assertEquals(respString, p.encodeResourceToString(resp));
|
assertEquals(1, resp.getEntry().size());
|
||||||
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
assertEquals("http://foo.bar/next", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
idx++;
|
idx++;
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
resp = client
|
|
||||||
.operation()
|
|
||||||
.onType(Patient.class)
|
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withNoParameters(Parameters.class)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
assertEquals("http://example.com/fhir/Patient/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
assertEquals(respString, p.encodeResourceToString(resp));
|
|
||||||
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
resp = client
|
|
||||||
.operation()
|
|
||||||
.onInstance(new IdDt("Patient", "123"))
|
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withNoParameters(Parameters.class)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
assertEquals(respString, p.encodeResourceToString(resp));
|
|
||||||
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
// @formatter:off
|
|
||||||
resp = client
|
|
||||||
.operation()
|
|
||||||
.onInstance(new IdDt("http://foo.com/bar/baz/Patient/123/_history/22"))
|
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withNoParameters(Parameters.class)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
|
||||||
// @formatter:on
|
|
||||||
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
idx++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOperationAsGetWithInParameters() throws Exception {
|
public void testPageNextNoLink() throws Exception {
|
||||||
IParser p = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
Parameters inParams = new Parameters();
|
|
||||||
inParams.addParameter().setName("param1").setValue(new StringDt("STRINGVALIN1"));
|
|
||||||
inParams.addParameter().setName("param1").setValue(new StringDt("STRINGVALIN1b"));
|
|
||||||
inParams.addParameter().setName("param2").setValue(new StringDt("STRINGVALIN2"));
|
|
||||||
|
|
||||||
Parameters outParams = new Parameters();
|
|
||||||
outParams.addParameter().setValue(new StringDt("STRINGVALOUT1"));
|
|
||||||
outParams.addParameter().setValue(new StringDt("STRINGVALOUT2"));
|
|
||||||
final String respString = p.encodeResourceToString(outParams);
|
|
||||||
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
|
||||||
@Override
|
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
int idx = 0;
|
ca.uhn.fhir.model.dstu2.resource.Bundle sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
||||||
|
try {
|
||||||
//@formatter:off
|
client.loadPage().next(sourceBundle).execute();
|
||||||
Parameters resp = client
|
} catch (IllegalArgumentException e) {
|
||||||
.operation()
|
assertThat(e.getMessage(), containsString("Can not perform paging operation because no link was found in Bundle with relation \"next\""));
|
||||||
.onServer()
|
}
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withParameters(inParams)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
assertEquals("http://example.com/fhir/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
assertEquals(respString, p.encodeResourceToString(resp));
|
|
||||||
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
resp = client
|
|
||||||
.operation()
|
|
||||||
.onType(Patient.class)
|
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withParameters(inParams)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
assertEquals("http://example.com/fhir/Patient/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
assertEquals(respString, p.encodeResourceToString(resp));
|
|
||||||
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
resp = client
|
|
||||||
.operation()
|
|
||||||
.onInstance(new IdDt("Patient", "123"))
|
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withParameters(inParams)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
assertEquals(respString, p.encodeResourceToString(resp));
|
|
||||||
assertEquals("GET", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
// @formatter:off
|
|
||||||
resp = client
|
|
||||||
.operation()
|
|
||||||
.onInstance(new IdDt("http://foo.com/bar/baz/Patient/123/_history/22"))
|
|
||||||
.named("$SOMEOPERATION")
|
|
||||||
.withParameters(inParams)
|
|
||||||
.useHttpGet()
|
|
||||||
.execute();
|
|
||||||
// @formatter:on
|
|
||||||
assertEquals("http://example.com/fhir/Patient/123/$SOMEOPERATION?param1=STRINGVALIN1¶m1=STRINGVALIN1b¶m2=STRINGVALIN2", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
idx++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOperationWithBundleResponse() throws Exception {
|
public void testPagePrev() throws Exception {
|
||||||
IParser p = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
Parameters inParams = new Parameters();
|
|
||||||
inParams.addParameter().setValue(new StringDt("STRINGVALIN1"));
|
|
||||||
inParams.addParameter().setValue(new StringDt("STRINGVALIN2"));
|
|
||||||
String reqString = p.encodeResourceToString(inParams);
|
|
||||||
|
|
||||||
ca.uhn.fhir.model.dstu2.resource.Bundle outParams = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
|
||||||
outParams.setTotal(123);
|
|
||||||
final String respString = p.encodeResourceToString(outParams);
|
|
||||||
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
|
@ -534,7 +725,7 @@ public class GenericClientDstu2Test {
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(getPatientFeedWithOneResult()), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -542,21 +733,88 @@ public class GenericClientDstu2Test {
|
||||||
|
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
|
|
||||||
|
ca.uhn.fhir.model.dstu2.resource.Bundle sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
||||||
|
sourceBundle.getLinkOrCreate("previous").setUrl("http://foo.bar/prev");
|
||||||
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
Parameters resp = client
|
ca.uhn.fhir.model.dstu2.resource.Bundle resp = client
|
||||||
.operation()
|
.loadPage()
|
||||||
.onServer()
|
.previous(sourceBundle)
|
||||||
.named("$SOMEOPERATION")
|
.execute();
|
||||||
.withParameters(inParams).execute();
|
|
||||||
//@formatter:on
|
//@formatter:on
|
||||||
assertEquals("http://example.com/fhir/$SOMEOPERATION", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
assertEquals(1, resp.getEntry().size());
|
||||||
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
assertEquals("http://foo.bar/prev", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
assertEquals(extractBody(capt, idx), reqString);
|
|
||||||
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
assertEquals(1, resp.getParameter().size());
|
|
||||||
assertEquals(ca.uhn.fhir.model.dstu2.resource.Bundle.class, resp.getParameter().get(0).getResource().getClass());
|
|
||||||
idx++;
|
idx++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try with "prev" instead of "previous"
|
||||||
|
*/
|
||||||
|
|
||||||
|
sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
||||||
|
sourceBundle.getLinkOrCreate("prev").setUrl("http://foo.bar/prev");
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
resp = client
|
||||||
|
.loadPage()
|
||||||
|
.previous(sourceBundle)
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
assertEquals(1, resp.getEntry().size());
|
||||||
|
assertEquals("http://foo.bar/prev", capt.getAllValues().get(idx).getURI().toASCIIString());
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchByString() throws Exception {
|
||||||
|
String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
|
||||||
|
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")));
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
Bundle response = client.search()
|
||||||
|
.forResource("Patient")
|
||||||
|
.where(Patient.NAME.matches().value("james"))
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
assertEquals("http://example.com/fhir/Patient?name=james", capt.getValue().getURI().toString());
|
||||||
|
assertEquals(Patient.class, response.getEntries().get(0).getResource().getClass());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
@Test
|
||||||
|
public void testSearchWithReverseInclude() throws Exception {
|
||||||
|
|
||||||
|
String msg = getPatientFeedWithOneResult();
|
||||||
|
|
||||||
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
||||||
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
|
when(myHttpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")));
|
||||||
|
|
||||||
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
Bundle response = client.search()
|
||||||
|
.forResource(Patient.class)
|
||||||
|
.encodedJson()
|
||||||
|
.revInclude(new Include("Provenance:target"))
|
||||||
|
.execute();
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
assertEquals("http://example.com/fhir/Patient?_revinclude=Provenance%3Atarget&_format=json", capt.getValue().getURI().toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -709,122 +967,6 @@ public class GenericClientDstu2Test {
|
||||||
assertEquals("Patient/2/_history/2", response.getEntry().get(1).getTransactionResponse().getLocation());
|
assertEquals("Patient/2/_history/2", response.getEntry().get(1).getTransactionResponse().getLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDeleteConditional() throws Exception {
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), Constants.STATUS_HTTP_204_NO_CONTENT, ""));
|
|
||||||
// when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type",
|
|
||||||
// Constants.CT_TEXT + "; charset=UTF-8"));
|
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<ReaderInputStream>() {
|
|
||||||
@Override
|
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
|
||||||
return new ReaderInputStream(new StringReader(""), Charset.forName("UTF-8"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
|
||||||
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
client.delete().resourceById(new IdDt("Patient/123")).execute();
|
|
||||||
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
|
|
||||||
assertEquals("http://example.com/fhir/Patient/123", capt.getAllValues().get(idx).getURI().toString());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
client.delete().resourceConditionalByUrl("Patient?name=foo").execute();
|
|
||||||
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
|
|
||||||
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getURI().toString());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
client.delete().resourceConditionalByType("Patient").where(Patient.NAME.matches().value("foo")).execute();
|
|
||||||
assertEquals("DELETE", capt.getAllValues().get(idx).getMethod());
|
|
||||||
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getURI().toString());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreateConditional() throws Exception {
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), Constants.STATUS_HTTP_204_NO_CONTENT, ""));
|
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<ReaderInputStream>() {
|
|
||||||
@Override
|
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
|
||||||
return new ReaderInputStream(new StringReader(""), Charset.forName("UTF-8"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
|
||||||
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
Patient p = new Patient();
|
|
||||||
p.addName().addFamily("FOOFAMILY");
|
|
||||||
|
|
||||||
client.create().resource(p).conditionalByUrl("Patient?name=foo").execute();
|
|
||||||
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
|
||||||
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
|
||||||
assertThat(extractBody(capt, idx), containsString("<family value=\"FOOFAMILY\"/>"));
|
|
||||||
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
|
||||||
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_IF_NONE_EXIST).getValue());
|
|
||||||
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
client.create().resource(p).conditional().where(Patient.NAME.matches().value("foo")).execute();
|
|
||||||
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
|
||||||
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
|
||||||
assertThat(extractBody(capt, idx), containsString("<family value=\"FOOFAMILY\"/>"));
|
|
||||||
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
|
||||||
assertEquals("http://example.com/fhir/Patient?name=foo", capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_IF_NONE_EXIST).getValue());
|
|
||||||
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreate() throws Exception {
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), Constants.STATUS_HTTP_204_NO_CONTENT, ""));
|
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<ReaderInputStream>() {
|
|
||||||
@Override
|
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
|
||||||
return new ReaderInputStream(new StringReader(""), Charset.forName("UTF-8"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
|
||||||
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
Patient p = new Patient();
|
|
||||||
p.addName().addFamily("FOOFAMILY");
|
|
||||||
|
|
||||||
client.create().resource(p).execute();
|
|
||||||
|
|
||||||
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
|
||||||
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
|
||||||
assertThat(extractBody(capt, idx), containsString("<family value=\"FOOFAMILY\"/>"));
|
|
||||||
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
|
||||||
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
p.setId("123");
|
|
||||||
|
|
||||||
client.create().resource(p).execute();
|
|
||||||
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
|
|
||||||
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
|
|
||||||
String body = extractBody(capt, idx);
|
|
||||||
assertThat(body, containsString("<family value=\"FOOFAMILY\"/>"));
|
|
||||||
assertThat(body, not(containsString("123")));
|
|
||||||
assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(idx).getURI().toString());
|
|
||||||
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateConditional() throws Exception {
|
public void testUpdateConditional() throws Exception {
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
|
@ -878,106 +1020,9 @@ public class GenericClientDstu2Test {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String extractBody(ArgumentCaptor<HttpUriRequest> capt, int count) throws IOException {
|
@BeforeClass
|
||||||
String body = IOUtils.toString(((HttpEntityEnclosingRequestBase) capt.getAllValues().get(count)).getEntity().getContent(), "UTF-8");
|
public static void beforeClass() {
|
||||||
return body;
|
ourCtx = FhirContext.forDstu2();
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPageNext() throws Exception {
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
|
||||||
@Override
|
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
|
||||||
return new ReaderInputStream(new StringReader(getPatientFeedWithOneResult()), Charset.forName("UTF-8"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
|
||||||
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
ca.uhn.fhir.model.dstu2.resource.Bundle sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
|
||||||
sourceBundle.getLinkOrCreate(IBaseBundle.LINK_PREV).setUrl("http://foo.bar/prev");
|
|
||||||
sourceBundle.getLinkOrCreate(IBaseBundle.LINK_NEXT).setUrl("http://foo.bar/next");
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
ca.uhn.fhir.model.dstu2.resource.Bundle resp = client
|
|
||||||
.loadPage()
|
|
||||||
.next(sourceBundle)
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
assertEquals(1, resp.getEntry().size());
|
|
||||||
assertEquals("http://foo.bar/next", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPagePrev() throws Exception {
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
|
||||||
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
|
|
||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
|
||||||
@Override
|
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
|
||||||
return new ReaderInputStream(new StringReader(getPatientFeedWithOneResult()), Charset.forName("UTF-8"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
|
||||||
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
ca.uhn.fhir.model.dstu2.resource.Bundle sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
|
||||||
sourceBundle.getLinkOrCreate("previous").setUrl("http://foo.bar/prev");
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
ca.uhn.fhir.model.dstu2.resource.Bundle resp = client
|
|
||||||
.loadPage()
|
|
||||||
.previous(sourceBundle)
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
assertEquals(1, resp.getEntry().size());
|
|
||||||
assertEquals("http://foo.bar/prev", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try with "prev" instead of "previous"
|
|
||||||
*/
|
|
||||||
|
|
||||||
sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
|
||||||
sourceBundle.getLinkOrCreate("prev").setUrl("http://foo.bar/prev");
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
resp = client
|
|
||||||
.loadPage()
|
|
||||||
.previous(sourceBundle)
|
|
||||||
.execute();
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
assertEquals(1, resp.getEntry().size());
|
|
||||||
assertEquals("http://foo.bar/prev", capt.getAllValues().get(idx).getURI().toASCIIString());
|
|
||||||
idx++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPageNextNoLink() throws Exception {
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
|
||||||
|
|
||||||
ca.uhn.fhir.model.dstu2.resource.Bundle sourceBundle = new ca.uhn.fhir.model.dstu2.resource.Bundle();
|
|
||||||
try {
|
|
||||||
client.loadPage().next(sourceBundle).execute();
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
assertThat(e.getMessage(), containsString("Can not perform paging operation because no link was found in Bundle with relation \"next\""));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
4
pom.xml
4
pom.xml
|
@ -465,6 +465,9 @@
|
||||||
<copy todir="target/site/apidocs-dstu">
|
<copy todir="target/site/apidocs-dstu">
|
||||||
<fileset dir="hapi-fhir-structures-dstu/target/site/apidocs"/>
|
<fileset dir="hapi-fhir-structures-dstu/target/site/apidocs"/>
|
||||||
</copy>
|
</copy>
|
||||||
|
<copy todir="target/site/apidocs-hl7org-dstu2">
|
||||||
|
<fileset dir="hapi-fhir-structures-hl7org-dstu2/target/site/apidocs"/>
|
||||||
|
</copy>
|
||||||
<copy todir="target/site/apidocs-dstu2">
|
<copy todir="target/site/apidocs-dstu2">
|
||||||
<fileset dir="hapi-fhir-structures-dstu2/target/site/apidocs"/>
|
<fileset dir="hapi-fhir-structures-dstu2/target/site/apidocs"/>
|
||||||
</copy>
|
</copy>
|
||||||
|
@ -833,6 +836,7 @@
|
||||||
<module>hapi-fhir-base</module>
|
<module>hapi-fhir-base</module>
|
||||||
<module>hapi-fhir-structures-dstu</module>
|
<module>hapi-fhir-structures-dstu</module>
|
||||||
<module>hapi-fhir-structures-dstu2</module>
|
<module>hapi-fhir-structures-dstu2</module>
|
||||||
|
<module>hapi-fhir-structures-hl7org-dstu2</module>
|
||||||
<module>hapi-fhir-jpaserver-base</module>
|
<module>hapi-fhir-jpaserver-base</module>
|
||||||
<module>examples</module>
|
<module>examples</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
|
@ -42,6 +42,16 @@
|
||||||
used to validate resources as they are being parsed, and optionally fail if invalid/unexpected
|
used to validate resources as they are being parsed, and optionally fail if invalid/unexpected
|
||||||
elements are found in resource bodies during parsing.
|
elements are found in resource bodies during parsing.
|
||||||
</action>
|
</action>
|
||||||
|
<action type="fix">
|
||||||
|
IParser#parseResource(Class, String) method, which is used to parse a resource into the given
|
||||||
|
structure will now throw a DataFormatException if the structure is for the wrong type of
|
||||||
|
resource for the one actually found in the input String (or Reader). For example, if a Patient
|
||||||
|
resource is being parsed into Organization.class this will now cause an error. Previously,
|
||||||
|
the XML parser would ignore the type and the JSON parser would fail. This also caused
|
||||||
|
operations to not parse correctly if they returned a resource type other than
|
||||||
|
parameters with JSON encoding (e.g. the $everything operation on UHN's test server).
|
||||||
|
Thanks to Avinash Shanbhag for reporting!
|
||||||
|
</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="1.0" date="2015-May-8">
|
<release version="1.0" date="2015-May-8">
|
||||||
<action type="add">
|
<action type="add">
|
||||||
|
|
|
@ -107,6 +107,7 @@
|
||||||
<item name="Core API" href="./apidocs/index.html" />
|
<item name="Core API" href="./apidocs/index.html" />
|
||||||
<item name="Model API (DSTU1)" href="./apidocs-dstu/index.html" />
|
<item name="Model API (DSTU1)" href="./apidocs-dstu/index.html" />
|
||||||
<item name="Model API (DSTU2)" href="./apidocs-dstu2/index.html" />
|
<item name="Model API (DSTU2)" href="./apidocs-dstu2/index.html" />
|
||||||
|
<item name="Model API (RI DSTU2)" href="./apidocs-hl7org-dstu2/index.html" />
|
||||||
<item name="JPA Server API" href="./apidocs-jpaserver/index.html" />
|
<item name="JPA Server API" href="./apidocs-jpaserver/index.html" />
|
||||||
</item>
|
</item>
|
||||||
<item name="Maven Plugin (hapi-tinder-plugin)" href="./doc_tinder.html" />
|
<item name="Maven Plugin (hapi-tinder-plugin)" href="./doc_tinder.html" />
|
||||||
|
|
Loading…
Reference in New Issue