diff --git a/hapi-fhir-android/dependency-reduced-pom.xml b/hapi-fhir-android/dependency-reduced-pom.xml index 1e0c0d8a940..6df73284874 100644 --- a/hapi-fhir-android/dependency-reduced-pom.xml +++ b/hapi-fhir-android/dependency-reduced-pom.xml @@ -55,6 +55,7 @@ org.glassfish:javax.json org.codehaus.woodstox:woodstox-core-asl javax.xml.stream:stax-api + javax.servlet:javax.servlet-api org.codehaus.woodstox:stax2-api org.slf4j:slf4j* org.apache.commons:* @@ -128,12 +129,6 @@ 4.3.6 compile - - javax.servlet - javax.servlet-api - 3.1.0 - compile - junit junit diff --git a/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java b/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java index 0d189ac743f..099fcb1d779 100644 --- a/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java +++ b/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java @@ -1,15 +1,7 @@ package ca.uhn.fhir.parser; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.stringContainsInOrder; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; import java.io.IOException; import java.io.InputStreamReader; @@ -84,6 +76,43 @@ public class XmlParserTest { private static FhirContext ourCtx; private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParserTest.class); + /** + * 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( + "", + "", + "", + "", + "" + )); + //@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 public void testComposition() { diff --git a/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/Dstu2BundleFactory.java b/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/Dstu2BundleFactory.java index 97dcd710ae5..63139e1f4d9 100644 --- a/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/Dstu2BundleFactory.java +++ b/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/Dstu2BundleFactory.java @@ -252,11 +252,11 @@ public class Dstu2BundleFactory implements IVersionSpecificBundleFactory { if (searchId != null) { if (theOffset + numToReturn < theResult.size()) { - myBundle.addLink().setRelation(Constants.LINK_NEXT).setUrl(RestfulServerUtils.createPagingLink(theServerBase, searchId, theOffset + numToReturn, numToReturn, theResponseEncoding, thePrettyPrint)); + myBundle.addLink().setRelation(Constants.LINK_NEXT).setUrl(RestfulServerUtils.createPagingLink(theIncludes, theServerBase, searchId, theOffset + numToReturn, numToReturn, theResponseEncoding, thePrettyPrint)); } if (theOffset > 0) { int start = Math.max(0, theOffset - limit); - myBundle.addLink().setRelation(Constants.LINK_PREVIOUS).setUrl(RestfulServerUtils.createPagingLink(theServerBase, searchId, start, limit, theResponseEncoding, thePrettyPrint)); + myBundle.addLink().setRelation(Constants.LINK_PREVIOUS).setUrl(RestfulServerUtils.createPagingLink(theIncludes, theServerBase, searchId, start, limit, theResponseEncoding, thePrettyPrint)); } } } diff --git a/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/JsonParserTest.java b/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/JsonParserDstu2Test.java similarity index 90% rename from hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/JsonParserTest.java rename to hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/JsonParserDstu2Test.java index 5c5078dc6e3..aed681b2947 100644 --- a/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/JsonParserTest.java +++ b/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/JsonParserDstu2Test.java @@ -6,14 +6,15 @@ import static org.junit.Assert.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Observable; import net.sf.json.JSON; import net.sf.json.JSONSerializer; import net.sf.json.JsonConfig; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.hamcrest.Matchers; +import org.junit.Assert; import org.junit.Test; import ca.uhn.fhir.context.ConfigurationException; @@ -28,19 +29,23 @@ import ca.uhn.fhir.model.base.composite.BaseCodingDt; import ca.uhn.fhir.model.dstu2.composite.CodingDt; import ca.uhn.fhir.model.dstu2.composite.HumanNameDt; import ca.uhn.fhir.model.dstu2.resource.Binary; +import ca.uhn.fhir.model.dstu2.resource.DiagnosticReport; +import ca.uhn.fhir.model.dstu2.resource.Medication; import ca.uhn.fhir.model.dstu2.resource.MedicationPrescription; import ca.uhn.fhir.model.dstu2.resource.Observation; import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.QuestionnaireAnswers; import ca.uhn.fhir.model.dstu2.valueset.IdentifierUseEnum; +import ca.uhn.fhir.model.dstu2.valueset.ObservationReliabilityEnum; +import ca.uhn.fhir.model.dstu2.valueset.ObservationStatusEnum; import ca.uhn.fhir.model.primitive.DateDt; import ca.uhn.fhir.model.primitive.DateTimeDt; import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.StringDt; -public class JsonParserTest { - private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(JsonParserTest.class); +public class JsonParserDstu2Test { + private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(JsonParserDstu2Test.class); private static final FhirContext ourCtx = FhirContext.forDstu2(); @Test @@ -54,6 +59,54 @@ public class JsonParserTest { assertEquals("{\"resourceType\":\"Binary\",\"id\":\"11\",\"meta\":{\"versionId\":\"22\"},\"contentType\":\"foo\",\"content\":\"AQIDBA==\"}", val); } + /** + * See #144 and #146 + */ + @Test + public void testReportSerialize() { + + ReportObservation obsv = new ReportObservation(); + obsv.getCode().addCoding().setCode("name"); + obsv.setValue(new StringDt("value test")); + obsv.setStatus(ObservationStatusEnum.FINAL); + obsv.setReliability(ObservationReliabilityEnum.OK); + obsv.addIdentifier().setSystem("System").setValue("id value"); + + DiagnosticReport report = new DiagnosticReport(); + report.getContained().getContainedResources().add(obsv); + report.addResult().setResource(obsv); + + IParser parser = new FhirContext().newXmlParser().setPrettyPrint(true); + String message = parser.encodeResourceToString(report); + ourLog.info(message); + Assert.assertThat(message, containsString("contained")); + } + + /** + * See #144 and #146 + */ + @Test + public void testReportSerializeWithMatchingId() { + + ReportObservation obsv = new ReportObservation(); + obsv.getCode().addCoding().setCode("name"); + obsv.setValue(new StringDt("value test")); + obsv.setStatus(ObservationStatusEnum.FINAL); + obsv.setReliability(ObservationReliabilityEnum.OK); + obsv.addIdentifier().setSystem("System").setValue("id value"); + + DiagnosticReport report = new DiagnosticReport(); + report.getContained().getContainedResources().add(obsv); + + obsv.setId("#123"); + report.addResult().setReference("#123"); + + IParser parser = new FhirContext().newXmlParser().setPrettyPrint(true); + String message = parser.encodeResourceToString(report); + ourLog.info(message); + Assert.assertThat(message, containsString("contained")); + } + /** * see #144 and #146 */ @@ -69,10 +122,10 @@ public class JsonParserTest { 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( "\"resourceType\":\"Observation\"", @@ -82,10 +135,10 @@ public class JsonParserTest { "\"reference\":\"#1\"" )); //@formatter:on - + o = parser.parseResource(Observation.class, enc); assertEquals("obs text", o.getCode().getText()); - + assertNotNull(o.getSubject().getResource()); p = (Patient) o.getSubject().getResource(); assertEquals("patient family", p.getNameFirstRep().getFamilyAsSingleString()); @@ -217,7 +270,7 @@ public class JsonParserTest { */ @Test public void testEncodeBundleWithDeletedEntry() throws ConfigurationException, DataFormatException, IOException { - Bundle b = ourCtx.newXmlParser().parseBundle(IOUtils.toString(JsonParserTest.class.getResourceAsStream("/xml-bundle.xml"))); + Bundle b = ourCtx.newXmlParser().parseBundle(IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/xml-bundle.xml"))); String val = ourCtx.newJsonParser().encodeBundleToString(b); ourLog.info(val); @@ -417,7 +470,7 @@ public class JsonParserTest { @Test public void testParseAndEncodeBundle() throws Exception { - String content = IOUtils.toString(JsonParserTest.class.getResourceAsStream("/bundle-example.json")); + String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-example.json")); Bundle parsed = ourCtx.newJsonParser().parseBundle(content); assertEquals("http://example.com/base/Bundle/example/_history/1", parsed.getId().getValue()); @@ -437,6 +490,10 @@ public class JsonParserTest { assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString()); assertEquals("http://example.com/base/MedicationPrescription/3123/_history/1", p.getId().getValue()); + Medication m = (Medication) parsed.getEntries().get(1).getResource(); + assertEquals("http://example.com/base/Medication/example", m.getId().getValue()); + assertSame(p.getMedication().getResource(), m); + String reencoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeBundleToString(parsed); ourLog.info(reencoded); @@ -457,7 +514,7 @@ public class JsonParserTest { @Test public void testParseAndEncodeBundleOldStyle() throws Exception { - String content = IOUtils.toString(JsonParserTest.class.getResourceAsStream("/bundle-transaction.json")); + String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-transaction.json")); Bundle parsed = ourCtx.newJsonParser().parseBundle(content); // assertEquals("http://example.com/base/Bundle/example/_history/1", parsed.getId().getValue()); @@ -502,7 +559,7 @@ public class JsonParserTest { @Test public void testParseAndEncodeBundleNewStyle() throws Exception { - String content = IOUtils.toString(JsonParserTest.class.getResourceAsStream("/bundle-example.json")); + String content = IOUtils.toString(JsonParserDstu2Test.class.getResourceAsStream("/bundle-example.json")); ca.uhn.fhir.model.dstu2.resource.Bundle parsed = ourCtx.newJsonParser().parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, content); assertEquals("http://example.com/base/Bundle/example/_history/1", parsed.getId().getValue()); diff --git a/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/ReportObservation.java b/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/ReportObservation.java new file mode 100644 index 00000000000..fe0116a6cfb --- /dev/null +++ b/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/ReportObservation.java @@ -0,0 +1,111 @@ +package ca.uhn.fhir.parser; + +import ca.uhn.fhir.model.api.annotation.Child; +import ca.uhn.fhir.model.api.annotation.Description; +import ca.uhn.fhir.model.api.annotation.Extension; +import ca.uhn.fhir.model.api.annotation.ResourceDef; +import ca.uhn.fhir.model.dstu2.resource.Observation; +import ca.uhn.fhir.model.primitive.BooleanDt; +import ca.uhn.fhir.model.primitive.StringDt; +import ca.uhn.fhir.util.ElementUtil; + +@ResourceDef(name = "Observation", id = "reportobservation") +public class ReportObservation extends Observation { + + /** + * Each extension is defined in a field. Any valid HAPI Data Type can be used for the field type. Note that the + * [name=""] attribute in the @Child annotation needs to match the name for the bean accessor and mutator methods. + */ + @Child(name = "mandatory", order = 0) + @Extension(url = "#mandatory", definedLocally = true, isModifier = false) + @Description(shortDefinition = "The report observation is mandatory or not") + private BooleanDt mandatory; + + @Child(name = "readOnly", order = 1) + @Extension(url = "#readOnly", definedLocally = true, isModifier = false) + @Description(shortDefinition = "The report observation is read only or not") + private BooleanDt readOnly; + + @Child(name = "defaultCursor", order = 2) + @Extension(url = "#defaultCursor", definedLocally = true, isModifier = false) + @Description(shortDefinition = "The report observation is default cursor or not") + private BooleanDt defaultCursor; + + @Child(name = "sectionContentId", order = 3) + @Extension(url = "#sectionContentId", definedLocally = true, isModifier = false) + @Description(shortDefinition = "The primary key of the report section content") + private StringDt sectionContentId; + + /** + * It is important to override the isEmpty() method, adding a check for any newly added fields. + */ + @Override + public boolean isEmpty() { + return super.isEmpty() && ElementUtil.isEmpty(mandatory, readOnly, defaultCursor, sectionContentId); + } + + /******** + * Accessors and mutators follow + * + * IMPORTANT: Each extension is required to have an getter/accessor and a stter/mutator. You are highly recommended + * to create getters which create instances if they do not already exist, since this is how the rest of the HAPI + * FHIR API works. + ********/ + + /** Getter for mandatory */ + public BooleanDt getMandatory() { + if (mandatory == null) { + mandatory = new BooleanDt(false); + } + return mandatory; + } + + /** Setter for mandatory */ + public ReportObservation setMandatory(Boolean isMandatory) { + mandatory = new BooleanDt(isMandatory); + return this; + } + + /** Getter for readOnly */ + public BooleanDt getReadOnly() { + if (readOnly == null) { + readOnly = new BooleanDt(false); + } + return readOnly; + } + + /** Setter for readOnly */ + public ReportObservation setReadOnly(Boolean isReadOnly) { + readOnly = new BooleanDt(isReadOnly); + return this; + } + + /** Getter for defaultCursor */ + public BooleanDt getDefaultCursor() { + if (defaultCursor == null) { + defaultCursor = new BooleanDt(false); + } + return defaultCursor; + } + + /** Setter for defaultCursor */ + public ReportObservation setDefaultCursor(Boolean isDefaultCursor) { + defaultCursor = new BooleanDt(isDefaultCursor); + return this; + } + + /** Getter for sectionContentId */ + public StringDt getSectionContentId() { + if (sectionContentId == null) { + sectionContentId = new StringDt(); + } + return sectionContentId; + } + + /** Setter for sectionContentId */ + public ReportObservation setSectionContentId(String sectionContentId) { + this.sectionContentId = new StringDt(sectionContentId); + return this; + } + +} \ No newline at end of file diff --git a/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java b/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/XmlParserDstu2Test.java similarity index 98% rename from hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java rename to hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/XmlParserDstu2Test.java index dff3393cd66..3c6139640a7 100644 --- a/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java +++ b/hapi-fhir-structures-dstu2/src/test/java/ca/uhn/fhir/parser/XmlParserDstu2Test.java @@ -43,8 +43,8 @@ import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.StringDt; -public class XmlParserTest { - private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParserTest.class); +public class XmlParserDstu2Test { + private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParserDstu2Test.class); private static final FhirContext ourCtx = FhirContext.forDstu2(); @BeforeClass @@ -384,7 +384,7 @@ public class XmlParserTest { @Test public void testParseAndEncodeBundle() throws Exception { - String content = IOUtils.toString(XmlParserTest.class.getResourceAsStream("/bundle-example.xml")); + String content = IOUtils.toString(XmlParserDstu2Test.class.getResourceAsStream("/bundle-example.xml")); Bundle parsed = ourCtx.newXmlParser().parseBundle(content); assertEquals("http://example.com/base/Bundle/example/_history/1", parsed.getId().getValue()); @@ -415,7 +415,7 @@ public class XmlParserTest { @Test public void testParseAndEncodeBundleNewStyle() throws Exception { - String content = IOUtils.toString(XmlParserTest.class.getResourceAsStream("/bundle-example.xml")); + String content = IOUtils.toString(XmlParserDstu2Test.class.getResourceAsStream("/bundle-example.xml")); IParser newXmlParser = ourCtx.newXmlParser(); ca.uhn.fhir.model.dstu2.resource.Bundle parsed = newXmlParser.parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, content);