Add model visitor, and allow bundles to have categories (as allowed in the spec)
This commit is contained in:
parent
fd41bafa82
commit
598eec53ed
|
@ -17,22 +17,19 @@ import ca.uhn.fhir.rest.method.SearchStyleEnum;
|
||||||
|
|
||||||
public class GenericClientExample {
|
public class GenericClientExample {
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public static void simpleExample() {
|
public static void simpleExample() {
|
||||||
// START SNIPPET: simple
|
// START SNIPPET: simple
|
||||||
FhirContext ctx = new FhirContext();
|
FhirContext ctx = new FhirContext();
|
||||||
String serverBase = "http://fhir.healthintersections.com.au/open";
|
String serverBase = "http://fhirtest.uhn.ca/base";
|
||||||
IGenericClient client = ctx.newRestfulGenericClient(serverBase);
|
IGenericClient client = ctx.newRestfulGenericClient(serverBase);
|
||||||
|
|
||||||
// Read a patient
|
// Perform a search
|
||||||
Patient patient = client.read(Patient.class, "1");
|
Bundle results = client.search()
|
||||||
|
.forResource(Patient.class)
|
||||||
|
.where(Patient.FAMILY.matches().value("duck"))
|
||||||
|
.execute();
|
||||||
|
|
||||||
// Change the patient and update it to the server
|
System.out.println("Found " + results.size() + " patients named 'duck'");
|
||||||
patient.getNameFirstRep().getFamilyFirstRep().setValue("Jones");
|
|
||||||
client.update("1", patient);
|
|
||||||
|
|
||||||
// Return the version history for that patient
|
|
||||||
Bundle versions = client.history(Patient.class, "1",null,null);
|
|
||||||
// END SNIPPET: simple
|
// END SNIPPET: simple
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,7 +174,7 @@ List<IResource> response = client.transaction()
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// nothing
|
simpleExample();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,10 @@
|
||||||
Transaction method in server can now have parameter type Bundle instead of
|
Transaction method in server can now have parameter type Bundle instead of
|
||||||
List<IResource>
|
List<IResource>
|
||||||
</action>
|
</action>
|
||||||
|
<action type="add">
|
||||||
|
HAPI parsers now use field access to get/set values instead of method accessors and mutators.
|
||||||
|
This should give a small performance boost.
|
||||||
|
</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="0.5" date="2014-Jul-30">
|
<release version="0.5" date="2014-Jul-30">
|
||||||
<action type="add">
|
<action type="add">
|
||||||
|
|
|
@ -44,11 +44,6 @@ public class Bundle extends BaseBundle /* implements IElement */{
|
||||||
|
|
||||||
private volatile transient Map<IdDt, IResource> myIdToEntries;
|
private volatile transient Map<IdDt, IResource> myIdToEntries;
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
/* ****************************************************
|
|
||||||
* NB: add any new fields to the isEmpty() method!!!
|
|
||||||
*****************************************************/
|
|
||||||
//@formatter:on
|
|
||||||
private List<BundleEntry> myEntries;
|
private List<BundleEntry> myEntries;
|
||||||
private StringDt myBundleId;
|
private StringDt myBundleId;
|
||||||
private StringDt myLinkBase;
|
private StringDt myLinkBase;
|
||||||
|
@ -61,6 +56,7 @@ public class Bundle extends BaseBundle /* implements IElement */{
|
||||||
private StringDt myTitle;
|
private StringDt myTitle;
|
||||||
private IntegerDt myTotalResults;
|
private IntegerDt myTotalResults;
|
||||||
private InstantDt myUpdated;
|
private InstantDt myUpdated;
|
||||||
|
private TagList myCategories;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if this bundle contains zero entries
|
* Returns true if this bundle contains zero entries
|
||||||
|
@ -70,6 +66,16 @@ public class Bundle extends BaseBundle /* implements IElement */{
|
||||||
return getEntries().isEmpty();
|
return getEntries().isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Tag addCategory() {
|
||||||
|
Tag retVal = new Tag();
|
||||||
|
getCategories().add(retVal);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCategory(Tag theTag) {
|
||||||
|
getCategories().add(theTag);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds and returns a new bundle entry
|
* Adds and returns a new bundle entry
|
||||||
*/
|
*/
|
||||||
|
@ -82,12 +88,15 @@ public class Bundle extends BaseBundle /* implements IElement */{
|
||||||
/**
|
/**
|
||||||
* Retrieves a resource from a bundle given its logical ID.
|
* Retrieves a resource from a bundle given its logical ID.
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Important usage notes</b>: This method ignores base URLs (so passing in an ID of <code>http://foo/Patient/123</code> will return a resource if it has the logical ID of
|
* <b>Important usage notes</b>: This method ignores base URLs (so passing in an ID of
|
||||||
* <code>http://bar/Patient/123</code>. Also, this method is intended to be used for bundles which have already been populated. It will cache its results for fast performance, but that means that
|
* <code>http://foo/Patient/123</code> will return a resource if it has the logical ID of
|
||||||
* modifications to the bundle after this method is called may not be accurately reflected.
|
* <code>http://bar/Patient/123</code>. Also, this method is intended to be used for bundles which have already been
|
||||||
|
* populated. It will cache its results for fast performance, but that means that modifications to the bundle after
|
||||||
|
* this method is called may not be accurately reflected.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param theId The resource ID
|
* @param theId
|
||||||
|
* The resource ID
|
||||||
* @return Returns the resource with the given ID, or <code>null</code> if none is found
|
* @return Returns the resource with the given ID, or <code>null</code> if none is found
|
||||||
*/
|
*/
|
||||||
public IResource getResourceById(IdDt theId) {
|
public IResource getResourceById(IdDt theId) {
|
||||||
|
@ -129,6 +138,18 @@ public class Bundle extends BaseBundle /* implements IElement */{
|
||||||
// c.update().resource(txt).withId("1665").execute();
|
// c.update().resource(txt).withId("1665").execute();
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
|
|
||||||
|
public TagList getCategories() {
|
||||||
|
if (myCategories == null) {
|
||||||
|
myCategories = new TagList();
|
||||||
|
}
|
||||||
|
return myCategories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCategories(TagList theCategories) {
|
||||||
|
myCategories = theCategories;
|
||||||
|
}
|
||||||
|
|
||||||
public List<BundleEntry> getEntries() {
|
public List<BundleEntry> getEntries() {
|
||||||
if (myEntries == null) {
|
if (myEntries == null) {
|
||||||
myEntries = new ArrayList<BundleEntry>();
|
myEntries = new ArrayList<BundleEntry>();
|
||||||
|
|
|
@ -167,6 +167,8 @@ public class JsonParser extends BaseParser implements IParser {
|
||||||
eventWriter.writeEnd();
|
eventWriter.writeEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
writeCategories(eventWriter, theBundle.getCategories());
|
||||||
|
|
||||||
writeOptionalTagWithTextNode(eventWriter, "totalResults", theBundle.getTotalResults());
|
writeOptionalTagWithTextNode(eventWriter, "totalResults", theBundle.getTotalResults());
|
||||||
|
|
||||||
writeAuthor(theBundle, eventWriter);
|
writeAuthor(theBundle, eventWriter);
|
||||||
|
@ -193,17 +195,7 @@ public class JsonParser extends BaseParser implements IParser {
|
||||||
writeOptionalTagWithTextNode(eventWriter, "updated", nextEntry.getUpdated());
|
writeOptionalTagWithTextNode(eventWriter, "updated", nextEntry.getUpdated());
|
||||||
writeOptionalTagWithTextNode(eventWriter, "published", nextEntry.getPublished());
|
writeOptionalTagWithTextNode(eventWriter, "published", nextEntry.getPublished());
|
||||||
|
|
||||||
if (nextEntry.getCategories() != null && nextEntry.getCategories().size() > 0) {
|
writeCategories(eventWriter, nextEntry.getCategories());
|
||||||
eventWriter.writeStartArray("category");
|
|
||||||
for (Tag next : nextEntry.getCategories()) {
|
|
||||||
eventWriter.writeStartObject();
|
|
||||||
eventWriter.write("term", defaultString(next.getTerm()));
|
|
||||||
eventWriter.write("label", defaultString(next.getLabel()));
|
|
||||||
eventWriter.write("scheme", defaultString(next.getScheme()));
|
|
||||||
eventWriter.writeEnd();
|
|
||||||
}
|
|
||||||
eventWriter.writeEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
writeAuthor(nextEntry, eventWriter);
|
writeAuthor(nextEntry, eventWriter);
|
||||||
|
|
||||||
|
@ -221,6 +213,20 @@ public class JsonParser extends BaseParser implements IParser {
|
||||||
eventWriter.flush();
|
eventWriter.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void writeCategories(JsonGenerator eventWriter, TagList categories) {
|
||||||
|
if (categories != null && categories.size() > 0) {
|
||||||
|
eventWriter.writeStartArray("category");
|
||||||
|
for (Tag next : categories) {
|
||||||
|
eventWriter.writeStartObject();
|
||||||
|
eventWriter.write("term", defaultString(next.getTerm()));
|
||||||
|
eventWriter.write("label", defaultString(next.getLabel()));
|
||||||
|
eventWriter.write("scheme", defaultString(next.getScheme()));
|
||||||
|
eventWriter.writeEnd();
|
||||||
|
}
|
||||||
|
eventWriter.writeEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void encodeChildElementToStreamWriter(RuntimeResourceDefinition theResDef, IResource theResource, JsonGenerator theWriter, IElement theValue, BaseRuntimeElementDefinition<?> theChildDef,
|
private void encodeChildElementToStreamWriter(RuntimeResourceDefinition theResDef, IResource theResource, JsonGenerator theWriter, IElement theValue, BaseRuntimeElementDefinition<?> theChildDef,
|
||||||
String theChildName) throws IOException {
|
String theChildName) throws IOException {
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,7 @@ package ca.uhn.fhir.parser;
|
||||||
* #L%
|
* #L%
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
|
import static org.apache.commons.lang3.StringUtils.*;
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -67,6 +66,7 @@ import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.model.primitive.InstantDt;
|
import ca.uhn.fhir.model.primitive.InstantDt;
|
||||||
import ca.uhn.fhir.model.primitive.XhtmlDt;
|
import ca.uhn.fhir.model.primitive.XhtmlDt;
|
||||||
import ca.uhn.fhir.rest.server.Constants;
|
import ca.uhn.fhir.rest.server.Constants;
|
||||||
|
import ca.uhn.fhir.util.IModelVisitor;
|
||||||
|
|
||||||
class ParserState<T> {
|
class ParserState<T> {
|
||||||
|
|
||||||
|
@ -628,6 +628,8 @@ class ParserState<T> {
|
||||||
push(new AtomPrimitiveState(myInstance.getUpdated()));
|
push(new AtomPrimitiveState(myInstance.getUpdated()));
|
||||||
} else if ("author".equals(theLocalPart)) {
|
} else if ("author".equals(theLocalPart)) {
|
||||||
push(new AtomAuthorState(myInstance));
|
push(new AtomAuthorState(myInstance));
|
||||||
|
} else if ("category".equals(theLocalPart)) {
|
||||||
|
push(new AtomCategoryState(myInstance.getCategories().addTag()));
|
||||||
} else if ("deleted-entry".equals(theLocalPart) && verifyNamespace(XmlParser.TOMBSTONES_NS, theNamespaceURI)) {
|
} else if ("deleted-entry".equals(theLocalPart) && verifyNamespace(XmlParser.TOMBSTONES_NS, theNamespaceURI)) {
|
||||||
push(new AtomDeletedEntryState(myInstance, myResourceType));
|
push(new AtomDeletedEntryState(myInstance, myResourceType));
|
||||||
} else {
|
} else {
|
||||||
|
@ -908,7 +910,7 @@ class ParserState<T> {
|
||||||
public void attributeValue(String theName, String theValue) throws DataFormatException {
|
public void attributeValue(String theName, String theValue) throws DataFormatException {
|
||||||
if ("id".equals(theName)) {
|
if ("id".equals(theName)) {
|
||||||
if (myInstance instanceof IIdentifiableElement) {
|
if (myInstance instanceof IIdentifiableElement) {
|
||||||
((IIdentifiableElement) myInstance).setId(new IdDt(theValue));
|
((IIdentifiableElement) myInstance).setElementSpecificId((theValue));
|
||||||
} else if (myInstance instanceof IResource) {
|
} else if (myInstance instanceof IResource) {
|
||||||
((IResource) myInstance).setId(new IdDt(theValue));
|
((IResource) myInstance).setId(new IdDt(theValue));
|
||||||
}
|
}
|
||||||
|
@ -1255,7 +1257,17 @@ class ParserState<T> {
|
||||||
myObject = (T) myInstance;
|
myObject = (T) myInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ResourceReferenceDt nextRef : myResourceReferences) {
|
myContext.newTerser().visit(myInstance, new IModelVisitor() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void acceptUndeclaredExtension(ISupportsUndeclaredExtensions theContainingElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition, ExtensionDt theNextExt) {
|
||||||
|
acceptElement(theNextExt.getValue(), null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void acceptElement(IElement theElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition) {
|
||||||
|
if (theElement instanceof ResourceReferenceDt) {
|
||||||
|
ResourceReferenceDt nextRef = (ResourceReferenceDt)theElement;
|
||||||
String ref = nextRef.getReference().getValue();
|
String ref = nextRef.getReference().getValue();
|
||||||
if (isNotBlank(ref)) {
|
if (isNotBlank(ref)) {
|
||||||
if (ref.startsWith("#")) {
|
if (ref.startsWith("#")) {
|
||||||
|
@ -1268,6 +1280,8 @@ class ParserState<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,8 @@ public class XmlParser extends BaseParser implements IParser {
|
||||||
eventWriter.writeEndElement();
|
eventWriter.writeEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
writeCategories(eventWriter, theBundle.getCategories());
|
||||||
|
|
||||||
for (BundleEntry nextEntry : theBundle.getEntries()) {
|
for (BundleEntry nextEntry : theBundle.getEntries()) {
|
||||||
boolean deleted = false;
|
boolean deleted = false;
|
||||||
if (nextEntry.getDeletedAt() != null && nextEntry.getDeletedAt().isEmpty() == false) {
|
if (nextEntry.getDeletedAt() != null && nextEntry.getDeletedAt().isEmpty() == false) {
|
||||||
|
@ -182,15 +184,7 @@ public class XmlParser extends BaseParser implements IParser {
|
||||||
writeOptionalTagWithTextNode(eventWriter, "updated", nextEntry.getUpdated());
|
writeOptionalTagWithTextNode(eventWriter, "updated", nextEntry.getUpdated());
|
||||||
writeOptionalTagWithTextNode(eventWriter, "published", nextEntry.getPublished());
|
writeOptionalTagWithTextNode(eventWriter, "published", nextEntry.getPublished());
|
||||||
|
|
||||||
if (nextEntry.getCategories() != null) {
|
writeCategories(eventWriter, nextEntry.getCategories());
|
||||||
for (Tag next : nextEntry.getCategories()) {
|
|
||||||
eventWriter.writeStartElement("category");
|
|
||||||
eventWriter.writeAttribute("term", defaultString(next.getTerm()));
|
|
||||||
eventWriter.writeAttribute("label", defaultString(next.getLabel()));
|
|
||||||
eventWriter.writeAttribute("scheme", defaultString(next.getScheme()));
|
|
||||||
eventWriter.writeEndElement();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nextEntry.getLinkSelf().isEmpty()) {
|
if (!nextEntry.getLinkSelf().isEmpty()) {
|
||||||
writeAtomLink(eventWriter, "self", nextEntry.getLinkSelf());
|
writeAtomLink(eventWriter, "self", nextEntry.getLinkSelf());
|
||||||
|
@ -224,6 +218,18 @@ public class XmlParser extends BaseParser implements IParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void writeCategories(XMLStreamWriter eventWriter, TagList categories) throws XMLStreamException {
|
||||||
|
if (categories != null) {
|
||||||
|
for (Tag next : categories) {
|
||||||
|
eventWriter.writeStartElement("category");
|
||||||
|
eventWriter.writeAttribute("term", defaultString(next.getTerm()));
|
||||||
|
eventWriter.writeAttribute("label", defaultString(next.getLabel()));
|
||||||
|
eventWriter.writeAttribute("scheme", defaultString(next.getScheme()));
|
||||||
|
eventWriter.writeEndElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String encodeResourceToString(IResource theResource) throws DataFormatException {
|
public String encodeResourceToString(IResource theResource) throws DataFormatException {
|
||||||
if (theResource == null) {
|
if (theResource == null) {
|
||||||
|
|
|
@ -108,30 +108,64 @@ public class FhirTerser {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list containing all child elements (including the resource itself) which are <b>non-empty</b>
|
* Visit all elements in a given resource
|
||||||
* and are either of the exact type specified, or are a subclass of that type.
|
*
|
||||||
* <p>
|
* @param theResource The resource to visit
|
||||||
* For example, specifying a type of {@link StringDt} would return all non-empty string instances within
|
* @param theVisitor The visitor
|
||||||
* the message. Specifying a type of {@link IResource} would return the resource itself, as well as any contained resources.
|
|
||||||
* </p>
|
|
||||||
* @param theResourceT The resource instance to search. Must not be null.
|
|
||||||
* @param theType The type to search for. Must not be null.
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
public <T extends IElement> List<T> getAllPopulatedChildElementsOfType(IResource theResource, Class<T> theType) {
|
public void visit(IResource theResource, IModelVisitor theVisitor) {
|
||||||
ArrayList<T> retVal = new ArrayList<T>();
|
|
||||||
BaseRuntimeElementCompositeDefinition<?> def = myContext.getResourceDefinition(theResource);
|
BaseRuntimeElementCompositeDefinition<?> def = myContext.getResourceDefinition(theResource);
|
||||||
getAllChildElementsOfType(theResource, def, theType, retVal);
|
visit(theResource, null, def, theVisitor);
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T extends IElement> void getAllChildElementsOfType(IElement theElement, BaseRuntimeElementDefinition<?> theDefinition, Class<T> theType, ArrayList<T> theList) {
|
/**
|
||||||
|
* Returns a list containing all child elements (including the resource itself) which are <b>non-empty</b> and are
|
||||||
|
* either of the exact type specified, or are a subclass of that type.
|
||||||
|
* <p>
|
||||||
|
* For example, specifying a type of {@link StringDt} would return all non-empty string instances within the
|
||||||
|
* message. Specifying a type of {@link IResource} would return the resource itself, as well as any contained
|
||||||
|
* resources.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param theResourceT
|
||||||
|
* The resource instance to search. Must not be null.
|
||||||
|
* @param theType
|
||||||
|
* The type to search for. Must not be null.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public <T extends IElement> List<T> getAllPopulatedChildElementsOfType(IResource theResource, final Class<T> theType) {
|
||||||
|
final ArrayList<T> retVal = new ArrayList<T>();
|
||||||
|
BaseRuntimeElementCompositeDefinition<?> def = myContext.getResourceDefinition(theResource);
|
||||||
|
visit(theResource, null, def, new IModelVisitor() {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public void acceptElement(IElement theElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition) {
|
||||||
if (theElement.isEmpty()) {
|
if (theElement.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
addIfCorrectType(theElement, theType, theList);
|
if (theElement != null && theType.isAssignableFrom(theElement.getClass())) {
|
||||||
addUndeclaredExtensions(theElement, theType, theList);
|
retVal.add((T) theElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public void acceptUndeclaredExtension(ISupportsUndeclaredExtensions theContainingElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition, ExtensionDt theNextExt) {
|
||||||
|
if (theType.isAssignableFrom(theNextExt.getClass())) {
|
||||||
|
retVal.add((T) theNextExt);
|
||||||
|
}
|
||||||
|
if (theNextExt.getValue() != null && theType.isAssignableFrom(theNextExt.getValue().getClass())) {
|
||||||
|
retVal.add((T) theNextExt.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T extends IElement> void visit(IElement theElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition, IModelVisitor theCallback) {
|
||||||
|
theCallback.acceptElement(theElement, theChildDefinition, theDefinition);
|
||||||
|
addUndeclaredExtensions(theElement, theDefinition, theChildDefinition, theCallback);
|
||||||
|
|
||||||
switch (theDefinition.getChildType()) {
|
switch (theDefinition.getChildType()) {
|
||||||
case PRIMITIVE_XHTML:
|
case PRIMITIVE_XHTML:
|
||||||
|
@ -171,7 +205,7 @@ public class FhirTerser {
|
||||||
}
|
}
|
||||||
throw new DataFormatException(b.toString());
|
throw new DataFormatException(b.toString());
|
||||||
}
|
}
|
||||||
getAllChildElementsOfType(nextValue, childElementDef, theType, theList);
|
visit(nextValue, nextChild, childElementDef, theCallback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -181,7 +215,7 @@ public class FhirTerser {
|
||||||
ContainedDt value = (ContainedDt) theElement;
|
ContainedDt value = (ContainedDt) theElement;
|
||||||
for (IResource next : value.getContainedResources()) {
|
for (IResource next : value.getContainedResources()) {
|
||||||
BaseRuntimeElementCompositeDefinition<?> def = myContext.getResourceDefinition(next);
|
BaseRuntimeElementCompositeDefinition<?> def = myContext.getResourceDefinition(next);
|
||||||
getAllChildElementsOfType(next, def, theType, theList);
|
visit(next, null, def, theCallback);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -192,22 +226,14 @@ public class FhirTerser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T extends IElement> void addUndeclaredExtensions(IElement theElement, Class<T> theType, ArrayList<T> theList) {
|
private <T extends IElement> void addUndeclaredExtensions(IElement theElement, BaseRuntimeElementDefinition<?> theDefinition, BaseRuntimeChildDefinition theChildDefinition, IModelVisitor theCallback) {
|
||||||
if (theElement instanceof ISupportsUndeclaredExtensions) {
|
if (theElement instanceof ISupportsUndeclaredExtensions) {
|
||||||
ISupportsUndeclaredExtensions elem = (ISupportsUndeclaredExtensions) theElement;
|
ISupportsUndeclaredExtensions containingElement = (ISupportsUndeclaredExtensions) theElement;
|
||||||
for (ExtensionDt nextExt : elem.getUndeclaredExtensions()) {
|
for (ExtensionDt nextExt : containingElement.getUndeclaredExtensions()) {
|
||||||
addIfCorrectType(nextExt, theType, theList);
|
theCallback.acceptUndeclaredExtension(containingElement, theChildDefinition, theDefinition, nextExt);
|
||||||
addIfCorrectType(nextExt.getValue(), theType, theList);
|
addUndeclaredExtensions(nextExt, theDefinition, theChildDefinition, theCallback);
|
||||||
addUndeclaredExtensions(nextExt, theType, theList);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private <T extends IElement> void addIfCorrectType(IElement theElement, Class<T> theType, ArrayList<T> theList) {
|
|
||||||
if (theElement != null && theType.isAssignableFrom(theElement.getClass())) {
|
|
||||||
theList.add((T) theElement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
package ca.uhn.fhir.util;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
|
||||||
|
import ca.uhn.fhir.context.BaseRuntimeElementDefinition;
|
||||||
|
import ca.uhn.fhir.model.api.ExtensionDt;
|
||||||
|
import ca.uhn.fhir.model.api.IElement;
|
||||||
|
import ca.uhn.fhir.model.api.ISupportsUndeclaredExtensions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see FhirTerser#visit(ca.uhn.fhir.model.api.IResource, IModelVisitor)
|
||||||
|
*/
|
||||||
|
public interface IModelVisitor {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param theElement
|
||||||
|
* @param theChildDefinition May be null if this is a root element
|
||||||
|
* @param theDefinition
|
||||||
|
*/
|
||||||
|
void acceptElement(IElement theElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param theContainingElement
|
||||||
|
* @param theChildDefinition May be null if this is a root element
|
||||||
|
* @param theDefinition
|
||||||
|
* @param theNextExt
|
||||||
|
*/
|
||||||
|
void acceptUndeclaredExtension(ISupportsUndeclaredExtensions theContainingElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition, ExtensionDt theNextExt);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -27,8 +27,9 @@
|
||||||
There are two types of clients provided by HAPI: Generic and Annotation-driven.
|
There are two types of clients provided by HAPI: Generic and Annotation-driven.
|
||||||
The generic client (introduced in HAPI-FHIR 0.3) is much simpler to create
|
The generic client (introduced in HAPI-FHIR 0.3) is much simpler to create
|
||||||
and generally provides the faster way to get started. The annotation-driven
|
and generally provides the faster way to get started. The annotation-driven
|
||||||
client is more powerful and can rely on code generation to give better
|
client can rely on code generation and static binding to specific operations to
|
||||||
compile-time checking.
|
give better compile-time checking against servers with a specific set of capabilities
|
||||||
|
exposed.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
@ -76,20 +77,12 @@
|
||||||
</p>
|
</p>
|
||||||
</subsection>
|
</subsection>
|
||||||
|
|
||||||
<subsection name="Type - Create">
|
|
||||||
<p>
|
|
||||||
The following example shows how to perform a create
|
|
||||||
operation using the generic client:
|
|
||||||
</p>
|
|
||||||
<macro name="snippet">
|
|
||||||
<param name="id" value="create" />
|
|
||||||
<param name="file"
|
|
||||||
value="examples/src/main/java/example/GenericClientExample.java" />
|
|
||||||
</macro>
|
|
||||||
</subsection>
|
|
||||||
|
|
||||||
<subsection name="Type - Search/Query">
|
<subsection name="Type - Search/Query">
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Searching for resources is probably the most common initial scenario for
|
||||||
|
client applications, so we'll start the demonstration there.
|
||||||
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The following example shows how to query using the generic client:
|
The following example shows how to query using the generic client:
|
||||||
</p>
|
</p>
|
||||||
|
@ -173,6 +166,18 @@
|
||||||
|
|
||||||
</subsection>
|
</subsection>
|
||||||
|
|
||||||
|
<subsection name="Type - Create">
|
||||||
|
<p>
|
||||||
|
The following example shows how to perform a create
|
||||||
|
operation using the generic client:
|
||||||
|
</p>
|
||||||
|
<macro name="snippet">
|
||||||
|
<param name="id" value="create" />
|
||||||
|
<param name="file"
|
||||||
|
value="examples/src/main/java/example/GenericClientExample.java" />
|
||||||
|
</macro>
|
||||||
|
</subsection>
|
||||||
|
|
||||||
<subsection name="Instance - Delete">
|
<subsection name="Instance - Delete">
|
||||||
<p>
|
<p>
|
||||||
The following example shows how to perform a delete
|
The following example shows how to perform a delete
|
||||||
|
|
|
@ -30,6 +30,9 @@ public class ModelExtensionTest {
|
||||||
MyPatient parsed = ourCtx.newXmlParser().parseResource(MyPatient.class, str);
|
MyPatient parsed = ourCtx.newXmlParser().parseResource(MyPatient.class, str);
|
||||||
assertEquals("foo", parsed.getIdentifierFirstRep().getSystem().getValueAsString());
|
assertEquals("foo", parsed.getIdentifierFirstRep().getSystem().getValueAsString());
|
||||||
|
|
||||||
|
// assertEquals(MyOrganization.class, parsed.getManagingOrganization().getResource().getClass());
|
||||||
|
// MyOrganization parsedOrg = (MyOrganization) parsed.getManagingOrganization().getResource();
|
||||||
|
// assertEquals("arg0", parsedOrg.getName().getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,6 +363,29 @@ public class JsonParserTest {
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeBundleCategory() {
|
public void testEncodeBundleCategory() {
|
||||||
|
|
||||||
|
Bundle b = new Bundle();
|
||||||
|
BundleEntry e = b.addEntry();
|
||||||
|
e.setResource(new Patient());
|
||||||
|
b.addCategory().setLabel("label").setTerm("term").setScheme("scheme");
|
||||||
|
|
||||||
|
String val = new FhirContext().newJsonParser().setPrettyPrint(false).encodeBundleToString(b);
|
||||||
|
ourLog.info(val);
|
||||||
|
|
||||||
|
assertThat(val, StringContains.containsString("\"category\":[{\"term\":\"term\",\"label\":\"label\",\"scheme\":\"scheme\"}]"));
|
||||||
|
|
||||||
|
b = new FhirContext().newJsonParser().parseBundle(val);
|
||||||
|
assertEquals(1,b.getEntries().size());
|
||||||
|
assertEquals(1,b.getCategories().size());
|
||||||
|
assertEquals("term", b.getCategories().get(0).getTerm());
|
||||||
|
assertEquals("label", b.getCategories().get(0).getLabel());
|
||||||
|
assertEquals("scheme", b.getCategories().get(0).getScheme());
|
||||||
|
assertNull(b.getEntries().get(0).getResource());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeBundleEntryCategory() {
|
||||||
|
|
||||||
Bundle b = new Bundle();
|
Bundle b = new Bundle();
|
||||||
BundleEntry e = b.addEntry();
|
BundleEntry e = b.addEntry();
|
||||||
e.setResource(new Patient());
|
e.setResource(new Patient());
|
||||||
|
@ -383,7 +406,6 @@ public class JsonParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeContainedResources() throws IOException {
|
public void testEncodeContainedResources() throws IOException {
|
||||||
|
|
||||||
|
@ -671,6 +693,11 @@ public class JsonParserTest {
|
||||||
IParser p = ourCtx.newJsonParser();
|
IParser p = ourCtx.newJsonParser();
|
||||||
Bundle bundle = p.parseBundle(msg);
|
Bundle bundle = p.parseBundle(msg);
|
||||||
|
|
||||||
|
assertEquals(1, bundle.getCategories().size());
|
||||||
|
assertEquals("http://scheme", bundle.getCategories().get(0).getScheme());
|
||||||
|
assertEquals("http://term", bundle.getCategories().get(0).getTerm());
|
||||||
|
assertEquals("label", bundle.getCategories().get(0).getLabel());
|
||||||
|
|
||||||
String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(bundle);
|
String encoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(bundle);
|
||||||
ourLog.info(encoded);
|
ourLog.info(encoded);
|
||||||
|
|
||||||
|
|
|
@ -63,16 +63,19 @@ import ca.uhn.fhir.parser.JsonParserTest.MyPatientWithOneDeclaredExtension;
|
||||||
|
|
||||||
public class XmlParserTest {
|
public class XmlParserTest {
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParserTest.class);
|
|
||||||
private static FhirContext ourCtx;
|
private static FhirContext ourCtx;
|
||||||
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParserTest.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseLanguage() {
|
public void testEncodeBinaryResource() {
|
||||||
String input = "<Patient xmlns=\"http://hl7.org/fhir\"><language value=\"zh-CN\"/><text><status value=\"generated\"/><div xmlns=\"http://www.w3.org/1999/xhtml\"><div class=\"hapiHeaderText\"> 海生 <b>王 </b></div><table class=\"hapiPropertyTable\"><tbody><tr><td>Identifier</td><td>URNo</td></tr><tr><td>Address</td><td><span>99 Houston Road </span><br/><span>BENTLEIGH </span><span>Victoria </span></td></tr><tr><td>Date of birth</td><td><span>01 January 1997</span></td></tr></tbody></table></div></text><identifier><use value=\"usual\"/><label value=\"URNo\"/><value value=\"89532\"/></identifier><name><text value=\"王海生\"/><family value=\"王\"/><given value=\"海生\"/></name><telecom><system value=\"phone\"/><value value=\"9899 9878\"/><use value=\"home\"/></telecom><telecom><system value=\"email\"/><value value=\"zimmerman@datacorp.com.au\"/><use value=\"home\"/></telecom><gender><coding><system value=\"http://hl7.org/fhir/v3/AdministrativeGender\"/><code value=\"M\"/><display value=\"Male\"/></coding><text value=\"Male\"/></gender><birthDate value=\"1997-01-01\"/><address><use value=\"home\"/><text value=\"99 Houston Road, BENTLEIGH, 3204\"/><line value=\"99 Houston Road\"/><city value=\"BENTLEIGH\"/><state value=\"Victoria\"/><zip value=\"3204\"/><period><start value=\"2006-06-16\"/></period></address><active value=\"true\"/></Patient>";
|
|
||||||
Patient pt = ourCtx.newXmlParser().parseResource(Patient.class, input);
|
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);
|
||||||
|
|
||||||
assertEquals("zh-CN", pt.getLanguage().getValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -88,283 +91,10 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testNestedContainedResources() {
|
|
||||||
|
|
||||||
Observation A = new Observation();
|
|
||||||
A.getName().setText("A");
|
|
||||||
|
|
||||||
Observation B = new Observation();
|
|
||||||
B.getName().setText("B");
|
|
||||||
A.addRelated().setTarget(new ResourceReferenceDt(B));
|
|
||||||
|
|
||||||
Observation C = new Observation();
|
|
||||||
C.getName().setText("C");
|
|
||||||
B.addRelated().setTarget(new ResourceReferenceDt(C));
|
|
||||||
|
|
||||||
String str = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(A);
|
|
||||||
ourLog.info(str);
|
|
||||||
|
|
||||||
assertThat(str, stringContainsInOrder(Arrays.asList("<text value=\"B\"/>", "<text value=\"C\"/>", "<text value=\"A\"/>")));
|
|
||||||
assertThat(str, stringContainsInOrder(Arrays.asList("<contained>", "</contained>")));
|
|
||||||
|
|
||||||
// Only one (outer) contained block
|
|
||||||
int idx0 = str.indexOf("<contained>");
|
|
||||||
int idx1 = str.indexOf("<contained>",idx0+1);
|
|
||||||
assertNotEquals(-1, idx0);
|
|
||||||
assertEquals(-1, idx1);
|
|
||||||
|
|
||||||
Observation obs = ourCtx.newXmlParser().parseResource(Observation.class, str);
|
|
||||||
assertEquals("A",obs.getName().getText().getValue());
|
|
||||||
|
|
||||||
Observation obsB = (Observation) obs.getRelatedFirstRep().getTarget().getResource();
|
|
||||||
assertEquals("B",obsB.getName().getText().getValue());
|
|
||||||
|
|
||||||
Observation obsC = (Observation) obsB.getRelatedFirstRep().getTarget().getResource();
|
|
||||||
assertEquals("C",obsC.getName().getText().getValue());
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseQuery() {
|
|
||||||
String msg = "<Query xmlns=\"http://hl7.org/fhir\">\n" +
|
|
||||||
" <text>\n" +
|
|
||||||
" <status value=\"generated\"/>\n" +
|
|
||||||
" <div xmlns=\"http://www.w3.org/1999/xhtml\">[Put rendering here]</div>\n" +
|
|
||||||
" </text>\n" +
|
|
||||||
"\n" +
|
|
||||||
" <!-- this is an extermely simple query - a request to execute the query 'example' on the\n" +
|
|
||||||
" responder -->\n" +
|
|
||||||
" <identifier value=\"urn:uuid:42b253f5-fa17-40d0-8da5-44aeb4230376\"/>\n" +
|
|
||||||
" <parameter url=\"http://hl7.org/fhir/query#_query\">\n" +
|
|
||||||
" <valueString value=\"example\"/>\n" +
|
|
||||||
" </parameter>\n" +
|
|
||||||
"</Query>";
|
|
||||||
Query query = ourCtx.newXmlParser().parseResource(Query.class, msg);
|
|
||||||
|
|
||||||
assertEquals("urn:uuid:42b253f5-fa17-40d0-8da5-44aeb4230376", query.getIdentifier().getValueAsString());
|
|
||||||
assertEquals("http://hl7.org/fhir/query#_query", query.getParameterFirstRep().getUrlAsString());
|
|
||||||
assertEquals("example", query.getParameterFirstRep().getValueAsPrimitive().getValueAsString());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeQuery() {
|
|
||||||
Query q = new Query();
|
|
||||||
ExtensionDt parameter = q.addParameter();
|
|
||||||
parameter.setUrl("http://foo").setValue(new StringDt("bar"));
|
|
||||||
|
|
||||||
|
|
||||||
String val = ourCtx.newXmlParser().encodeResourceToString(q);
|
|
||||||
ourLog.info(val);
|
|
||||||
|
|
||||||
assertEquals("<Query xmlns=\"http://hl7.org/fhir\"><parameter url=\"http://foo\"><valueString value=\"bar\"/></parameter></Query>", val);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@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 testParseBinaryResource() {
|
|
||||||
|
|
||||||
Binary val = ourCtx.newXmlParser().parseResource(Binary.class, "<Binary xmlns=\"http://hl7.org/fhir\" contentType=\"foo\">AQIDBA==</Binary>");
|
|
||||||
assertEquals("foo", val.getContentType());
|
|
||||||
assertArrayEquals(new byte[] {1,2,3,4}, val.getContent());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTagList() {
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
String tagListStr = "<taglist xmlns=\"http://hl7.org/fhir\"> \n" +
|
|
||||||
" <category term=\"term0\" label=\"label0\" scheme=\"scheme0\" /> \n" +
|
|
||||||
" <category term=\"term1\" label=\"label1\" scheme=\"\" /> \n" +
|
|
||||||
" <category term=\"term2\" label=\"label2\" /> \n" +
|
|
||||||
"</taglist>";
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
TagList tagList = ourCtx.newXmlParser().parseTagList(tagListStr);
|
|
||||||
assertEquals(3, tagList.size());
|
|
||||||
assertEquals("term0", tagList.get(0).getTerm());
|
|
||||||
assertEquals("label0", tagList.get(0).getLabel());
|
|
||||||
assertEquals("scheme0", tagList.get(0).getScheme());
|
|
||||||
assertEquals("term1", tagList.get(1).getTerm());
|
|
||||||
assertEquals("label1", tagList.get(1).getLabel());
|
|
||||||
assertEquals(null, tagList.get(1).getScheme());
|
|
||||||
assertEquals("term2", tagList.get(2).getTerm());
|
|
||||||
assertEquals("label2", tagList.get(2).getLabel());
|
|
||||||
assertEquals(null, tagList.get(2).getScheme());
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode
|
|
||||||
*/
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
String expected = "<taglist xmlns=\"http://hl7.org/fhir\">" +
|
|
||||||
"<category term=\"term0\" label=\"label0\" scheme=\"scheme0\"/>" +
|
|
||||||
"<category term=\"term1\" label=\"label1\"/>" +
|
|
||||||
"<category term=\"term2\" label=\"label2\"/>" +
|
|
||||||
"</taglist>";
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
String encoded = ourCtx.newXmlParser().encodeTagListToString(tagList);
|
|
||||||
assertEquals(expected,encoded);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTotalResultsUsingOldNamespace() {
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
String bundle = "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n" +
|
|
||||||
" <title>Search results for Patient</title>\n" +
|
|
||||||
" <id>urn:uuid:374f2876-0da7-4441-87da-526e2fc624f8</id>\n" +
|
|
||||||
" <totalResults xmlns=\"http://purl.org/atompub/tombstones/1.0\">15</totalResults>\n" +
|
|
||||||
" <updated>2014-05-04T13:19:47.027-04:00</updated>\n" +
|
|
||||||
" <author>\n" +
|
|
||||||
" <name>AEGIS Wildfhir Server</name>\n" +
|
|
||||||
" </author>" +
|
|
||||||
"</feed>";
|
|
||||||
//@formatter:off
|
|
||||||
|
|
||||||
Bundle bundleR = ourCtx.newXmlParser().parseBundle(bundle);
|
|
||||||
assertEquals(15, bundleR.getTotalResults().getValue().intValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeExtensionWithResourceContent() {
|
|
||||||
IParser parser = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
Patient patient = new Patient();
|
|
||||||
patient.addAddress().setUse(AddressUseEnum.HOME);
|
|
||||||
patient.addUndeclaredExtension(false, "urn:foo", new ResourceReferenceDt("Organization/123"));
|
|
||||||
|
|
||||||
String val = parser.encodeResourceToString(patient);
|
|
||||||
ourLog.info(val);
|
|
||||||
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueResource><reference value=\"Organization/123\"/></valueResource></extension>"));
|
|
||||||
|
|
||||||
Patient actual = parser.parseResource(Patient.class, val);
|
|
||||||
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
|
||||||
List<ExtensionDt> ext = actual.getUndeclaredExtensionsByUrl("urn:foo");
|
|
||||||
assertEquals(1, ext.size());
|
|
||||||
ResourceReferenceDt ref = (ResourceReferenceDt) ext.get(0).getValue();
|
|
||||||
assertEquals("Organization/123", ref.getReference().getValue());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeDeclaredExtensionWithResourceContent() {
|
|
||||||
IParser parser = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
MyPatientWithOneDeclaredExtension patient = new MyPatientWithOneDeclaredExtension();
|
|
||||||
patient.addAddress().setUse(AddressUseEnum.HOME);
|
|
||||||
patient.setFoo(new ResourceReferenceDt("Organization/123"));
|
|
||||||
|
|
||||||
String val = parser.encodeResourceToString(patient);
|
|
||||||
ourLog.info(val);
|
|
||||||
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueResource><reference value=\"Organization/123\"/></valueResource></extension>"));
|
|
||||||
|
|
||||||
MyPatientWithOneDeclaredExtension actual = parser.parseResource(MyPatientWithOneDeclaredExtension.class, val);
|
|
||||||
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
|
||||||
ResourceReferenceDt ref = actual.getFoo();
|
|
||||||
assertEquals("Organization/123", ref.getReference().getValue());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeDeclaredExtensionWithAddressContent() {
|
|
||||||
IParser parser = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
MyPatientWithOneDeclaredAddressExtension patient = new MyPatientWithOneDeclaredAddressExtension();
|
|
||||||
patient.addAddress().setUse(AddressUseEnum.HOME);
|
|
||||||
patient.setFoo(new AddressDt().addLine("line1"));
|
|
||||||
|
|
||||||
String val = parser.encodeResourceToString(patient);
|
|
||||||
ourLog.info(val);
|
|
||||||
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueAddress><line value=\"line1\"/></valueAddress></extension>"));
|
|
||||||
|
|
||||||
MyPatientWithOneDeclaredAddressExtension actual = parser.parseResource(MyPatientWithOneDeclaredAddressExtension.class, val);
|
|
||||||
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
|
||||||
AddressDt ref = actual.getFoo();
|
|
||||||
assertEquals("line1", ref.getLineFirstRep().getValue());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeUndeclaredExtensionWithAddressContent() {
|
|
||||||
IParser parser = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
Patient patient = new Patient();
|
|
||||||
patient.addAddress().setUse(AddressUseEnum.HOME);
|
|
||||||
patient.addUndeclaredExtension(false, "urn:foo", new AddressDt().addLine("line1"));
|
|
||||||
|
|
||||||
String val = parser.encodeResourceToString(patient);
|
|
||||||
ourLog.info(val);
|
|
||||||
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueAddress><line value=\"line1\"/></valueAddress></extension>"));
|
|
||||||
|
|
||||||
MyPatientWithOneDeclaredAddressExtension actual = parser.parseResource(MyPatientWithOneDeclaredAddressExtension.class, val);
|
|
||||||
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
|
||||||
AddressDt ref = actual.getFoo();
|
|
||||||
assertEquals("line1", ref.getLineFirstRep().getValue());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeBundleResultCount() {
|
|
||||||
|
|
||||||
Bundle b = new Bundle();
|
|
||||||
b.getTotalResults().setValue(123);
|
|
||||||
|
|
||||||
String val = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
|
|
||||||
ourLog.info(val);
|
|
||||||
|
|
||||||
assertThat(val, StringContains.containsString("<os:totalResults xmlns:os=\"http://a9.com/-/spec/opensearch/1.1/\">123</os:totalResults>"));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEncodeBundleCategory() {
|
|
||||||
|
|
||||||
Bundle b = new Bundle();
|
|
||||||
BundleEntry e = b.addEntry();
|
|
||||||
e.setResource(new Patient());
|
|
||||||
e.addCategory().setLabel("label").setTerm("term").setScheme("scheme");
|
|
||||||
|
|
||||||
String val = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
|
|
||||||
ourLog.info(val);
|
|
||||||
|
|
||||||
assertThat(val, StringContains.containsString("<category term=\"term\" label=\"label\" scheme=\"scheme\"/>"));
|
|
||||||
|
|
||||||
b = ourCtx.newXmlParser().parseBundle(val);
|
|
||||||
assertEquals(1, b.getEntries().size());
|
|
||||||
assertEquals(1, b.getEntries().get(0).getCategories().size());
|
|
||||||
assertEquals("term", b.getEntries().get(0).getCategories().get(0).getTerm());
|
|
||||||
assertEquals("label", b.getEntries().get(0).getCategories().get(0).getLabel());
|
|
||||||
assertEquals("scheme", b.getEntries().get(0).getCategories().get(0).getScheme());
|
|
||||||
assertNull(b.getEntries().get(0).getResource());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeBundle() throws InterruptedException {
|
public void testEncodeBundle() throws InterruptedException {
|
||||||
Bundle b= new Bundle();
|
Bundle b= new Bundle();
|
||||||
|
b.getCategories().addTag("http://hl7.org/fhir/tag", "http://hl7.org/fhir/tag/message", "Message");
|
||||||
|
|
||||||
InstantDt pub = InstantDt.withCurrentTime();
|
InstantDt pub = InstantDt.withCurrentTime();
|
||||||
b.setPublished(pub);
|
b.setPublished(pub);
|
||||||
|
@ -393,6 +123,7 @@ public class XmlParserTest {
|
||||||
|
|
||||||
List<String> strings = new ArrayList<String>();
|
List<String> strings = new ArrayList<String>();
|
||||||
strings.addAll(Arrays.asList("<published>", pub.getValueAsString(), "</published>"));
|
strings.addAll(Arrays.asList("<published>", pub.getValueAsString(), "</published>"));
|
||||||
|
strings.add("<category term=\"http://hl7.org/fhir/tag/message\" label=\"Message\" scheme=\"http://hl7.org/fhir/tag\"/>");
|
||||||
strings.addAll(Arrays.asList("<entry>", "<id>1</id>", "</entry>"));
|
strings.addAll(Arrays.asList("<entry>", "<id>1</id>", "</entry>"));
|
||||||
strings.addAll(Arrays.asList("<entry>", "<id>2</id>", "<link rel=\"alternate\" href=\"http://foo/bar\"/>", "<link rel=\"search\" href=\"http://foo/bar/search\"/>","</entry>"));
|
strings.addAll(Arrays.asList("<entry>", "<id>2</id>", "<link rel=\"alternate\" href=\"http://foo/bar\"/>", "<link rel=\"search\" href=\"http://foo/bar/search\"/>","</entry>"));
|
||||||
strings.addAll(Arrays.asList("<at:deleted-entry", "ref=\"Patient/3", "/>"));
|
strings.addAll(Arrays.asList("<at:deleted-entry", "ref=\"Patient/3", "/>"));
|
||||||
|
@ -402,6 +133,44 @@ public class XmlParserTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeBundleCategory() {
|
||||||
|
|
||||||
|
Bundle b = new Bundle();
|
||||||
|
BundleEntry e = b.addEntry();
|
||||||
|
e.setResource(new Patient());
|
||||||
|
e.addCategory().setLabel("label").setTerm("term").setScheme("scheme");
|
||||||
|
|
||||||
|
String val = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
|
||||||
|
ourLog.info(val);
|
||||||
|
|
||||||
|
assertThat(val, StringContains.containsString("<category term=\"term\" label=\"label\" scheme=\"scheme\"/>"));
|
||||||
|
|
||||||
|
b = ourCtx.newXmlParser().parseBundle(val);
|
||||||
|
assertEquals(1, b.getEntries().size());
|
||||||
|
assertEquals(1, b.getEntries().get(0).getCategories().size());
|
||||||
|
assertEquals("term", b.getEntries().get(0).getCategories().get(0).getTerm());
|
||||||
|
assertEquals("label", b.getEntries().get(0).getCategories().get(0).getLabel());
|
||||||
|
assertEquals("scheme", b.getEntries().get(0).getCategories().get(0).getScheme());
|
||||||
|
assertNull(b.getEntries().get(0).getResource());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeBundleResultCount() {
|
||||||
|
|
||||||
|
Bundle b = new Bundle();
|
||||||
|
b.getTotalResults().setValue(123);
|
||||||
|
|
||||||
|
String val = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
|
||||||
|
ourLog.info(val);
|
||||||
|
|
||||||
|
assertThat(val, StringContains.containsString("<os:totalResults xmlns:os=\"http://a9.com/-/spec/opensearch/1.1/\">123</os:totalResults>"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeContainedAndIncludedResources() {
|
public void testEncodeContainedAndIncludedResources() {
|
||||||
|
|
||||||
|
@ -421,8 +190,6 @@ public class XmlParserTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeContainedResources() {
|
public void testEncodeContainedResources() {
|
||||||
|
|
||||||
|
@ -446,6 +213,66 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeDeclaredExtensionWithAddressContent() {
|
||||||
|
IParser parser = ourCtx.newXmlParser();
|
||||||
|
|
||||||
|
MyPatientWithOneDeclaredAddressExtension patient = new MyPatientWithOneDeclaredAddressExtension();
|
||||||
|
patient.addAddress().setUse(AddressUseEnum.HOME);
|
||||||
|
patient.setFoo(new AddressDt().addLine("line1"));
|
||||||
|
|
||||||
|
String val = parser.encodeResourceToString(patient);
|
||||||
|
ourLog.info(val);
|
||||||
|
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueAddress><line value=\"line1\"/></valueAddress></extension>"));
|
||||||
|
|
||||||
|
MyPatientWithOneDeclaredAddressExtension actual = parser.parseResource(MyPatientWithOneDeclaredAddressExtension.class, val);
|
||||||
|
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
||||||
|
AddressDt ref = actual.getFoo();
|
||||||
|
assertEquals("line1", ref.getLineFirstRep().getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeDeclaredExtensionWithResourceContent() {
|
||||||
|
IParser parser = ourCtx.newXmlParser();
|
||||||
|
|
||||||
|
MyPatientWithOneDeclaredExtension patient = new MyPatientWithOneDeclaredExtension();
|
||||||
|
patient.addAddress().setUse(AddressUseEnum.HOME);
|
||||||
|
patient.setFoo(new ResourceReferenceDt("Organization/123"));
|
||||||
|
|
||||||
|
String val = parser.encodeResourceToString(patient);
|
||||||
|
ourLog.info(val);
|
||||||
|
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueResource><reference value=\"Organization/123\"/></valueResource></extension>"));
|
||||||
|
|
||||||
|
MyPatientWithOneDeclaredExtension actual = parser.parseResource(MyPatientWithOneDeclaredExtension.class, val);
|
||||||
|
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
||||||
|
ResourceReferenceDt ref = actual.getFoo();
|
||||||
|
assertEquals("Organization/123", ref.getReference().getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeExtensionWithResourceContent() {
|
||||||
|
IParser parser = ourCtx.newXmlParser();
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addAddress().setUse(AddressUseEnum.HOME);
|
||||||
|
patient.addUndeclaredExtension(false, "urn:foo", new ResourceReferenceDt("Organization/123"));
|
||||||
|
|
||||||
|
String val = parser.encodeResourceToString(patient);
|
||||||
|
ourLog.info(val);
|
||||||
|
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueResource><reference value=\"Organization/123\"/></valueResource></extension>"));
|
||||||
|
|
||||||
|
Patient actual = parser.parseResource(Patient.class, val);
|
||||||
|
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
||||||
|
List<ExtensionDt> ext = actual.getUndeclaredExtensionsByUrl("urn:foo");
|
||||||
|
assertEquals(1, ext.size());
|
||||||
|
ResourceReferenceDt ref = (ResourceReferenceDt) ext.get(0).getValue();
|
||||||
|
assertEquals("Organization/123", ref.getReference().getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeInvalidChildGoodException() {
|
public void testEncodeInvalidChildGoodException() {
|
||||||
Observation obs = new Observation();
|
Observation obs = new Observation();
|
||||||
|
@ -502,6 +329,19 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeQuery() {
|
||||||
|
Query q = new Query();
|
||||||
|
ExtensionDt parameter = q.addParameter();
|
||||||
|
parameter.setUrl("http://foo").setValue(new StringDt("bar"));
|
||||||
|
|
||||||
|
|
||||||
|
String val = ourCtx.newXmlParser().encodeResourceToString(q);
|
||||||
|
ourLog.info(val);
|
||||||
|
|
||||||
|
assertEquals("<Query xmlns=\"http://hl7.org/fhir\"><parameter url=\"http://foo\"><valueString value=\"bar\"/></parameter></Query>", val);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEncodeResourceRef() throws DataFormatException {
|
public void testEncodeResourceRef() throws DataFormatException {
|
||||||
|
@ -525,6 +365,76 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEncodeUndeclaredExtensionWithAddressContent() {
|
||||||
|
IParser parser = ourCtx.newXmlParser();
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addAddress().setUse(AddressUseEnum.HOME);
|
||||||
|
patient.addUndeclaredExtension(false, "urn:foo", new AddressDt().addLine("line1"));
|
||||||
|
|
||||||
|
String val = parser.encodeResourceToString(patient);
|
||||||
|
ourLog.info(val);
|
||||||
|
assertThat(val, StringContains.containsString("<extension url=\"urn:foo\"><valueAddress><line value=\"line1\"/></valueAddress></extension>"));
|
||||||
|
|
||||||
|
MyPatientWithOneDeclaredAddressExtension actual = parser.parseResource(MyPatientWithOneDeclaredAddressExtension.class, val);
|
||||||
|
assertEquals(AddressUseEnum.HOME, patient.getAddressFirstRep().getUse().getValueAsEnum());
|
||||||
|
AddressDt ref = actual.getFoo();
|
||||||
|
assertEquals("line1", ref.getLineFirstRep().getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExtensionOnComposite() throws Exception {
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
|
||||||
|
HumanNameDt name = patient.addName();
|
||||||
|
name.addFamily().setValue("Shmoe");
|
||||||
|
HumanNameDt given = name.addGiven("Joe");
|
||||||
|
ExtensionDt ext2 = new ExtensionDt(false, "http://examples.com#givenext", new StringDt("Hello"));
|
||||||
|
given.addUndeclaredExtension(ext2);
|
||||||
|
String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(patient);
|
||||||
|
ourLog.info(output);
|
||||||
|
|
||||||
|
String enc = ourCtx.newXmlParser().encodeResourceToString(patient);
|
||||||
|
assertThat(enc, containsString("<name><extension url=\"http://examples.com#givenext\"><valueString value=\"Hello\"/></extension><family value=\"Shmoe\"/><given value=\"Joe\"/></name>"));
|
||||||
|
|
||||||
|
Patient parsed = ourCtx.newXmlParser().parseResource(Patient.class, new StringReader(enc));
|
||||||
|
assertEquals(1, parsed.getNameFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").size());
|
||||||
|
ExtensionDt ext = parsed.getNameFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").get(0);
|
||||||
|
assertEquals("Hello", ext.getValueAsPrimitive().getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExtensionOnPrimitive() throws Exception {
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
|
||||||
|
HumanNameDt name = patient.addName();
|
||||||
|
StringDt family = name.addFamily();
|
||||||
|
family.setValue("Shmoe");
|
||||||
|
|
||||||
|
ExtensionDt ext2 = new ExtensionDt(false, "http://examples.com#givenext", new StringDt("Hello"));
|
||||||
|
family.addUndeclaredExtension(ext2);
|
||||||
|
String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(patient);
|
||||||
|
ourLog.info(output);
|
||||||
|
|
||||||
|
String enc = ourCtx.newXmlParser().encodeResourceToString(patient);
|
||||||
|
assertThat(enc, containsString("<name><family value=\"Shmoe\"><extension url=\"http://examples.com#givenext\"><valueString value=\"Hello\"/></extension></family></name>"));
|
||||||
|
|
||||||
|
Patient parsed = ourCtx.newXmlParser().parseResource(Patient.class, new StringReader(enc));
|
||||||
|
assertEquals(1, parsed.getNameFirstRep().getFamilyFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").size());
|
||||||
|
ExtensionDt ext = parsed.getNameFirstRep().getFamilyFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").get(0);
|
||||||
|
assertEquals("Hello", ext.getValueAsPrimitive().getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExtensions() throws DataFormatException {
|
public void testExtensions() throws DataFormatException {
|
||||||
|
|
||||||
|
@ -630,6 +540,7 @@ public class XmlParserTest {
|
||||||
assertTrue(d.toString(), d.identical());
|
assertTrue(d.toString(), d.identical());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoadAndEncodeUndeclaredExtensions() throws ConfigurationException, DataFormatException, SAXException, IOException {
|
public void testLoadAndEncodeUndeclaredExtensions() throws ConfigurationException, DataFormatException, SAXException, IOException {
|
||||||
IParser p = ourCtx.newXmlParser();
|
IParser p = ourCtx.newXmlParser();
|
||||||
|
@ -683,25 +594,6 @@ public class XmlParserTest {
|
||||||
assertTrue(d.toString(), d.identical());
|
assertTrue(d.toString(), d.identical());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseWithXmlHeader() throws ConfigurationException, DataFormatException {
|
|
||||||
IParser p = ourCtx.newXmlParser();
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
String msg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
|
|
||||||
"<Patient xmlns=\"http://hl7.org/fhir\">\n" +
|
|
||||||
" <identifier>\n" +
|
|
||||||
" <label value=\"IdentifierLabel\"/>\n" +
|
|
||||||
" </identifier>\n" +
|
|
||||||
"</Patient>";
|
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
Patient resource = (Patient) p.parseResource(msg);
|
|
||||||
assertEquals("IdentifierLabel", resource.getIdentifier().get(0).getLabel().getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoadObservation() throws ConfigurationException, DataFormatException, IOException {
|
public void testLoadObservation() throws ConfigurationException, DataFormatException, IOException {
|
||||||
|
|
||||||
|
@ -767,6 +659,52 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMoreExtensions() throws Exception {
|
||||||
|
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addIdentifier(IdentifierUseEnum.OFFICIAL, "urn:example", "7000135", null);
|
||||||
|
|
||||||
|
ExtensionDt ext = new ExtensionDt();
|
||||||
|
ext.setModifier(false);
|
||||||
|
ext.setUrl("http://example.com/extensions#someext");
|
||||||
|
ext.setValue(new DateTimeDt("2011-01-02T11:13:15"));
|
||||||
|
|
||||||
|
// Add the extension to the resource
|
||||||
|
patient.addUndeclaredExtension(ext);
|
||||||
|
// END SNIPPET: resourceExtension
|
||||||
|
|
||||||
|
// START SNIPPET: resourceStringExtension
|
||||||
|
HumanNameDt name = patient.addName();
|
||||||
|
name.addFamily().setValue("Shmoe");
|
||||||
|
StringDt given = name.addGiven();
|
||||||
|
given.setValue("Joe");
|
||||||
|
ExtensionDt ext2 = new ExtensionDt(false, "http://examples.com#givenext", new StringDt("given"));
|
||||||
|
given.addUndeclaredExtension(ext2);
|
||||||
|
// END SNIPPET: resourceStringExtension
|
||||||
|
|
||||||
|
// START SNIPPET: subExtension
|
||||||
|
ExtensionDt parent = new ExtensionDt(false, "http://example.com#parent");
|
||||||
|
patient.addUndeclaredExtension(parent);
|
||||||
|
|
||||||
|
ExtensionDt child1 = new ExtensionDt(false, "http://example.com#child", new StringDt("value1"));
|
||||||
|
parent.addUndeclaredExtension(child1);
|
||||||
|
|
||||||
|
ExtensionDt child2 = new ExtensionDt(false, "http://example.com#child", new StringDt("value1"));
|
||||||
|
parent.addUndeclaredExtension(child2);
|
||||||
|
// END SNIPPET: subExtension
|
||||||
|
|
||||||
|
String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(patient);
|
||||||
|
ourLog.info(output);
|
||||||
|
|
||||||
|
String enc = ourCtx.newXmlParser().encodeResourceToString(patient);
|
||||||
|
assertThat(enc, containsString("<Patient xmlns=\"http://hl7.org/fhir\"><extension url=\"http://example.com/extensions#someext\"><valueDateTime value=\"2011-01-02T11:13:15\"/></extension>"));
|
||||||
|
assertThat(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=\"value1\"/></extension></extension>"));
|
||||||
|
assertThat(enc, containsString("<given value=\"Joe\"><extension url=\"http://examples.com#givenext\"><valueString value=\"given\"/></extension></given>"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNarrativeGeneration() throws DataFormatException {
|
public void testNarrativeGeneration() throws DataFormatException {
|
||||||
|
|
||||||
|
@ -791,12 +729,50 @@ public class XmlParserTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseBundleWithMixedReturnTypes() {
|
public void testNestedContainedResources() {
|
||||||
InputStreamReader str = new InputStreamReader(getClass().getResourceAsStream("/mixed-return-bundle.xml"));
|
|
||||||
Bundle b = ourCtx.newXmlParser().parseBundle(Patient.class, str);
|
Observation A = new Observation();
|
||||||
assertEquals(Patient.class, b.getEntries().get(0).getResource().getClass());
|
A.getName().setText("A");
|
||||||
assertEquals(Patient.class, b.getEntries().get(1).getResource().getClass());
|
|
||||||
assertEquals(Organization.class, b.getEntries().get(2).getResource().getClass());
|
Observation B = new Observation();
|
||||||
|
B.getName().setText("B");
|
||||||
|
A.addRelated().setTarget(new ResourceReferenceDt(B));
|
||||||
|
|
||||||
|
Observation C = new Observation();
|
||||||
|
C.getName().setText("C");
|
||||||
|
B.addRelated().setTarget(new ResourceReferenceDt(C));
|
||||||
|
|
||||||
|
String str = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(A);
|
||||||
|
ourLog.info(str);
|
||||||
|
|
||||||
|
assertThat(str, stringContainsInOrder(Arrays.asList("<text value=\"B\"/>", "<text value=\"C\"/>", "<text value=\"A\"/>")));
|
||||||
|
assertThat(str, stringContainsInOrder(Arrays.asList("<contained>", "</contained>")));
|
||||||
|
|
||||||
|
// Only one (outer) contained block
|
||||||
|
int idx0 = str.indexOf("<contained>");
|
||||||
|
int idx1 = str.indexOf("<contained>",idx0+1);
|
||||||
|
assertNotEquals(-1, idx0);
|
||||||
|
assertEquals(-1, idx1);
|
||||||
|
|
||||||
|
Observation obs = ourCtx.newXmlParser().parseResource(Observation.class, str);
|
||||||
|
assertEquals("A",obs.getName().getText().getValue());
|
||||||
|
|
||||||
|
Observation obsB = (Observation) obs.getRelatedFirstRep().getTarget().getResource();
|
||||||
|
assertEquals("B",obsB.getName().getText().getValue());
|
||||||
|
|
||||||
|
Observation obsC = (Observation) obsB.getRelatedFirstRep().getTarget().getResource();
|
||||||
|
assertEquals("C",obsC.getName().getText().getValue());
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseBinaryResource() {
|
||||||
|
|
||||||
|
Binary val = ourCtx.newXmlParser().parseResource(Binary.class, "<Binary xmlns=\"http://hl7.org/fhir\" contentType=\"foo\">AQIDBA==</Binary>");
|
||||||
|
assertEquals("foo", val.getContentType());
|
||||||
|
assertArrayEquals(new byte[] {1,2,3,4}, val.getContent());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
|
@ -814,6 +790,7 @@ public class XmlParserTest {
|
||||||
" <title>FHIR Core Valuesets</title>\n" +
|
" <title>FHIR Core Valuesets</title>\n" +
|
||||||
" <id>http://hl7.org/fhir/profile/valuesets</id>\n" +
|
" <id>http://hl7.org/fhir/profile/valuesets</id>\n" +
|
||||||
" <link href=\"http://hl7.org/implement/standards/fhir/valuesets.xml\" rel=\"self\"/>\n" +
|
" <link href=\"http://hl7.org/implement/standards/fhir/valuesets.xml\" rel=\"self\"/>\n" +
|
||||||
|
" <category term=\"http://hl7.org/fhir/tag/message\" label=\"Message\" scheme=\"http://hl7.org/fhir/tag\"/>\n" +
|
||||||
" <updated>2014-02-10T04:11:24.435-00:00</updated>\n" +
|
" <updated>2014-02-10T04:11:24.435-00:00</updated>\n" +
|
||||||
" <entry>\n" +
|
" <entry>\n" +
|
||||||
" <title>Valueset "256a5231-a2bb-49bd-9fea-f349d428b70d" to support automated processing</title>\n" +
|
" <title>Valueset "256a5231-a2bb-49bd-9fea-f349d428b70d" to support automated processing</title>\n" +
|
||||||
|
@ -867,6 +844,9 @@ public class XmlParserTest {
|
||||||
IParser p = new FhirContext(ValueSet.class).newXmlParser();
|
IParser p = new FhirContext(ValueSet.class).newXmlParser();
|
||||||
Bundle bundle = p.parseBundle(msg);
|
Bundle bundle = p.parseBundle(msg);
|
||||||
|
|
||||||
|
assertEquals(1, bundle.getCategories().size());
|
||||||
|
assertEquals("http://hl7.org/fhir/tag", bundle.getCategories().get(0).getScheme());
|
||||||
|
|
||||||
assertEquals("FHIR Core Valuesets", bundle.getTitle().getValue());
|
assertEquals("FHIR Core Valuesets", bundle.getTitle().getValue());
|
||||||
assertEquals("http://hl7.org/implement/standards/fhir/valuesets.xml", bundle.getLinkSelf().getValue());
|
assertEquals("http://hl7.org/implement/standards/fhir/valuesets.xml", bundle.getLinkSelf().getValue());
|
||||||
assertEquals("2014-02-10T04:11:24.435+00:00", bundle.getUpdated().getValueAsString());
|
assertEquals("2014-02-10T04:11:24.435+00:00", bundle.getUpdated().getValueAsString());
|
||||||
|
@ -946,7 +926,6 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseBundleLarge() throws IOException {
|
public void testParseBundleLarge() throws IOException {
|
||||||
|
|
||||||
|
@ -961,6 +940,15 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseBundleWithMixedReturnTypes() {
|
||||||
|
InputStreamReader str = new InputStreamReader(getClass().getResourceAsStream("/mixed-return-bundle.xml"));
|
||||||
|
Bundle b = ourCtx.newXmlParser().parseBundle(Patient.class, str);
|
||||||
|
assertEquals(Patient.class, b.getEntries().get(0).getResource().getClass());
|
||||||
|
assertEquals(Patient.class, b.getEntries().get(1).getResource().getClass());
|
||||||
|
assertEquals(Organization.class, b.getEntries().get(2).getResource().getClass());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseContainedResources() throws IOException {
|
public void testParseContainedResources() throws IOException {
|
||||||
|
|
||||||
|
@ -976,19 +964,6 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This sample has extra elements in <searchParam> that are not actually a
|
|
||||||
* part of the spec any more..
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testParseFuroreMetadataWithExtraElements() throws IOException {
|
|
||||||
String msg = IOUtils.toString(XmlParserTest.class.getResourceAsStream("/furore-conformance.xml"));
|
|
||||||
|
|
||||||
IParser p = new FhirContext(ValueSet.class).newXmlParser();
|
|
||||||
Conformance conf = p.parseResource(Conformance.class, msg);
|
|
||||||
RestResource res = conf.getRestFirstRep().getResourceFirstRep();
|
|
||||||
assertEquals("_id", res.getSearchParam().get(1).getName().getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseEncodeNarrative() {
|
public void testParseEncodeNarrative() {
|
||||||
|
@ -1010,103 +985,66 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeClass
|
/**
|
||||||
public static void beforeClass() {
|
* This sample has extra elements in <searchParam> that are not actually a
|
||||||
XMLUnit.setIgnoreAttributeOrder(true);
|
* part of the spec any more..
|
||||||
XMLUnit.setIgnoreComments(true);
|
*/
|
||||||
XMLUnit.setIgnoreWhitespace(true);
|
@Test
|
||||||
ourCtx = new FhirContext();
|
public void testParseFuroreMetadataWithExtraElements() throws IOException {
|
||||||
|
String msg = IOUtils.toString(XmlParserTest.class.getResourceAsStream("/furore-conformance.xml"));
|
||||||
|
|
||||||
|
IParser p = new FhirContext(ValueSet.class).newXmlParser();
|
||||||
|
Conformance conf = p.parseResource(Conformance.class, msg);
|
||||||
|
RestResource res = conf.getRestFirstRep().getResourceFirstRep();
|
||||||
|
assertEquals("_id", res.getSearchParam().get(1).getName().getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMoreExtensions() throws Exception {
|
public void testParseLanguage() {
|
||||||
|
String input = "<Patient xmlns=\"http://hl7.org/fhir\"><language value=\"zh-CN\"/><text><status value=\"generated\"/><div xmlns=\"http://www.w3.org/1999/xhtml\"><div class=\"hapiHeaderText\"> 海生 <b>王 </b></div><table class=\"hapiPropertyTable\"><tbody><tr><td>Identifier</td><td>URNo</td></tr><tr><td>Address</td><td><span>99 Houston Road </span><br/><span>BENTLEIGH </span><span>Victoria </span></td></tr><tr><td>Date of birth</td><td><span>01 January 1997</span></td></tr></tbody></table></div></text><identifier><use value=\"usual\"/><label value=\"URNo\"/><value value=\"89532\"/></identifier><name><text value=\"王海生\"/><family value=\"王\"/><given value=\"海生\"/></name><telecom><system value=\"phone\"/><value value=\"9899 9878\"/><use value=\"home\"/></telecom><telecom><system value=\"email\"/><value value=\"zimmerman@datacorp.com.au\"/><use value=\"home\"/></telecom><gender><coding><system value=\"http://hl7.org/fhir/v3/AdministrativeGender\"/><code value=\"M\"/><display value=\"Male\"/></coding><text value=\"Male\"/></gender><birthDate value=\"1997-01-01\"/><address><use value=\"home\"/><text value=\"99 Houston Road, BENTLEIGH, 3204\"/><line value=\"99 Houston Road\"/><city value=\"BENTLEIGH\"/><state value=\"Victoria\"/><zip value=\"3204\"/><period><start value=\"2006-06-16\"/></period></address><active value=\"true\"/></Patient>";
|
||||||
|
Patient pt = ourCtx.newXmlParser().parseResource(Patient.class, input);
|
||||||
|
|
||||||
Patient patient = new Patient();
|
assertEquals("zh-CN", pt.getLanguage().getValue());
|
||||||
patient.addIdentifier(IdentifierUseEnum.OFFICIAL, "urn:example", "7000135", null);
|
|
||||||
|
|
||||||
ExtensionDt ext = new ExtensionDt();
|
|
||||||
ext.setModifier(false);
|
|
||||||
ext.setUrl("http://example.com/extensions#someext");
|
|
||||||
ext.setValue(new DateTimeDt("2011-01-02T11:13:15"));
|
|
||||||
|
|
||||||
// Add the extension to the resource
|
|
||||||
patient.addUndeclaredExtension(ext);
|
|
||||||
// END SNIPPET: resourceExtension
|
|
||||||
|
|
||||||
// START SNIPPET: resourceStringExtension
|
|
||||||
HumanNameDt name = patient.addName();
|
|
||||||
name.addFamily().setValue("Shmoe");
|
|
||||||
StringDt given = name.addGiven();
|
|
||||||
given.setValue("Joe");
|
|
||||||
ExtensionDt ext2 = new ExtensionDt(false, "http://examples.com#givenext", new StringDt("given"));
|
|
||||||
given.addUndeclaredExtension(ext2);
|
|
||||||
// END SNIPPET: resourceStringExtension
|
|
||||||
|
|
||||||
// START SNIPPET: subExtension
|
|
||||||
ExtensionDt parent = new ExtensionDt(false, "http://example.com#parent");
|
|
||||||
patient.addUndeclaredExtension(parent);
|
|
||||||
|
|
||||||
ExtensionDt child1 = new ExtensionDt(false, "http://example.com#child", new StringDt("value1"));
|
|
||||||
parent.addUndeclaredExtension(child1);
|
|
||||||
|
|
||||||
ExtensionDt child2 = new ExtensionDt(false, "http://example.com#child", new StringDt("value1"));
|
|
||||||
parent.addUndeclaredExtension(child2);
|
|
||||||
// END SNIPPET: subExtension
|
|
||||||
|
|
||||||
String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(patient);
|
|
||||||
ourLog.info(output);
|
|
||||||
|
|
||||||
String enc = ourCtx.newXmlParser().encodeResourceToString(patient);
|
|
||||||
assertThat(enc, containsString("<Patient xmlns=\"http://hl7.org/fhir\"><extension url=\"http://example.com/extensions#someext\"><valueDateTime value=\"2011-01-02T11:13:15\"/></extension>"));
|
|
||||||
assertThat(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=\"value1\"/></extension></extension>"));
|
|
||||||
assertThat(enc, containsString("<given value=\"Joe\"><extension url=\"http://examples.com#givenext\"><valueString value=\"given\"/></extension></given>"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExtensionOnComposite() throws Exception {
|
public void testParseQuery() {
|
||||||
|
String msg = "<Query xmlns=\"http://hl7.org/fhir\">\n" +
|
||||||
|
" <text>\n" +
|
||||||
|
" <status value=\"generated\"/>\n" +
|
||||||
|
" <div xmlns=\"http://www.w3.org/1999/xhtml\">[Put rendering here]</div>\n" +
|
||||||
|
" </text>\n" +
|
||||||
|
"\n" +
|
||||||
|
" <!-- this is an extermely simple query - a request to execute the query 'example' on the\n" +
|
||||||
|
" responder -->\n" +
|
||||||
|
" <identifier value=\"urn:uuid:42b253f5-fa17-40d0-8da5-44aeb4230376\"/>\n" +
|
||||||
|
" <parameter url=\"http://hl7.org/fhir/query#_query\">\n" +
|
||||||
|
" <valueString value=\"example\"/>\n" +
|
||||||
|
" </parameter>\n" +
|
||||||
|
"</Query>";
|
||||||
|
Query query = ourCtx.newXmlParser().parseResource(Query.class, msg);
|
||||||
|
|
||||||
Patient patient = new Patient();
|
assertEquals("urn:uuid:42b253f5-fa17-40d0-8da5-44aeb4230376", query.getIdentifier().getValueAsString());
|
||||||
|
assertEquals("http://hl7.org/fhir/query#_query", query.getParameterFirstRep().getUrlAsString());
|
||||||
HumanNameDt name = patient.addName();
|
assertEquals("example", query.getParameterFirstRep().getValueAsPrimitive().getValueAsString());
|
||||||
name.addFamily().setValue("Shmoe");
|
|
||||||
HumanNameDt given = name.addGiven("Joe");
|
|
||||||
ExtensionDt ext2 = new ExtensionDt(false, "http://examples.com#givenext", new StringDt("Hello"));
|
|
||||||
given.addUndeclaredExtension(ext2);
|
|
||||||
String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(patient);
|
|
||||||
ourLog.info(output);
|
|
||||||
|
|
||||||
String enc = ourCtx.newXmlParser().encodeResourceToString(patient);
|
|
||||||
assertThat(enc, containsString("<name><extension url=\"http://examples.com#givenext\"><valueString value=\"Hello\"/></extension><family value=\"Shmoe\"/><given value=\"Joe\"/></name>"));
|
|
||||||
|
|
||||||
Patient parsed = ourCtx.newXmlParser().parseResource(Patient.class, new StringReader(enc));
|
|
||||||
assertEquals(1, parsed.getNameFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").size());
|
|
||||||
ExtensionDt ext = parsed.getNameFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").get(0);
|
|
||||||
assertEquals("Hello", ext.getValueAsPrimitive().getValue());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExtensionOnPrimitive() throws Exception {
|
public void testParseWithXmlHeader() throws ConfigurationException, DataFormatException {
|
||||||
|
IParser p = ourCtx.newXmlParser();
|
||||||
|
|
||||||
Patient patient = new Patient();
|
//@formatter:off
|
||||||
|
String msg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
|
||||||
HumanNameDt name = patient.addName();
|
"<Patient xmlns=\"http://hl7.org/fhir\">\n" +
|
||||||
StringDt family = name.addFamily();
|
" <identifier>\n" +
|
||||||
family.setValue("Shmoe");
|
" <label value=\"IdentifierLabel\"/>\n" +
|
||||||
|
" </identifier>\n" +
|
||||||
ExtensionDt ext2 = new ExtensionDt(false, "http://examples.com#givenext", new StringDt("Hello"));
|
"</Patient>";
|
||||||
family.addUndeclaredExtension(ext2);
|
//@formatter:on
|
||||||
String output = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(patient);
|
|
||||||
ourLog.info(output);
|
|
||||||
|
|
||||||
String enc = ourCtx.newXmlParser().encodeResourceToString(patient);
|
|
||||||
assertThat(enc, containsString("<name><family value=\"Shmoe\"><extension url=\"http://examples.com#givenext\"><valueString value=\"Hello\"/></extension></family></name>"));
|
|
||||||
|
|
||||||
Patient parsed = ourCtx.newXmlParser().parseResource(Patient.class, new StringReader(enc));
|
|
||||||
assertEquals(1, parsed.getNameFirstRep().getFamilyFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").size());
|
|
||||||
ExtensionDt ext = parsed.getNameFirstRep().getFamilyFirstRep().getUndeclaredExtensionsByUrl("http://examples.com#givenext").get(0);
|
|
||||||
assertEquals("Hello", ext.getValueAsPrimitive().getValue());
|
|
||||||
|
|
||||||
|
Patient resource = (Patient) p.parseResource(msg);
|
||||||
|
assertEquals("IdentifierLabel", resource.getIdentifier().get(0).getLabel().getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1167,4 +1105,71 @@ public class XmlParserTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTagList() {
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
String tagListStr = "<taglist xmlns=\"http://hl7.org/fhir\"> \n" +
|
||||||
|
" <category term=\"term0\" label=\"label0\" scheme=\"scheme0\" /> \n" +
|
||||||
|
" <category term=\"term1\" label=\"label1\" scheme=\"\" /> \n" +
|
||||||
|
" <category term=\"term2\" label=\"label2\" /> \n" +
|
||||||
|
"</taglist>";
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
TagList tagList = ourCtx.newXmlParser().parseTagList(tagListStr);
|
||||||
|
assertEquals(3, tagList.size());
|
||||||
|
assertEquals("term0", tagList.get(0).getTerm());
|
||||||
|
assertEquals("label0", tagList.get(0).getLabel());
|
||||||
|
assertEquals("scheme0", tagList.get(0).getScheme());
|
||||||
|
assertEquals("term1", tagList.get(1).getTerm());
|
||||||
|
assertEquals("label1", tagList.get(1).getLabel());
|
||||||
|
assertEquals(null, tagList.get(1).getScheme());
|
||||||
|
assertEquals("term2", tagList.get(2).getTerm());
|
||||||
|
assertEquals("label2", tagList.get(2).getLabel());
|
||||||
|
assertEquals(null, tagList.get(2).getScheme());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encode
|
||||||
|
*/
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
String expected = "<taglist xmlns=\"http://hl7.org/fhir\">" +
|
||||||
|
"<category term=\"term0\" label=\"label0\" scheme=\"scheme0\"/>" +
|
||||||
|
"<category term=\"term1\" label=\"label1\"/>" +
|
||||||
|
"<category term=\"term2\" label=\"label2\"/>" +
|
||||||
|
"</taglist>";
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
String encoded = ourCtx.newXmlParser().encodeTagListToString(tagList);
|
||||||
|
assertEquals(expected,encoded);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTotalResultsUsingOldNamespace() {
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
String bundle = "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n" +
|
||||||
|
" <title>Search results for Patient</title>\n" +
|
||||||
|
" <id>urn:uuid:374f2876-0da7-4441-87da-526e2fc624f8</id>\n" +
|
||||||
|
" <totalResults xmlns=\"http://purl.org/atompub/tombstones/1.0\">15</totalResults>\n" +
|
||||||
|
" <updated>2014-05-04T13:19:47.027-04:00</updated>\n" +
|
||||||
|
" <author>\n" +
|
||||||
|
" <name>AEGIS Wildfhir Server</name>\n" +
|
||||||
|
" </author>" +
|
||||||
|
"</feed>";
|
||||||
|
//@formatter:off
|
||||||
|
|
||||||
|
Bundle bundleR = ourCtx.newXmlParser().parseBundle(bundle);
|
||||||
|
assertEquals(15, bundleR.getTotalResults().getValue().intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClass() {
|
||||||
|
XMLUnit.setIgnoreAttributeOrder(true);
|
||||||
|
XMLUnit.setIgnoreComments(true);
|
||||||
|
XMLUnit.setIgnoreWhitespace(true);
|
||||||
|
ourCtx = new FhirContext();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,11 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"updated" : "2014-03-22T15:37:12Z",
|
"updated" : "2014-03-22T15:37:12Z",
|
||||||
|
"category" : [{
|
||||||
|
"term" : "http://term",
|
||||||
|
"label" : "label",
|
||||||
|
"scheme" : "http://scheme"
|
||||||
|
}],
|
||||||
"totalResults" : "356",
|
"totalResults" : "356",
|
||||||
"entry" : [
|
"entry" : [
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue