This commit is contained in:
Grahame Grieve 2024-03-24 17:48:40 +11:00
commit 0e36d2a3c6
237 changed files with 10835 additions and 5673 deletions

2
.gitignore vendored
View File

@ -307,3 +307,5 @@ local.properties
/org.hl7.fhir.r4b.new /org.hl7.fhir.r4b.new
org.hl7.fhir.r5/var/lib/.fhir/packages/ org.hl7.fhir.r5/var/lib/.fhir/packages/
org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/DebugUtilities.java

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.core</artifactId> <artifactId>org.hl7.fhir.core</artifactId>
<version>6.2.14-SNAPSHOT</version> <version>6.3.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@ -318,8 +318,10 @@ public class ImplementationGuide40_50 {
tgt.setDescriptionElement(String40_50.convertStringToMarkdown(src.getDescriptionElement())); tgt.setDescriptionElement(String40_50.convertStringToMarkdown(src.getDescriptionElement()));
if (src.hasExampleBooleanType()) if (src.hasExampleBooleanType())
tgt.setIsExampleElement(Boolean40_50.convertBoolean(src.getExampleBooleanType())); tgt.setIsExampleElement(Boolean40_50.convertBoolean(src.getExampleBooleanType()));
if (src.hasExampleCanonicalType()) if (src.hasExampleCanonicalType()) {
tgt.setIsExample(true);
tgt.getProfile().add(Canonical40_50.convertCanonical(src.getExampleCanonicalType())); tgt.getProfile().add(Canonical40_50.convertCanonical(src.getExampleCanonicalType()));
}
if (src.hasGroupingId()) if (src.hasGroupingId())
tgt.setGroupingIdElement(Id40_50.convertId(src.getGroupingIdElement())); tgt.setGroupingIdElement(Id40_50.convertId(src.getGroupingIdElement()));
return tgt; return tgt;

View File

@ -300,7 +300,6 @@ public class NpmPackageVersionConverter {
} }
throw new Error("Unknown version " + currentVersion + " -> " + version); throw new Error("Unknown version " + currentVersion + " -> " + version);
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace();
errors.add("Error converting " + n + ": " + ex.getMessage()); errors.add("Error converting " + n + ": " + ex.getMessage());
return null; return null;
} }
@ -336,6 +335,7 @@ public class NpmPackageVersionConverter {
} }
} }
private void convertResourceR5(Resource res) { private void convertResourceR5(Resource res) {
if (res instanceof ImplementationGuide) { if (res instanceof ImplementationGuide) {
ImplementationGuide ig = (ImplementationGuide) res; ImplementationGuide ig = (ImplementationGuide) res;

View File

@ -0,0 +1,308 @@
package org.hl7.fhir.convertors.misc;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
import org.hl7.fhir.utilities.IniFile;
import org.hl7.fhir.utilities.VersionUtilities;
public class OIDAssigner {
public static void main(String[] args) throws Exception {
new OIDAssigner().execute(args[0], args[1], args[2]);
}
private void execute(String oidSource, String folder, String version) {
IniFile oids = new IniFile(oidSource);
File f = new File(folder);
process(oids, f, version);
}
private void process(IniFile oids, File folder, String version) {
for (File f : folder.listFiles()) {
if (f.isDirectory()) {
process(oids, f, version);
} else if (f.getName().endsWith(".xml")) {
processFile(oids, f, version, FhirFormat.XML);
} else if (f.getName().endsWith(".json")) {
processFile(oids, f, version, FhirFormat.JSON);
}
}
}
private void processFile(IniFile oids, File f, String version, FhirFormat fmt) {
switch (VersionUtilities.getMajMin(version)) {
case "1.0" : processFileR2(oids, f, fmt);
case "3.0" : processFileR3(oids, f, fmt);
case "4.0" : processFileR4(oids, f, fmt);
case "4.3" : processFileR4B(oids, f, fmt);
case "5.0" : processFileR5(oids, f, fmt);
}
}
private void processFileR2(IniFile oids, File f, FhirFormat fmt) {
org.hl7.fhir.dstu2.formats.IParser parser = fmt == FhirFormat.JSON ? new org.hl7.fhir.dstu2.formats.JsonParser() : new org.hl7.fhir.dstu2.formats.XmlParser();
try {
boolean save = false;
org.hl7.fhir.dstu2.model.Resource r = parser.parse(new FileInputStream(f));
if (r instanceof org.hl7.fhir.dstu2.model.ValueSet) {
org.hl7.fhir.dstu2.model.ValueSet vs = (org.hl7.fhir.dstu2.model.ValueSet) r;
boolean hasOid = isOid(vs.getIdentifier());
if (!hasOid) {
String oid = getOid(oids, "ValueSet", vs.getUrl());
vs.setIdentifier(new org.hl7.fhir.dstu2.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.dstu2.model.ConceptMap) {
org.hl7.fhir.dstu2.model.ConceptMap cm = (org.hl7.fhir.dstu2.model.ConceptMap) r;
boolean hasOid = isOid(cm.getIdentifier());
if (!hasOid) {
String oid = getOid(oids, "ConceptMap", cm.getUrl());
cm.setIdentifier(new org.hl7.fhir.dstu2.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.dstu2.model.StructureDefinition) {
org.hl7.fhir.dstu2.model.StructureDefinition sd = (org.hl7.fhir.dstu2.model.StructureDefinition) r;
boolean hasOid = false;
for (org.hl7.fhir.dstu2.model.Identifier id : sd.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, "StructureDefinition", sd.getUrl());
sd.getIdentifier().add(new org.hl7.fhir.dstu2.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (save) {
parser.setOutputStyle(org.hl7.fhir.dstu2.formats.IParser.OutputStyle.PRETTY).compose(new FileOutputStream(f), r);
}
} catch (Exception e) {
System.out.println("Erro processing "+f.getAbsolutePath()+": "+e.getMessage());
}
}
private void processFileR3(IniFile oids, File f, FhirFormat fmt) {
org.hl7.fhir.dstu3.formats.IParser parser = fmt == FhirFormat.JSON ? new org.hl7.fhir.dstu3.formats.JsonParser() : new org.hl7.fhir.dstu3.formats.XmlParser();
try {
boolean save = false;
org.hl7.fhir.dstu3.model.Resource r = parser.parse(new FileInputStream(f));
if (r instanceof org.hl7.fhir.dstu3.model.CodeSystem) {
org.hl7.fhir.dstu3.model.CodeSystem cs = (org.hl7.fhir.dstu3.model.CodeSystem) r;
boolean hasOid = isOid(cs.getIdentifier());
if (!hasOid) {
String oid = getOid(oids, "CodeSystem", cs.getUrl());
cs.setIdentifier(new org.hl7.fhir.dstu3.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.dstu3.model.ValueSet) {
org.hl7.fhir.dstu3.model.ValueSet vs = (org.hl7.fhir.dstu3.model.ValueSet) r;
boolean hasOid = false;
for (org.hl7.fhir.dstu3.model.Identifier id : vs.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, "ValueSet", vs.getUrl());
vs.getIdentifier().add(new org.hl7.fhir.dstu3.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.dstu3.model.ConceptMap) {
org.hl7.fhir.dstu3.model.ConceptMap cm = (org.hl7.fhir.dstu3.model.ConceptMap) r;
boolean hasOid = isOid(cm.getIdentifier());
if (!hasOid) {
String oid = getOid(oids, "ConceptMap", cm.getUrl());
cm.setIdentifier(new org.hl7.fhir.dstu3.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.dstu3.model.StructureDefinition) {
org.hl7.fhir.dstu3.model.StructureDefinition sd = (org.hl7.fhir.dstu3.model.StructureDefinition) r;
boolean hasOid = false;
for (org.hl7.fhir.dstu3.model.Identifier id : sd.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, "StructureDefinition", sd.getUrl());
sd.getIdentifier().add(new org.hl7.fhir.dstu3.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (save) {
parser.setOutputStyle(org.hl7.fhir.dstu3.formats.IParser.OutputStyle.PRETTY).compose(new FileOutputStream(f), r);
}
} catch (Exception e) {
System.out.println("Erro processing "+f.getAbsolutePath()+": "+e.getMessage());
}
}
private void processFileR4(IniFile oids, File f, FhirFormat fmt) {
org.hl7.fhir.r4.formats.IParser parser = fmt == FhirFormat.JSON ? new org.hl7.fhir.r4.formats.JsonParser() : new org.hl7.fhir.r4.formats.XmlParser();
try {
boolean save = false;
org.hl7.fhir.r4.model.Resource r = parser.parse(new FileInputStream(f));
if (r instanceof org.hl7.fhir.r4.model.CodeSystem) {
org.hl7.fhir.r4.model.CodeSystem cs = (org.hl7.fhir.r4.model.CodeSystem) r;
boolean hasOid = false;
for (org.hl7.fhir.r4.model.Identifier id : cs.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, "CodeSystem", cs.getUrl());
cs.getIdentifier().add(new org.hl7.fhir.r4.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.r4.model.ValueSet) {
org.hl7.fhir.r4.model.ValueSet vs = (org.hl7.fhir.r4.model.ValueSet) r;
boolean hasOid = false;
for (org.hl7.fhir.r4.model.Identifier id : vs.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, "ValueSet", vs.getUrl());
vs.getIdentifier().add(new org.hl7.fhir.r4.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.r4.model.ConceptMap) {
org.hl7.fhir.r4.model.ConceptMap cm = (org.hl7.fhir.r4.model.ConceptMap) r;
boolean hasOid = isOid(cm.getIdentifier());
if (!hasOid) {
String oid = getOid(oids, "ConceptMap", cm.getUrl());
cm.setIdentifier(new org.hl7.fhir.r4.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (r instanceof org.hl7.fhir.r4.model.StructureDefinition) {
org.hl7.fhir.r4.model.StructureDefinition sd = (org.hl7.fhir.r4.model.StructureDefinition) r;
boolean hasOid = false;
for (org.hl7.fhir.r4.model.Identifier id : sd.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, "StructureDefinition", sd.getUrl());
sd.getIdentifier().add(new org.hl7.fhir.r4.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (save) {
parser.setOutputStyle(org.hl7.fhir.r4.formats.IParser.OutputStyle.PRETTY).compose(new FileOutputStream(f), r);
}
} catch (Exception e) {
System.out.println("Erro processing "+f.getAbsolutePath()+": "+e.getMessage());
}
}
private void processFileR4B(IniFile oids, File f, FhirFormat fmt) {
org.hl7.fhir.r4b.formats.IParser parser = fmt == FhirFormat.JSON ? new org.hl7.fhir.r4b.formats.JsonParser() : new org.hl7.fhir.r4b.formats.XmlParser();
try {
boolean save = false;
org.hl7.fhir.r4b.model.Resource r = parser.parse(new FileInputStream(f));
if (r instanceof org.hl7.fhir.r4b.model.CanonicalResource) {
org.hl7.fhir.r4b.model.CanonicalResource cs = (org.hl7.fhir.r4b.model.CanonicalResource) r;
boolean hasOid = false;
for (org.hl7.fhir.r4b.model.Identifier id : cs.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, r.fhirType(), cs.getUrl());
cs.getIdentifier().add(new org.hl7.fhir.r4b.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (save) {
parser.setOutputStyle(org.hl7.fhir.r4b.formats.IParser.OutputStyle.PRETTY).compose(new FileOutputStream(f), r);
}
} catch (Exception e) {
System.out.println("Erro processing "+f.getAbsolutePath()+": "+e.getMessage());
}
}
private void processFileR5(IniFile oids, File f, FhirFormat fmt) {
org.hl7.fhir.r5.formats.IParser parser = fmt == FhirFormat.JSON ? new org.hl7.fhir.r5.formats.JsonParser() : new org.hl7.fhir.r5.formats.XmlParser();
try {
boolean save = false;
org.hl7.fhir.r5.model.Resource r = parser.parse(new FileInputStream(f));
if (r instanceof org.hl7.fhir.r5.model.CanonicalResource) {
org.hl7.fhir.r5.model.CanonicalResource cs = (org.hl7.fhir.r5.model.CanonicalResource) r;
boolean hasOid = false;
for (org.hl7.fhir.r5.model.Identifier id : cs.getIdentifier()) {
if (isOid(id)) {
hasOid = true;
}
}
if (!hasOid) {
String oid = getOid(oids, r.fhirType(), cs.getUrl());
cs.getIdentifier().add(new org.hl7.fhir.r5.model.Identifier().setSystem("urn:ietf:rfc:3986").setValue("urn:oid:"+oid));
save = true;
}
}
if (save) {
parser.setOutputStyle(org.hl7.fhir.r5.formats.IParser.OutputStyle.PRETTY).compose(new FileOutputStream(f), r);
}
} catch (Exception e) {
System.out.println("Erro processing "+f.getAbsolutePath()+": "+e.getMessage());
}
}
private boolean isOid(org.hl7.fhir.dstu2.model.Identifier id) {
return "urn:ietf:rfc:3986".equals(id.getSystem()) && id.hasValue() && id.getValue().startsWith("urn:oid:");
}
private boolean isOid(org.hl7.fhir.dstu3.model.Identifier id) {
return "urn:ietf:rfc:3986".equals(id.getSystem()) && id.hasValue() && id.getValue().startsWith("urn:oid:");
}
private boolean isOid(org.hl7.fhir.r4.model.Identifier id) {
return "urn:ietf:rfc:3986".equals(id.getSystem()) && id.hasValue() && id.getValue().startsWith("urn:oid:");
}
private boolean isOid(org.hl7.fhir.r4b.model.Identifier id) {
return "urn:ietf:rfc:3986".equals(id.getSystem()) && id.hasValue() && id.getValue().startsWith("urn:oid:");
}
private boolean isOid(org.hl7.fhir.r5.model.Identifier id) {
return "urn:ietf:rfc:3986".equals(id.getSystem()) && id.hasValue() && id.getValue().startsWith("urn:oid:");
}
private String getOid(IniFile oids, String rt, String url) {
String root = oids.getStringProperty("Roots", rt);
if (root == null) {
throw new Error("no OID.ini entry for "+rt);
}
String oid = oids.getStringProperty(rt, url);
if (oid != null) {
return oid;
}
int key = oids.getIntegerProperty("Key", rt);
key++;
oid = root+"."+key;
oids.setIntegerProperty("Key", rt, key, null);
oids.setStringProperty(rt, url, oid, null);
oids.save();
return oid;
}
}

View File

@ -118,6 +118,13 @@ public class TerminologyClientR2 implements ITerminologyClient {
return (Parameters) VersionConvertorFactory_10_50.convertResource(p2); return (Parameters) VersionConvertorFactory_10_50.convertResource(p2);
} }
@Override
public Parameters subsumes(Parameters pin) throws FHIRException {
org.hl7.fhir.dstu2.model.Parameters p2 = (org.hl7.fhir.dstu2.model.Parameters) VersionConvertorFactory_10_50.convertResource(pin);
p2 = client.operateType(org.hl7.fhir.dstu2.model.ValueSet.class, "subsumes", p2);
return (Parameters) VersionConvertorFactory_10_50.convertResource(p2);
}
@Override @Override
public Parameters validateVS(Parameters pin) throws FHIRException { public Parameters validateVS(Parameters pin) throws FHIRException {
org.hl7.fhir.dstu2.model.Parameters p2 = (org.hl7.fhir.dstu2.model.Parameters) VersionConvertorFactory_10_50.convertResource(pin); org.hl7.fhir.dstu2.model.Parameters p2 = (org.hl7.fhir.dstu2.model.Parameters) VersionConvertorFactory_10_50.convertResource(pin);
@ -238,4 +245,5 @@ public class TerminologyClientR2 implements ITerminologyClient {
org.hl7.fhir.dstu2.model.Bundle result = client.search(type, criteria); org.hl7.fhir.dstu2.model.Bundle result = client.search(type, criteria);
return result == null ? null : (Bundle) VersionConvertorFactory_10_50.convertResource(result); return result == null ? null : (Bundle) VersionConvertorFactory_10_50.convertResource(result);
} }
} }

View File

@ -242,4 +242,11 @@ public class TerminologyClientR3 implements ITerminologyClient {
} }
@Override
public Parameters subsumes(Parameters pin) throws FHIRException {
org.hl7.fhir.dstu3.model.Parameters p2 = (org.hl7.fhir.dstu3.model.Parameters) VersionConvertorFactory_30_50.convertResource(pin);
p2 = client.operateType(org.hl7.fhir.dstu3.model.CodeSystem.class, "subsumes", p2);
return (Parameters) VersionConvertorFactory_30_50.convertResource(p2);
}
} }

View File

@ -111,6 +111,25 @@ public class TerminologyClientR4 implements ITerminologyClient {
} }
} }
@Override
public Parameters subsumes(Parameters pin) throws FHIRException {
try {
org.hl7.fhir.r4.model.Parameters p2 = (org.hl7.fhir.r4.model.Parameters) VersionConvertorFactory_40_50.convertResource(pin);
p2 = client.operateType(org.hl7.fhir.r4.model.CodeSystem.class, "subsumes", p2);
return (Parameters) VersionConvertorFactory_40_50.convertResource(p2);
} catch (EFhirClientException e) {
if (e.getServerErrors().size() == 1) {
OperationOutcome op = (OperationOutcome) VersionConvertorFactory_40_50.convertResource(e.getServerErrors().get(0));
throw new org.hl7.fhir.r5.utils.client.EFhirClientException(e.getMessage(), op, e);
} else {
throw new org.hl7.fhir.r5.utils.client.EFhirClientException(e.getMessage(), e);
}
} catch (IOException e) {
throw new FHIRException(e);
}
}
@Override @Override
public Parameters validateVS(Parameters pin) throws FHIRException { public Parameters validateVS(Parameters pin) throws FHIRException {
try { try {
@ -250,5 +269,4 @@ public class TerminologyClientR4 implements ITerminologyClient {
return result == null ? null : (Bundle) VersionConvertorFactory_40_50.convertResource(result); return result == null ? null : (Bundle) VersionConvertorFactory_40_50.convertResource(result);
} }
} }

View File

@ -66,14 +66,14 @@ class Convertor_Factory_40_50Test {
StructureMapUtilities smu5 = new StructureMapUtilities(context, mock(org.hl7.fhir.r5.utils.structuremap.ITransformerServices.class)); StructureMapUtilities smu5 = new StructureMapUtilities(context, mock(org.hl7.fhir.r5.utils.structuremap.ITransformerServices.class));
org.hl7.fhir.r5.model.StructureMap mapR5 = smu5.parse(CONTENT, "map"); org.hl7.fhir.r5.model.StructureMap mapR5 = smu5.parse(CONTENT, "map");
assertEquals("tgt", mapR5.getGroup().get(0).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueIdType().getValue()); assertEquals("tgt", mapR5.getGroup().get(0).getRule().get(0).getTarget().get(0).getContext());
assertEquals("item.answer.valueString", mapR5.getGroup().get(1).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueStringType().getValue()); assertEquals("item.answer.valueString", mapR5.getGroup().get(1).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueStringType().getValue());
assertEquals("item", mapR5.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(0).getValueIdType().getValueAsString()); assertEquals("item", mapR5.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(0).getValueIdType().getValueAsString());
assertEquals("patient", mapR5.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(1).getValueIdType().getValueAsString()); assertEquals("patient", mapR5.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(1).getValueIdType().getValueAsString());
org.hl7.fhir.r4.model.StructureMap mapR4 = (org.hl7.fhir.r4.model.StructureMap) VersionConvertorFactory_40_50.convertResource(mapR5); org.hl7.fhir.r4.model.StructureMap mapR4 = (org.hl7.fhir.r4.model.StructureMap) VersionConvertorFactory_40_50.convertResource(mapR5);
assertEquals("tgt", mapR4.getGroup().get(0).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueIdType().getValue()); assertEquals("tgt", mapR4.getGroup().get(0).getRule().get(0).getTarget().get(0).getContext());
assertEquals("item.answer.valueString", mapR4.getGroup().get(1).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueStringType().getValue()); assertEquals("item.answer.valueString", mapR4.getGroup().get(1).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueStringType().getValue());
assertEquals("item", mapR4.getGroup().get(0).getRule().get(0).getDependent().get(0).getVariable().get(0).getValueAsString()); assertEquals("item", mapR4.getGroup().get(0).getRule().get(0).getDependent().get(0).getVariable().get(0).getValueAsString());
assertEquals("patient", mapR4.getGroup().get(0).getRule().get(0).getDependent().get(0).getVariable().get(1).getValueAsString()); assertEquals("patient", mapR4.getGroup().get(0).getRule().get(0).getDependent().get(0).getVariable().get(1).getValueAsString());
@ -87,7 +87,7 @@ class Convertor_Factory_40_50Test {
StructureMap mapR5Back = (StructureMap) VersionConvertorFactory_40_50.convertResource(mapR4); StructureMap mapR5Back = (StructureMap) VersionConvertorFactory_40_50.convertResource(mapR4);
assertEquals("tgt", mapR5Back.getGroup().get(0).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueIdType().getValue()); assertEquals("tgt", mapR5Back.getGroup().get(0).getRule().get(0).getTarget().get(0).getContext());
assertEquals("item.answer.valueString", mapR5Back.getGroup().get(1).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueStringType().getValue()); assertEquals("item.answer.valueString", mapR5Back.getGroup().get(1).getRule().get(0).getTarget().get(0).getParameter().get(0).getValueStringType().getValue());
assertEquals("item", mapR5Back.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(0).getValueIdType().getValueAsString()); assertEquals("item", mapR5Back.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(0).getValueIdType().getValueAsString());
assertEquals("patient", mapR5Back.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(1).getValueIdType().getValueAsString()); assertEquals("patient", mapR5Back.getGroup().get(0).getRule().get(0).getDependent().get(0).getParameter().get(1).getValueIdType().getValueAsString());

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.core</artifactId> <artifactId>org.hl7.fhir.core</artifactId>
<version>6.2.14-SNAPSHOT</version> <version>6.3.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@ -70,6 +70,7 @@ import org.hl7.fhir.exceptions.DefinitionException;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -1281,7 +1282,7 @@ public class ProfileUtilities {
public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder,
boolean inlineGraphics, boolean full, String corePath, Set<String> outputTracker) boolean inlineGraphics, boolean full, String corePath, Set<String> outputTracker)
throws IOException, FHIRException { throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics);
TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML);
boolean deep = false; boolean deep = false;
@ -1566,7 +1567,7 @@ public class ProfileUtilities {
boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, Set<String> outputTracker) boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, Set<String> outputTracker)
throws IOException, FHIRException { throws IOException, FHIRException {
assert (diff != snapshot);// check it's ok to get rid of one of these assert (diff != snapshot);// check it's ok to get rid of one of these
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics);
TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), false, TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), false,
TableGenerationMode.XML); TableGenerationMode.XML);
List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement();

View File

@ -87,7 +87,7 @@ public class ResourceAddress {
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) { public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) {
return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "/" + opName); return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "$" + opName);
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName, public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName,

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.core</artifactId> <artifactId>org.hl7.fhir.core</artifactId>
<version>6.2.14-SNAPSHOT</version> <version>6.3.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@ -71,6 +71,7 @@ import org.hl7.fhir.exceptions.DefinitionException;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -1283,7 +1284,7 @@ public class ProfileUtilities {
public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder,
boolean inlineGraphics, boolean full, String corePath, Set<String> outputTracker) boolean inlineGraphics, boolean full, String corePath, Set<String> outputTracker)
throws IOException, FHIRException { throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics);
TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML);
boolean deep = false; boolean deep = false;
@ -1565,7 +1566,7 @@ public class ProfileUtilities {
boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, boolean logicalModel, boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, boolean logicalModel,
Set<String> outputTracker) throws IOException, FHIRException { Set<String> outputTracker) throws IOException, FHIRException {
assert (diff != snapshot);// check it's ok to get rid of one of these assert (diff != snapshot);// check it's ok to get rid of one of these
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics);
TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), false, TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), false,
TableGenerationMode.XML); TableGenerationMode.XML);
List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement();

View File

@ -87,7 +87,7 @@ public class ResourceAddress {
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) { public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) {
return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "/" + opName); return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "$" + opName);
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName, public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName,

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.core</artifactId> <artifactId>org.hl7.fhir.core</artifactId>
<version>6.2.14-SNAPSHOT</version> <version>6.3.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@ -96,6 +96,7 @@ import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.exceptions.FHIRFormatError;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.Source; import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
@ -1620,8 +1621,7 @@ public class ProfileUtilities extends TranslatingUtilities {
} }
public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, String imagePath, Set<String> outputTracker) throws IOException, FHIRException { public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, String imagePath, Set<String> outputTracker) throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics);
gen.setTranslator(getTranslator());
TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML);
boolean deep = false; boolean deep = false;
@ -1989,8 +1989,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateTable(String defFile, StructureDefinition profile, boolean diff, String imageFolder, boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, String imagePath, boolean logicalModel, boolean allInvariants, Set<String> outputTracker) throws IOException, FHIRException { public XhtmlNode generateTable(String defFile, StructureDefinition profile, boolean diff, String imageFolder, boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, String imagePath, boolean logicalModel, boolean allInvariants, Set<String> outputTracker) throws IOException, FHIRException {
assert(diff != snapshot);// check it's ok to get rid of one of these assert(diff != snapshot);// check it's ok to get rid of one of these
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics);
gen.setTranslator(getTranslator());
TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false, TableGenerationMode.XML); TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false, TableGenerationMode.XML);
List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement();
List<StructureDefinition> profiles = new ArrayList<StructureDefinition>(); List<StructureDefinition> profiles = new ArrayList<StructureDefinition>();
@ -2005,8 +2004,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateGrid(String defFile, StructureDefinition profile, String imageFolder, boolean inlineGraphics, String profileBaseFileName, String corePath, String imagePath, Set<String> outputTracker) throws IOException, FHIRException { public XhtmlNode generateGrid(String defFile, StructureDefinition profile, String imageFolder, boolean inlineGraphics, String profileBaseFileName, String corePath, String imagePath, Set<String> outputTracker) throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics);
gen.setTranslator(getTranslator());
TableModel model = gen.initGridTable(corePath, profile.getId()); TableModel model = gen.initGridTable(corePath, profile.getId());
List<ElementDefinition> list = profile.getSnapshot().getElement(); List<ElementDefinition> list = profile.getSnapshot().getElement();
List<StructureDefinition> profiles = new ArrayList<StructureDefinition>(); List<StructureDefinition> profiles = new ArrayList<StructureDefinition>();
@ -3482,8 +3480,7 @@ public class ProfileUtilities extends TranslatingUtilities {
} }
public XhtmlNode generateSpanningTable(StructureDefinition profile, String imageFolder, boolean onlyConstraints, String constraintPrefix, Set<String> outputTracker) throws IOException, FHIRException { public XhtmlNode generateSpanningTable(StructureDefinition profile, String imageFolder, boolean onlyConstraints, String constraintPrefix, Set<String> outputTracker) throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, false);
gen.setTranslator(getTranslator());
TableModel model = initSpanningTable(gen, "", false, profile.getId()); TableModel model = initSpanningTable(gen, "", false, profile.getId());
Set<String> processed = new HashSet<String>(); Set<String> processed = new HashSet<String>();
SpanEntry span = buildSpanningTable("(focus)", "", profile, processed, onlyConstraints, constraintPrefix); SpanEntry span = buildSpanningTable("(focus)", "", profile, processed, onlyConstraints, constraintPrefix);

View File

@ -85,13 +85,13 @@ public class ResourceUtilities {
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();
for (OperationOutcomeIssueComponent t : error.getIssue()) for (OperationOutcomeIssueComponent t : error.getIssue())
if (t.getSeverity() == IssueSeverity.ERROR) if (t.getSeverity() == IssueSeverity.ERROR)
b.append("Error:" +gen(t.getDetails())+"\r\n"); b.append("Error: " +gen(t.getDetails())+"\r\n");
else if (t.getSeverity() == IssueSeverity.FATAL) else if (t.getSeverity() == IssueSeverity.FATAL)
b.append("Fatal:" +gen(t.getDetails())+"\r\n"); b.append("Fatal: " +gen(t.getDetails())+"\r\n");
else if (t.getSeverity() == IssueSeverity.WARNING) else if (t.getSeverity() == IssueSeverity.WARNING)
b.append("Warning:" +gen(t.getDetails())+"\r\n"); b.append("Warning: " +gen(t.getDetails())+"\r\n");
else if (t.getSeverity() == IssueSeverity.INFORMATION) else if (t.getSeverity() == IssueSeverity.INFORMATION)
b.append("Information:" +gen(t.getDetails())+"\r\n"); b.append("Information: " +gen(t.getDetails())+"\r\n");
return b.toString(); return b.toString();
} }

View File

@ -93,7 +93,7 @@ public class ResourceAddress {
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) { public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) {
return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) +"/"+opName); return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) +"$"+opName);
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName, Map<String,String> parameters) { public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName, Map<String,String> parameters) {

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.core</artifactId> <artifactId>org.hl7.fhir.core</artifactId>
<version>6.2.14-SNAPSHOT</version> <version>6.3.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@ -103,6 +103,7 @@ import org.hl7.fhir.utilities.FhirPublication;
import org.hl7.fhir.utilities.TerminologyServiceOptions; import org.hl7.fhir.utilities.TerminologyServiceOptions;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.VersionUtilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.Source; import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
@ -2386,8 +2387,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder,
boolean inlineGraphics, boolean full, String corePath, String imagePath, Set<String> outputTracker) boolean inlineGraphics, boolean full, String corePath, String imagePath, Set<String> outputTracker)
throws IOException, FHIRException { throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics, true);
gen.setTranslator(getTranslator());
TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML);
boolean deep = false; boolean deep = false;
@ -2792,8 +2792,7 @@ public class ProfileUtilities extends TranslatingUtilities {
boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, String imagePath, boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, String imagePath,
boolean logicalModel, boolean allInvariants, Set<String> outputTracker) throws IOException, FHIRException { boolean logicalModel, boolean allInvariants, Set<String> outputTracker) throws IOException, FHIRException {
assert (diff != snapshot);// check it's ok to get rid of one of these assert (diff != snapshot);// check it's ok to get rid of one of these
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics, true);
gen.setTranslator(getTranslator());
TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), false, TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), false,
TableGenerationMode.XML); TableGenerationMode.XML);
List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement();
@ -2817,8 +2816,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateGrid(String defFile, StructureDefinition profile, String imageFolder, boolean inlineGraphics, public XhtmlNode generateGrid(String defFile, StructureDefinition profile, String imageFolder, boolean inlineGraphics,
String profileBaseFileName, String corePath, String imagePath, Set<String> outputTracker) String profileBaseFileName, String corePath, String imagePath, Set<String> outputTracker)
throws IOException, FHIRException { throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics, true);
gen.setTranslator(getTranslator());
TableModel model = gen.initGridTable(corePath, profile.getId()); TableModel model = gen.initGridTable(corePath, profile.getId());
List<ElementDefinition> list = profile.getSnapshot().getElement(); List<ElementDefinition> list = profile.getSnapshot().getElement();
List<StructureDefinition> profiles = new ArrayList<StructureDefinition>(); List<StructureDefinition> profiles = new ArrayList<StructureDefinition>();
@ -4969,8 +4967,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateSpanningTable(StructureDefinition profile, String imageFolder, boolean onlyConstraints, public XhtmlNode generateSpanningTable(StructureDefinition profile, String imageFolder, boolean onlyConstraints,
String constraintPrefix, Set<String> outputTracker) throws IOException, FHIRException { String constraintPrefix, Set<String> outputTracker) throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, false, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, false, true);
gen.setTranslator(getTranslator());
TableModel model = initSpanningTable(gen, "", false, profile.getId()); TableModel model = initSpanningTable(gen, "", false, profile.getId());
Set<String> processed = new HashSet<String>(); Set<String> processed = new HashSet<String>();
SpanEntry span = buildSpanningTable("(focus)", "", profile, processed, onlyConstraints, constraintPrefix); SpanEntry span = buildSpanningTable("(focus)", "", profile, processed, onlyConstraints, constraintPrefix);

View File

@ -81,13 +81,13 @@ public class ResourceUtilities {
if (first) first = false; else b.append("\r\n"); if (first) first = false; else b.append("\r\n");
String txt = t.hasDiagnostics() ? t.getDiagnostics() : gen(t.getDetails()); String txt = t.hasDiagnostics() ? t.getDiagnostics() : gen(t.getDetails());
if (t.getSeverity() == IssueSeverity.ERROR) if (t.getSeverity() == IssueSeverity.ERROR)
b.append("Error:" + txt); b.append("Error: " + txt);
else if (t.getSeverity() == IssueSeverity.FATAL) else if (t.getSeverity() == IssueSeverity.FATAL)
b.append("Fatal:" + txt); b.append("Fatal: " + txt);
else if (t.getSeverity() == IssueSeverity.WARNING) else if (t.getSeverity() == IssueSeverity.WARNING)
b.append("Warning:" + txt); b.append("Warning: " + txt);
else if (t.getSeverity() == IssueSeverity.INFORMATION) else if (t.getSeverity() == IssueSeverity.INFORMATION)
b.append("Information:" + txt); b.append("Information: " + txt);
} }
return b.toString(); return b.toString();
} }

View File

@ -88,7 +88,7 @@ public class ResourceAddress {
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) { public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) {
return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "/" + opName); return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "$" + opName);
} }
public <T extends Resource> URI resolveGetResource(Class<T> resourceClass, String id) { public <T extends Resource> URI resolveGetResource(Class<T> resourceClass, String id) {

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.core</artifactId> <artifactId>org.hl7.fhir.core</artifactId>
<version>6.2.14-SNAPSHOT</version> <version>6.3.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@ -19,6 +19,7 @@ import org.hl7.fhir.r4b.model.Coding;
import org.hl7.fhir.r4b.model.PrimitiveType; import org.hl7.fhir.r4b.model.PrimitiveType;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -291,7 +292,7 @@ public abstract class CanonicalResourceComparer extends ResourceComparer {
public XhtmlNode renderMetadata(CanonicalResourceComparison<? extends CanonicalResource> comparison, String id, public XhtmlNode renderMetadata(CanonicalResourceComparison<? extends CanonicalResource> comparison, String id,
String prefix) throws FHIRException, IOException { String prefix) throws FHIRException, IOException {
// columns: code, display (left|right), properties (left|right) // columns: code, display (left|right), properties (left|right)
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Name", "Property Name", null, 100)); model.getTitles().add(gen.new Title(null, null, "Name", "Property Name", null, 100));

View File

@ -34,6 +34,7 @@ import org.hl7.fhir.r4b.model.PrimitiveType;
import org.hl7.fhir.r4b.model.Resource; import org.hl7.fhir.r4b.model.Resource;
import org.hl7.fhir.r4b.model.StructureDefinition; import org.hl7.fhir.r4b.model.StructureDefinition;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -867,7 +868,7 @@ public class CapabilityStatementComparer extends CanonicalResourceComparer {
// comments // comments
public XhtmlNode renderStatements(CapabilityStatementComparison comparison, String id, String prefix) public XhtmlNode renderStatements(CapabilityStatementComparison comparison, String id, String prefix)
throws FHIRException, IOException { throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Type", "The type of item", null, 100)); model.getTitles().add(gen.new Title(null, null, "Type", "The type of item", null, 100));

View File

@ -16,6 +16,7 @@ import org.hl7.fhir.r4b.model.CodeSystem.ConceptDefinitionDesignationComponent;
import org.hl7.fhir.r4b.model.CodeSystem.ConceptPropertyComponent; import org.hl7.fhir.r4b.model.CodeSystem.ConceptPropertyComponent;
import org.hl7.fhir.r4b.model.CodeSystem.PropertyComponent; import org.hl7.fhir.r4b.model.CodeSystem.PropertyComponent;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -348,7 +349,7 @@ public class CodeSystemComparer extends CanonicalResourceComparer {
public XhtmlNode renderConcepts(CodeSystemComparison comparison, String id, String prefix) public XhtmlNode renderConcepts(CodeSystemComparison comparison, String id, String prefix)
throws FHIRException, IOException { throws FHIRException, IOException {
// columns: code, display (left|right), properties (left|right) // columns: code, display (left|right), properties (left|right)
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Code", "The code for the concept", null, 100)); model.getTitles().add(gen.new Title(null, null, "Code", "The code for the concept", null, 100));

View File

@ -33,6 +33,7 @@ import org.hl7.fhir.r4b.model.ValueSet;
import org.hl7.fhir.r4b.utils.DefinitionNavigator; import org.hl7.fhir.r4b.utils.DefinitionNavigator;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
@ -1027,8 +1028,7 @@ public class ProfileComparer extends CanonicalResourceComparer {
public XhtmlNode renderStructure(ProfileComparison comp, String id, String prefix, String corePath) public XhtmlNode renderStructure(ProfileComparison comp, String id, String prefix, String corePath)
throws FHIRException, IOException { throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false, true);
gen.setTranslator(session.getContextRight().translator());
TableModel model = gen.initComparisonTable(corePath, id); TableModel model = gen.initComparisonTable(corePath, id);
genElementComp(null /* oome back to this later */, gen, model.getRows(), comp.combined, corePath, prefix, null, genElementComp(null /* oome back to this later */, gen, model.getRows(), comp.combined, corePath, prefix, null,
true); true);

View File

@ -19,6 +19,7 @@ import org.hl7.fhir.r4b.model.ValueSet.ValueSetComposeComponent;
import org.hl7.fhir.r4b.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r4b.model.ValueSet.ValueSetExpansionContainsComponent;
import org.hl7.fhir.r4b.terminologies.ValueSetExpander.ValueSetExpansionOutcome; import org.hl7.fhir.r4b.terminologies.ValueSetExpander.ValueSetExpansionOutcome;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -577,7 +578,7 @@ public class ValueSetComparer extends CanonicalResourceComparer {
} }
public XhtmlNode renderCompose(ValueSetComparison csc, String id, String prefix) throws FHIRException, IOException { public XhtmlNode renderCompose(ValueSetComparison csc, String id, String prefix) throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "comparison"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "comparison"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Item", "The type of item being compared", null, 100)); model.getTitles().add(gen.new Title(null, null, "Item", "The type of item being compared", null, 100));
@ -778,7 +779,7 @@ public class ValueSetComparer extends CanonicalResourceComparer {
boolean hasAbstract = findAbstract(csc.getExpansion()); boolean hasAbstract = findAbstract(csc.getExpansion());
boolean hasInactive = findInactive(csc.getExpansion()); boolean hasInactive = findInactive(csc.getExpansion());
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "comparison"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "comparison"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
if (hasSystem) { if (hasSystem) {

View File

@ -121,6 +121,7 @@ import org.hl7.fhir.utilities.MarkDownProcessor;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.VersionUtilities;
import org.hl7.fhir.utilities.i18n.I18nConstants; import org.hl7.fhir.utilities.i18n.I18nConstants;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -3874,8 +3875,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder,
boolean inlineGraphics, boolean full, String corePath, String imagePath, Set<String> outputTracker, boolean inlineGraphics, boolean full, String corePath, String imagePath, Set<String> outputTracker,
RenderingContext rc) throws IOException, FHIRException { RenderingContext rc) throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics, true);
gen.setTranslator(getTranslator());
TableModel model = gen.initNormalTable(corePath, false, true, ed.getId() + (full ? "f" : "n"), true, TableModel model = gen.initNormalTable(corePath, false, true, ed.getId() + (full ? "f" : "n"), true,
TableGenerationMode.XHTML); TableGenerationMode.XHTML);
@ -4443,8 +4443,7 @@ public class ProfileUtilities extends TranslatingUtilities {
boolean logicalModel, boolean allInvariants, Set<String> outputTracker, boolean active, boolean mustSupport, boolean logicalModel, boolean allInvariants, Set<String> outputTracker, boolean active, boolean mustSupport,
RenderingContext rc) throws IOException, FHIRException { RenderingContext rc) throws IOException, FHIRException {
assert (diff != snapshot);// check it's ok to get rid of one of these assert (diff != snapshot);// check it's ok to get rid of one of these
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics, true);
gen.setTranslator(getTranslator());
TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), active, TableModel model = gen.initNormalTable(corePath, false, true, profile.getId() + (diff ? "d" : "s"), active,
active ? TableGenerationMode.XHTML : TableGenerationMode.XML); active ? TableGenerationMode.XHTML : TableGenerationMode.XML);
List<ElementDefinition> list = new ArrayList<>(); List<ElementDefinition> list = new ArrayList<>();
@ -4545,8 +4544,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateGrid(String defFile, StructureDefinition profile, String imageFolder, boolean inlineGraphics, public XhtmlNode generateGrid(String defFile, StructureDefinition profile, String imageFolder, boolean inlineGraphics,
String profileBaseFileName, String corePath, String imagePath, Set<String> outputTracker) String profileBaseFileName, String corePath, String imagePath, Set<String> outputTracker)
throws IOException, FHIRException { throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, inlineGraphics, true);
gen.setTranslator(getTranslator());
TableModel model = gen.initGridTable(corePath, profile.getId()); TableModel model = gen.initGridTable(corePath, profile.getId());
List<ElementDefinition> list = profile.getSnapshot().getElement(); List<ElementDefinition> list = profile.getSnapshot().getElement();
List<StructureDefinition> profiles = new ArrayList<StructureDefinition>(); List<StructureDefinition> profiles = new ArrayList<StructureDefinition>();
@ -7116,8 +7114,7 @@ public class ProfileUtilities extends TranslatingUtilities {
public XhtmlNode generateSpanningTable(StructureDefinition profile, String imageFolder, boolean onlyConstraints, public XhtmlNode generateSpanningTable(StructureDefinition profile, String imageFolder, boolean onlyConstraints,
String constraintPrefix, Set<String> outputTracker) throws IOException, FHIRException { String constraintPrefix, Set<String> outputTracker) throws IOException, FHIRException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, false, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), imageFolder, false, true);
gen.setTranslator(getTranslator());
TableModel model = initSpanningTable(gen, "", false, profile.getId()); TableModel model = initSpanningTable(gen, "", false, profile.getId());
Set<String> processed = new HashSet<String>(); Set<String> processed = new HashSet<String>();
SpanEntry span = buildSpanningTable("(focus)", "", profile, processed, onlyConstraints, constraintPrefix); SpanEntry span = buildSpanningTable("(focus)", "", profile, processed, onlyConstraints, constraintPrefix);

View File

@ -29,6 +29,7 @@ import org.hl7.fhir.r4b.renderers.utils.RenderingContext;
import org.hl7.fhir.r4b.terminologies.ValueSetExpander.ValueSetExpansionOutcome; import org.hl7.fhir.r4b.terminologies.ValueSetExpander.ValueSetExpansionOutcome;
import org.hl7.fhir.r4b.utils.ToolingExtensions; import org.hl7.fhir.r4b.utils.ToolingExtensions;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
import org.hl7.fhir.utilities.xhtml.NodeType; import org.hl7.fhir.utilities.xhtml.NodeType;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell;
@ -74,7 +75,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
if (doOpts) { if (doOpts) {
x.b().tx("Structure"); x.b().tx("Structure");
} }
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), context.getDestDir(), context.isInlineGraphics(),
true); true);
TableModel model = gen.new TableModel("qtree=" + q.getId(), !forResource); TableModel model = gen.new TableModel("qtree=" + q.getId(), !forResource);
model.setAlternating(true); model.setAlternating(true);
@ -511,7 +512,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
private boolean renderLogic(XhtmlNode x, Questionnaire q) throws FHIRException, IOException { private boolean renderLogic(XhtmlNode x, Questionnaire q) throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), context.getDestDir(), context.isInlineGraphics(),
true); true);
TableModel model = gen.new TableModel("qtree=" + q.getId(), true); TableModel model = gen.new TableModel("qtree=" + q.getId(), true);
model.setAlternating(true); model.setAlternating(true);

View File

@ -30,6 +30,7 @@ import org.hl7.fhir.r4b.renderers.utils.RenderingContext;
import org.hl7.fhir.r4b.terminologies.ValueSetExpander.ValueSetExpansionOutcome; import org.hl7.fhir.r4b.terminologies.ValueSetExpander.ValueSetExpansionOutcome;
import org.hl7.fhir.r4b.utils.ToolingExtensions; import org.hl7.fhir.r4b.utils.ToolingExtensions;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
import org.hl7.fhir.utilities.xhtml.NodeType; import org.hl7.fhir.utilities.xhtml.NodeType;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell;
@ -79,7 +80,7 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
} }
public boolean renderTree(XhtmlNode x, ResourceWrapper qr) throws UnsupportedEncodingException, IOException { public boolean renderTree(XhtmlNode x, ResourceWrapper qr) throws UnsupportedEncodingException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), context.getDestDir(), context.isInlineGraphics(),
true); true);
TableModel model = gen.new TableModel("qtree=" + qr.getId(), false); TableModel model = gen.new TableModel("qtree=" + qr.getId(), false);
model.setAlternating(true); model.setAlternating(true);
@ -107,7 +108,7 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
} }
public boolean renderTree(XhtmlNode x, QuestionnaireResponse q) throws UnsupportedEncodingException, IOException { public boolean renderTree(XhtmlNode x, QuestionnaireResponse q) throws UnsupportedEncodingException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), context.getDestDir(), context.isInlineGraphics(),
true); true);
TableModel model = gen.new TableModel("qtree=" + q.getId(), true); TableModel model = gen.new TableModel("qtree=" + q.getId(), true);
model.setAlternating(true); model.setAlternating(true);

View File

@ -79,13 +79,13 @@ public class ResourceUtilities {
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();
for (OperationOutcomeIssueComponent t : error.getIssue()) { for (OperationOutcomeIssueComponent t : error.getIssue()) {
if (t.getSeverity() == IssueSeverity.ERROR) { if (t.getSeverity() == IssueSeverity.ERROR) {
b.append("Error:" + gen(t.getDetails()) + "\r\n"); b.append("Error: " + gen(t.getDetails()) + "\r\n");
} else if (t.getSeverity() == IssueSeverity.FATAL) { } else if (t.getSeverity() == IssueSeverity.FATAL) {
b.append("Fatal:" + gen(t.getDetails()) + "\r\n"); b.append("Fatal: " + gen(t.getDetails()) + "\r\n");
} else if (t.getSeverity() == IssueSeverity.WARNING) { } else if (t.getSeverity() == IssueSeverity.WARNING) {
b.append("Warning:" + gen(t.getDetails()) + "\r\n"); b.append("Warning: " + gen(t.getDetails()) + "\r\n");
} else if (t.getSeverity() == IssueSeverity.INFORMATION) { } else if (t.getSeverity() == IssueSeverity.INFORMATION) {
b.append("Information:" + gen(t.getDetails()) + "\r\n"); b.append("Information: " + gen(t.getDetails()) + "\r\n");
} }
} }
return b.toString(); return b.toString();

View File

@ -87,7 +87,7 @@ public class ResourceAddress {
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) { public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName) {
return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "/" + opName); return baseServiceUri.resolve(nameForClassWithSlash(resourceClass) + "$" + opName);
} }
public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName, public <T extends Resource> URI resolveOperationUri(Class<T> resourceClass, String opName,

View File

@ -63,7 +63,7 @@ public class StructureMapUtilitiesTest implements ITransformerServices {
@Test @Test
public void testSyntax() throws IOException, FHIRException { public void testSyntax() throws IOException, FHIRException {
StructureMapUtilities scu = new StructureMapUtilities(context, this); StructureMapUtilities scu = new StructureMapUtilities(context, this);
String fileMap = TestingUtilities.loadTestResource("r5", "structure-mapping", "syntax.map"); String fileMap = TestingUtilities.loadTestResource("r4b", "structure-mapping", "syntax.map");
System.out.println(fileMap); System.out.println(fileMap);
StructureMap structureMap = scu.parse(fileMap, "Syntax"); StructureMap structureMap = scu.parse(fileMap, "Syntax");

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.core</artifactId> <artifactId>org.hl7.fhir.core</artifactId>
<version>6.2.14-SNAPSHOT</version> <version>6.3.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

View File

@ -19,6 +19,7 @@ import org.hl7.fhir.r5.model.DataType;
import org.hl7.fhir.r5.model.PrimitiveType; import org.hl7.fhir.r5.model.PrimitiveType;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -591,7 +592,7 @@ public abstract class CanonicalResourceComparer extends ResourceComparer {
public XhtmlNode renderMetadata(CanonicalResourceComparison<? extends CanonicalResource> comparison, String id, String prefix) throws FHIRException, IOException { public XhtmlNode renderMetadata(CanonicalResourceComparison<? extends CanonicalResource> comparison, String id, String prefix) throws FHIRException, IOException {
// columns: code, display (left|right), properties (left|right) // columns: code, display (left|right), properties (left|right)
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Name", "Property Name", null, 100)); model.getTitles().add(gen.new Title(null, null, "Name", "Property Name", null, 100));

View File

@ -30,6 +30,7 @@ import org.hl7.fhir.r5.model.Resource;
import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.model.StructureDefinition;
import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.ToolingExtensions;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -742,7 +743,7 @@ public class CapabilityStatementComparer extends CanonicalResourceComparer {
// 6 columns: path | left value | left doco | right value | right doco | comments // 6 columns: path | left value | left doco | right value | right doco | comments
public XhtmlNode renderStatements(CapabilityStatementComparison comparison, String id, String prefix) throws FHIRException, IOException { public XhtmlNode renderStatements(CapabilityStatementComparison comparison, String id, String prefix) throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Type", "The type of item", null, 100)); model.getTitles().add(gen.new Title(null, null, "Type", "The type of item", null, 100));

View File

@ -17,6 +17,7 @@ import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionDesignationComponent;
import org.hl7.fhir.r5.model.CodeSystem.ConceptPropertyComponent; import org.hl7.fhir.r5.model.CodeSystem.ConceptPropertyComponent;
import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent; import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -519,7 +520,7 @@ public class CodeSystemComparer extends CanonicalResourceComparer {
public XhtmlNode renderConcepts(CodeSystemComparison comparison, String id, String prefix) throws FHIRException, IOException { public XhtmlNode renderConcepts(CodeSystemComparison comparison, String id, String prefix) throws FHIRException, IOException {
// columns: code, display (left|right), properties (left|right) // columns: code, display (left|right), properties (left|right)
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Code", "The code for the concept", null, 100)); model.getTitles().add(gen.new Title(null, null, "Code", "The code for the concept", null, 100));

View File

@ -42,6 +42,7 @@ import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode;
import org.hl7.fhir.r5.utils.DefinitionNavigator; import org.hl7.fhir.r5.utils.DefinitionNavigator;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
@ -1251,8 +1252,7 @@ public class StructureDefinitionComparer extends CanonicalResourceComparer imple
} }
public XhtmlNode renderStructure(ProfileComparison comp, String id, String prefix, String corePath) throws FHIRException, IOException { public XhtmlNode renderStructure(ProfileComparison comp, String id, String prefix, String corePath) throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "compare"), false, true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "compare"), false, true);
gen.setTranslator(session.getContextRight().translator());
TableModel model = gen.initComparisonTable(corePath, id); TableModel model = gen.initComparisonTable(corePath, id);
genElementComp(null /* come back to this later */, gen, model.getRows(), comp.combined, corePath, prefix, null, true); genElementComp(null /* come back to this later */, gen, model.getRows(), comp.combined, corePath, prefix, null, true);
return gen.generate(model, prefix, 0, null); return gen.generate(model, prefix, 0, null);

View File

@ -18,6 +18,7 @@ import org.hl7.fhir.r5.model.ValueSet.ValueSetComposeComponent;
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
@ -588,7 +589,7 @@ public class ValueSetComparer extends CanonicalResourceComparer {
} }
public XhtmlNode renderCompose(ValueSetComparison csc, String id, String prefix) throws FHIRException, IOException { public XhtmlNode renderCompose(ValueSetComparison csc, String id, String prefix) throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "comparison"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "comparison"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
model.getTitles().add(gen.new Title(null, null, "Item", "The type of item being compared", null, 100)); model.getTitles().add(gen.new Title(null, null, "Item", "The type of item being compared", null, 100));
@ -779,7 +780,7 @@ public class ValueSetComparer extends CanonicalResourceComparer {
boolean hasAbstract = findAbstract(csc.getExpansion()); boolean hasAbstract = findAbstract(csc.getExpansion());
boolean hasInactive = findInactive(csc.getExpansion()); boolean hasInactive = findInactive(csc.getExpansion());
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(Utilities.path("[tmp]", "comparison"), false); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(new RenderingI18nContext(), Utilities.path("[tmp]", "comparison"), false);
TableModel model = gen.new TableModel(id, true); TableModel model = gen.new TableModel(id, true);
model.setAlternating(true); model.setAlternating(true);
if (hasSystem) { if (hasSystem) {

View File

@ -190,7 +190,10 @@ public class R5ExtensionsLoader {
context.cacheResourceFromPackage(vs, vs.getSourcePackage()); context.cacheResourceFromPackage(vs, vs.getSourcePackage());
for (ConceptSetComponent inc : vs.getCompose().getInclude()) { for (ConceptSetComponent inc : vs.getCompose().getInclude()) {
for (CanonicalType t : inc.getValueSet()) { for (CanonicalType t : inc.getValueSet()) {
loadValueSet(t.asStringValue(), context, valueSets, codeSystems); ValueSet vsi = context.fetchResource(ValueSet.class, t.getValue());
if (vsi == null) {
loadValueSet(t.asStringValue(), context, valueSets, codeSystems);
}
} }
if (inc.hasSystem()) { if (inc.hasSystem()) {
if (!inc.hasVersion()) { if (!inc.hasVersion()) {

View File

@ -16,6 +16,7 @@ import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionSlicingComponent
import org.hl7.fhir.r5.model.ElementDefinition.SlicingRules; import org.hl7.fhir.r5.model.ElementDefinition.SlicingRules;
import org.hl7.fhir.r5.model.OperationOutcome.IssueType; import org.hl7.fhir.r5.model.OperationOutcome.IssueType;
import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.model.StructureDefinition;
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionSnapshotComponent; import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionSnapshotComponent;
import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.ToolingExtensions;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
@ -170,6 +171,7 @@ public class ProfilePathProcessor {
ElementDefinition currentBase = cursors.base.getElement().get(cursors.baseCursor); ElementDefinition currentBase = cursors.base.getElement().get(cursors.baseCursor);
String currentBasePath = profileUtilities.fixedPathSource(getContextPathSource(), currentBase.getPath(), getRedirector()); String currentBasePath = profileUtilities.fixedPathSource(getContextPathSource(), currentBase.getPath(), getRedirector());
debugProcessPathsIteration(cursors, currentBasePath); debugProcessPathsIteration(cursors, currentBasePath);
checkDiffAssignedAndCursor(cursors);
List<ElementDefinition> diffMatches = profileUtilities.getDiffMatches(getDifferential(), currentBasePath, cursors.diffCursor, getDiffLimit(), getProfileName()); // get a list of matching elements in scope List<ElementDefinition> diffMatches = profileUtilities.getDiffMatches(getDifferential(), currentBasePath, cursors.diffCursor, getDiffLimit(), getProfileName()); // get a list of matching elements in scope
// in the simple case, source is not sliced. // in the simple case, source is not sliced.
@ -194,6 +196,25 @@ public class ProfilePathProcessor {
return res; return res;
} }
private void checkDiffAssignedAndCursor(ProfilePathProcessorState cursors) {
// int i = 0;
// List<ElementDefinition> list = getDifferential().getElement();
// for (ElementDefinition ed : list) {
// boolean assigned = ed.hasUserData("derived.pointer");
// if (i < cursors.diffCursor) {
// if (!assigned) {
// throw new Error("what?");
// }
// } else if (i > cursors.diffCursor) {
// if (assigned) {
// throw new Error("what!?");
// }
// }
// i++;
// }
}
private void debugProcessPathsIteration(ProfilePathProcessorState cursors, String currentBasePath) { private void debugProcessPathsIteration(ProfilePathProcessorState cursors, String currentBasePath) {
if (profileUtilities.isDebug()) { if (profileUtilities.isDebug()) {
System.out.println(getDebugIndent() + " - " + currentBasePath + ": "+ System.out.println(getDebugIndent() + " - " + currentBasePath + ": "+
@ -621,7 +642,12 @@ public class ProfilePathProcessor {
if (firstTypeStructureDefinition.getSnapshot().getElement().isEmpty()) { if (firstTypeStructureDefinition.getSnapshot().getElement().isEmpty()) {
throw new FHIRException(profileUtilities.getContext().formatMessage(I18nConstants.SNAPSHOT_IS_EMPTY, firstTypeStructureDefinition.getVersionedUrl(), "Source for first element")); throw new FHIRException(profileUtilities.getContext().formatMessage(I18nConstants.SNAPSHOT_IS_EMPTY, firstTypeStructureDefinition.getVersionedUrl(), "Source for first element"));
} else { } else {
src = firstTypeStructureDefinition.getSnapshot().getElement().get(0); src = firstTypeStructureDefinition.getSnapshot().getElement().get(0).copy();
if (!src.getPath().contains(".") && firstTypeStructureDefinition.getKind() == StructureDefinitionKind.RESOURCE) {
// we can't migrate the constraints in this case, because the sense of %resource changes when the root resource
// is treated as an element. The validator will enforce the constraint
src.getConstraint().clear(); //
}
} }
} }
template = src.copy().setPath(currentBase.getPath()); template = src.copy().setPath(currentBase.getPath());
@ -1063,7 +1089,7 @@ public class ProfilePathProcessor {
} }
// throw new Error("Not done yet"); // throw new Error("Not done yet");
// } else if (currentBase.getType().get(0).getCode().equals("BackboneElement") && diffMatches.size() > 0 && diffMatches.get(0).hasSliceName()) { // } else if (currentBase.getType().get(0).getCode().equals("BackboneElement") && diffMatches.size() > 0 && diffMatches.get(0).hasSliceName()) {
} else if (currentBase.getType().get(0).getCode().equals("BackboneElement")) { } else if (!currentBase.getType().isEmpty() && currentBase.getType().get(0).getCode().equals("BackboneElement")) {
// We need to copy children of the backbone element before we start messing around with slices // We need to copy children of the backbone element before we start messing around with slices
int newBaseLimit = profileUtilities.findEndOfElement(cursors.base, cursors.baseCursor); int newBaseLimit = profileUtilities.findEndOfElement(cursors.base, cursors.baseCursor);
for (int i = cursors.baseCursor + 1; i <= newBaseLimit; i++) { for (int i = cursors.baseCursor + 1; i <= newBaseLimit; i++) {

View File

@ -99,7 +99,6 @@ import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.ToolingExtensions;
import org.hl7.fhir.r5.utils.TranslatingUtilities;
import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.r5.utils.XVerExtensionManager;
import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus; import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus;
import org.hl7.fhir.r5.utils.formats.CSVWriter; import org.hl7.fhir.r5.utils.formats.CSVWriter;
@ -136,7 +135,7 @@ import org.hl7.fhir.utilities.xml.SchematronWriter.Section;
* @author Grahame * @author Grahame
* *
*/ */
public class ProfileUtilities extends TranslatingUtilities { public class ProfileUtilities {
private static boolean suppressIgnorableExceptions; private static boolean suppressIgnorableExceptions;
@ -433,7 +432,7 @@ public class ProfileUtilities extends TranslatingUtilities {
private boolean wantFixDifferentialFirstElementType; private boolean wantFixDifferentialFirstElementType;
private Set<String> masterSourceFileNames; private Set<String> masterSourceFileNames;
private Set<String> localFileNames; private Set<String> localFileNames;
private Map<ElementDefinition, SourcedChildDefinitions> childMapCache = new HashMap<>(); private Map<String, SourcedChildDefinitions> childMapCache = new HashMap<>();
private AllowUnknownProfile allowUnknownProfile = AllowUnknownProfile.ALL_TYPES; private AllowUnknownProfile allowUnknownProfile = AllowUnknownProfile.ALL_TYPES;
private MappingMergeModeOption mappingMergeMode = MappingMergeModeOption.APPEND; private MappingMergeModeOption mappingMergeMode = MappingMergeModeOption.APPEND;
private boolean forPublication; private boolean forPublication;
@ -479,8 +478,9 @@ public class ProfileUtilities extends TranslatingUtilities {
} }
public SourcedChildDefinitions getChildMap(StructureDefinition profile, ElementDefinition element) throws DefinitionException { public SourcedChildDefinitions getChildMap(StructureDefinition profile, ElementDefinition element) throws DefinitionException {
if (childMapCache.containsKey(element)) { String cacheKey = "cm."+profile.getVersionedUrl()+"#"+(element.hasId() ? element.getId() : element.getPath());
return childMapCache.get(element); if (childMapCache.containsKey(cacheKey)) {
return childMapCache.get(cacheKey);
} }
StructureDefinition src = profile; StructureDefinition src = profile;
if (element.getContentReference() != null) { if (element.getContentReference() != null) {
@ -524,7 +524,7 @@ public class ProfileUtilities extends TranslatingUtilities {
break; break;
} }
SourcedChildDefinitions result = new SourcedChildDefinitions(src, res); SourcedChildDefinitions result = new SourcedChildDefinitions(src, res);
childMapCache.put(element, result); childMapCache.put(cacheKey, result);
return result; return result;
} }
} }

View File

@ -78,6 +78,7 @@ import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionBindingComponent
import org.hl7.fhir.r5.model.Enumerations.PublicationStatus; import org.hl7.fhir.r5.model.Enumerations.PublicationStatus;
import org.hl7.fhir.r5.model.IdType; import org.hl7.fhir.r5.model.IdType;
import org.hl7.fhir.r5.model.Identifier; import org.hl7.fhir.r5.model.Identifier;
import org.hl7.fhir.r5.model.IntegerType;
import org.hl7.fhir.r5.model.ImplementationGuide; import org.hl7.fhir.r5.model.ImplementationGuide;
import org.hl7.fhir.r5.model.Library; import org.hl7.fhir.r5.model.Library;
import org.hl7.fhir.r5.model.Measure; import org.hl7.fhir.r5.model.Measure;
@ -101,9 +102,7 @@ import org.hl7.fhir.r5.model.StringType;
import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.model.StructureDefinition;
import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule; import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule;
import org.hl7.fhir.r5.model.StructureMap; import org.hl7.fhir.r5.model.StructureMap;
import org.hl7.fhir.r5.model.TerminologyCapabilities;
import org.hl7.fhir.r5.model.TerminologyCapabilities.TerminologyCapabilitiesCodeSystemComponent;
import org.hl7.fhir.r5.model.TerminologyCapabilities.TerminologyCapabilitiesExpansionParameterComponent;
import org.hl7.fhir.r5.model.UriType; import org.hl7.fhir.r5.model.UriType;
import org.hl7.fhir.r5.model.UrlType; import org.hl7.fhir.r5.model.UrlType;
import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet;
@ -129,8 +128,8 @@ import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.SourcedValueSet;
import org.hl7.fhir.r5.terminologies.validation.VSCheckerException; import org.hl7.fhir.r5.terminologies.validation.VSCheckerException;
import org.hl7.fhir.r5.terminologies.validation.ValueSetValidator; import org.hl7.fhir.r5.terminologies.validation.ValueSetValidator;
import org.hl7.fhir.r5.terminologies.ValueSetUtilities; import org.hl7.fhir.r5.terminologies.ValueSetUtilities;
import org.hl7.fhir.r5.terminologies.client.TerminologyClientR5.TerminologyClientR5Factory;
import org.hl7.fhir.r5.terminologies.client.TerminologyClientManager; import org.hl7.fhir.r5.terminologies.client.TerminologyClientManager;
import org.hl7.fhir.r5.terminologies.client.TerminologyClientR5;
import org.hl7.fhir.r5.terminologies.client.TerminologyClientContext; import org.hl7.fhir.r5.terminologies.client.TerminologyClientContext;
import org.hl7.fhir.r5.utils.PackageHackerR5; import org.hl7.fhir.r5.utils.PackageHackerR5;
import org.hl7.fhir.r5.utils.ResourceUtilities; import org.hl7.fhir.r5.utils.ResourceUtilities;
@ -138,10 +137,8 @@ import org.hl7.fhir.r5.utils.ToolingExtensions;
import org.hl7.fhir.r5.utils.client.EFhirClientException; import org.hl7.fhir.r5.utils.client.EFhirClientException;
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.FhirPublication;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.TimeTracker; import org.hl7.fhir.utilities.TimeTracker;
import org.hl7.fhir.utilities.ToolingClientLogger; import org.hl7.fhir.utilities.ToolingClientLogger;
import org.hl7.fhir.utilities.TranslationServices;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.VersionUtilities;
import org.hl7.fhir.utilities.i18n.I18nBase; import org.hl7.fhir.utilities.i18n.I18nBase;
@ -234,7 +231,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
private Object lock = new Object(); // used as a lock for the data that follows private Object lock = new Object(); // used as a lock for the data that follows
protected String version; // although the internal resources are all R5, the version of FHIR they describe may not be protected String version; // although the internal resources are all R5, the version of FHIR they describe may not be
protected final TerminologyClientManager terminologyClientManager = new TerminologyClientManager(null, UUID.randomUUID().toString()); protected final TerminologyClientManager terminologyClientManager = new TerminologyClientManager(new TerminologyClientR5.TerminologyClientR5Factory(), UUID.randomUUID().toString());
private boolean minimalMemory = false; private boolean minimalMemory = false;
private Map<String, Map<String, ResourceProxy>> allResourcesById = new HashMap<String, Map<String, ResourceProxy>>(); private Map<String, Map<String, ResourceProxy>> allResourcesById = new HashMap<String, Map<String, ResourceProxy>>();
@ -277,7 +274,6 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
private int expandCodesLimit = 1000; private int expandCodesLimit = 1000;
protected ILoggingService logger = new SystemOutLoggingService(); protected ILoggingService logger = new SystemOutLoggingService();
protected Parameters expParameters; protected Parameters expParameters;
private TranslationServices translator = new NullTranslator();
private Map<String, PackageInformation> packages = new HashMap<>(); private Map<String, PackageInformation> packages = new HashMap<>();
@Getter @Getter
@ -312,7 +308,6 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
protected void copy(BaseWorkerContext other) { protected void copy(BaseWorkerContext other) {
synchronized (other.lock) { // tricky, because you need to lock this as well, but it's really not in use yet synchronized (other.lock) { // tricky, because you need to lock this as well, but it's really not in use yet
allResourcesById.putAll(other.allResourcesById); allResourcesById.putAll(other.allResourcesById);
translator = other.translator;
codeSystems.copy(other.codeSystems); codeSystems.copy(other.codeSystems);
valueSets.copy(other.valueSets); valueSets.copy(other.valueSets);
maps.copy(other.maps); maps.copy(other.maps);
@ -851,7 +846,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
return res; return res;
} }
Set<String> systems = findRelevantSystems(vs); Set<String> systems = findRelevantSystems(vs);
TerminologyClientContext tc = terminologyClientManager.chooseServer(systems, true); TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, true);
if (tc == null) { if (tc == null) {
return new ValueSetExpansionOutcome("No server available", TerminologyServiceErrorClass.INTERNAL_ERROR, true); return new ValueSetExpansionOutcome("No server available", TerminologyServiceErrorClass.INTERNAL_ERROR, true);
} }
@ -915,7 +910,8 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
} }
Parameters p = pIn.copy(); Parameters p = pIn.copy();
p.setParameter("_limit",new IntegerType("10000"));
p.setParameter("_incomplete", new BooleanType("true"));
if (vs.hasExpansion()) { if (vs.hasExpansion()) {
return new ValueSetExpansionOutcome(vs.copy()); return new ValueSetExpansionOutcome(vs.copy());
} }
@ -978,7 +974,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
p.addParameter().setName("cache-id").setValue(new IdType(terminologyClientManager.getCacheId())); p.addParameter().setName("cache-id").setValue(new IdType(terminologyClientManager.getCacheId()));
Set<String> systems = findRelevantSystems(vs); Set<String> systems = findRelevantSystems(vs);
TerminologyClientContext tc = terminologyClientManager.chooseServer(systems, true); TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, true);
addDependentResources(tc, p, vs); addDependentResources(tc, p, vs);
@ -1108,7 +1104,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
} }
if (batch.getEntry().size() > 0) { if (batch.getEntry().size() > 0) {
TerminologyClientContext tc = terminologyClientManager.chooseServer(systems, false); TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, false);
Bundle resp = processBatch(tc, batch, systems); Bundle resp = processBatch(tc, batch, systems);
for (int i = 0; i < batch.getEntry().size(); i++) { for (int i = 0; i < batch.getEntry().size(); i++) {
CodingValidationRequest t = (CodingValidationRequest) batch.getEntry().get(i).getUserData("source"); CodingValidationRequest t = (CodingValidationRequest) batch.getEntry().get(i).getUserData("source");
@ -1213,7 +1209,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
systems.add(codingValidationRequest.getCoding().getSystem()); systems.add(codingValidationRequest.getCoding().getSystem());
} }
} }
TerminologyClientContext tc = terminologyClientManager.chooseServer(systems, false); TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, false);
if (batch.getEntry().size() > 0) { if (batch.getEntry().size() > 0) {
Bundle resp = processBatch(tc, batch, systems); Bundle resp = processBatch(tc, batch, systems);
@ -1291,7 +1287,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
vsc.setUnknownSystems(unknownSystems); vsc.setUnknownSystems(unknownSystems);
vsc.setThrowToServer(options.isUseServer() && terminologyClientManager.hasClient()); vsc.setThrowToServer(options.isUseServer() && terminologyClientManager.hasClient());
if (!ValueSetUtilities.isServerSide(code.getSystem())) { if (!ValueSetUtilities.isServerSide(code.getSystem())) {
res = vsc.validateCode(path, code); res = vsc.validateCode(path, code.copy());
if (txCache != null && cachingAllowed) { if (txCache != null && cachingAllowed) {
txCache.cacheValidation(cacheToken, res, TerminologyCache.TRANSIENT); txCache.cacheValidation(cacheToken, res, TerminologyCache.TRANSIENT);
} }
@ -1346,9 +1342,9 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
} }
Set<String> systems = findRelevantSystems(code, vs); Set<String> systems = findRelevantSystems(code, vs);
TerminologyClientContext tc = terminologyClientManager.chooseServer(systems, false); TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, false);
String csumm =cachingAllowed && txCache != null ? txCache.summary(code) : null; String csumm = cachingAllowed && txCache != null ? txCache.summary(code) : null;
if (cachingAllowed && txCache != null) { if (cachingAllowed && txCache != null) {
txLog("$validate "+csumm+(vs == null ? "" : " for "+ txCache.summary(vs))+" on "+tc.getAddress()); txLog("$validate "+csumm+(vs == null ? "" : " for "+ txCache.summary(vs))+" on "+tc.getAddress());
} else { } else {
@ -1365,7 +1361,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
} }
if (!res.isOk() && localError != null) { if (!res.isOk() && localError != null) {
res.setDiagnostics("Local Error: "+localError.trim()+". Server Error: "+res.getMessage()); res.setDiagnostics("Local Error: "+localError.trim()+". Server Error: "+res.getMessage());
} else if (!res.isOk() && res.getUnknownSystems() != null && res.getUnknownSystems().contains(codeKey) && localWarning != null) { } else if (!res.isOk() && res.getErrorClass() == TerminologyServiceErrorClass.CODESYSTEM_UNSUPPORTED && res.getUnknownSystems() != null && res.getUnknownSystems().contains(codeKey) && localWarning != null) {
// we had some problem evaluating locally, but the server doesn't know the code system, so we'll just go with the local error // we had some problem evaluating locally, but the server doesn't know the code system, so we'll just go with the local error
res = new ValidationResult(IssueSeverity.WARNING, localWarning, null); res = new ValidationResult(IssueSeverity.WARNING, localWarning, null);
res.setDiagnostics("Local Warning: "+localWarning.trim()+". Server Error: "+res.getMessage()); res.setDiagnostics("Local Warning: "+localWarning.trim()+". Server Error: "+res.getMessage());
@ -1378,6 +1374,83 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
return res; return res;
} }
/**
* ask the terminology system whether parent subsumes child.
*
* @return true if it does, false if it doesn't, and null if it's not know whether it does
*/
public Boolean subsumes(ValidationOptions optionsArg, Coding parent, Coding child) {
ValidationOptions options = optionsArg != null ? optionsArg : ValidationOptions.defaults();
if (parent.hasSystem()) {
codeSystemsUsed.add(parent.getSystem());
} else {
return null;
}
if (child.hasSystem()) {
codeSystemsUsed.add(child.getSystem());
} else {
return null;
}
final CacheToken cacheToken = cachingAllowed && txCache != null ? txCache.generateSubsumesToken(options, parent, child, expParameters) : null;
if (cachingAllowed && txCache != null) {
Boolean res = txCache.getSubsumes(cacheToken);
if (res != null) {
return res;
}
}
if (options.isUseClient() && parent.getSystem().equals(child.getSystem())) {
CodeSystem cs = fetchCodeSystem(parent.getSystem());
if (cs != null) {
Boolean b = CodeSystemUtilities.subsumes(cs, parent.getCode(), child.getCode());
if (txCache != null && cachingAllowed) {
txCache.cacheSubsumes(cacheToken, b, true);
}
return b;
}
}
if (!terminologyClientManager.hasClient() || !options.isUseServer() || unsupportedCodeSystems.contains(parent.getSystem()) || unsupportedCodeSystems.contains(child.getSystem()) || noTerminologyServer) {
return null;
}
Set<String> systems = new HashSet<>();
systems.add(parent.getSystem());
systems.add(child.getSystem());
TerminologyClientContext tc = terminologyClientManager.chooseServer(null, systems, false);
txLog("$subsumes "+parent.toString()+" > "+child.toString()+" on "+tc.getAddress());
try {
Parameters pIn = new Parameters();
pIn.addParameter().setName("codingA").setValue(parent);
pIn.addParameter().setName("codingB").setValue(child);
if (txLog != null) {
txLog.clearLastId();
}
Parameters pOut = tc.getClient().subsumes(pIn);
return processSubsumesResult(pOut, tc.getClient().getAddress());
} catch (Exception e) {
// e.printStackTrace();
}
return null;
}
public Boolean processSubsumesResult(Parameters pOut, String server) {
for (ParametersParameterComponent p : pOut.getParameter()) {
if (p.hasValue()) {
if (p.getName().equals("outcome")) {
return Utilities.existsInList(p.getValue().primitiveValue(), "equivalent", "subsumes");
}
}
}
return null;
}
protected ValueSetExpander constructValueSetExpanderSimple(ValidationOptions options) { protected ValueSetExpander constructValueSetExpanderSimple(ValidationOptions options) {
return new ValueSetExpander(this, new TerminologyOperationContext(this, options)).setDebug(logger.isDebugLogging()); return new ValueSetExpander(this, new TerminologyOperationContext(this, options)).setDebug(logger.isDebugLogging());
} }
@ -1538,7 +1611,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
return new ValidationResult(IssueSeverity.ERROR, "Error validating code: running without terminology services", TerminologyServiceErrorClass.NOSERVICE, null); return new ValidationResult(IssueSeverity.ERROR, "Error validating code: running without terminology services", TerminologyServiceErrorClass.NOSERVICE, null);
} }
Set<String> systems = findRelevantSystems(code, vs); Set<String> systems = findRelevantSystems(code, vs);
TerminologyClientContext tc = terminologyClientManager.chooseServer(systems, false); TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, false);
txLog("$validate "+txCache.summary(code)+" for "+ txCache.summary(vs)+" on "+tc.getAddress()); txLog("$validate "+txCache.summary(code)+" for "+ txCache.summary(vs)+" on "+tc.getAddress());
try { try {
@ -1780,6 +1853,8 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
} else if (p.getName().equals("x-caused-by-unknown-system")) { } else if (p.getName().equals("x-caused-by-unknown-system")) {
err = TerminologyServiceErrorClass.CODESYSTEM_UNSUPPORTED; err = TerminologyServiceErrorClass.CODESYSTEM_UNSUPPORTED;
unknownSystems.add(((PrimitiveType<?>) p.getValue()).asStringValue()); unknownSystems.add(((PrimitiveType<?>) p.getValue()).asStringValue());
} else if (p.getName().equals("x-unknown-system")) {
unknownSystems.add(((PrimitiveType<?>) p.getValue()).asStringValue());
} else if (p.getName().equals("warning-withdrawn")) { } else if (p.getName().equals("warning-withdrawn")) {
String msg = ((PrimitiveType<?>) p.getValue()).asStringValue(); String msg = ((PrimitiveType<?>) p.getValue()).asStringValue();
OperationOutcomeIssueComponent iss = new OperationOutcomeIssueComponent(org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity.INFORMATION, org.hl7.fhir.r5.model.OperationOutcome.IssueType.BUSINESSRULE); OperationOutcomeIssueComponent iss = new OperationOutcomeIssueComponent(org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity.INFORMATION, org.hl7.fhir.r5.model.OperationOutcome.IssueType.BUSINESSRULE);
@ -2562,55 +2637,6 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
} }
} }
public TranslationServices translator() {
return translator;
}
public void setTranslator(TranslationServices translator) {
this.translator = translator;
}
public class NullTranslator implements TranslationServices {
@Override
public String translate(String context, String value, String targetLang) {
return value;
}
@Override
public String translate(String context, String value) {
return value;
}
@Override
public String toStr(float value) {
return null;
}
@Override
public String toStr(Date value) {
return null;
}
@Override
public String translateAndFormat(String contest, String lang, String value, Object... args) {
return String.format(value, args);
}
@Override
public Map<String, String> translations(String value) {
// TODO Auto-generated method stub
return null;
}
@Override
public Set<String> listTranslations(String category) {
// TODO Auto-generated method stub
return null;
}
}
public void reportStatus(JsonObject json) { public void reportStatus(JsonObject json) {
synchronized (lock) { synchronized (lock) {
json.addProperty("codeystem-count", codeSystems.size()); json.addProperty("codeystem-count", codeSystems.size());
@ -3221,4 +3247,95 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
return result; return result;
} }
@Override
public <T extends Resource> List<T> fetchResourcesByUrl(Class<T> class_, String uri) {
List<T> res = new ArrayList<>();
if (uri != null && !uri.startsWith("#")) {
if (class_ == StructureDefinition.class) {
uri = ProfileUtilities.sdNs(uri, null);
}
assert !uri.contains("|");
if (uri.contains("#")) {
uri = uri.substring(0, uri.indexOf("#"));
}
synchronized (lock) {
if (class_ == Resource.class || class_ == null) {
for (Map<String, ResourceProxy> rt : allResourcesById.values()) {
for (ResourceProxy r : rt.values()) {
if (uri.equals(r.getUrl())) {
res.add((T) r.getResource());
}
}
}
}
if (class_ == ImplementationGuide.class || class_ == Resource.class || class_ == null) {
for (ImplementationGuide cr : guides.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == CapabilityStatement.class || class_ == Resource.class || class_ == null) {
for (CapabilityStatement cr : capstmts.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == Measure.class || class_ == Resource.class || class_ == null) {
for (Measure cr : measures.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == Library.class || class_ == Resource.class || class_ == null) {
for (Library cr : libraries.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == StructureDefinition.class || class_ == Resource.class || class_ == null) {
for (StructureDefinition cr : structures.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == StructureMap.class || class_ == Resource.class || class_ == null) {
for (StructureMap cr : transforms.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == NamingSystem.class || class_ == Resource.class || class_ == null) {
for (NamingSystem cr : systems.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == ValueSet.class || class_ == Resource.class || class_ == null) {
for (ValueSet cr : valueSets.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == CodeSystem.class || class_ == Resource.class || class_ == null) {
for (CodeSystem cr : codeSystems.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == ConceptMap.class || class_ == Resource.class || class_ == null) {
for (ConceptMap cr : maps.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == ActorDefinition.class || class_ == Resource.class || class_ == null) {
for (ActorDefinition cr : actors.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == Requirements.class || class_ == Resource.class || class_ == null) {
for (Requirements cr : requirements.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == PlanDefinition.class || class_ == Resource.class || class_ == null) {
for (PlanDefinition cr : plans.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == OperationDefinition.class || class_ == Resource.class || class_ == null) {
for (OperationDefinition cr : operations.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == Questionnaire.class || class_ == Resource.class || class_ == null) {
for (Questionnaire cr : questionnaires.getForUrl(uri)) {
res.add((T) cr);
}
} else if (class_ == SearchParameter.class || class_ == Resource.class || class_ == null) {
for (SearchParameter cr : searchParameters.getForUrl(uri)) {
res.add((T) cr);
}
}
}
}
return res;
}
} }

View File

@ -537,6 +537,16 @@ public class CanonicalResourceManager<T extends CanonicalResource> {
} }
} }
public List<T> getForUrl(String url) {
List<T> res = new ArrayList<>();
List<CanonicalResourceManager<T>.CachedCanonicalResource<T>> list = listForUrl.get(url);
if (list != null) {
for (CanonicalResourceManager<T>.CachedCanonicalResource<T> t : list) {
res.add(t.getResource());
}
}
return res;
}
/** /**
* This is asking for a packaged version aware resolution * This is asking for a packaged version aware resolution

View File

@ -47,6 +47,7 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
private List<StructureDefinition> allStructuresList = new ArrayList<StructureDefinition>(); private List<StructureDefinition> allStructuresList = new ArrayList<StructureDefinition>();
private List<String> canonicalResourceNames; private List<String> canonicalResourceNames;
private List<String> concreteResourceNames; private List<String> concreteResourceNames;
private Set<String> concreteResourceNameSet;
public ContextUtilities(IWorkerContext context) { public ContextUtilities(IWorkerContext context) {
super(); super();
@ -317,6 +318,9 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
@Override @Override
public boolean isResource(String t) { public boolean isResource(String t) {
if (getConcreteResourceSet().contains(t)) {
return true;
}
StructureDefinition sd; StructureDefinition sd;
try { try {
sd = context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+t); sd = context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+t);
@ -370,16 +374,22 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
return null; return null;
} }
public List<String> getConcreteResources() { public Set<String> getConcreteResourceSet() {
if (concreteResourceNames == null) { if (concreteResourceNameSet == null) {
concreteResourceNames = new ArrayList<>(); concreteResourceNameSet = new HashSet<>();
Set<String> names = new HashSet<>(); for (StructureDefinition sd : getStructures()) {
for (StructureDefinition sd : allStructures()) { if (sd.getKind() == StructureDefinitionKind.RESOURCE && !sd.getAbstract() && sd.getDerivation() == TypeDerivationRule.SPECIALIZATION) {
if (sd.getKind() == StructureDefinitionKind.RESOURCE && !sd.getAbstract()) { concreteResourceNameSet.add(sd.getType());
names.add(sd.getType());
} }
} }
concreteResourceNames.addAll(Utilities.sorted(names)); }
return concreteResourceNameSet;
}
public List<String> getConcreteResources() {
if (concreteResourceNames == null) {
concreteResourceNames = new ArrayList<>();
concreteResourceNames.addAll(Utilities.sorted(getConcreteResourceSet()));
} }
return concreteResourceNames; return concreteResourceNames;
} }

View File

@ -72,7 +72,6 @@ import org.hl7.fhir.r5.utils.validation.IResourceValidator;
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.FhirPublication;
import org.hl7.fhir.utilities.TimeTracker; import org.hl7.fhir.utilities.TimeTracker;
import org.hl7.fhir.utilities.TranslationServices;
import org.hl7.fhir.utilities.npm.BasePackageCacheManager; import org.hl7.fhir.utilities.npm.BasePackageCacheManager;
import org.hl7.fhir.utilities.npm.NpmPackage; import org.hl7.fhir.utilities.npm.NpmPackage;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
@ -191,6 +190,15 @@ public interface IWorkerContext {
public <T extends Resource> List<T> fetchResourcesByType(Class<T> class_, FhirPublication fhirVersion); public <T extends Resource> List<T> fetchResourcesByType(Class<T> class_, FhirPublication fhirVersion);
public <T extends Resource> List<T> fetchResourcesByType(Class<T> class_); public <T extends Resource> List<T> fetchResourcesByType(Class<T> class_);
/**
* Fetch all the resources for the given URL - all matching versions
*
* @param url
* @return
*/
public <T extends Resource> List<T> fetchResourcesByUrl(Class<T> class_, String url);
/** /**
* Variation of fetchResource when you have a string type, and don't need the right class * Variation of fetchResource when you have a string type, and don't need the right class
* *
@ -380,6 +388,8 @@ public interface IWorkerContext {
/** /**
* Access to the contexts internationalised error messages * Access to the contexts internationalised error messages
* *
* For rendering internationalization, see RenderingContext
*
* @param theMessage * @param theMessage
* @param theMessageArguments * @param theMessageArguments
* @return * @return
@ -497,7 +507,6 @@ public interface IWorkerContext {
// todo: figure these out // todo: figure these out
public Map<String, NamingSystem> getNSUrlMap(); public Map<String, NamingSystem> getNSUrlMap();
public TranslationServices translator();
public void setLogger(@Nonnull ILoggingService logger); public void setLogger(@Nonnull ILoggingService logger);
public ILoggingService getLogger(); public ILoggingService getLogger();
@ -640,4 +649,11 @@ public interface IWorkerContext {
public <T extends Resource> T findTxResource(Class<T> class_, String canonical); public <T extends Resource> T findTxResource(Class<T> class_, String canonical);
public <T extends Resource> T findTxResource(Class<T> class_, String canonical, String version); public <T extends Resource> T findTxResource(Class<T> class_, String canonical, String version);
/**
* ask the terminology system whether parent subsumes child.
*
* @return true if it does, false if it doesn't, and null if it's not know whether it does
*/
public Boolean subsumes(ValidationOptions options, Coding parent, Coding child);
} }

View File

@ -514,7 +514,7 @@ public class Element extends Base implements NamedItem {
} }
private boolean isDataType(Base v) { private boolean isDataType(Base v) {
return v instanceof DataType && new ContextUtilities(property.getContext()).getTypeNames().contains(v.fhirType()); return v instanceof DataType && property.getContextUtils().getTypeNames().contains(v.fhirType());
} }
@Override @Override
@ -1342,6 +1342,23 @@ public class Element extends Base implements NamedItem {
children.add(ne); children.add(ne);
return ne; return ne;
} }
// polymorphic support
if (p.getName().endsWith("[x]")) {
String base = p.getName().substring(0, p.getName().length()-3);
if (name.startsWith(base)) {
String type = name.substring(base.length());
if (p.getContextUtils().isPrimitiveType(Utilities.uncapitalize(type))) {
type = Utilities.uncapitalize(type);
}
if (p.canBeType(type)) {
Element ne = new Element(name, p).setFormat(format);
ne.setType(type);
children.add(ne);
return ne;
}
}
}
} }
throw new Error("Unrecognised property '"+name+"' on "+this.name); throw new Error("Unrecognised property '"+name+"' on "+this.name);
@ -1496,7 +1513,7 @@ public class Element extends Base implements NamedItem {
ext.addElement("valueCode").setValue(lang); ext.addElement("valueCode").setValue(lang);
ext = t.addElement("extension"); ext = t.addElement("extension");
ext.addElement("url").setValue("value"); ext.addElement("url").setValue("content");
ext.addElement("valueString").setValue(translation); ext.addElement("valueString").setValue(translation);
} }

View File

@ -134,7 +134,7 @@ public class FmlParser extends ParserBase {
lexer.token("conceptmap"); lexer.token("conceptmap");
Element map = structureMap.makeElement("contained"); Element map = structureMap.makeElement("contained");
StructureDefinition sd = context.fetchTypeDefinition("ConceptMap"); StructureDefinition sd = context.fetchTypeDefinition("ConceptMap");
map.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(map.getElementProperty() != null ? map.getElementProperty() : map.getProperty()), map.getProperty()); map.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities()), SpecialElement.fromProperty(map.getElementProperty() != null ? map.getElementProperty() : map.getProperty()), map.getProperty());
map.setType("ConceptMap"); map.setType("ConceptMap");
Element eid = map.makeElement("id").markLocation(lexer.getCurrentLocation()); Element eid = map.makeElement("id").markLocation(lexer.getCurrentLocation());
String id = lexer.readConstant("map id"); String id = lexer.readConstant("map id");
@ -225,6 +225,8 @@ public class FmlParser extends ParserBase {
String token = lexer.take(); String token = lexer.take();
if (token.equals("-")) if (token.equals("-"))
return ConceptMapRelationship.RELATEDTO; return ConceptMapRelationship.RELATEDTO;
if (token.equals("=")) // temporary
return ConceptMapRelationship.RELATEDTO;
if (token.equals("==")) if (token.equals("=="))
return ConceptMapRelationship.EQUIVALENT; return ConceptMapRelationship.EQUIVALENT;
if (token.equals("!=")) if (token.equals("!="))

View File

@ -86,22 +86,15 @@ public class JsonParser extends ParserBase {
private JsonCreator json; private JsonCreator json;
private boolean allowComments; private boolean allowComments;
private ProfileUtilities profileUtilities;
private Element baseElement; private Element baseElement;
private ContextUtilities contextUtilities;
public JsonParser(IWorkerContext context, ProfileUtilities utilities) { public JsonParser(IWorkerContext context, ProfileUtilities utilities) {
super(context); super(context, utilities);
this.profileUtilities = utilities;
contextUtilities = new ContextUtilities(context);
} }
public JsonParser(IWorkerContext context) { public JsonParser(IWorkerContext context) {
super(context); super(context);
this.profileUtilities = new ProfileUtilities(this.context, null, null, new FHIRPathEngine(context));
contextUtilities = new ContextUtilities(context);
} }
public Element parse(String source, String type) throws Exception { public Element parse(String source, String type) throws Exception {
@ -128,7 +121,7 @@ public class JsonParser extends ParserBase {
nEd.addType().setCode(type); nEd.addType().setCode(type);
nEd.setMax(obj.getProperties().get(0).getValue().isJsonArray() ? "*" : "1"); nEd.setMax(obj.getProperties().get(0).getValue().isJsonArray() ? "*" : "1");
} }
Element result = new Element(type, new Property(context, sd.getSnapshot().getElement().get(0), sd, this.profileUtilities)).setFormat(FhirFormat.JSON); Element result = new Element(type, new Property(context, sd.getSnapshot().getElement().get(0), sd, this.getProfileUtilities(), this.getContextUtilities())).setFormat(FhirFormat.JSON);
result.setPath(type); result.setPath(type);
checkObject(focusFragment.getErrors(), obj, result, path); checkObject(focusFragment.getErrors(), obj, result, path);
result.setType(type); result.setType(type);
@ -199,7 +192,7 @@ public class JsonParser extends ParserBase {
name = sd.getType(); name = sd.getType();
path = sd.getTypeTail(); path = sd.getTypeTail();
} }
baseElement = new Element(name, new Property(context, sd.getSnapshot().getElement().get(0), sd, this.profileUtilities)).setFormat(FhirFormat.JSON); baseElement = new Element(name, new Property(context, sd.getSnapshot().getElement().get(0), sd, this.getProfileUtilities(), this.getContextUtilities())).setFormat(FhirFormat.JSON);
checkObject(errors, object, baseElement, path); checkObject(errors, object, baseElement, path);
baseElement.markLocation(line(object), col(object)); baseElement.markLocation(line(object), col(object));
baseElement.setType(name); baseElement.setType(name);
@ -259,9 +252,9 @@ public class JsonParser extends ParserBase {
if (policy != ValidationPolicy.NONE) { if (policy != ValidationPolicy.NONE) {
for (JsonProperty e : children) { for (JsonProperty e : children) {
if (e.getTag() == 0) { if (e.getTag() == 0) {
StructureDefinition sd = element.getProperty().isLogical() ? contextUtilities.fetchByJsonName(e.getName()) : null; StructureDefinition sd = element.getProperty().isLogical() ? getContextUtilities().fetchByJsonName(e.getName()) : null;
if (sd != null) { if (sd != null) {
Property property = new Property(context, sd.getSnapshot().getElementFirstRep(), sd, element.getProperty().getUtils()); Property property = new Property(context, sd.getSnapshot().getElementFirstRep(), sd, element.getProperty().getUtils(), element.getProperty().getContextUtils());
parseChildItem(errors, path, children, element, property); parseChildItem(errors, path, children, element, property);
} else if ("fhir_comments".equals(e.getName()) && (VersionUtilities.isR2BVer(context.getVersion()) || VersionUtilities.isR2Ver(context.getVersion()))) { } else if ("fhir_comments".equals(e.getName()) && (VersionUtilities.isR2BVer(context.getVersion()) || VersionUtilities.isR2Ver(context.getVersion()))) {
if (!e.getValue().isJsonArray()) { if (!e.getValue().isJsonArray()) {
@ -341,7 +334,7 @@ public class JsonParser extends ParserBase {
if (type == null) { if (type == null) {
logError(errors, ValidationMessage.NO_RULE_DATE, line(je), col(je), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE, describeType(je), property.getName(), property.typeSummary()), IssueSeverity.ERROR); logError(errors, ValidationMessage.NO_RULE_DATE, line(je), col(je), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE, describeType(je), property.getName(), property.typeSummary()), IssueSeverity.ERROR);
} else if (property.hasType(type)) { } else if (property.hasType(type)) {
Property np = new Property(property.getContext(), property.getDefinition(), property.getStructure(), property.getUtils(), type); Property np = new Property(property.getContext(), property.getDefinition(), property.getStructure(), property.getUtils(), property.getContextUtils(), type);
parseChildPrimitive(errors, jp, getJsonPropertyByName("_"+property.getJsonName(), children), context, np, path, property.getName(), false); parseChildPrimitive(errors, jp, getJsonPropertyByName("_"+property.getJsonName(), children), context, np, path, property.getName(), false);
} else { } else {
logError(errors, ValidationMessage.NO_RULE_DATE, line(je), col(je), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE_WRONG, describeType(je), property.getName(), type, property.typeSummary()), IssueSeverity.ERROR); logError(errors, ValidationMessage.NO_RULE_DATE, line(je), col(je), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE_WRONG, describeType(je), property.getName(), type, property.typeSummary()), IssueSeverity.ERROR);
@ -474,7 +467,7 @@ public class JsonParser extends ParserBase {
if (type == null) { if (type == null) {
logError(errors, ValidationMessage.NO_RULE_DATE, line(pv.getValue()), col(pv.getValue()), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE, describeType(pv.getValue()), propV.getName(), propV.typeSummary()), IssueSeverity.ERROR); logError(errors, ValidationMessage.NO_RULE_DATE, line(pv.getValue()), col(pv.getValue()), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE, describeType(pv.getValue()), propV.getName(), propV.typeSummary()), IssueSeverity.ERROR);
} else if (propV.hasType(type)) { } else if (propV.hasType(type)) {
pvl = new Property(propV.getContext(), propV.getDefinition(), propV.getStructure(), propV.getUtils(), type); pvl = new Property(propV.getContext(), propV.getDefinition(), propV.getStructure(), propV.getUtils(), propV.getContextUtils(), type);
ok = true; ok = true;
} else { } else {
logError(errors, ValidationMessage.NO_RULE_DATE, line(pv.getValue()), col(pv.getValue()), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE_WRONG, describeType(pv.getValue()), propV.getName(), type, propV.typeSummary()), IssueSeverity.ERROR); logError(errors, ValidationMessage.NO_RULE_DATE, line(pv.getValue()), col(pv.getValue()), path, IssueType.STRUCTURE, this.context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_TYPE_WRONG, describeType(pv.getValue()), propV.getName(), type, propV.typeSummary()), IssueSeverity.ERROR);
@ -713,7 +706,7 @@ public class JsonParser extends ParserBase {
if (sd == null) { if (sd == null) {
logError(errors, ValidationMessage.NO_RULE_DATE, line(res), col(res), npath, IssueType.INVALID, context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, name), IssueSeverity.FATAL); logError(errors, ValidationMessage.NO_RULE_DATE, line(res), col(res), npath, IssueType.INVALID, context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, name), IssueSeverity.FATAL);
} else { } else {
parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd, this.profileUtilities), SpecialElement.fromProperty(parent.getProperty()), elementProperty); parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd, this.getProfileUtilities(), this.getContextUtilities()), SpecialElement.fromProperty(parent.getProperty()), elementProperty);
parent.setType(name); parent.setType(name);
parseChildren(errors, npath, res, parent, true, null); parseChildren(errors, npath, res, parent, true, null);
} }

View File

@ -9,12 +9,19 @@ import java.util.Set;
import org.checkerframework.checker.units.qual.cd; import org.checkerframework.checker.units.qual.cd;
import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.ContextUtilities;
import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.Base;
import org.hl7.fhir.r5.model.CodeSystem; import org.hl7.fhir.r5.model.CodeSystem;
import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent; import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent;
import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionDesignationComponent; import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionDesignationComponent;
import org.hl7.fhir.r5.model.CodeSystem.ConceptPropertyComponent; import org.hl7.fhir.r5.model.CodeSystem.ConceptPropertyComponent;
import org.hl7.fhir.r5.model.ContactDetail;
import org.hl7.fhir.r5.model.DataType; import org.hl7.fhir.r5.model.DataType;
import org.hl7.fhir.r5.model.ElementDefinition;
import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionBindingAdditionalComponent;
import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionConstraintComponent;
import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.model.Resource;
import org.hl7.fhir.r5.model.StringType;
import org.hl7.fhir.r5.model.StructureDefinition;
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities; import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
import org.hl7.fhir.utilities.TextFile; import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
@ -24,6 +31,10 @@ import org.hl7.fhir.utilities.i18n.LanguageFileProducer;
import org.hl7.fhir.utilities.i18n.LanguageFileProducer.LanguageProducerLanguageSession; import org.hl7.fhir.utilities.i18n.LanguageFileProducer.LanguageProducerLanguageSession;
import org.hl7.fhir.utilities.i18n.LanguageFileProducer.TextUnit; import org.hl7.fhir.utilities.i18n.LanguageFileProducer.TextUnit;
import org.hl7.fhir.utilities.i18n.LanguageFileProducer.TranslationUnit; import org.hl7.fhir.utilities.i18n.LanguageFileProducer.TranslationUnit;
import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
/** /**
* in here: * in here:
@ -78,7 +89,6 @@ public class LanguageUtils {
} }
} }
private String contextForElement(Element element) { private String contextForElement(Element element) {
throw new Error("Not done yet"); throw new Error("Not done yet");
} }
@ -110,7 +120,7 @@ public class LanguageUtils {
} }
private boolean isTranslatable(Element element) { private boolean isTranslatable(Element element) {
return element.getProperty().isTranslatable() && !Utilities.existsInList(pathForElement(element), "CanonicalResource.version"); return element.getProperty().isTranslatable();
} }
private String pathForElement(Element element) { private String pathForElement(Element element) {
@ -132,11 +142,85 @@ public class LanguageUtils {
return bp; return bp;
} }
public int importFromTranslations(Element resource, Set<TranslationUnit> translations) {
return importFromTranslations(null, resource, translations); public int importFromTranslations(Element resource, List<TranslationUnit> translations) {
return importFromTranslations(null, resource, translations, new HashSet<>());
} }
private int importFromTranslations(Element parent, Element element, Set<TranslationUnit> translations) { public int importFromTranslations(Element resource, List<TranslationUnit> translations, List<ValidationMessage> messages) {
Set<TranslationUnit> usedUnits = new HashSet<>();
int r = 0;
if (resource.fhirType().equals("StructureDefinition")) {
r = importFromTranslationsForSD(null, resource, translations, usedUnits);
} else {
r = importFromTranslations(null, resource, translations, usedUnits);
}
for (TranslationUnit t : translations) {
if (!usedUnits.contains(t)) {
messages.add(new ValidationMessage(Source.Publisher, IssueType.INFORMATIONAL, t.getId(), "Unused '"+t.getLanguage()+"' translation '"+t.getSrcText()+"' -> '"+t.getTgtText()+"'", IssueSeverity.INFORMATION));
}
}
return r;
}
/*
* */
private int importFromTranslationsForSD(Object object, Element resource, List<TranslationUnit> translations, Set<TranslationUnit> usedUnits) {
int r = 0;
r = r + checkForTranslations(translations, usedUnits, resource, "name", "name");
r = r + checkForTranslations(translations, usedUnits, resource, "title", "title");
r = r + checkForTranslations(translations, usedUnits, resource, "publisher", "publisher");
for (Element cd : resource.getChildrenByName("contact")) {
r = r + checkForTranslations(translations, usedUnits, cd, "contact.name", "name");
}
r = r + checkForTranslations(translations, usedUnits, resource, "purpose", "purpose");
r = r + checkForTranslations(translations, usedUnits, resource, "copyright", "copyright");
Element diff = resource.getNamedChild("differential");
if (diff != null) {
for (Element ed : diff.getChildrenByName("element")) {
String id = ed.getNamedChildValue("id");
r = r + checkForTranslations(translations, usedUnits, ed, id+"/label", "label");
r = r + checkForTranslations(translations, usedUnits, ed, id+"/short", "short");
r = r + checkForTranslations(translations, usedUnits, ed, id+"/definition", "definition");
r = r + checkForTranslations(translations, usedUnits, ed, id+"/comment", "comment");
r = r + checkForTranslations(translations, usedUnits, ed, id+"/requirements", "requirements");
r = r + checkForTranslations(translations, usedUnits, ed, id+"/meaningWhenMissing", "meaningWhenMissing");
r = r + checkForTranslations(translations, usedUnits, ed, id+"/orderMeaning", "orderMeaning");
// for (ElementDefinitionConstraintComponent con : ed.getConstraint()) {
// addToList(list, lang, con, ed.getId()+"/constraint", "human", con.getHumanElement());
// }
// if (ed.hasBinding()) {
// addToList(list, lang, ed.getBinding(), ed.getId()+"/b/desc", "description", ed.getBinding().getDescriptionElement());
// for (ElementDefinitionBindingAdditionalComponent ab : ed.getBinding().getAdditional()) {
// addToList(list, lang, ab, ed.getId()+"/ab/doco", "documentation", ab.getDocumentationElement());
// addToList(list, lang, ab, ed.getId()+"/ab/short", "shortDoco", ab.getShortDocoElement());
// }
// }
}
}
return r;
}
private int checkForTranslations(List<TranslationUnit> translations, Set<TranslationUnit> usedUnits, Element context, String tname, String pname) {
int r = 0;
Element child = context.getNamedChild(pname);
if (child != null) {
String v = child.primitiveValue();
if (v != null) {
for (TranslationUnit tu : translations) {
if (tname.equals(tu.getId()) && v.equals(tu.getSrcText())) {
usedUnits.add(tu);
child.setTranslation(tu.getLanguage(), tu.getTgtText());
r++;
}
}
}
}
return r;
}
private int importFromTranslations(Element parent, Element element, List<TranslationUnit> translations, Set<TranslationUnit> usedUnits) {
int t = 0; int t = 0;
if (element.isPrimitive() && isTranslatable(element)) { if (element.isPrimitive() && isTranslatable(element)) {
String base = element.primitiveValue(); String base = element.primitiveValue();
@ -146,13 +230,14 @@ public class LanguageUtils {
t++; t++;
if (!handleAsSpecial(parent, element, translation)) { if (!handleAsSpecial(parent, element, translation)) {
element.setTranslation(translation.getLanguage(), translation.getTgtText()); element.setTranslation(translation.getLanguage(), translation.getTgtText());
usedUnits.add(translation);
} }
} }
} }
} }
for (Element c: element.getChildren()) { for (Element c: element.getChildren()) {
if (!c.getName().equals("designation")) { if (!c.getName().equals("designation")) {
t = t + importFromTranslations(element, c, translations); t = t + importFromTranslations(element, c, translations, usedUnits);
} }
} }
return t; return t;
@ -193,7 +278,7 @@ public class LanguageUtils {
return true; return true;
} }
private Set<TranslationUnit> findTranslations(String path, String src, Set<TranslationUnit> translations) { private Set<TranslationUnit> findTranslations(String path, String src, List<TranslationUnit> translations) {
Set<TranslationUnit> res = new HashSet<>(); Set<TranslationUnit> res = new HashSet<>();
for (TranslationUnit translation : translations) { for (TranslationUnit translation : translations) {
if (path.equals(translation.getId()) && src.equals(translation.getSrcText())) { if (path.equals(translation.getId()) && src.equals(translation.getSrcText())) {
@ -290,22 +375,64 @@ public class LanguageUtils {
} }
public static boolean handlesAsResource(Resource resource) { public static boolean handlesAsResource(Resource resource) {
return (resource instanceof CodeSystem && resource.hasUserData(SUPPLEMENT_NAME)); return (resource instanceof CodeSystem && resource.hasUserData(SUPPLEMENT_NAME)) || (resource instanceof StructureDefinition);
} }
public static boolean handlesAsElement(Element element) { public static boolean handlesAsElement(Element element) {
return false; // for now... return true; // for now...
} }
public static List<TranslationUnit> generateTranslations(Resource res, String lang) { public static List<TranslationUnit> generateTranslations(Resource res, String lang) {
List<TranslationUnit> list = new ArrayList<>(); List<TranslationUnit> list = new ArrayList<>();
CodeSystem cs = (CodeSystem) res; if (res instanceof StructureDefinition) {
for (ConceptDefinitionComponent cd : cs.getConcept()) { StructureDefinition sd = (StructureDefinition) res;
generateTranslations(list, cd, lang); generateTranslations(list, sd, lang);
} else {
CodeSystem cs = (CodeSystem) res;
for (ConceptDefinitionComponent cd : cs.getConcept()) {
generateTranslations(list, cd, lang);
}
} }
return list; return list;
} }
private static void generateTranslations(List<TranslationUnit> list, StructureDefinition sd, String lang) {
addToList(list, lang, sd, "name", "name", sd.getNameElement());
addToList(list, lang, sd, "title", "title", sd.getTitleElement());
addToList(list, lang, sd, "publisher", "publisher", sd.getPublisherElement());
for (ContactDetail cd : sd.getContact()) {
addToList(list, lang, cd, "contact.name", "name", cd.getNameElement());
}
addToList(list, lang, sd, "purpose", "purpose", sd.getPurposeElement());
addToList(list, lang, sd, "copyright", "copyright", sd.getCopyrightElement());
for (ElementDefinition ed : sd.getDifferential().getElement()) {
addToList(list, lang, ed, ed.getId()+"/label", "label", ed.getLabelElement());
addToList(list, lang, ed, ed.getId()+"/short", "short", ed.getShortElement());
addToList(list, lang, ed, ed.getId()+"/definition", "definition", ed.getDefinitionElement());
addToList(list, lang, ed, ed.getId()+"/comment", "comment", ed.getCommentElement());
addToList(list, lang, ed, ed.getId()+"/requirements", "requirements", ed.getRequirementsElement());
addToList(list, lang, ed, ed.getId()+"/meaningWhenMissing", "meaningWhenMissing", ed.getMeaningWhenMissingElement());
addToList(list, lang, ed, ed.getId()+"/orderMeaning", "orderMeaning", ed.getOrderMeaningElement());
for (ElementDefinitionConstraintComponent con : ed.getConstraint()) {
addToList(list, lang, con, ed.getId()+"/constraint", "human", con.getHumanElement());
}
if (ed.hasBinding()) {
addToList(list, lang, ed.getBinding(), ed.getId()+"/b/desc", "description", ed.getBinding().getDescriptionElement());
for (ElementDefinitionBindingAdditionalComponent ab : ed.getBinding().getAdditional()) {
addToList(list, lang, ab, ed.getId()+"/ab/doco", "documentation", ab.getDocumentationElement());
addToList(list, lang, ab, ed.getId()+"/ab/short", "shortDoco", ab.getShortDocoElement());
}
}
}
}
private static void addToList(List<TranslationUnit> list, String lang, Base ctxt, String name, String propName, DataType value) {
if (value != null && value.hasPrimitiveValue()) {
list.add(new TranslationUnit(lang, name, ctxt.getNamedProperty(propName).getDefinition(), value.primitiveValue(), value.getTranslation(lang)));
}
}
private static void generateTranslations(List<TranslationUnit> list, ConceptDefinitionComponent cd, String lang) { private static void generateTranslations(List<TranslationUnit> list, ConceptDefinitionComponent cd, String lang) {
String code = cd.getCode(); String code = cd.getCode();
String display = cd.getDisplay(); String display = cd.getDisplay();
@ -334,4 +461,51 @@ public class LanguageUtils {
return cd.getDefinition(); return cd.getDefinition();
} }
} }
public static List<TranslationUnit> generateTranslations(Element e, String lang) {
List<TranslationUnit> list = new ArrayList<>();
generateTranslations(e, lang, list);
return list;
}
private static void generateTranslations(Element e, String lang, List<TranslationUnit> list) {
if (e.getProperty().isTranslatable()) {
String id = e.getProperty().getDefinition().getPath();
String context = e.getProperty().getDefinition().getDefinition();
String src = e.primitiveValue();
String tgt = getTranslation(e, lang);
list.add(new TranslationUnit(lang, id, context, src, tgt));
}
if (e.hasChildren()) {
for (Element c : e.getChildren()) {
generateTranslations(c, lang, list);
}
}
}
private static String getTranslation(Element e, String lang) {
if (!e.hasChildren()) {
return null;
}
for (Element ext : e.getChildren()) {
if ("Extension".equals(ext.fhirType()) && "http://hl7.org/fhir/StructureDefinition/translation".equals(ext.getNamedChildValue("url"))) {
String l = null;
String v = null;
for (Element subExt : ext.getChildren()) {
if ("Extension".equals(subExt.fhirType()) && "lang".equals(subExt.getNamedChildValue("url"))) {
l = subExt.getNamedChildValue("value");
}
if ("Extension".equals(subExt.fhirType()) && "content".equals(subExt.getNamedChildValue("url"))) {
v = subExt.getNamedChildValue("value");
}
}
if (lang.equals(l)) {
return v;
}
}
}
return null;
}
} }

View File

@ -39,8 +39,10 @@ import java.util.List;
import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.DefinitionException;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.exceptions.FHIRFormatError;
import org.hl7.fhir.r5.conformance.profile.ProfileUtilities;
import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.ContextUtilities;
import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.fhirpath.FHIRPathEngine;
import org.hl7.fhir.r5.formats.FormatUtilities; import org.hl7.fhir.r5.formats.FormatUtilities;
import org.hl7.fhir.r5.formats.IParser.OutputStyle; import org.hl7.fhir.r5.formats.IParser.OutputStyle;
import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.model.StructureDefinition;
@ -89,14 +91,26 @@ public abstract class ParserBase {
protected IdRenderingPolicy idPolicy = IdRenderingPolicy.All; protected IdRenderingPolicy idPolicy = IdRenderingPolicy.All;
protected StructureDefinition logical; protected StructureDefinition logical;
protected IDigitalSignatureServices signatureServices; protected IDigitalSignatureServices signatureServices;
private ProfileUtilities profileUtilities;
private ContextUtilities contextUtilities;
public ParserBase(IWorkerContext context) { public ParserBase(IWorkerContext context, ProfileUtilities utilities) {
super(); super();
this.context = context; this.context = context;
this.profileUtilities = utilities;
contextUtilities = new ContextUtilities(context);
policy = ValidationPolicy.NONE; policy = ValidationPolicy.NONE;
} }
public void setupValidation(ValidationPolicy policy) { public ParserBase(IWorkerContext context) {
super();
this.context = context;
this.profileUtilities = new ProfileUtilities(context, null, null, new FHIRPathEngine(context));
contextUtilities = new ContextUtilities(context);
policy = ValidationPolicy.NONE;
}
public void setupValidation(ValidationPolicy policy) {
this.policy = policy; this.policy = policy;
} }
@ -215,19 +229,19 @@ public abstract class ParserBase {
// first pass: only look at base definitions // first pass: only look at base definitions
for (StructureDefinition sd : context.fetchResourcesByType(StructureDefinition.class)) { for (StructureDefinition sd : context.fetchResourcesByType(StructureDefinition.class)) {
if (sd.getUrl().equals("http://hl7.org/fhir/StructureDefinition/"+name)) { if (sd.getUrl().equals("http://hl7.org/fhir/StructureDefinition/"+name)) {
new ContextUtilities(context).generateSnapshot(sd); contextUtilities.generateSnapshot(sd);
return sd; return sd;
} }
} }
for (StructureDefinition sd : context.fetchResourcesByType(StructureDefinition.class)) { for (StructureDefinition sd : context.fetchResourcesByType(StructureDefinition.class)) {
if (name.equals(sd.getTypeName()) && sd.getDerivation() == TypeDerivationRule.SPECIALIZATION) { if (name.equals(sd.getTypeName()) && sd.getDerivation() == TypeDerivationRule.SPECIALIZATION) {
new ContextUtilities(context).generateSnapshot(sd); contextUtilities.generateSnapshot(sd);
return sd; return sd;
} }
} }
for (StructureDefinition sd : context.fetchResourcesByType(StructureDefinition.class)) { for (StructureDefinition sd : context.fetchResourcesByType(StructureDefinition.class)) {
if (name.equals(sd.getUrl()) && sd.getDerivation() == TypeDerivationRule.SPECIALIZATION) { if (name.equals(sd.getUrl()) && sd.getDerivation() == TypeDerivationRule.SPECIALIZATION) {
new ContextUtilities(context).generateSnapshot(sd); contextUtilities.generateSnapshot(sd);
return sd; return sd;
} }
} }
@ -304,4 +318,22 @@ public abstract class ParserBase {
return element.getNamedChildValue("reference"); return element.getNamedChildValue("reference");
} }
} }
public IWorkerContext getContext() {
return context;
}
public ValidationPolicy getPolicy() {
return policy;
}
public ProfileUtilities getProfileUtilities() {
return profileUtilities;
}
public ContextUtilities getContextUtilities() {
return contextUtilities;
}
} }

View File

@ -38,6 +38,7 @@ import org.hl7.fhir.exceptions.DefinitionException;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities;
import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.SourcedChildDefinitions; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.SourcedChildDefinitions;
import org.hl7.fhir.r5.context.ContextUtilities;
import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.fhirpath.TypeDetails; import org.hl7.fhir.r5.fhirpath.TypeDetails;
import org.hl7.fhir.r5.formats.FormatUtilities; import org.hl7.fhir.r5.formats.FormatUtilities;
@ -60,21 +61,24 @@ public class Property {
private ElementDefinition definition; private ElementDefinition definition;
private StructureDefinition structure; private StructureDefinition structure;
private ProfileUtilities profileUtilities; private ProfileUtilities profileUtilities;
private ContextUtilities utils;
private TypeRefComponent type; private TypeRefComponent type;
public Property(IWorkerContext context, ElementDefinition definition, StructureDefinition structure, ProfileUtilities profileUtilities) { public Property(IWorkerContext context, ElementDefinition definition, StructureDefinition structure, ProfileUtilities profileUtilities, ContextUtilities utils) {
this.context = context; this.context = context;
this.definition = definition; this.definition = definition;
this.structure = structure; this.structure = structure;
this.utils = utils;
this.profileUtilities = profileUtilities; this.profileUtilities = profileUtilities;
} }
public Property(IWorkerContext context, ElementDefinition definition, StructureDefinition structure, ProfileUtilities profileUtilities, String type) { public Property(IWorkerContext context, ElementDefinition definition, StructureDefinition structure, ProfileUtilities profileUtilities, ContextUtilities utils, String type) {
this.context = context; this.context = context;
this.definition = definition; this.definition = definition;
this.structure = structure; this.structure = structure;
this.profileUtilities = profileUtilities; this.profileUtilities = profileUtilities;
this.utils = utils;
for (TypeRefComponent tr : definition.getType()) { for (TypeRefComponent tr : definition.getType()) {
if (tr.getWorkingCode().equals(type)) { if (tr.getWorkingCode().equals(type)) {
this.type = tr; this.type = tr;
@ -83,7 +87,7 @@ public class Property {
} }
public Property(IWorkerContext context, ElementDefinition definition, StructureDefinition structure) { public Property(IWorkerContext context, ElementDefinition definition, StructureDefinition structure) {
this(context, definition, structure, new ProfileUtilities(context, null, null)); this(context, definition, structure, new ProfileUtilities(context, null, null), new ContextUtilities(context));
} }
public String getName() { public String getName() {
@ -265,10 +269,10 @@ public class Property {
public boolean isResource() { public boolean isResource() {
if (type != null) { if (type != null) {
String tc = type.getCode(); String tc = type.getCode();
return (("Resource".equals(tc) || "DomainResource".equals(tc)) || Utilities.existsInList(tc, context.getResourceNames())); return (("Resource".equals(tc) || "DomainResource".equals(tc)) || utils.isResource(tc));
} else if (definition.getType().size() > 0) { } else if (definition.getType().size() > 0) {
String tc = definition.getType().get(0).getCode(); String tc = definition.getType().get(0).getCode();
return definition.getType().size() == 1 && (("Resource".equals(tc) || "DomainResource".equals(tc)) || Utilities.existsInList(tc, context.getResourceNames())); return definition.getType().size() == 1 && (("Resource".equals(tc) || "DomainResource".equals(tc)) || utils.isResource(tc));
} }
else { else {
return !definition.getPath().contains(".") && (structure.getKind() == StructureDefinitionKind.RESOURCE); return !definition.getPath().contains(".") && (structure.getKind() == StructureDefinitionKind.RESOURCE);
@ -425,7 +429,7 @@ public class Property {
} }
List<Property> properties = new ArrayList<Property>(); List<Property> properties = new ArrayList<Property>();
for (ElementDefinition child : children.getList()) { for (ElementDefinition child : children.getList()) {
properties.add(new Property(context, child, sd, this.profileUtilities)); properties.add(new Property(context, child, sd, this.profileUtilities, this.utils));
} }
profileUtilities.getCachedPropertyList().put(cacheKey, properties); profileUtilities.getCachedPropertyList().put(cacheKey, properties);
return properties; return properties;
@ -485,7 +489,7 @@ public class Property {
} }
List<Property> properties = new ArrayList<Property>(); List<Property> properties = new ArrayList<Property>();
for (ElementDefinition child : children.getList()) { for (ElementDefinition child : children.getList()) {
properties.add(new Property(context, child, sd, this.profileUtilities)); properties.add(new Property(context, child, sd, this.profileUtilities, this.utils));
} }
return properties; return properties;
} }
@ -613,6 +617,9 @@ public class Property {
public ProfileUtilities getUtils() { public ProfileUtilities getUtils() {
return profileUtilities; return profileUtilities;
} }
public ContextUtilities getContextUtils() {
return utils;
}
public boolean isJsonPrimitiveChoice() { public boolean isJsonPrimitiveChoice() {
return ToolingExtensions.readBoolExtension(definition, ToolingExtensions.EXT_JSON_PRIMITIVE_CHOICE); return ToolingExtensions.readBoolExtension(definition, ToolingExtensions.EXT_JSON_PRIMITIVE_CHOICE);
@ -634,14 +641,32 @@ public class Property {
public boolean isTranslatable() { public boolean isTranslatable() {
boolean ok = ToolingExtensions.readBoolExtension(definition, ToolingExtensions.EXT_TRANSLATABLE); boolean ok = ToolingExtensions.readBoolExtension(definition, ToolingExtensions.EXT_TRANSLATABLE);
if (!ok && !Utilities.existsInList(definition.getBase().getPath(), "Reference.reference", "Coding.version", "Identifier.value", "SampledData.offsets", "SampledData.data", "ContactPoint.value")) { if (!ok && !definition.getPath().endsWith(".id") && !Utilities.existsInList(definition.getBase().getPath(), "Resource.id", "Reference.reference", "Coding.version", "Identifier.value", "SampledData.offsets", "SampledData.data", "ContactPoint.value")) {
String t = getType(); String t = getType();
ok = Utilities.existsInList(t, "string", "markdown"); ok = Utilities.existsInList(t, "string", "markdown");
} }
if (Utilities.existsInList(pathForElement(getStructure().getType(), getDefinition().getBase().getPath()), "CanonicalResource.version")) {
return false;
}
return ok; return ok;
} }
private String pathForElement(String type, String path) {
// special case support for metadata elements prior to R5:
if (utils.getCanonicalResourceNames().contains(type)) {
String fp = path.replace(type+".", "CanonicalResource.");
if (Utilities.existsInList(fp,
"CanonicalResource.url", "CanonicalResource.identifier", "CanonicalResource.version", "CanonicalResource.name",
"CanonicalResource.title", "CanonicalResource.status", "CanonicalResource.experimental", "CanonicalResource.date",
"CanonicalResource.publisher", "CanonicalResource.contact", "CanonicalResource.description", "CanonicalResource.useContext",
"CanonicalResource.jurisdiction")) {
return fp;
}
}
return path;
}
public String getXmlTypeName() { public String getXmlTypeName() {
TypeRefComponent tr = type; TypeRefComponent tr = type;
if (tr == null) { if (tr == null) {
@ -671,4 +696,14 @@ public class Property {
} }
public boolean canBeType(String type) {
for (TypeRefComponent tr : getDefinition().getType()) {
if (type.equals(tr.getWorkingCode())) {
return true;
}
}
return false;
}
} }

View File

@ -50,7 +50,7 @@ public class ResourceParser extends ParserBase {
if (sd == null) { if (sd == null) {
throw new FHIRException("No definition exists for "+resource.fhirType()); throw new FHIRException("No definition exists for "+resource.fhirType());
} }
Property p = new Property(context, sd.getSnapshot().getElement().get(0), sd, new ProfileUtilities(context, null, null)); Property p = new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities());
String path = resource.fhirType(); String path = resource.fhirType();
Element e = new Element(resource.fhirType(), p); Element e = new Element(resource.fhirType(), p);
@ -106,7 +106,7 @@ public class ResourceParser extends ParserBase {
StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(v.fhirType(), null)); StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(v.fhirType(), null));
if (sd == null) if (sd == null)
throw new FHIRFormatError(context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, v.fhirType())); throw new FHIRFormatError(context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, v.fhirType()));
n.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(n.getProperty()), p); n.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities()), SpecialElement.fromProperty(n.getProperty()), p);
n.setType(v.fhirType()); n.setType(v.fhirType());
parseChildren(npath, v, n); parseChildren(npath, v, n);
} else { } else {

View File

@ -151,7 +151,7 @@ public class TurtleParser extends ParserBase {
if (sd == null) if (sd == null)
return null; return null;
Element result = new Element(name, new Property(context, sd.getSnapshot().getElement().get(0), sd)).setFormat(FhirFormat.TURTLE); Element result = new Element(name, new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities())).setFormat(FhirFormat.TURTLE);
result.markLocation(cmp.getLine(), cmp.getCol()); result.markLocation(cmp.getLine(), cmp.getCol());
result.setType(name); result.setType(name);
parseChildren(errors, src, path, cmp, result, false); parseChildren(errors, src, path, cmp, result, false);
@ -279,7 +279,7 @@ public class TurtleParser extends ParserBase {
Element n = new Element(tail(name), property).markLocation(object.getLine(), object.getCol()).setFormat(FhirFormat.TURTLE); Element n = new Element(tail(name), property).markLocation(object.getLine(), object.getCol()).setFormat(FhirFormat.TURTLE);
element.getChildren().add(n); element.getChildren().add(n);
n.updateProperty(new Property(this.context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(n.getProperty()), property); n.updateProperty(new Property(this.context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities()), SpecialElement.fromProperty(n.getProperty()), property);
n.setType(rt); n.setType(rt);
parseChildren(errors, src, npath, obj, n, false); parseChildren(errors, src, npath, obj, n, false);
} }

View File

@ -456,7 +456,7 @@ public class VerticalBarParser extends ParserBase {
@Override @Override
public List<ValidatedFragment> parse(InputStream inStream) throws IOException, FHIRFormatError, DefinitionException, FHIRException { public List<ValidatedFragment> parse(InputStream inStream) throws IOException, FHIRFormatError, DefinitionException, FHIRException {
StructureDefinition sd = context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/v2/StructureDefinition/Message"); StructureDefinition sd = context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/v2/StructureDefinition/Message");
Element message = new Element("Message", new Property(context, sd.getSnapshot().getElementFirstRep(), sd)); Element message = new Element("Message", new Property(context, sd.getSnapshot().getElementFirstRep(), sd, getProfileUtilities(), getContextUtilities()));
byte[] content = TextFile.streamToBytes(inStream); byte[] content = TextFile.streamToBytes(inStream);
ByteArrayInputStream stream = new ByteArrayInputStream(content); ByteArrayInputStream stream = new ByteArrayInputStream(content);
VerticalBarParserReader reader = new VerticalBarParserReader(new BufferedInputStream(stream), charset); VerticalBarParserReader reader = new VerticalBarParserReader(new BufferedInputStream(stream), charset);

View File

@ -231,7 +231,7 @@ public class XmlParser extends ParserBase {
if (sd == null) if (sd == null)
return null; return null;
Element result = new Element(element.getLocalName(), new Property(context, sd.getSnapshot().getElement().get(0), sd)).setFormat(FhirFormat.XML); Element result = new Element(element.getLocalName(), new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities())).setFormat(FhirFormat.XML);
result.setPath(element.getLocalName()); result.setPath(element.getLocalName());
checkElement(errors, element, result, path, result.getProperty(), false); checkElement(errors, element, result, path, result.getProperty(), false);
result.markLocation(line(element, false), col(element, false)); result.markLocation(line(element, false), col(element, false));
@ -321,7 +321,7 @@ public class XmlParser extends ParserBase {
public Element parse(List<ValidationMessage> errors, org.w3c.dom.Element base, String type) throws Exception { public Element parse(List<ValidationMessage> errors, org.w3c.dom.Element base, String type) throws Exception {
StructureDefinition sd = getDefinition(errors, 0, 0, FormatUtilities.FHIR_NS, type); StructureDefinition sd = getDefinition(errors, 0, 0, FormatUtilities.FHIR_NS, type);
Element result = new Element(base.getLocalName(), new Property(context, sd.getSnapshot().getElement().get(0), sd)).setFormat(FhirFormat.XML).setNativeObject(base); Element result = new Element(base.getLocalName(), new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities())).setFormat(FhirFormat.XML).setNativeObject(base);
result.setPath(base.getLocalName()); result.setPath(base.getLocalName());
String path = "/"+pathPrefix(base.getNamespaceURI())+base.getLocalName(); String path = "/"+pathPrefix(base.getNamespaceURI())+base.getLocalName();
checkElement(errors, base, result, path, result.getProperty(), false); checkElement(errors, base, result, path, result.getProperty(), false);
@ -662,7 +662,7 @@ public class XmlParser extends ParserBase {
StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(name, null)); StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(name, null));
if (sd == null) if (sd == null)
throw new FHIRFormatError(context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, res.getLocalName())); throw new FHIRFormatError(context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, res.getLocalName()));
parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(parent.getProperty()), elementProperty); parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities()), SpecialElement.fromProperty(parent.getProperty()), elementProperty);
parent.setType(name); parent.setType(name);
parseChildren(errors, res.getLocalName(), res, parent); parseChildren(errors, res.getLocalName(), res, parent);
} }

View File

@ -3253,7 +3253,7 @@ public class FHIRPathEngine {
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_Boolean); return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_Boolean);
} }
case SubsetOf : { case SubsetOf : {
checkParamTypes(exp, exp.getFunction().toCode(), paramTypes, focus); checkParamTypes(exp, exp.getFunction().toCode(), paramTypes, focus.toUnordered());
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_Boolean); return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_Boolean);
} }
case SupersetOf : { case SupersetOf : {

View File

@ -405,6 +405,16 @@ public class TypeDetails {
result.types.addAll(types); result.types.addAll(types);
return result; return result;
} }
public TypeDetails toOrdered() {
TypeDetails result = new TypeDetails(CollectionStatus.ORDERED);
result.types.addAll(types);
return result;
}
public TypeDetails toUnordered() {
TypeDetails result = new TypeDetails(CollectionStatus.UNORDERED);
result.types.addAll(types);
return result;
}
public CollectionStatus getCollectionStatus() { public CollectionStatus getCollectionStatus() {
return collectionStatus; return collectionStatus;
} }

View File

@ -107,7 +107,7 @@ public abstract class FormatUtilities {
} }
public static boolean isValidId(String tail) { public static boolean isValidId(String tail) {
return tail.matches(ID_REGEX); return tail == null ? false : tail.matches(ID_REGEX);
} }
public static String makeId(String candidate) { public static String makeId(String candidate) {

View File

@ -596,6 +596,9 @@ public abstract class CanonicalResource extends DomainResource {
} }
public String present() { public String present() {
if (hasUserData("presentation")) {
return getUserString("presentation");
}
if (hasTitle()) if (hasTitle())
return getTitle(); return getTitle();
if (hasName()) if (hasName())

View File

@ -563,7 +563,26 @@ public class Coding extends DataType implements IBaseCoding, ICompositeType, ICo
if (hasDisplay()) if (hasDisplay())
base = base+": '"+getDisplay()+"'"; base = base+": '"+getDisplay()+"'";
return base; return base;
}
public static Coding fromLiteral(String value) {
String sv = value.contains("#") ? value.substring(0, value.indexOf("#")) : value;
String cp = value.contains("#") ? value.substring(value.indexOf("#")+1) : null;
String system = sv.contains("|") ? sv.substring(0, sv.indexOf("|")) : sv;
String version = sv.contains("|") ? sv.substring(sv.indexOf("|")+1) : null;
String code = cp != null && cp.contains("'") ? cp.substring(0, cp.indexOf("'")) : cp;
String display = cp != null && cp.contains("'") ? cp.substring(cp.indexOf("'")+1) : null;
if (display != null) {
display = display.trim();
display = display.substring(0, display.length() -1);
}
if ((system == null || !Utilities.isAbsoluteUrl(system)) && code == null) {
return null;
} else {
return new Coding(system, version, code, display);
}
} }
public boolean matches(Coding other) { public boolean matches(Coding other) {
@ -629,5 +648,9 @@ public class Coding extends DataType implements IBaseCoding, ICompositeType, ICo
} }
// end addition // end addition
public String getVersionedSystem() {
return hasVersion() ? getSystem()+"|"+getVersion() : getSystem();
}
} }

View File

@ -1777,10 +1777,24 @@ public class ConceptMap extends MetadataResource {
} }
public SourceElementComponent getOrAddElement(String code) {
for (SourceElementComponent e : getElement()) {
if (code.equals(e.getCode())) {
return e;
}
}
return addElement().setCode(code);
}
} }
@Block() @Block()
public static class SourceElementComponent extends BackboneElement implements IBaseBackboneElement { public static class SourceElementComponent extends BackboneElement implements IBaseBackboneElement {
@Override
public String toString() {
return "SourceElementComponent [code=" + code + ", display=" + display + ", noMap=" + noMap + "]";
}
/** /**
* Identity (code or path) or the element/item being mapped. * Identity (code or path) or the element/item being mapped.
*/ */
@ -2260,10 +2274,30 @@ public class ConceptMap extends MetadataResource {
} }
public boolean hasTargetCode(String code) {
for (TargetElementComponent tgt : getTarget()) {
if (code.equals(tgt.getCode())) {
return true;
}
}
return false;
}
public TargetElementComponent addTarget(String code, ConceptMapRelationship relationship) {
TargetElementComponent tgt = addTarget();
tgt.setCode(code);
tgt.setRelationship(relationship);
return tgt;
}
} }
@Block() @Block()
public static class TargetElementComponent extends BackboneElement implements IBaseBackboneElement { public static class TargetElementComponent extends BackboneElement implements IBaseBackboneElement {
@Override
public String toString() {
return "TargetElementComponent [code=" + code + ", relationship=" + relationship + "]";
}
/** /**
* Identity (code or path) or the element/item that the map refers to. * Identity (code or path) or the element/item that the map refers to.
*/ */
@ -8572,7 +8606,42 @@ public class ConceptMap extends MetadataResource {
private String tail(String uri) { private String tail(String uri) {
return uri.contains("/") ? uri.substring(uri.lastIndexOf("/")+1) : uri; return uri.contains("/") ? uri.substring(uri.lastIndexOf("/")+1) : uri;
} }
public ConceptMapGroupComponent getGroup(String su, String tu) {
for (ConceptMapGroupComponent g : getGroup()) {
if (su.equals(g.getSource()) && tu.equals(g.getTarget())) {
return g;
}
}
return null;
}
public ConceptMapGroupComponent forceGroup(String su, String tu) {
for (ConceptMapGroupComponent g : getGroup()) {
if (su.equals(g.getSource()) && tu.equals(g.getTarget())) {
return g;
}
}
ConceptMapGroupComponent g = addGroup();
g.setSource(su);
g.setTarget(tu);
return g;
}
public List<ConceptMapGroupComponent> getGroups(String su) {
List<ConceptMapGroupComponent> res = new ArrayList<>();
for (ConceptMapGroupComponent g : getGroup()) {
if (su.equals(g.getSource())) {
res.add(g);
}
}
return res;
}
// end addition // end addition
} }

View File

@ -8,12 +8,12 @@ package org.hl7.fhir.r5.model;
Redistribution and use in source and binary forms, with or without modification, \ Redistribution and use in source and binary forms, with or without modification, \
are permitted provided that the following conditions are met: are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this \ * Redistributions of source code must retain the above copyright notice, this \
list of conditions and the following disclaimer. list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, \ * Redistributions in binary form must reproduce the above copyright notice, \
this list of conditions and the following disclaimer in the documentation \ this list of conditions and the following disclaimer in the documentation \
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
* Neither the name of HL7 nor the names of its contributors may be used to * Neither the name of HL7 nor the names of its contributors may be used to
endorse or promote products derived from this software without specific endorse or promote products derived from this software without specific
prior written permission. prior written permission.
@ -27,7 +27,7 @@ package org.hl7.fhir.r5.model;
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \
POSSIBILITY OF SUCH DAMAGE. POSSIBILITY OF SUCH DAMAGE.
*/ */
// Generated on Thu, Mar 23, 2023 19:59+1100 for FHIR v5.0.0 // Generated on Thu, Mar 23, 2023 19:59+1100 for FHIR v5.0.0
@ -35,6 +35,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import org.hl7.fhir.r5.model.Enumerations.*; import org.hl7.fhir.r5.model.Enumerations.*;
import org.hl7.fhir.r5.utils.ToolingExtensions;
import org.hl7.fhir.instance.model.api.IBaseDatatypeElement; import org.hl7.fhir.instance.model.api.IBaseDatatypeElement;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.instance.model.api.ICompositeType; import org.hl7.fhir.instance.model.api.ICompositeType;
@ -52,26 +53,40 @@ import ca.uhn.fhir.model.api.IElement;
@DatatypeDef(name="DataType") @DatatypeDef(name="DataType")
public abstract class DataType extends Element implements IBaseDatatype, IElement { public abstract class DataType extends Element implements IBaseDatatype, IElement {
private static final long serialVersionUID = 0L; private static final long serialVersionUID = 0L;
/** /**
* Constructor * Constructor
*/ */
public DataType() { public DataType() {
super(); super();
} }
public String fhirType() { public String fhirType() {
return "DataType"; return "DataType";
} }
public abstract DataType copy(); public abstract DataType copy();
public void copyValues(DataType dst) { public void copyValues(DataType dst) {
super.copyValues(dst); super.copyValues(dst);
}
public String getTranslation(String l) throws FHIRException {
for (Extension e : getExtension()) {
if (e.getUrl().equals(ToolingExtensions.EXT_TRANSLATION)) {
String lang = ToolingExtensions.readStringExtension(e, "lang");
if (lang.equals(l))
return e.getExtensionString("content");
} }
}
return null;
}
public boolean isTranslatable() {
return false;
}
} }

View File

@ -4605,6 +4605,11 @@ public boolean hasTarget() {
} }
@Override
public String toString() {
return key + ":" + expression + (severity == null ? "("+severity.asStringValue()+")" : "");
}
} }
@Block() @Block()
@ -13093,6 +13098,10 @@ If a pattern[x] is declared on a repeating element, the pattern applies to all r
return t; return t;
} }
public boolean repeats() {
return !Utilities.existsInList(getMax(), "0", "1");
}
// end addition // end addition
} }

View File

@ -3829,6 +3829,17 @@ public class Enumerations {
default: return "?"; default: return "?";
} }
} }
public String getSymbol() {
switch (this) {
case RELATEDTO: return "-";
case EQUIVALENT: return "=";
case SOURCEISNARROWERTHANTARGET: return "<";
case SOURCEISBROADERTHANTARGET: return ">";
case NOTRELATEDTO: return "!=";
case NULL: return null;
default: return "?";
}
}
} }
public static class ConceptMapRelationshipEnumFactory implements EnumFactory<ConceptMapRelationship> { public static class ConceptMapRelationshipEnumFactory implements EnumFactory<ConceptMapRelationship> {

View File

@ -114,15 +114,19 @@ public class ExtensionHelper {
* @return The extension, if on this element, else null. will check modifier extensions too * @return The extension, if on this element, else null. will check modifier extensions too
*/ */
public static Extension getExtension(BackboneElement element, String name) { public static Extension getExtension(BackboneElement element, String name) {
if (name == null || element == null || !element.hasExtension()) if (name == null || element == null)
return null; return null;
for (Extension e : element.getModifierExtension()) { if (element.hasModifierExtension()) {
if (name.equals(e.getUrl())) for (Extension e : element.getModifierExtension()) {
return e; if (name.equals(e.getUrl()))
return e;
}
} }
for (Extension e : element.getExtension()) { if (element.hasExtension()) {
if (name.equals(e.getUrl())) for (Extension e : element.getExtension()) {
return e; if (name.equals(e.getUrl()))
return e;
}
} }
return null; return null;
} }

View File

@ -79,4 +79,9 @@ public class MarkdownType extends StringType implements Comparable<MarkdownType>
return "markdown"; return "markdown";
} }
@Override
public boolean isTranslatable() {
return true;
}
} }

View File

@ -99,15 +99,8 @@ public class StringType extends PrimitiveType<String> {
return "string"; return "string";
} }
public String getTranslation(String l) throws FHIRException { @Override
for (Extension e : getExtension()) { public boolean isTranslatable() {
if (e.getUrl().equals(ToolingExtensions.EXT_TRANSLATION)) { return true;
String lang = ToolingExtensions.readStringExtension(e, "lang");
if (lang.equals(l))
return e.getExtensionString("content");
}
}
return null;
} }
} }

View File

@ -1499,6 +1499,34 @@ public class StructureDefinition extends CanonicalResource {
} }
//added from java-adornments.txt:
public ElementDefinition getElementByPath(String path) {
if (path == null) {
return null;
}
for (ElementDefinition ed : getElement()) {
if (path.equals(ed.getPath()) || (path+"[x]").equals(ed.getPath())) {
return ed;
}
}
return null;
}
public ElementDefinition getElementById(String id) {
if (id == null) {
return null;
}
for (ElementDefinition ed : getElement()) {
if (id.equals(ed.getId())) {
return ed;
}
}
return null;
}
//end addition
} }
/** /**

View File

@ -1150,6 +1150,15 @@ public class ValueSet extends MetadataResource {
} }
public boolean hasConcept(String code) {
for (ConceptReferenceComponent c : getConcept()) {
if (code.equals(c.getCode())) {
return true;
}
}
return false;
}
} }
@Block() @Block()

View File

@ -33,13 +33,13 @@ public class ActorDefinitionRenderer extends ResourceRenderer {
public boolean render(XhtmlNode x, ActorDefinition acd) throws FHIRFormatError, DefinitionException, IOException { public boolean render(XhtmlNode x, ActorDefinition acd) throws FHIRFormatError, DefinitionException, IOException {
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx("Actor: "+acd.getName()); tr.td().b().tx(/*!#*/"Actor: "+acd.getName());
tr.td().tx(acd.getTitle()); tr.td().tx(acd.getTitle());
tr.td().tx("Type: " + acd.getType().toCode()); tr.td().tx(/*!#*/"Type: " + acd.getType().toCode());
XhtmlNode td = tbl.tr().td().colspan("3"); XhtmlNode td = tbl.tr().td().colspan("3");
addMarkdown(td, acd.getDocumentation()); addMarkdown(td, acd.getDocumentation());
if (acd.hasReference()) { if (acd.hasReference()) {
tbl.tr().td().tx("References:"); tbl.tr().td().tx(/*!#*/"References:");
td = tr.td().colspan("2"); td = tr.td().colspan("2");
boolean first = true; boolean first = true;
for (UrlType t : acd.getReference()) { for (UrlType t : acd.getReference()) {
@ -48,7 +48,7 @@ public class ActorDefinitionRenderer extends ResourceRenderer {
} }
} }
if (acd.hasCapabilities()) { if (acd.hasCapabilities()) {
tbl.tr().td().tx("Capabilities:"); tbl.tr().td().tx(/*!#*/"Capabilities:");
td = tr.td().colspan("2"); td = tr.td().colspan("2");
CapabilityStatement cs = context.getWorker().fetchResource(CapabilityStatement.class, acd.getCapabilities(), acd); CapabilityStatement cs = context.getWorker().fetchResource(CapabilityStatement.class, acd.getCapabilities(), acd);
if (cs != null) { if (cs != null) {
@ -58,7 +58,7 @@ public class ActorDefinitionRenderer extends ResourceRenderer {
} }
} }
if (acd.hasDerivedFrom()) { if (acd.hasDerivedFrom()) {
tbl.tr().td().tx("Derived from:"); tbl.tr().td().tx(/*!#*/"Derived from:");
td = tr.td().colspan("2"); td = tr.td().colspan("2");
boolean first = true; boolean first = true;
for (UrlType t : acd.getReference()) { for (UrlType t : acd.getReference()) {

View File

@ -231,16 +231,16 @@ public class AdditionalBindingsRenderer {
XhtmlNode tr = new XhtmlNode(NodeType.Element, "tr"); XhtmlNode tr = new XhtmlNode(NodeType.Element, "tr");
children.add(tr); children.add(tr);
tr.td().style("font-size: 11px").b().tx("Additional Bindings"); tr.td().style("font-size: 11px").b().tx(/*!#*/"Additional Bindings");
tr.td().style("font-size: 11px").tx("Purpose"); tr.td().style("font-size: 11px").tx(/*!#*/"Purpose");
if (usage) { if (usage) {
tr.td().style("font-size: 11px").tx("Usage"); tr.td().style("font-size: 11px").tx(/*!#*/"Usage");
} }
if (any) { if (any) {
tr.td().style("font-size: 11px").tx("Any"); tr.td().style("font-size: 11px").tx(/*!#*/"Any");
} }
if (doco) { if (doco) {
tr.td().style("font-size: 11px").tx("Documentation"); tr.td().style("font-size: 11px").tx(/*!#*/"Documentation");
} }
for (AdditionalBindingDetail binding : bindings) { for (AdditionalBindingDetail binding : bindings) {
tr = new XhtmlNode(NodeType.Element, "tr"); tr = new XhtmlNode(NodeType.Element, "tr");
@ -296,8 +296,8 @@ public class AdditionalBindingsRenderer {
} }
} }
if (any) { if (any) {
String newRepeat = binding.any ? "Any repeats" : "All repeats"; String newRepeat = binding.any ? /*!#*/"Any repeats" : /*!#*/"All repeats";
String oldRepeat = binding.compare!=null && binding.compare.any ? "Any repeats" : "All repeats"; String oldRepeat = binding.compare!=null && binding.compare.any ? /*!#*/"Any repeats" : /*!#*/"All repeats";
compareString(tr.td().style("font-size: 11px"), newRepeat, oldRepeat); compareString(tr.td().style("font-size: 11px"), newRepeat, oldRepeat);
} }
if (doco) { if (doco) {
@ -338,54 +338,54 @@ public class AdditionalBindingsRenderer {
boolean r5 = context == null || context.getWorker() == null ? false : VersionUtilities.isR5Plus(context.getWorker().getVersion()); boolean r5 = context == null || context.getWorker() == null ? false : VersionUtilities.isR5Plus(context.getWorker().getVersion());
switch (purpose) { switch (purpose) {
case "maximum": case "maximum":
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-maximum" : corePath+"extension-elementdefinition-maxvalueset.html", "A required binding, for use when the binding strength is 'extensible' or 'preferred'").tx("Max Binding"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-maximum" : corePath+"extension-elementdefinition-maxvalueset.html", /*!#*/"A required binding, for use when the binding strength is 'extensible' or 'preferred'").tx(/*!#*/"Max Binding");
break; break;
case "minimum": case "minimum":
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-minimum" : corePath+"extension-elementdefinition-minvalueset.html", "The minimum allowable value set - any conformant system SHALL support all these codes").tx("Min Binding"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-minimum" : corePath+"extension-elementdefinition-minvalueset.html", /*!#*/"The minimum allowable value set - any conformant system SHALL support all these codes").tx(/*!#*/"Min Binding");
break; break;
case "required" : case "required" :
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-required" : corePath+"terminologies.html#strength", "Validators will check this binding (strength = required)").tx("Required Binding"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-required" : corePath+"terminologies.html#strength", /*!#*/"Validators will check this binding (strength = required)").tx(/*!#*/"Required Binding");
break; break;
case "extensible" : case "extensible" :
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-extensible" : corePath+"terminologies.html#strength", "Validators will check this binding (strength = extensible)").tx("Extensible Binding"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-extensible" : corePath+"terminologies.html#strength", /*!#*/"Validators will check this binding (strength = extensible)").tx(/*!#*/"Extensible Binding");
break; break;
case "current" : case "current" :
if (r5) { if (r5) {
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-current" : corePath+"terminologies.html#strength", "New records are required to use this value set, but legacy records may use other codes").tx("Current Binding"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-current" : corePath+"terminologies.html#strength", /*!#*/"New records are required to use this value set, but legacy records may use other codes").tx(/*!#*/"Current Binding");
} else { } else {
td.span(null, "New records are required to use this value set, but legacy records may use other codes").tx("Required"); td.span(null, /*!#*/"New records are required to use this value set, but legacy records may use other codes").tx(/*!#*/"Required");
} }
break; break;
case "preferred" : case "preferred" :
if (r5) { if (r5) {
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-preferred" : corePath+"terminologies.html#strength", "This is the value set that is recommended (documentation should explain why)").tx("Preferred Binding"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-preferred" : corePath+"terminologies.html#strength", /*!#*/"This is the value set that is recommended (documentation should explain why)").tx(/*!#*/"Preferred Binding");
} else { } else {
td.span(null, "This is the value set that is recommended (documentation should explain why)").tx("Recommended"); td.span(null, /*!#*/"This is the value set that is recommended (documentation should explain why)").tx(/*!#*/"Recommended");
} }
break; break;
case "ui" : case "ui" :
if (r5) { if (r5) {
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-ui" : corePath+"terminologies.html#strength", "This value set is provided to user look up in a given context").tx("UI Binding"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-ui" : corePath+"terminologies.html#strength", /*!#*/"This value set is provided to user look up in a given context").tx(/*!#*/"UI Binding");
} else { } else {
td.span(null, "This value set is provided to user look up in a given context").tx("UI"); td.span(null, /*!#*/"This value set is provided to user look up in a given context").tx(/*!#*/"UI");
} }
break; break;
case "starter" : case "starter" :
if (r5) { if (r5) {
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-starter" : corePath+"terminologies.html#strength", "This value set is a good set of codes to start with when designing your system").tx("Starter Set"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-starter" : corePath+"terminologies.html#strength", "This value set is a good set of codes to start with when designing your system").tx("Starter Set");
} else { } else {
td.span(null, "This value set is a good set of codes to start with when designing your system").tx("Starter"); td.span(null, /*!#*/"This value set is a good set of codes to start with when designing your system").tx(/*!#*/"Starter");
} }
break; break;
case "component" : case "component" :
if (r5) { if (r5) {
td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-component" : corePath+"terminologies.html#strength", "This value set is a component of the base value set").tx("Component"); td.ah(r5 ? corePath+"valueset-additional-binding-purpose.html#additional-binding-purpose-component" : corePath+"terminologies.html#strength", "This value set is a component of the base value set").tx("Component");
} else { } else {
td.span(null, "This value set is a component of the base value set").tx("Component"); td.span(null, /*!#*/"This value set is a component of the base value set").tx(/*!#*/"Component");
} }
break; break;
default: default:
td.span(null, "Unknown code for purpose").tx(purpose); td.span(null, /*!#*/"Unknown code for purpose").tx(purpose);
} }
} }
@ -430,7 +430,7 @@ public class AdditionalBindingsRenderer {
children.tx(" ("); children.tx(" (");
boolean ffirst = !b.getAny(); boolean ffirst = !b.getAny();
if (b.getAny()) { if (b.getAny()) {
children.tx("any repeat"); children.tx(/*!#*/"any repeat");
} }
for (UsageContext uc : b.getUsage()) { for (UsageContext uc : b.getUsage()) {
if (ffirst) ffirst = false; else children.tx(","); if (ffirst) ffirst = false; else children.tx(",");

View File

@ -45,7 +45,7 @@ public class BinaryRenderer {
public void render(XhtmlNode x, Binary bin) throws IOException { public void render(XhtmlNode x, Binary bin) throws IOException {
filenames.clear(); filenames.clear();
if (!bin.hasContentType()) { if (!bin.hasContentType()) {
error(x, "No Content Type"); error(x, /*!#*/"No Content Type");
} else if (bin.getContentType().startsWith("image/")) { } else if (bin.getContentType().startsWith("image/")) {
image(x, bin); image(x, bin);
} else if (isXml(bin.getContentType())) { } else if (isXml(bin.getContentType())) {
@ -75,7 +75,7 @@ public class BinaryRenderer {
} }
if (ext == null) { if (ext == null) {
error(x, "The Image Type '"+bin.getContentType()+"' is not rendered in this context"); error(x, /*!#*/"The Image Type '"+bin.getContentType()+"' is not rendered in this context");
} else { } else {
String fn = "Binary-Native-"+bin.getId()+ext; String fn = "Binary-Native-"+bin.getId()+ext;
TextFile.bytesToFile(bin.getContent(), Utilities.path(folder, fn)); TextFile.bytesToFile(bin.getContent(), Utilities.path(folder, fn));

View File

@ -62,13 +62,13 @@ public class BundleRenderer extends ResourceRenderer {
List<BaseWrapper> entries = b.children("entry"); List<BaseWrapper> entries = b.children("entry");
if ("document".equals(b.get("type").primitiveValue())) { if ("document".equals(b.get("type").primitiveValue())) {
if (entries.isEmpty() || (entries.get(0).has("resource") && !"Composition".equals(entries.get(0).get("resource").fhirType()))) if (entries.isEmpty() || (entries.get(0).has("resource") && !"Composition".equals(entries.get(0).get("resource").fhirType())))
throw new FHIRException("Invalid document '"+b.getId()+"' - first entry is not a Composition ('"+entries.get(0).get("resource").fhirType()+"')"); throw new FHIRException(/*!#*/"Invalid document '"+b.getId()+"' - first entry is not a Composition ('"+entries.get(0).get("resource").fhirType()+"')");
return renderDocument(x, b, entries); return renderDocument(x, b, entries);
} else if ("collection".equals(b.get("type").primitiveValue()) && allEntriesAreHistoryProvenance(entries)) { } else if ("collection".equals(b.get("type").primitiveValue()) && allEntriesAreHistoryProvenance(entries)) {
// nothing // nothing
} else { } else {
XhtmlNode root = new XhtmlNode(NodeType.Element, "div"); XhtmlNode root = new XhtmlNode(NodeType.Element, "div");
root.para().addText(formatMessage(RENDER_BUNDLE_HEADER_ROOT, b.getId(), b.get("type").primitiveValue())); root.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_ROOT, b.getId(), b.get("type").primitiveValue()));
int i = 0; int i = 0;
for (BaseWrapper be : entries) { for (BaseWrapper be : entries) {
i++; i++;
@ -85,9 +85,9 @@ public class BundleRenderer extends ResourceRenderer {
} }
root.hr(); root.hr();
if (be.has("fullUrl")) { if (be.has("fullUrl")) {
root.para().addText(formatMessage(RENDER_BUNDLE_HEADER_ENTRY_URL, Integer.toString(i), be.get("fullUrl").primitiveValue())); root.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_ENTRY_URL, Integer.toString(i), be.get("fullUrl").primitiveValue()));
} else { } else {
root.para().addText(formatMessage(RENDER_BUNDLE_HEADER_ENTRY, Integer.toString(i))); root.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_ENTRY, Integer.toString(i)));
} }
// if (be.hasRequest()) // if (be.hasRequest())
// renderRequest(root, be.getRequest()); // renderRequest(root, be.getRequest());
@ -96,7 +96,7 @@ public class BundleRenderer extends ResourceRenderer {
// if (be.hasResponse()) // if (be.hasResponse())
// renderResponse(root, be.getResponse()); // renderResponse(root, be.getResponse());
if (be.has("resource")) { if (be.has("resource")) {
root.para().addText(formatMessage(RENDER_BUNDLE_RESOURCE, be.get("resource").fhirType())); root.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_RESOURCE, be.get("resource").fhirType()));
ResourceWrapper rw = be.getChildByName("resource").getAsResource(); ResourceWrapper rw = be.getChildByName("resource").getAsResource();
XhtmlNode xn = rw.getNarrative(); XhtmlNode xn = rw.getNarrative();
if (xn == null || xn.isEmpty()) { if (xn == null || xn.isEmpty()) {
@ -106,7 +106,7 @@ public class BundleRenderer extends ResourceRenderer {
xn = rr.render(rw); xn = rr.render(rw);
} catch (Exception e) { } catch (Exception e) {
xn = new XhtmlNode(); xn = new XhtmlNode();
xn.para().b().tx("Exception generating narrative: "+e.getMessage()); xn.para().b().tx(/*!#*/"Exception generating narrative: "+e.getMessage());
} }
} }
root.blockquote().para().addChildren(xn); root.blockquote().para().addChildren(xn);
@ -280,15 +280,15 @@ public class BundleRenderer extends ResourceRenderer {
XhtmlNode x = new XhtmlNode(NodeType.Element, "div"); XhtmlNode x = new XhtmlNode(NodeType.Element, "div");
if (b.getType() == BundleType.DOCUMENT) { if (b.getType() == BundleType.DOCUMENT) {
if (!b.hasEntry() || !(b.getEntryFirstRep().hasResource() && b.getEntryFirstRep().getResource() instanceof Composition)) { if (!b.hasEntry() || !(b.getEntryFirstRep().hasResource() && b.getEntryFirstRep().getResource() instanceof Composition)) {
throw new FHIRException("Invalid document - first entry is not a Composition"); throw new FHIRException(/*!#*/"Invalid document - first entry is not a Composition");
} }
renderDocument(x, b); renderDocument(x, b);
start = 1; start = 1;
docMode = true; docMode = true;
x.hr(); x.hr();
x.h2().addText(formatMessage(RENDER_BUNDLE_DOCUMENT_CONTENT, b.getId(), b.getType().toCode())); x.h2().addText(formatMessage(RenderingContext.RENDER_BUNDLE_DOCUMENT_CONTENT, b.getId(), b.getType().toCode()));
} else { } else {
x.para().addText(formatMessage(RENDER_BUNDLE_HEADER_ROOT, b.getId(), b.getType().toCode())); x.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_ROOT, b.getId(), b.getType().toCode()));
} }
int i = 0; int i = 0;
for (BundleEntryComponent be : b.getEntry()) { for (BundleEntryComponent be : b.getEntry()) {
@ -307,17 +307,17 @@ public class BundleRenderer extends ResourceRenderer {
x.hr(); x.hr();
if (docMode) { if (docMode) {
if (be.hasFullUrl() && be.hasResource()) { if (be.hasFullUrl() && be.hasResource()) {
x.para().addText(formatMessage(RENDER_BUNDLE_HEADER_DOC_ENTRY_URD, Integer.toString(i), be.getFullUrl(), be.getResource().fhirType(), be.getResource().getIdBase())); x.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_DOC_ENTRY_URD, Integer.toString(i), be.getFullUrl(), be.getResource().fhirType(), be.getResource().getIdBase()));
} else if (be.hasFullUrl()) { } else if (be.hasFullUrl()) {
x.para().addText(formatMessage(RENDER_BUNDLE_HEADER_DOC_ENTRY_U, Integer.toString(i), be.getFullUrl())); x.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_DOC_ENTRY_U, Integer.toString(i), be.getFullUrl()));
} else if (be.hasResource()) { } else if (be.hasResource()) {
x.para().addText(formatMessage(RENDER_BUNDLE_HEADER_DOC_ENTRY_RD, Integer.toString(i), be.getResource().fhirType(), be.getResource().getIdBase())); x.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_DOC_ENTRY_RD, Integer.toString(i), be.getResource().fhirType(), be.getResource().getIdBase()));
} }
} else { } else {
if (be.hasFullUrl()) { if (be.hasFullUrl()) {
x.para().addText(formatMessage(RENDER_BUNDLE_HEADER_ENTRY_URL, Integer.toString(i), be.getFullUrl())); x.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_ENTRY_URL, Integer.toString(i), be.getFullUrl()));
} else { } else {
x.para().addText(formatMessage(RENDER_BUNDLE_HEADER_ENTRY, Integer.toString(i))); x.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_HEADER_ENTRY, Integer.toString(i)));
} }
if (be.hasRequest()) if (be.hasRequest())
renderRequest(x, be.getRequest()); renderRequest(x, be.getRequest());
@ -328,7 +328,7 @@ public class BundleRenderer extends ResourceRenderer {
} }
if (be.hasResource()) { if (be.hasResource()) {
if (!docMode) { if (!docMode) {
x.para().addText(formatMessage(RENDER_BUNDLE_RESOURCE, be.getResource().fhirType())); x.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_RESOURCE, be.getResource().fhirType()));
} }
if (be.hasResource()) { if (be.hasResource()) {
XhtmlNode xn = null; XhtmlNode xn = null;
@ -342,7 +342,7 @@ public class BundleRenderer extends ResourceRenderer {
rr.setRcontext(new ResourceContext(rcontext, be.getResource())); rr.setRcontext(new ResourceContext(rcontext, be.getResource()));
xn = rr.build(be.getResource()); xn = rr.build(be.getResource());
} catch (Exception e) { } catch (Exception e) {
xn = makeExceptionXhtml(e, "generating narrative"); xn = makeExceptionXhtml(e, /*!#*/"generating narrative");
} }
} }
x.blockquote().para().getChildNodes().addAll(checkInternalLinks(b, xn.getChildNodes())); x.blockquote().para().getChildNodes().addAll(checkInternalLinks(b, xn.getChildNodes()));
@ -401,42 +401,42 @@ public class BundleRenderer extends ResourceRenderer {
private void renderSearch(XhtmlNode root, BundleEntrySearchComponent search) { private void renderSearch(XhtmlNode root, BundleEntrySearchComponent search) {
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();
b.append(formatMessage(RENDER_BUNDLE_SEARCH)); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_SEARCH));
if (search.hasMode()) if (search.hasMode())
b.append(formatMessage(RENDER_BUNDLE_SEARCH_MODE, search.getMode().toCode())); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_SEARCH_MODE, search.getMode().toCode()));
if (search.hasScore()) { if (search.hasScore()) {
if (search.hasMode()) if (search.hasMode())
b.append(","); b.append(",");
b.append(formatMessage(RENDER_BUNDLE_SEARCH_SCORE, search.getScore())); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_SEARCH_SCORE, search.getScore()));
} }
root.para().addText(b.toString()); root.para().addText(b.toString());
} }
private void renderResponse(XhtmlNode root, BundleEntryResponseComponent response) { private void renderResponse(XhtmlNode root, BundleEntryResponseComponent response) {
root.para().addText(formatMessage(RENDER_BUNDLE_RESPONSE)); root.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_RESPONSE));
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();
b.append(response.getStatus()+"\r\n"); b.append(response.getStatus()+"\r\n");
if (response.hasLocation()) if (response.hasLocation())
b.append(formatMessage(RENDER_BUNDLE_LOCATION, response.getLocation())+"\r\n"); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_LOCATION, response.getLocation())+"\r\n");
if (response.hasEtag()) if (response.hasEtag())
b.append(formatMessage(RENDER_BUNDLE_ETAG, response.getEtag())+"\r\n"); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_ETAG, response.getEtag())+"\r\n");
if (response.hasLastModified()) if (response.hasLastModified())
b.append(formatMessage(RENDER_BUNDLE_LAST_MOD, response.getEtag())+"\r\n"); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_LAST_MOD, response.getEtag())+"\r\n");
root.pre().addText(b.toString()); root.pre().addText(b.toString());
} }
private void renderRequest(XhtmlNode root, BundleEntryRequestComponent request) { private void renderRequest(XhtmlNode root, BundleEntryRequestComponent request) {
root.para().addText(formatMessage(RENDER_BUNDLE_REQUEST)); root.para().addText(formatMessage(RenderingContext.RENDER_BUNDLE_REQUEST));
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();
b.append(request.getMethod()+" "+request.getUrl()+"\r\n"); b.append(request.getMethod()+" "+request.getUrl()+"\r\n");
if (request.hasIfNoneMatch()) if (request.hasIfNoneMatch())
b.append(formatMessage(RENDER_BUNDLE_IF_NON_MATCH, request.getIfNoneMatch())+"\r\n"); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_IF_NON_MATCH, request.getIfNoneMatch())+"\r\n");
if (request.hasIfModifiedSince()) if (request.hasIfModifiedSince())
b.append(formatMessage(RENDER_BUNDLE_IF_MOD, request.getIfModifiedSince())+"\r\n"); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_IF_MOD, request.getIfModifiedSince())+"\r\n");
if (request.hasIfMatch()) if (request.hasIfMatch())
b.append(formatMessage(RENDER_BUNDLE_IF_MATCH, request.getIfMatch())+"\r\n"); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_IF_MATCH, request.getIfMatch())+"\r\n");
if (request.hasIfNoneExist()) if (request.hasIfNoneExist())
b.append(formatMessage(RENDER_BUNDLE_IF_NONE, request.getIfNoneExist())+"\r\n"); b.append(formatMessage(RenderingContext.RENDER_BUNDLE_IF_NONE, request.getIfNoneExist())+"\r\n");
root.pre().addText(b.toString()); root.pre().addText(b.toString());
} }

View File

@ -700,26 +700,26 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
private void addSummaryTable(XhtmlNode x, CapabilityStatement.CapabilityStatementRestComponent rest, boolean hasVRead, boolean hasPatch, boolean hasDelete, boolean hasHistory, boolean hasUpdates, int count) throws IOException { private void addSummaryTable(XhtmlNode x, CapabilityStatement.CapabilityStatementRestComponent rest, boolean hasVRead, boolean hasPatch, boolean hasDelete, boolean hasHistory, boolean hasUpdates, int count) throws IOException {
XhtmlNode t = x.div().attribute("class","table-responsive").table("table table-condensed table-hover"); XhtmlNode t = x.div().attribute("class","table-responsive").table("table table-condensed table-hover");
XhtmlNode tr = t.addTag("thead").tr(); XhtmlNode tr = t.addTag("thead").tr();
tr.th().b().tx("Resource Type"); tr.th().b().tx(/*!#*/"Resource Type");
tr.th().b().tx("Profile"); tr.th().b().tx(/*!#*/"Profile");
tr.th().attribute("class", "text-center").b().attribute("title", "GET a resource (read interaction)").tx("R"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"GET a resource (read interaction)").tx("R");
if (hasVRead) if (hasVRead)
tr.th().attribute("class", "text-center").b().attribute("title", "GET past versions of resources (vread interaction)").tx("V-R"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"GET past versions of resources (vread interaction)").tx("V-R");
tr.th().attribute("class", "text-center").b().attribute("title", "GET all set of resources of the type (search interaction)").tx("S"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"GET all set of resources of the type (search interaction)").tx("S");
tr.th().attribute("class", "text-center").b().attribute("title", "PUT a new resource version (update interaction)").tx("U"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"PUT a new resource version (update interaction)").tx("U");
if (hasPatch) if (hasPatch)
tr.th().attribute("class", "text-center").b().attribute("title", "PATCH a new resource version (patch interaction)").tx("P"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"PATCH a new resource version (patch interaction)").tx("P");
tr.th().attribute("class", "text-center").b().attribute("title", "POST a new resource (create interaction)").tx("C"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"POST a new resource (create interaction)").tx("C");
if (hasDelete) if (hasDelete)
tr.th().attribute("class", "text-center").b().attribute("title", "DELETE a resource (delete interaction)").tx("D"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"DELETE a resource (delete interaction)").tx("D");
if (hasUpdates) if (hasUpdates)
tr.th().attribute("class", "text-center").b().attribute("title", "GET changes to a resource (history interaction on instance)").tx("H-I"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"GET changes to a resource (history interaction on instance)").tx("H-I");
if (hasHistory) if (hasHistory)
tr.th().attribute("class", "text-center").b().attribute("title", "GET changes for all resources of the type (history interaction on type)").tx("H-T"); tr.th().attribute("class", "text-center").b().attribute("title", /*!#*/"GET changes for all resources of the type (history interaction on type)").tx("H-T");
tr.th().b().attribute("title", "Required and recommended search parameters").tx("Searches"); tr.th().b().attribute("title", /*!#*/"Required and recommended search parameters").tx(/*!#*/"Searches");
tr.th().code().b().tx("_include"); tr.th().code().b().tx("_include");
tr.th().code().b().tx("_revinclude"); tr.th().code().b().tx("_revinclude");
tr.th().b().tx("Operations"); tr.th().b().tx(/*!#*/"Operations");
XhtmlNode tbody = t.addTag("tbody"); XhtmlNode tbody = t.addTag("tbody");
XhtmlNode profCell = null; XhtmlNode profCell = null;
@ -744,12 +744,12 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
//profCell.ah(r.getProfile()).addText(r.getProfile()); //profCell.ah(r.getProfile()).addText(r.getProfile());
if (hasSupProf) { if (hasSupProf) {
profCell.br(); profCell.br();
profCell.addTag("em").addText("Additional supported profiles:"); profCell.addTag("em").addText(/*!#*/"Additional supported profiles:");
renderSupportedProfiles(profCell, r); renderSupportedProfiles(profCell, r);
} }
} }
else { //Case of only supported profiles else { //Case of only supported profiles
profCell.addText("Supported profiles:"); profCell.addText(/*!#*/"Supported profiles:");
renderSupportedProfiles(profCell, r); renderSupportedProfiles(profCell, r);
} }
//Show capabilities //Show capabilities
@ -809,17 +809,17 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
} }
if (r.hasExtension(ToolingExtensions.EXT_PROFILE_MAPPING)) { if (r.hasExtension(ToolingExtensions.EXT_PROFILE_MAPPING)) {
profCell.br(); profCell.br();
profCell.b().tx("Profile Mapping"); profCell.b().tx(/*!#*/"Profile Mapping");
XhtmlNode tbl = profCell.table("grid"); XhtmlNode tbl = profCell.table("grid");
boolean doco = false; boolean doco = false;
for (Extension ext : r.getExtensionsByUrl(ToolingExtensions.EXT_PROFILE_MAPPING)) { for (Extension ext : r.getExtensionsByUrl(ToolingExtensions.EXT_PROFILE_MAPPING)) {
doco = doco || ext.hasExtension("documentation"); doco = doco || ext.hasExtension("documentation");
} }
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.th().tx("Criteria"); tr.th().tx(/*!#*/"Criteria");
tr.th().tx("Profile"); tr.th().tx(/*!#*/"Profile");
if (doco) { if (doco) {
tr.th().tx("Criteria"); tr.th().tx(/*!#*/"Criteria");
} }
for (Extension ext : r.getExtensionsByUrl(ToolingExtensions.EXT_PROFILE_MAPPING)) { for (Extension ext : r.getExtensionsByUrl(ToolingExtensions.EXT_PROFILE_MAPPING)) {
tr = tbl.tr(); tr = tbl.tr();
@ -936,7 +936,7 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
} }
else { else {
panelHead = panel.div().attribute("class", "panel-heading").h(nextLevel,r.getType() + countString).attribute("class", "panel-title"); panelHead = panel.div().attribute("class", "panel-heading").h(nextLevel,r.getType() + countString).attribute("class", "panel-title");
panelHead.span("float: right;","").addText("Resource Conformance: " + getResourceExpectation(r)); panelHead.span("float: right;","").addText(/*!#*/"Resource Conformance: " + getResourceExpectation(r));
panelHead.addText(r.getType()); panelHead.addText(r.getType());
body = panel.div().attribute("class", "panel-body").div().attribute("class", "container"); body = panel.div().attribute("class", "panel-body").div().attribute("class", "container");
} }
@ -950,17 +950,17 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
String refPolicyWidth = "col-lg-3"; String refPolicyWidth = "col-lg-3";
if (!Utilities.noString(text)) { if (!Utilities.noString(text)) {
cell = row.div().attribute("class", "col-lg-6"); cell = row.div().attribute("class", "col-lg-6");
addLead(cell,"Base System Profile"); addLead(cell,/*!#*/"Base System Profile");
cell.br(); cell.br();
addResourceLink(cell, text, text); addResourceLink(cell, text, text);
cell=row.div().attribute("class", "col-lg-3"); cell=row.div().attribute("class", "col-lg-3");
addLead(cell, "Profile Conformance"); addLead(cell, /*!#*/"Profile Conformance");
cell.br(); cell.br();
cell.b().addText(getProfileExpectation(r.getProfileElement())); cell.b().addText(getProfileExpectation(r.getProfileElement()));
} }
else { //No profile, use FHIR Core Resource else { //No profile, use FHIR Core Resource
cell = row.div().attribute("class", "col-lg-4"); cell = row.div().attribute("class", "col-lg-4");
addLead(cell,"Core FHIR Resource"); addLead(cell,/*!#*/"Core FHIR Resource");
cell.br(); cell.br();
cell.ah(currentFhirBase + r.getType().toLowerCase() + ".html").addText(r.getType()); cell.ah(currentFhirBase + r.getType().toLowerCase() + ".html").addText(r.getType());
pullInteraction = true; pullInteraction = true;
@ -968,7 +968,7 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
} }
cell = row.div().attribute("class", refPolicyWidth); cell = row.div().attribute("class", refPolicyWidth);
addLead(cell,"Reference Policy"); addLead(cell,/*!#*/"Reference Policy");
cell.br(); cell.br();
addSeparatedListOfCodes(cell, getReferencePolicyStrings(r.getReferencePolicy()) , ","); addSeparatedListOfCodes(cell, getReferencePolicyStrings(r.getReferencePolicy()) , ",");
if (pullInteraction) { if (pullInteraction) {
@ -979,7 +979,7 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
if (supportedProfiles.size() > 0) { if (supportedProfiles.size() > 0) {
row = body.div().attribute("class", "row"); row = body.div().attribute("class", "row");
cell = row.div().attribute("class", "col-6"); cell = row.div().attribute("class", "col-6");
addLead(cell,"Supported Profiles"); addLead(cell,/*!#*/"Supported Profiles");
XhtmlNode para = cell.para(); XhtmlNode para = cell.para();
boolean first = true; boolean first = true;
for (CanonicalType c : supportedProfiles) { for (CanonicalType c : supportedProfiles) {
@ -1004,7 +1004,7 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
if (!Utilities.noString(mdText)) { if (!Utilities.noString(mdText)) {
row = body.div().attribute("class", "row"); row = body.div().attribute("class", "row");
cell = row.div().attribute("class", "col-12"); cell = row.div().attribute("class", "col-12");
addLead(cell,"Documentation"); addLead(cell,/*!#*/"Documentation");
addMarkdown(cell.blockquote(), mdText); addMarkdown(cell.blockquote(), mdText);
} }
@ -1028,12 +1028,12 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
XhtmlNode tr; XhtmlNode tr;
row = body.div().attribute("class", "row"); row = body.div().attribute("class", "row");
cell = row.div().attribute("class", "col-12"); cell = row.div().attribute("class", "col-12");
addLead(cell,"Extended Operations"); addLead(cell,/*!#*/"Extended Operations");
table = cell.table("table table-condensed table-hover"); table = cell.table("table table-condensed table-hover");
tr = table.addTag("thead").tr(); tr = table.addTag("thead").tr();
tr.th().addText("Conformance"); tr.th().addText(/*!#*/"Conformance");
tr.th().addText("Operation"); tr.th().addText(/*!#*/"Operation");
tr.th().addText("Documentation"); tr.th().addText(/*!#*/"Documentation");
tbody = table.addTag("tbody"); tbody = table.addTag("tbody");
addOps(tbody, map, "supported"); addOps(tbody, map, "supported");
addOps(tbody, map, "SHALL"); addOps(tbody, map, "SHALL");
@ -1089,7 +1089,7 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
} }
} }
XhtmlNode cell = row.div().attribute("class", widthString); XhtmlNode cell = row.div().attribute("class", widthString);
addLead(cell, "Interaction summary"); addLead(cell, /*!#*/"Interaction summary");
cell.br(); cell.br();
XhtmlNode ul = cell.ul(); XhtmlNode ul = cell.ul();
addInteractionSummaryList(ul, "SHALL", shalls); addInteractionSummaryList(ul, "SHALL", shalls);
@ -1154,13 +1154,13 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
XhtmlNode tr; XhtmlNode tr;
row = body.div().attribute("class", "row"); row = body.div().attribute("class", "row");
cell = row.div().attribute("class", "col-lg-7"); cell = row.div().attribute("class", "col-lg-7");
addLead(cell,"Search Parameters"); addLead(cell,/*!#*/"Search Parameters");
table = cell.table("table table-condensed table-hover"); table = cell.table("table table-condensed table-hover");
tr = table.addTag("thead").tr(); tr = table.addTag("thead").tr();
tr.th().addText("Conformance"); tr.th().addText(/*!#*/"Conformance");
tr.th().addText("Parameter"); tr.th().addText(/*!#*/"Parameter");
tr.th().addText("Type"); tr.th().addText(/*!#*/"Type");
tr.th().addText("Documentation"); tr.th().addText(/*!#*/"Documentation");
tbody = table.addTag("tbody"); tbody = table.addTag("tbody");
Map<String,List<SingleParam>> map = sParams.getIndbyExp(); Map<String,List<SingleParam>> map = sParams.getIndbyExp();
addIndRows(tbody, map, "supported"); addIndRows(tbody, map, "supported");
@ -1170,12 +1170,12 @@ public class CapabilityStatementRenderer extends ResourceRenderer {
addIndRows(tbody, map, "SHOULD-NOT"); addIndRows(tbody, map, "SHOULD-NOT");
cell = row.div().attribute("class", "col-lg-5"); cell = row.div().attribute("class", "col-lg-5");
if (!isCombinedEmpty(comboMap)) { if (!isCombinedEmpty(comboMap)) {
addLead(cell,"Combined Search Parameters"); addLead(cell,/*!#*/"Combined Search Parameters");
table = cell.table("table table-condensed table-hover"); table = cell.table("table table-condensed table-hover");
tr = table.addTag("thead").tr(); tr = table.addTag("thead").tr();
tr.th().addText("Conformance"); tr.th().addText(/*!#*/"Conformance");
tr.th().addText("Parameters"); tr.th().addText(/*!#*/"Parameters");
tr.th().addText("Types"); tr.th().addText(/*!#*/"Types");
tbody = table.addTag("tbody"); tbody = table.addTag("tbody");
addComboRows(tbody, comboMap, "supported"); addComboRows(tbody, comboMap, "supported");
addComboRows(tbody, comboMap, "SHALL"); addComboRows(tbody, comboMap, "SHALL");

View File

@ -11,6 +11,7 @@ import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.exceptions.FHIRFormatError;
import org.hl7.fhir.r5.comparison.VersionComparisonAnnotation; import org.hl7.fhir.r5.comparison.VersionComparisonAnnotation;
import org.hl7.fhir.r5.model.BooleanType; import org.hl7.fhir.r5.model.BooleanType;
import org.hl7.fhir.r5.model.CanonicalResource;
import org.hl7.fhir.r5.model.CodeSystem; import org.hl7.fhir.r5.model.CodeSystem;
import org.hl7.fhir.r5.model.Enumerations.CodeSystemContentMode; import org.hl7.fhir.r5.model.Enumerations.CodeSystemContentMode;
import org.hl7.fhir.r5.model.CodeSystem.CodeSystemFilterComponent; import org.hl7.fhir.r5.model.CodeSystem.CodeSystemFilterComponent;
@ -81,13 +82,13 @@ public class CodeSystemRenderer extends TerminologyRenderer {
private void generateFilters(XhtmlNode x, CodeSystem cs) { private void generateFilters(XhtmlNode x, CodeSystem cs) {
if (cs.hasFilter()) { if (cs.hasFilter()) {
x.para().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Filters", getContext().getLang())); x.para().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_FILTERS));
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Code", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_FILTER_CODE));
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Description", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_FILTER_DESC));
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "operator", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_FILTER_OP));
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Value", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_FILTER_VALUE));
for (CodeSystemFilterComponent f : cs.getFilter()) { for (CodeSystemFilterComponent f : cs.getFilter()) {
tr = tbl.tr(); tr = tbl.tr();
renderStatus(f, tr.td()).tx(f.getCode()); renderStatus(f, tr.td()).tx(f.getCode());
@ -111,20 +112,20 @@ public class CodeSystemRenderer extends TerminologyRenderer {
hasDescription = hasDescription || p.hasDescription(); hasDescription = hasDescription || p.hasDescription();
} }
x.para().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Properties", getContext().getLang())); x.para().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_PROPS));
x.para().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "This code system defines the following properties for its concepts", getContext().getLang())); x.para().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_PROPS_DESC));
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
if (hasRendered) { if (hasRendered) {
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Name", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_PROP_NAME));
} }
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Code", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_PROP_CODE));
if (hasURI) { if (hasURI) {
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "URI", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_PROP_URI));
} }
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Type", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_PROP_TYPE));
if (hasDescription) { if (hasDescription) {
tr.td().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Description", getContext().getLang())); tr.td().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_PROP_DESC));
} }
for (PropertyComponent p : cs.getProperty()) { for (PropertyComponent p : cs.getProperty()) {
tr = tbl.tr(); tr = tbl.tr();
@ -148,32 +149,32 @@ public class CodeSystemRenderer extends TerminologyRenderer {
private String sentenceForContent(CodeSystemContentMode mode, CodeSystem cs) { private String sentenceForContent(CodeSystemContentMode mode, CodeSystem cs) {
switch (mode) { switch (mode) {
case COMPLETE: return context.getContext().formatMessage(I18nConstants.RND_CS_CONTENT_COMPLETE); case COMPLETE: return formatMessage(I18nConstants.RND_CS_CONTENT_COMPLETE);
case EXAMPLE: return context.getContext().formatMessage(I18nConstants.RND_CS_CONTENT_EXAMPLE); case EXAMPLE: return formatMessage(I18nConstants.RND_CS_CONTENT_EXAMPLE);
case FRAGMENT: return context.getContext().formatMessage(I18nConstants.RND_CS_CONTENT_FRAGMENT); case FRAGMENT: return formatMessage(I18nConstants.RND_CS_CONTENT_FRAGMENT);
case NOTPRESENT: return context.getContext().formatMessage(I18nConstants.RND_CS_CONTENT_NOTPRESENT); case NOTPRESENT: return formatMessage(I18nConstants.RND_CS_CONTENT_NOTPRESENT);
case SUPPLEMENT: case SUPPLEMENT:
boolean properties = CodeSystemUtilities.hasProperties(cs); boolean properties = CodeSystemUtilities.hasProperties(cs);
boolean designations = CodeSystemUtilities.hasDesignations(cs); boolean designations = CodeSystemUtilities.hasDesignations(cs);
String features; String features;
if (properties && designations) { if (properties && designations) {
features = "displays and properties"; features = /*!#*/"displays and properties";
} else if (properties) { } else if (properties) {
features = "properties"; features = /*!#*/"properties";
} else if (designations) { } else if (designations) {
features = "displays"; features = /*!#*/"displays";
} else { } else {
features = "features"; // ? features = /*!#*/"features"; // ?
} }
return context.getContext().formatMessage(I18nConstants.RND_CS_CONTENT_SUPPLEMENT, features); return formatMessage(I18nConstants.RND_CS_CONTENT_SUPPLEMENT, features);
default: default:
throw new FHIRException("Unknown CodeSystemContentMode mode"); throw new FHIRException(/*!#*/"Unknown CodeSystemContentMode mode");
} }
} }
private boolean generateCodeSystemContent(XhtmlNode x, CodeSystem cs, boolean hasExtensions, List<UsedConceptMap> maps, boolean props) throws FHIRFormatError, DefinitionException, IOException { private boolean generateCodeSystemContent(XhtmlNode x, CodeSystem cs, boolean hasExtensions, List<UsedConceptMap> maps, boolean props) throws FHIRFormatError, DefinitionException, IOException {
if (props) { if (props) {
x.para().b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Concepts", getContext().getLang())); x.para().b().tx(formatMessage(RenderingContext.RENDER_CODESYSTEM_CONCEPTS));
} }
XhtmlNode p = x.para(); XhtmlNode p = x.para();
renderStatus(cs.getUrlElement(), p.param("cs")).code().tx(cs.getUrl()); renderStatus(cs.getUrlElement(), p.param("cs")).code().tx(cs.getUrl());
@ -233,10 +234,10 @@ public class CodeSystemRenderer extends TerminologyRenderer {
} }
if (langs.size() >= 2) { if (langs.size() >= 2) {
Collections.sort(langs); Collections.sort(langs);
x.para().b().tx("Additional Language Displays"); x.para().b().tx(/*!#*/"Additional Language Displays");
t = x.table("codes"); t = x.table("codes");
XhtmlNode tr = t.tr(); XhtmlNode tr = t.tr();
tr.td().b().tx("Code"); tr.td().b().tx(/*!#*/"Code");
for (String lang : langs) for (String lang : langs)
tr.td().b().addText(describeLang(lang)); tr.td().b().addText(describeLang(lang));
for (ConceptDefinitionComponent c : cs.getConcept()) { for (ConceptDefinitionComponent c : cs.getConcept()) {
@ -249,11 +250,11 @@ public class CodeSystemRenderer extends TerminologyRenderer {
private void makeHierarchyParam(XhtmlNode x, CodeSystem cs, Enumeration<CodeSystemHierarchyMeaning> hm) { private void makeHierarchyParam(XhtmlNode x, CodeSystem cs, Enumeration<CodeSystemHierarchyMeaning> hm) {
if (hm.hasValue()) { if (hm.hasValue()) {
String s = hm.getValue().getDisplay(); String s = hm.getValue().getDisplay();
renderStatus(hm, x).tx(" in a "+s+" heirarchy"); renderStatus(hm, x).tx(" "+/*!#*/"in a "+s+" heirarchy");
} else if (VersionComparisonAnnotation.hasDeleted(cs, "hierarchyMeaning")) { } else if (VersionComparisonAnnotation.hasDeleted(cs, "hierarchyMeaning")) {
makeHierarchyParam(x, null, (Enumeration<CodeSystemHierarchyMeaning>) VersionComparisonAnnotation.getDeleted(cs, "hierarchyMeaning").get(0)); makeHierarchyParam(x, null, (Enumeration<CodeSystemHierarchyMeaning>) VersionComparisonAnnotation.getDeleted(cs, "hierarchyMeaning").get(0));
} else if (CodeSystemUtilities.hasHierarchy(cs)) { } else if (CodeSystemUtilities.hasHierarchy(cs)) {
x.tx(" in an undefined heirarchy"); x.tx(" "+/*!#*/"in an undefined heirarchy");
} else { } else {
x.tx(""); x.tx("");
} }
@ -284,7 +285,7 @@ public class CodeSystemRenderer extends TerminologyRenderer {
private void addCopyColumn(XhtmlNode tr) { private void addCopyColumn(XhtmlNode tr) {
if (context.isCopyButton()) { if (context.isCopyButton()) {
tr.td().b().tx("Copy"); tr.td().b().tx(/*!#*/"Copy");
} }
} }
@ -462,11 +463,11 @@ public class CodeSystemRenderer extends TerminologyRenderer {
td = tr.td(); td = tr.td();
Boolean b = CodeSystemUtilities.isDeprecated(cs, c, false); Boolean b = CodeSystemUtilities.isDeprecated(cs, c, false);
if (b != null && b) { if (b != null && b) {
smartAddText(td, getContext().getWorker().translator().translate("xhtml-gen-cs", "Deprecated", getContext().getLang())); smartAddText(td, formatMessage(RenderingContext.RENDER_CODESYSTEM_DEPRECATED));
hasExtensions = true; hasExtensions = true;
if (ToolingExtensions.hasExtension(c, ToolingExtensions.EXT_REPLACED_BY)) { if (ToolingExtensions.hasExtension(c, ToolingExtensions.EXT_REPLACED_BY)) {
Coding cc = (Coding) ToolingExtensions.getExtension(c, ToolingExtensions.EXT_REPLACED_BY).getValue(); Coding cc = (Coding) ToolingExtensions.getExtension(c, ToolingExtensions.EXT_REPLACED_BY).getValue();
td.tx(" (replaced by "); td.tx(" "+/*!#*/"(replaced by ");
String url = getCodingReference(cc, system); String url = getCodingReference(cc, system);
if (url != null) { if (url != null) {
td.ah(url).addText(cc.getCode()); td.ah(url).addText(cc.getCode());
@ -539,8 +540,15 @@ public class CodeSystemRenderer extends TerminologyRenderer {
if (first) first = false; else td.addText(", "); if (first) first = false; else td.addText(", ");
if (pcv.hasValueCoding()) { if (pcv.hasValueCoding()) {
td.addText(pcv.getValueCoding().getCode()); td.addText(pcv.getValueCoding().getCode());
} else if (pcv.hasValueStringType() && Utilities.isAbsoluteUrlLinkable(pcv.getValue().primitiveValue())) { } else if (pcv.hasValueStringType() && Utilities.isAbsoluteUrl(pcv.getValue().primitiveValue())) {
td.ah(pcv.getValue().primitiveValue()).tx(pcv.getValue().primitiveValue()); CanonicalResource cr = (CanonicalResource) context.getContext().fetchResource(Resource.class, pcv.getValue().primitiveValue());
if (cr != null) {
td.ah(cr.getWebPath(), cr.getVersionedUrl()).tx(cr.present());
} else if (Utilities.isAbsoluteUrlLinkable(pcv.getValue().primitiveValue())) {
td.ah(pcv.getValue().primitiveValue()).tx(pcv.getValue().primitiveValue());
} else {
td.code(pcv.getValue().primitiveValue());
}
} else if ("parent".equals(pcv.getCode())) { } else if ("parent".equals(pcv.getCode())) {
td.ah("#"+cs.getId()+"-"+Utilities.nmtokenize(pcv.getValue().primitiveValue())).addText(pcv.getValue().primitiveValue()); td.ah("#"+cs.getId()+"-"+Utilities.nmtokenize(pcv.getValue().primitiveValue())).addText(pcv.getValue().primitiveValue());
} else { } else {
@ -598,9 +606,9 @@ public class CodeSystemRenderer extends TerminologyRenderer {
} }
if (context.isCopyButton()) { if (context.isCopyButton()) {
td = tr.td(); td = tr.td();
clipboard(td, "icon_clipboard_x.png", "XML", "<system value=\""+Utilities.escapeXml(cs.getUrl())+"\">\n"+(cs.getVersionNeeded() ? "<version value=\""+Utilities.escapeXml(cs.getVersion())+"\">\n" : "")+"<code value=\""+Utilities.escapeXml(c.getCode())+"\">\n<display value=\""+Utilities.escapeXml(c.getDisplay())+"\">\n"); clipboard(td, "icon_clipboard_x.png", /*!#*/"XML", "<system value=\""+Utilities.escapeXml(cs.getUrl())+"\">\n"+(cs.getVersionNeeded() ? "<version value=\""+Utilities.escapeXml(cs.getVersion())+"\">\n" : "")+"<code value=\""+Utilities.escapeXml(c.getCode())+"\">\n<display value=\""+Utilities.escapeXml(c.getDisplay())+"\">\n");
td.nbsp(); td.nbsp();
clipboard(td, "icon_clipboard_j.png", "JSON", "\"system\" : \""+Utilities.escapeXml(cs.getUrl())+"\",\n"+(cs.getVersionNeeded() ? "\"version\" : \""+Utilities.escapeXml(cs.getVersion())+"\",\n" : "")+"\"code\" : \""+Utilities.escapeXml(c.getCode())+"\",\n\"display\" : \""+Utilities.escapeXml(c.getDisplay())+"\"\n"); clipboard(td, "icon_clipboard_j.png", /*!#*/"JSON", "\"system\" : \""+Utilities.escapeXml(cs.getUrl())+"\",\n"+(cs.getVersionNeeded() ? "\"version\" : \""+Utilities.escapeXml(cs.getVersion())+"\",\n" : "")+"\"code\" : \""+Utilities.escapeXml(c.getCode())+"\",\n\"display\" : \""+Utilities.escapeXml(c.getDisplay())+"\"\n");
} }
return hasExtensions; return hasExtensions;
} }

View File

@ -1,6 +1,9 @@
package org.hl7.fhir.r5.renderers; package org.hl7.fhir.r5.renderers;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -9,8 +12,10 @@ import java.util.Map;
import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.DefinitionException;
import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.exceptions.FHIRFormatError;
import org.hl7.fhir.r5.model.CodeSystem; import org.hl7.fhir.r5.model.CodeSystem;
import org.hl7.fhir.r5.model.Coding;
import org.hl7.fhir.r5.model.ConceptMap; import org.hl7.fhir.r5.model.ConceptMap;
import org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent; import org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent;
import org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupUnmappedMode;
import org.hl7.fhir.r5.model.ConceptMap.MappingPropertyComponent; import org.hl7.fhir.r5.model.ConceptMap.MappingPropertyComponent;
import org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent; import org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent;
import org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent; import org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent;
@ -22,11 +27,255 @@ import org.hl7.fhir.r5.model.Resource;
import org.hl7.fhir.r5.renderers.utils.RenderingContext; import org.hl7.fhir.r5.renderers.utils.RenderingContext;
import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext; import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext;
import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.ToolingExtensions;
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.xhtml.NodeType;
import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xhtml.XhtmlNode;
public class ConceptMapRenderer extends TerminologyRenderer { public class ConceptMapRenderer extends TerminologyRenderer {
public enum RenderMultiRowSortPolicy {
UNSORTED, FIRST_COL, LAST_COL
}
public interface IMultiMapRendererAdvisor {
public List<Coding> getMembers(String uri);
public boolean describeMap(ConceptMap map, XhtmlNode x);
public String getLink(String system, String code);
}
public static class MultipleMappingRowSorter implements Comparator<MultipleMappingRow> {
private boolean first;
protected MultipleMappingRowSorter(boolean first) {
super();
this.first = first;
}
@Override
public int compare(MultipleMappingRow o1, MultipleMappingRow o2) {
String s1 = first ? o1.firstCode() : o1.lastCode();
String s2 = first ? o2.firstCode() : o2.lastCode();
return s1.compareTo(s2);
}
}
public static class Cell {
private String system;
private String code;
private String display;
private String relationship;
private String relComment;
public boolean renderedRel;
public boolean renderedCode;
private Cell clone;
protected Cell() {
super();
}
public Cell(String system, String code, String display) {
this.system = system;
this.code = code;
this.display = display;
}
public Cell(String system, String code, String relationship, String comment) {
this.system = system;
this.code = code;
this.relationship = relationship;
this.relComment = comment;
}
public boolean matches(String system, String code) {
return (system != null && system.equals(this.system)) && (code != null && code.equals(this.code));
}
public String present() {
if (system == null) {
return code;
} else {
return code; //+(clone == null ? "" : " (@"+clone.code+")");
}
}
public Cell copy(boolean clone) {
Cell res = new Cell();
res.system = system;
res.code = code;
res.display = display;
res.relationship = relationship;
res.relComment = relComment;
res.renderedRel = renderedRel;
res.renderedCode = renderedCode;
if (clone) {
res.clone = this;
}
return res;
}
@Override
public String toString() {
return relationship+" "+system + "#" + code + " \"" + display + "\"";
}
}
public static class MultipleMappingRowItem {
List<Cell> cells = new ArrayList<>();
@Override
public String toString() {
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
for (Cell cell : cells) {
if (cell.relationship != null) {
b.append(cell.relationship+cell.code);
} else {
b.append(cell.code);
}
}
return b.toString();
}
}
public static class MultipleMappingRow {
private List<MultipleMappingRowItem> rowSets = new ArrayList<>();
private MultipleMappingRow stickySource;
public MultipleMappingRow(int i, String system, String code, String display) {
MultipleMappingRowItem row = new MultipleMappingRowItem();
rowSets.add(row);
for (int c = 0; c < i; c++) {
row.cells.add(new Cell()); // blank cell spaces
}
row.cells.add(new Cell(system, code, display));
}
public MultipleMappingRow(MultipleMappingRow stickySource) {
this.stickySource = stickySource;
}
@Override
public String toString() {
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
for (MultipleMappingRowItem rowSet : rowSets) {
b.append(""+rowSet.cells.size());
}
CommaSeparatedStringBuilder b2 = new CommaSeparatedStringBuilder(";");
for (MultipleMappingRowItem rowSet : rowSets) {
b2.append(rowSet.toString());
}
return ""+rowSets.size()+" ["+b.toString()+"] ("+b2.toString()+")";
}
public String lastCode() {
MultipleMappingRowItem first = rowSets.get(0);
for (int i = first.cells.size()-1; i >= 0; i--) {
if (first.cells.get(i).code != null) {
return first.cells.get(i).code;
}
}
return "";
}
public String firstCode() {
MultipleMappingRowItem first = rowSets.get(0);
for (int i = 0; i < first.cells.size(); i++) {
if (first.cells.get(i).code != null) {
return first.cells.get(i).code;
}
}
return "";
}
public void addSource(MultipleMappingRow sourceRow, List<MultipleMappingRow> rowList, ConceptMapRelationship relationship, String comment) {
// we already have a row, and we're going to collapse the rows on sourceRow into here, and add a matching terminus
assert sourceRow.rowSets.get(0).cells.size() == rowSets.get(0).cells.size()-1;
rowList.remove(sourceRow);
Cell template = rowSets.get(0).cells.get(rowSets.get(0).cells.size()-1);
for (MultipleMappingRowItem row : sourceRow.rowSets) {
row.cells.add(new Cell(template.system, template.code, relationship.getSymbol(), comment));
}
rowSets.addAll(sourceRow.rowSets);
}
public void addTerminus() {
for (MultipleMappingRowItem row : rowSets) {
row.cells.add(new Cell(null, null, "X", null));
}
}
public void addTarget(String system, String code, ConceptMapRelationship relationship, String comment, List<MultipleMappingRow> sets, int colCount) {
if (rowSets.get(0).cells.size() == colCount+1) { // if it's already has a target for this col then we have to clone (and split) the rows
for (MultipleMappingRowItem row : rowSets) {
row.cells.add(new Cell(system, code, relationship.getSymbol(), comment));
}
} else {
MultipleMappingRow nrow = new MultipleMappingRow(this);
for (MultipleMappingRowItem row : rowSets) {
MultipleMappingRowItem n = new MultipleMappingRowItem();
for (int i = 0; i < row.cells.size()-1; i++) { // note to skip the last
n.cells.add(row.cells.get(i).copy(true));
}
n.cells.add(new Cell(system, code, relationship.getSymbol(), comment));
nrow.rowSets.add(n);
}
sets.add(sets.indexOf(this), nrow);
}
}
public String lastSystem() {
MultipleMappingRowItem first = rowSets.get(0);
for (int i = first.cells.size()-1; i >= 0; i--) {
if (first.cells.get(i).system != null) {
return first.cells.get(i).system;
}
}
return "";
}
public void addCopy(String system) {
for (MultipleMappingRowItem row : rowSets) {
row.cells.add(new Cell(system, lastCode(), "=", null));
}
}
public boolean alreadyHasMappings(int i) {
for (MultipleMappingRowItem row : rowSets) {
if (row.cells.size() > i+1) {
return true;
}
}
return false;
}
public Cell getLastSource(int i) {
for (MultipleMappingRowItem row : rowSets) {
return row.cells.get(i+1);
}
throw new Error("Should not get here"); // return null
}
public void cloneSource(int i, Cell cell) {
MultipleMappingRowItem row = new MultipleMappingRowItem();
rowSets.add(row);
for (int c = 0; c < i-1; c++) {
row.cells.add(new Cell()); // blank cell spaces
}
row.cells.add(cell.copy(true));
row.cells.add(rowSets.get(0).cells.get(rowSets.get(0).cells.size()-1).copy(false));
}
}
public ConceptMapRenderer(RenderingContext context) { public ConceptMapRenderer(RenderingContext context) {
super(context); super(context);
} }
@ -45,23 +294,23 @@ public class ConceptMapRenderer extends TerminologyRenderer {
} }
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("Mapping from "); p.tx(/*!#*/"Mapping from ");
if (cm.hasSourceScope()) if (cm.hasSourceScope())
AddVsRef(cm.getSourceScope().primitiveValue(), p, cm); AddVsRef(cm.getSourceScope().primitiveValue(), p, cm);
else else
p.tx("(not specified)"); p.tx(/*!#*/"(not specified)");
p.tx(" to "); p.tx(" "+/*!#*/"to ");
if (cm.hasTargetScope()) if (cm.hasTargetScope())
AddVsRef(cm.getTargetScope().primitiveValue(), p, cm); AddVsRef(cm.getTargetScope().primitiveValue(), p, cm);
else else
p.tx("(not specified)"); p.tx(/*!#*/"(not specified)");
p = x.para(); p = x.para();
if (cm.getExperimental()) if (cm.getExperimental())
p.addText(Utilities.capitalize(cm.getStatus().toString())+" (not intended for production usage). "); p.addText(Utilities.capitalize(cm.getStatus().toString())+" "+/*!#*/"(not intended for production usage). ");
else else
p.addText(Utilities.capitalize(cm.getStatus().toString())+". "); p.addText(Utilities.capitalize(cm.getStatus().toString())+". ");
p.tx("Published on "+(cm.hasDate() ? display(cm.getDateElement()) : "?ngen-10?")+" by "+cm.getPublisher()); p.tx(/*!#*/"Published on "+(cm.hasDate() ? display(cm.getDateElement()) : "?ngen-10?")+" by "+cm.getPublisher());
if (!cm.getContact().isEmpty()) { if (!cm.getContact().isEmpty()) {
p.tx(" ("); p.tx(" (");
boolean firsti = true; boolean firsti = true;
@ -131,18 +380,18 @@ public class ConceptMapRenderer extends TerminologyRenderer {
x.hr(); x.hr();
} }
XhtmlNode pp = x.para(); XhtmlNode pp = x.para();
pp.b().tx("Group "+gc); pp.b().tx(/*!#*/"Group "+gc);
pp.tx("Mapping from "); pp.tx(/*!#*/"Mapping from ");
if (grp.hasSource()) { if (grp.hasSource()) {
renderCanonical(cm, pp, grp.getSource()); renderCanonical(cm, pp, grp.getSource());
} else { } else {
pp.code("unspecified code system"); pp.code(/*!#*/"unspecified code system");
} }
pp.tx(" to "); pp.tx(" to ");
if (grp.hasTarget()) { if (grp.hasTarget()) {
renderCanonical(cm, pp, grp.getTarget()); renderCanonical(cm, pp, grp.getTarget());
} else { } else {
pp.code("unspecified code system"); pp.code(/*!#*/"unspecified code system");
} }
String display; String display;
@ -150,11 +399,11 @@ public class ConceptMapRenderer extends TerminologyRenderer {
// simple // simple
XhtmlNode tbl = x.table( "grid"); XhtmlNode tbl = x.table( "grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx("Source Code"); tr.td().b().tx(/*!#*/"Source Code");
tr.td().b().tx("Relationship"); tr.td().b().tx(/*!#*/"Relationship");
tr.td().b().tx("Target Code"); tr.td().b().tx(/*!#*/"Target Code");
if (comment) if (comment)
tr.td().b().tx("Comment"); tr.td().b().tx(/*!#*/"Comment");
for (SourceElementComponent ccl : grp.getElement()) { for (SourceElementComponent ccl : grp.getElement()) {
tr = tbl.tr(); tr = tbl.tr();
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
@ -201,21 +450,21 @@ public class ConceptMapRenderer extends TerminologyRenderer {
XhtmlNode tbl = x.table( "grid"); XhtmlNode tbl = x.table( "grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
XhtmlNode td; XhtmlNode td;
tr.td().colspan(Integer.toString(1+sources.size())).b().tx("Source Concept Details"); tr.td().colspan(Integer.toString(1+sources.size())).b().tx(/*!#*/"Source Concept Details");
if (hasRelationships) { if (hasRelationships) {
tr.td().b().tx("Relationship"); tr.td().b().tx(/*!#*/"Relationship");
} }
tr.td().colspan(Integer.toString(1+targets.size())).b().tx("Target Concept Details"); tr.td().colspan(Integer.toString(1+targets.size())).b().tx(/*!#*/"Target Concept Details");
if (comment) { if (comment) {
tr.td().b().tx("Comment"); tr.td().b().tx(/*!#*/"Comment");
} }
tr.td().colspan(Integer.toString(1+targets.size())).b().tx("Properties"); tr.td().colspan(Integer.toString(1+targets.size())).b().tx(/*!#*/"Properties");
tr = tbl.tr(); tr = tbl.tr();
if (sources.get("code").size() == 1) { if (sources.get("code").size() == 1) {
String url = sources.get("code").iterator().next(); String url = sources.get("code").iterator().next();
renderCSDetailsLink(tr, url, true); renderCSDetailsLink(tr, url, true);
} else } else
tr.td().b().tx("Code"); tr.td().b().tx(/*!#*/"Code");
for (String s : sources.keySet()) { for (String s : sources.keySet()) {
if (s != null && !s.equals("code")) { if (s != null && !s.equals("code")) {
if (sources.get(s).size() == 1) { if (sources.get(s).size() == 1) {
@ -232,7 +481,7 @@ public class ConceptMapRenderer extends TerminologyRenderer {
String url = targets.get("code").iterator().next(); String url = targets.get("code").iterator().next();
renderCSDetailsLink(tr, url, true); renderCSDetailsLink(tr, url, true);
} else } else
tr.td().b().tx("Code"); tr.td().b().tx(/*!#*/"Code");
for (String s : targets.keySet()) { for (String s : targets.keySet()) {
if (s != null && !s.equals("code")) { if (s != null && !s.equals("code")) {
if (targets.get(s).size() == 1) { if (targets.get(s).size() == 1) {
@ -429,8 +678,8 @@ public class ConceptMapRenderer extends TerminologyRenderer {
if (span2) { if (span2) {
td.colspan("2"); td.colspan("2");
} }
td.b().tx("Codes"); td.b().tx(/*!#*/"Codes");
td.tx(" from "); td.tx(" "+/*!#*/"from ");
if (cs == null) if (cs == null)
td.tx(url); td.tx(url);
else else
@ -475,4 +724,257 @@ public class ConceptMapRenderer extends TerminologyRenderer {
return null; return null;
} }
public static XhtmlNode renderMultipleMaps(String start, String startLink, List<ConceptMap> maps, IMultiMapRendererAdvisor advisor, RenderMultiRowSortPolicy sort) {
// 1+1 column for each provided map
List<MultipleMappingRow> rowSets = new ArrayList<>();
for (int i = 0; i < maps.size(); i++) {
populateRows(rowSets, maps.get(i), i, advisor);
}
collateRows(rowSets);
if (sort != RenderMultiRowSortPolicy.UNSORTED) {
Collections.sort(rowSets, new MultipleMappingRowSorter(sort == RenderMultiRowSortPolicy.FIRST_COL));
}
XhtmlNode div = new XhtmlNode(NodeType.Element, "div");
XhtmlNode tbl = div.table("none").style("text-align: left; border-spacing: 0; padding: 5px");
XhtmlNode tr = tbl.tr();
styleCell(tr.td(), false, true, 5).b().ahOrNot(startLink).tx(start);
for (ConceptMap map : maps) {
XhtmlNode td = styleCell(tr.td(), false, true, 5).colspan(2);
if (!advisor.describeMap(map, td)) {
if (map.hasWebPath()) {
td.b().ah(map.getWebPath(), map.getVersionedUrl()).tx(map.present());
} else {
td.b().tx(map.present());
}
}
}
for (MultipleMappingRow row : rowSets) {
renderMultiRow(tbl, row, maps, advisor);
}
return div;
}
private static void collateRows(List<MultipleMappingRow> rowSets) {
List<MultipleMappingRow> toDelete = new ArrayList<ConceptMapRenderer.MultipleMappingRow>();
for (MultipleMappingRow rowSet : rowSets) {
MultipleMappingRow tgt = rowSet.stickySource;
while (toDelete.contains(tgt)) {
tgt = tgt.stickySource;
}
if (tgt != null && rowSets.contains(tgt)) {
tgt.rowSets.addAll(rowSet.rowSets);
toDelete.add(rowSet);
}
}
rowSets.removeAll(toDelete);
}
private static void renderMultiRow(XhtmlNode tbl, MultipleMappingRow rows, List<ConceptMap> maps, IMultiMapRendererAdvisor advisor) {
int rowCounter = 0;
for (MultipleMappingRowItem row : rows.rowSets) {
XhtmlNode tr = tbl.tr();
boolean first = true;
int cellCounter = 0;
Cell last = null;
for (Cell cell : row.cells) {
if (first) {
if (!cell.renderedCode) {
int c = 1;
for (int i = rowCounter + 1; i < rows.rowSets.size(); i++) {
if (cell.code != null && rows.rowSets.get(i).cells.size() > cellCounter && cell.code.equals(rows.rowSets.get(i).cells.get(cellCounter).code)) {
rows.rowSets.get(i).cells.get(cellCounter).renderedCode = true;
c++;
} else {
break;
}
}
if (cell.code == null) {
styleCell(tr.td(), rowCounter == 0, true, 5).rowspan(c).style("background-color: #eeeeee");
} else {
String link = advisor.getLink(cell.system, cell.code);
XhtmlNode x = null;
if (link != null) {
x = styleCell(tr.td(), rowCounter == 0, true, 5).attributeNN("title", cell.display).rowspan(c).ah(link);
} else {
x = styleCell(tr.td(), rowCounter == 0, true, 5).attributeNN("title", cell.display).rowspan(c);
}
// if (cell.clone != null) {
// x.style("color: grey");
// }
x.tx(cell.present());
}
}
first = false;
} else {
if (!cell.renderedRel) {
int c = 1;
for (int i = rowCounter + 1; i < rows.rowSets.size(); i++) {
if ((cell.relationship != null && rows.rowSets.get(i).cells.size() > cellCounter && cell.relationship.equals(rows.rowSets.get(i).cells.get(cellCounter).relationship)) &&
(cell.code != null && cell.code.equals(rows.rowSets.get(i).cells.get(cellCounter).code)) &&
(last.code != null && cell.code.equals(rows.rowSets.get(i).cells.get(cellCounter-1).code))) {
rows.rowSets.get(i).cells.get(cellCounter).renderedRel = true;
c++;
} else {
break;
}
}
if (last.code == null || cell.code == null) {
styleCell(tr.td(), rowCounter == 0, true, 5).style("background-color: #eeeeee");
} else if (cell.relationship != null) {
styleCell(tr.tdW(16), rowCounter == 0, true, 0).attributeNN("title", cell.relComment).rowspan(c).style("background-color: LightGrey; text-align: center; vertical-align: middle; color: white").tx(cell.relationship);
} else {
styleCell(tr.tdW(16), rowCounter == 0, false, 0).rowspan(c);
}
}
if (!cell.renderedCode) {
int c = 1;
for (int i = rowCounter + 1; i < rows.rowSets.size(); i++) {
if (cell.code != null && rows.rowSets.get(i).cells.size() > cellCounter && cell.code.equals(rows.rowSets.get(i).cells.get(cellCounter).code)) {
rows.rowSets.get(i).cells.get(cellCounter).renderedCode = true;
c++;
} else {
break;
}
}
if (cell.code == null) {
styleCell(tr.td(), rowCounter == 0, true, 5).rowspan(c).style("background-color: #eeeeee");
} else {
String link = advisor.getLink(cell.system, cell.code);
XhtmlNode x = null;
if (link != null) {
x = styleCell(tr.td(), rowCounter == 0, true, 5).attributeNN("title", cell.display).rowspan(c).ah(link);
} else {
x = styleCell(tr.td(), rowCounter == 0, true, 5).attributeNN("title", cell.display).rowspan(c);
}
// if (cell.clone != null) {
// x.style("color: grey");
// }
x.tx(cell.present());
}
}
}
last = cell;
cellCounter++;
}
rowCounter++;
}
}
private static XhtmlNode styleCell(XhtmlNode td, boolean firstrow, boolean sides, int padding) {
if (firstrow) {
td.style("vertical-align: middle; border-top: 1px solid black; padding: "+padding+"px");
} else {
td.style("vertical-align: middle; border-top: 1px solid LightGrey; padding: "+padding+"px");
}
if (sides) {
td.style("border-left: 1px solid LightGrey; border-right: 2px solid LightGrey");
}
return td;
}
private static void populateRows(List<MultipleMappingRow> rowSets, ConceptMap map, int i, IMultiMapRendererAdvisor advisor) {
// if we can resolve the value set, we create entries for it
if (map.hasSourceScope()) {
List<Coding> codings = advisor.getMembers(map.getSourceScope().primitiveValue());
if (codings != null) {
for (Coding c : codings) {
MultipleMappingRow row = i == 0 ? null : findExistingRowBySource(rowSets, c.getSystem(), c.getCode(), i);
if (row == null) {
row = new MultipleMappingRow(i, c.getSystem(), c.getCode(), c.getDisplay());
rowSets.add(row);
}
}
}
}
for (ConceptMapGroupComponent grp : map.getGroup()) {
for (SourceElementComponent src : grp.getElement()) {
MultipleMappingRow row = findExistingRowBySource(rowSets, grp.getSource(), src.getCode(), i);
if (row == null) {
row = new MultipleMappingRow(i, grp.getSource(), src.getCode(), src.getDisplay());
rowSets.add(row);
}
if (src.getNoMap()) {
row.addTerminus();
} else {
List<TargetElementComponent> todo = new ArrayList<>();
for (TargetElementComponent tgt : src.getTarget()) {
MultipleMappingRow trow = findExistingRowByTarget(rowSets, grp.getTarget(), tgt.getCode(), i);
if (trow == null) {
row.addTarget(grp.getTarget(), tgt.getCode(), tgt.getRelationship(), tgt.getComment(), rowSets, i);
} else {
todo.add(tgt);
}
}
// we've already got a mapping to these targets. So we gather them under the one mapping - but do this after the others are done
for (TargetElementComponent t : todo) {
MultipleMappingRow trow = findExistingRowByTarget(rowSets, grp.getTarget(), t.getCode(), i);
if (row.alreadyHasMappings(i)) {
// src is already mapped, and so is target, and now we need to map src to target too
// we have to clone src, but we only clone the last
trow.cloneSource(i, row.getLastSource(i));
} else {
trow.addSource(row, rowSets, t.getRelationship(), t.getComment());
}
}
}
}
boolean copy = grp.hasUnmapped() && grp.getUnmapped().getMode() == ConceptMapGroupUnmappedMode.USESOURCECODE;
if (copy) {
for (MultipleMappingRow row : rowSets) {
if (row.rowSets.get(0).cells.size() == i && row.lastSystem().equals(grp.getSource())) {
row.addCopy(grp.getTarget());
}
}
}
}
for (MultipleMappingRow row : rowSets) {
if (row.rowSets.get(0).cells.size() == i) {
row.addTerminus();
}
}
if (map.hasTargetScope()) {
List<Coding> codings = advisor.getMembers(map.getTargetScope().primitiveValue());
if (codings != null) {
for (Coding c : codings) {
MultipleMappingRow row = findExistingRowByTarget(rowSets, c.getSystem(), c.getCode(), i);
if (row == null) {
row = new MultipleMappingRow(i+1, c.getSystem(), c.getCode(), c.getDisplay());
rowSets.add(row);
} else {
for (MultipleMappingRowItem cells : row.rowSets) {
Cell last = cells.cells.get(cells.cells.size() -1);
if (last.system != null && last.system.equals(c.getSystem()) && last.code.equals(c.getCode()) && last.display == null) {
last.display = c.getDisplay();
}
}
}
}
}
}
}
private static MultipleMappingRow findExistingRowByTarget(List<MultipleMappingRow> rows, String system, String code, int i) {
for (MultipleMappingRow row : rows) {
for (MultipleMappingRowItem cells : row.rowSets) {
if (cells.cells.size() > i + 1 && cells.cells.get(i+1).matches(system, code)) {
return row;
}
}
}
return null;
}
private static MultipleMappingRow findExistingRowBySource(List<MultipleMappingRow> rows, String system, String code, int i) {
for (MultipleMappingRow row : rows) {
for (MultipleMappingRowItem cells : row.rowSets) {
if (cells.cells.size() > i && cells.cells.get(i).matches(system, code)) {
return row;
}
}
}
return null;
}
} }

View File

@ -159,10 +159,15 @@ public class DataRenderer extends Renderer implements CodeResolver {
parts[0] = parts[0].substring(0, parts[0].indexOf(".")); parts[0] = parts[0].substring(0, parts[0].indexOf("."));
} }
StructureDefinition p = getContext().getWorker().fetchResource(StructureDefinition.class, parts[0]); StructureDefinition p = getContext().getWorker().fetchResource(StructureDefinition.class, parts[0]);
if (p == null) if (p == null) {
p = getContext().getWorker().fetchTypeDefinition(parts[0]); p = getContext().getWorker().fetchTypeDefinition(parts[0]);
if (p == null) }
if (context.getTypeMap().containsKey(parts[0])) {
p = getContext().getWorker().fetchTypeDefinition(context.getTypeMap().get(parts[0]));
}
if (p == null) {
p = getContext().getWorker().fetchResource(StructureDefinition.class, link); p = getContext().getWorker().fetchResource(StructureDefinition.class, link);
}
if (p != null) { if (p != null) {
if ("Extension".equals(p.getType())) { if ("Extension".equals(p.getType())) {
path = null; path = null;
@ -175,8 +180,9 @@ public class DataRenderer extends Renderer implements CodeResolver {
if (url == null) { if (url == null) {
url = p.getUserString("filename"); url = p.getUserString("filename");
} }
} else } else {
throw new DefinitionException("Unable to resolve markdown link "+link); throw new DefinitionException(/*!#*/"Unable to resolve markdown link "+link);
}
text = left+"["+link+"]("+url+(path == null ? "" : "#"+path)+")"+right; text = left+"["+link+"]("+url+(path == null ? "" : "#"+path)+")"+right;
} }
@ -210,18 +216,18 @@ public class DataRenderer extends Renderer implements CodeResolver {
private static String month(String m) { private static String month(String m) {
switch (m) { switch (m) {
case "1" : return "Jan"; case "1" : return /*!#*/"Jan";
case "2" : return "Feb"; case "2" : return /*!#*/"Feb";
case "3" : return "Mar"; case "3" : return /*!#*/"Mar";
case "4" : return "Apr"; case "4" : return/*!#*/ "Apr";
case "5" : return "May"; case "5" : return /*!#*/"May";
case "6" : return "Jun"; case "6" : return /*!#*/"Jun";
case "7" : return "Jul"; case "7" : return /*!#*/"Jul";
case "8" : return "Aug"; case "8" : return /*!#*/"Aug";
case "9" : return "Sep"; case "9" : return /*!#*/"Sep";
case "10" : return "Oct"; case "10" : return /*!#*/"Oct";
case "11" : return "Nov"; case "11" : return /*!#*/"Nov";
case "12" : return "Dec"; case "12" : return /*!#*/"Dec";
default: return null; default: return null;
} }
} }
@ -241,16 +247,16 @@ public class DataRenderer extends Renderer implements CodeResolver {
ed = p[p.length-1]; ed = p[p.length-1];
} }
switch (ed) { switch (ed) {
case "900000000000207008": return "Intl"+dt; case "900000000000207008": return /*!#*/"Intl"+dt;
case "731000124108": return "US"+dt; case "731000124108": return /*!#*/"US"+dt;
case "32506021000036107": return "AU"+dt; case "32506021000036107": return /*!#*/"AU"+dt;
case "449081005": return "ES"+dt; case "449081005": return /*!#*/"ES"+dt;
case "554471000005108": return "DK"+dt; case "554471000005108": return /*!#*/"DK"+dt;
case "11000146104": return "NL"+dt; case "11000146104": return /*!#*/"NL"+dt;
case "45991000052106": return "SE"+dt; case "45991000052106": return /*!#*/"SE"+dt;
case "999000041000000102": return "UK"+dt; case "999000041000000102": return /*!#*/"UK"+dt;
case "20611000087101": return "CA"+dt; case "20611000087101": return /*!#*/"CA"+dt;
case "11000172109": return "BE"+dt; case "11000172109": return /*!#*/"BE"+dt;
default: return "??"+dt; default: return "??"+dt;
} }
} else { } else {
@ -260,38 +266,38 @@ public class DataRenderer extends Renderer implements CodeResolver {
public static String describeSystem(String system) { public static String describeSystem(String system) {
if (system == null) if (system == null)
return "[not stated]"; return /*!#*/"[not stated]";
if (system.equals("http://loinc.org")) if (system.equals("http://loinc.org"))
return "LOINC"; return /*!#*/"LOINC";
if (system.startsWith("http://snomed.info")) if (system.startsWith("http://snomed.info"))
return "SNOMED CT"; return /*!#*/"SNOMED CT";
if (system.equals("http://www.nlm.nih.gov/research/umls/rxnorm")) if (system.equals("http://www.nlm.nih.gov/research/umls/rxnorm"))
return "RxNorm"; return /*!#*/"RxNorm";
if (system.equals("http://hl7.org/fhir/sid/icd-9")) if (system.equals("http://hl7.org/fhir/sid/icd-9"))
return "ICD-9"; return /*!#*/"ICD-9";
if (system.equals("http://dicom.nema.org/resources/ontology/DCM")) if (system.equals("http://dicom.nema.org/resources/ontology/DCM"))
return "DICOM"; return /*!#*/"DICOM";
if (system.equals("http://unitsofmeasure.org")) if (system.equals("http://unitsofmeasure.org"))
return "UCUM"; return /*!#*/"UCUM";
return system; return system;
} }
public String displaySystem(String system) { public String displaySystem(String system) {
if (system == null) if (system == null)
return "[not stated]"; return /*!#*/"[not stated]";
if (system.equals("http://loinc.org")) if (system.equals("http://loinc.org"))
return "LOINC"; return /*!#*/"LOINC";
if (system.startsWith("http://snomed.info")) if (system.startsWith("http://snomed.info"))
return "SNOMED CT"; return /*!#*/"SNOMED CT";
if (system.equals("http://www.nlm.nih.gov/research/umls/rxnorm")) if (system.equals("http://www.nlm.nih.gov/research/umls/rxnorm"))
return "RxNorm"; return /*!#*/"RxNorm";
if (system.equals("http://hl7.org/fhir/sid/icd-9")) if (system.equals("http://hl7.org/fhir/sid/icd-9"))
return "ICD-9"; return /*!#*/"ICD-9";
if (system.equals("http://dicom.nema.org/resources/ontology/DCM")) if (system.equals("http://dicom.nema.org/resources/ontology/DCM"))
return "DICOM"; return /*!#*/"DICOM";
if (system.equals("http://unitsofmeasure.org")) if (system.equals("http://unitsofmeasure.org"))
return "UCUM"; return /*!#*/"UCUM";
CodeSystem cs = context.getContext().fetchCodeSystem(system); CodeSystem cs = context.getContext().fetchCodeSystem(system);
if (cs != null) { if (cs != null) {
@ -304,7 +310,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
if (system.contains("/")) { if (system.contains("/")) {
return system.substring(system.lastIndexOf("/")+1); return system.substring(system.lastIndexOf("/")+1);
} else { } else {
return "unknown"; return /*!#*/"unknown";
} }
} }
@ -335,7 +341,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
protected String describeLang(String lang) { protected String describeLang(String lang) {
// special cases: // special cases:
if ("fr-CA".equals(lang)) { if ("fr-CA".equals(lang)) {
return "French (Canadian)"; // this one was omitted from the value set return /*!#*/"French (Canadian)"; // this one was omitted from the value set
} }
ValueSet v = getContext().getWorker().findTxResource(ValueSet.class, "http://hl7.org/fhir/ValueSet/languages"); ValueSet v = getContext().getWorker().findTxResource(ValueSet.class, "http://hl7.org/fhir/ValueSet/languages");
if (v != null) { if (v != null) {
@ -402,10 +408,6 @@ public class DataRenderer extends Renderer implements CodeResolver {
// -- 4. Language support ------------------------------------------------------ // -- 4. Language support ------------------------------------------------------
protected String translate(String source, String content) {
return content;
}
public String gt(@SuppressWarnings("rawtypes") PrimitiveType value) { public String gt(@SuppressWarnings("rawtypes") PrimitiveType value) {
return value.primitiveValue(); return value.primitiveValue();
} }
@ -470,7 +472,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
} else { } else {
// somehow have to do better than this // somehow have to do better than this
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
li.b().tx("WARNING: Unrenderable Modifier Extension!"); li.b().tx(/*!#*/"WARNING: Unrenderable Modifier Extension!");
} }
} }
for (Extension ext : element.getExtension()) { for (Extension ext : element.getExtension()) {
@ -520,7 +522,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
render(div, ext.getValue()); render(div, ext.getValue());
} else { } else {
// somehow have to do better than this // somehow have to do better than this
div.b().tx("WARNING: Unrenderable Modifier Extension!"); div.b().tx(/*!#*/"WARNING: Unrenderable Modifier Extension!");
} }
} }
for (Extension ext : element.getExtension()) { for (Extension ext : element.getExtension()) {
@ -551,7 +553,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
if (b instanceof DataType) { if (b instanceof DataType) {
return display((DataType) b); return display((DataType) b);
} else { } else {
return "No display for "+b.fhirType(); return /*!#*/"No display for "+b.fhirType();
} }
} }
@ -587,7 +589,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
} else if (type.isPrimitive()) { } else if (type.isPrimitive()) {
return type.primitiveValue(); return type.primitiveValue();
} else { } else {
return "No display for "+type.fhirType(); return /*!#*/"No display for "+type.fhirType();
} }
} }
@ -669,7 +671,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
} }
public String display(BaseWrapper type) { public String display(BaseWrapper type) {
return "to do"; return /*!#*/"to do";
} }
public void render(XhtmlNode x, BaseWrapper type) throws FHIRFormatError, DefinitionException, IOException { public void render(XhtmlNode x, BaseWrapper type) throws FHIRFormatError, DefinitionException, IOException {
@ -677,13 +679,13 @@ public class DataRenderer extends Renderer implements CodeResolver {
try { try {
base = type.getBase(); base = type.getBase();
} catch (FHIRException | IOException e) { } catch (FHIRException | IOException e) {
x.tx("Error: " + e.getMessage()); // this shouldn't happen - it's an error in the library itself x.tx(/*!#*/"Error: " + e.getMessage()); // this shouldn't happen - it's an error in the library itself
return; return;
} }
if (base instanceof DataType) { if (base instanceof DataType) {
render(x, (DataType) base); render(x, (DataType) base);
} else { } else {
x.tx("to do: "+base.fhirType()); x.tx(/*!#*/"to do: "+base.fhirType());
} }
} }
@ -691,7 +693,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
if (b instanceof DataType) { if (b instanceof DataType) {
render(x, (DataType) b); render(x, (DataType) b);
} else { } else {
x.tx("No display for "+b.fhirType()); x.tx(/*!#*/"No display for "+b.fhirType());
} }
} }
@ -745,7 +747,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
} else if (type.isPrimitive()) { } else if (type.isPrimitive()) {
x.tx(type.primitiveValue()); x.tx(type.primitiveValue());
} else { } else {
x.tx("No display for "+type.fhirType()); x.tx(/*!#*/"No display for "+type.fhirType());
} }
} }
@ -837,7 +839,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
} }
if (a.hasAuthor()) { if (a.hasAuthor()) {
b.append("By "); b.append(/*!#*/"By ");
if (a.hasAuthorReference()) { if (a.hasAuthorReference()) {
b.append(a.getAuthorReference().getReference()); b.append(a.getAuthorReference().getReference());
} else if (a.hasAuthorStringType()) { } else if (a.hasAuthorStringType()) {
@ -1025,7 +1027,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
systemName = cs != null ? cs.present() : describeSystem(c.getSystem()); systemName = cs != null ? cs.present() : describeSystem(c.getSystem());
link = getLinkForCode(c.getSystem(), c.getVersion(), c.getCode()); link = getLinkForCode(c.getSystem(), c.getVersion(), c.getCode());
hint = systemName+": "+display+(c.hasVersion() ? " (version = "+c.getVersion()+")" : ""); hint = systemName+": "+display+(c.hasVersion() ? " "+/*!#*/"(version = "+c.getVersion()+")" : "");
return new CodeResolution(systemName, systemLink, link, display, hint); return new CodeResolution(systemName, systemLink, link, display, hint);
} }
@ -1060,7 +1062,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
x.tx(s); x.tx(s);
} }
if (c.hasVersion()) { if (c.hasVersion()) {
x.tx(" (version = "+c.getVersion()+")"); x.tx(" "+/*!#*/"(version = "+c.getVersion()+")");
} }
} }
@ -1075,7 +1077,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
s = c.getCode(); s = c.getCode();
if (showCodeDetails) { if (showCodeDetails) {
x.addText(s+" (Details: "+TerminologyRenderer.describeSystem(c.getSystem())+" code "+c.getCode()+" = '"+lookupCode(c.getSystem(), c.getVersion(), c.getCode())+"', stated as '"+c.getDisplay()+"')"); x.addText(s+" "+/*!#*/"(Details: "+TerminologyRenderer.describeSystem(c.getSystem())+" code "+c.getCode()+" = '"+lookupCode(c.getSystem(), c.getVersion(), c.getCode())+"', stated as '"+c.getDisplay()+"')");
} else } else
x.span(null, "{"+c.getSystem()+" "+c.getCode()+"}").addText(s); x.span(null, "{"+c.getSystem()+" "+c.getCode()+"}").addText(s);
} }
@ -1195,25 +1197,31 @@ public class DataRenderer extends Renderer implements CodeResolver {
} }
} }
x.span(null, "Codes: "+b.toString()).addText(s); x.span(null, /*!#*/"Codes: "+b.toString()).addText(s);
} }
} }
protected String displayIdentifier(Identifier ii) { protected String displayIdentifier(Identifier ii) {
String s = Utilities.noString(ii.getValue()) ? "?ngen-9?" : ii.getValue(); String s = Utilities.noString(ii.getValue()) ? "?ngen-9?" : ii.getValue();
NamingSystem ns = context.getContext().getNSUrlMap().get(ii.getSystem()); if ("urn:ietf:rfc:3986".equals(ii.getSystem()) && s.startsWith("urn:oid:")) {
if (ns != null) { s = "OID:"+s.substring(8);
s = ns.present()+"#"+s; } else if ("urn:ietf:rfc:3986".equals(ii.getSystem()) && s.startsWith("urn:uuid:")) {
} s = "UUID:"+s.substring(9);
if (ii.hasType()) {
if (ii.getType().hasText())
s = ii.getType().getText()+":\u00A0"+s;
else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasDisplay())
s = ii.getType().getCoding().get(0).getDisplay()+": "+s;
else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasCode())
s = lookupCode(ii.getType().getCoding().get(0).getSystem(), ii.getType().getCoding().get(0).getVersion(), ii.getType().getCoding().get(0).getCode())+": "+s;
} else { } else {
s = "id:\u00A0"+s; NamingSystem ns = context.getContext().getNSUrlMap().get(ii.getSystem());
if (ns != null) {
s = ns.present()+"#"+s;
}
if (ii.hasType()) {
if (ii.getType().hasText())
s = ii.getType().getText()+":\u00A0"+s;
else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasDisplay())
s = ii.getType().getCoding().get(0).getDisplay()+": "+s;
else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasCode())
s = lookupCode(ii.getType().getCoding().get(0).getSystem(), ii.getType().getCoding().get(0).getVersion(), ii.getType().getCoding().get(0).getCode())+": "+s;
} else if (ii.hasSystem()) {
s = ii.getSystem()+"#"+s;
}
} }
if (ii.hasUse() || ii.hasPeriod()) { if (ii.hasUse() || ii.hasPeriod()) {
@ -1234,24 +1242,32 @@ public class DataRenderer extends Renderer implements CodeResolver {
protected void renderIdentifier(XhtmlNode x, Identifier ii) { protected void renderIdentifier(XhtmlNode x, Identifier ii) {
if (ii.hasType()) { if (ii.hasType()) {
if (ii.getType().hasText()) if (ii.getType().hasText()) {
x.tx(ii.getType().getText()+":"); x.tx(ii.getType().getText());
else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasDisplay()) } else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasDisplay()) {
x.tx(ii.getType().getCoding().get(0).getDisplay()+":"); x.tx(ii.getType().getCoding().get(0).getDisplay());
else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasCode()) } else if (ii.getType().hasCoding() && ii.getType().getCoding().get(0).hasCode()) {
x.tx(lookupCode(ii.getType().getCoding().get(0).getSystem(), ii.getType().getCoding().get(0).getVersion(), ii.getType().getCoding().get(0).getCode())+":"); x.tx(lookupCode(ii.getType().getCoding().get(0).getSystem(), ii.getType().getCoding().get(0).getVersion(), ii.getType().getCoding().get(0).getCode()));
} else {
x.tx("id:");
}
x.nbsp();
NamingSystem ns = context.getContext().getNSUrlMap().get(ii.getSystem());
if (ns != null) {
if (ns.hasWebPath()) {
x.ah(ns.getWebPath()).tx("#");
} else {
x.tx(ns.present()+"#");
} }
x.tx("/");
} else if (ii.hasSystem()) {
NamingSystem ns = context.getContext().getNSUrlMap().get(ii.getSystem());
if (ns != null) {
if (ns.hasWebPath()) {
x.ah(ns.getWebPath(), ns.getDescription()).tx(ns.present());
} else {
x.tx(ns.present());
}
} else {
switch (ii.getSystem()) {
case "urn:oid:2.51.1.3":
x.ah("https://www.gs1.org/standards/id-keys/gln", /*!#*/"Global Location Number").tx("GLN");
break;
default:
x.code(ii.getSystem());
}
}
x.tx("/");
} }
x.tx(Utilities.noString(ii.getValue()) ? "?ngen-9?" : ii.getValue()); x.tx(Utilities.noString(ii.getValue()) ? "?ngen-9?" : ii.getValue());
@ -1259,7 +1275,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
x.nbsp(); x.nbsp();
x.tx("("); x.tx("(");
if (ii.hasUse()) { if (ii.hasUse()) {
x.tx("use:"); x.tx(/*!#*/"use:");
x.nbsp(); x.nbsp();
x.tx(ii.getUse().toString()); x.tx(ii.getUse().toString());
} }
@ -1268,7 +1284,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
x.nbsp(); x.nbsp();
} }
if (ii.hasPeriod()) { if (ii.hasPeriod()) {
x.tx("period:"); x.tx(/*!#*/"period:");
x.nbsp(); x.nbsp();
x.tx(displayPeriod(ii.getPeriod())); x.tx(displayPeriod(ii.getPeriod()));
} }
@ -1391,7 +1407,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
} }
c.code().tx(expr.getExpression()); c.code().tx(expr.getExpression());
} else if (expr.hasReference()) { } else if (expr.hasReference()) {
p.ah(expr.getReference()).tx("source"); p.ah(expr.getReference()).tx(/*!#*/"source");
} }
if (expr.hasName() || expr.hasDescription()) { if (expr.hasName() || expr.hasDescription()) {
p.tx("("); p.tx("(");
@ -1452,9 +1468,9 @@ public class DataRenderer extends Renderer implements CodeResolver {
protected void displayContactPoint(XhtmlNode p, ContactPoint c) { protected void displayContactPoint(XhtmlNode p, ContactPoint c) {
if (c != null) { if (c != null) {
if (c.getSystem() == ContactPointSystem.PHONE) { if (c.getSystem() == ContactPointSystem.PHONE) {
p.tx("Phone: "+c.getValue()); p.tx(/*!#*/"Phone: "+c.getValue());
} else if (c.getSystem() == ContactPointSystem.FAX) { } else if (c.getSystem() == ContactPointSystem.FAX) {
p.tx("Fax: "+c.getValue()); p.tx(/*!#*/"Fax: "+c.getValue());
} else if (c.getSystem() == ContactPointSystem.EMAIL) { } else if (c.getSystem() == ContactPointSystem.EMAIL) {
p.tx(c.getValue()); p.tx(c.getValue());
} else if (c.getSystem() == ContactPointSystem.URL) { } else if (c.getSystem() == ContactPointSystem.URL) {
@ -1469,11 +1485,11 @@ public class DataRenderer extends Renderer implements CodeResolver {
protected void addTelecom(XhtmlNode p, ContactPoint c) { protected void addTelecom(XhtmlNode p, ContactPoint c) {
if (c.getSystem() == ContactPointSystem.PHONE) { if (c.getSystem() == ContactPointSystem.PHONE) {
p.tx("Phone: "+c.getValue()); p.tx(/*!#*/"Phone: "+c.getValue());
} else if (c.getSystem() == ContactPointSystem.FAX) { } else if (c.getSystem() == ContactPointSystem.FAX) {
p.tx("Fax: "+c.getValue()); p.tx(/*!#*/"Fax: "+c.getValue());
} else if (c.getSystem() == ContactPointSystem.EMAIL) { } else if (c.getSystem() == ContactPointSystem.EMAIL) {
p.ah( "mailto:"+c.getValue()).addText(c.getValue()); p.ah("mailto:"+c.getValue()).addText(c.getValue());
} else if (c.getSystem() == ContactPointSystem.URL) { } else if (c.getSystem() == ContactPointSystem.URL) {
if (c.getValue().length() > 30) if (c.getValue().length() > 30)
p.ah(c.getValue()).addText(c.getValue().substring(0, 30)+"..."); p.ah(c.getValue()).addText(c.getValue().substring(0, 30)+"...");
@ -1485,8 +1501,8 @@ public class DataRenderer extends Renderer implements CodeResolver {
if (system == null) if (system == null)
return ""; return "";
switch (system) { switch (system) {
case PHONE: return "ph: "; case PHONE: return /*!#*/"ph: ";
case FAX: return "fax: "; case FAX: return /*!#*/"fax: ";
default: default:
return ""; return "";
} }
@ -1524,7 +1540,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
x.tx("(unit "+q.getCode()+" from "+q.getSystem()+")"); x.tx("(unit "+q.getCode()+" from "+q.getSystem()+")");
} }
if (showCodeDetails && q.hasCode()) { if (showCodeDetails && q.hasCode()) {
x.span("background: LightGoldenRodYellow", null).tx(" (Details: "+TerminologyRenderer.describeSystem(q.getSystem())+" code "+q.getCode()+" = '"+lookupCode(q.getSystem(), null, q.getCode())+"')"); x.span("background: LightGoldenRodYellow", null).tx(" "+/*!#*/"(Details: "+TerminologyRenderer.describeSystem(q.getSystem())+" code "+q.getCode()+" = '"+lookupCode(q.getSystem(), null, q.getCode())+"')");
} }
} }
@ -1568,13 +1584,13 @@ public class DataRenderer extends Renderer implements CodeResolver {
public String displayPeriod(Period p) { public String displayPeriod(Period p) {
String s = !p.hasStart() ? "(?)" : displayDateTime(p.getStartElement()); String s = !p.hasStart() ? "(?)" : displayDateTime(p.getStartElement());
s = s + " --> "; s = s + " --> ";
return s + (!p.hasEnd() ? "(ongoing)" : displayDateTime(p.getEndElement())); return s + (!p.hasEnd() ? /*!#*/"(ongoing)" : displayDateTime(p.getEndElement()));
} }
public void renderPeriod(XhtmlNode x, Period p) { public void renderPeriod(XhtmlNode x, Period p) {
x.addText(!p.hasStart() ? "??" : displayDateTime(p.getStartElement())); x.addText(!p.hasStart() ? "??" : displayDateTime(p.getStartElement()));
x.tx(" --> "); x.tx(" --> ");
x.addText(!p.hasEnd() ? "(ongoing)" : displayDateTime(p.getEndElement())); x.addText(!p.hasEnd() ? /*!#*/"(ongoing)" : displayDateTime(p.getEndElement()));
} }
public void renderUsageContext(XhtmlNode x, UsageContext u) throws FHIRFormatError, DefinitionException, IOException { public void renderUsageContext(XhtmlNode x, UsageContext u) throws FHIRFormatError, DefinitionException, IOException {
@ -1586,31 +1602,31 @@ public class DataRenderer extends Renderer implements CodeResolver {
public void renderTriggerDefinition(XhtmlNode x, TriggerDefinition td) throws FHIRFormatError, DefinitionException, IOException { public void renderTriggerDefinition(XhtmlNode x, TriggerDefinition td) throws FHIRFormatError, DefinitionException, IOException {
if (x.isPara()) { if (x.isPara()) {
x.b().tx("Type"); x.b().tx(/*!#*/"Type");
x.tx(": "); x.tx(": ");
x.tx(td.getType().getDisplay()); x.tx(td.getType().getDisplay());
if (td.hasName()) { if (td.hasName()) {
x.tx(", "); x.tx(", ");
x.b().tx("Name"); x.b().tx(/*!#*/"Name");
x.tx(": "); x.tx(": ");
x.tx(td.getType().getDisplay()); x.tx(td.getType().getDisplay());
} }
if (td.hasCode()) { if (td.hasCode()) {
x.tx(", "); x.tx(", ");
x.b().tx("Code"); x.b().tx(/*!#*/"Code");
x.tx(": "); x.tx(": ");
renderCodeableConcept(x, td.getCode()); renderCodeableConcept(x, td.getCode());
} }
if (td.hasTiming()) { if (td.hasTiming()) {
x.tx(", "); x.tx(", ");
x.b().tx("Timing"); x.b().tx(/*!#*/"Timing");
x.tx(": "); x.tx(": ");
render(x, td.getTiming()); render(x, td.getTiming());
} }
if (td.hasCondition()) { if (td.hasCondition()) {
x.tx(", "); x.tx(", ");
x.b().tx("Condition"); x.b().tx(/*!#*/"Condition");
x.tx(": "); x.tx(": ");
renderExpression(x, td.getCondition()); renderExpression(x, td.getCondition());
} }
@ -1618,27 +1634,27 @@ public class DataRenderer extends Renderer implements CodeResolver {
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx("Type"); tr.td().b().tx(/*!#*/"Type");
tr.td().tx(td.getType().getDisplay()); tr.td().tx(td.getType().getDisplay());
if (td.hasName()) { if (td.hasName()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().b().tx("Name"); tr.td().b().tx(/*!#*/"Name");
tr.td().tx(td.getType().getDisplay()); tr.td().tx(td.getType().getDisplay());
} }
if (td.hasCode()) { if (td.hasCode()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().b().tx("Code"); tr.td().b().tx(/*!#*/"Code");
renderCodeableConcept(tr.td(), td.getCode()); renderCodeableConcept(tr.td(), td.getCode());
} }
if (td.hasTiming()) { if (td.hasTiming()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().b().tx("Timing"); tr.td().b().tx(/*!#*/"Timing");
render(tr.td(), td.getTiming()); render(tr.td(), td.getTiming());
} }
if (td.hasCondition()) { if (td.hasCondition()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().b().tx("Condition"); tr.td().b().tx(/*!#*/"Condition");
renderExpression(tr.td(), td.getCondition()); renderExpression(tr.td(), td.getCondition());
} }
} }
@ -1648,7 +1664,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
XhtmlNode td = tr.td().colspan("2"); XhtmlNode td = tr.td().colspan("2");
td.b().tx("Type"); td.b().tx(/*!#*/"Type");
td.tx(": "); td.tx(": ");
StructureDefinition sd = context.getWorker().fetchTypeDefinition(dr.getType().toCode()); StructureDefinition sd = context.getWorker().fetchTypeDefinition(dr.getType().toCode());
if (sd != null && sd.hasWebPath()) { if (sd != null && sd.hasWebPath()) {
@ -1673,7 +1689,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
if (dr.hasSubject()) { if (dr.hasSubject()) {
tr = tbl.tr(); tr = tbl.tr();
td = tr.td().colspan("2"); td = tr.td().colspan("2");
td.b().tx("Subject"); td.b().tx(/*!#*/"Subject");
if (dr.hasSubjectReference()) { if (dr.hasSubjectReference()) {
renderReference(td, dr.getSubjectReference()); renderReference(td, dr.getSubjectReference());
} else { } else {
@ -1682,24 +1698,24 @@ public class DataRenderer extends Renderer implements CodeResolver {
} }
if (dr.hasCodeFilter() || dr.hasDateFilter()) { if (dr.hasCodeFilter() || dr.hasDateFilter()) {
tr = tbl.tr().backgroundColor("#efefef"); tr = tbl.tr().backgroundColor("#efefef");
tr.td().tx("Filter"); tr.td().tx(/*!#*/"Filter");
tr.td().tx("Value"); tr.td().tx(/*!#*/"Value");
} }
for (DataRequirementCodeFilterComponent cf : dr.getCodeFilter()) { for (DataRequirementCodeFilterComponent cf : dr.getCodeFilter()) {
tr = tbl.tr(); tr = tbl.tr();
if (cf.hasPath()) { if (cf.hasPath()) {
tr.td().tx(cf.getPath()); tr.td().tx(cf.getPath());
} else { } else {
tr.td().tx("Search on " +cf.getSearchParam()); tr.td().tx(/*!#*/"Search on " +cf.getSearchParam());
} }
if (cf.hasValueSet()) { if (cf.hasValueSet()) {
td = tr.td(); td = tr.td();
td.tx("In ValueSet "); td.tx(/*!#*/"In ValueSet ");
render(td, cf.getValueSetElement()); render(td, cf.getValueSetElement());
} else { } else {
boolean first = true; boolean first = true;
td = tr.td(); td = tr.td();
td.tx("One of these codes: "); td.tx(/*!#*/"One of these codes: ");
for (Coding c : cf.getCode()) { for (Coding c : cf.getCode()) {
if (first) first = false; else td.tx(", "); if (first) first = false; else td.tx(", ");
render(td, c); render(td, c);
@ -1711,7 +1727,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
if (cf.hasPath()) { if (cf.hasPath()) {
tr.td().tx(cf.getPath()); tr.td().tx(cf.getPath());
} else { } else {
tr.td().tx("Search on " +cf.getSearchParam()); tr.td().tx(/*!#*/"Search on " +cf.getSearchParam());
} }
render(tr.td(), cf.getValue()); render(tr.td(), cf.getValue());
} }
@ -1719,7 +1735,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
tr = tbl.tr(); tr = tbl.tr();
td = tr.td().colspan("2"); td = tr.td().colspan("2");
if (dr.hasLimit()) { if (dr.hasLimit()) {
td.b().tx("Limit"); td.b().tx(/*!#*/"Limit");
td.tx(": "); td.tx(": ");
td.tx(dr.getLimit()); td.tx(dr.getLimit());
if (dr.hasSort()) { if (dr.hasSort()) {
@ -1727,7 +1743,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
} }
} }
if (dr.hasSort()) { if (dr.hasSort()) {
td.b().tx("Sort"); td.b().tx(/*!#*/"Sort");
td.tx(": "); td.tx(": ");
boolean first = true; boolean first = true;
for (DataRequirementSortComponent p : dr.getSort()) { for (DataRequirementSortComponent p : dr.getSort()) {
@ -1743,7 +1759,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
private String displayTiming(Timing s) throws FHIRException { private String displayTiming(Timing s) throws FHIRException {
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
if (s.hasCode()) if (s.hasCode())
b.append("Code: "+displayCodeableConcept(s.getCode())); b.append(/*!#*/"Code: "+displayCodeableConcept(s.getCode()));
if (s.getEvent().size() > 0) { if (s.getEvent().size() > 0) {
CommaSeparatedStringBuilder c = new CommaSeparatedStringBuilder(); CommaSeparatedStringBuilder c = new CommaSeparatedStringBuilder();
@ -1754,17 +1770,17 @@ public class DataRenderer extends Renderer implements CodeResolver {
c.append("??"); c.append("??");
} }
} }
b.append("Events: "+ c.toString()); b.append(/*!#*/"Events: "+ c.toString());
} }
if (s.hasRepeat()) { if (s.hasRepeat()) {
TimingRepeatComponent rep = s.getRepeat(); TimingRepeatComponent rep = s.getRepeat();
if (rep.hasBoundsPeriod() && rep.getBoundsPeriod().hasStart()) if (rep.hasBoundsPeriod() && rep.getBoundsPeriod().hasStart())
b.append("Starting "+displayDateTime(rep.getBoundsPeriod().getStartElement())); b.append(/*!#*/"Starting "+displayDateTime(rep.getBoundsPeriod().getStartElement()));
if (rep.hasCount()) if (rep.hasCount())
b.append("Count "+Integer.toString(rep.getCount())+" times"); b.append(/*!#*/"Count "+Integer.toString(rep.getCount())+" times");
if (rep.hasDuration()) if (rep.hasDuration())
b.append("Duration "+rep.getDuration().toPlainString()+displayTimeUnits(rep.getPeriodUnit())); b.append(/*!#*/"Duration "+rep.getDuration().toPlainString()+displayTimeUnits(rep.getPeriodUnit()));
if (rep.hasWhen()) { if (rep.hasWhen()) {
String st = ""; String st = "";
@ -1777,14 +1793,14 @@ public class DataRenderer extends Renderer implements CodeResolver {
} else { } else {
String st = ""; String st = "";
if (!rep.hasFrequency() || (!rep.hasFrequencyMax() && rep.getFrequency() == 1) ) if (!rep.hasFrequency() || (!rep.hasFrequencyMax() && rep.getFrequency() == 1) )
st = "Once"; st = /*!#*/"Once";
else { else {
st = Integer.toString(rep.getFrequency()); st = Integer.toString(rep.getFrequency());
if (rep.hasFrequencyMax()) if (rep.hasFrequencyMax())
st = st + "-"+Integer.toString(rep.getFrequency()); st = st + "-"+Integer.toString(rep.getFrequency());
} }
if (rep.hasPeriod()) { if (rep.hasPeriod()) {
st = st + " per "+rep.getPeriod().toPlainString(); st = st + " "+/*!#*/"per "+rep.getPeriod().toPlainString();
if (rep.hasPeriodMax()) if (rep.hasPeriodMax())
st = st + "-"+rep.getPeriodMax().toPlainString(); st = st + "-"+rep.getPeriodMax().toPlainString();
st = st + " "+displayTimeUnits(rep.getPeriodUnit()); st = st + " "+displayTimeUnits(rep.getPeriodUnit());
@ -1792,7 +1808,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
b.append(st); b.append(st);
} }
if (rep.hasBoundsPeriod() && rep.getBoundsPeriod().hasEnd()) if (rep.hasBoundsPeriod() && rep.getBoundsPeriod().hasEnd())
b.append("Until "+displayDateTime(rep.getBoundsPeriod().getEndElement())); b.append(/*!#*/"Until "+displayDateTime(rep.getBoundsPeriod().getEndElement()));
} }
return b.toString(); return b.toString();
} }
@ -1808,20 +1824,20 @@ public class DataRenderer extends Renderer implements CodeResolver {
private String displayEventCode(EventTiming when) { private String displayEventCode(EventTiming when) {
switch (when) { switch (when) {
case C: return "at meals"; case C: return /*!#*/"at meals";
case CD: return "at lunch"; case CD: return /*!#*/"at lunch";
case CM: return "at breakfast"; case CM: return /*!#*/"at breakfast";
case CV: return "at dinner"; case CV: return /*!#*/"at dinner";
case AC: return "before meals"; case AC: return /*!#*/"before meals";
case ACD: return "before lunch"; case ACD: return /*!#*/"before lunch";
case ACM: return "before breakfast"; case ACM: return /*!#*/"before breakfast";
case ACV: return "before dinner"; case ACV: return /*!#*/"before dinner";
case HS: return "before sleeping"; case HS: return /*!#*/"before sleeping";
case PC: return "after meals"; case PC: return /*!#*/"after meals";
case PCD: return "after lunch"; case PCD: return /*!#*/"after lunch";
case PCM: return "after breakfast"; case PCM: return /*!#*/"after breakfast";
case PCV: return "after dinner"; case PCV: return /*!#*/"after dinner";
case WAKE: return "after waking"; case WAKE: return /*!#*/"after waking";
default: return "?ngen-6?"; default: return "?ngen-6?";
} }
} }
@ -1849,29 +1865,29 @@ public class DataRenderer extends Renderer implements CodeResolver {
private String displaySampledData(SampledData s) { private String displaySampledData(SampledData s) {
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
if (s.hasOrigin()) if (s.hasOrigin())
b.append("Origin: "+displayQuantity(s.getOrigin())); b.append(/*!#*/"Origin: "+displayQuantity(s.getOrigin()));
if (s.hasInterval()) { if (s.hasInterval()) {
b.append("Interval: "+s.getInterval().toString()); b.append(/*!#*/"Interval: "+s.getInterval().toString());
if (s.hasIntervalUnit()) if (s.hasIntervalUnit())
b.append(s.getIntervalUnit().toString()); b.append(s.getIntervalUnit().toString());
} }
if (s.hasFactor()) if (s.hasFactor())
b.append("Factor: "+s.getFactor().toString()); b.append(/*!#*/"Factor: "+s.getFactor().toString());
if (s.hasLowerLimit()) if (s.hasLowerLimit())
b.append("Lower: "+s.getLowerLimit().toString()); b.append(/*!#*/"Lower: "+s.getLowerLimit().toString());
if (s.hasUpperLimit()) if (s.hasUpperLimit())
b.append("Upper: "+s.getUpperLimit().toString()); b.append(/*!#*/"Upper: "+s.getUpperLimit().toString());
if (s.hasDimensions()) if (s.hasDimensions())
b.append("Dimensions: "+s.getDimensions()); b.append(/*!#*/"Dimensions: "+s.getDimensions());
if (s.hasData()) if (s.hasData())
b.append("Data: "+s.getData()); b.append(/*!#*/"Data: "+s.getData());
return b.toString(); return b.toString();
} }
@ -1889,7 +1905,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
XhtmlNode xn; XhtmlNode xn;
xn = new XhtmlNode(NodeType.Element, "div"); xn = new XhtmlNode(NodeType.Element, "div");
XhtmlNode p = xn.para(); XhtmlNode p = xn.para();
p.b().tx("Exception "+function+": "+e.getMessage()); p.b().tx(/*!#*/"Exception "+function+": "+e.getMessage());
p.addComment(getStackTrace(e)); p.addComment(getStackTrace(e));
return xn; return xn;
} }

View File

@ -62,7 +62,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
XhtmlNode tr; XhtmlNode tr;
if (dr.has("subject")) { if (dr.has("subject")) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Subject"); tr.td().tx(/*!#*/"Subject");
populateSubjectSummary(tr.td(), getProperty(dr, "subject").value()); populateSubjectSummary(tr.td(), getProperty(dr, "subject").value());
} }
@ -71,13 +71,13 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
if (dr.has("effective[x]")) { if (dr.has("effective[x]")) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("When For"); tr.td().tx(/*!#*/"When For");
eff = (DataType) getProperty(dr, "effective[x]").value().getBase(); eff = (DataType) getProperty(dr, "effective[x]").value().getBase();
render(tr.td(), eff); render(tr.td(), eff);
} }
if (dr.has("issued")) { if (dr.has("issued")) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Reported"); tr.td().tx(/*!#*/"Reported");
eff = (DataType) getProperty(dr, "issued").value().getBase(); eff = (DataType) getProperty(dr, "issued").value().getBase();
render(tr.td(), getProperty(dr, "issued").value()); render(tr.td(), getProperty(dr, "issued").value());
} }
@ -85,7 +85,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
pw = getProperty(dr, "perfomer"); pw = getProperty(dr, "perfomer");
if (valued(pw)) { if (valued(pw)) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx(Utilities.pluralize("Performer", pw.getValues().size())); tr.td().tx(Utilities.pluralize(/*!#*/"Performer", pw.getValues().size()));
XhtmlNode tdr = tr.td(); XhtmlNode tdr = tr.td();
for (BaseWrapper v : pw.getValues()) { for (BaseWrapper v : pw.getValues()) {
tdr.tx(" "); tdr.tx(" ");
@ -95,7 +95,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
pw = getProperty(dr, "identifier"); pw = getProperty(dr, "identifier");
if (valued(pw)) { if (valued(pw)) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx(Utilities.pluralize("Identifier", pw.getValues().size())+":"); tr.td().tx(Utilities.pluralize(/*!#*/"Identifier", pw.getValues().size())+":");
XhtmlNode tdr = tr.td(); XhtmlNode tdr = tr.td();
for (BaseWrapper v : pw.getValues()) { for (BaseWrapper v : pw.getValues()) {
tdr.tx(" "); tdr.tx(" ");
@ -105,7 +105,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
pw = getProperty(dr, "request"); pw = getProperty(dr, "request");
if (valued(pw)) { if (valued(pw)) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx(Utilities.pluralize("Request", pw.getValues().size())+":"); tr.td().tx(Utilities.pluralize(/*!#*/"Request", pw.getValues().size())+":");
XhtmlNode tdr = tr.td(); XhtmlNode tdr = tr.td();
for (BaseWrapper v : pw.getValues()) { for (BaseWrapper v : pw.getValues()) {
tdr.tx(" "); tdr.tx(" ");
@ -115,7 +115,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
} }
x.para().b().tx("Report Details"); x.para().b().tx(/*!#*/"Report Details");
pw = getProperty(dr, "result"); pw = getProperty(dr, "result");
if (valued(pw)) { if (valued(pw)) {
@ -138,7 +138,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
} }
if (valued(pw)) { if (valued(pw)) {
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.b().tx("Coded Conclusions :"); p.b().tx(/*!#*/"Coded Conclusions :");
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
for (BaseWrapper v : pw.getValues()) { for (BaseWrapper v : pw.getValues()) {
render(ul.li(), v); render(ul.li(), v);
@ -174,11 +174,11 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
private void populateSubjectSummary(XhtmlNode container, BaseWrapper subject) throws UnsupportedEncodingException, FHIRException, IOException, EOperationOutcome { private void populateSubjectSummary(XhtmlNode container, BaseWrapper subject) throws UnsupportedEncodingException, FHIRException, IOException, EOperationOutcome {
ResourceWrapper r = fetchResource(subject); ResourceWrapper r = fetchResource(subject);
if (r == null) if (r == null)
container.tx("Unable to get Patient Details"); container.tx(/*!#*/"Unable to get Patient Details");
else if (r.getName().equals("Patient")) else if (r.getName().equals("Patient"))
generatePatientSummary(container, r); generatePatientSummary(container, r);
else else
container.tx("Not done yet"); container.tx(/*!#*/"Not done yet");
} }
private void generatePatientSummary(XhtmlNode c, ResourceWrapper r) throws FHIRFormatError, DefinitionException, FHIRException, IOException, EOperationOutcome { private void generatePatientSummary(XhtmlNode c, ResourceWrapper r) throws FHIRFormatError, DefinitionException, FHIRException, IOException, EOperationOutcome {
@ -218,22 +218,22 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
if (issued) cs++; if (issued) cs++;
if (effectiveTime) cs++; if (effectiveTime) cs++;
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx("Code"); tr.td().b().tx(/*!#*/"Code");
tr.td().b().tx("Value"); tr.td().b().tx(/*!#*/"Value");
if (refRange) { if (refRange) {
tr.td().b().tx("Reference Range"); tr.td().b().tx(/*!#*/"Reference Range");
} }
if (flags) { if (flags) {
tr.td().b().tx("Flags"); tr.td().b().tx(/*!#*/"Flags");
} }
if (note) { if (note) {
tr.td().b().tx("Note"); tr.td().b().tx(/*!#*/"Note");
} }
if (effectiveTime) { if (effectiveTime) {
tr.td().b().tx("When For"); tr.td().b().tx(/*!#*/"When For");
} }
if (issued) { if (issued) {
tr.td().b().tx("Reported"); tr.td().b().tx(/*!#*/"Reported");
} }
for (ObservationNode o : observations) { for (ObservationNode o : observations) {
addObservationToTable(tbl, o, 0, Integer.toString(cs), refRange, flags, note, effectiveTime, issued, eff, iss); addObservationToTable(tbl, o, 0, Integer.toString(cs), refRange, flags, note, effectiveTime, issued, eff, iss);
@ -340,13 +340,13 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
if (o.obs != null && o.obs.getReference() == null) { if (o.obs != null && o.obs.getReference() == null) {
XhtmlNode td = tr.td().colspan(cs); XhtmlNode td = tr.td().colspan(cs);
td.i().tx("This Observation could not be resolved"); td.i().tx(/*!#*/"This Observation could not be resolved");
} else { } else {
if (o.obs != null && o.obs.getResource() != null) { if (o.obs != null && o.obs.getResource() != null) {
addObservationToTable(tr, o.obs.getResource(), i, o.obs.getReference(), refRange, flags, note, effectiveTime, issued, eff, iss); addObservationToTable(tr, o.obs.getResource(), i, o.obs.getReference(), refRange, flags, note, effectiveTime, issued, eff, iss);
} else { } else {
XhtmlNode td = tr.td().colspan(cs); XhtmlNode td = tr.td().colspan(cs);
td.i().tx("Observation"); td.i().tx(/*!#*/"Observation");
} }
if (o.contained != null) { if (o.contained != null) {
for (ObservationNode c : o.contained) { for (ObservationNode c : o.contained) {
@ -380,7 +380,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
pw = getProperty(obs, "dataAbsentReason"); pw = getProperty(obs, "dataAbsentReason");
if (valued(pw)) { if (valued(pw)) {
XhtmlNode span = td.span("color: maroon", "Error"); XhtmlNode span = td.span("color: maroon", "Error");
span.tx("Error: "); span.tx(/*!#*/"Error: ");
render(span.b(), pw.value()); render(span.b(), pw.value());
} }
} }
@ -421,7 +421,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
PropertyWrapper pwrA = getProperty(v, "age"); PropertyWrapper pwrA = getProperty(v, "age");
if (valued(pwr) || valued(pwrA)) { if (valued(pwr) || valued(pwrA)) {
boolean firstA = true; boolean firstA = true;
td.tx(" for "); td.tx(" "+/*!#*/"for ");
if (valued(pwr)) { if (valued(pwr)) {
for (BaseWrapper va : pwr.getValues()) { for (BaseWrapper va : pwr.getValues()) {
if (firstA) firstA = false; else td.tx(", "); if (firstA) firstA = false; else td.tx(", ");
@ -430,7 +430,7 @@ public class DiagnosticReportRenderer extends ResourceRenderer {
} }
if (valued(pwrA)) { if (valued(pwrA)) {
if (firstA) firstA = false; else td.tx(", "); if (firstA) firstA = false; else td.tx(", ");
td.tx("Age "); td.tx(/*!#*/"Age ");
render(td, pwrA.value()); render(td, pwrA.value());
} }
} }

View File

@ -43,11 +43,11 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
case PROCESSES: case PROCESSES:
return renderProcesses(x, scen); return renderProcesses(x, scen);
default: default:
throw new FHIRException("Unknown ExampleScenario Renderer Mode " + context.getScenarioMode()); throw new FHIRException(/*!#*/"Unknown ExampleScenario Renderer Mode " + context.getScenarioMode());
} }
} }
} catch (Exception e) { } catch (Exception e) {
throw new FHIRException("Error rendering ExampleScenario " + scen.getUrl(), e); throw new FHIRException(/*!#*/"Error rendering ExampleScenario " + scen.getUrl(), e);
} }
} }
@ -105,7 +105,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
for (ExampleScenarioProcessStepComponent step: process.getStep()) { for (ExampleScenarioProcessStepComponent step: process.getStep()) {
plantUml += toPlantUml(step, stepPrefix(prefix, step, stepCount), scen, actorsActive, actorKeys); plantUml += toPlantUml(step, stepPrefix(prefix, step, stepCount), scen, actorsActive, actorKeys);
if (step.getPause()) if (step.getPause())
plantUml += "... time passes ...\n"; plantUml += /*!#*/"... time passes ...\n";
stepCount++; stepCount++;
} }
@ -119,7 +119,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
XhtmlNode n = new XhtmlDocument(); XhtmlNode n = new XhtmlDocument();
renderCanonical(scen, n, step.getWorkflow()); renderCanonical(scen, n, step.getWorkflow());
XhtmlNode ref = n.getChildNodes().get(0); XhtmlNode ref = n.getChildNodes().get(0);
plantUml += noteOver(scen.getActor(), "Step " + trimPrefix(prefix) + " - See scenario\n" + creolLink(ref.getContent(), ref.getAttribute("href"))); plantUml += noteOver(scen.getActor(), /*!#*/"Step " + trimPrefix(prefix) + " - See scenario\n" + creolLink(ref.getContent(), ref.getAttribute("href")));
} else if (step.hasProcess()) } else if (step.hasProcess())
plantUml += toPlantUml(step.getProcess(), prefix, scen, actorKeys); plantUml += toPlantUml(step.getProcess(), prefix, scen, actorKeys);
else { else {
@ -211,9 +211,9 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
public boolean renderActors(XhtmlNode x, ExampleScenario scen) throws IOException { public boolean renderActors(XhtmlNode x, ExampleScenario scen) throws IOException {
XhtmlNode tbl = x.table("table-striped table-bordered"); XhtmlNode tbl = x.table("table-striped table-bordered");
XhtmlNode thead = tbl.tr(); XhtmlNode thead = tbl.tr();
thead.th().addText("Name"); thead.th().addText(/*!#*/"Name");
thead.th().addText("Type"); thead.th().addText(/*!#*/"Type");
thead.th().addText("Description"); thead.th().addText(/*!#*/"Description");
for (ExampleScenarioActorComponent actor : scen.getActor()) { for (ExampleScenarioActorComponent actor : scen.getActor()) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
XhtmlNode nameCell = tr.td(); XhtmlNode nameCell = tr.td();
@ -228,10 +228,10 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
public boolean renderInstances(XhtmlNode x, ExampleScenario scen) throws IOException { public boolean renderInstances(XhtmlNode x, ExampleScenario scen) throws IOException {
XhtmlNode tbl = x.table("table-striped table-bordered"); XhtmlNode tbl = x.table("table-striped table-bordered");
XhtmlNode thead = tbl.tr(); XhtmlNode thead = tbl.tr();
thead.th().addText("Name"); thead.th().addText(/*!#*/"Name");
thead.th().addText("Type"); thead.th().addText(/*!#*/"Type");
thead.th().addText("Content"); thead.th().addText(/*!#*/"Content");
thead.th().addText("Description"); thead.th().addText(/*!#*/"Description");
Map<String, String> instanceNames = new HashMap<String, String>(); Map<String, String> instanceNames = new HashMap<String, String>();
for (ExampleScenarioInstanceComponent instance : scen.getInstance()) { for (ExampleScenarioInstanceComponent instance : scen.getInstance()) {
@ -254,7 +254,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
if (!instance.hasStructureVersion() || instance.getStructureType().getSystem().equals("")) { if (!instance.hasStructureVersion() || instance.getStructureType().getSystem().equals("")) {
if (instance.hasStructureVersion()) if (instance.hasStructureVersion())
typeCell.tx("FHIR version " + instance.getStructureVersion() + " "); typeCell.tx(/*!#*/"FHIR version " + instance.getStructureVersion() + " ");
if (instance.hasStructureProfile()) { if (instance.hasStructureProfile()) {
renderCanonical(scen, typeCell, instance.getStructureProfile().toString()); renderCanonical(scen, typeCell, instance.getStructureProfile().toString());
} else { } else {
@ -262,7 +262,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
} }
} else { } else {
render(typeCell, instance.getStructureVersionElement()); render(typeCell, instance.getStructureVersionElement());
typeCell.tx(" version " + instance.getStructureVersion()); typeCell.tx(" "+/*!#*/"version " + instance.getStructureVersion());
if (instance.hasStructureProfile()) { if (instance.hasStructureProfile()) {
typeCell.tx(" "); typeCell.tx(" ");
renderCanonical(scen, typeCell, instance.getStructureProfile().toString()); renderCanonical(scen, typeCell, instance.getStructureProfile().toString());
@ -280,7 +280,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
XhtmlNode descCell = row.td(); XhtmlNode descCell = row.td();
addMarkdown(descCell, instance.getDescription()); addMarkdown(descCell, instance.getDescription());
if (instance.hasContainedInstance()) { if (instance.hasContainedInstance()) {
descCell.b().tx("Contains: "); descCell.b().tx(/*!#*/"Contains: ");
int containedCount = 1; int containedCount = 1;
for (ExampleScenarioInstanceContainedInstanceComponent contained: instance.getContainedInstance()) { for (ExampleScenarioInstanceContainedInstanceComponent contained: instance.getContainedInstance()) {
String key = "i_" + contained.getInstanceReference(); String key = "i_" + contained.getInstanceReference();
@ -341,26 +341,26 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
public void renderProcess(XhtmlNode x, ExampleScenarioProcessComponent process, String prefix, Map<String, ExampleScenarioActorComponent> actors, Map<String, ExampleScenarioInstanceComponent> instances) throws IOException { public void renderProcess(XhtmlNode x, ExampleScenarioProcessComponent process, String prefix, Map<String, ExampleScenarioActorComponent> actors, Map<String, ExampleScenarioInstanceComponent> instances) throws IOException {
XhtmlNode div = x.div(); XhtmlNode div = x.div();
div.an("p_" + prefix); div.an("p_" + prefix);
div.b().tx("Process: " + process.getTitle()); div.b().tx(/*!#*/"Process: " + process.getTitle());
if (process.hasDescription()) if (process.hasDescription())
addMarkdown(div, process.getDescription()); addMarkdown(div, process.getDescription());
if (process.hasPreConditions()) { if (process.hasPreConditions()) {
div.para().b().i().tx("Pre-conditions:"); div.para().b().i().tx(/*!#*/"Pre-conditions:");
addMarkdown(div, process.getPreConditions()); addMarkdown(div, process.getPreConditions());
} }
if (process.hasPostConditions()) { if (process.hasPostConditions()) {
div.para().b().i().tx("Post-conditions:"); div.para().b().i().tx(/*!#*/"Post-conditions:");
addMarkdown(div, process.getPostConditions()); addMarkdown(div, process.getPostConditions());
} }
XhtmlNode tbl = div.table("table-striped table-bordered").style("width:100%"); XhtmlNode tbl = div.table("table-striped table-bordered").style("width:100%");
XhtmlNode thead = tbl.tr(); XhtmlNode thead = tbl.tr();
thead.th().addText("Step"); thead.th().addText(/*!#*/"Step");
thead.th().addText("Name"); thead.th().addText(/*!#*/"Name");
thead.th().addText("Description"); thead.th().addText(/*!#*/"Description");
thead.th().addText("Initator"); thead.th().addText(/*!#*/"Initator");
thead.th().addText("Receiver"); thead.th().addText(/*!#*/"Receiver");
thead.th().addText("Request"); thead.th().addText(/*!#*/"Request");
thead.th().addText("Response"); thead.th().addText(/*!#*/"Response");
int stepCount = 1; int stepCount = 1;
for (ExampleScenarioProcessStepComponent step: process.getStep()) { for (ExampleScenarioProcessStepComponent step: process.getStep()) {
renderStep(tbl, step, stepPrefix(prefix, step, stepCount), actors, instances); renderStep(tbl, step, stepPrefix(prefix, step, stepCount), actors, instances);
@ -407,13 +407,13 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
prefixCell.tx(stepLabel.substring(stepLabel.indexOf(".") + 1)); prefixCell.tx(stepLabel.substring(stepLabel.indexOf(".") + 1));
if (step.hasProcess()) { if (step.hasProcess()) {
XhtmlNode n = row.td().colspan(6); XhtmlNode n = row.td().colspan(6);
n.tx("See subprocess" ); n.tx(/*!#*/"See subprocess" );
n.ah("#p_" + stepLabel, step.getProcess().getTitle()); n.ah("#p_" + stepLabel, step.getProcess().getTitle());
n.tx(" below"); n.tx(" "+/*!#*/"below");
} else if (step.hasWorkflow()) { } else if (step.hasWorkflow()) {
XhtmlNode n = row.td().colspan(6); XhtmlNode n = row.td().colspan(6);
n.tx("See other scenario "); n.tx(/*!#*/"See other scenario ");
String link = new ContextUtilities(context.getWorker()).getLinkForUrl(context.getLink(KnownLinkType.SPEC), step.getWorkflow()); String link = new ContextUtilities(context.getWorker()).getLinkForUrl(context.getLink(KnownLinkType.SPEC), step.getWorkflow());
n.ah(link, step.getProcess().getTitle()); n.ah(link, step.getProcess().getTitle());
@ -438,7 +438,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
int altNum = 1; int altNum = 1;
for (ExampleScenarioProcessStepAlternativeComponent alt : step.getAlternative()) { for (ExampleScenarioProcessStepAlternativeComponent alt : step.getAlternative()) {
XhtmlNode altHeading = tbl.tr().colspan(7).td(); XhtmlNode altHeading = tbl.tr().colspan(7).td();
altHeading.para().i().tx("Alternative " + alt.getTitle()); altHeading.para().i().tx(/*!#*/"Alternative " + alt.getTitle());
if (alt.hasDescription()) if (alt.hasDescription())
addMarkdown(altHeading, alt.getDescription()); addMarkdown(altHeading, alt.getDescription());
int stepCount = 1; int stepCount = 1;
@ -458,7 +458,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
return; return;
ExampleScenarioActorComponent actor = actors.get(actorId); ExampleScenarioActorComponent actor = actors.get(actorId);
if (actor==null) if (actor==null)
throw new FHIRException("Unable to find referenced actor " + actorId); throw new FHIRException(/*!#*/"Unable to find referenced actor " + actorId);
actorCell.ah("#a_" + actor.getKey(), actor.getDescription()).tx(actor.getTitle()); actorCell.ah("#a_" + actor.getKey(), actor.getDescription()).tx(actor.getTitle());
} }
@ -468,7 +468,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
return; return;
ExampleScenarioInstanceComponent instance = instances.get(instanceRef.getInstanceReference()); ExampleScenarioInstanceComponent instance = instances.get(instanceRef.getInstanceReference());
if (instance==null) if (instance==null)
throw new FHIRException("Unable to find referenced instance " + instanceRef.getInstanceReference()); throw new FHIRException(/*!#*/"Unable to find referenced instance " + instanceRef.getInstanceReference());
if (instanceRef.hasVersionReference()) { if (instanceRef.hasVersionReference()) {
ExampleScenarioInstanceVersionComponent theVersion = null; ExampleScenarioInstanceVersionComponent theVersion = null;
for (ExampleScenarioInstanceVersionComponent version: instance.getVersion()) { for (ExampleScenarioInstanceVersionComponent version: instance.getVersion()) {
@ -478,7 +478,7 @@ public class ExampleScenarioRenderer extends TerminologyRenderer {
} }
} }
if (theVersion==null) if (theVersion==null)
throw new FHIRException("Unable to find referenced version " + instanceRef.getVersionReference() + " within instance " + instanceRef.getInstanceReference()); throw new FHIRException(/*!#*/"Unable to find referenced version " + instanceRef.getVersionReference() + " within instance " + instanceRef.getInstanceReference());
instanceCell.ah("#i_" + instance.getKey() + "v_"+ theVersion.getKey() , theVersion.getDescription()).tx(theVersion.getTitle()); instanceCell.ah("#i_" + instance.getKey() + "v_"+ theVersion.getKey() , theVersion.getDescription()).tx(theVersion.getTitle());
} else } else

View File

@ -28,7 +28,7 @@ public class ImplementationGuideRenderer extends ResourceRenderer {
public boolean render(XhtmlNode x, ImplementationGuide ig) throws FHIRFormatError, DefinitionException, IOException { public boolean render(XhtmlNode x, ImplementationGuide ig) throws FHIRFormatError, DefinitionException, IOException {
x.h2().addText(ig.getName()); x.h2().addText(ig.getName());
x.para().tx("The official URL for this implementation guide is: "); x.para().tx(/*!#*/"The official URL for this implementation guide is: ");
x.pre().tx(ig.getUrl()); x.pre().tx(ig.getUrl());
addMarkdown(x, ig.getDescription()); addMarkdown(x, ig.getDescription());
return true; return true;

View File

@ -49,32 +49,32 @@ public class LibraryRenderer extends ResourceRenderer {
boolean email = hasCT(authors, "email") || hasCT(editors, "email") || hasCT(reviewers, "email") || hasCT(endorsers, "email"); boolean email = hasCT(authors, "email") || hasCT(editors, "email") || hasCT(reviewers, "email") || hasCT(endorsers, "email");
boolean phone = hasCT(authors, "phone") || hasCT(editors, "phone") || hasCT(reviewers, "phone") || hasCT(endorsers, "phone"); boolean phone = hasCT(authors, "phone") || hasCT(editors, "phone") || hasCT(reviewers, "phone") || hasCT(endorsers, "phone");
boolean url = hasCT(authors, "url") || hasCT(editors, "url") || hasCT(reviewers, "url") || hasCT(endorsers, "url"); boolean url = hasCT(authors, "url") || hasCT(editors, "url") || hasCT(reviewers, "url") || hasCT(endorsers, "url");
x.h2().tx("Participants"); x.h2().tx(/*!#*/"Participants");
XhtmlNode t = x.table("grid"); XhtmlNode t = x.table("grid");
if (authors != null) { if (authors != null) {
for (BaseWrapper cd : authors.getValues()) { for (BaseWrapper cd : authors.getValues()) {
participantRow(t, "Author", cd, email, phone, url); participantRow(t, /*!#*/"Author", cd, email, phone, url);
} }
} }
if (authors != null) { if (authors != null) {
for (BaseWrapper cd : editors.getValues()) { for (BaseWrapper cd : editors.getValues()) {
participantRow(t, "Editor", cd, email, phone, url); participantRow(t, /*!#*/"Editor", cd, email, phone, url);
} }
} }
if (authors != null) { if (authors != null) {
for (BaseWrapper cd : reviewers.getValues()) { for (BaseWrapper cd : reviewers.getValues()) {
participantRow(t, "Reviewer", cd, email, phone, url); participantRow(t, /*!#*/"Reviewer", cd, email, phone, url);
} }
} }
if (authors != null) { if (authors != null) {
for (BaseWrapper cd : endorsers.getValues()) { for (BaseWrapper cd : endorsers.getValues()) {
participantRow(t, "Endorser", cd, email, phone, url); participantRow(t, /*!#*/"Endorser", cd, email, phone, url);
} }
} }
} }
PropertyWrapper artifacts = lib.getChildByName("relatedArtifact"); PropertyWrapper artifacts = lib.getChildByName("relatedArtifact");
if (artifacts != null && artifacts.hasValues()) { if (artifacts != null && artifacts.hasValues()) {
x.h2().tx("Related Artifacts"); x.h2().tx(/*!#*/"Related Artifacts");
XhtmlNode t = x.table("grid"); XhtmlNode t = x.table("grid");
boolean label = false; boolean label = false;
boolean display = false; boolean display = false;
@ -90,7 +90,7 @@ public class LibraryRenderer extends ResourceRenderer {
} }
PropertyWrapper parameters = lib.getChildByName("parameter"); PropertyWrapper parameters = lib.getChildByName("parameter");
if (parameters != null && parameters.hasValues()) { if (parameters != null && parameters.hasValues()) {
x.h2().tx("Parameters"); x.h2().tx(/*!#*/"Parameters");
XhtmlNode t = x.table("grid"); XhtmlNode t = x.table("grid");
boolean doco = false; boolean doco = false;
for (BaseWrapper p : parameters.getValues()) { for (BaseWrapper p : parameters.getValues()) {
@ -102,14 +102,14 @@ public class LibraryRenderer extends ResourceRenderer {
} }
PropertyWrapper dataRequirements = lib.getChildByName("dataRequirement"); PropertyWrapper dataRequirements = lib.getChildByName("dataRequirement");
if (dataRequirements != null && dataRequirements.hasValues()) { if (dataRequirements != null && dataRequirements.hasValues()) {
x.h2().tx("Data Requirements"); x.h2().tx(/*!#*/"Data Requirements");
for (BaseWrapper p : dataRequirements.getValues()) { for (BaseWrapper p : dataRequirements.getValues()) {
renderDataRequirement(x, (DataRequirement) p.getBase()); renderDataRequirement(x, (DataRequirement) p.getBase());
} }
} }
PropertyWrapper contents = lib.getChildByName("content"); PropertyWrapper contents = lib.getChildByName("content");
if (contents != null) { if (contents != null) {
x.h2().tx("Contents"); x.h2().tx(/*!#*/"Contents");
boolean isCql = false; boolean isCql = false;
int counter = 0; int counter = 0;
for (BaseWrapper p : contents.getValues()) { for (BaseWrapper p : contents.getValues()) {
@ -151,23 +151,23 @@ public class LibraryRenderer extends ResourceRenderer {
boolean email = hasCT(lib.getAuthor(), "email") || hasCT(lib.getEditor(), "email") || hasCT(lib.getReviewer(), "email") || hasCT(lib.getEndorser(), "email"); boolean email = hasCT(lib.getAuthor(), "email") || hasCT(lib.getEditor(), "email") || hasCT(lib.getReviewer(), "email") || hasCT(lib.getEndorser(), "email");
boolean phone = hasCT(lib.getAuthor(), "phone") || hasCT(lib.getEditor(), "phone") || hasCT(lib.getReviewer(), "phone") || hasCT(lib.getEndorser(), "phone"); boolean phone = hasCT(lib.getAuthor(), "phone") || hasCT(lib.getEditor(), "phone") || hasCT(lib.getReviewer(), "phone") || hasCT(lib.getEndorser(), "phone");
boolean url = hasCT(lib.getAuthor(), "url") || hasCT(lib.getEditor(), "url") || hasCT(lib.getReviewer(), "url") || hasCT(lib.getEndorser(), "url"); boolean url = hasCT(lib.getAuthor(), "url") || hasCT(lib.getEditor(), "url") || hasCT(lib.getReviewer(), "url") || hasCT(lib.getEndorser(), "url");
x.h2().tx("Participants"); x.h2().tx(/*!#*/"Participants");
XhtmlNode t = x.table("grid"); XhtmlNode t = x.table("grid");
for (ContactDetail cd : lib.getAuthor()) { for (ContactDetail cd : lib.getAuthor()) {
participantRow(t, "Author", cd, email, phone, url); participantRow(t, /*!#*/"Author", cd, email, phone, url);
} }
for (ContactDetail cd : lib.getEditor()) { for (ContactDetail cd : lib.getEditor()) {
participantRow(t, "Editor", cd, email, phone, url); participantRow(t, /*!#*/"Editor", cd, email, phone, url);
} }
for (ContactDetail cd : lib.getReviewer()) { for (ContactDetail cd : lib.getReviewer()) {
participantRow(t, "Reviewer", cd, email, phone, url); participantRow(t, /*!#*/"Reviewer", cd, email, phone, url);
} }
for (ContactDetail cd : lib.getEndorser()) { for (ContactDetail cd : lib.getEndorser()) {
participantRow(t, "Endorser", cd, email, phone, url); participantRow(t, /*!#*/"Endorser", cd, email, phone, url);
} }
} }
if (lib.hasRelatedArtifact()) { if (lib.hasRelatedArtifact()) {
x.h2().tx("Related Artifacts"); x.h2().tx(/*!#*/"Related Artifacts");
XhtmlNode t = x.table("grid"); XhtmlNode t = x.table("grid");
boolean label = false; boolean label = false;
boolean display = false; boolean display = false;
@ -182,7 +182,7 @@ public class LibraryRenderer extends ResourceRenderer {
} }
} }
if (lib.hasParameter()) { if (lib.hasParameter()) {
x.h2().tx("Parameters"); x.h2().tx(/*!#*/"Parameters");
XhtmlNode t = x.table("grid"); XhtmlNode t = x.table("grid");
boolean doco = false; boolean doco = false;
for (ParameterDefinition p : lib.getParameter()) { for (ParameterDefinition p : lib.getParameter()) {
@ -193,13 +193,13 @@ public class LibraryRenderer extends ResourceRenderer {
} }
} }
if (lib.hasDataRequirement()) { if (lib.hasDataRequirement()) {
x.h2().tx("Data Requirements"); x.h2().tx(/*!#*/"Data Requirements");
for (DataRequirement p : lib.getDataRequirement()) { for (DataRequirement p : lib.getDataRequirement()) {
renderDataRequirement(x, p); renderDataRequirement(x, p);
} }
} }
if (lib.hasContent()) { if (lib.hasContent()) {
x.h2().tx("Contents"); x.h2().tx(/*!#*/"Contents");
boolean isCql = false; boolean isCql = false;
int counter = 0; int counter = 0;
for (Attachment att : lib.getContent()) { for (Attachment att : lib.getContent()) {
@ -356,7 +356,7 @@ public class LibraryRenderer extends ResourceRenderer {
p.tx(att.getTitle()); p.tx(att.getTitle());
p.tx(": "); p.tx(": ");
} }
p.code().tx("No Content"); p.code().tx(/*!#*/"No Content");
p.tx(" ("); p.tx(" (");
p.code().tx(att.getContentType()); p.code().tx(att.getContentType());
p.tx(lang(att)); p.tx(lang(att));
@ -405,10 +405,10 @@ public class LibraryRenderer extends ResourceRenderer {
p.tx(att.getTitle()); p.tx(att.getTitle());
p.tx(": "); p.tx(": ");
} }
p.code().tx("Content not shown - ("); p.code().tx(/*!#*/"Content not shown - (");
p.code().tx(att.getContentType()); p.code().tx(att.getContentType());
p.tx(lang(att)); p.tx(lang(att));
p.tx(", size = "+Utilities.describeSize(att.getData().length)+")"); p.tx(/*!#*/", size = "+Utilities.describeSize(att.getData().length)+")");
} }
} }
} }

View File

@ -40,33 +40,33 @@ public class ListRenderer extends ResourceRenderer {
XhtmlNode tr = t.tr(); XhtmlNode tr = t.tr();
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
if (list.has("date")) { if (list.has("date")) {
td.tx("Date: "+list.get("date").dateTimeValue().toHumanDisplay()); td.tx(/*!#*/"Date: "+list.get("date").dateTimeValue().toHumanDisplay());
} }
if (list.has("mode")) { if (list.has("mode")) {
td.tx("Mode: "+list.get("mode").primitiveValue()); td.tx(/*!#*/"Mode: "+list.get("mode").primitiveValue());
} }
if (list.has("status")) { if (list.has("status")) {
td.tx("Status: "+list.get("status").primitiveValue()); td.tx(/*!#*/"Status: "+list.get("status").primitiveValue());
} }
if (list.has("code")) { if (list.has("code")) {
td.tx("Code: "+displayBase(list.get("code"))); td.tx(/*!#*/"Code: "+displayBase(list.get("code")));
} }
tr = t.tr(); tr = t.tr();
td = tr.td(); td = tr.td();
if (list.has("subject")) { if (list.has("subject")) {
td.tx("Subject: "); td.tx(/*!#*/"Subject: ");
shortForRef(td, list.get("subject")); shortForRef(td, list.get("subject"));
} }
if (list.has("encounter")) { if (list.has("encounter")) {
td.tx("Encounter: "); td.tx(/*!#*/"Encounter: ");
shortForRef(td, list.get("encounter")); shortForRef(td, list.get("encounter"));
} }
if (list.has("source")) { if (list.has("source")) {
td.tx("Source: "); td.tx(/*!#*/"Source: ");
shortForRef(td, list.get("encounter")); shortForRef(td, list.get("encounter"));
} }
if (list.has("orderedBy")) { if (list.has("orderedBy")) {
td.tx("Order: "+displayBase(list.get("orderedBy"))); td.tx(/*!#*/"Order: "+displayBase(list.get("orderedBy")));
} }
// for (Annotation a : list.getNote()) { // for (Annotation a : list.getNote()) {
// renderAnnotation(a, x); // renderAnnotation(a, x);
@ -81,15 +81,15 @@ public class ListRenderer extends ResourceRenderer {
} }
t = x.table("grid"); t = x.table("grid");
tr = t.tr().style("backgound-color: #eeeeee"); tr = t.tr().style("backgound-color: #eeeeee");
tr.td().b().tx("Items"); tr.td().b().tx(/*!#*/"Items");
if (date) { if (date) {
tr.td().tx("Date"); tr.td().tx(/*!#*/"Date");
} }
if (flag) { if (flag) {
tr.td().tx("Flag"); tr.td().tx(/*!#*/"Flag");
} }
if (deleted) { if (deleted) {
tr.td().tx("Deleted"); tr.td().tx(/*!#*/"Deleted");
} }
for (BaseWrapper e : list.children("entry")) { for (BaseWrapper e : list.children("entry")) {
tr = t.tr(); tr = t.tr();
@ -113,16 +113,16 @@ public class ListRenderer extends ResourceRenderer {
XhtmlNode t = x.table("clstu"); XhtmlNode t = x.table("clstu");
XhtmlNode tr = t.tr(); XhtmlNode tr = t.tr();
if (list.hasDate()) { if (list.hasDate()) {
tr.td().tx("Date: "+list.getDate().toLocaleString()); tr.td().tx(/*!#*/"Date: "+list.getDate().toLocaleString());
} }
if (list.hasMode()) { if (list.hasMode()) {
tr.td().tx("Mode: "+list.getMode().getDisplay()); tr.td().tx(/*!#*/"Mode: "+list.getMode().getDisplay());
} }
if (list.hasStatus()) { if (list.hasStatus()) {
tr.td().tx("Status: "+list.getStatus().getDisplay()); tr.td().tx(/*!#*/"Status: "+list.getStatus().getDisplay());
} }
if (list.hasCode()) { if (list.hasCode()) {
tr.td().tx("Code: "+display(list.getCode())); tr.td().tx(/*!#*/"Code: "+display(list.getCode()));
} }
tr = t.tr(); tr = t.tr();
if (list.hasSubject()) { if (list.hasSubject()) {
@ -130,7 +130,7 @@ public class ListRenderer extends ResourceRenderer {
shortForRef(tr.td().txN("Subject: "), list.getSubjectFirstRep()); shortForRef(tr.td().txN("Subject: "), list.getSubjectFirstRep());
} else { } else {
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.txN("Subject: "); td.txN(/*!#*/"Subject: ");
int i = 0; int i = 0;
for (Reference subj : list.getSubject()) { for (Reference subj : list.getSubject()) {
if (i == list.getSubject().size() - 1) { if (i == list.getSubject().size() - 1) {
@ -143,13 +143,13 @@ public class ListRenderer extends ResourceRenderer {
} }
} }
if (list.hasEncounter()) { if (list.hasEncounter()) {
shortForRef(tr.td().txN("Encounter: "), list.getEncounter()); shortForRef(tr.td().txN(/*!#*/"Encounter: "), list.getEncounter());
} }
if (list.hasSource()) { if (list.hasSource()) {
shortForRef(tr.td().txN("Source: "), list.getEncounter()); shortForRef(tr.td().txN(/*!#*/"Source: "), list.getEncounter());
} }
if (list.hasOrderedBy()) { if (list.hasOrderedBy()) {
tr.td().tx("Order: "+display(list.getOrderedBy())); tr.td().tx(/*!#*/"Order: "+display(list.getOrderedBy()));
} }
for (Annotation a : list.getNote()) { for (Annotation a : list.getNote()) {
renderAnnotation(x, a); renderAnnotation(x, a);
@ -164,15 +164,15 @@ public class ListRenderer extends ResourceRenderer {
} }
t = x.table("grid"); t = x.table("grid");
tr = t.tr().style("backgound-color: #eeeeee"); tr = t.tr().style("backgound-color: #eeeeee");
tr.td().b().tx("Items"); tr.td().b().tx(/*!#*/"Items");
if (date) { if (date) {
tr.td().tx("Date"); tr.td().tx(/*!#*/"Date");
} }
if (flag) { if (flag) {
tr.td().tx("Flag"); tr.td().tx(/*!#*/"Flag");
} }
if (deleted) { if (deleted) {
tr.td().tx("Deleted"); tr.td().tx(/*!#*/"Deleted");
} }
for (ListResourceEntryComponent e : list.getEntry()) { for (ListResourceEntryComponent e : list.getEntry()) {
tr = t.tr(); tr = t.tr();

View File

@ -30,33 +30,33 @@ public class NamingSystemRenderer extends ResourceRenderer {
} }
public boolean render(XhtmlNode x, NamingSystem ns) throws FHIRFormatError, DefinitionException, IOException { public boolean render(XhtmlNode x, NamingSystem ns) throws FHIRFormatError, DefinitionException, IOException {
x.h3().tx("Summary"); x.h3().tx(/*!#*/"Summary");
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
row(tbl, "Defining URL", ns.getUrl()); row(tbl, /*!#*/"Defining URL", ns.getUrl());
if (ns.hasVersion()) { if (ns.hasVersion()) {
row(tbl, "Version", ns.getVersion()); row(tbl, /*!#*/"Version", ns.getVersion());
} }
if (ns.hasName()) { if (ns.hasName()) {
row(tbl, "Name", gt(ns.getNameElement())); row(tbl, /*!#*/"Name", gt(ns.getNameElement()));
} }
if (ns.hasTitle()) { if (ns.hasTitle()) {
row(tbl, "Title", gt(ns.getTitleElement())); row(tbl, /*!#*/"Title", gt(ns.getTitleElement()));
} }
row(tbl, "Status", ns.getStatus().toCode()); row(tbl, /*!#*/"Status", ns.getStatus().toCode());
if (ns.hasDescription()) { if (ns.hasDescription()) {
addMarkdown(row(tbl, "Definition"), ns.getDescription()); addMarkdown(row(tbl, /*!#*/"Definition"), ns.getDescription());
} }
if (ns.hasPublisher()) { if (ns.hasPublisher()) {
row(tbl, "Publisher", gt(ns.getPublisherElement())); row(tbl, /*!#*/"Publisher", gt(ns.getPublisherElement()));
} }
if (ns.hasExtension(ToolingExtensions.EXT_WORKGROUP)) { if (ns.hasExtension(ToolingExtensions.EXT_WORKGROUP)) {
renderCommitteeLink(row(tbl, "Committee"), ns); renderCommitteeLink(row(tbl, "Committee"), ns);
} }
if (CodeSystemUtilities.hasOID(ns)) { if (CodeSystemUtilities.hasOID(ns)) {
row(tbl, "OID", CodeSystemUtilities.getOID(ns)).tx("("+translate("ns.summary", "for OID based terminology systems")+")"); row(tbl, /*!#*/"OID", CodeSystemUtilities.getOID(ns)).tx("("+(/*!#*/"for OID based terminology systems")+")");
} }
if (ns.hasCopyright()) { if (ns.hasCopyright()) {
addMarkdown(row(tbl, "Copyright"), ns.getCopyright()); addMarkdown(row(tbl, /*!#*/"Copyright"), ns.getCopyright());
} }
boolean hasPreferred = false; boolean hasPreferred = false;
boolean hasPeriod = false; boolean hasPeriod = false;
@ -66,19 +66,19 @@ public class NamingSystemRenderer extends ResourceRenderer {
hasPeriod = hasPeriod || id.hasPeriod(); hasPeriod = hasPeriod || id.hasPeriod();
hasComment = hasComment || id.hasComment(); hasComment = hasComment || id.hasComment();
} }
x.h3().tx("Identifiers"); x.h3().tx(/*!#*/"Identifiers");
tbl = x.table("grid"); tbl = x.table("grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx(translate("ns.summary", "Type")); tr.td().b().tx((/*!#*/"Type"));
tr.td().b().tx(translate("ns.summary", "Value")); tr.td().b().tx((/*!#*/"Value"));
if (hasPreferred) { if (hasPreferred) {
tr.td().b().tx(translate("ns.summary", "Preferred")); tr.td().b().tx((/*!#*/"Preferred"));
} }
if (hasPeriod) { if (hasPeriod) {
tr.td().b().tx(translate("ns.summary", "Period")); tr.td().b().tx((/*!#*/"Period"));
} }
if (hasComment) { if (hasComment) {
tr.td().b().tx(translate("ns.summary", "Comment")); tr.td().b().tx((/*!#*/"Comment"));
} }
for (NamingSystemUniqueIdComponent id : ns.getUniqueId()) { for (NamingSystemUniqueIdComponent id : ns.getUniqueId()) {
tr = tbl.tr(); tr = tbl.tr();
@ -100,7 +100,7 @@ public class NamingSystemRenderer extends ResourceRenderer {
private XhtmlNode row(XhtmlNode tbl, String name) { private XhtmlNode row(XhtmlNode tbl, String name) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.tx(translate("ns.summary", name)); td.tx((name));
return tr.td(); return tr.td();
} }
private XhtmlNode row(XhtmlNode tbl, String name, String value) { private XhtmlNode row(XhtmlNode tbl, String name, String value) {

View File

@ -353,21 +353,21 @@ public class ObligationsRenderer {
XhtmlNode tr = new XhtmlNode(NodeType.Element, "tr"); XhtmlNode tr = new XhtmlNode(NodeType.Element, "tr");
children.add(tr); children.add(tr);
tr.td().style("font-size: 11px").b().tx("Obligations"); tr.td().style("font-size: 11px").b().tx(/*!#*/"Obligations");
if (actor) { if (actor) {
tr.td().style("font-size: 11px").tx("Actor"); tr.td().style("font-size: 11px").tx(/*!#*/"Actor");
} }
if (elementId) { if (elementId) {
tr.td().style("font-size: 11px").tx("Elements"); tr.td().style("font-size: 11px").tx(/*!#*/"Elements");
} }
if (usage) { if (usage) {
tr.td().style("font-size: 11px").tx("Usage"); tr.td().style("font-size: 11px").tx(/*!#*/"Usage");
} }
if (doco) { if (doco) {
tr.td().style("font-size: 11px").tx("Documentation"); tr.td().style("font-size: 11px").tx(/*!#*/"Documentation");
} }
if (filter) { if (filter) {
tr.td().style("font-size: 11px").tx("Filter"); tr.td().style("font-size: 11px").tx(/*!#*/"Filter");
} }
for (ObligationDetail ob : obligations) { for (ObligationDetail ob : obligations) {
tr = new XhtmlNode(NodeType.Element, "tr"); tr = new XhtmlNode(NodeType.Element, "tr");

View File

@ -44,22 +44,22 @@ public class OperationDefinitionRenderer extends TerminologyRenderer {
if (context.isHeader()) { if (context.isHeader()) {
x.h2().addText(opd.getName()); x.h2().addText(opd.getName());
x.para().addText(Utilities.capitalize(opd.getKind().toString())+": "+opd.getName()); x.para().addText(Utilities.capitalize(opd.getKind().toString())+": "+opd.getName());
x.para().tx("The official URL for this operation definition is: "); x.para().tx(/*!#*/"The official URL for this operation definition is: ");
x.pre().tx(opd.getUrl()); x.pre().tx(opd.getUrl());
addMarkdown(x, opd.getDescription());} addMarkdown(x, opd.getDescription());}
if (opd.getSystem()) if (opd.getSystem())
x.para().tx("URL: [base]/$"+opd.getCode()); x.para().tx(/*!#*/"URL: [base]/$"+opd.getCode());
for (Enumeration<VersionIndependentResourceTypesAll> c : opd.getResource()) { for (Enumeration<VersionIndependentResourceTypesAll> c : opd.getResource()) {
if (opd.getType()) if (opd.getType())
x.para().tx("URL: [base]/"+c.getCode()+"/$"+opd.getCode()); x.para().tx(/*!#*/"URL: [base]/"+c.getCode()+"/$"+opd.getCode());
if (opd.getInstance()) if (opd.getInstance())
x.para().tx("URL: [base]/"+c.getCode()+"/[id]/$"+opd.getCode()); x.para().tx(/*!#*/"URL: [base]/"+c.getCode()+"/[id]/$"+opd.getCode());
} }
if (opd.hasInputProfile()) { if (opd.hasInputProfile()) {
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("Input parameters Profile: "); p.tx(/*!#*/"Input parameters Profile: ");
StructureDefinition sd = context.getContext().fetchResource(StructureDefinition.class, opd.getInputProfile(), opd); StructureDefinition sd = context.getContext().fetchResource(StructureDefinition.class, opd.getInputProfile(), opd);
if (sd == null) { if (sd == null) {
p.pre().tx(opd.getInputProfile()); p.pre().tx(opd.getInputProfile());
@ -69,7 +69,7 @@ public class OperationDefinitionRenderer extends TerminologyRenderer {
} }
if (opd.hasOutputProfile()) { if (opd.hasOutputProfile()) {
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("Output parameters Profile: "); p.tx(/*!#*/"Output parameters Profile: ");
StructureDefinition sd = context.getContext().fetchResource(StructureDefinition.class, opd.getOutputProfile(), opd); StructureDefinition sd = context.getContext().fetchResource(StructureDefinition.class, opd.getOutputProfile(), opd);
if (sd == null) { if (sd == null) {
p.pre().tx(opd.getOutputProfile()); p.pre().tx(opd.getOutputProfile());
@ -77,16 +77,16 @@ public class OperationDefinitionRenderer extends TerminologyRenderer {
p.ah(sd.getWebPath()).tx(sd.present()); p.ah(sd.getWebPath()).tx(sd.present());
} }
} }
x.para().tx("Parameters"); x.para().tx(/*!#*/"Parameters");
XhtmlNode tbl = x.table( "grid"); XhtmlNode tbl = x.table( "grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx("Use"); tr.td().b().tx(/*!#*/"Use");
tr.td().b().tx("Name"); tr.td().b().tx(/*!#*/"Name");
tr.td().b().tx("Scope"); tr.td().b().tx(/*!#*/"Scope");
tr.td().b().tx("Cardinality"); tr.td().b().tx(/*!#*/"Cardinality");
tr.td().b().tx("Type"); tr.td().b().tx(/*!#*/"Type");
tr.td().b().tx("Binding"); tr.td().b().tx(/*!#*/"Binding");
tr.td().b().tx("Documentation"); tr.td().b().tx(/*!#*/"Documentation");
for (OperationDefinitionParameterComponent p : opd.getParameter()) { for (OperationDefinitionParameterComponent p : opd.getParameter()) {
genOpParam(tbl, "", p, opd); genOpParam(tbl, "", p, opd);
} }

View File

@ -41,17 +41,17 @@ public class OperationOutcomeRenderer extends ResourceRenderer {
hasSource = hasSource || ExtensionHelper.hasExtension(i, ToolingExtensions.EXT_ISSUE_SOURCE); hasSource = hasSource || ExtensionHelper.hasExtension(i, ToolingExtensions.EXT_ISSUE_SOURCE);
} }
if (success) if (success)
x.para().tx("All OK"); x.para().tx(/*!#*/"All OK");
if (op.getIssue().size() > 0) { if (op.getIssue().size() > 0) {
XhtmlNode tbl = x.table("grid"); // on the basis that we'll most likely be rendered using the standard fhir css, but it doesn't really matter XhtmlNode tbl = x.table("grid"); // on the basis that we'll most likely be rendered using the standard fhir css, but it doesn't really matter
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().b().tx("Severity"); tr.td().b().tx(/*!#*/"Severity");
tr.td().b().tx("Location"); tr.td().b().tx(/*!#*/"Location");
tr.td().b().tx("Code"); tr.td().b().tx(/*!#*/"Code");
tr.td().b().tx("Details"); tr.td().b().tx(/*!#*/"Details");
tr.td().b().tx("Diagnostics"); tr.td().b().tx(/*!#*/"Diagnostics");
if (hasSource) if (hasSource)
tr.td().b().tx("Source"); tr.td().b().tx(/*!#*/"Source");
for (OperationOutcomeIssueComponent i : op.getIssue()) { for (OperationOutcomeIssueComponent i : op.getIssue()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().addText(i.getSeverity().toString()); tr.td().addText(i.getSeverity().toString());
@ -82,12 +82,12 @@ public class OperationOutcomeRenderer extends ResourceRenderer {
} }
public String display(OperationOutcome oo) { public String display(OperationOutcome oo) {
return "todo"; return /*!#*/"todo";
} }
@Override @Override
public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException { public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException {
return "Not done yet"; return /*!#*/"Not done yet";
} }
@Override @Override

View File

@ -31,7 +31,7 @@ public class ParametersRenderer extends ResourceRenderer {
@Override @Override
public boolean render(XhtmlNode x, Resource r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome { public boolean render(XhtmlNode x, Resource r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
x.h2().tx("Parameters"); x.h2().tx(/*!#*/"Parameters");
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
params(tbl, ((Parameters) r).getParameter(), 0); params(tbl, ((Parameters) r).getParameter(), 0);
return false; return false;
@ -49,7 +49,7 @@ public class ParametersRenderer extends ResourceRenderer {
@Override @Override
public boolean render(XhtmlNode x, ResourceWrapper params) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome { public boolean render(XhtmlNode x, ResourceWrapper params) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
x.h2().tx("Parameters"); x.h2().tx(/*!#*/"Parameters");
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
PropertyWrapper pw = getProperty(params, "parameter"); PropertyWrapper pw = getProperty(params, "parameter");
if (valued(pw)) { if (valued(pw)) {
@ -95,7 +95,7 @@ public class ParametersRenderer extends ResourceRenderer {
public XhtmlNode render(Parameters params) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome { public XhtmlNode render(Parameters params) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
XhtmlNode div = new XhtmlNode(NodeType.Element, "div"); XhtmlNode div = new XhtmlNode(NodeType.Element, "div");
div.h2().tx("Parameters"); div.h2().tx(/*!#*/"Parameters");
XhtmlNode tbl = div.table("grid"); XhtmlNode tbl = div.table("grid");
params(tbl, params.getParameter(), 0); params(tbl, params.getParameter(), 0);
return div; return div;

View File

@ -32,6 +32,7 @@ import org.hl7.fhir.r5.renderers.utils.BaseWrappers.BaseWrapper;
import org.hl7.fhir.r5.renderers.utils.BaseWrappers.PropertyWrapper; import org.hl7.fhir.r5.renderers.utils.BaseWrappers.PropertyWrapper;
import org.hl7.fhir.r5.renderers.utils.BaseWrappers.ResourceWrapper; import org.hl7.fhir.r5.renderers.utils.BaseWrappers.ResourceWrapper;
import org.hl7.fhir.r5.renderers.utils.RenderingContext; import org.hl7.fhir.r5.renderers.utils.RenderingContext;
import org.hl7.fhir.r5.utils.EOperationOutcome;
import org.hl7.fhir.utilities.TextFile; import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xhtml.XhtmlNode;
@ -224,18 +225,18 @@ public class PatientRenderer extends ResourceRenderer {
b.append(display(name)); b.append(display(name));
b.append(" "); b.append(" ");
if (dob == null) { if (dob == null) {
b.append("(no stated gender)"); b.append("(no stated gender)"/*!#*/);
} else { } else {
b.append(gender); b.append(gender);
} }
b.append(", "); b.append(", ");
if (dob == null) { if (dob == null) {
b.append("DoB Unknown"); b.append("DoB Unknown"/*!#*/);
} else { } else {
b.append("DoB: "+display(dob)); b.append(/*!#*/"DoB: "+display(dob));
} }
if (id != null) { if (id != null) {
b.append(" ( "); b.append(" "+/*!#*/"( ");
b.append(display(id)); b.append(display(id));
b.append(")"); b.append(")");
} }
@ -244,21 +245,21 @@ public class PatientRenderer extends ResourceRenderer {
public void describe(XhtmlNode x, HumanName name, String gender, DateType dob, Identifier id) throws UnsupportedEncodingException, IOException { public void describe(XhtmlNode x, HumanName name, String gender, DateType dob, Identifier id) throws UnsupportedEncodingException, IOException {
if (name == null) { if (name == null) {
x.b().tx("Anonymous Patient"); // todo: is this appropriate? x.b().tx(/*!#*/"Anonymous Patient"); // todo: is this appropriate?
} else { } else {
render(x.b(), name); render(x.b(), name);
} }
x.tx(" "); x.tx(" ");
if (gender == null) { if (gender == null) {
x.tx("(no stated gender)"); x.tx(/*!#*/"(no stated gender)");
} else { } else {
x.tx(gender); x.tx(gender);
} }
x.tx(", "); x.tx(", ");
if (dob == null) { if (dob == null) {
x.tx("DoB Unknown"); x.tx(/*!#*/"DoB Unknown");
} else { } else {
x.tx("DoB: "); x.tx(/*!#*/"DoB: ");
render(x, dob); render(x, dob);
} }
if (id != null) { if (id != null) {
@ -269,7 +270,7 @@ public class PatientRenderer extends ResourceRenderer {
} }
@Override @Override
public boolean render(XhtmlNode x, ResourceWrapper r) throws FHIRFormatError, DefinitionException, IOException { public boolean render(XhtmlNode x, ResourceWrapper r) throws IOException, FHIRException, EOperationOutcome {
// banner // banner
describe(makeBanner(x.para()), r); describe(makeBanner(x.para()), r);
x.hr(); x.hr();
@ -295,9 +296,22 @@ public class PatientRenderer extends ResourceRenderer {
if (tbl.isEmpty()) { if (tbl.isEmpty()) {
x.remove(tbl); x.remove(tbl);
} }
if (r.has("contained") && context.isTechnicalMode()) {
x.hr();
x.para().b().tx(/*!#*/"Contained Resources");
addContained(x, r.getContained());
}
return false; return false;
} }
private void addContained(XhtmlNode x, List<ResourceWrapper> list) throws FHIRFormatError, DefinitionException, FHIRException, IOException, EOperationOutcome {
for (ResourceWrapper c : list) {
x.hr();
x.an(c.getId());
new RendererFactory().factory(c, context).render(x, c);
}
}
private void addExtensions(XhtmlNode tbl, ResourceWrapper r) throws UnsupportedEncodingException, FHIRException, IOException { private void addExtensions(XhtmlNode tbl, ResourceWrapper r) throws UnsupportedEncodingException, FHIRException, IOException {
Map<String, List<Extension>> extensions = new HashMap<>(); Map<String, List<Extension>> extensions = new HashMap<>();
PropertyWrapper pw = getProperty(r, "extension"); PropertyWrapper pw = getProperty(r, "extension");
@ -378,13 +392,13 @@ public class PatientRenderer extends ResourceRenderer {
}; };
if (ids.size() == 1) { if (ids.size() == 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Other Id:", "Other Ids (see the one above)"); nameCell(tr, /*!#*/"Other Id:", /*!#*/"Other Ids (see the one above)");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
render(r, td, ids.get(0)); render(r, td, ids.get(0));
} else if (ids.size() > 1) { } else if (ids.size() > 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Other Ids:", "Other Ids (see the one above)"); nameCell(tr, /*!#*/"Other Ids:", /*!#*/"Other Ids (see the one above)");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
XhtmlNode ul = td.ul(); XhtmlNode ul = td.ul();
@ -411,16 +425,16 @@ public class PatientRenderer extends ResourceRenderer {
} }
if (langs.size() == 1) { if (langs.size() == 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Language:", "Languages spoken"); nameCell(tr, /*!#*/"Language:", /*!#*/"Languages spoken");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
render(r, td, langs.get(0)); render(r, td, langs.get(0));
if (prefLang != null) { if (prefLang != null) {
td.tx(" (preferred)"); td.tx(" "+/*!#*/"(preferred)");
} }
} else if (langs.size() > 1) { } else if (langs.size() > 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Languages:", "Languages spoken"); nameCell(tr, /*!#*/"Languages:", /*!#*/"Languages spoken");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
XhtmlNode ul = td.ul(); XhtmlNode ul = td.ul();
@ -428,7 +442,7 @@ public class PatientRenderer extends ResourceRenderer {
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
render(r, li, i); render(r, li, i);
if (i == prefLang) { if (i == prefLang) {
li.tx(" (preferred)"); li.tx(" "+/*!#*/"(preferred)");
} }
} }
} }
@ -440,13 +454,13 @@ public class PatientRenderer extends ResourceRenderer {
PropertyWrapper pw = getProperty(r, "generalPractitioner"); PropertyWrapper pw = getProperty(r, "generalPractitioner");
if (pw != null) { if (pw != null) {
for (BaseWrapper t : pw.getValues()) { for (BaseWrapper t : pw.getValues()) {
refs.add(new NamedReferance("General Practitioner", (Reference) t.getBase(), t)); refs.add(new NamedReferance(/*!#*/"General Practitioner", (Reference) t.getBase(), t));
} }
} }
pw = getProperty(r, "managingOrganization"); pw = getProperty(r, "managingOrganization");
if (pw != null) { if (pw != null) {
for (BaseWrapper t : pw.getValues()) { for (BaseWrapper t : pw.getValues()) {
refs.add(new NamedReferance("Managing Organization", (Reference) t.getBase(), t)); refs.add(new NamedReferance(/*!#*/"Managing Organization", (Reference) t.getBase(), t));
} }
} }
pw = getProperty(r, "link"); pw = getProperty(r, "link");
@ -470,7 +484,7 @@ public class PatientRenderer extends ResourceRenderer {
if (refs.size() > 0) { if (refs.size() > 0) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Links:", "Patient Links"); nameCell(tr, /*!#*/"Links:", /*!#*/"Patient Links");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
XhtmlNode ul = td.ul(); XhtmlNode ul = td.ul();
@ -485,10 +499,10 @@ public class PatientRenderer extends ResourceRenderer {
private String describeLinkedRecord(String type) { private String describeLinkedRecord(String type) {
switch (type) { switch (type) {
case "replaced-by" : return "This record replaced by"; case "replaced-by" : return /*!#*/"This record replaced by";
case "replaces": return "This record replaces"; case "replaces": return /*!#*/"This record replaces";
case "refer": return "Please refer to"; case "refer": return /*!#*/"Please refer to";
case "seealso": return "Also see"; case "seealso": return /*!#*/"Also see";
} }
return "Unknown"; return "Unknown";
} }
@ -550,9 +564,9 @@ public class PatientRenderer extends ResourceRenderer {
} }
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
if (rels.size() == 1) { if (rels.size() == 1) {
nameCell(tr, (rels.get(0).getCodingFirstRep().hasDisplay() ? rels.get(0).getCodingFirstRep().getDisplay() : display(rels.get(0)))+":", "Nominated Contact: "+display(rels.get(0))); nameCell(tr, (rels.get(0).getCodingFirstRep().hasDisplay() ? rels.get(0).getCodingFirstRep().getDisplay() : display(rels.get(0)))+":", /*!#*/"Nominated Contact: "+display(rels.get(0)));
} else { } else {
nameCell(tr, "Contact", "Patient contact"); nameCell(tr, /*!#*/"Contact", /*!#*/"Patient contact");
} }
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
@ -562,15 +576,15 @@ public class PatientRenderer extends ResourceRenderer {
li = ul.li(); li = ul.li();
render(r, li, name); render(r, li, name);
if (gender != null) { if (gender != null) {
li.tx(" ("+gender+")"); li.tx(" "+/*!#*/"("+gender+")");
} }
} else if (gender != null) { } else if (gender != null) {
li = ul.li(); li = ul.li();
li.tx("Gender: "+gender); li.tx(/*!#*/"Gender: "+gender);
} }
if (rels.size() > 1) { if (rels.size() > 1) {
li = ul.li(); li = ul.li();
li.tx("Relationships: "); li.tx(/*!#*/"Relationships: ");
boolean first = true; boolean first = true;
for (CodeableConcept rel : rels) { for (CodeableConcept rel : rels) {
if (first) first = false; else li.tx(", "); if (first) first = false; else li.tx(", ");
@ -585,12 +599,12 @@ public class PatientRenderer extends ResourceRenderer {
} }
if (organization != null) { if (organization != null) {
li = ul.li(); li = ul.li();
li.tx("Organization: "); li.tx(/*!#*/"Organization: ");
render(r, li, organization); render(r, li, organization);
} }
if (period != null) { if (period != null) {
li = ul.li(); li = ul.li();
li.tx("Valid Period: "); li.tx(/*!#*/"Valid Period: ");
render(r, li, period); render(r, li, period);
} }
} }
@ -610,13 +624,13 @@ public class PatientRenderer extends ResourceRenderer {
}; };
if (names.size() == 1) { if (names.size() == 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Alt. Name:", "Alternate names (see the one above)"); nameCell(tr, /*!#*/"Alt. Name:", /*!#*/"Alternate names (see the one above)");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
render(r, td, names.get(0)); render(r, td, names.get(0));
} else if (names.size() > 1) { } else if (names.size() > 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Alt Names:", "Alternate names (see the one above)"); nameCell(tr, /*!#*/"Alt Names:", /*!#*/"Alternate names (see the one above)");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
XhtmlNode ul = td.ul(); XhtmlNode ul = td.ul();
@ -639,7 +653,7 @@ public class PatientRenderer extends ResourceRenderer {
} }
if (tels.size() + adds.size() == 1) { if (tels.size() + adds.size() == 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Contact Detail:", "Ways to contact the Patient"); nameCell(tr, /*!#*/"Contact Detail:", /*!#*/"Ways to contact the Patient");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
if (adds.isEmpty()) { if (adds.isEmpty()) {
@ -649,7 +663,7 @@ public class PatientRenderer extends ResourceRenderer {
} }
} else if (tels.size() + adds.size() > 1) { } else if (tels.size() + adds.size() > 1) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
nameCell(tr, "Contact Details:", "Ways to contact the Patient"); nameCell(tr, /*!#*/"Contact Details:", /*!#*/"Ways to contact the Patient");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
td.colspan("3"); td.colspan("3");
XhtmlNode ul = td.ul(); XhtmlNode ul = td.ul();
@ -684,7 +698,7 @@ public class PatientRenderer extends ResourceRenderer {
PropertyWrapper a = r.getChildByName("active"); PropertyWrapper a = r.getChildByName("active");
if (a.hasValues()) { if (a.hasValues()) {
pos++; pos++;
nameCell(tr, "Active:", "Record is active"); nameCell(tr, /*!#*/"Active:", /*!#*/"Record is active");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
if (pos == count) { if (pos == count) {
td.colspan("3"); td.colspan("3");
@ -696,7 +710,7 @@ public class PatientRenderer extends ResourceRenderer {
PropertyWrapper a = r.getChildByName("deceased[x]"); PropertyWrapper a = r.getChildByName("deceased[x]");
if (a.hasValues()) { if (a.hasValues()) {
pos++; pos++;
nameCell(tr, "Deceased:", "Known status of Patient"); nameCell(tr, /*!#*/"Deceased:", /*!#*/"Known status of Patient");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
if (pos == count) { if (pos == count) {
td.colspan("3"); td.colspan("3");
@ -711,7 +725,7 @@ public class PatientRenderer extends ResourceRenderer {
if (pos == 3) { if (pos == 3) {
tr = tbl.tr(); tr = tbl.tr();
} }
nameCell(tr, "Marital Status:", "Known Marital status of Patient"); nameCell(tr, /*!#*/"Marital Status:", /*!#*/"Known Marital status of Patient");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
if (pos == count) { if (pos == count) {
td.colspan("3"); td.colspan("3");
@ -726,7 +740,7 @@ public class PatientRenderer extends ResourceRenderer {
if (pos == 3) { if (pos == 3) {
tr = tbl.tr(); tr = tbl.tr();
} }
nameCell(tr, "Multiple Birth:", "Known multipleBirth status of Patient"); nameCell(tr, /*!#*/"Multiple Birth:", /*!#*/"Known multipleBirth status of Patient");
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
if (pos == count) { if (pos == count) {
td.colspan("3"); td.colspan("3");
@ -769,7 +783,7 @@ public class PatientRenderer extends ResourceRenderer {
String n = UUID.randomUUID().toString().toLowerCase()+ext; String n = UUID.randomUUID().toString().toLowerCase()+ext;
TextFile.bytesToFile(att.getData(), new File(Utilities.path(context.getDestDir(), n))); TextFile.bytesToFile(att.getData(), new File(Utilities.path(context.getDestDir(), n)));
context.registerFile(n); context.registerFile(n);
td.img(n, "patient photo"); td.img(n, /*!#*/"patient photo");
} }
return; return;
} }

View File

@ -107,9 +107,10 @@ public class ProfileDrivenRenderer extends ResourceRenderer {
boolean idDone = false; boolean idDone = false;
XhtmlNode p = x.para(); XhtmlNode p = x.para();
if (context.isAddGeneratedNarrativeHeader()) { if (context.isAddGeneratedNarrativeHeader()) {
p.b().tx("Generated Narrative: "+r.fhirType()+(context.isContained() ? " #"+r.getId() : "")); p.b().tx(/*!#*/"Generated Narrative: "+r.fhirType()+(context.isContained() ? " #"+r.getId() : ""));
if (!Utilities.noString(r.getId())) { if (!Utilities.noString(r.getId())) {
p.an(r.getId()); p.an(r.getId());
p.an("hc"+r.getId());
} }
idDone = true; idDone = true;
} }
@ -119,11 +120,12 @@ public class ProfileDrivenRenderer extends ResourceRenderer {
} }
if (!Utilities.noString(r.getId()) && !idDone) { if (!Utilities.noString(r.getId()) && !idDone) {
x.para().an(r.getId()); x.para().an(r.getId());
x.para().an("hc"+r.getId());
} }
try { try {
StructureDefinition sd = r.getDefinition(); StructureDefinition sd = r.getDefinition();
if (sd == null) { if (sd == null) {
throw new FHIRException("Cannot find definition for "+r.fhirType()); throw new FHIRException(/*!#*/"Cannot find definition for "+r.fhirType());
} else { } else {
ElementDefinition ed = sd.getSnapshot().getElement().get(0); ElementDefinition ed = sd.getSnapshot().getElement().get(0);
containedIds.clear(); containedIds.clear();
@ -131,9 +133,9 @@ public class ProfileDrivenRenderer extends ResourceRenderer {
generateByProfile(r, sd, r.root(), sd.getSnapshot().getElement(), ed, context.getProfileUtilities().getChildList(sd, ed), x, r.fhirType(), context.isTechnicalMode(), 0); generateByProfile(r, sd, r.root(), sd.getSnapshot().getElement(), ed, context.getProfileUtilities().getChildList(sd, ed), x, r.fhirType(), context.isTechnicalMode(), 0);
} }
} catch (Exception e) { } catch (Exception e) {
System.out.println("Error Generating Narrative for "+r.fhirType()+"/"+r.getId()+": "+e.getMessage()); System.out.println(/*!#*/"Error Generating Narrative for "+r.fhirType()+"/"+r.getId()+": "+e.getMessage());
e.printStackTrace(); e.printStackTrace();
x.para().b().style("color: maroon").tx("Exception generating Narrative: "+e.getMessage()); x.para().b().style("color: maroon").tx(/*!#*/"Exception generating Narrative: "+e.getMessage());
} }
return hasExtensions; return hasExtensions;
} }
@ -479,7 +481,7 @@ public class ProfileDrivenRenderer extends ResourceRenderer {
Reference r = (Reference) e; Reference r = (Reference) e;
if (r.getReference() != null && r.getReference().contains("#")) { if (r.getReference() != null && r.getReference().contains("#")) {
if (containedIds.contains(r.getReference().substring(1))) { if (containedIds.contains(r.getReference().substring(1))) {
x.ah(r.getReference()).tx("See "+r.getReference()); x.ah("#hc"+r.getReference().substring(1)).tx("See "+r.getReference());
} else { } else {
// in this case, we render the resource in line // in this case, we render the resource in line
ResourceWrapper rw = null; ResourceWrapper rw = null;
@ -493,7 +495,7 @@ public class ProfileDrivenRenderer extends ResourceRenderer {
} else { } else {
String ref = context.getResolver() != null ?context.getResolver().urlForContained(context, res.fhirType(), res.getId(), rw.fhirType(), rw.getId()) : null; String ref = context.getResolver() != null ?context.getResolver().urlForContained(context, res.fhirType(), res.getId(), rw.fhirType(), rw.getId()) : null;
if (ref == null) { if (ref == null) {
x.an(rw.getId()); x.an("hc"+rw.getId());
RenderingContext ctxtc = context.copy(); RenderingContext ctxtc = context.copy();
ctxtc.setAddGeneratedNarrativeHeader(false); ctxtc.setAddGeneratedNarrativeHeader(false);
ctxtc.setContained(true); ctxtc.setContained(true);
@ -831,19 +833,12 @@ public class ProfileDrivenRenderer extends ResourceRenderer {
if ("DomainResource.contained".equals(child.getBase().getPath())) { if ("DomainResource.contained".equals(child.getBase().getPath())) {
if (round2) { if (round2) {
for (BaseWrapper v : p.getValues()) { for (BaseWrapper v : p.getValues()) {
if (v.getBase() != null && !RendererFactory.hasSpecificRenderer(v.fhirType())) { if (v.getResource() != null && !RendererFactory.hasSpecificRenderer(v.fhirType())) {
x.hr(); x.hr();
RenderingContext ctxt = context.copy(); RenderingContext ctxt = context.copy();
ctxt.setContained(true); ctxt.setContained(true);
ResourceRenderer rnd = RendererFactory.factory(v.fhirType(), ctxt); ResourceRenderer rnd = RendererFactory.factory(v.fhirType(), ctxt);
ResourceWrapper rw = null; ResourceWrapper rw = v.getResource();
if (v.getBase() instanceof org.hl7.fhir.r5.elementmodel.Element) {
rw = new ElementWrappers.ResourceWrapperMetaElement(ctxt, (org.hl7.fhir.r5.elementmodel.Element) v.getBase());
} else if (v.getBase() instanceof Resource){
rw = new DirectWrappers.ResourceWrapperDirect(ctxt, (Resource) v.getBase());
} else {
throw new FHIRException("Not handled: base = "+v.getBase().getClass().getName());
}
rnd.render(x.blockquote(), rw); rnd.render(x.blockquote(), rw);
} }
} }

View File

@ -29,10 +29,10 @@ public class ProvenanceRenderer extends ResourceRenderer {
if (!prv.getTarget().isEmpty()) { if (!prv.getTarget().isEmpty()) {
if (prv.getTarget().size() == 1) { if (prv.getTarget().size() == 1) {
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("Provenance for "); p.tx(/*!#*/"Provenance for ");
renderReference(prv, p, prv.getTargetFirstRep()); renderReference(prv, p, prv.getTargetFirstRep());
} else { } else {
x.para().tx("Provenance for:"); x.para().tx(/*!#*/"Provenance for:");
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
for (Reference ref : prv.getTarget()) { for (Reference ref : prv.getTarget()) {
renderReference(prv, ul.li(), ref); renderReference(prv, ul.li(), ref);
@ -40,12 +40,12 @@ public class ProvenanceRenderer extends ResourceRenderer {
} }
} }
// summary table // summary table
x.para().tx("Summary"); x.para().tx(/*!#*/"Summary");
XhtmlNode t = x.table("grid"); XhtmlNode t = x.table("grid");
XhtmlNode tr; XhtmlNode tr;
if (prv.hasOccurred()) { if (prv.hasOccurred()) {
tr = t.tr(); tr = t.tr();
tr.td().tx("Occurrence"); tr.td().tx(/*!#*/"Occurrence");
if (prv.hasOccurredPeriod()) { if (prv.hasOccurredPeriod()) {
renderPeriod(tr.td(), prv.getOccurredPeriod()); renderPeriod(tr.td(), prv.getOccurredPeriod());
} else { } else {
@ -54,12 +54,12 @@ public class ProvenanceRenderer extends ResourceRenderer {
} }
if (prv.hasRecorded()) { if (prv.hasRecorded()) {
tr = t.tr(); tr = t.tr();
tr.td().tx("Recorded"); tr.td().tx(/*!#*/"Recorded");
tr.td().addText(prv.getRecordedElement().toHumanDisplay()); tr.td().addText(prv.getRecordedElement().toHumanDisplay());
} }
if (prv.hasPolicy()) { if (prv.hasPolicy()) {
tr = t.tr(); tr = t.tr();
tr.td().tx("Policy"); tr.td().tx(/*!#*/"Policy");
if (prv.getPolicy().size() == 1) { if (prv.getPolicy().size() == 1) {
renderUri(tr.td(), prv.getPolicy().get(0)); renderUri(tr.td(), prv.getPolicy().get(0));
} else { } else {
@ -71,12 +71,12 @@ public class ProvenanceRenderer extends ResourceRenderer {
} }
if (prv.hasLocation()) { if (prv.hasLocation()) {
tr = t.tr(); tr = t.tr();
tr.td().tx("Location"); tr.td().tx(/*!#*/"Location");
renderReference(prv, tr.td(), prv.getLocation()); renderReference(prv, tr.td(), prv.getLocation());
} }
if (prv.hasActivity()) { if (prv.hasActivity()) {
tr = t.tr(); tr = t.tr();
tr.td().tx("Activity"); tr.td().tx(/*!#*/"Activity");
renderCodeableConcept(tr.td(), prv.getActivity(), false); renderCodeableConcept(tr.td(), prv.getActivity(), false);
} }
@ -88,18 +88,18 @@ public class ProvenanceRenderer extends ResourceRenderer {
hasRole = hasRole || a.hasRole(); hasRole = hasRole || a.hasRole();
hasOnBehalfOf = hasOnBehalfOf || a.hasOnBehalfOf(); hasOnBehalfOf = hasOnBehalfOf || a.hasOnBehalfOf();
} }
x.para().b().tx("Agents"); x.para().b().tx(/*!#*/"Agents");
t = x.table("grid"); t = x.table("grid");
tr = t.tr(); tr = t.tr();
if (hasType) { if (hasType) {
tr.td().b().tx("Type"); tr.td().b().tx(/*!#*/"Type");
} }
if (hasRole) { if (hasRole) {
tr.td().b().tx("Role"); tr.td().b().tx(/*!#*/"Role");
} }
tr.td().b().tx("who"); tr.td().b().tx(/*!#*/"who");
if (hasOnBehalfOf) { if (hasOnBehalfOf) {
tr.td().b().tx("On Behalf Of"); tr.td().b().tx(/*!#*/"On Behalf Of");
} }
for (ProvenanceAgentComponent a : prv.getAgent()) { for (ProvenanceAgentComponent a : prv.getAgent()) {
tr = t.tr(); tr = t.tr();
@ -147,12 +147,12 @@ public class ProvenanceRenderer extends ResourceRenderer {
} }
public String display(Provenance prv) throws UnsupportedEncodingException, IOException { public String display(Provenance prv) throws UnsupportedEncodingException, IOException {
return "Provenance for "+displayReference(prv, prv.getTargetFirstRep()); return /*!#*/"Provenance for "+displayReference(prv, prv.getTargetFirstRep());
} }
@Override @Override
public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException { public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException {
return "Not done yet"; return /*!#*/"Not done yet";
} }
} }

View File

@ -7,6 +7,7 @@ import java.util.List;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.ContextUtilities;
import org.hl7.fhir.r5.model.CanonicalResource;
import org.hl7.fhir.r5.model.CanonicalType; import org.hl7.fhir.r5.model.CanonicalType;
import org.hl7.fhir.r5.model.CodeType; import org.hl7.fhir.r5.model.CodeType;
import org.hl7.fhir.r5.model.CodeableConcept; import org.hl7.fhir.r5.model.CodeableConcept;
@ -67,9 +68,9 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
boolean doOpts = context.getDefinitionsTarget() == null && hasAnyOptions(q.getItem()); boolean doOpts = context.getDefinitionsTarget() == null && hasAnyOptions(q.getItem());
if (doOpts) { if (doOpts) {
x.b().tx("Structure"); x.b().tx(/*!#*/"Structure");
} }
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context, context.getDestDir(), context.isInlineGraphics(), true);
TableModel model = gen.new TableModel("qtree="+q.getId(), context.getRules() == GenerationRules.IG_PUBLISHER); TableModel model = gen.new TableModel("qtree="+q.getId(), context.getRules() == GenerationRules.IG_PUBLISHER);
model.setAlternating(true); model.setAlternating(true);
if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) { if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) {
@ -78,14 +79,14 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png")); model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png"));
} }
model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table"); model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table");
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "LinkId"), translate("sd.hint", "The linkId for the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"LinkId", /*!#*/"The linkId for the item", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Text"), translate("sd.hint", "Text for the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Text", /*!#*/"Text for the item", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Cardinality"), translate("sd.hint", "Minimum and Maximum # of times the the itemcan appear in the instance"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Cardinality", /*!#*/"Minimum and Maximum # of times the the itemcan appear in the instance", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Type"), translate("sd.hint", "The type of the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Type", /*!#*/"The type of the item", null, 0));
if (hasFlags) { if (hasFlags) {
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Flags"), translate("sd.hint", "Other attributes of the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Flags", /*!#*/"Other attributes of the item", null, 0));
} }
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Description & Constraints"), translate("sd.hint", "Additional information about the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Description & Constraints", /*!#*/"Additional information about the item", null, 0));
boolean hasExt = false; boolean hasExt = false;
// first we add a root for the questionaire itself // first we add a root for the questionaire itself
@ -104,7 +105,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
private void renderOptions(Questionnaire q, XhtmlNode x) { private void renderOptions(Questionnaire q, XhtmlNode x) {
if (hasAnyOptions(q.getItem())) { if (hasAnyOptions(q.getItem())) {
x.hr(); x.hr();
x.para().b().tx("Option Sets"); x.para().b().tx(/*!#*/"Option Sets");
renderOptions(q.getItem(), x); renderOptions(q.getItem(), x);
} }
} }
@ -123,7 +124,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
useSelect = useSelect || opt.getInitialSelected(); useSelect = useSelect || opt.getInitialSelected();
} }
x.an("opt-item."+i.getLinkId()); x.an("opt-item."+i.getLinkId());
x.para().b().tx("Answer options for "+i.getLinkId()); x.para().b().tx(/*!#*/"Answer options for "+i.getLinkId());
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
for (QuestionnaireItemAnswerOptionComponent opt : i.getAnswerOption()) { for (QuestionnaireItemAnswerOptionComponent opt : i.getAnswerOption()) {
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
@ -208,11 +209,11 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
Row r = gen.new Row(); Row r = gen.new Row();
rows.add(r); rows.add(r);
r.setIcon("icon_q_root.gif", "QuestionnaireRoot"); r.setIcon("icon_q_root.gif", /*!#*/"QuestionnaireRoot");
r.getCells().add(gen.new Cell(null, null, q.getName(), null, null)); r.getCells().add(gen.new Cell(null, null, q.getName(), null, null));
r.getCells().add(gen.new Cell(null, null, q.getDescription(), null, null)); r.getCells().add(gen.new Cell(null, null, q.getDescription(), null, null));
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
r.getCells().add(gen.new Cell(null, null, "Questionnaire", null, null)); r.getCells().add(gen.new Cell(null, null, /*!#*/"Questionnaire", null, null));
if (hasFlags) { if (hasFlags) {
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
} }
@ -224,14 +225,15 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
return Utilities.pathURL(context.getLink(KnownLinkType.SPEC), path); return Utilities.pathURL(context.getLink(KnownLinkType.SPEC), path);
} }
private String getSDCLink(String path) { private String getSDCLink(String url, String path) {
if (Utilities.isAbsoluteUrl(path)) { StructureDefinition sd = context.getContext().fetchResource(StructureDefinition.class, url);
StructureDefinition sd = context.getContext().fetchResource(StructureDefinition.class, path); if (sd == null) {
if (sd != null) { sd = context.getContext().fetchResource(StructureDefinition.class, path);
return sd.getWebPath(); }
} else { if (sd != null && sd.hasWebPath()) {
return path.replace("StructureDefinition/", "StructureDefinition-")+".html"; return sd.getWebPath();
} } else if (Utilities.isAbsoluteUrl(path)) {
return path.replace("StructureDefinition/", "StructureDefinition-")+".html";
} else { } else {
return Utilities.pathURL("http://hl7.org/fhir/uv/sdc", path); // for now? return Utilities.pathURL("http://hl7.org/fhir/uv/sdc", path); // for now?
} }
@ -261,45 +263,45 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
Cell flags = gen.new Cell(); Cell flags = gen.new Cell();
r.getCells().add(flags); r.getCells().add(flags);
if (i.getReadOnly()) { if (i.getReadOnly()) {
flags.addPiece(gen.new Piece(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "questionnaire-definitions.html#Questionnaire.item.readOnly"), null, "Is Readonly").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-readonly.png")))); flags.addPiece(gen.new Piece(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "questionnaire-definitions.html#Questionnaire.item.readOnly"), null, /*!#*/"Is Readonly").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-readonly.png"))));
} }
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) { if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) {
flags.addPiece(gen.new Piece(getSDCLink("StructureDefinition-sdc-questionnaire-isSubject.html"), null, "Can change the subject of the questionnaire").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-subject.png")))); flags.addPiece(gen.new Piece(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", "StructureDefinition-sdc-questionnaire-isSubject.html"), null, /*!#*/"Can change the subject of the questionnaire").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-subject.png"))));
} }
if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_HIDDEN)) { if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_HIDDEN)) {
flags.addPiece(gen.new Piece(getSpecLink("extension-questionnaire-hidden.html"), null, "Is a hidden item").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-hidden.png")))); flags.addPiece(gen.new Piece(getSpecLink("extension-questionnaire-hidden.html"), null, /*!#*/"Is a hidden item").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-hidden.png"))));
} }
if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_OTP_DISP)) { if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_OTP_DISP)) {
flags.addPiece(gen.new Piece(getSDCLink("StructureDefinition-sdc-questionnaire-optionalDisplay.html"), null, "Is optional to display").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-optional.png")))); flags.addPiece(gen.new Piece(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay", "StructureDefinition-sdc-questionnaire-optionalDisplay.html"), null, /*!#*/"Is optional to display").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-optional.png"))));
} }
if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) { if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) {
flags.addPiece(gen.new Piece(getSDCLink("StructureDefinition-sdc-questionnaire-observationLinkPeriod.html"), null, "Is linked to an observation").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-observation.png")))); flags.addPiece(gen.new Piece(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", "StructureDefinition-sdc-questionnaire-observationLinkPeriod.html"), null, /*!#*/"Is linked to an observation").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-observation.png"))));
} }
if (i.hasExtension(ToolingExtensions.EXT_Q_CHOICE_ORIENT)) { if (i.hasExtension(ToolingExtensions.EXT_Q_CHOICE_ORIENT)) {
String code = ToolingExtensions.readStringExtension(i, ToolingExtensions.EXT_Q_CHOICE_ORIENT); String code = ToolingExtensions.readStringExtension(i, ToolingExtensions.EXT_Q_CHOICE_ORIENT);
flags.addPiece(gen.new Piece(getSpecLink("extension-questionnaire-choiceorientation.html"), null, "Orientation: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-" + code + ".png")))); flags.addPiece(gen.new Piece(getSpecLink("extension-questionnaire-choiceorientation.html"), null, /*!#*/"Orientation: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-" + code + ".png"))));
} }
if (i.hasExtension(ToolingExtensions.EXT_Q_DISPLAY_CAT)) { if (i.hasExtension(ToolingExtensions.EXT_Q_DISPLAY_CAT)) {
CodeableConcept cc = i.getExtensionByUrl(ToolingExtensions.EXT_Q_DISPLAY_CAT).getValueCodeableConcept(); CodeableConcept cc = i.getExtensionByUrl(ToolingExtensions.EXT_Q_DISPLAY_CAT).getValueCodeableConcept();
String code = cc.getCode("http://hl7.org/fhir/questionnaire-display-category"); String code = cc.getCode("http://hl7.org/fhir/questionnaire-display-category");
flags.addPiece(gen.new Piece("https://hl7.org/fhir/R4/extension-questionnaire-displayCategory.html", null, "Category: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-" + code + ".png")))); flags.addPiece(gen.new Piece("https://hl7.org/fhir/R4/extension-questionnaire-displayCategory.html", null, /*!#*/"Category: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("alt", "icon").attribute("src", getImgPath("icon-qi-" + code + ".png"))));
} }
} }
Cell defn = gen.new Cell(); Cell defn = gen.new Cell();
r.getCells().add(defn); r.getCells().add(defn);
if (i.hasMaxLength()) { if (i.hasMaxLength()) {
defn.getPieces().add(gen.new Piece(null, "Max Length: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Max Length: ", null));
defn.getPieces().add(gen.new Piece(null, Integer.toString(i.getMaxLength()), null)); defn.getPieces().add(gen.new Piece(null, Integer.toString(i.getMaxLength()), null));
} }
if (i.hasDefinition()) { if (i.hasDefinition()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Definition: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Definition: ", null));
genDefinitionLink(gen, i, defn, q); genDefinitionLink(gen, i, defn, q);
} }
if (i.hasEnableWhen()) { if (i.hasEnableWhen()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
Piece p = gen.new Piece(null, "Enable When: ", null); Piece p = gen.new Piece(null, /*!#*/"Enable When: ", null);
defn.getPieces().add(p); defn.getPieces().add(p);
if (i.getEnableWhen().size() == 1) { if (i.getEnableWhen().size() == 1) {
XhtmlNode x = new XhtmlNode(NodeType.Element, "span"); XhtmlNode x = new XhtmlNode(NodeType.Element, "span");
@ -315,7 +317,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
if (i.hasAnswerValueSet()) { if (i.hasAnswerValueSet()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Value Set: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Value Set: ", null));
if (!Utilities.noString(i.getAnswerValueSet()) && i.getAnswerValueSet().startsWith("#")) { if (!Utilities.noString(i.getAnswerValueSet()) && i.getAnswerValueSet().startsWith("#")) {
ValueSet vs = (ValueSet) q.getContained(i.getAnswerValueSet().substring(1)); ValueSet vs = (ValueSet) q.getContained(i.getAnswerValueSet().substring(1));
if (vs == null) { if (vs == null) {
@ -334,7 +336,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
if (i.hasAnswerOption()) { if (i.hasAnswerOption()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Options: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Options: ", null));
if (context.getDefinitionsTarget() == null) { if (context.getDefinitionsTarget() == null) {
// if we don't have a definitions target, we'll add them below. // if we don't have a definitions target, we'll add them below.
defn.getPieces().add(gen.new Piece("#opt-item."+i.getLinkId(), Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), null)); defn.getPieces().add(gen.new Piece("#opt-item."+i.getLinkId(), Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), null));
@ -345,7 +347,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
if (i.hasInitial()) { if (i.hasInitial()) {
for (QuestionnaireItemInitialComponent v : i.getInitial()) { for (QuestionnaireItemInitialComponent v : i.getInitial()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Initial Value: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Initial Value: ", null));
defn.getPieces().add(gen.new Piece(null, v.getValue().fhirType(), null)); defn.getPieces().add(gen.new Piece(null, v.getValue().fhirType(), null));
defn.getPieces().add(gen.new Piece(null, " = ", null)); defn.getPieces().add(gen.new Piece(null, " = ", null));
if (v.getValue().isPrimitive()) { if (v.getValue().isPrimitive()) {
@ -373,26 +375,26 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) { if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Expressions: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Expressions: ", null));
Piece p = gen.new Piece("ul"); Piece p = gen.new Piece("ul");
defn.getPieces().add(p); defn.getPieces().add(p);
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) {
addExpression(p, e.getValueExpression(), "Initial Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Initial Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression")) {
addExpression(p, e.getValueExpression(), "Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext")) {
addExpression(p, e.getValueExpression(), "Item Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext"); addExpression(p, e.getValueExpression(), /*!#*/"Item Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression")) {
addExpression(p, e.getValueExpression(), "Enable When", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Enable When", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression")) {
addExpression(p, e.getValueExpression(), "Calculated Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Calculated Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression")) {
addExpression(p, e.getValueExpression(), "Candidates", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Candidates", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression");
} }
} }
@ -447,13 +449,18 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
private void addExpression(Piece p, Expression exp, String label, String url) { private void addExpression(Piece p, Expression exp, String label, String url) {
XhtmlNode x = new XhtmlNode(NodeType.Element, "li").style("font-size: 11px"); XhtmlNode x = new XhtmlNode(NodeType.Element, "li").style("font-size: 11px");
p.addHtml(x); p.addHtml(x);
x.ah(url).tx(label); CanonicalResource cr = (CanonicalResource) context.getContext().fetchResource(Resource.class, url);
if (cr != null && cr.hasWebPath()) {
x.ah(cr.getWebPath()).tx(label);
} else {
x.ah(url).tx(label);
}
x.tx(": "); x.tx(": ");
x.code(exp.getExpression()); x.code(exp.getExpression());
} }
private boolean renderLogic(XhtmlNode x, Questionnaire q) throws FHIRException, IOException { private boolean renderLogic(XhtmlNode x, Questionnaire q) throws FHIRException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context, context.getDestDir(), context.isInlineGraphics(), true);
TableModel model = gen.new TableModel("qtree="+q.getId(), true); TableModel model = gen.new TableModel("qtree="+q.getId(), true);
model.setAlternating(true); model.setAlternating(true);
if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) { if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) {
@ -462,8 +469,8 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png")); model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png"));
} }
model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table"); model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table");
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "LinkId"), translate("sd.hint", "The linkId for the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"LinkId", /*!#*/"The linkId for the item", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Description & Constraints"), translate("sd.hint", "Additional information about the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Description & Constraints", /*!#*/"Additional information about the item", null, 0));
boolean hasExt = false; boolean hasExt = false;
if (!q.hasItem()) { if (!q.hasItem()) {
@ -489,22 +496,22 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
r.getCells().add(defn); r.getCells().add(defn);
if (i.hasMaxLength()) { if (i.hasMaxLength()) {
defn.getPieces().add(gen.new Piece(null, "Max Length: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Max Length: ", null));
defn.getPieces().add(gen.new Piece(null, Integer.toString(i.getMaxLength()), null)); defn.getPieces().add(gen.new Piece(null, Integer.toString(i.getMaxLength()), null));
} }
if (i.hasDefinition()) { if (i.hasDefinition()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Definition: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Definition: ", null));
genDefinitionLink(gen, i, defn, q); genDefinitionLink(gen, i, defn, q);
} }
if (i.hasEnableWhen()) { if (i.hasEnableWhen()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Enable When: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Enable When: ", null));
defn.getPieces().add(gen.new Piece(null, "todo", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"todo", null));
} }
if (i.hasAnswerValueSet()) { if (i.hasAnswerValueSet()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Value Set: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Value Set: ", null));
if (Utilities.noString(i.getAnswerValueSet()) && i.getAnswerValueSet().startsWith("#")) { if (Utilities.noString(i.getAnswerValueSet()) && i.getAnswerValueSet().startsWith("#")) {
ValueSet vs = (ValueSet) q.getContained(i.getAnswerValueSet().substring(1)); ValueSet vs = (ValueSet) q.getContained(i.getAnswerValueSet().substring(1));
if (vs == null) { if (vs == null) {
@ -523,13 +530,13 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
if (i.hasAnswerOption()) { if (i.hasAnswerOption()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Options: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Options: ", null));
defn.getPieces().add(gen.new Piece(context.getDefinitionsTarget()+"#item."+i.getLinkId(), Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), null)); defn.getPieces().add(gen.new Piece(context.getDefinitionsTarget()+"#item."+i.getLinkId(), Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), null));
} }
if (i.hasInitial()) { if (i.hasInitial()) {
for (QuestionnaireItemInitialComponent v : i.getInitial()) { for (QuestionnaireItemInitialComponent v : i.getInitial()) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Initial Value: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Initial Value: ", null));
defn.getPieces().add(gen.new Piece(null, v.getValue().fhirType(), null)); defn.getPieces().add(gen.new Piece(null, v.getValue().fhirType(), null));
defn.getPieces().add(gen.new Piece(null, " = ", null)); defn.getPieces().add(gen.new Piece(null, " = ", null));
if (v.getValue().isPrimitive()) { if (v.getValue().isPrimitive()) {
@ -557,26 +564,26 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) { if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression") || i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) {
if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br")); if (!defn.getPieces().isEmpty()) defn.addPiece(gen.new Piece("br"));
defn.getPieces().add(gen.new Piece(null, "Expressions: ", null)); defn.getPieces().add(gen.new Piece(null, /*!#*/"Expressions: ", null));
Piece p = gen.new Piece("ul"); Piece p = gen.new Piece("ul");
defn.getPieces().add(p); defn.getPieces().add(p);
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression")) {
addExpression(p, e.getValueExpression(), "Initial Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Initial Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression")) {
addExpression(p, e.getValueExpression(), "Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-contextExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext")) {
addExpression(p, e.getValueExpression(), "Item Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext"); addExpression(p, e.getValueExpression(), /*!#*/"Item Context", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemContext");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression")) {
addExpression(p, e.getValueExpression(), "Enable When", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Enable When", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression")) {
addExpression(p, e.getValueExpression(), "Calculated Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Calculated Value", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression");
} }
for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression")) { for (Extension e : i.getExtensionsByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression")) {
addExpression(p, e.getValueExpression(), "Candidates", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression"); addExpression(p, e.getValueExpression(), /*!#*/"Candidates", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression");
} }
} }
@ -633,7 +640,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
p.span(null, "linkId: "+i.getLinkId()).tx(i.getText()); p.span(null, "linkId: "+i.getLinkId()).tx(i.getText());
if (i.getRequired()) { if (i.getRequired()) {
p.span("color: red", "Mandatory").tx("*"); p.span("color: red", /*!#*/"Mandatory").tx("*");
} }
XhtmlNode input = null; XhtmlNode input = null;
@ -712,39 +719,39 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) { if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) {
hasFlag = true; hasFlag = true;
flags.ah(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject"), "Can change the subject of the questionnaire").img(getImgPath("icon-qi-subject.png"), "icon"); flags.ah(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", "StructureDefinition-sdc-questionnaire-isSubject.html"), /*!#*/"Can change the subject of the questionnaire").img(getImgPath("icon-qi-subject.png"), "icon");
} }
if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_HIDDEN)) { if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_HIDDEN)) {
hasFlag = true; hasFlag = true;
flags.ah(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "extension-questionnaire-hidden.html"), "Is a hidden item").img(getImgPath("icon-qi-hidden.png"), "icon"); flags.ah(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "extension-questionnaire-hidden.html"), /*!#*/"Is a hidden item").img(getImgPath("icon-qi-hidden.png"), "icon");
d.style("background-color: #eeeeee"); d.style("background-color: #eeeeee");
} }
if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_OTP_DISP)) { if (ToolingExtensions.readBoolExtension(i, ToolingExtensions.EXT_Q_OTP_DISP)) {
hasFlag = true; hasFlag = true;
flags.ah(getSDCLink(ToolingExtensions.EXT_Q_OTP_DISP), "Is optional to display").img(getImgPath("icon-qi-optional.png"), "icon"); flags.ah(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay", "StructureDefinition-sdc-questionnaire-optionalDisplay.html"), /*!#*/"Is optional to display").img(getImgPath("icon-qi-optional.png"), "icon");
} }
if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) { if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) {
hasFlag = true; hasFlag = true;
flags.ah(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod"), "Is linked to an observation").img(getImgPath("icon-qi-observation.png"), "icon"); flags.ah(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", "StructureDefinition-sdc-questionnaire-observationLinkPeriod.html"), /*!#*/"Is linked to an observation").img(getImgPath("icon-qi-observation.png"), "icon");
} }
if (i.hasExtension(ToolingExtensions.EXT_Q_DISPLAY_CAT)) { if (i.hasExtension(ToolingExtensions.EXT_Q_DISPLAY_CAT)) {
CodeableConcept cc = i.getExtensionByUrl(ToolingExtensions.EXT_Q_DISPLAY_CAT).getValueCodeableConcept(); CodeableConcept cc = i.getExtensionByUrl(ToolingExtensions.EXT_Q_DISPLAY_CAT).getValueCodeableConcept();
String code = cc.getCode("http://hl7.org/fhir/questionnaire-display-category"); String code = cc.getCode("http://hl7.org/fhir/questionnaire-display-category");
hasFlag = true; hasFlag = true;
flags.ah("https://hl7.org/fhir/R4/extension-questionnaire-displayCategory.html", "Category: "+code).img(getImgPath("icon-qi-" + code + ".png"), "icon"); flags.ah("https://hl7.org/fhir/R4/extension-questionnaire-displayCategory.html", /*!#*/"Category: "+code).img(getImgPath("icon-qi-" + code + ".png"), "icon");
} }
if (i.hasMaxLength()) { if (i.hasMaxLength()) {
item(ul, "Max Length", Integer.toString(i.getMaxLength())); item(ul, /*!#*/"Max Length", Integer.toString(i.getMaxLength()));
} }
if (i.hasDefinition()) { if (i.hasDefinition()) {
genDefinitionLink(item(ul, "Definition"), i, q); genDefinitionLink(item(ul, /*!#*/"Definition"), i, q);
} }
if (i.hasEnableWhen()) { if (i.hasEnableWhen()) {
item(ul, "Enable When", "todo"); item(ul, /*!#*/"Enable When", "todo");
} }
if (i.hasAnswerValueSet()) { if (i.hasAnswerValueSet()) {
XhtmlNode ans = item(ul, "Answers"); XhtmlNode ans = item(ul, /*!#*/"Answers");
if (!Utilities.noString(i.getAnswerValueSet()) && i.getAnswerValueSet().startsWith("#")) { if (!Utilities.noString(i.getAnswerValueSet()) && i.getAnswerValueSet().startsWith("#")) {
ValueSet vs = (ValueSet) q.getContained(i.getAnswerValueSet().substring(1)); ValueSet vs = (ValueSet) q.getContained(i.getAnswerValueSet().substring(1));
if (vs == null || !vs.hasWebPath()) { if (vs == null || !vs.hasWebPath()) {
@ -762,10 +769,10 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
} }
if (i.hasAnswerOption()) { if (i.hasAnswerOption()) {
item(ul, "Answers", Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), context.getDefinitionsTarget()+"#item."+i.getLinkId()); item(ul, /*!#*/"Answers", Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), context.getDefinitionsTarget()+"#item."+i.getLinkId());
} }
if (i.hasInitial()) { if (i.hasInitial()) {
XhtmlNode vi = item(ul, "Initial Values"); XhtmlNode vi = item(ul, /*!#*/"Initial Values");
boolean first = true; boolean first = true;
for (QuestionnaireItemInitialComponent v : i.getInitial()) { for (QuestionnaireItemInitialComponent v : i.getInitial()) {
if (first) first = false; else vi.tx(", "); if (first) first = false; else vi.tx(", ");
@ -876,13 +883,13 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
public String display(Questionnaire q) throws UnsupportedEncodingException, IOException { public String display(Questionnaire q) throws UnsupportedEncodingException, IOException {
return "Questionnaire "+q.present(); return /*!#*/"Questionnaire "+q.present();
} }
private boolean renderLinks(XhtmlNode x, Questionnaire q) { private boolean renderLinks(XhtmlNode x, Questionnaire q) {
x.para().tx("Try this questionnaire out:"); x.para().tx(/*!#*/"Try this questionnaire out:");
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
ul.li().ah("http://todo.nlm.gov/path?mode=ig&src="+Utilities.pathURL(context.getLink(KnownLinkType.SELF), "package.tgz")+"&q="+q.getId()+".json").tx("NLM Forms Library"); ul.li().ah("http://todo.nlm.gov/path?mode=ig&src="+Utilities.pathURL(context.getLink(KnownLinkType.SELF), "package.tgz")+"&q="+q.getId()+".json").tx(/*!#*/"NLM Forms Library");
return false; return false;
} }
@ -901,42 +908,42 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
XhtmlNode td = tbl.tr().td("structure").colspan("2").span(null, null).attribute("class", "self-link-parent"); XhtmlNode td = tbl.tr().td("structure").colspan("2").span(null, null).attribute("class", "self-link-parent");
td.an(q.getId()); td.an(q.getId());
td.img(getImgPath("icon_q_root.gif"), "icon"); td.img(getImgPath("icon_q_root.gif"), "icon");
td.tx(" Questionnaire "); td.tx(" "+/*!#*/"Questionnaire ");
td.b().tx(q.getId()); td.b().tx(q.getId());
// general information // general information
defn(tbl, "URL", q.getUrl()); defn(tbl, /*!#*/"URL", q.getUrl());
defn(tbl, "Version", q.getVersion()); defn(tbl, /*!#*/"Version", q.getVersion());
defn(tbl, "Name", q.getName()); defn(tbl, /*!#*/"Name", q.getName());
defn(tbl, "Title", q.getTitle()); defn(tbl, /*!#*/"Title", q.getTitle());
if (q.hasDerivedFrom()) { if (q.hasDerivedFrom()) {
td = defn(tbl, "Derived From"); td = defn(tbl, /*!#*/"Derived From");
boolean first = true; boolean first = true;
for (CanonicalType c : q.getDerivedFrom()) { for (CanonicalType c : q.getDerivedFrom()) {
if (first) first = false; else td.tx(", "); if (first) first = false; else td.tx(", ");
td.tx(c.asStringValue()); // todo: make these a reference td.tx(c.asStringValue()); // todo: make these a reference
} }
} }
defn(tbl, "Status", q.getStatus().getDisplay()); defn(tbl, /*!#*/"Status", q.getStatus().getDisplay());
defn(tbl, "Experimental", q.getExperimental()); defn(tbl, /*!#*/"Experimental", q.getExperimental());
defn(tbl, "Publication Date", q.getDateElement().primitiveValue()); defn(tbl, /*!#*/"Publication Date", q.getDateElement().primitiveValue());
defn(tbl, "Approval Date", q.getApprovalDateElement().primitiveValue()); defn(tbl, /*!#*/"Approval Date", q.getApprovalDateElement().primitiveValue());
defn(tbl, "Last Review Date", q.getLastReviewDateElement().primitiveValue()); defn(tbl, /*!#*/"Last Review Date", q.getLastReviewDateElement().primitiveValue());
if (q.hasEffectivePeriod()) { if (q.hasEffectivePeriod()) {
renderPeriod(defn(tbl, "Effective Period"), q.getEffectivePeriod()); renderPeriod(defn(tbl, /*!#*/"Effective Period"), q.getEffectivePeriod());
} }
if (q.hasSubjectType()) { if (q.hasSubjectType()) {
td = defn(tbl, "Subject Type"); td = defn(tbl, /*!#*/"Subject Type");
boolean first = true; boolean first = true;
for (CodeType c : q.getSubjectType()) { for (CodeType c : q.getSubjectType()) {
if (first) first = false; else td.tx(", "); if (first) first = false; else td.tx(", ");
td.tx(c.asStringValue()); td.tx(c.asStringValue());
} }
} }
defn(tbl, "Description", q.getDescription()); defn(tbl, /*!#*/"Description", q.getDescription());
defn(tbl, "Purpose", q.getPurpose()); defn(tbl, /*!#*/"Purpose", q.getPurpose());
defn(tbl, "Copyright", q.getCopyright()); defn(tbl, /*!#*/"Copyright", q.getCopyright());
if (q.hasCode()) { if (q.hasCode()) {
td = defn(tbl, Utilities.pluralize("Code", q.getCode().size())); td = defn(tbl, Utilities.pluralize("Code", q.getCode().size()));
boolean first = true; boolean first = true;
@ -961,37 +968,37 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
td.b().tx(qi.getLinkId()); td.b().tx(qi.getLinkId());
// general information // general information
defn(tbl, "Link Id", qi.getLinkId()); defn(tbl, /*!#*/"Link Id", qi.getLinkId());
defn(tbl, "Prefix", qi.getPrefix()); defn(tbl, /*!#*/"Prefix", qi.getPrefix());
defn(tbl, "Text", qi.getText()); defn(tbl, /*!#*/"Text", qi.getText());
defn(tbl, "Type", qi.getType().getDisplay()); defn(tbl, /*!#*/"Type", qi.getType().getDisplay());
defn(tbl, "Required", qi.getRequired(), true); defn(tbl, /*!#*/"Required", qi.getRequired(), true);
defn(tbl, "Repeats", qi.getRepeats(), true); defn(tbl, /*!#*/"Repeats", qi.getRepeats(), true);
defn(tbl, "Read Only", qi.getReadOnly(), false); defn(tbl, /*!#*/"Read Only", qi.getReadOnly(), false);
if (ToolingExtensions.readBoolExtension(qi, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) { if (ToolingExtensions.readBoolExtension(qi, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) {
defn(tbl, "Subject", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", "This element changes who the subject of the question is", null); defn(tbl, /*!#*/"Subject", "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", "This element changes who the subject of the question is", null);
} }
// content control // content control
defn(tbl, "Max Length", qi.getMaxLength()); defn(tbl, /*!#*/"Max Length", qi.getMaxLength());
if (qi.hasAnswerValueSet()) { if (qi.hasAnswerValueSet()) {
defn(tbl, "Value Set", qi.getDefinition(), context.getWorker().findTxResource(ValueSet.class, qi.getAnswerValueSet(), q)); defn(tbl, /*!#*/"Value Set", qi.getDefinition(), context.getWorker().findTxResource(ValueSet.class, qi.getAnswerValueSet(), q));
} }
if (qi.hasAnswerOption()) { if (qi.hasAnswerOption()) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().tx("Allowed Answers"); tr.td().tx(/*!#*/"Allowed Answers");
XhtmlNode ul = tr.td().ul(); XhtmlNode ul = tr.td().ul();
for (QuestionnaireItemAnswerOptionComponent ans : qi.getAnswerOption()) { for (QuestionnaireItemAnswerOptionComponent ans : qi.getAnswerOption()) {
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
render(li, ans.getValue()); render(li, ans.getValue());
if (ans.getInitialSelected()) { if (ans.getInitialSelected()) {
li.tx(" (initially selected)"); li.tx(" "+/*!#*/"(initially selected)");
} }
} }
} }
if (qi.hasInitial()) { if (qi.hasInitial()) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().tx(Utilities.pluralize("Initial Answer", qi.getInitial().size())); tr.td().tx(Utilities.pluralize(/*!#*/"Initial Answer", qi.getInitial().size()));
if (qi.getInitial().size() == 1) { if (qi.getInitial().size() == 1) {
render(tr.td(), qi.getInitialFirstRep().getValue()); render(tr.td(), qi.getInitialFirstRep().getValue());
} else { } else {
@ -1010,20 +1017,20 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
render(tr.td(), qi.getExtensionByUrl(ToolingExtensions.EXT_Q_DISPLAY_CAT).getValue()); render(tr.td(), qi.getExtensionByUrl(ToolingExtensions.EXT_Q_DISPLAY_CAT).getValue());
} }
if (ToolingExtensions.readBoolExtension(qi, ToolingExtensions.EXT_Q_HIDDEN)) { if (ToolingExtensions.readBoolExtension(qi, ToolingExtensions.EXT_Q_HIDDEN)) {
defn(tbl, "Hidden Item", ToolingExtensions.EXT_Q_DISPLAY_CAT, "This item is a hidden question", null); defn(tbl, /*!#*/"Hidden Item", ToolingExtensions.EXT_Q_DISPLAY_CAT, "This item is a hidden question", null);
} }
if (ToolingExtensions.readBoolExtension(qi, ToolingExtensions.EXT_Q_OTP_DISP)) { if (ToolingExtensions.readBoolExtension(qi, ToolingExtensions.EXT_Q_OTP_DISP)) {
defn(tbl, "Hidden Item", ToolingExtensions.EXT_Q_OTP_DISP, "This item is optional to display", null); defn(tbl, /*!#*/"Hidden Item", ToolingExtensions.EXT_Q_OTP_DISP, "This item is optional to display", null);
} }
// formal definitions // formal definitions
if (qi.hasDefinition()) { if (qi.hasDefinition()) {
genDefinitionLink(defn(tbl, "Definition"), qi, q); genDefinitionLink(defn(tbl, /*!#*/"Definition"), qi, q);
} }
if (qi.hasCode()) { if (qi.hasCode()) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().tx(Utilities.pluralize("Code", qi.getCode().size())); tr.td().tx(Utilities.pluralize(/*!#*/"Code", qi.getCode().size()));
XhtmlNode ul = tr.td().ul(); XhtmlNode ul = tr.td().ul();
for (Coding c : qi.getCode()) { for (Coding c : qi.getCode()) {
renderCodingWithDetails(ul.li(), c); renderCodingWithDetails(ul.li(), c);
@ -1031,22 +1038,27 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
} }
if (qi.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) { if (qi.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod").tx("Observation Link Period"); StructureDefinition sd = context.getContext().fetchResource(StructureDefinition.class, ToolingExtensions.EXT_O_LINK_PERIOD);
if (sd != null && sd.hasWebPath()) {
tr.td().ah(sd.getWebPath()).tx(/*!#*/"Observation Link Period");
} else {
tr.td().ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod").tx(/*!#*/"Observation Link Period");
}
render(tr.td(), qi.getExtensionByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod").getValue()); render(tr.td(), qi.getExtensionByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod").getValue());
} }
// dynamic management // dynamic management
if (qi.hasEnableWhen()) { if (qi.hasEnableWhen()) {
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().tx("Enable When"); tr.td().tx(/*!#*/"Enable When");
td = tr.td(); td = tr.td();
if (qi.getEnableWhen().size() == 1) { if (qi.getEnableWhen().size() == 1) {
renderEnableWhen(td, qi.getEnableWhen().get(0)); renderEnableWhen(td, qi.getEnableWhen().get(0));
} else { } else {
if (qi.hasEnableBehavior()) { if (qi.hasEnableBehavior()) {
td.tx(qi.getEnableBehavior().getDisplay()+" are true:"); td.tx(qi.getEnableBehavior().getDisplay()+" "+/*!#*/"are true:");
} else { } else {
td.tx("?? are true:"); td.tx(/*!#*/"?? are true:");
} }
XhtmlNode ul = td.ul(); XhtmlNode ul = td.ul();
for (QuestionnaireItemEnableWhenComponent ew : qi.getEnableWhen()) { for (QuestionnaireItemEnableWhenComponent ew : qi.getEnableWhen()) {
@ -1071,11 +1083,11 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
private void defn(XhtmlNode tbl, String name, String url, Resource res) throws UnsupportedEncodingException, IOException { private void defn(XhtmlNode tbl, String name, String url, Resource res) throws UnsupportedEncodingException, IOException {
if (res != null && res.hasWebPath()) { if (res != null && res.hasWebPath()) {
defn(tbl, "Definition", RendererFactory.factory(res, context).display(res), res.getWebPath()); defn(tbl, /*!#*/"Definition", RendererFactory.factory(res, context).display(res), res.getWebPath());
} else if (Utilities.isAbsoluteUrlLinkable(url)) { } else if (Utilities.isAbsoluteUrlLinkable(url)) {
defn(tbl, "Definition", url, url); defn(tbl, /*!#*/"Definition", url, url);
} { } {
defn(tbl, "Definition", url); defn(tbl, /*!#*/"Definition", url);
} }
} }

View File

@ -45,7 +45,7 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
// case DEFNS: return renderDefns(x, q); // case DEFNS: return renderDefns(x, q);
case TREE: return renderTree(x, q); case TREE: return renderTree(x, q);
default: default:
throw new Error("Unknown QuestionnaireResponse Renderer Mode"); throw new Error(/*!#*/"Unknown QuestionnaireResponse Renderer Mode");
} }
} }
@ -57,12 +57,12 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
// case DEFNS: return renderDefns(x, q); // case DEFNS: return renderDefns(x, q);
case TREE: return renderTree(x, qr); case TREE: return renderTree(x, qr);
default: default:
throw new Error("Unknown QuestionnaireResponse Renderer Mode"); throw new Error(/*!#*/"Unknown QuestionnaireResponse Renderer Mode");
} }
} }
public boolean renderTree(XhtmlNode x, ResourceWrapper qr) throws UnsupportedEncodingException, IOException { public boolean renderTree(XhtmlNode x, ResourceWrapper qr) throws UnsupportedEncodingException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context, context.getDestDir(), context.isInlineGraphics(), true);
TableModel model = gen.new TableModel("qtree="+qr.getId(), false); TableModel model = gen.new TableModel("qtree="+qr.getId(), false);
model.setAlternating(true); model.setAlternating(true);
if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) { if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) {
@ -71,10 +71,10 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png")); model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png"));
} }
model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table"); model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table");
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "LinkId"), translate("sd.hint", "The linkId for the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"LinkId", /*!#*/"The linkId for the item", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Text"), translate("sd.hint", "Text for the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Text", /*!#*/"Text for the item", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Definition"), translate("sd.hint", "Minimum and Maximum # of times the the itemcan appear in the instance"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Definition", /*!#*/"Minimum and Maximum # of times the the itemcan appear in the instance", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Answer"), translate("sd.hint", "The type of the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Answer", /*!#*/"The type of the item", null, 0));
boolean hasExt = false; boolean hasExt = false;
// first we add a root for the questionaire itself // first we add a root for the questionaire itself
@ -89,7 +89,7 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
} }
public boolean renderTree(XhtmlNode x, QuestionnaireResponse q) throws UnsupportedEncodingException, IOException { public boolean renderTree(XhtmlNode x, QuestionnaireResponse q) throws UnsupportedEncodingException, IOException {
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context.getDestDir(), context.isInlineGraphics(), true); HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context, context.getDestDir(), context.isInlineGraphics(), true);
TableModel model = gen.new TableModel("qtree="+q.getId(), true); TableModel model = gen.new TableModel("qtree="+q.getId(), true);
model.setAlternating(true); model.setAlternating(true);
if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) { if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) {
@ -98,10 +98,10 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png")); model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png"));
} }
model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table"); model.setDocoRef(context.getLink(KnownLinkType.SPEC)+"formats.html#table");
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "LinkId"), translate("sd.hint", "The linkId for the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"LinkId", /*!#*/"The linkId for the item", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Text"), translate("sd.hint", "Text for the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Text", /*!#*/"Text for the item", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Definition"), translate("sd.hint", "Minimum and Maximum # of times the the itemcan appear in the instance"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Definition", /*!#*/"Minimum and Maximum # of times the the itemcan appear in the instance", null, 0));
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Answer"), translate("sd.hint", "The type of the item"), null, 0)); model.getTitles().add(gen.new Title(null, model.getDocoRef(), /*!#*/"Answer", /*!#*/"The type of the item", null, 0));
boolean hasExt = false; boolean hasExt = false;
// first we add a root for the questionaire itself // first we add a root for the questionaire itself
@ -120,10 +120,10 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
Row r = gen.new Row(); Row r = gen.new Row();
rows.add(r); rows.add(r);
r.setIcon("icon_q_root.gif", "QuestionnaireResponseRoot"); r.setIcon("icon_q_root.gif", /*!#*/"QuestionnaireResponseRoot");
r.getCells().add(gen.new Cell(null, null, q.getId(), null, null)); r.getCells().add(gen.new Cell(null, null, q.getId(), null, null));
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
r.getCells().add(gen.new Cell(null, null, "QuestionnaireResponse", null, null)); r.getCells().add(gen.new Cell(null, null, /*!#*/"QuestionnaireResponse", null, null));
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
return r; return r;
} }
@ -136,18 +136,18 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
String ref = b == null ? null : b.primitiveValue(); String ref = b == null ? null : b.primitiveValue();
Questionnaire q = context.getContext().fetchResource(Questionnaire.class, ref); Questionnaire q = context.getContext().fetchResource(Questionnaire.class, ref);
r.setIcon("icon_q_root.gif", "QuestionnaireResponseRoot"); r.setIcon("icon_q_root.gif", /*!#*/"QuestionnaireResponseRoot");
r.getCells().add(gen.new Cell(null, null, qr.getId(), null, null)); r.getCells().add(gen.new Cell(null, null, qr.getId(), null, null));
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
if (ref == null ) { if (ref == null ) {
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
r.getCells().add(gen.new Cell("Questionnaire:", null, "None specified", null, null)); r.getCells().add(gen.new Cell(/*!#*/"Questionnaire:", null, /*!#*/"None specified", null, null));
} else if (q == null || !q.hasWebPath()) { } else if (q == null || !q.hasWebPath()) {
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
r.getCells().add(gen.new Cell("Questionnaire:", null, ref, null, null)); r.getCells().add(gen.new Cell(/*!#*/"Questionnaire:", null, ref, null, null));
} else{ } else{
r.getCells().add(gen.new Cell(null, null, "", null, null)); r.getCells().add(gen.new Cell(null, null, "", null, null));
r.getCells().add(gen.new Cell("Questionnaire:", q.getWebPath(), q.present(), null, null)); r.getCells().add(gen.new Cell(/*!#*/"Questionnaire:", q.getWebPath(), q.present(), null, null));
} }
return r; return r;
} }
@ -168,9 +168,9 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
} }
} }
if (hasItem) { if (hasItem) {
r.setIcon("icon-q-group.png", "Group"); r.setIcon("icon-q-group.png", /*!#*/"Group");
} else { } else {
r.setIcon("icon-q-string.png", "Item"); r.setIcon("icon-q-string.png", /*!#*/"Item");
} }
String linkId = i.has("linkId") ? i.get("linkId").primitiveValue() : "??"; String linkId = i.has("linkId") ? i.get("linkId").primitiveValue() : "??";
String text = i.has("text") ? i.get("text").primitiveValue() : ""; String text = i.has("text") ? i.get("text").primitiveValue() : "";
@ -235,9 +235,9 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
hasItem = a.hasItem(); hasItem = a.hasItem();
} }
if (hasItem) { if (hasItem) {
r.setIcon("icon-q-group.png", "Group"); r.setIcon("icon-q-group.png", /*!#*/"Group");
} else { } else {
r.setIcon("icon-q-string.png", "Item"); r.setIcon("icon-q-string.png", /*!#*/"Item");
} }
r.getCells().add(gen.new Cell(null, context.getDefinitionsTarget() == null ? "" : context.getDefinitionsTarget()+"#item."+i.getLinkId(), i.getLinkId(), null, null)); r.getCells().add(gen.new Cell(null, context.getDefinitionsTarget() == null ? "" : context.getDefinitionsTarget()+"#item."+i.getLinkId(), i.getLinkId(), null, null));
r.getCells().add(gen.new Cell(null, null, i.getText(), null, null)); r.getCells().add(gen.new Cell(null, null, i.getText(), null, null));
@ -327,7 +327,7 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
public boolean renderForm(XhtmlNode x, ResourceWrapper q) throws UnsupportedEncodingException, IOException { public boolean renderForm(XhtmlNode x, ResourceWrapper q) throws UnsupportedEncodingException, IOException {
boolean hasExt = false; boolean hasExt = false;
XhtmlNode d = x.div(); XhtmlNode d = x.div();
d.tx("todo"); d.tx(/*!#*/"todo");
// boolean hasPrefix = false; // boolean hasPrefix = false;
// for (QuestionnaireItemComponent c : q.getItem()) { // for (QuestionnaireItemComponent c : q.getItem()) {
// hasPrefix = hasPrefix || doesItemHavePrefix(c); // hasPrefix = hasPrefix || doesItemHavePrefix(c);
@ -370,7 +370,7 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
// } // }
// p.span(null, "linkId: "+i.getLinkId()).tx(i.getText()); // p.span(null, "linkId: "+i.getLinkId()).tx(i.getText());
// if (i.getRequired()) { // if (i.getRequired()) {
// p.span("color: red", "Mandatory").tx("*"); // p.span("color: red", /*!#*/"Mandatory").tx("*");
// } // }
// //
// XhtmlNode input = null; // XhtmlNode input = null;
@ -605,16 +605,16 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
// } // }
// //
private boolean renderLinks(XhtmlNode x, QuestionnaireResponse q) { private boolean renderLinks(XhtmlNode x, QuestionnaireResponse q) {
x.para().tx("Try this QuestionnaireResponse out:"); x.para().tx(/*!#*/"Try this QuestionnaireResponse out:");
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
ul.li().ah("http://todo.nlm.gov/path?mode=ig&src="+Utilities.pathURL(context.getLink(KnownLinkType.SELF), "package.tgz")+"&q="+q.getId()+".json").tx("NLM Forms Library"); ul.li().ah("http://todo.nlm.gov/path?mode=ig&src="+Utilities.pathURL(context.getLink(KnownLinkType.SELF), "package.tgz")+"&q="+q.getId()+".json").tx(/*!#*/"NLM Forms Library");
return false; return false;
} }
private boolean renderLinks(XhtmlNode x, ResourceWrapper q) { private boolean renderLinks(XhtmlNode x, ResourceWrapper q) {
x.para().tx("Try this QuestionnaireResponse out:"); x.para().tx(/*!#*/"Try this QuestionnaireResponse out:");
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
ul.li().ah("http://todo.nlm.gov/path?mode=ig&src="+Utilities.pathURL(context.getLink(KnownLinkType.SELF), "package.tgz")+"&q="+q.getId()+".json").tx("NLM Forms Library"); ul.li().ah("http://todo.nlm.gov/path?mode=ig&src="+Utilities.pathURL(context.getLink(KnownLinkType.SELF), "package.tgz")+"&q="+q.getId()+".json").tx(/*!#*/"NLM Forms Library");
return false; return false;
} }
@ -711,13 +711,13 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
// } // }
// if (qi.hasAnswerOption()) { // if (qi.hasAnswerOption()) {
// XhtmlNode tr = tbl.tr(); // XhtmlNode tr = tbl.tr();
// tr.td().tx("Allowed Answers"); // tr.td().tx(/*!#*/"Allowed Answers");
// XhtmlNode ul = tr.td().ul(); // XhtmlNode ul = tr.td().ul();
// for (QuestionnaireItemAnswerOptionComponent ans : qi.getAnswerOption()) { // for (QuestionnaireItemAnswerOptionComponent ans : qi.getAnswerOption()) {
// XhtmlNode li = ul.li(); // XhtmlNode li = ul.li();
// render(li, ans.getValue()); // render(li, ans.getValue());
// if (ans.getInitialSelected()) { // if (ans.getInitialSelected()) {
// li.tx(" (initially selected)"); // li.tx(/*!#*/" (initially selected)");
// } // }
// } // }
// } // }
@ -738,7 +738,7 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
// // appearance // // appearance
// if (qi.hasExtension(" http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-displayCategory")) { // if (qi.hasExtension(" http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-displayCategory")) {
// XhtmlNode tr = tbl.tr(); // XhtmlNode tr = tbl.tr();
// tr.td().ah("http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-displayCategory").tx("Display Category"); // tr.td().ah("http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-displayCategory").tx(/*!#*/"Display Category");
// render(tr.td(), qi.getExtensionByUrl("http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-displayCategory").getValue()); // render(tr.td(), qi.getExtensionByUrl("http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-displayCategory").getValue());
// } // }
// if (ToolingExtensions.readBoolExtension(qi, "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-hidden")) { // if (ToolingExtensions.readBoolExtension(qi, "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse-hidden")) {
@ -763,14 +763,14 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
// } // }
// if (qi.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-QuestionnaireResponse-observationLinkPeriod")) { // if (qi.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-QuestionnaireResponse-observationLinkPeriod")) {
// XhtmlNode tr = tbl.tr(); // XhtmlNode tr = tbl.tr();
// tr.td().ah(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-QuestionnaireResponse-observationLinkPeriod").tx("Observation Link Period"); // tr.td().ah(getSDCLink("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-QuestionnaireResponse-observationLinkPeriod").tx(/*!#*/"Observation Link Period");
// render(tr.td(), qi.getExtensionByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-QuestionnaireResponse-observationLinkPeriod").getValue()); // render(tr.td(), qi.getExtensionByUrl("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-QuestionnaireResponse-observationLinkPeriod").getValue());
// } // }
// //
// // dynamic management // // dynamic management
// if (qi.hasEnableWhen()) { // if (qi.hasEnableWhen()) {
// XhtmlNode tr = tbl.tr(); // XhtmlNode tr = tbl.tr();
// tr.td().tx("Enable When"); // tr.td().tx(/*!#*/"Enable When");
// td = tr.td(); // td = tr.td();
// if (qi.getEnableWhen().size() == 1) { // if (qi.getEnableWhen().size() == 1) {
// renderEnableWhen(td, qi.getEnableWhen().get(0)); // renderEnableWhen(td, qi.getEnableWhen().get(0));
@ -876,12 +876,12 @@ public class QuestionnaireResponseRenderer extends ResourceRenderer {
@Override @Override
public String display(Resource r) throws UnsupportedEncodingException, IOException { public String display(Resource r) throws UnsupportedEncodingException, IOException {
return "todo"; return /*!#*/"todo";
} }
@Override @Override
public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException { public String display(ResourceWrapper r) throws UnsupportedEncodingException, IOException {
return "Not done yet"; return /*!#*/"Not done yet";
} }
} }

View File

@ -1,13 +1,15 @@
package org.hl7.fhir.r5.renderers; package org.hl7.fhir.r5.renderers;
import java.util.Date;
import org.hl7.fhir.r5.comparison.VersionComparisonAnnotation; import org.hl7.fhir.r5.comparison.VersionComparisonAnnotation;
import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.Base; import org.hl7.fhir.r5.model.Base;
import org.hl7.fhir.r5.model.Enumeration;
import org.hl7.fhir.r5.renderers.utils.RenderingContext; import org.hl7.fhir.r5.renderers.utils.RenderingContext;
import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules; import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules;
import org.hl7.fhir.r5.renderers.utils.RenderingContext.KnownLinkType; import org.hl7.fhir.r5.renderers.utils.RenderingContext.KnownLinkType;
import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode; import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode;
import org.hl7.fhir.r5.utils.TranslatingUtilities;
import org.hl7.fhir.utilities.MarkDownProcessor; import org.hl7.fhir.utilities.MarkDownProcessor;
import org.hl7.fhir.utilities.StandardsStatus; import org.hl7.fhir.utilities.StandardsStatus;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
@ -33,7 +35,7 @@ import org.hl7.fhir.utilities.xhtml.XhtmlNode;
* @author graha * @author graha
* *
*/ */
public class Renderer extends TranslatingUtilities { public class Renderer {
protected RenderingContext context; protected RenderingContext context;
@ -46,42 +48,14 @@ public class Renderer extends TranslatingUtilities {
} }
protected static final String RENDER_BUNDLE_HEADER_ROOT = "RENDER_BUNDLE_HEADER_ROOT";
protected static final String RENDER_BUNDLE_HEADER_ENTRY = "RENDER_BUNDLE_HEADER_ENTRY";
protected static final String RENDER_BUNDLE_HEADER_ENTRY_URL = "RENDER_BUNDLE_HEADER_ENTRY_URL";
protected static final String RENDER_BUNDLE_RESOURCE = "RENDER_BUNDLE_RESOURCE";
protected static final String RENDER_BUNDLE_SEARCH = "RENDER_BUNDLE_SEARCH";
protected static final String RENDER_BUNDLE_SEARCH_MODE = "RENDER_BUNDLE_SEARCH_MODE";
protected static final String RENDER_BUNDLE_SEARCH_SCORE = "RENDER_BUNDLE_SEARCH_SCORE";
protected static final String RENDER_BUNDLE_RESPONSE = "RENDER_BUNDLE_RESPONSE";
protected static final String RENDER_BUNDLE_LOCATION = "RENDER_BUNDLE_LOCATION";
protected static final String RENDER_BUNDLE_ETAG = "RENDER_BUNDLE_ETAG";
protected static final String RENDER_BUNDLE_LAST_MOD = "RENDER_BUNDLE_LAST_MOD";
protected static final String RENDER_BUNDLE_REQUEST = "RENDER_BUNDLE_REQUEST";
protected static final String RENDER_BUNDLE_IF_NON_MATCH = "RENDER_BUNDLE_IF_NON_MATCH";
protected static final String RENDER_BUNDLE_IF_MOD = "RENDER_BUNDLE_IF_MOD";
protected static final String RENDER_BUNDLE_IF_MATCH = "RENDER_BUNDLE_IF_MATCH";
protected static final String RENDER_BUNDLE_IF_NONE = "RENDER_BUNDLE_IF_NONE";
protected static final String RENDER_BUNDLE_DOCUMENT_CONTENT = "RENDER_BUNDLE_DOCUMENT_CONTENT";
protected static final String RENDER_BUNDLE_HEADER_DOC_ENTRY_URD = "RENDER_BUNDLE_HEADER_DOC_ENTRY_URD";
protected static final String RENDER_BUNDLE_HEADER_DOC_ENTRY_U = "RENDER_BUNDLE_HEADER_DOC_ENTRY_U";
protected static final String RENDER_BUNDLE_HEADER_DOC_ENTRY_RD = "RENDER_BUNDLE_HEADER_DOC_ENTRY_RD";
/** the plan here is to make this have it's own implementation of messages, rather than using the
* validator messages, for better alignment with publisher I18n strategy
*
* @param theMessage
* @param theMessageArguments
* @return
*/
protected String formatMessage(String theMessage, Object... theMessageArguments) { protected String formatMessage(String theMessage, Object... theMessageArguments) {
return context.getWorker().formatMessage(theMessage, theMessageArguments); return context.formatMessage(theMessage, theMessageArguments);
} }
public void genStandardsStatus(XhtmlNode td, StandardsStatus ss) { public void genStandardsStatus(XhtmlNode td, StandardsStatus ss) {
if (ss != null) { if (ss != null) {
td.tx(" "); td.tx(" ");
XhtmlNode a = td.ah(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "versions.html#std-process"), "Standards Status = "+ss.toDisplay()); XhtmlNode a = td.ah(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "versions.html#std-process"), /*!#*/"Standards Status = "+ss.toDisplay());
a.style("padding-left: 3px; padding-right: 3px; border: 1px grey solid; font-weight: bold; color: black; background-color: "+ss.getColor()); a.style("padding-left: 3px; padding-right: 3px; border: 1px grey solid; font-weight: bold; color: black; background-color: "+ss.getColor());
a.tx(ss.getAbbrev()); a.tx(ss.getAbbrev());
} }
@ -98,21 +72,21 @@ public class Renderer extends TranslatingUtilities {
switch (vca.getType()) { switch (vca.getType()) {
case Added: case Added:
XhtmlNode spanOuter = x.span("border: solid 1px #dddddd; margin: 2px; padding: 2px", null); XhtmlNode spanOuter = x.span("border: solid 1px #dddddd; margin: 2px; padding: 2px", null);
XhtmlNode spanInner = spanOuter.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been added since "+context.getChangeVersion()); XhtmlNode spanInner = spanOuter.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been added since "+context.getChangeVersion());
spanInner.img("icon-change-add.png", "icon"); spanInner.img("icon-change-add.png", "icon");
spanInner.tx(" Added:"); spanInner.tx(" "+/*!#*/"Added:");
return spanOuter; return spanOuter;
case Changed: case Changed:
spanOuter = x.span("border: solid 1px #dddddd; margin: 2px; padding: 2px", null); spanOuter = x.span("border: solid 1px #dddddd; margin: 2px; padding: 2px", null);
spanInner = spanOuter.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been changed since "+context.getChangeVersion()+(vca.getOriginal() != null ? " (was '"+vca.getOriginal()+"')" : "")); spanInner = spanOuter.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been changed since "+context.getChangeVersion()+(vca.getOriginal() != null ? " (was '"+vca.getOriginal()+"')" : ""));
spanInner.img("icon-change-edit.png", "icon"); spanInner.img("icon-change-edit.png", "icon");
spanInner.tx(" Changed:"); spanInner.tx(" "+/*!#*/"Changed:");
return spanOuter; return spanOuter;
case Deleted: case Deleted:
spanOuter = x.span("border: solid 1px #dddddd; margin: 2px; padding: 2px", null); spanOuter = x.span("border: solid 1px #dddddd; margin: 2px; padding: 2px", null);
spanInner = spanOuter.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been removed since "+context.getChangeVersion()); spanInner = spanOuter.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been removed since "+context.getChangeVersion());
spanInner.img("icon-change-remove.png", "icon"); spanInner.img("icon-change-remove.png", "icon");
spanInner.tx(" Removed:"); spanInner.tx(" "+/*!#*/"Removed:");
return spanOuter.strikethrough(); return spanOuter.strikethrough();
default: default:
return x; return x;
@ -130,21 +104,21 @@ public class Renderer extends TranslatingUtilities {
switch (vca.getType()) { switch (vca.getType()) {
case Added: case Added:
XhtmlNode divOuter = x.div("border: solid 1px #dddddd; margin: 2px; padding: 2px"); XhtmlNode divOuter = x.div("border: solid 1px #dddddd; margin: 2px; padding: 2px");
XhtmlNode spanInner = divOuter.para().style("margin: 0").span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been added since "+context.getChangeVersion()); XhtmlNode spanInner = divOuter.para().style("margin: 0").span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been added since "+context.getChangeVersion());
spanInner.img("icon-change-add.png", "icon"); spanInner.img("icon-change-add.png", "icon");
spanInner.tx(" Added:"); spanInner.tx(" "+/*!#*/"Added:");
return divOuter; return divOuter;
case Changed: case Changed:
divOuter = x.div("border: solid 1px #dddddd; margin: 2px; padding: 2px"); divOuter = x.div("border: solid 1px #dddddd; margin: 2px; padding: 2px");
spanInner = divOuter.para().style("margin: 0").span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been changed since "+context.getChangeVersion()+(vca.getOriginal() != null ? " (was '"+(vca.getOriginal())+"')" : "")); spanInner = divOuter.para().style("margin: 0").span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been changed since "+context.getChangeVersion()+(vca.getOriginal() != null ? " (was '"+(vca.getOriginal())+"')" : ""));
spanInner.img("icon-change-edit.png", "icon"); spanInner.img("icon-change-edit.png", "icon");
spanInner.tx(" Changed:"); spanInner.tx(" "+/*!#*/"Changed:");
return divOuter; return divOuter;
case Deleted: case Deleted:
divOuter = x.div("border: solid 1px #dddddd; margin: 2px; padding: 2px"); divOuter = x.div("border: solid 1px #dddddd; margin: 2px; padding: 2px");
spanInner = divOuter.para().style("margin: 0").span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been removed since "+context.getChangeVersion()); spanInner = divOuter.para().style("margin: 0").span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been removed since "+context.getChangeVersion());
spanInner.img("icon-change-remove.png", "icon"); spanInner.img("icon-change-remove.png", "icon");
spanInner.tx(" Removed:"); spanInner.tx(" "+/*!#*/"Removed:");
return divOuter.strikethrough(); return divOuter.strikethrough();
default: default:
return x; return x;
@ -166,27 +140,27 @@ public class Renderer extends TranslatingUtilities {
tr.style("border: solid 1px #dddddd; margin: 2px; padding: 2px"); tr.style("border: solid 1px #dddddd; margin: 2px; padding: 2px");
} }
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
XhtmlNode span = td.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This row of content has been added since "+context.getChangeVersion()); XhtmlNode span = td.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px",/*!#*/"This row of content has been added since "+context.getChangeVersion());
span.img("icon-change-add.png", "icon"); span.img("icon-change-add.png", "icon");
span.tx(" Added:"); span.tx(" "+/*!#*/"Added:");
XhtmlNode x = new XhtmlNode(NodeType.Element, "holder"); XhtmlNode x = new XhtmlNode(NodeType.Element, "holder");
x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This row of content has been added since "+context.getChangeVersion()).tx(" "); x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This row of content has been added since "+context.getChangeVersion()).tx(" ");
tr.styleCells(x); tr.styleCells(x);
return td; return td;
case Changed: case Changed:
td = tr.td(); td = tr.td();
span = td.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This row of content has been changed since"+context.getChangeVersion()+(vca.getOriginal() != null ? " (was '"+vca.getOriginal()+"')" : "")); span = td.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This row of content has been changed since"+context.getChangeVersion()+(vca.getOriginal() != null ? " (was '"+vca.getOriginal()+"')" : ""));
span.img("icon-change-edit.png", "icon"); span.img("icon-change-edit.png", "icon");
span.tx(" Changed:"); span.tx(" "+/*!#*/"Changed:");
return td; return td;
case Deleted: case Deleted:
tr.style("text-decoration: line-through"); tr.style("text-decoration: line-through");
td = tr.td(); td = tr.td();
span = td.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been removed since "+context.getChangeVersion()); span = td.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been removed since "+context.getChangeVersion());
span.img("icon-change-remove.png", "icon"); span.img("icon-change-remove.png", "icon");
span.tx(" Removed:"); span.tx(" "+/*!#*/"Removed:");
x = new XhtmlNode(NodeType.Element, "holder"); x = new XhtmlNode(NodeType.Element, "holder");
x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px; text-decoration: none", "This row of content has been added since "+context.getChangeVersion()).tx(" "); x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px; text-decoration: none", /*!#*/"This row of content has been added since "+context.getChangeVersion()).tx(" ");
tr.styleCells(x); tr.styleCells(x);
return td; return td;
default: default:
@ -199,24 +173,24 @@ public class Renderer extends TranslatingUtilities {
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(VersionComparisonAnnotation.USER_DATA_NAME); VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(VersionComparisonAnnotation.USER_DATA_NAME);
switch (self.getType()) { switch (self.getType()) {
case Added: case Added:
XhtmlNode spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been added since "+version); XhtmlNode spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been added since "+version);
spanInner.img("icon-change-add.png", "icon"); spanInner.img("icon-change-add.png", "icon");
spanInner.tx(" Added"); spanInner.tx(" "+/*!#*/"Added");
return; return;
case Changed: case Changed:
if (self.getComp().noChangeOtherThanMetadata(metadataFields)) { if (self.getComp().noChangeOtherThanMetadata(metadataFields)) {
x.span("color: #eeeeee").tx("n/c"); x.span("color: #eeeeee").tx("n/c");
return; return;
} else { } else {
spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been changed since "+version+(self.getOriginal() != null ? " (was '"+(self.getOriginal())+"')" : "")); spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been changed since "+version+(self.getOriginal() != null ? " (was '"+(self.getOriginal())+"')" : ""));
spanInner.img("icon-change-edit.png", "icon"); spanInner.img("icon-change-edit.png", "icon");
spanInner.tx(" Changed"); spanInner.tx(" "+/*!#*/"Changed");
} }
return; return;
case Deleted: case Deleted:
spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", "This content has been added since "+version); spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", /*!#*/"This content has been added since "+version);
spanInner.img("icon-change-remove.png", "icon"); spanInner.img("icon-change-remove.png", "icon");
spanInner.tx(" Removed"); spanInner.tx(" "+/*!#*/"Removed");
return; return;
default: default:
x.span("color: #eeeeee").tx("n/c"); x.span("color: #eeeeee").tx("n/c");
@ -227,4 +201,20 @@ public class Renderer extends TranslatingUtilities {
} }
} }
public String egt(@SuppressWarnings("rawtypes") Enumeration<? extends Enum> value) {
if (value == null || !value.hasPrimitiveValue()) {
return null;
} else {
return (value == null || !value.hasPrimitiveValue()) ? null : value.asStringValue();
}
}
public String toStr(int value) {
return Integer.toString(value);
}
public String toStr(Date value) {
return value.toString();
}
} }

View File

@ -43,14 +43,14 @@ public class RequirementsRenderer extends ResourceRenderer {
if (req.getActor().size() == 1) { if (req.getActor().size() == 1) {
ActorDefinition acd = context.getWorker().fetchResource(ActorDefinition.class, req.getActor().get(0).getValue(), req); ActorDefinition acd = context.getWorker().fetchResource(ActorDefinition.class, req.getActor().get(0).getValue(), req);
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("These requirements apply to the actor "); p.tx(/*!#*/"These requirements apply to the actor ");
if (acd == null) { if (acd == null) {
p.code(req.getActor().get(0).getValue()); p.code(req.getActor().get(0).getValue());
} else { } else {
p.ah(acd.getWebPath()).tx(acd.present()); p.ah(acd.getWebPath()).tx(acd.present());
} }
} else { } else {
x.para().tx("These requirements apply to the following actors:"); x.para().tx(/*!#*/"These requirements apply to the following actors:");
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
for (CanonicalType a : req.getActor()) { for (CanonicalType a : req.getActor()) {
ActorDefinition acd = context.getWorker().fetchResource(ActorDefinition.class, a.getValue(), req); ActorDefinition acd = context.getWorker().fetchResource(ActorDefinition.class, a.getValue(), req);
@ -66,14 +66,14 @@ public class RequirementsRenderer extends ResourceRenderer {
if (req.getDerivedFrom().size() == 1) { if (req.getDerivedFrom().size() == 1) {
Requirements reqd = context.getWorker().fetchResource(Requirements.class, req.getDerivedFrom().get(0).getValue(), req); Requirements reqd = context.getWorker().fetchResource(Requirements.class, req.getDerivedFrom().get(0).getValue(), req);
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("These requirements derive from "); p.tx(/*!#*/"These requirements derive from ");
if (reqd == null) { if (reqd == null) {
p.code(req.getDerivedFrom().get(0).getValue()); p.code(req.getDerivedFrom().get(0).getValue());
} else { } else {
p.ah(reqd.getWebPath()).tx(reqd.present()); p.ah(reqd.getWebPath()).tx(reqd.present());
} }
} else { } else {
x.para().tx("These requirements are derived from the following requirements:"); x.para().tx(/*!#*/"These requirements are derived from the following requirements:");
XhtmlNode ul = x.ul(); XhtmlNode ul = x.ul();
for (CanonicalType a : req.getDerivedFrom()) { for (CanonicalType a : req.getDerivedFrom()) {
Requirements reqd = context.getWorker().fetchResource(Requirements.class, a.getValue(), req); Requirements reqd = context.getWorker().fetchResource(Requirements.class, a.getValue(), req);
@ -87,7 +87,7 @@ public class RequirementsRenderer extends ResourceRenderer {
} }
if (req.hasReference()) { if (req.hasReference()) {
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("References: "); p.tx(/*!#*/"References: ");
int i = 0; int i = 0;
for (UrlType c : req.getReference()) { for (UrlType c : req.getReference()) {
i++; i++;
@ -121,11 +121,11 @@ public class RequirementsRenderer extends ResourceRenderer {
td = tr.td(); td = tr.td();
addMarkdown(td, stmt.getRequirement()); addMarkdown(td, stmt.getRequirement());
if (stmt.hasDerivedFrom() || stmt.hasSatisfiedBy() || stmt.hasReference() || stmt.hasSource()) { if (stmt.hasDerivedFrom() || stmt.hasSatisfiedBy() || stmt.hasReference() || stmt.hasSource()) {
td.para().tx("Links:"); td.para().tx(/*!#*/"Links:");
XhtmlNode ul = td.ul(); XhtmlNode ul = td.ul();
if (stmt.hasDerivedFrom()) { if (stmt.hasDerivedFrom()) {
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
li.tx("Derived From: "); li.tx(/*!#*/"Derived From: ");
String url = stmt.getDerivedFrom(); String url = stmt.getDerivedFrom();
String key = url.contains("#") ? url.substring(url.indexOf("#")+1) : ""; String key = url.contains("#") ? url.substring(url.indexOf("#")+1) : "";
if (url.contains("#")) { url = url.substring(0, url.indexOf("#")); }; if (url.contains("#")) { url = url.substring(0, url.indexOf("#")); };
@ -143,7 +143,7 @@ public class RequirementsRenderer extends ResourceRenderer {
} }
if (stmt.hasSatisfiedBy()) { if (stmt.hasSatisfiedBy()) {
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
li.tx("Satisfied By: "); li.tx(/*!#*/"Satisfied By: ");
first = true; first = true;
for (UrlType c : stmt.getSatisfiedBy()) { for (UrlType c : stmt.getSatisfiedBy()) {
if (first) first = false; else li.tx(", "); if (first) first = false; else li.tx(", ");
@ -162,7 +162,7 @@ public class RequirementsRenderer extends ResourceRenderer {
} }
if (stmt.hasReference()) { if (stmt.hasReference()) {
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
li.tx("References: "); li.tx(/*!#*/"References: ");
int i = 0; int i = 0;
for (UrlType c : stmt.getReference()) { for (UrlType c : stmt.getReference()) {
i++; i++;
@ -176,7 +176,7 @@ public class RequirementsRenderer extends ResourceRenderer {
} }
if (stmt.hasSource()) { if (stmt.hasSource()) {
XhtmlNode li = ul.li(); XhtmlNode li = ul.li();
li.tx("Source: "); li.tx(/*!#*/"Source: ");
first = true; first = true;
for (Reference c : stmt.getSource()) { for (Reference c : stmt.getSource()) {
if (first) first = false; else li.tx(", "); if (first) first = false; else li.tx(", ");

View File

@ -92,6 +92,12 @@ public abstract class ResourceRenderer extends DataRenderer {
XhtmlNode x = new XhtmlNode(NodeType.Element, "div"); XhtmlNode x = new XhtmlNode(NodeType.Element, "div");
boolean hasExtensions; boolean hasExtensions;
hasExtensions = render(x, r); hasExtensions = render(x, r);
String an = r.fhirType()+"_"+r.getId();
if (context.isAddName()) {
if (!hasAnchorName(x, an)) {
injectAnchorName(x, an);
}
}
inject(r, x, hasExtensions ? NarrativeStatus.EXTENSIONS : NarrativeStatus.GENERATED); inject(r, x, hasExtensions ? NarrativeStatus.EXTENSIONS : NarrativeStatus.GENERATED);
} }
@ -99,12 +105,53 @@ public abstract class ResourceRenderer extends DataRenderer {
assert r.getContext() == context; assert r.getContext() == context;
XhtmlNode x = new XhtmlNode(NodeType.Element, "div"); XhtmlNode x = new XhtmlNode(NodeType.Element, "div");
boolean hasExtensions = render(x, r); boolean hasExtensions = render(x, r);
String an = r.fhirType()+"_"+r.getId();
if (context.isAddName()) {
if (!hasAnchorName(x, an)) {
injectAnchorName(x, an);
}
}
if (r.hasNarrative()) { if (r.hasNarrative()) {
r.injectNarrative(x, hasExtensions ? NarrativeStatus.EXTENSIONS : NarrativeStatus.GENERATED); r.injectNarrative(x, hasExtensions ? NarrativeStatus.EXTENSIONS : NarrativeStatus.GENERATED);
} }
return x; return x;
} }
public XhtmlNode checkNarrative(ResourceWrapper r) throws IOException, FHIRException, EOperationOutcome {
assert r.getContext() == context;
XhtmlNode x = r.getNarrative();
String an = r.fhirType()+"_"+r.getId();
if (context.isAddName()) {
if (!hasAnchorName(x, an)) {
injectAnchorName(x, an);
}
}
return x;
}
private void injectAnchorName(XhtmlNode x, String an) {
XhtmlNode ip = x;
while (ip.hasChildren() && "div".equals(ip.getChildNodes().get(0).getName())) {
ip = ip.getChildNodes().get(0);
}
ip.addTag(0, "a").setAttribute("name", an).tx(" ");
}
protected boolean hasAnchorName(XhtmlNode x, String an) {
if ("a".equals(x.getName()) && an.equals(x.getAttribute("name"))) {
return true;
}
if (x.hasChildren()) {
for (XhtmlNode c : x.getChildNodes()) {
if (hasAnchorName(c, an)) {
return true;
}
}
}
return false;
}
public abstract boolean render(XhtmlNode x, Resource r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome; public abstract boolean render(XhtmlNode x, Resource r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome;
public boolean render(XhtmlNode x, ResourceWrapper r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome { public boolean render(XhtmlNode x, ResourceWrapper r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
@ -163,11 +210,11 @@ public abstract class ResourceRenderer extends DataRenderer {
CanonicalResource cr = (CanonicalResource) target; CanonicalResource cr = (CanonicalResource) target;
if (url.contains("|")) { if (url.contains("|")) {
if (target.hasWebPath()) { if (target.hasWebPath()) {
x.ah(target.getWebPath()).tx(cr.present()+" (version "+cr.getVersion()+")"); x.ah(target.getWebPath()).tx(cr.present()+/*!#*/" (version "+cr.getVersion()+")");
} else { } else {
url = url.substring(0, url.indexOf("|")); url = url.substring(0, url.indexOf("|"));
x.code().tx(url); x.code().tx(url);
x.tx(": "+cr.present()+" (version "+cr.getVersion()+")"); x.tx(": "+cr.present()+/*!#*/" (version "+cr.getVersion()+")");
} }
} else { } else {
if (target.hasWebPath()) { if (target.hasWebPath()) {
@ -235,14 +282,14 @@ public abstract class ResourceRenderer extends DataRenderer {
if (tr != null && tr.getReference() != null) { if (tr != null && tr.getReference() != null) {
link = tr.getReference(); link = tr.getReference();
} else if (r.getReference().contains("?")) { } else if (r.getReference().contains("?")) {
text.append("Conditional Reference: "); text.append(/*!#*/"Conditional Reference: ");
} else { } else {
link = r.getReference(); link = r.getReference();
} }
} }
} }
if (tr != null && tr.getReference() != null && tr.getReference().startsWith("#")) { if (tr != null && tr.getReference() != null && tr.getReference().startsWith("#")) {
text.append("See above ("); text.append(/*!#*/"See above (");
} }
// what to display: if text is provided, then that. if the reference was resolved, then show the name, or the generated narrative // what to display: if text is provided, then that. if the reference was resolved, then show the name, or the generated narrative
String display = r.hasDisplayElement() ? r.getDisplay() : null; String display = r.hasDisplayElement() ? r.getDisplay() : null;
@ -286,7 +333,7 @@ public abstract class ResourceRenderer extends DataRenderer {
} else if (name != null) { } else if (name != null) {
text.append(name); text.append(name);
} else { } else {
text.append(". Description: (todo)"); text.append(/*!#*/". Description: (todo)");
} }
} }
if (tr != null && tr.getReference() != null && tr.getReference().startsWith("#")) { if (tr != null && tr.getReference() != null && tr.getReference().startsWith("#")) {
@ -309,19 +356,21 @@ public abstract class ResourceRenderer extends DataRenderer {
if (tr != null && tr.getReference() != null) { if (tr != null && tr.getReference() != null) {
c = x.ah(tr.getReference()); c = x.ah(tr.getReference());
} else if (r.getReference().contains("?")) { } else if (r.getReference().contains("?")) {
x.tx("Conditional Reference: "); x.tx(/*!#*/"Conditional Reference: ");
c = x.code(""); c = x.code("");
} else { } else {
c = x.ah(r.getReference()); c = x.ah(r.getReference());
} }
} else if ("#".equals(r.getReference())) {
c = x.ah("#");
} else { } else {
c = x.ah(r.getReference()); c = x.ah("#hc"+r.getReference().substring(1));
} }
} else { } else {
c = x.span(null, null); c = x.span(null, null);
} }
if (tr != null && tr.getReference() != null && tr.getReference().startsWith("#")) { if (tr != null && tr.getReference() != null && tr.getReference().startsWith("#")) {
c.tx("See above ("); c.tx(/*!#*/"See above (");
} }
// what to display: if text is provided, then that. if the reference was resolved, then show the name, or the generated narrative // what to display: if text is provided, then that. if the reference was resolved, then show the name, or the generated narrative
String display = r.hasDisplayElement() ? r.getDisplay() : null; String display = r.hasDisplayElement() ? r.getDisplay() : null;
@ -365,7 +414,7 @@ public abstract class ResourceRenderer extends DataRenderer {
} else if (name != null) { } else if (name != null) {
c.addText(name); c.addText(name);
} else { } else {
c.tx(". Generated Summary: "); c.tx(/*!#*/". Generated Summary: ");
if (tr != null) { if (tr != null) {
new ProfileDrivenRenderer(context).generateResourceSummary(c, tr.getResource(), true, r.getReference().startsWith("#"), true); new ProfileDrivenRenderer(context).generateResourceSummary(c, tr.getResource(), true, r.getReference().startsWith("#"), true);
} }
@ -397,7 +446,7 @@ public abstract class ResourceRenderer extends DataRenderer {
if (r.has("display")) { if (r.has("display")) {
c.addText(r.get("display").primitiveValue()); c.addText(r.get("display").primitiveValue());
if (tr != null && tr.getResource() != null) { if (tr != null && tr.getResource() != null) {
c.tx(". Generated Summary: "); c.tx(/*!#*/". Generated Summary: ");
new ProfileDrivenRenderer(context).generateResourceSummary(c, tr.getResource(), true, v.startsWith("#"), false); new ProfileDrivenRenderer(context).generateResourceSummary(c, tr.getResource(), true, v.startsWith("#"), false);
} }
} else if (tr != null && tr.getResource() != null) { } else if (tr != null && tr.getResource() != null) {
@ -438,7 +487,11 @@ public abstract class ResourceRenderer extends DataRenderer {
String bundleUrl = null; String bundleUrl = null;
Element br = bundleElement.getNamedChild("resource", false); Element br = bundleElement.getNamedChild("resource", false);
if (br.getChildValue("id") != null) { if (br.getChildValue("id") != null) {
bundleUrl = "#" + br.fhirType() + "_" + br.getChildValue("id"); if ("Bundle".equals(br.fhirType())) {
bundleUrl = "#";
} else {
bundleUrl = "#" + br.fhirType() + "_" + br.getChildValue("id");
}
} else { } else {
bundleUrl = "#" +fullUrlToAnchor(bundleElement.getChildValue("fullUrl")); bundleUrl = "#" +fullUrlToAnchor(bundleElement.getChildValue("fullUrl"));
} }
@ -472,12 +525,12 @@ public abstract class ResourceRenderer extends DataRenderer {
protected void generateCopyright(XhtmlNode x, CanonicalResource cs) { protected void generateCopyright(XhtmlNode x, CanonicalResource cs) {
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.b().tx(getContext().getWorker().translator().translate("xhtml-gen-cs", "Copyright Statement:", context.getLang())); p.b().tx(getContext().formatMessage(RenderingContext.RENDER_RESOURCE_COPYRIGHT));
smartAddText(p, " " + cs.getCopyright()); smartAddText(p, " " + cs.getCopyright());
} }
public String displayReference(Resource res, Reference r) throws UnsupportedEncodingException, IOException { public String displayReference(Resource res, Reference r) throws UnsupportedEncodingException, IOException {
return "todo"; return /*!#*/"todo";
} }
@ -522,10 +575,10 @@ public abstract class ResourceRenderer extends DataRenderer {
protected String describeStatus(PublicationStatus status, boolean experimental) { protected String describeStatus(PublicationStatus status, boolean experimental) {
switch (status) { switch (status) {
case ACTIVE: return experimental ? "Experimental" : "Active"; case ACTIVE: return experimental ? /*!#*/"Experimental" : /*!#*/"Active";
case DRAFT: return "draft"; case DRAFT: return /*!#*/"draft";
case RETIRED: return "retired"; case RETIRED: return /*!#*/"retired";
default: return "Unknown"; default: return /*!#*/"Unknown";
} }
} }
@ -559,7 +612,7 @@ public abstract class ResourceRenderer extends DataRenderer {
String id = getPrimitiveValue(r, "id"); String id = getPrimitiveValue(r, "id");
if (doId) { if (doId) {
div.an(id); div.an("hc"+id);
} }
String lang = getPrimitiveValue(r, "language"); String lang = getPrimitiveValue(r, "language");
@ -571,35 +624,35 @@ public abstract class ResourceRenderer extends DataRenderer {
if (id != null || lang != null || versionId != null || lastUpdated != null) { if (id != null || lang != null || versionId != null || lastUpdated != null) {
XhtmlNode p = plateStyle(div.para()); XhtmlNode p = plateStyle(div.para());
p.tx("Resource "); p.tx(/*!#*/"Resource ");
p.tx(r.fhirType()); p.tx(r.fhirType());
p.tx(" "); p.tx(" ");
if (id != null) { if (id != null) {
p.tx("\""+id+"\" "); p.tx("\""+id+"\" ");
} }
if (versionId != null) { if (versionId != null) {
p.tx("Version \""+versionId+"\" "); p.tx(/*!#*/"Version \""+versionId+"\" ");
} }
if (lastUpdated != null) { if (lastUpdated != null) {
p.tx("Updated \""); p.tx(/*!#*/"Updated \"");
renderDateTime(p, lastUpdated); renderDateTime(p, lastUpdated);
p.tx("\" "); p.tx("\" ");
} }
if (lang != null) { if (lang != null) {
p.tx(" (Language \""+lang+"\") "); p.tx(/*!#*/" (Language \""+lang+"\") ");
} }
} }
if (ir != null) { if (ir != null) {
plateStyle(div.para()).b().tx("Special rules apply: "+ir+"!"); plateStyle(div.para()).b().tx(/*!#*/"Special rules apply: "+ir+"!");
} }
if (source != null) { if (source != null) {
plateStyle(div.para()).tx("Information Source: "+source+"!"); plateStyle(div.para()).tx(/*!#*/"Information Source: "+source+"!");
} }
if (meta != null) { if (meta != null) {
PropertyWrapper pl = meta.getChildByName("profile"); PropertyWrapper pl = meta.getChildByName("profile");
if (pl.hasValues()) { if (pl.hasValues()) {
XhtmlNode p = plateStyle(div.para()); XhtmlNode p = plateStyle(div.para());
p.tx(Utilities.pluralize("Profile", pl.getValues().size())+": "); p.tx(Utilities.pluralize(/*!#*/"Profile", pl.getValues().size())+": ");
boolean first = true; boolean first = true;
for (BaseWrapper bw : pl.getValues()) { for (BaseWrapper bw : pl.getValues()) {
if (first) first = false; else p.tx(", "); if (first) first = false; else p.tx(", ");
@ -609,7 +662,7 @@ public abstract class ResourceRenderer extends DataRenderer {
PropertyWrapper tl = meta.getChildByName("tag"); PropertyWrapper tl = meta.getChildByName("tag");
if (tl.hasValues()) { if (tl.hasValues()) {
XhtmlNode p = plateStyle(div.para()); XhtmlNode p = plateStyle(div.para());
p.tx(Utilities.pluralize("Tag", tl.getValues().size())+": "); p.tx(Utilities.pluralize(/*!#*/"Tag", tl.getValues().size())+": ");
boolean first = true; boolean first = true;
for (BaseWrapper bw : tl.getValues()) { for (BaseWrapper bw : tl.getValues()) {
if (first) first = false; else p.tx(", "); if (first) first = false; else p.tx(", ");
@ -623,7 +676,7 @@ public abstract class ResourceRenderer extends DataRenderer {
PropertyWrapper sl = meta.getChildByName("security"); PropertyWrapper sl = meta.getChildByName("security");
if (sl.hasValues()) { if (sl.hasValues()) {
XhtmlNode p = plateStyle(div.para()); XhtmlNode p = plateStyle(div.para());
p.tx(Utilities.pluralize("Security Label", tl.getValues().size())+": "); p.tx(Utilities.pluralize(/*!#*/"Security Label", tl.getValues().size())+": ");
boolean first = true; boolean first = true;
for (BaseWrapper bw : sl.getValues()) { for (BaseWrapper bw : sl.getValues()) {
if (first) first = false; else p.tx(", "); if (first) first = false; else p.tx(", ");
@ -655,7 +708,7 @@ public abstract class ResourceRenderer extends DataRenderer {
render(dr); render(dr);
} catch (Exception e) { } catch (Exception e) {
XhtmlNode x = new XhtmlNode(NodeType.Element, "div"); XhtmlNode x = new XhtmlNode(NodeType.Element, "div");
x.para().tx("Error rendering: "+e.getMessage()); x.para().tx(/*!#*/"Error rendering: "+e.getMessage());
dr.setText(null); dr.setText(null);
inject(dr, x, NarrativeStatus.GENERATED); inject(dr, x, NarrativeStatus.GENERATED);
} }

View File

@ -47,7 +47,7 @@ public class SearchParameterRenderer extends TerminologyRenderer {
genStandardsStatus(h2, ss); genStandardsStatus(h2, ss);
} }
XhtmlNode p = x.para(); XhtmlNode p = x.para();
p.tx("Parameter "); p.tx(/*!#*/"Parameter ");
p.code().tx(spd.getCode()); p.code().tx(spd.getCode());
p.tx(":"); p.tx(":");
p.code().tx(spd.getType().toCode()); p.code().tx(spd.getType().toCode());
@ -55,7 +55,7 @@ public class SearchParameterRenderer extends TerminologyRenderer {
XhtmlNode tbl = x.table("grid"); XhtmlNode tbl = x.table("grid");
XhtmlNode tr = tbl.tr(); XhtmlNode tr = tbl.tr();
tr.td().tx(Utilities.pluralize("Resource", spd.getBase().size())); tr.td().tx(Utilities.pluralize(/*!#*/"Resource", spd.getBase().size()));
XhtmlNode td = tr.td(); XhtmlNode td = tr.td();
for (Enumeration<VersionIndependentResourceTypesAll> t : spd.getBase()) { for (Enumeration<VersionIndependentResourceTypesAll> t : spd.getBase()) {
StructureDefinition sd = context.getWorker().fetchTypeDefinition(t.getCode()); StructureDefinition sd = context.getWorker().fetchTypeDefinition(t.getCode());
@ -68,23 +68,23 @@ public class SearchParameterRenderer extends TerminologyRenderer {
} }
} }
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Expression"); tr.td().tx(/*!#*/"Expression");
if (spd.hasExpression()) { if (spd.hasExpression()) {
tr.td().code().tx(spd.getExpression()); tr.td().code().tx(spd.getExpression());
} else { } else {
tr.td().tx("(none)"); tr.td().tx(/*!#*/"(none)");
} }
if (spd.hasProcessingMode()) { if (spd.hasProcessingMode()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Processing Mode"); tr.td().tx(/*!#*/"Processing Mode");
tr.td().tx(spd.getProcessingMode().getDisplay()); tr.td().tx(spd.getProcessingMode().getDisplay());
} }
if (spd.hasTarget()) { if (spd.hasTarget()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx(Utilities.pluralize("Target Resources", spd.getTarget().size())); tr.td().tx(Utilities.pluralize(/*!#*/"Target Resources", spd.getTarget().size()));
td = tr.td(); td = tr.td();
if (isAllConcreteResources(spd.getTarget())) { if (isAllConcreteResources(spd.getTarget())) {
td.ah(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "resourcelist.html")).tx("All Resources"); td.ah(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "resourcelist.html")).tx(/*!#*/"All Resources");
} else { } else {
for (Enumeration<VersionIndependentResourceTypesAll> t : spd.getTarget()) { for (Enumeration<VersionIndependentResourceTypesAll> t : spd.getTarget()) {
StructureDefinition sd = context.getWorker().fetchTypeDefinition(t.getCode()); StructureDefinition sd = context.getWorker().fetchTypeDefinition(t.getCode());
@ -99,28 +99,28 @@ public class SearchParameterRenderer extends TerminologyRenderer {
} }
} }
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Multiples"); tr.td().tx(/*!#*/"Multiples");
XhtmlNode ul = tr.td().ul(); XhtmlNode ul = tr.td().ul();
if (!spd.hasMultipleAnd()) { if (!spd.hasMultipleAnd()) {
ul.li().tx("multipleAnd: It's up to the server whether the parameter may repeat in order to specify multiple values that must all be true"); ul.li().tx(/*!#*/"multipleAnd: It's up to the server whether the parameter may repeat in order to specify multiple values that must all be true");
} else if (spd.getMultipleAnd()) { } else if (spd.getMultipleAnd()) {
ul.li().tx("multipleAnd: The parameter may repeat in order to specify multiple values that must all be true"); ul.li().tx(/*!#*/"multipleAnd: The parameter may repeat in order to specify multiple values that must all be true");
} else { } else {
ul.li().tx("multipleAnd: The parameter may only appear once"); ul.li().tx(/*!#*/"multipleAnd: The parameter may only appear once");
} }
if (!spd.hasMultipleOr()) { if (!spd.hasMultipleOr()) {
ul.li().tx("multipleOr: It's up to the server whether the parameter can have multiple values (separated by comma) where at least one must be true"); ul.li().tx(/*!#*/"multipleOr: It's up to the server whether the parameter can have multiple values (separated by comma) where at least one must be true");
} else if (spd.getMultipleOr()) { } else if (spd.getMultipleOr()) {
ul.li().tx("multipleOr: The parameter may have multiple values (separated by comma) where at least one must be true"); ul.li().tx(/*!#*/"multipleOr: The parameter may have multiple values (separated by comma) where at least one must be true");
} else { } else {
ul.li().tx("multipleOr: The parameter may only have one value (no comma separators)"); ul.li().tx(/*!#*/"multipleOr: The parameter may only have one value (no comma separators)");
} }
if (spd.hasComparator()) { if (spd.hasComparator()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Comparators"); tr.td().tx(/*!#*/"Comparators");
td = tr.td(); td = tr.td();
td.tx("Allowed: "); td.tx(/*!#*/"Allowed: ");
for (Enumeration<SearchComparator> t : spd.getComparator()) { for (Enumeration<SearchComparator> t : spd.getComparator()) {
td.sep(", "); td.sep(", ");
td.tx(t.asStringValue()); td.tx(t.asStringValue());
@ -128,9 +128,9 @@ public class SearchParameterRenderer extends TerminologyRenderer {
} }
if (spd.hasModifier()) { if (spd.hasModifier()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Modifiers"); tr.td().tx(/*!#*/"Modifiers");
td = tr.td(); td = tr.td();
td.tx("Allowed: "); td.tx(/*!#*/"Allowed: ");
for (Enumeration<SearchModifierCode> t : spd.getModifier()) { for (Enumeration<SearchModifierCode> t : spd.getModifier()) {
td.sep(", "); td.sep(", ");
td.tx(t.asStringValue()); td.tx(t.asStringValue());
@ -138,9 +138,9 @@ public class SearchParameterRenderer extends TerminologyRenderer {
} }
if (spd.hasChain()) { if (spd.hasChain()) {
tr = tbl.tr(); tr = tbl.tr();
tr.td().tx("Chains"); tr.td().tx(/*!#*/"Chains");
td = tr.td(); td = tr.td();
td.tx("Allowed: "); td.tx(/*!#*/"Allowed: ");
for (StringType t : spd.getChain()) { for (StringType t : spd.getChain()) {
td.sep(", "); td.sep(", ");
td.tx(t.asStringValue()); td.tx(t.asStringValue());
@ -148,7 +148,7 @@ public class SearchParameterRenderer extends TerminologyRenderer {
} }
if (spd.hasComponent()) { if (spd.hasComponent()) {
x.para().b().tx("Components"); x.para().b().tx(/*!#*/"Components");
tbl = x.table("grid"); tbl = x.table("grid");
for (SearchParameterComponentComponent t : spd.getComponent()) { for (SearchParameterComponentComponent t : spd.getComponent()) {
tr = tbl.tr(); tr = tbl.tr();
@ -167,7 +167,7 @@ public class SearchParameterRenderer extends TerminologyRenderer {
private boolean isAllConcreteResources(List<Enumeration<VersionIndependentResourceTypesAll>> list) { private boolean isAllConcreteResources(List<Enumeration<VersionIndependentResourceTypesAll>> list) {
for (String s : context.getWorker().getResourceNames()) { for (String s : context.getWorker().getResourceNames()) {
StructureDefinition sd = context.getWorker().fetchTypeDefinition(s); StructureDefinition sd = context.getWorker().fetchTypeDefinition(s);
if (!sd.getAbstract() && !Utilities.existsInList(sd.getType(), "Parameters")) { if (!sd.getAbstract() && !Utilities.existsInList(sd.getType(), /*!#*/"Parameters")) {
boolean found = false; boolean found = false;
for (Enumeration<VersionIndependentResourceTypesAll> c : list) { for (Enumeration<VersionIndependentResourceTypesAll> c : list) {
found = found || sd.getName().equals(c.getCode()); found = found || sd.getName().equals(c.getCode());

Some files were not shown because too many files have changed in this diff Show More