Get all of the unit tests passing for DSTU1/DSTU2 split

This commit is contained in:
jamesagnew 2015-01-24 01:07:09 +05:30
parent 96fe70de59
commit 18acda7be2
45 changed files with 915 additions and 282 deletions

View File

@ -20,6 +20,7 @@ package ca.uhn.fhir.context;
* #L% * #L%
*/ */
import java.lang.reflect.Modifier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -173,6 +174,13 @@ public class FhirContext {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public RuntimeResourceDefinition getResourceDefinition(Class<? extends IBaseResource> theResourceType) { public RuntimeResourceDefinition getResourceDefinition(Class<? extends IBaseResource> theResourceType) {
if (theResourceType == null) {
throw new NullPointerException("theResourceType can not be null");
}
if (Modifier.isAbstract(theResourceType.getModifiers())) {
throw new IllegalArgumentException("Can not scan abstract or interface class (resource definitions must be concrete classes): " + theResourceType.getName());
}
RuntimeResourceDefinition retVal = (RuntimeResourceDefinition) myClassToElementDefinition.get(theResourceType); RuntimeResourceDefinition retVal = (RuntimeResourceDefinition) myClassToElementDefinition.get(theResourceType);
if (retVal == null) { if (retVal == null) {
retVal = scanResourceType((Class<? extends IResource>) theResourceType); retVal = scanResourceType((Class<? extends IResource>) theResourceType);
@ -398,6 +406,9 @@ public class FhirContext {
} }
public void setNarrativeGenerator(INarrativeGenerator theNarrativeGenerator) { public void setNarrativeGenerator(INarrativeGenerator theNarrativeGenerator) {
if (theNarrativeGenerator != null) {
theNarrativeGenerator.setFhirContext(this);
}
myNarrativeGenerator = theNarrativeGenerator; myNarrativeGenerator = theNarrativeGenerator;
} }

View File

@ -27,6 +27,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
import ca.uhn.fhir.model.primitive.BoundCodeDt; import ca.uhn.fhir.model.primitive.BoundCodeDt;
import ca.uhn.fhir.model.primitive.CodeDt; import ca.uhn.fhir.model.primitive.CodeDt;
import ca.uhn.fhir.model.primitive.DecimalDt; import ca.uhn.fhir.model.primitive.DecimalDt;
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.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.model.primitive.XhtmlDt; import ca.uhn.fhir.model.primitive.XhtmlDt;
@ -45,7 +46,7 @@ public class BundleEntry extends BaseBundle {
private StringDt myDeletedByEmail; private StringDt myDeletedByEmail;
private StringDt myDeletedByName; private StringDt myDeletedByName;
private StringDt myDeletedComment; private StringDt myDeletedComment;
private StringDt myDeletedResourceId; private IdDt myDeletedResourceId;
private CodeDt myDeletedResourceType; private CodeDt myDeletedResourceType;
private StringDt myDeletedResourceVersion; private StringDt myDeletedResourceVersion;
private StringDt myLinkAlternate; private StringDt myLinkAlternate;
@ -61,7 +62,8 @@ public class BundleEntry extends BaseBundle {
private InstantDt myUpdated; private InstantDt myUpdated;
/** /**
* @deprecated Tags wil become immutable in a future release of HAPI, so {@link #addCategory(String, String, String)} should be used instead * @deprecated Tags wil become immutable in a future release of HAPI, so
* {@link #addCategory(String, String, String)} should be used instead
*/ */
public Tag addCategory() { public Tag addCategory() {
Tag retVal = new Tag(); Tag retVal = new Tag();
@ -115,9 +117,9 @@ public class BundleEntry extends BaseBundle {
return myDeletedComment; return myDeletedComment;
} }
public StringDt getDeletedResourceId() { public IdDt getDeletedResourceId() {
if (myDeletedResourceId == null) { if (myDeletedResourceId == null) {
myDeletedResourceId = new StringDt(); myDeletedResourceId = new IdDt();
} }
return myDeletedResourceId; return myDeletedResourceId;
} }
@ -136,6 +138,16 @@ public class BundleEntry extends BaseBundle {
return myDeletedResourceVersion; return myDeletedResourceVersion;
} }
/**
* @deprecated Setting IDs on bundle entries is redundant since resources already have an ID field. Instead of
* providing an ID using this method, set the ID on the resource using {@link IResource#setId(IdDt)} or
* if this entry represents a deleted resource, use {@link #setDeletedResourceId(IdDt)}.
*/
@Override
public IdDt getId() {
return super.getId();
}
public StringDt getLinkAlternate() { public StringDt getLinkAlternate() {
if (myLinkAlternate == null) { if (myLinkAlternate == null) {
myLinkAlternate = new StringDt(); myLinkAlternate = new StringDt();
@ -143,6 +155,9 @@ public class BundleEntry extends BaseBundle {
return myLinkAlternate; return myLinkAlternate;
} }
/**
* @deprecated Use resource ID to determine base URL
*/
public StringDt getLinkBase() { public StringDt getLinkBase() {
if (myLinkBase == null) { if (myLinkBase == null) {
myLinkBase = new StringDt(); myLinkBase = new StringDt();
@ -204,8 +219,10 @@ public class BundleEntry extends BaseBundle {
} }
/** /**
* @deprecated <b>DSTU2 Note:</b> As of DSTU2, bundle entries no longer have an updated time (this bit of metadata has been moved to the resource &lt;meta/&gt; element so it is redundant here). In * @deprecated <b>DSTU2 Note:</b> As of DSTU2, bundle entries no longer have an updated time (this bit of metadata
* preparation for DSTU2, it is recommended that you migrate code away from using this method and over to using resource metadata instead. * has been moved to the resource &lt;meta/&gt; element so it is redundant here). In preparation for
* DSTU2, it is recommended that you migrate code away from using this method and over to using resource
* metadata instead.
*/ */
public InstantDt getUpdated() { public InstantDt getUpdated() {
if (myUpdated == null) { if (myUpdated == null) {
@ -224,7 +241,11 @@ public class BundleEntry extends BaseBundle {
public boolean isEmpty() { public boolean isEmpty() {
//@formatter:off //@formatter:off
return super.isEmpty() && return super.isEmpty() &&
ElementUtil.isEmpty(myDeletedResourceId, myDeletedResourceType, myDeletedResourceVersion, myScore,myStatus, myCategories, myDeletedAt, myLinkAlternate, myLinkSelf, myPublished, myResource, mySummary, myTitle, myUpdated, myDeletedByEmail, myDeletedByName, myDeletedComment); ElementUtil.isEmpty(
myDeletedResourceId, myDeletedResourceType, myDeletedResourceVersion, myDeletedAt,
myScore, myStatus, myCategories,
myLinkAlternate, myLinkSelf, myPublished, myResource, mySummary,
myTitle, myUpdated, myDeletedByEmail, myDeletedByName, myDeletedComment);
//@formatter:on //@formatter:on
} }
@ -250,7 +271,7 @@ public class BundleEntry extends BaseBundle {
myDeletedComment = theDeletedComment; myDeletedComment = theDeletedComment;
} }
public void setDeletedResourceId(StringDt theDeletedResourceId) { public void setDeletedResourceId(IdDt theDeletedResourceId) {
myDeletedResourceId = theDeletedResourceId; myDeletedResourceId = theDeletedResourceId;
} }
@ -262,10 +283,21 @@ public class BundleEntry extends BaseBundle {
myDeletedResourceVersion = theDeletedResourceVersion; myDeletedResourceVersion = theDeletedResourceVersion;
} }
/**
* @deprecated Bundle entries no longer have an ID in DSTU2, as ID is explicitly stated in the resource itself.
*/
@Override
public void setId(IdDt theId) {
super.setId(theId);
}
public void setLinkAlternate(StringDt theLinkAlternate) { public void setLinkAlternate(StringDt theLinkAlternate) {
myLinkAlternate = theLinkAlternate; myLinkAlternate = theLinkAlternate;
} }
/**
* @deprecated Use resource ID to determine base URL
*/
public void setLinkBase(StringDt theLinkBase) { public void setLinkBase(StringDt theLinkBase) {
myLinkBase = theLinkBase; myLinkBase = theLinkBase;
} }
@ -299,8 +331,10 @@ public class BundleEntry extends BaseBundle {
} }
/** /**
* @deprecated <b>DSTU2 Note:</b> As of DSTU2, bundle entries no longer have an updated time (this bit of metadata has been moved to the resource &lt;meta/&gt; element so it is redundant here). In * @deprecated <b>DSTU2 Note:</b> As of DSTU2, bundle entries no longer have an updated time (this bit of metadata
* preparation for DSTU2, it is recommended that you migrate code away from using this method and over to using resource metadata instead. * has been moved to the resource &lt;meta/&gt; element so it is redundant here). In preparation for
* DSTU2, it is recommended that you migrate code away from using this method and over to using resource
* metadata instead.
*/ */
public void setUpdated(InstantDt theUpdated) { public void setUpdated(InstantDt theUpdated) {
Validate.notNull(theUpdated, "Updated may not be null"); Validate.notNull(theUpdated, "Updated may not be null");

View File

@ -61,6 +61,8 @@ import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.TemplateResolver; import org.thymeleaf.templateresolver.TemplateResolver;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.IDatatype;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt; import ca.uhn.fhir.model.dstu.composite.NarrativeDt;
import ca.uhn.fhir.model.dstu.valueset.NarrativeStatusEnum; import ca.uhn.fhir.model.dstu.valueset.NarrativeStatusEnum;
import ca.uhn.fhir.model.primitive.XhtmlDt; import ca.uhn.fhir.model.primitive.XhtmlDt;
@ -70,7 +72,7 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseThymeleafNarrativeGenerator.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseThymeleafNarrativeGenerator.class);
private static final XhtmlAndHtml5NonValidatingSAXTemplateParser PARSER = new XhtmlAndHtml5NonValidatingSAXTemplateParser(1); private static final XhtmlAndHtml5NonValidatingSAXTemplateParser PARSER = new XhtmlAndHtml5NonValidatingSAXTemplateParser(1);
private Configuration configuration; private Configuration myThymeleafConfig;
private boolean myApplyDefaultDatatypeTemplates = true; private boolean myApplyDefaultDatatypeTemplates = true;
private HashMap<Class<?>, String> myClassToName; private HashMap<Class<?>, String> myClassToName;
private boolean myCleanWhitespace = true; private boolean myCleanWhitespace = true;
@ -84,11 +86,11 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
private TemplateEngine myTitleTemplateEngine; private TemplateEngine myTitleTemplateEngine;
public BaseThymeleafNarrativeGenerator() { public BaseThymeleafNarrativeGenerator() {
configuration = new Configuration(); myThymeleafConfig = new Configuration();
configuration.addTemplateResolver(new ClassLoaderTemplateResolver()); myThymeleafConfig.addTemplateResolver(new ClassLoaderTemplateResolver());
configuration.addMessageResolver(new StandardMessageResolver()); myThymeleafConfig.addMessageResolver(new StandardMessageResolver());
configuration.setTemplateModeHandlers(StandardTemplateModeHandlers.ALL_TEMPLATE_MODE_HANDLERS); myThymeleafConfig.setTemplateModeHandlers(StandardTemplateModeHandlers.ALL_TEMPLATE_MODE_HANDLERS);
configuration.initialize(); myThymeleafConfig.initialize();
} }
@Override @Override
@ -96,6 +98,17 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
return generateNarrative( null, theResource); return generateNarrative( null, theResource);
} }
@Override
public void setFhirContext(FhirContext theFhirContext) {
if (theFhirContext == null) {
throw new NullPointerException("Can not set theFhirContext to null");
}
if (myFhirContext != null && myFhirContext != theFhirContext) {
throw new IllegalStateException("Narrative generators may not be reused/shared across multiple FhirContext instances");
}
myFhirContext = theFhirContext;
}
@Override @Override
public NarrativeDt generateNarrative(String theProfile, IBaseResource theResource) { public NarrativeDt generateNarrative(String theProfile, IBaseResource theResource) {
if (!myInitialized) { if (!myInitialized) {
@ -109,6 +122,9 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
if (name == null) { if (name == null) {
name = myClassToName.get(theResource.getClass()); name = myClassToName.get(theResource.getClass());
} }
if (name == null) {
name = myFhirContext.getResourceDefinition(theResource).getName().toLowerCase();
}
if (name == null) { if (name == null) {
if (myIgnoreMissingTemplates) { if (myIgnoreMissingTemplates) {
@ -163,6 +179,9 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
if (name == null) { if (name == null) {
name = myClassToName.get(theResource.getClass()); name = myClassToName.get(theResource.getClass());
} }
if (name == null) {
name = myFhirContext.getResourceDefinition(theResource).getName().toLowerCase();
}
ourLog.trace("Template name is {}", name); ourLog.trace("Template name is {}", name);
@ -235,7 +254,7 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
protected abstract List<String> getPropertyFile(); protected abstract List<String> getPropertyFile();
private Document getXhtmlDOMFor(final Reader source) { private Document getXhtmlDOMFor(final Reader source) {
final Configuration configuration1 = configuration; final Configuration configuration1 = myThymeleafConfig;
try { try {
return PARSER.parseTemplate(configuration1, "input", source); return PARSER.parseTemplate(configuration1, "input", source);
} catch (final Exception e) { } catch (final Exception e) {
@ -371,32 +390,42 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
try { try {
clazz = Class.forName(className); clazz = Class.forName(className);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
ourLog.warn("Unknown datatype class '{}' identified in narrative file {}", name, propFileName); ourLog.debug("Unknown datatype class '{}' identified in narrative file {}", name, propFileName);
clazz = null;
}
// if (isBlank(narrativeName) && isBlank(titleName)) {
// throw new ConfigurationException("Found property '" + nextKey + "' but no corresponding property '" + narrativePropName + "' or '" + titlePropName + "' in file " + propFileName);
// }
if (clazz != null) {
myClassToName.put(clazz, name);
}
} else if (nextKey.endsWith(".narrative")) {
String name = nextKey.substring(0, nextKey.indexOf(".narrative"));
if (isBlank(name)) {
continue; continue;
} }
String narrativePropName = name + ".narrative"; String narrativePropName = name + ".narrative";
String narrativeName = file.getProperty(narrativePropName); String narrativeName = file.getProperty(narrativePropName);
String titlePropName = name + ".title";
String titleName = file.getProperty(titlePropName);
if (isBlank(narrativeName) && isBlank(titleName)) {
throw new ConfigurationException("Found property '" + nextKey + "' but no corresponding property '" + narrativePropName + "' or '" + titlePropName + "' in file " + propFileName);
}
myClassToName.put(clazz, name);
if (StringUtils.isNotBlank(narrativeName)) { if (StringUtils.isNotBlank(narrativeName)) {
String narrative = IOUtils.toString(loadResource(narrativeName)); String narrative = IOUtils.toString(loadResource(narrativeName));
myNameToNarrativeTemplate.put(name, narrative); myNameToNarrativeTemplate.put(name, narrative);
} }
continue;
} else if (nextKey.endsWith(".title")) {
String name = nextKey.substring(0, nextKey.indexOf(".title"));
if (isBlank(name)) {
continue;
}
String titlePropName = name + ".title";
String titleName = file.getProperty(titlePropName);
if (StringUtils.isNotBlank(titleName)) { if (StringUtils.isNotBlank(titleName)) {
String title = IOUtils.toString(loadResource(titleName)); String title = IOUtils.toString(loadResource(titleName));
myNameToTitleTemplate.put(name, title); myNameToTitleTemplate.put(name, title);
} }
} else if (nextKey.endsWith(".narrative")) {
continue;
} else if (nextKey.endsWith(".title")) {
continue; continue;
} else { } else {
throw new ConfigurationException("Invalid property name: " + nextKey); throw new ConfigurationException("Invalid property name: " + nextKey);
@ -517,8 +546,11 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
return b.toString(); return b.toString();
} }
private FhirContext myFhirContext;
public class NarrativeAttributeProcessor extends AbstractAttrProcessor { public class NarrativeAttributeProcessor extends AbstractAttrProcessor {
protected NarrativeAttributeProcessor() { protected NarrativeAttributeProcessor() {
super("narrative"); super("narrative");
} }
@ -555,6 +587,21 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
name = myClassToName.get(nextClass); name = myClassToName.get(nextClass);
nextClass = nextClass.getSuperclass(); nextClass = nextClass.getSuperclass();
} while (name == null && nextClass.equals(Object.class) == false); } while (name == null && nextClass.equals(Object.class) == false);
if (name == null) {
if (value instanceof IBaseResource) {
name = myFhirContext.getResourceDefinition((IBaseResource)value).getName();
} else if (value instanceof IDatatype) {
name = value.getClass().getSimpleName();
name = name.substring(0, name.length() - 2);
} else {
throw new DataFormatException("Don't know how to determine name for type: " + value.getClass());
}
name = name.toLowerCase();
if (!myNameToNarrativeTemplate.containsKey(name)) {
name = null;
}
}
} }
if (name == null) { if (name == null) {
@ -568,6 +615,7 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
String result = myProfileTemplateEngine.process(name, context); String result = myProfileTemplateEngine.process(name, context);
String trim = result.trim(); String trim = result.trim();
if (!isBlank(trim + "AAA")) {
Document dom = getXhtmlDOMFor(new StringReader(trim)); Document dom = getXhtmlDOMFor(new StringReader(trim));
Element firstChild = (Element) dom.getFirstChild(); Element firstChild = (Element) dom.getFirstChild();
@ -582,6 +630,9 @@ public abstract class BaseThymeleafNarrativeGenerator implements INarrativeGener
theElement.addChild(next); theElement.addChild(next);
} }
}
return ProcessorResult.ok(); return ProcessorResult.ok();
} }

View File

@ -22,6 +22,7 @@ package ca.uhn.fhir.narrative;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt; import ca.uhn.fhir.model.dstu.composite.NarrativeDt;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
@ -35,4 +36,9 @@ public interface INarrativeGenerator {
String generateTitle(String theProfile, IBaseResource theResource); String generateTitle(String theProfile, IBaseResource theResource);
/**
* This method is called automatically by the framework, you do not need to interact with this method.
*/
void setFhirContext(FhirContext theFhirContext);
} }

View File

@ -46,6 +46,7 @@ import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeChildChoiceDefinition; import ca.uhn.fhir.context.RuntimeChildChoiceDefinition;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.BundleEntry;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt; import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt;
@ -68,6 +69,21 @@ public abstract class BaseParser implements IParser {
return theValue; return theValue;
} }
protected String determineResourceBaseUrl(String bundleBaseUrl, BundleEntry theEntry) {
IResource resource = theEntry.getResource();
if (resource == null) {
return null;
}
String resourceBaseUrl = null;
if (resource.getId() != null && resource.getId().hasBaseUrl()) {
if (!resource.getId().getBaseUrl().equals(bundleBaseUrl)) {
resourceBaseUrl = resource.getId().getBaseUrl();
}
}
return resourceBaseUrl;
}
private void containResourcesForEncoding(ContainedResources theContained, IBaseResource theResource, IBaseResource theTarget) { private void containResourcesForEncoding(ContainedResources theContained, IBaseResource theResource, IBaseResource theTarget) {
Set<String> allIds = new HashSet<String>(); Set<String> allIds = new HashSet<String>();

View File

@ -245,7 +245,7 @@ public class JsonParser extends BaseParser implements IParser {
theEventWriter.write("resourceType", "Bundle"); theEventWriter.write("resourceType", "Bundle");
writeTagWithTextNode(theEventWriter, "id", theBundle.getId().getIdPart()); writeOptionalTagWithTextNode(theEventWriter, "id", theBundle.getId().getIdPart());
if (!ElementUtil.isEmpty(theBundle.getId().getVersionIdPart(), theBundle.getUpdated())) { if (!ElementUtil.isEmpty(theBundle.getId().getVersionIdPart(), theBundle.getUpdated())) {
theEventWriter.writeStartObject("meta"); theEventWriter.writeStartObject("meta");
@ -272,7 +272,7 @@ public class JsonParser extends BaseParser implements IParser {
for (BundleEntry nextEntry : theBundle.getEntries()) { for (BundleEntry nextEntry : theBundle.getEntries()) {
theEventWriter.writeStartObject(); theEventWriter.writeStartObject();
writeOptionalTagWithTextNode(theEventWriter, "base", nextEntry.getLinkBase()); writeOptionalTagWithTextNode(theEventWriter, "base", determineResourceBaseUrl(theBundle.getLinkBase().getValue(), nextEntry));
writeOptionalTagWithTextNode(theEventWriter, "status", nextEntry.getStatus()); writeOptionalTagWithTextNode(theEventWriter, "status", nextEntry.getStatus());
writeOptionalTagWithTextNode(theEventWriter, "search", nextEntry.getLinkSearch()); writeOptionalTagWithTextNode(theEventWriter, "search", nextEntry.getLinkSearch());
writeOptionalTagWithDecimalNode(theEventWriter, "score", nextEntry.getScore()); writeOptionalTagWithDecimalNode(theEventWriter, "score", nextEntry.getScore());

View File

@ -170,8 +170,14 @@ public class XmlParser extends BaseParser implements IParser {
deleted = true; deleted = true;
eventWriter.writeStartElement("at", "deleted-entry", TOMBSTONES_NS); eventWriter.writeStartElement("at", "deleted-entry", TOMBSTONES_NS);
eventWriter.writeNamespace("at", TOMBSTONES_NS); eventWriter.writeNamespace("at", TOMBSTONES_NS);
eventWriter.writeAttribute("ref", nextEntry.getId().getValueAsString());
eventWriter.writeAttribute("when", nextEntry.getDeletedAt().getValueAsString()); if (nextEntry.getDeletedResourceId().isEmpty()) {
writeOptionalAttribute(eventWriter, "ref", nextEntry.getId().getValueAsString());
} else {
writeOptionalAttribute(eventWriter, "ref", nextEntry.getDeletedResourceId().getValueAsString());
}
writeOptionalAttribute(eventWriter, "when", nextEntry.getDeletedAt().getValueAsString());
if (nextEntry.getDeletedByEmail().isEmpty() == false || nextEntry.getDeletedByName().isEmpty() == false) { if (nextEntry.getDeletedByEmail().isEmpty() == false || nextEntry.getDeletedByName().isEmpty() == false) {
eventWriter.writeStartElement(TOMBSTONES_NS, "by"); eventWriter.writeStartElement(TOMBSTONES_NS, "by");
if (nextEntry.getDeletedByName().isEmpty() == false) { if (nextEntry.getDeletedByName().isEmpty() == false) {
@ -197,7 +203,11 @@ public class XmlParser extends BaseParser implements IParser {
writeOptionalTagWithTextNode(eventWriter, "title", nextEntry.getTitle()); writeOptionalTagWithTextNode(eventWriter, "title", nextEntry.getTitle());
if (!deleted) { if (!deleted) {
if (nextEntry.getId().isEmpty() == false) {
writeTagWithTextNode(eventWriter, "id", nextEntry.getId()); writeTagWithTextNode(eventWriter, "id", nextEntry.getId());
} else {
writeTagWithTextNode(eventWriter, "id", nextEntry.getResource().getId());
}
} }
writeOptionalTagWithTextNode(eventWriter, "updated", nextEntry.getUpdated()); writeOptionalTagWithTextNode(eventWriter, "updated", nextEntry.getUpdated());
writeOptionalTagWithTextNode(eventWriter, "published", nextEntry.getPublished()); writeOptionalTagWithTextNode(eventWriter, "published", nextEntry.getPublished());
@ -240,6 +250,12 @@ public class XmlParser extends BaseParser implements IParser {
eventWriter.close(); eventWriter.close();
} }
private void writeOptionalAttribute(XMLStreamWriter theEventWriter, String theName, String theValue) throws XMLStreamException {
if (StringUtils.isNotBlank(theValue)) {
theEventWriter.writeAttribute(theName, theValue);
}
}
private void encodeBundleToWriterUsingBundleResource(Bundle theBundle, XMLStreamWriter theEventWriter) throws XMLStreamException { private void encodeBundleToWriterUsingBundleResource(Bundle theBundle, XMLStreamWriter theEventWriter) throws XMLStreamException {
theEventWriter.writeStartElement("Bundle"); theEventWriter.writeStartElement("Bundle");
theEventWriter.writeDefaultNamespace(FHIR_NS); theEventWriter.writeDefaultNamespace(FHIR_NS);
@ -273,11 +289,7 @@ public class XmlParser extends BaseParser implements IParser {
theEventWriter.writeStartElement("entry"); theEventWriter.writeStartElement("entry");
IResource nextResource = nextEntry.getResource(); IResource nextResource = nextEntry.getResource();
if (nextResource.getId() != null && nextResource.getId().hasBaseUrl()) { writeOptionalTagWithValue(theEventWriter, "base", determineResourceBaseUrl(bundleBaseUrl, nextEntry));
if (!nextResource.getId().getBaseUrl().equals(bundleBaseUrl)) {
writeOptionalTagWithValue(theEventWriter, "base", nextResource.getId().getBaseUrl());
}
}
writeOptionalTagWithValue(theEventWriter, "status", nextEntry.getStatus().getValue()); writeOptionalTagWithValue(theEventWriter, "status", nextEntry.getStatus().getValue());
writeOptionalTagWithValue(theEventWriter, "search", nextEntry.getLinkSearch().getValue()); writeOptionalTagWithValue(theEventWriter, "search", nextEntry.getLinkSearch().getValue());

View File

@ -22,6 +22,7 @@ package ca.uhn.fhir.rest.method;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
@ -58,18 +59,22 @@ abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOu
} }
resourceParameter = (ResourceParameter) next; resourceParameter = (ResourceParameter) next;
Class<? extends IResource> resourceType = resourceParameter.getResourceType(); Class<? extends IResource> providerResourceType = resourceParameter.getResourceType();
if (theProvider instanceof IResourceProvider) { if (theProvider instanceof IResourceProvider) {
resourceType = ((IResourceProvider) theProvider).getResourceType(); providerResourceType = ((IResourceProvider) theProvider).getResourceType();
} }
if (resourceType.isAssignableFrom(Binary.class)) { if (providerResourceType.isAssignableFrom(Binary.class)) {
myBinary = true; myBinary = true;
} }
myResourceType = resourceParameter.getResourceType(); myResourceType = resourceParameter.getResourceType();
myResourceName = theContext.getResourceDefinition(myResourceType).getName(); if (Modifier.isAbstract(myResourceType.getModifiers())) {
myResourceType = providerResourceType;
}
myResourceName = theContext.getResourceDefinition(providerResourceType).getName();
myResourceParameterIndex = index; myResourceParameterIndex = index;
} }

View File

@ -34,6 +34,7 @@ import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition;
import ca.uhn.fhir.context.BaseRuntimeElementDefinition; import ca.uhn.fhir.context.BaseRuntimeElementDefinition;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeChildChoiceDefinition;
import ca.uhn.fhir.context.RuntimeResourceDefinition; import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.model.api.ExtensionDt; import ca.uhn.fhir.model.api.ExtensionDt;
import ca.uhn.fhir.model.api.IElement; import ca.uhn.fhir.model.api.IElement;
@ -144,7 +145,18 @@ public class FhirTerser {
List<Object> retVal = new ArrayList<Object>(); List<Object> retVal = new ArrayList<Object>();
if (theSubList.size() == 1) { if (theSubList.size() == 1) {
if (nextDef instanceof RuntimeChildChoiceDefinition) {
for (IBase next : values) {
if (next != null) {
String childName = nextDef.getChildNameByDatatype(next.getClass());
if (theSubList.get(0).equals(childName)) {
retVal.add(next);
}
}
}
} else {
retVal.addAll(values); retVal.addAll(values);
}
} else { } else {
for (IBase nextElement : values) { for (IBase nextElement : values) {
BaseRuntimeElementCompositeDefinition<?> nextChildDef = (BaseRuntimeElementCompositeDefinition<?>) myContext.getElementDefinition(nextElement.getClass()); BaseRuntimeElementCompositeDefinition<?> nextChildDef = (BaseRuntimeElementCompositeDefinition<?>) myContext.getElementDefinition(nextElement.getClass());

View File

@ -13,25 +13,25 @@
display value on the first coding, and if that's missing too show a default "Untitled" display value on the first coding, and if that's missing too show a default "Untitled"
value value
*/--> */-->
<th:block th:if="${not resource.name.text.empty}" th:text="${resource.name.text.value}"/> <th:block th:if="${not resource.name.textElement.empty}" th:text="${resource.name.textElement.value}"/>
<th:block th:if=" ${resource.name.text.empty} and ${not resource.name.codingFirstRep.display.empty}" th:text="${resource.name.codingFirstRep.display}"/> <th:block th:if=" ${resource.name.textElement.empty} and ${not resource.name.codingFirstRep.displayElement.empty}" th:text="${resource.name.codingFirstRep.display}"/>
<th:block th:if= "${resource.name.text.empty} and ${resource.name.codingFirstRep.display.empty}" th:text="Untitled Diagnostic Report"/> <th:block th:if= "${resource.name.textElement.empty} and ${resource.name.codingFirstRep.displayElement.empty}" th:text="Untitled Diagnostic Report"/>
<!--/*--> Complete Blood Count <!--*/--> <!--/*--> Complete Blood Count <!--*/-->
</div> </div>
<table class="hapiPropertyTable"> <table class="hapiPropertyTable">
<tbody> <tbody>
<tr th:if="${not resource.status.empty}"> <tr th:if="${not resource.statusElement.empty}">
<td>Status</td> <td>Status</td>
<td th:text="${resource.status.value}">Final</td> <td th:text="${resource.statusElement.value}">Final</td>
</tr> </tr>
<tr th:if="${not resource.issued.empty}"> <tr th:if="${not resource.issuedElement.empty}">
<td>Issued</td> <td>Issued</td>
<td th:narrative="${resource.issued}">22 March 2012</td> <td th:narrative="${resource.issuedElement}">22 March 2012</td>
</tr> </tr>
<tr th:if="${not resource.conclusion.empty}"> <tr th:if="${not resource.conclusionElement.empty}">
<td>Conclusion</td> <td>Conclusion</td>
<td th:narrative="${resource.conclusion}">This is the conclusion text</td> <td th:narrative="${resource.conclusionElement}">This is the conclusion text</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -50,15 +50,15 @@
<th:block th:each="result,rowStat : ${resource.result}"> <th:block th:each="result,rowStat : ${resource.result}">
<tr th:class="${rowStat.odd}? 'hapiTableOfValuesRowOdd' : 'hapiTableOfValuesRowEven'" class="hapiTableOfValuesRowOdd"> <tr th:class="${rowStat.odd}? 'hapiTableOfValuesRowOdd' : 'hapiTableOfValuesRowEven'" class="hapiTableOfValuesRowOdd">
<td> <td>
<th:block th:if="${not result.resource.name.text.empty}" th:text="${result.resource.name.text.value}"/> <th:block th:if="${not result.resource.name.textElement.empty}" th:text="${result.resource.name.textElement.value}"/>
<th:block th:if="${result.resource.name.text.empty} and ${not #lists.isEmpty(result.resource.name.coding)} and ${not result.resource.name.coding[0].empty} and ${not result.resource.name.coding[0].display.empty}" th:text="${result.resource.name.coding[0].display}"/> <th:block th:if="${result.resource.name.textElement.empty} and ${not #lists.isEmpty(result.resource.name.coding)} and ${not result.resource.name.coding[0].empty} and ${not result.resource.name.coding[0].displayElement.empty}" th:text="${result.resource.name.coding[0].display}"/>
<th:block th:if="${result.resource.name.text.empty} and ${not #lists.isEmpty(result.resource.name.coding)} and ${not result.resource.name.coding[0].empty} and ${result.resource.name.coding[0].display.empty}" th:text="'?'"/> <th:block th:if="${result.resource.name.textElement.empty} and ${not #lists.isEmpty(result.resource.name.coding)} and ${not result.resource.name.coding[0].empty} and ${result.resource.name.coding[0].displayElement.empty}" th:text="'?'"/>
<!--/*--> Hb <!--*/--> <!--/*--> Hb <!--*/-->
</td> </td>
<td th:narrative="${result.resource.value}">2.2 g/L</td> <td th:narrative="${result.resource.value}">2.2 g/L</td>
<td> <td>
<th:block th:if="${not result.resource.interpretation.text.empty}" th:text="${result.resource.interpretation.text}"/> <th:block th:if="${not result.resource.interpretation.textElement.empty}" th:text="${result.resource.interpretation.text}"/>
<th:block th:if="${result.resource.interpretation.text.empty} and ${not result.resource.interpretation.codingFirstRep.display.empty}" th:text="${result.resource.interpretation.codingFirstRep.display}"/> <th:block th:if="${result.resource.interpretation.textElement.empty} and ${not result.resource.interpretation.codingFirstRep.displayElement.empty}" th:text="${result.resource.interpretation.codingFirstRep.display}"/>
<!--/*--> N <!--*/--> <!--/*--> N <!--*/-->
</td> </td>
<td> <td>
@ -68,10 +68,10 @@
<th:block th:narrative="${result.resource.referenceRange[0].high}">2.9 g/L</th:block> <th:block th:narrative="${result.resource.referenceRange[0].high}">2.9 g/L</th:block>
</th:block> </th:block>
</td> </td>
<td th:text="${result.resource.status.value}">final</td> <td th:text="${result.resource.statusElement.value}">final</td>
</tr> </tr>
<tr th:if="${not result.resource.comments.empty}" th:class="${rowStat.odd}? 'hapiTableOfValuesRowOdd' : 'hapiTableOfValuesRowEven'" class="hapiTableOfValuesRowOdd"> <tr th:if="${not result.resource.commentsElement.empty}" th:class="${rowStat.odd}? 'hapiTableOfValuesRowOdd' : 'hapiTableOfValuesRowEven'" class="hapiTableOfValuesRowOdd">
<td th:text="${result.resource.comments.value}" colspan="5">This is a comment</td> <td th:text="${result.resource.commentsElement.value}" colspan="5">This is a comment</td>
</tr> </tr>
<!--/* The following are just examples that don't appear in the generated narrative --> <!--/* The following are just examples that don't appear in the generated narrative -->

View File

@ -11,7 +11,7 @@ a browser.
<!--*/--> <!--*/-->
<div> <div>
<div class="hapiHeaderText" th:if="${not resource.name.empty}" th:narrative="${resource.name}"></div> <div class="hapiHeaderText" th:if="${not resource.nameElement.empty}" th:narrative="${resource.name}"></div>
</div> </div>
<!--/*--> <!--/*-->

View File

@ -11,20 +11,20 @@ a browser.
<!--*/--> <!--*/-->
<div> <div>
<div class="hapiHeaderText" th:if="${not resource.medication.resource.name.empty}" th:narrative="${resource.medication.resource.name}"></div> <div class="hapiHeaderText" th:if="${not resource.medication.resource.nameElement.empty}" th:narrative="${resource.medication.resource.nameElement}"></div>
<table class="hapiPropertyTable"> <table class="hapiPropertyTable">
<tbody> <tbody>
<tr th:if="${not resource.id.empty}"> <tr th:if="${not resource.id.empty}">
<td>Id</td> <td>Id</td>
<td th:text="${resource.id.value}"></td> <td th:text="${resource.id.value}"></td>
</tr> </tr>
<tr th:if="${not resource.dateWritten.empty}"> <tr th:if="${not resource.dateWrittenElement.empty}">
<td>Date</td> <td>Date</td>
<td ><span th:text="${#dates.format(resource.dateWritten.value,'dd MMMM yyyy')}"></span></td> <td ><span th:text="${#dates.format(resource.dateWrittenElement.value,'dd MMMM yyyy')}"></span></td>
</tr> </tr>
<tr th:if="${not resource.status.empty}"> <tr th:if="${not resource.statusElement.empty}">
<td>Status</td> <td>Status</td>
<td><span th:text="${resource.status.valueAsEnum}"></span></td> <td><span th:text="${resource.statusElement.valueAsEnum}"></span></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -9,7 +9,7 @@
<h1>Operation Outcome</h1> <h1>Operation Outcome</h1>
<table border="0"> <table border="0">
<tr th:each="issue : ${resource.issue}"> <tr th:each="issue : ${resource.issue}">
<td th:text="${issue.severity.value}" style="font-weight: bold;"></td> <td th:text="${issue.severityElement.value}" style="font-weight: bold;"></td>
<td th:text="${issue.location}"></td> <td th:text="${issue.location}"></td>
<td><pre th:text="${issue.details}"/></td> <td><pre th:text="${issue.details}"/></td>
</tr> </tr>

View File

@ -22,9 +22,9 @@ a browser.
<td>Address</td> <td>Address</td>
<td th:narrative="${resource.addressFirstRep}"></td> <td th:narrative="${resource.addressFirstRep}"></td>
</tr> </tr>
<tr th:if="${not resource.birthDate.empty}"> <tr th:if="${not resource.birthDateElement.empty}">
<td>Date of birth</td> <td>Date of birth</td>
<td><span th:text="${#dates.format(resource.birthDate.value,'dd MMMM yyyy')}"></span></td> <td><span th:text="${#dates.format(resource.birthDateElement.value,'dd MMMM yyyy')}"></span></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -2,7 +2,7 @@
<th:block th:each="line : ${resource.line}"> <th:block th:each="line : ${resource.line}">
<span th:text="${line} + ' '">123 Fake Street</span><br/> <span th:text="${line} + ' '">123 Fake Street</span><br/>
</th:block> </th:block>
<span th:if="${not resource.city.empty}" th:text="${resource.city} + ' '">Toronto</span> <span th:if="${not resource.cityElement.empty}" th:text="${resource.city} + ' '">Toronto</span>
<span th:if="${not resource.state.empty}" th:text="${resource.state} + ' '">ON</span> <span th:if="${not resource.stateElement.empty}" th:text="${resource.state} + ' '">ON</span>
<span th:if="${not resource.country.empty}" th:text="${resource.country}+ ' '">Canada</span> <span th:if="${not resource.countryElement.empty}" th:text="${resource.country}+ ' '">Canada</span>
</div> </div>

View File

@ -1,11 +1,11 @@
<div> <div>
<th:block th:if="${not resource.text.empty}" th:text="${resource.text.value}"/> <th:block th:if="${not resource.textElement.empty}" th:text="${resource.textElement.value}"/>
<th:block th:if="${resource.text.empty}"> <th:block th:if="${resource.textElement.empty}">
<th:block th:if="${!resource.codingFirstRep.empty}"> <th:block th:if="${!resource.codingFirstRep.empty}">
<th:block th:if="${!resource.codingFirstRep.display.empty}" th:text="${!resource.codingFirstRep.display.value}"/> <th:block th:if="${!resource.codingFirstRep.displayElement.empty}" th:text="${!resource.codingFirstRep.displayElement.value}"/>
<th:block th:if="${resource.codingFirstRep.display.empty}"> <th:block th:if="${resource.codingFirstRep.displayElement.empty}">
<th:block th:if="${!resource.codingFirstRep.code.empty}"> <th:block th:if="${!resource.codingFirstRep.codeElement.empty}">
<th:block th:text="${resource.codingFirstRep.code.value}"/> <th:block th:text="${resource.codingFirstRep.codeElement.value}"/>
</th:block> </th:block>
</th:block> </th:block>
</th:block> </th:block>

View File

@ -1,4 +1,4 @@
<div> <div>
<th:block th:if="${!resource.label.empty}" th:text="${resource.label.value}"/> <th:block th:if="${!resource.labelElement.empty}" th:text="${resource.labelElement.value}"/>
<th:block th:if="${resource.label.empty}" th:text="${resource.value.valueAsString}"/> <th:block th:if="${resource.labelElement.empty}" th:text="${resource.valueElement.valueAsString}"/>
</div> </div>

View File

@ -1,5 +1,5 @@
<div> <div>
<th:block th:if="${!resource.start.empty} and ${!resource.end.empty}" th:text="${resource.start.value} + ' - ' + ${resource.end.value}"/> <th:block th:if="${!resource.startElement.empty} and ${!resource.endElement.empty}" th:text="${resource.startElement.value} + ' - ' + ${resource.endElement.value}"/>
<th:block th:if="${!resource.start.empty} and ${resource.end.empty}" th:text="${resource.start.value} + ' - ?'"/> <th:block th:if="${!resource.startElement.empty} and ${resource.endElement.empty}" th:text="${resource.startElement.value} + ' - ?'"/>
<th:block th:if="${resource.start.empty} and ${!resource.end.empty}" th:text="'? - ' + ${resource.end.value}"/> <th:block th:if="${resource.startElement.empty} and ${!resource.endElement.empty}" th:text="'? - ' + ${resource.endElement.value}"/>
</div> </div>

View File

@ -1,5 +1,5 @@
<div> <div>
<th:block th:if="${not resource.comparator.empty}" th:text="${resource.comparator.value}"/> <th:block th:if="${not resource.comparatorElement.empty}" th:text="${resource.comparatorElement.value}"/>
<th:block th:if="${not resource.value.empty}" th:text="${resource.value.valueAsString}"/> <th:block th:if="${not resource.valueElement.empty}" th:text="${resource.valueElement.valueAsString}"/>
<th:block th:if="${not resource.units.empty}" th:text="${resource.units.value}"/> <th:block th:if="${not resource.unitsElement.empty}" th:text="${resource.unitsElement.value}"/>
</div> </div>

View File

@ -25,6 +25,7 @@ address.narrative=classpath:ca/uhn/fhir/narrative/datatype/AddressDt.html
codeableconcept.class=ca.uhn.fhir.model.dstu.composite.CodeableConceptDt codeableconcept.class=ca.uhn.fhir.model.dstu.composite.CodeableConceptDt
codeableconcept.narrative=classpath:ca/uhn/fhir/narrative/datatype/CodeableConceptDt.html codeableconcept.narrative=classpath:ca/uhn/fhir/narrative/datatype/CodeableConceptDt.html
boundcodeableconcept.narrative=classpath:ca/uhn/fhir/narrative/datatype/CodeableConceptDt.html
humanname.class=ca.uhn.fhir.model.dstu.composite.HumanNameDt humanname.class=ca.uhn.fhir.model.dstu.composite.HumanNameDt
humanname.narrative=classpath:ca/uhn/fhir/narrative/datatype/HumanNameDt.html humanname.narrative=classpath:ca/uhn/fhir/narrative/datatype/HumanNameDt.html

View File

@ -1,9 +1,9 @@
<div> <div>
<th:block th:if="${not resource.name.text.empty}" th:text="${resource.name.text.value}"/> <th:block th:if="${not resource.name.textElement.empty}" th:text="${resource.name.textElement.value}"/>
<th:block th:if=" ${resource.name.text.empty} and ${not resource.name.codingFirstRep.display.empty}" th:text="${resource.name.codingFirstRep.display}"/> <th:block th:if=" ${resource.name.textElement.empty} and ${not resource.name.codingFirstRep.displayElement.empty}" th:text="${resource.name.codingFirstRep.display}"/>
<th:block th:if= "${resource.name.text.empty} and ${resource.name.codingFirstRep.display.empty}" th:text="Untitled Diagnostic Report"/> <th:block th:if= "${resource.name.textElement.empty} and ${resource.name.codingFirstRep.displayElement.empty}" th:text="Untitled Diagnostic Report"/>
<th:block th:if="${not resource.status.empty}" th:text="' - ' + ${resource.status.value}"/> <th:block th:if="${not resource.statusElement.empty}" th:text="' - ' + ${resource.statusElement.value}"/>
<th:block th:text="' - ' + ${resource.result.size} + ' observations'"/> <th:block th:text="' - ' + ${resource.result.size} + ' observations'"/>
</div> </div>

View File

@ -1,13 +1,13 @@
<div> <div>
<th:block th:if="${!resource.identifierFirstRep.empty}" th:narrative="${resource.identifierFirstRep}" /> <th:block th:if="${!resource.identifierFirstRep.empty}" th:narrative="${resource.identifierFirstRep}" />
<th:block th:if="${not resource.status.empty}"> <th:block th:if="${not resource.statusElement.empty}">
/ <th:block th:narrative="${resource.status}"/> / <th:block th:narrative="${resource.statusElement}"/>
</th:block> </th:block>
<th:block th:if="${not resource.typeFirstRep.empty}"> <th:block th:if="${not resource.typeFirstRep.empty}">
/ <th:block th:narrative="${resource.typeFirstRep}"/> / <th:block th:narrative="${resource.typeFirstRep}"/>
</th:block> </th:block>
<th:block th:if="${not resource.classElement.empty}"> <th:block th:if="${not resource.classElementElement.empty}">
/ <th:block th:narrative="${resource.classElement}"/> / <th:block th:narrative="${resource.classElementElement}"/>
</th:block> </th:block>
<th:block th:if="${not resource.period.empty}"> <th:block th:if="${not resource.period.empty}">
/ <th:block th:narrative="${resource.period}"/> / <th:block th:narrative="${resource.period}"/>

View File

@ -1,3 +1,3 @@
<div> <div>
<div class="hapiHeaderText" th:if="${not resource.medication.resource.name.empty}" th:narrative="${resource.medication.resource.name}"></div> <div class="hapiHeaderText" th:if="${not resource.medication.resource.nameElement.empty}" th:narrative="${resource.medication.resource.nameElement}"></div>
</div> </div>

View File

@ -1,5 +1,5 @@
<div> <div>
Operation Outcome Operation Outcome
<th:block th:if="${resource.issue.size} == 1" th:text="'(' + ${resource.issueFirstRep.severity.value} + ')'"/> <th:block th:if="${resource.issue.size} == 1" th:text="'(' + ${resource.issueFirstRep.severityElement.value} + ')'"/>
<th:block th:if="${resource.issue.size} != 1" th:text="'(' + ${resource.issue.size} + ' issues)'"/> <th:block th:if="${resource.issue.size} != 1" th:text="'(' + ${resource.issue.size} + ' issues)'"/>
</div> </div>

View File

@ -16,9 +16,9 @@
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>jetty</groupId> <groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId> <artifactId>servlet-api</artifactId>
<version>2.5-6.0.2</version> <version>2.5</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -67,6 +67,7 @@ import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.model.base.composite.BaseCodingDt; import ca.uhn.fhir.model.base.composite.BaseCodingDt;
import ca.uhn.fhir.model.base.composite.BaseIdentifierDt; import ca.uhn.fhir.model.base.composite.BaseIdentifierDt;
import ca.uhn.fhir.model.base.composite.BaseQuantityDt;
import ca.uhn.fhir.model.dstu.composite.CodingDt; import ca.uhn.fhir.model.dstu.composite.CodingDt;
import ca.uhn.fhir.model.dstu.composite.IdentifierDt; import ca.uhn.fhir.model.dstu.composite.IdentifierDt;
import ca.uhn.fhir.model.dstu.composite.QuantityDt; import ca.uhn.fhir.model.dstu.composite.QuantityDt;
@ -1015,12 +1016,12 @@ public class FhirResourceDao<T extends IResource> extends BaseFhirDao implements
BigDecimal valueValue; BigDecimal valueValue;
boolean approx = false; boolean approx = false;
if (params instanceof QuantityDt) { if (params instanceof BaseQuantityDt) {
QuantityDt param = (QuantityDt) params; BaseQuantityDt param = (BaseQuantityDt) params;
systemValue = param.getSystem().getValueAsString(); systemValue = param.getSystemElement().getValueAsString();
unitsValue = param.getUnits().getValueAsString(); unitsValue = param.getUnitsElement().getValueAsString();
cmpValue = param.getComparator().getValueAsEnum(); cmpValue = QuantityCompararatorEnum.VALUESET_BINDER.fromCodeString(param.getComparatorElement().getValueAsString());
valueValue = param.getValue().getValue(); valueValue = param.getValueElement().getValue();
} else if (params instanceof QuantityParam) { } else if (params instanceof QuantityParam) {
QuantityParam param = (QuantityParam) params; QuantityParam param = (QuantityParam) params;
systemValue = param.getSystem().getValueAsString(); systemValue = param.getSystem().getValueAsString();

View File

@ -154,7 +154,7 @@ class SearchParamExtractorDev implements ISearchParamExtractor {
continue; continue;
} }
if (new UriDt(BaseFhirDao.UCUM_NS).equals(nextValue.getSystem())) { if (new UriDt(BaseFhirDao.UCUM_NS).equals(nextValue.getSystemElement())) {
if (isNotBlank(nextValue.getCode())) { if (isNotBlank(nextValue.getCode())) {
Unit<? extends Quantity> unit = Unit.valueOf(nextValue.getCode()); Unit<? extends Quantity> unit = Unit.valueOf(nextValue.getCode());
@ -293,7 +293,7 @@ class SearchParamExtractorDev implements ISearchParamExtractor {
String nextPath = nextSpDef.getPath(); String nextPath = nextSpDef.getPath();
if (isBlank(nextPath)) { if (isBlank(nextPath)) {
// TODO: implement phoenetic, and any others that have no path // TODO: implement phonetic, and any others that have no path
continue; continue;
} }

View File

@ -1,17 +1,7 @@
package ca.uhn.fhir.jpa.dao; package ca.uhn.fhir.jpa.dao;
import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.*;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
@ -34,20 +24,22 @@ import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.model.dstu.composite.CodeableConceptDt; import ca.uhn.fhir.model.dev.composite.CodeableConceptDt;
import ca.uhn.fhir.model.dstu.composite.IdentifierDt; import ca.uhn.fhir.model.dev.composite.IdentifierDt;
import ca.uhn.fhir.model.dstu.composite.PeriodDt; import ca.uhn.fhir.model.dev.composite.PeriodDt;
import ca.uhn.fhir.model.dstu.composite.QuantityDt; import ca.uhn.fhir.model.dev.composite.QuantityDt;
import ca.uhn.fhir.model.dev.resource.Device;
import ca.uhn.fhir.model.dev.resource.DiagnosticReport;
import ca.uhn.fhir.model.dev.resource.Encounter;
import ca.uhn.fhir.model.dev.resource.Location;
import ca.uhn.fhir.model.dev.resource.Observation;
import ca.uhn.fhir.model.dev.resource.Organization;
import ca.uhn.fhir.model.dev.resource.Patient;
import ca.uhn.fhir.model.dev.valueset.AdministrativeGenderEnum;
import ca.uhn.fhir.model.dev.valueset.QuantityComparatorEnum;
import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt; import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu.resource.Device;
import ca.uhn.fhir.model.dstu.resource.DiagnosticReport;
import ca.uhn.fhir.model.dstu.resource.Encounter;
import ca.uhn.fhir.model.dstu.resource.Location;
import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.Organization;
import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.valueset.AdministrativeGenderCodesEnum;
import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum; import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum;
import ca.uhn.fhir.model.primitive.DateDt;
import ca.uhn.fhir.model.primitive.DateTimeDt; import ca.uhn.fhir.model.primitive.DateTimeDt;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.InstantDt;
@ -114,7 +106,7 @@ public class FhirResourceDaoTest {
public void testChoiceParamQuantity() { public void testChoiceParamQuantity() {
Observation o3 = new Observation(); Observation o3 = new Observation();
o3.getName().addCoding().setSystem("foo").setCode("testChoiceParam03"); o3.getName().addCoding().setSystem("foo").setCode("testChoiceParam03");
o3.setValue(new QuantityDt(QuantityCompararatorEnum.GREATERTHAN, 123.0, "foo", "bar")); o3.setValue(new QuantityDt(QuantityComparatorEnum.GREATERTHAN, 123.0, "foo", "bar"));
IdDt id3 = ourObservationDao.create(o3).getId(); IdDt id3 = ourObservationDao.create(o3).getId();
{ {
@ -171,8 +163,8 @@ public class FhirResourceDaoTest {
public void testDatePeriodParamEndOnly() { public void testDatePeriodParamEndOnly() {
{ {
Encounter enc = new Encounter(); Encounter enc = new Encounter();
enc.addIdentifier("testDatePeriodParam", "02"); enc.addIdentifier().setSystem("testDatePeriodParam").setValue("02");
enc.getPeriod().getEnd().setValueAsString("2001-01-02"); enc.getPeriod().getEndElement().setValueAsString("2001-01-02");
ourEncounterDao.create(enc); ourEncounterDao.create(enc);
} }
SearchParameterMap params; SearchParameterMap params;
@ -214,9 +206,9 @@ public class FhirResourceDaoTest {
public void testDatePeriodParamStartAndEnd() { public void testDatePeriodParamStartAndEnd() {
{ {
Encounter enc = new Encounter(); Encounter enc = new Encounter();
enc.addIdentifier("testDatePeriodParam", "03"); enc.addIdentifier().setSystem("testDatePeriodParam").setValue( "03");
enc.getPeriod().getStart().setValueAsString("2001-01-02"); enc.getPeriod().getStartElement().setValueAsString("2001-01-02");
enc.getPeriod().getEnd().setValueAsString("2001-01-03"); enc.getPeriod().getEndElement().setValueAsString("2001-01-03");
ourEncounterDao.create(enc); ourEncounterDao.create(enc);
} }
@ -268,8 +260,8 @@ public class FhirResourceDaoTest {
public void testDatePeriodParamStartOnly() { public void testDatePeriodParamStartOnly() {
{ {
Encounter enc = new Encounter(); Encounter enc = new Encounter();
enc.addIdentifier("testDatePeriodParam", "01"); enc.addIdentifier().setSystem("testDatePeriodParam").setValue("01");
enc.getPeriod().getStart().setValueAsString("2001-01-02"); enc.getPeriod().getStartElement().setValueAsString("2001-01-02");
ourEncounterDao.create(enc); ourEncounterDao.create(enc);
} }
@ -314,19 +306,19 @@ public class FhirResourceDaoTest {
IdDt id2b; IdDt id2b;
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue("001");
patient.addName().addFamily("Tester_testDelete").addGiven("Joe"); patient.addName().addFamily("Tester_testDelete").addGiven("Joe");
id1 = ourPatientDao.create(patient).getId(); id1 = ourPatientDao.create(patient).getId();
} }
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue("002");
patient.addName().addFamily("Tester_testDelete").addGiven("John"); patient.addName().addFamily("Tester_testDelete").addGiven("John");
id2 = ourPatientDao.create(patient).getId(); id2 = ourPatientDao.create(patient).getId();
} }
{ {
Patient patient = ourPatientDao.read(id2); Patient patient = ourPatientDao.read(id2);
patient.addIdentifier("ZZZZZZZ", "ZZZZZZZZZ"); patient.addIdentifier().setSystem("ZZZZZZZ").setValue("ZZZZZZZZZ");
id2b = ourPatientDao.update(patient, id2).getId(); id2b = ourPatientDao.update(patient, id2).getId();
} }
ourLog.info("ID1:{} ID2:{} ID2b:{}", new Object[] { id1, id2, id2b }); ourLog.info("ID1:{} ID2:{} ID2b:{}", new Object[] { id1, id2, id2b });
@ -371,7 +363,7 @@ public class FhirResourceDaoTest {
@Test @Test
public void testIdParam() { public void testIdParam() {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addFamily("Tester").addGiven("Joe"); patient.addName().addFamily("Tester").addGiven("Joe");
MethodOutcome outcome = ourPatientDao.create(patient); MethodOutcome outcome = ourPatientDao.create(patient);
@ -482,11 +474,11 @@ public class FhirResourceDaoTest {
@Test @Test
public void testPersistResourceLink() { public void testPersistResourceLink() {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "testPersistResourceLink01"); patient.addIdentifier().setSystem("urn:system").setValue( "testPersistResourceLink01");
IdDt patientId01 = ourPatientDao.create(patient).getId(); IdDt patientId01 = ourPatientDao.create(patient).getId();
Patient patient02 = new Patient(); Patient patient02 = new Patient();
patient02.addIdentifier("urn:system", "testPersistResourceLink02"); patient02.addIdentifier().setSystem("urn:system").setValue( "testPersistResourceLink02");
IdDt patientId02 = ourPatientDao.create(patient02).getId(); IdDt patientId02 = ourPatientDao.create(patient02).getId();
Observation obs01 = new Observation(); Observation obs01 = new Observation();
@ -522,8 +514,8 @@ public class FhirResourceDaoTest {
@Test @Test
public void testPersistSearchParamDate() { public void testPersistSearchParamDate() {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.setBirthDate(new DateTimeDt("2001-01-01")); patient.setBirthDate(new DateDt("2001-01-01"));
ourPatientDao.create(patient); ourPatientDao.create(patient);
@ -574,8 +566,8 @@ public class FhirResourceDaoTest {
@Test @Test
public void testPersistSearchParams() { public void testPersistSearchParams() {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001testPersistSearchParams"); patient.addIdentifier().setSystem("urn:system").setValue( "001testPersistSearchParams");
patient.getGender().setValueAsEnum(AdministrativeGenderCodesEnum.M); patient.getGenderElement().setValueAsEnum(AdministrativeGenderEnum.MALE);
patient.addName().addFamily("Tester").addGiven("JoetestPersistSearchParams"); patient.addName().addFamily("Tester").addGiven("JoetestPersistSearchParams");
MethodOutcome outcome = ourPatientDao.create(patient); MethodOutcome outcome = ourPatientDao.create(patient);
@ -598,14 +590,22 @@ public class FhirResourceDaoTest {
SearchParameterMap map = new SearchParameterMap(); SearchParameterMap map = new SearchParameterMap();
map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "001testPersistSearchParams")); map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "001testPersistSearchParams"));
map.add(Patient.SP_GENDER, new IdentifierDt(AdministrativeGenderCodesEnum.M.getSystem(), "M")); map.add(Patient.SP_GENDER, new IdentifierDt("urn:some:wrong:system", AdministrativeGenderEnum.MALE.getCode()));
found = toList(ourPatientDao.search(map));
assertEquals(0, found.size());
// Now with no system on the gender (should match)
map = new SearchParameterMap();
map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "001testPersistSearchParams"));
map.add(Patient.SP_GENDER, new IdentifierDt(null, AdministrativeGenderEnum.MALE.getCode()));
found = toList(ourPatientDao.search(map)); found = toList(ourPatientDao.search(map));
assertEquals(1, found.size()); assertEquals(1, found.size());
assertEquals(id, found.get(0).getId().getIdPartAsLong().longValue()); assertEquals(id, found.get(0).getId().getIdPartAsLong().longValue());
// Now with the wrong gender
map = new SearchParameterMap(); map = new SearchParameterMap();
map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "001testPersistSearchParams")); map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "001testPersistSearchParams"));
map.add(Patient.SP_GENDER, new IdentifierDt(AdministrativeGenderCodesEnum.M.getSystem(), "F")); map.add(Patient.SP_GENDER, new IdentifierDt(AdministrativeGenderEnum.MALE.getSystem(), AdministrativeGenderEnum.FEMALE.getCode()));
found = toList(ourPatientDao.search(map)); found = toList(ourPatientDao.search(map));
assertEquals(0, found.size()); assertEquals(0, found.size());
@ -615,13 +615,13 @@ public class FhirResourceDaoTest {
public void testSearchAll() { public void testSearchAll() {
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue("001");
patient.addName().addFamily("Tester").addGiven("Joe"); patient.addName().addFamily("Tester").addGiven("Joe");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue("002");
patient.addName().addFamily("Tester").addGiven("John"); patient.addName().addFamily("Tester").addGiven("John");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
@ -637,7 +637,7 @@ public class FhirResourceDaoTest {
IdDt idv2; IdDt idv2;
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "testHistoryByForcedId"); patient.addIdentifier().setSystem("urn:system").setValue( "testHistoryByForcedId");
patient.addName().addFamily("Tester").addGiven("testHistoryByForcedId"); patient.addName().addFamily("Tester").addGiven("testHistoryByForcedId");
patient.setId("Patient/testHistoryByForcedId"); patient.setId("Patient/testHistoryByForcedId");
idv1 = ourPatientDao.create(patient).getId(); idv1 = ourPatientDao.create(patient).getId();
@ -658,13 +658,13 @@ public class FhirResourceDaoTest {
IdDt id1; IdDt id1;
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue("001");
id1 = ourPatientDao.create(patient).getId(); id1 = ourPatientDao.create(patient).getId();
} }
IdDt id2; IdDt id2;
{ {
Organization patient = new Organization(); Organization patient = new Organization();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
id2 = ourOrganizationDao.create(patient).getId(); id2 = ourOrganizationDao.create(patient).getId();
} }
@ -757,14 +757,14 @@ public class FhirResourceDaoTest {
IdDt id1; IdDt id1;
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addFamily("testSearchNameParam01Fam").addGiven("testSearchNameParam01Giv"); patient.addName().addFamily("testSearchNameParam01Fam").addGiven("testSearchNameParam01Giv");
ResourceMetadataKeyEnum.TITLE.put(patient, "P1TITLE"); ResourceMetadataKeyEnum.TITLE.put(patient, "P1TITLE");
id1 = ourPatientDao.create(patient).getId(); id1 = ourPatientDao.create(patient).getId();
} }
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue( "002");
patient.addName().addFamily("testSearchNameParam02Fam").addGiven("testSearchNameParam02Giv"); patient.addName().addFamily("testSearchNameParam02Fam").addGiven("testSearchNameParam02Giv");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
@ -804,12 +804,12 @@ public class FhirResourceDaoTest {
@Test @Test
public void testSearchNumberParam() { public void testSearchNumberParam() {
Encounter e1 = new Encounter(); Encounter e1 = new Encounter();
e1.addIdentifier("foo", "testSearchNumberParam01"); e1.addIdentifier().setSystem("foo").setValue( "testSearchNumberParam01");
e1.getLength().setSystem(BaseFhirDao.UCUM_NS).setCode("min").setValue(4.0 * 24 * 60); e1.getLength().setSystem(BaseFhirDao.UCUM_NS).setCode("min").setValue(4.0 * 24 * 60);
IdDt id1 = ourEncounterDao.create(e1).getId(); IdDt id1 = ourEncounterDao.create(e1).getId();
Encounter e2 = new Encounter(); Encounter e2 = new Encounter();
e2.addIdentifier("foo", "testSearchNumberParam02"); e2.addIdentifier().setSystem("foo").setValue( "testSearchNumberParam02");
e2.getLength().setSystem(BaseFhirDao.UCUM_NS).setCode("year").setValue(2.0); e2.getLength().setSystem(BaseFhirDao.UCUM_NS).setCode("year").setValue(2.0);
IdDt id2 = ourEncounterDao.create(e2).getId(); IdDt id2 = ourEncounterDao.create(e2).getId();
{ {
@ -831,13 +831,13 @@ public class FhirResourceDaoTest {
@Test @Test
public void testSearchResourceLinkWithChain() { public void testSearchResourceLinkWithChain() {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "testSearchResourceLinkWithChainXX"); patient.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithChainXX");
patient.addIdentifier("urn:system", "testSearchResourceLinkWithChain01"); patient.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithChain01");
IdDt patientId01 = ourPatientDao.create(patient).getId(); IdDt patientId01 = ourPatientDao.create(patient).getId();
Patient patient02 = new Patient(); Patient patient02 = new Patient();
patient02.addIdentifier("urn:system", "testSearchResourceLinkWithChainXX"); patient02.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithChainXX");
patient02.addIdentifier("urn:system", "testSearchResourceLinkWithChain02"); patient02.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithChain02");
IdDt patientId02 = ourPatientDao.create(patient02).getId(); IdDt patientId02 = ourPatientDao.create(patient02).getId();
Observation obs01 = new Observation(); Observation obs01 = new Observation();
@ -873,14 +873,14 @@ public class FhirResourceDaoTest {
public void testSearchResourceLinkWithTextLogicalId() { public void testSearchResourceLinkWithTextLogicalId() {
Patient patient = new Patient(); Patient patient = new Patient();
patient.setId("testSearchResourceLinkWithTextLogicalId01"); patient.setId("testSearchResourceLinkWithTextLogicalId01");
patient.addIdentifier("urn:system", "testSearchResourceLinkWithTextLogicalIdXX"); patient.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithTextLogicalIdXX");
patient.addIdentifier("urn:system", "testSearchResourceLinkWithTextLogicalId01"); patient.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithTextLogicalId01");
IdDt patientId01 = ourPatientDao.create(patient).getId(); IdDt patientId01 = ourPatientDao.create(patient).getId();
Patient patient02 = new Patient(); Patient patient02 = new Patient();
patient02.setId("testSearchResourceLinkWithTextLogicalId02"); patient02.setId("testSearchResourceLinkWithTextLogicalId02");
patient02.addIdentifier("urn:system", "testSearchResourceLinkWithTextLogicalIdXX"); patient02.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithTextLogicalIdXX");
patient02.addIdentifier("urn:system", "testSearchResourceLinkWithTextLogicalId02"); patient02.addIdentifier().setSystem("urn:system").setValue( "testSearchResourceLinkWithTextLogicalId02");
IdDt patientId02 = ourPatientDao.create(patient02).getId(); IdDt patientId02 = ourPatientDao.create(patient02).getId();
Observation obs01 = new Observation(); Observation obs01 = new Observation();
@ -929,7 +929,7 @@ public class FhirResourceDaoTest {
IdDt patientId01 = ourPatientDao.create(patient).getId(); IdDt patientId01 = ourPatientDao.create(patient).getId();
Location loc01 = new Location(); Location loc01 = new Location();
loc01.getName().setValue("testSearchResourceLinkWithChainWithMultipleTypes01"); loc01.getNameElement().setValue("testSearchResourceLinkWithChainWithMultipleTypes01");
IdDt locId01 = ourLocationDao.create(loc01).getId(); IdDt locId01 = ourLocationDao.create(loc01).getId();
Observation obs01 = new Observation(); Observation obs01 = new Observation();
@ -963,13 +963,13 @@ public class FhirResourceDaoTest {
public void testSearchStringParam() { public void testSearchStringParam() {
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addFamily("Tester_testSearchStringParam").addGiven("Joe"); patient.addName().addFamily("Tester_testSearchStringParam").addGiven("Joe");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue( "002");
patient.addName().addFamily("Tester_testSearchStringParam").addGiven("John"); patient.addName().addFamily("Tester_testSearchStringParam").addGiven("John");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
@ -991,7 +991,7 @@ public class FhirResourceDaoTest {
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.getLanguage().setValue("en_CA"); patient.getLanguage().setValue("en_CA");
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addFamily("testSearchLanguageParam").addGiven("Joe"); patient.addName().addFamily("testSearchLanguageParam").addGiven("Joe");
id1 = ourPatientDao.create(patient).getId(); id1 = ourPatientDao.create(patient).getId();
} }
@ -999,7 +999,7 @@ public class FhirResourceDaoTest {
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.getLanguage().setValue("en_US"); patient.getLanguage().setValue("en_US");
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue( "002");
patient.addName().addFamily("testSearchLanguageParam").addGiven("John"); patient.addName().addFamily("testSearchLanguageParam").addGiven("John");
id2 = ourPatientDao.create(patient).getId(); id2 = ourPatientDao.create(patient).getId();
} }
@ -1030,13 +1030,13 @@ public class FhirResourceDaoTest {
public void testSearchStringParamWithNonNormalized() { public void testSearchStringParamWithNonNormalized() {
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addGiven("testSearchStringParamWithNonNormalized_h\u00F6ra"); patient.addName().addGiven("testSearchStringParamWithNonNormalized_h\u00F6ra");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue( "002");
patient.addName().addGiven("testSearchStringParamWithNonNormalized_HORA"); patient.addName().addGiven("testSearchStringParamWithNonNormalized_HORA");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
@ -1063,7 +1063,7 @@ public class FhirResourceDaoTest {
ourPatientDao.create(patient); ourPatientDao.create(patient);
patient = new Patient(); patient = new Patient();
patient.addIdentifier("urn:system", "testSearchTokenParam002"); patient.addIdentifier().setSystem("urn:system").setValue( "testSearchTokenParam002");
patient.addName().addFamily("Tester").addGiven("testSearchTokenParam2"); patient.addName().addFamily("Tester").addGiven("testSearchTokenParam2");
ourPatientDao.create(patient); ourPatientDao.create(patient);
@ -1119,24 +1119,24 @@ public class FhirResourceDaoTest {
IdDt parentOrgId; IdDt parentOrgId;
{ {
Organization org = new Organization(); Organization org = new Organization();
org.getName().setValue("testSearchWithIncludes_O1Parent"); org.getNameElement().setValue("testSearchWithIncludes_O1Parent");
parentOrgId = ourOrganizationDao.create(org).getId(); parentOrgId = ourOrganizationDao.create(org).getId();
} }
{ {
Organization org = new Organization(); Organization org = new Organization();
org.getName().setValue("testSearchWithIncludes_O1"); org.getNameElement().setValue("testSearchWithIncludes_O1");
org.setPartOf(new ResourceReferenceDt(parentOrgId)); org.setPartOf(new ResourceReferenceDt(parentOrgId));
IdDt orgId = ourOrganizationDao.create(org).getId(); IdDt orgId = ourOrganizationDao.create(org).getId();
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addFamily("Tester_testSearchWithIncludes_P1").addGiven("Joe"); patient.addName().addFamily("Tester_testSearchWithIncludes_P1").addGiven("Joe");
patient.getManagingOrganization().setReference(orgId); patient.getManagingOrganization().setReference(orgId);
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue( "002");
patient.addName().addFamily("Tester_testSearchWithIncludes_P2").addGiven("John"); patient.addName().addFamily("Tester_testSearchWithIncludes_P2").addGiven("John");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
@ -1203,7 +1203,7 @@ public class FhirResourceDaoTest {
public void testStoreUtf8Characters() throws Exception { public void testStoreUtf8Characters() throws Exception {
Organization org = new Organization(); Organization org = new Organization();
org.setName("測試醫院"); org.setName("測試醫院");
org.addIdentifier("urn:system", "testStoreUtf8Characters_01"); org.addIdentifier().setSystem("urn:system").setValue( "testStoreUtf8Characters_01");
IdDt orgId = ourOrganizationDao.create(org).getId(); IdDt orgId = ourOrganizationDao.create(org).getId();
Organization returned = ourOrganizationDao.read(orgId); Organization returned = ourOrganizationDao.read(orgId);
@ -1221,19 +1221,19 @@ public class FhirResourceDaoTest {
{ {
Organization org = new Organization(); Organization org = new Organization();
org.setId("testSearchWithIncludesThatHaveTextId_id1"); org.setId("testSearchWithIncludesThatHaveTextId_id1");
org.getName().setValue("testSearchWithIncludesThatHaveTextId_O1"); org.getNameElement().setValue("testSearchWithIncludesThatHaveTextId_O1");
IdDt orgId = ourOrganizationDao.create(org).getId(); IdDt orgId = ourOrganizationDao.create(org).getId();
assertThat(orgId.getValue(), endsWith("Organization/testSearchWithIncludesThatHaveTextId_id1/_history/1")); assertThat(orgId.getValue(), endsWith("Organization/testSearchWithIncludesThatHaveTextId_id1/_history/1"));
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addFamily("Tester_testSearchWithIncludesThatHaveTextId_P1").addGiven("Joe"); patient.addName().addFamily("Tester_testSearchWithIncludesThatHaveTextId_P1").addGiven("Joe");
patient.getManagingOrganization().setReference(orgId); patient.getManagingOrganization().setReference(orgId);
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
{ {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "002"); patient.addIdentifier().setSystem("urn:system").setValue( "002");
patient.addName().addFamily("Tester_testSearchWithIncludesThatHaveTextId_P2").addGiven("John"); patient.addName().addFamily("Tester_testSearchWithIncludesThatHaveTextId_P2").addGiven("John");
ourPatientDao.create(patient); ourPatientDao.create(patient);
} }
@ -1272,23 +1272,23 @@ public class FhirResourceDaoTest {
@Test @Test
public void testSort() { public void testSort() {
Patient p = new Patient(); Patient p = new Patient();
p.addIdentifier("urn:system", "testSort001"); p.addIdentifier().setSystem("urn:system").setValue( "testSort001");
p.addName().addFamily("testSortF1").addGiven("testSortG1"); p.addName().addFamily("testSortF1").addGiven("testSortG1");
IdDt id1 = ourPatientDao.create(p).getId().toUnqualifiedVersionless(); IdDt id1 = ourPatientDao.create(p).getId().toUnqualifiedVersionless();
// Create out of order // Create out of order
p = new Patient(); p = new Patient();
p.addIdentifier("urn:system", "testSort001"); p.addIdentifier().setSystem("urn:system").setValue( "testSort001");
p.addName().addFamily("testSortF3").addGiven("testSortG3"); p.addName().addFamily("testSortF3").addGiven("testSortG3");
IdDt id3 = ourPatientDao.create(p).getId().toUnqualifiedVersionless(); IdDt id3 = ourPatientDao.create(p).getId().toUnqualifiedVersionless();
p = new Patient(); p = new Patient();
p.addIdentifier("urn:system", "testSort001"); p.addIdentifier().setSystem("urn:system").setValue( "testSort001");
p.addName().addFamily("testSortF2").addGiven("testSortG2"); p.addName().addFamily("testSortF2").addGiven("testSortG2");
IdDt id2 = ourPatientDao.create(p).getId().toUnqualifiedVersionless(); IdDt id2 = ourPatientDao.create(p).getId().toUnqualifiedVersionless();
p = new Patient(); p = new Patient();
p.addIdentifier("urn:system", "testSort001"); p.addIdentifier().setSystem("urn:system").setValue( "testSort001");
IdDt id4 = ourPatientDao.create(p).getId().toUnqualifiedVersionless(); IdDt id4 = ourPatientDao.create(p).getId().toUnqualifiedVersionless();
SearchParameterMap pm = new SearchParameterMap(); SearchParameterMap pm = new SearchParameterMap();
@ -1302,7 +1302,7 @@ public class FhirResourceDaoTest {
@Test @Test
public void testStoreUnversionedResources() { public void testStoreUnversionedResources() {
Organization o1 = new Organization(); Organization o1 = new Organization();
o1.getName().setValue("AAA"); o1.getNameElement().setValue("AAA");
IdDt o1id = ourOrganizationDao.create(o1).getId(); IdDt o1id = ourOrganizationDao.create(o1).getId();
assertTrue(o1id.hasVersionIdPart()); assertTrue(o1id.hasVersionIdPart());
@ -1323,7 +1323,7 @@ public class FhirResourceDaoTest {
Organization org = new Organization(); Organization org = new Organization();
String str = "testStringParamLong__lvdaoy843s89tll8gvs89l4s3gelrukveilufyebrew8r87bv4b77feli7fsl4lv3vb7rexloxe7olb48vov4o78ls7bvo7vb48o48l4bb7vbvx"; String str = "testStringParamLong__lvdaoy843s89tll8gvs89l4s3gelrukveilufyebrew8r87bv4b77feli7fsl4lv3vb7rexloxe7olb48vov4o78ls7bvo7vb48o48l4bb7vbvx";
str = str + str; str = str + str;
org.getName().setValue(str); org.getNameElement().setValue(str);
assertThat(str.length(), greaterThan(ResourceIndexedSearchParamString.MAX_LENGTH)); assertThat(str.length(), greaterThan(ResourceIndexedSearchParamString.MAX_LENGTH));
@ -1349,7 +1349,7 @@ public class FhirResourceDaoTest {
@Test @Test
public void testTagsWithCreateAndReadAndSearch() { public void testTagsWithCreateAndReadAndSearch() {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "testTagsWithCreateAndReadAndSearch"); patient.addIdentifier().setSystem("urn:system").setValue( "testTagsWithCreateAndReadAndSearch");
patient.addName().addFamily("Tester").addGiven("Joe"); patient.addName().addFamily("Tester").addGiven("Joe");
TagList tagList = new TagList(); TagList tagList = new TagList();
tagList.addTag(null, "Dog", "Puppies"); tagList.addTag(null, "Dog", "Puppies");
@ -1409,7 +1409,7 @@ public class FhirResourceDaoTest {
String longStr2 = RandomStringUtils.randomAlphanumeric(ResourceIndexedSearchParamString.MAX_LENGTH + 100); String longStr2 = RandomStringUtils.randomAlphanumeric(ResourceIndexedSearchParamString.MAX_LENGTH + 100);
Organization org = new Organization(); Organization org = new Organization();
org.getName().setValue("testTokenParamWhichIsTooLong"); org.getNameElement().setValue("testTokenParamWhichIsTooLong");
org.getType().addCoding().setSystem(longStr1).setCode(longStr2); org.getType().addCoding().setSystem(longStr1).setCode(longStr2);
String subStr1 = longStr1.substring(0, ResourceIndexedSearchParamString.MAX_LENGTH); String subStr1 = longStr1.substring(0, ResourceIndexedSearchParamString.MAX_LENGTH);
@ -1440,7 +1440,7 @@ public class FhirResourceDaoTest {
@Test @Test
public void testUpdateAndGetHistoryResource() throws InterruptedException { public void testUpdateAndGetHistoryResource() throws InterruptedException {
Patient patient = new Patient(); Patient patient = new Patient();
patient.addIdentifier("urn:system", "001"); patient.addIdentifier().setSystem("urn:system").setValue( "001");
patient.addName().addFamily("Tester").addGiven("Joe"); patient.addName().addFamily("Tester").addGiven("Joe");
MethodOutcome outcome = ourPatientDao.create(patient); MethodOutcome outcome = ourPatientDao.create(patient);
@ -1470,7 +1470,7 @@ public class FhirResourceDaoTest {
Patient retrieved2 = ourPatientDao.read(outcome.getId().toVersionless()); Patient retrieved2 = ourPatientDao.read(outcome.getId().toVersionless());
assertEquals("2", retrieved2.getId().getVersionIdPart()); assertEquals("2", retrieved2.getId().getVersionIdPart());
assertEquals("002", retrieved2.getIdentifierFirstRep().getValue().getValue()); assertEquals("002", retrieved2.getIdentifierFirstRep().getValue());
InstantDt published2 = (InstantDt) retrieved2.getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED); InstantDt published2 = (InstantDt) retrieved2.getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED);
InstantDt updated2 = (InstantDt) retrieved2.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED); InstantDt updated2 = (InstantDt) retrieved2.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED);
assertTrue(published2.before(now)); assertTrue(published2.before(now));
@ -1493,22 +1493,22 @@ public class FhirResourceDaoTest {
assertEquals(published, history.get(1).getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED)); assertEquals(published, history.get(1).getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED));
assertEquals(published, history.get(1).getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED)); assertEquals(published, history.get(1).getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED));
assertEquals(updated, history.get(1).getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED)); assertEquals(updated, history.get(1).getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("001", ((Patient) history.get(1)).getIdentifierFirstRep().getValue().getValue()); assertEquals("001", ((Patient) history.get(1)).getIdentifierFirstRep().getValue());
assertEquals(published2, history.get(0).getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED)); assertEquals(published2, history.get(0).getResourceMetadata().get(ResourceMetadataKeyEnum.PUBLISHED));
assertEquals(updated2, history.get(0).getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED)); assertEquals(updated2, history.get(0).getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("002", ((Patient) history.get(0)).getIdentifierFirstRep().getValue().getValue()); assertEquals("002", ((Patient) history.get(0)).getIdentifierFirstRep().getValue());
} }
@Test @Test
public void testUpdateMaintainsSearchParams() throws InterruptedException { public void testUpdateMaintainsSearchParams() throws InterruptedException {
Patient p1 = new Patient(); Patient p1 = new Patient();
p1.addIdentifier("urn:system", "testUpdateMaintainsSearchParamsAAA"); p1.addIdentifier().setSystem("urn:system").setValue( "testUpdateMaintainsSearchParamsAAA");
p1.addName().addFamily("Tester").addGiven("testUpdateMaintainsSearchParamsAAA"); p1.addName().addFamily("Tester").addGiven("testUpdateMaintainsSearchParamsAAA");
IdDt p1id = ourPatientDao.create(p1).getId(); IdDt p1id = ourPatientDao.create(p1).getId();
Patient p2 = new Patient(); Patient p2 = new Patient();
p2.addIdentifier("urn:system", "testUpdateMaintainsSearchParamsBBB"); p2.addIdentifier().setSystem("urn:system").setValue( "testUpdateMaintainsSearchParamsBBB");
p2.addName().addFamily("Tester").addGiven("testUpdateMaintainsSearchParamsBBB"); p2.addName().addFamily("Tester").addGiven("testUpdateMaintainsSearchParamsBBB");
ourPatientDao.create(p2).getId(); ourPatientDao.create(p2).getId();
@ -1539,12 +1539,12 @@ public class FhirResourceDaoTest {
@Test @Test
public void testUpdateRejectsInvalidTypes() throws InterruptedException { public void testUpdateRejectsInvalidTypes() throws InterruptedException {
Patient p1 = new Patient(); Patient p1 = new Patient();
p1.addIdentifier("urn:system", "testUpdateRejectsInvalidTypes"); p1.addIdentifier().setSystem("urn:system").setValue( "testUpdateRejectsInvalidTypes");
p1.addName().addFamily("Tester").addGiven("testUpdateRejectsInvalidTypes"); p1.addName().addFamily("Tester").addGiven("testUpdateRejectsInvalidTypes");
IdDt p1id = ourPatientDao.create(p1).getId(); IdDt p1id = ourPatientDao.create(p1).getId();
Organization p2 = new Organization(); Organization p2 = new Organization();
p2.getName().setValue("testUpdateRejectsInvalidTypes"); p2.getNameElement().setValue("testUpdateRejectsInvalidTypes");
try { try {
ourOrganizationDao.update(p2, new IdDt("Organization/" + p1id.getIdPart())); ourOrganizationDao.update(p2, new IdDt("Organization/" + p1id.getIdPart()));
fail(); fail();
@ -1564,14 +1564,14 @@ public class FhirResourceDaoTest {
@Test @Test
public void testUpdateRejectsIdWhichPointsToForcedId() throws InterruptedException { public void testUpdateRejectsIdWhichPointsToForcedId() throws InterruptedException {
Patient p1 = new Patient(); Patient p1 = new Patient();
p1.addIdentifier("urn:system", "testUpdateRejectsIdWhichPointsToForcedId01"); p1.addIdentifier().setSystem("urn:system").setValue("testUpdateRejectsIdWhichPointsToForcedId01");
p1.addName().addFamily("Tester").addGiven("testUpdateRejectsIdWhichPointsToForcedId01"); p1.addName().addFamily("Tester").addGiven("testUpdateRejectsIdWhichPointsToForcedId01");
p1.setId("ABABA"); p1.setId("ABABA");
IdDt p1id = ourPatientDao.create(p1).getId(); IdDt p1id = ourPatientDao.create(p1).getId();
assertEquals("ABABA", p1id.getIdPart()); assertEquals("ABABA", p1id.getIdPart());
Patient p2 = new Patient(); Patient p2 = new Patient();
p2.addIdentifier("urn:system", "testUpdateRejectsIdWhichPointsToForcedId02"); p2.addIdentifier().setSystem("urn:system").setValue( "testUpdateRejectsIdWhichPointsToForcedId02");
p2.addName().addFamily("Tester").addGiven("testUpdateRejectsIdWhichPointsToForcedId02"); p2.addName().addFamily("Tester").addGiven("testUpdateRejectsIdWhichPointsToForcedId02");
IdDt p2id = ourPatientDao.create(p2).getId(); IdDt p2id = ourPatientDao.create(p2).getId();
long p1longId = p2id.getIdPartAsLong() - 1; long p1longId = p2id.getIdPartAsLong() - 1;
@ -1595,12 +1595,12 @@ public class FhirResourceDaoTest {
@Test @Test
public void testReadForcedIdVersionHistory() throws InterruptedException { public void testReadForcedIdVersionHistory() throws InterruptedException {
Patient p1 = new Patient(); Patient p1 = new Patient();
p1.addIdentifier("urn:system", "testReadVorcedIdVersionHistory01"); p1.addIdentifier().setSystem("urn:system").setValue( "testReadVorcedIdVersionHistory01");
p1.setId("testReadVorcedIdVersionHistory"); p1.setId("testReadVorcedIdVersionHistory");
IdDt p1id = ourPatientDao.create(p1).getId(); IdDt p1id = ourPatientDao.create(p1).getId();
assertEquals("testReadVorcedIdVersionHistory", p1id.getIdPart()); assertEquals("testReadVorcedIdVersionHistory", p1id.getIdPart());
p1.addIdentifier("urn:system", "testReadVorcedIdVersionHistory02"); p1.addIdentifier().setSystem("urn:system").setValue( "testReadVorcedIdVersionHistory02");
IdDt p1idv2 = ourPatientDao.update(p1, p1id).getId(); IdDt p1idv2 = ourPatientDao.update(p1, p1id).getId();
assertEquals("testReadVorcedIdVersionHistory", p1idv2.getIdPart()); assertEquals("testReadVorcedIdVersionHistory", p1idv2.getIdPart());
@ -1643,7 +1643,7 @@ public class FhirResourceDaoTest {
ourOrganizationDao = ourCtx.getBean("myOrganizationDao", IFhirResourceDao.class); ourOrganizationDao = ourCtx.getBean("myOrganizationDao", IFhirResourceDao.class);
ourLocationDao = ourCtx.getBean("myLocationDao", IFhirResourceDao.class); ourLocationDao = ourCtx.getBean("myLocationDao", IFhirResourceDao.class);
ourEncounterDao = ourCtx.getBean("myEncounterDao", IFhirResourceDao.class); ourEncounterDao = ourCtx.getBean("myEncounterDao", IFhirResourceDao.class);
ourFhirCtx = new FhirContext(); ourFhirCtx = ourCtx.getBean(FhirContext.class);
} }
} }

View File

@ -14,6 +14,10 @@
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
</logger> </logger>
<logger name="ca.uhn.fhir.jpa.dao" additivity="false" level="debug">
<appender-ref ref="STDOUT" />
</logger>
<root level="info"> <root level="info">
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
</root> </root>

View File

@ -248,7 +248,7 @@ public class CompleteResourceProviderTest {
Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testCreateWithId01")).encodedJson().prettyPrint().execute(); Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testCreateWithId01")).encodedJson().prettyPrint().execute();
assertEquals(1, actual.size()); assertEquals(1, actual.size());
assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getResource().getId().getIdPart());
/* /*
* ensure that trying to create the same ID again fails appropriately * ensure that trying to create the same ID again fails appropriately
@ -262,7 +262,7 @@ public class CompleteResourceProviderTest {
Bundle history = ourClient.history(null, (String) null, null, null); Bundle history = ourClient.history(null, (String) null, null, null);
assertEquals("Expected[" + p1Id.getIdPart() + "] but was " + history.getEntries().get(0).getId(), p1Id.getIdPart(), history.getEntries().get(0).getId().getIdPart()); assertEquals("Expected[" + p1Id.getIdPart() + "] but was " + history.getEntries().get(0).getResource().getId(), p1Id.getIdPart(), history.getEntries().get(0).getResource().getId().getIdPart());
assertNotNull(history.getEntries().get(0).getResource()); assertNotNull(history.getEntries().get(0).getResource());
} }
@ -369,7 +369,7 @@ public class CompleteResourceProviderTest {
Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testSearchByIdentifier01")).encodedJson().prettyPrint().execute(); Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testSearchByIdentifier01")).encodedJson().prettyPrint().execute();
assertEquals(1, actual.size()); assertEquals(1, actual.size());
assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getResource().getId().getIdPart());
} }
@Test @Test
@ -382,7 +382,7 @@ public class CompleteResourceProviderTest {
Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode(null, "testSearchByIdentifierWithoutSystem01")).encodedJson().prettyPrint().execute(); Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode(null, "testSearchByIdentifierWithoutSystem01")).encodedJson().prettyPrint().execute();
assertEquals(1, actual.size()); assertEquals(1, actual.size());
assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getResource().getId().getIdPart());
} }
@ -408,7 +408,7 @@ public class CompleteResourceProviderTest {
.encodedJson().prettyPrint().execute(); .encodedJson().prettyPrint().execute();
//@formatter:on //@formatter:on
assertEquals(1, actual.size()); assertEquals(1, actual.size());
assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getResource().getId().getIdPart());
//@formatter:off //@formatter:off
actual = ourClient.search() actual = ourClient.search()
@ -417,7 +417,7 @@ public class CompleteResourceProviderTest {
.encodedJson().prettyPrint().execute(); .encodedJson().prettyPrint().execute();
//@formatter:on //@formatter:on
assertEquals(1, actual.size()); assertEquals(1, actual.size());
assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getResource().getId().getIdPart());
} }
@ -480,7 +480,7 @@ public class CompleteResourceProviderTest {
Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testUpdateWithClientSuppliedIdWhichDoesntExist")).encodedJson().prettyPrint().execute(); Bundle actual = ourClient.search().forResource(Patient.class).where(Patient.IDENTIFIER.exactly().systemAndCode("urn:system", "testUpdateWithClientSuppliedIdWhichDoesntExist")).encodedJson().prettyPrint().execute();
assertEquals(1, actual.size()); assertEquals(1, actual.size());
assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getId().getIdPart()); assertEquals(p1Id.getIdPart(), actual.getEntries().get(0).getResource().getId().getIdPart());
} }

View File

@ -0,0 +1,62 @@
package ca.uhn.fhir.narrative;
import static org.junit.Assert.*;
import org.junit.Test;
public class BaseThymeleafNarrativeGeneratorTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseThymeleafNarrativeGeneratorTest.class);
@Test
public void testTrimWhitespace() {
//@formatter:off
String input = "<div>\n" +
" <div class=\"hapiHeaderText\">\n" +
" \n" +
" joe \n" +
" john \n" +
" <b>BLOW </b>\n" +
" \n" +
"</div>\n" +
" <table class=\"hapiPropertyTable\">\n" +
" <tbody>\n" +
" <tr>\n" +
" <td>Identifier</td>\n" +
" <td>123456</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td>Address</td>\n" +
" <td>\n" +
" \n" +
" <span>123 Fake Street</span><br />\n" +
" \n" +
" \n" +
" <span>Unit 1</span><br />\n" +
" \n" +
" <span>Toronto</span>\n" +
" <span>ON</span>\n" +
" <span>Canada</span>\n" +
" </td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td>Date of birth</td>\n" +
" <td>\n" +
" <span>31 March 2014</span>\n" +
" </td>\n" +
" </tr>\n" +
" </tbody>\n" +
" </table>\n" +
"</div>";
//@formatter:on
String actual = BaseThymeleafNarrativeGenerator.cleanWhitespace(input);
String expected = "<div><div class=\"hapiHeaderText\"> joe john <b>BLOW </b></div><table class=\"hapiPropertyTable\"><tbody><tr><td>Identifier</td><td>123456</td></tr><tr><td>Address</td><td><span>123 Fake Street</span><br /><span>Unit 1</span><br /><span>Toronto</span><span>ON</span><span>Canada</span></td></tr><tr><td>Date of birth</td><td><span>31 March 2014</span></td></tr></tbody></table></div>";
ourLog.info(actual);
assertEquals(expected, actual);
}
}

View File

@ -0,0 +1,38 @@
package ca.uhn.fhir.narrative;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dev.resource.Practitioner;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt;
public class CustomThymeleafNarrativeGeneratorTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(CustomThymeleafNarrativeGeneratorTest.class);
private static FhirContext ourCtx = FhirContext.forDev();
@Test
public void testGenerator() {
CustomThymeleafNarrativeGenerator gen = new CustomThymeleafNarrativeGenerator("file:src/test/resources/narrative/customnarrative.properties");
ourCtx.setNarrativeGenerator(gen);
Practitioner p = new Practitioner();
p.addIdentifier().setSystem("sys").setValue("val1");
p.addIdentifier().setSystem("sys").setValue("val2");
p.addAddress().addLine("line1").addLine("line2");
p.getName().addFamily("fam1").addGiven("given");
NarrativeDt narrative = gen.generateNarrative(p);
String actual = narrative.getDiv().getValueAsString();
ourLog.info(actual);
assertThat(actual, containsString("<h1>Name</h1><div class=\"nameElement\"> given <b>FAM1 </b></div><h1>Address</h1><div><span>line1 </span><br /><span>line2 </span><br /></div></div>"));
}
}

File diff suppressed because one or more lines are too long

View File

@ -5,11 +5,15 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.io.StringReader;
import net.sf.json.JSON; import net.sf.json.JSON;
import net.sf.json.JSONSerializer; import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig; import net.sf.json.JsonConfig;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.custommonkey.xmlunit.Diff;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
@ -58,6 +62,70 @@ public class JsonParserTest {
} }
@Test
public void testParseMetadata() throws Exception {
//@formatter:off
String bundle = "{\n" +
" \"resourceType\" : \"Bundle\",\n" +
" \"base\" : \"http://foo/fhirBase1\",\n" +
" \"total\" : 1,\n" +
" \"link\": [{\n" +
" \"relation\" : \"self\",\n" +
" \"url\" : \"http://localhost:52788/Binary?_pretty=true\"\n" +
" }],\n" +
" \"entry\" : [{\n" +
" \"base\" : \"http://foo/fhirBase2\",\n" +
" \"status\" : \"match\",\n" +
" \"search\" : \"http://foo/Patient?identifier=value\",\n" +
" \"score\" : 0.123,\n" +
" \"resource\" : {\n" +
" \"resourceType\" : \"Patient\",\n" +
" \"id\" : \"1\",\n" +
" \"meta\" : {\n" +
" \"versionId\" : \"2\",\n" +
" \"lastUpdated\" : \"2001-02-22T11:22:33-05:00\"\n" +
" },\n" +
" \"birthDate\" : \"2012-01-02\"\n" +
" }\n" +
" }]\n" +
"}";
//@formatter:on
Bundle b = ourCtx.newJsonParser().parseBundle(bundle);
assertEquals(1, b.getEntries().size());
Patient pt = (Patient) b.getEntries().get(0).getResource();
assertEquals("http://foo/fhirBase2/Patient/1/_history/2", pt.getId().getValue());
assertEquals("2012-01-02", pt.getBirthDateElement().getValueAsString());
assertEquals("0.123", ResourceMetadataKeyEnum.ENTRY_SCORE.get(pt).getValueAsString());
assertEquals("match", ResourceMetadataKeyEnum.ENTRY_STATUS.get(pt).getCode());
assertEquals("http://foo/Patient?identifier=value", ResourceMetadataKeyEnum.LINK_SEARCH.get(pt));
assertEquals("2001-02-22T11:22:33-05:00", ResourceMetadataKeyEnum.UPDATED.get(pt).getValueAsString());
Bundle toBundle = new Bundle();
toBundle.getLinkBase().setValue("http://foo/fhirBase1");
toBundle.getTotalResults().setValue(1);
toBundle.getLinkSelf().setValue("http://localhost:52788/Binary?_pretty=true");
toBundle.addResource(pt, ourCtx, "http://foo/fhirBase1");
String reEncoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeBundleToString(toBundle);
JsonConfig cfg = new JsonConfig();
JSON expected = JSONSerializer.toJSON(bundle.trim(), cfg);
JSON actual = JSONSerializer.toJSON(reEncoded.trim(), cfg);
String exp = expected.toString().replace("\\r\\n", "\\n"); // .replace("&sect;", "§");
String act = actual.toString().replace("\\r\\n", "\\n");
ourLog.info("Expected: {}", exp);
ourLog.info("Actual : {}", act);
assertEquals(exp, act);
}
@Test @Test
public void testParsePatientInBundle() { public void testParsePatientInBundle() {
@ -217,10 +285,11 @@ public class JsonParserTest {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.addResource(res, ourCtx, "http://foo/base"); bundle.addResource(res, ourCtx, "http://foo/base");
String encoded = ourCtx.newJsonParser().encodeBundleToString(bundle); String actual = ourCtx.newJsonParser().encodeBundleToString(bundle);
ourLog.info(encoded); ourLog.info(actual);
assertEquals("{\"resourceType\":\"Bundle\",\"id\":null,\"entry\":[{\"deleted\":{\"type\":\"Patient\",\"resourceId\":\"111\",\"versionId\":\"222\",\"instant\":\"2011-01-01T12:12:22Z\"}}]", encoded); String expected = "{\"resourceType\":\"Bundle\",\"entry\":[{\"deleted\":{\"type\":\"Patient\",\"resourceId\":\"111\",\"versionId\":\"222\",\"instant\":\"2011-01-01T12:12:22Z\"}}]";
assertEquals(expected, actual);
} }

View File

@ -0,0 +1,24 @@
<div>
<!--
Normal Thymeleaf tags apply. Here, we loop through each of the
identifiers that the practitioner has, and create a DIV tag for
each one, with the text "Identifier: [value]"
-->
<div th:each="identifier : ${resource.identifier}" th:text="'Identifier: ' + ${identifier.value}"></div>
<!--
HAPI also defines a custom tag attribute, th:narrative="value",
which is used to render a datatype into more HTML. In the example
below, the value of ${resource.name} (which is the name property
of the Practitioner resource, a HumanName datatype instance)
is rendered, and its contents placed in a DIV tag. That DIV tag is
then given a .nameElement CSS style.
-->
<h1>Name</h1>
<div th:narrative="${resource.name}" class="nameElement"></div>
<h1>Address</h1>
<div th:narrative="${resource.addressFirstRep}"></div>
</div>

View File

@ -0,0 +1,16 @@
# Each resource to be defined has a pair or properties.
#
# The first (name.class) defines the class name of the
# resource to define a template for
#
# The second (name.narrative) defines the path/classpath to the
# template file.
# Format is file:/path/foo.html or classpath:/com/classpath/foo.html
#
practitioner.class=ca.uhn.fhir.model.dev.resource.Practitioner
practitioner.narrative=file:src/test/resources/narrative/Practitioner.html
# You may also override/define behaviour for datatypes
humanname.class=ca.uhn.fhir.model.dev.composite.HumanNameDt
humanname.narrative=classpath:ca/uhn/fhir/narrative/datatype/HumanNameDt.html

View File

@ -5,6 +5,7 @@ import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.resource.ValueSet; import ca.uhn.fhir.model.dstu.resource.ValueSet;
@ -12,10 +13,13 @@ public class FhirContextTest {
@Test @Test
public void testIncrementalScan() { public void testIncrementalScan() {
FhirContext ctx = new FhirContext(); FhirContext ctx = new FhirContext();
ctx.getResourceDefinition(ValueSet.class); RuntimeResourceDefinition vsDef = ctx.getResourceDefinition(ValueSet.class);
ctx.getResourceDefinition(Patient.class); RuntimeResourceDefinition ptDef = ctx.getResourceDefinition(Patient.class);
assertNotNull(ptDef);
RuntimeResourceDefinition vsDef2 = ctx.getResourceDefinition(ValueSet.class);
assertSame(vsDef, vsDef2);
} }
@Test @Test
@ -24,6 +28,11 @@ public class FhirContextTest {
assertEquals("Binary", def.getName()); assertEquals("Binary", def.getName());
} }
@Test(expected = IllegalArgumentException.class)
public void testGetResourceDefinitionFails() {
new FhirContext().getResourceDefinition(IResource.class);
}
@Test @Test
public void testUnknownVersion() { public void testUnknownVersion() {
try { try {

View File

@ -5,12 +5,14 @@ import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt; import ca.uhn.fhir.model.dstu.composite.NarrativeDt;
import ca.uhn.fhir.model.dstu.resource.Practitioner; import ca.uhn.fhir.model.dstu.resource.Practitioner;
public class CustomThymeleafNarrativeGeneratorTest { public class CustomThymeleafNarrativeGeneratorTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(CustomThymeleafNarrativeGeneratorTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(CustomThymeleafNarrativeGeneratorTest.class);
private static FhirContext ourCtx = FhirContext.forDstu1();
@Test @Test
public void testGenerator() { public void testGenerator() {

View File

@ -1,8 +1,6 @@
package ca.uhn.fhir.narrative; package ca.uhn.fhir.narrative;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.Date; import java.util.Date;
@ -12,7 +10,6 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
import ca.uhn.fhir.model.dstu.composite.CodeableConceptDt; import ca.uhn.fhir.model.dstu.composite.CodeableConceptDt;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt; import ca.uhn.fhir.model.dstu.composite.NarrativeDt;

View File

@ -23,6 +23,7 @@ import org.hamcrest.core.StringContains;
import org.hamcrest.text.StringContainsInOrder; import org.hamcrest.text.StringContainsInOrder;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.mockito.Matchers;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;

View File

@ -32,6 +32,7 @@ import org.hamcrest.core.StringContains;
import org.hamcrest.text.StringContainsInOrder; import org.hamcrest.text.StringContainsInOrder;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.mockito.Matchers;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
@ -323,6 +324,49 @@ public class XmlParserTest {
b.setPublished(pub); b.setPublished(pub);
Thread.sleep(2); Thread.sleep(2);
Patient p1 = new Patient();
p1.addName().addFamily("Family1");
p1.getId().setValue("1");
BundleEntry entry = b.addEntry();
entry.setResource(p1);
entry.getSummary().setValueAsString("this is the summary");
Patient p2 = new Patient();
p2.addName().addFamily("Family2");
p2.getId().setValue("2");
entry = b.addEntry();
entry.setLinkAlternate(new StringDt("http://foo/bar"));
entry.setLinkSearch(new StringDt("http://foo/bar/search"));
entry.setResource(p2);
BundleEntry deletedEntry = b.addEntry();
deletedEntry.setDeletedResourceId(new IdDt("Patient/3"));
deletedEntry.setDeleted(InstantDt.withCurrentTime());
String bundleString = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
ourLog.info(bundleString);
List<String> strings = new ArrayList<String>();
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>", "</Patient>", "<summary type=\"xhtml\">", "<div", "</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", "/>"));
assertThat(bundleString, StringContainsInOrder.stringContainsInOrder(strings));
assertThat(bundleString, not(containsString("at:by")));
}
@SuppressWarnings("deprecation")
@Test
public void testEncodeBundleOldIdForm() throws InterruptedException {
Bundle b = new Bundle();
b.getCategories().addTag("http://hl7.org/fhir/tag", "http://hl7.org/fhir/tag/message", "Message");
InstantDt pub = InstantDt.withCurrentTime();
b.setPublished(pub);
Thread.sleep(2);
Patient p1 = new Patient(); Patient p1 = new Patient();
p1.addName().addFamily("Family1"); p1.addName().addFamily("Family1");
BundleEntry entry = b.addEntry(); BundleEntry entry = b.addEntry();

View File

@ -86,7 +86,7 @@ public class IncludeTest {
Patient p = bundle.getResources(Patient.class).get(0); Patient p = bundle.getResources(Patient.class).get(0);
assertEquals(1, p.getName().size()); assertEquals(1, p.getName().size());
assertEquals("Hello", p.getId().getIdPart()); assertEquals("Hello", p.getId().getIdPart());
assertEquals("Patient.foo", p.getName().get(0).getFamilyFirstRep().getValue()); assertEquals("foo", p.getName().get(0).getFamilyFirstRep().getValue());
} }

View File

@ -88,7 +88,7 @@ public class TransactionWithBundleParamTest {
ourLog.info(responseContent); ourLog.info(responseContent);
Bundle bundle = new FhirContext().newXmlParser().parseBundle(responseContent); Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(3, bundle.size()); assertEquals(3, bundle.size());
BundleEntry entry0 = bundle.getEntries().get(0); BundleEntry entry0 = bundle.getEntries().get(0);

View File

@ -1,36 +0,0 @@
package ca.uhn.fhir.test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.valueset.AdministrativeGenderCodesEnum;
import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.util.FhirTerser;
public class FhirTerserTest {
@Test
public void testGetAllPopulatedChildElementsOfType() {
Patient p = new Patient();
p.setGender(AdministrativeGenderCodesEnum.M);
p.addIdentifier().setSystem("urn:foo");
p.addAddress().addLine("Line1");
p.addAddress().addLine("Line2");
p.addName().addFamily("Line3");
FhirTerser t = new FhirContext().newTerser();
List<StringDt> strings = t.getAllPopulatedChildElementsOfType(p, StringDt.class);
assertEquals(3, strings.size());
assertThat(strings, containsInAnyOrder(new StringDt("Line1"), new StringDt("Line2"), new StringDt("Line3")));
}
}

View File

@ -1,5 +1,6 @@
package ca.uhn.fhir.util; package ca.uhn.fhir.util;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.util.List; import java.util.List;
@ -7,11 +8,58 @@ import java.util.List;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.composite.QuantityDt;
import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt; import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu.resource.Observation; import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.valueset.AdministrativeGenderCodesEnum;
import ca.uhn.fhir.model.primitive.StringDt;
public class FhirTerserTest { public class FhirTerserTest {
private static FhirContext ourCtx = new FhirContext();
@Test
public void testGetAllPopulatedChildElementsOfType() {
Patient p = new Patient();
p.setGender(AdministrativeGenderCodesEnum.M);
p.addIdentifier().setSystem("urn:foo");
p.addAddress().addLine("Line1");
p.addAddress().addLine("Line2");
p.addName().addFamily("Line3");
FhirTerser t = new FhirContext().newTerser();
List<StringDt> strings = t.getAllPopulatedChildElementsOfType(p, StringDt.class);
assertEquals(3, strings.size());
assertThat(strings, containsInAnyOrder(new StringDt("Line1"), new StringDt("Line2"), new StringDt("Line3")));
}
@Test
public void testMultiValueTypes() {
Observation obs = new Observation();
obs.setValue(new QuantityDt(123L));
FhirTerser t = new FhirContext().newTerser();
// As string
{
List<Object> values = t.getValues(obs, "Observation.valueString");
assertEquals(0, values.size());
}
// As quantity
{
List<Object> values = t.getValues(obs, "Observation.valueQuantity");
assertEquals(1, values.size());
QuantityDt actual = (QuantityDt) values.get(0);
assertEquals("123", actual.getValue().getValueAsString());
}
}
@Test @Test
public void testTerser() { public void testTerser() {
@ -54,6 +102,4 @@ public class FhirTerserTest {
assertEquals("cid:patient@bundle", elems.get(0).getReference().getValue()); assertEquals("cid:patient@bundle", elems.get(0).getReference().getValue());
assertEquals("cid:device@bundle", elems.get(1).getReference().getValue()); assertEquals("cid:device@bundle", elems.get(1).getReference().getValue());
} }
private static FhirContext ourCtx = new FhirContext();
} }