Merge branch 'master' into ja_20200524_npm_rework
This commit is contained in:
commit
6534a5358b
|
@ -11,10 +11,10 @@ strategy:
|
|||
matrix:
|
||||
linux:
|
||||
imageName: "ubuntu-16.04"
|
||||
mac:
|
||||
imageName: "macos-10.14"
|
||||
windows:
|
||||
imageName: "vs2017-win2016"
|
||||
# mac:
|
||||
# imageName: "macos-10.14"
|
||||
# windows:
|
||||
# imageName: "vs2017-win2016"
|
||||
maxParallel: 3
|
||||
|
||||
pool:
|
||||
|
@ -78,6 +78,7 @@ steps:
|
|||
# Upload test results to codecov
|
||||
- script: bash <(curl https://codecov.io/bash) -t $(codecov)
|
||||
displayName: 'codecov Bash Uploader'
|
||||
condition: and(eq(variables.currentImage, 'ubuntu-16.04'), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
|
||||
|
||||
# Publishes the test results to build artifacts.
|
||||
- task: PublishCodeCoverageResults@1
|
||||
|
@ -86,7 +87,8 @@ steps:
|
|||
codeCoverageTool: 'JaCoCo'
|
||||
summaryFileLocation: '$(System.DefaultWorkingDirectory)/org.hl7.fhir.report/target/site/jacoco-aggregate/jacoco.xml'
|
||||
reportDirectory: '$(System.DefaultWorkingDirectory)/org.hl7.fhir.report/target/site/jacoco-aggregate/'
|
||||
|
||||
condition: and(eq(variables.currentImage, 'ubuntu-16.04'), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
|
||||
|
||||
# Publishes the built Validator jar to build artifacts. Primarily for testing and debugging builds.
|
||||
- task: PublishPipelineArtifact@1
|
||||
displayName: 'Publish Validator jar'
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
# This pipeline produces a SNAPSHOT build for each of the sub modules in
|
||||
# the core library, and publishes them to ossrh.
|
||||
trigger:
|
||||
- master
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
|
||||
pr: none
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -309,7 +309,9 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
|
|||
for (ElementDefinition ed : sd.getDifferential().getElement()) {
|
||||
if (ed.getPath().equals("Extension.url") || ed.getPath().endsWith(".extension.url") ) {
|
||||
ed.setMin(1);
|
||||
ed.getBase().setMin(1);
|
||||
if (ed.hasBase()) {
|
||||
ed.getBase().setMin(1);
|
||||
}
|
||||
}
|
||||
if ("extension".equals(ed.getSliceName())) {
|
||||
ed.setSliceName(null);
|
||||
|
|
|
@ -553,7 +553,16 @@ public class XmlParser extends ParserBase {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
private void setXsiTypeIfIsTypeAttr(IXMLWriter xml, Element element) throws IOException, FHIRException {
|
||||
if (isTypeAttr(element.getProperty()) && !Utilities.noString(element.getType())) {
|
||||
String type = element.getType();
|
||||
if (Utilities.isAbsoluteUrl(type)) {
|
||||
type = type.substring(type.lastIndexOf("/")+1);
|
||||
}
|
||||
xml.attribute("xsi:type",type);
|
||||
}
|
||||
}
|
||||
|
||||
public void compose(Element e, IXMLWriter xml) throws Exception {
|
||||
xml.start();
|
||||
xml.setDefaultNamespace(e.getProperty().getXmlNamespace());
|
||||
|
@ -596,9 +605,7 @@ public class XmlParser extends ParserBase {
|
|||
xml.link(linkResolver.resolveProperty(element.getProperty()));
|
||||
xml.text(element.getValue());
|
||||
} else {
|
||||
if (isTypeAttr(element.getProperty()) && !Utilities.noString(element.getType())) {
|
||||
xml.attribute("xsi:type", element.getType());
|
||||
}
|
||||
setXsiTypeIfIsTypeAttr(xml, element);
|
||||
if (element.hasValue()) {
|
||||
if (linkResolver != null)
|
||||
xml.link(linkResolver.resolveType(element.getType()));
|
||||
|
@ -615,9 +622,7 @@ public class XmlParser extends ParserBase {
|
|||
xml.element(elementName);
|
||||
}
|
||||
} else {
|
||||
if (isTypeAttr(element.getProperty()) && !Utilities.noString(element.getType())) {
|
||||
xml.attribute("xsi:type", element.getType());
|
||||
}
|
||||
setXsiTypeIfIsTypeAttr(xml, element);
|
||||
for (Element child : element.getChildren()) {
|
||||
if (isAttr(child.getProperty())) {
|
||||
if (linkResolver != null)
|
||||
|
|
|
@ -79,6 +79,15 @@ private Map<String, Object> userData;
|
|||
return (Integer) getUserData(name);
|
||||
}
|
||||
|
||||
public void copyUserData(Base other) {
|
||||
if (other.userData != null) {
|
||||
if (userData == null) {
|
||||
userData = new HashMap<>();
|
||||
}
|
||||
userData.putAll(other.userData);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasFormatComment() {
|
||||
return (formatCommentsPre != null && !formatCommentsPre.isEmpty()) || (formatCommentsPost != null && !formatCommentsPost.isEmpty());
|
||||
}
|
||||
|
|
|
@ -72,8 +72,11 @@ public class ExpressionNode {
|
|||
Empty, Not, Exists, SubsetOf, SupersetOf, IsDistinct, Distinct, Count, Where, Select, All, Repeat, Aggregate, Item /*implicit from name[]*/, As, Is, Single,
|
||||
First, Last, Tail, Skip, Take, Union, Combine, Intersect, Exclude, Iif, Upper, Lower, ToChars, IndexOf, Substring, StartsWith, EndsWith, Matches, ReplaceMatches, Contains, Replace, Length,
|
||||
Children, Descendants, MemberOf, Trace, Check, Today, Now, Resolve, Extension, AllFalse, AnyFalse, AllTrue, AnyTrue,
|
||||
HasValue, AliasAs, Alias, HtmlChecks, OfType, Type,
|
||||
ConvertsToBoolean, ConvertsToInteger, ConvertsToString, ConvertsToDecimal, ConvertsToQuantity, ConvertsToDateTime, ConvertsToTime, ToBoolean, ToInteger, ToString, ToDecimal, ToQuantity, ToDateTime, ToTime, ConformsTo;
|
||||
HasValue, OfType, Type, ConvertsToBoolean, ConvertsToInteger, ConvertsToString, ConvertsToDecimal, ConvertsToQuantity, ConvertsToDateTime, ConvertsToTime, ToBoolean, ToInteger, ToString, ToDecimal, ToQuantity, ToDateTime, ToTime, ConformsTo,
|
||||
// R3 functions
|
||||
Encode, Decode, Escape, Unescape, Trim, Split, Join,
|
||||
// Local extensions to FHIRPath
|
||||
HtmlChecks, AliasAs, Alias;
|
||||
|
||||
public static Function fromCode(String name) {
|
||||
if (name.equals("empty")) return Function.Empty;
|
||||
|
@ -133,6 +136,13 @@ public class ExpressionNode {
|
|||
if (name.equals("aliasAs")) return Function.AliasAs;
|
||||
if (name.equals("htmlChecks")) return Function.HtmlChecks;
|
||||
if (name.equals("htmlchecks")) return Function.HtmlChecks; // support change of care from R3
|
||||
if (name.equals("encode")) return Function.Encode;
|
||||
if (name.equals("decode")) return Function.Decode;
|
||||
if (name.equals("escape")) return Function.Escape;
|
||||
if (name.equals("unescape")) return Function.Unescape;
|
||||
if (name.equals("trim")) return Function.Trim;
|
||||
if (name.equals("split")) return Function.Split;
|
||||
if (name.equals("join")) return Function.Join;
|
||||
if (name.equals("ofType")) return Function.OfType;
|
||||
if (name.equals("type")) return Function.Type;
|
||||
if (name.equals("toInteger")) return Function.ToInteger;
|
||||
|
@ -209,6 +219,13 @@ public class ExpressionNode {
|
|||
case HasValue : return "hasValue";
|
||||
case Alias : return "alias";
|
||||
case AliasAs : return "aliasAs";
|
||||
case Encode : return "encode";
|
||||
case Decode : return "decode";
|
||||
case Escape : return "escape";
|
||||
case Unescape : return "unescape";
|
||||
case Trim : return "trim";
|
||||
case Split : return "split";
|
||||
case Join : return "join";
|
||||
case HtmlChecks : return "htmlChecks";
|
||||
case OfType : return "ofType";
|
||||
case Type : return "type";
|
||||
|
|
|
@ -69,10 +69,14 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Description & Constraints"), translate("sd.hint", "Additional information about the item"), null, 0));
|
||||
|
||||
boolean hasExt = false;
|
||||
for (QuestionnaireItemComponent i : q.getItem()) {
|
||||
hasExt = renderTreeItem(gen, model.getRows(), q, i) || hasExt;
|
||||
if (!q.hasItem()) {
|
||||
gen.emptyRow(model, 6);
|
||||
} else {
|
||||
for (QuestionnaireItemComponent i : q.getItem()) {
|
||||
hasExt = renderTreeItem(gen, model.getRows(), q, i) || hasExt;
|
||||
}
|
||||
}
|
||||
XhtmlNode xn = gen.generate(model, context.getDestDir(), 1, null);
|
||||
XhtmlNode xn = gen.generate(model, context.getLocalPrefix(), 1, null);
|
||||
x.getChildNodes().add(xn);
|
||||
return hasExt;
|
||||
}
|
||||
|
@ -83,7 +87,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
boolean hasExt = false;
|
||||
|
||||
r.setIcon("icon-q-"+i.getType().toCode()+".png", i.getType().getDisplay());
|
||||
r.getCells().add(gen.new Cell(null, context.getDefinitionsTarget() == null ? "" : context.getDefinitionsTarget()+"-definitions.html#extension."+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));
|
||||
String txt = (i.hasPrefix() ? i.getPrefix() + ". " : "") + i.getText();
|
||||
r.getCells().add(gen.new Cell(null, null, txt, null, null));
|
||||
r.getCells().add(gen.new Cell(null, null, (i.getRequired() ? "1" : "0")+".."+(i.getRepeats() ? "*" : "1"), null, null));
|
||||
|
@ -93,28 +97,28 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
Cell flags = gen.new Cell();
|
||||
r.getCells().add(flags);
|
||||
if (i.getReadOnly()) {
|
||||
flags.addPiece(gen.new Piece(Utilities.pathURL(context.getSpecificationLink(), "questionnaire-definitions.html#Questionnaire.item.readOnly"), null, "Is Readonly").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-readonly.png"))));
|
||||
flags.addPiece(gen.new Piece(Utilities.pathURL(context.getSpecificationLink(), "questionnaire-definitions.html#Questionnaire.item.readOnly"), null, "Is Readonly").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-readonly.png"))));
|
||||
}
|
||||
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) {
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", null, "Can change the subject of the questionnaire").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-subject.png"))));
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", null, "Can change the subject of the questionnaire").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-subject.png"))));
|
||||
}
|
||||
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden")) {
|
||||
flags.addPiece(gen.new Piece(Utilities.pathURL(context.getSpecificationLink(), "extension-questionnaire-hidden.html"), null, "Is a hidden item").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-hidden.png"))));
|
||||
flags.addPiece(gen.new Piece(Utilities.pathURL(context.getSpecificationLink(), "extension-questionnaire-hidden.html"), null, "Is a hidden item").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-hidden.png"))));
|
||||
}
|
||||
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay")) {
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay", null, "Is optional to display").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-optional.png"))));
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay", null, "Is optional to display").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-optional.png"))));
|
||||
}
|
||||
if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) {
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", null, "Is linked to an observation").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-observation.png"))));
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", null, "Is linked to an observation").addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-observation.png"))));
|
||||
}
|
||||
if (i.hasExtension("http://hl7.org/fhir/StructureDefinition/questionnaire-choiceOrientation")) {
|
||||
String code = ToolingExtensions.readStringExtension(i, "http://hl7.org/fhir/StructureDefinition/questionnaire-choiceOrientation");
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", null, "Orientation: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-"+code+".png"))));
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", null, "Orientation: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-"+code+".png"))));
|
||||
}
|
||||
if (i.hasExtension("http://hl7.org/fhir/StructureDefinition/questionnaire-displayCategory")) {
|
||||
CodeableConcept cc = i.getExtensionByUrl("http://hl7.org/fhir/StructureDefinition/questionnaire-displayCategory").getValueCodeableConcept();
|
||||
String code = cc.getCode("http://hl7.org/fhir/questionnaire-display-category");
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-displayCategory", null, "Category: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-"+code+".png"))));
|
||||
flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-displayCategory", null, "Category: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-"+code+".png"))));
|
||||
}
|
||||
|
||||
Cell defn = gen.new Cell();
|
||||
|
@ -143,7 +147,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
if (vs == null) {
|
||||
defn.getPieces().add(gen.new Piece(null, i.getAnswerValueSet(), null));
|
||||
} else {
|
||||
defn.getPieces().add(gen.new Piece("todo", vs.present(), null));
|
||||
defn.getPieces().add(gen.new Piece(vs.getUserString("path"), vs.present(), null));
|
||||
}
|
||||
} else {
|
||||
ValueSet vs = context.getWorker().fetchResource(ValueSet.class, i.getAnswerValueSet());
|
||||
|
@ -157,7 +161,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
if (i.hasAnswerOption()) {
|
||||
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(context.getDefinitionsTarget()+"#"+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()) {
|
||||
for (QuestionnaireItemInitialComponent v : i.getInitial()) {
|
||||
|
@ -231,8 +235,12 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
model.getTitles().add(gen.new Title(null, model.getDocoRef(), translate("sd.head", "Description & Constraints"), translate("sd.hint", "Additional information about the item"), null, 0));
|
||||
|
||||
boolean hasExt = false;
|
||||
for (QuestionnaireItemComponent i : q.getItem()) {
|
||||
hasExt = renderLogicItem(gen, model.getRows(), q, i) || hasExt;
|
||||
if (!q.hasItem()) {
|
||||
gen.emptyRow(model, 2);
|
||||
} else {
|
||||
for (QuestionnaireItemComponent i : q.getItem()) {
|
||||
hasExt = renderLogicItem(gen, model.getRows(), q, i) || hasExt;
|
||||
}
|
||||
}
|
||||
XhtmlNode xn = gen.generate(model, context.getDestDir(), 1, null);
|
||||
x.getChildNodes().add(xn);
|
||||
|
@ -245,7 +253,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
boolean hasExt = false;
|
||||
|
||||
r.setIcon("icon-q-"+i.getType().toCode()+".png", i.getType().getDisplay());
|
||||
r.getCells().add(gen.new Cell(null, context.getDefinitionsTarget() == null ? "" : context.getDefinitionsTarget()+"-definitions.html#extension."+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));
|
||||
Cell defn = gen.new Cell();
|
||||
r.getCells().add(defn);
|
||||
|
||||
|
@ -272,7 +280,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
if (vs == null) {
|
||||
defn.getPieces().add(gen.new Piece(null, i.getAnswerValueSet(), null));
|
||||
} else {
|
||||
defn.getPieces().add(gen.new Piece("todo", vs.present(), null));
|
||||
defn.getPieces().add(gen.new Piece(vs.getUserString("path"), vs.present(), null));
|
||||
}
|
||||
} else {
|
||||
ValueSet vs = context.getWorker().fetchResource(ValueSet.class, i.getAnswerValueSet());
|
||||
|
@ -286,7 +294,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
if (i.hasAnswerOption()) {
|
||||
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(context.getDefinitionsTarget()+"#"+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()) {
|
||||
for (QuestionnaireItemInitialComponent v : i.getInitial()) {
|
||||
|
@ -459,7 +467,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
|
||||
// if (i.hasExtension("http://hl7.org/fhir/StructureDefinition/questionnaire-choiceOrientation")) {
|
||||
// String code = ToolingExtensions.readStringExtension(i, "http://hl7.org/fhir/StructureDefinition/questionnaire-choiceOrientation");
|
||||
// flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", null, "Orientation: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getDestDir(), "icon-qi-"+code+".png"))));
|
||||
// flags.addPiece(gen.new Piece("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", null, "Orientation: "+code).addHtml(new XhtmlNode(NodeType.Element, "img").attribute("src", Utilities.path(context.getLocalPrefix(), "icon-qi-"+code+".png"))));
|
||||
//}
|
||||
|
||||
|
||||
|
@ -470,26 +478,26 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
|
||||
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject")) {
|
||||
hasFlag = true;
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", "Can change the subject of the questionnaire").img(Utilities.path(context.getDestDir(), "icon-qi-subject.png"));
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-isSubject", "Can change the subject of the questionnaire").img(Utilities.path(context.getLocalPrefix(), "icon-qi-subject.png"));
|
||||
}
|
||||
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden")) {
|
||||
hasFlag = true;
|
||||
flags.ah(Utilities.pathURL(context.getSpecificationLink(), "extension-questionnaire-hidden.html"), "Is a hidden item").img(Utilities.path(context.getDestDir(), "icon-qi-hidden.png"));
|
||||
flags.ah(Utilities.pathURL(context.getSpecificationLink(), "extension-questionnaire-hidden.html"), "Is a hidden item").img(Utilities.path(context.getLocalPrefix(), "icon-qi-hidden.png"));
|
||||
d.style("background-color: #eeeeee");
|
||||
}
|
||||
if (ToolingExtensions.readBoolExtension(i, "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay")) {
|
||||
hasFlag = true;
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay", "Is optional to display").img(Utilities.path(context.getDestDir(), "icon-qi-optional.png"));
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-optionalDisplay", "Is optional to display").img(Utilities.path(context.getLocalPrefix(), "icon-qi-optional.png"));
|
||||
}
|
||||
if (i.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod")) {
|
||||
hasFlag = true;
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", "Is linked to an observation").img(Utilities.path(context.getDestDir(), "icon-qi-observation.png"));
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-observationLinkPeriod", "Is linked to an observation").img(Utilities.path(context.getLocalPrefix(), "icon-qi-observation.png"));
|
||||
}
|
||||
if (i.hasExtension("http://hl7.org/fhir/StructureDefinition/questionnaire-displayCategory")) {
|
||||
CodeableConcept cc = i.getExtensionByUrl("http://hl7.org/fhir/StructureDefinition/questionnaire-displayCategory").getValueCodeableConcept();
|
||||
String code = cc.getCode("http://hl7.org/fhir/questionnaire-display-category");
|
||||
hasFlag = true;
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-displayCategory", "Category: "+code).img(Utilities.path(context.getDestDir(), "icon-qi-"+code+".png"));
|
||||
flags.ah("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-displayCategory", "Category: "+code).img(Utilities.path(context.getLocalPrefix(), "icon-qi-"+code+".png"));
|
||||
}
|
||||
|
||||
if (i.hasMaxLength()) {
|
||||
|
@ -508,7 +516,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
if (vs == null) {
|
||||
ans.tx(i.getAnswerValueSet());
|
||||
} else {
|
||||
ans.ah("todo").tx(vs.present());
|
||||
ans.ah(vs.getUserString("path")).tx(vs.present());
|
||||
}
|
||||
} else {
|
||||
ValueSet vs = context.getWorker().fetchResource(ValueSet.class, i.getAnswerValueSet());
|
||||
|
@ -520,7 +528,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
}
|
||||
}
|
||||
if (i.hasAnswerOption()) {
|
||||
item(ul, "Answers", Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), context.getDefinitionsTarget()+"#"+i.getLinkId());
|
||||
item(ul, "Answers", Integer.toString(i.getAnswerOption().size())+" "+Utilities.pluralize("option", i.getAnswerOption().size()), context.getDefinitionsTarget()+"#item."+i.getLinkId());
|
||||
}
|
||||
if (i.hasInitial()) {
|
||||
XhtmlNode vi = item(ul, "Initial Values");
|
||||
|
@ -642,12 +650,12 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
private boolean renderDefinition(XhtmlNode tbl, Questionnaire q, QuestionnaireItemComponent qi, List<QuestionnaireItemComponent> parents) throws IOException {
|
||||
boolean ext = false;
|
||||
XhtmlNode td = tbl.tr().td("structure").colspan("2").span(null, null).attribute("class", "self-link-parent");
|
||||
td.an(qi.getLinkId());
|
||||
td.an("item."+qi.getLinkId());
|
||||
for (QuestionnaireItemComponent p : parents) {
|
||||
td.ah("#"+p.getLinkId()).img(Utilities.path(context.getDestDir(), "icon_q_item.png"));
|
||||
td.ah("#item."+p.getLinkId()).img(Utilities.path(context.getLocalPrefix(), "icon_q_item.png"));
|
||||
td.tx(" > ");
|
||||
}
|
||||
td.img(Utilities.path(context.getDestDir(), "icon_q_item.png"));
|
||||
td.img(Utilities.path(context.getLocalPrefix(), "icon_q_item.png"));
|
||||
td.tx(" Item ");
|
||||
td.b().tx(qi.getLinkId());
|
||||
|
||||
|
@ -767,7 +775,7 @@ public class QuestionnaireRenderer extends TerminologyRenderer {
|
|||
}
|
||||
|
||||
private void renderEnableWhen(XhtmlNode x, QuestionnaireItemEnableWhenComponent ew) {
|
||||
x.ah("#"+ew.getQuestion()).tx(ew.getQuestion());
|
||||
x.ah("#item."+ew.getQuestion()).tx(ew.getQuestion());
|
||||
x.tx(" ");
|
||||
x.tx(ew.getOperator().toCode());
|
||||
x.tx(" ");
|
||||
|
|
|
@ -2,6 +2,7 @@ package org.hl7.fhir.r5.utils;
|
|||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.Date;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
|
@ -50,6 +51,7 @@ import org.hl7.fhir.r5.model.TypeDetails.ProfiledType;
|
|||
import org.hl7.fhir.r5.model.ValueSet;
|
||||
import org.hl7.fhir.r5.utils.FHIRLexer.FHIRLexerException;
|
||||
import org.hl7.fhir.r5.utils.FHIRPathEngine.IEvaluationContext.FunctionDetails;
|
||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
import org.hl7.fhir.utilities.validation.ValidationOptions;
|
||||
|
||||
|
@ -1146,6 +1148,13 @@ public class FHIRPathEngine {
|
|||
case HasValue: return checkParamCount(lexer, location, exp, 0);
|
||||
case Alias: return checkParamCount(lexer, location, exp, 1);
|
||||
case AliasAs: return checkParamCount(lexer, location, exp, 1);
|
||||
case Encode: return checkParamCount(lexer, location, exp, 1);
|
||||
case Decode: return checkParamCount(lexer, location, exp, 1);
|
||||
case Escape: return checkParamCount(lexer, location, exp, 1);
|
||||
case Unescape: return checkParamCount(lexer, location, exp, 1);
|
||||
case Trim: return checkParamCount(lexer, location, exp, 0);
|
||||
case Split: return checkParamCount(lexer, location, exp, 1);
|
||||
case Join: return checkParamCount(lexer, location, exp, 1);
|
||||
case HtmlChecks: return checkParamCount(lexer, location, exp, 0);
|
||||
case ToInteger: return checkParamCount(lexer, location, exp, 0);
|
||||
case ToDecimal: return checkParamCount(lexer, location, exp, 0);
|
||||
|
@ -2643,7 +2652,27 @@ public class FHIRPathEngine {
|
|||
return anything(CollectionStatus.SINGLETON);
|
||||
case AliasAs :
|
||||
checkParamTypes(exp.getFunction().toCode(), paramTypes, new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String));
|
||||
return focus;
|
||||
return focus;
|
||||
case Encode:
|
||||
checkParamTypes(exp.getFunction().toCode(), paramTypes, new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String));
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String);
|
||||
case Decode:
|
||||
checkParamTypes(exp.getFunction().toCode(), paramTypes, new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String));
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String);
|
||||
case Escape:
|
||||
checkParamTypes(exp.getFunction().toCode(), paramTypes, new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String));
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String);
|
||||
case Unescape:
|
||||
checkParamTypes(exp.getFunction().toCode(), paramTypes, new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String));
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String);
|
||||
case Trim:
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String);
|
||||
case Split:
|
||||
checkParamTypes(exp.getFunction().toCode(), paramTypes, new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String));
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String);
|
||||
case Join:
|
||||
checkParamTypes(exp.getFunction().toCode(), paramTypes, new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String));
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_String);
|
||||
case ToInteger : {
|
||||
checkContextPrimitive(focus, "toInteger", true);
|
||||
return new TypeDetails(CollectionStatus.SINGLETON, TypeDetails.FP_Integer);
|
||||
|
@ -2818,6 +2847,13 @@ public class FHIRPathEngine {
|
|||
case AllTrue: return funcAllTrue(context, focus, exp);
|
||||
case HasValue : return funcHasValue(context, focus, exp);
|
||||
case AliasAs : return funcAliasAs(context, focus, exp);
|
||||
case Encode : return funcEncode(context, focus, exp);
|
||||
case Decode : return funcDecode(context, focus, exp);
|
||||
case Escape : return funcEscape(context, focus, exp);
|
||||
case Unescape : return funcUnescape(context, focus, exp);
|
||||
case Trim : return funcTrim(context, focus, exp);
|
||||
case Split : return funcSplit(context, focus, exp);
|
||||
case Join : return funcJoin(context, focus, exp);
|
||||
case Alias : return funcAlias(context, focus, exp);
|
||||
case HtmlChecks : return funcHtmlChecks(context, focus, exp);
|
||||
case ToInteger : return funcToInteger(context, focus, exp);
|
||||
|
@ -2845,8 +2881,142 @@ public class FHIRPathEngine {
|
|||
throw new Error("not Implemented yet");
|
||||
}
|
||||
}
|
||||
|
||||
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
|
||||
public static String bytesToHex(byte[] bytes) {
|
||||
char[] hexChars = new char[bytes.length * 2];
|
||||
for (int j = 0; j < bytes.length; j++) {
|
||||
int v = bytes[j] & 0xFF;
|
||||
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
|
||||
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
|
||||
}
|
||||
return new String(hexChars);
|
||||
}
|
||||
|
||||
public static byte[] hexStringToByteArray(String s) {
|
||||
int len = s.length();
|
||||
byte[] data = new byte[len / 2];
|
||||
for (int i = 0; i < len; i += 2) {
|
||||
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
|
||||
+ Character.digit(s.charAt(i+1), 16));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
private List<Base> funcEncode(ExecutionContext context, List<Base> focus, ExpressionNode exp) {
|
||||
List<Base> nl = execute(context, focus, exp.getParameters().get(0), true);
|
||||
String param = nl.get(0).primitiveValue();
|
||||
|
||||
private List<Base> funcAliasAs(ExecutionContext context, List<Base> focus, ExpressionNode exp) throws FHIRException {
|
||||
List<Base> result = new ArrayList<Base>();
|
||||
|
||||
if (focus.size() == 1) {
|
||||
String cnt = focus.get(0).primitiveValue();
|
||||
if ("hex".equals(param)) {
|
||||
result.add(new StringType(bytesToHex(cnt.getBytes())));
|
||||
} else if ("base64".equals(param)) {
|
||||
Base64.Encoder enc = Base64.getEncoder();
|
||||
result.add(new StringType(enc.encodeToString(cnt.getBytes())));
|
||||
} else if ("urlbase64".equals(param)) {
|
||||
Base64.Encoder enc = Base64.getUrlEncoder();
|
||||
result.add(new StringType(enc.encodeToString(cnt.getBytes())));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Base> funcDecode(ExecutionContext context, List<Base> focus, ExpressionNode exp) {
|
||||
List<Base> nl = execute(context, focus, exp.getParameters().get(0), true);
|
||||
String param = nl.get(0).primitiveValue();
|
||||
|
||||
List<Base> result = new ArrayList<Base>();
|
||||
|
||||
if (focus.size() == 1) {
|
||||
String cnt = focus.get(0).primitiveValue();
|
||||
if ("hex".equals(param)) {
|
||||
result.add(new StringType(new String(hexStringToByteArray(cnt))));
|
||||
} else if ("base64".equals(param)) {
|
||||
Base64.Decoder enc = Base64.getDecoder();
|
||||
result.add(new StringType(new String(enc.decode(cnt))));
|
||||
} else if ("urlbase64".equals(param)) {
|
||||
Base64.Decoder enc = Base64.getUrlDecoder();
|
||||
result.add(new StringType(new String(enc.decode(cnt))));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Base> funcEscape(ExecutionContext context, List<Base> focus, ExpressionNode exp) {
|
||||
List<Base> nl = execute(context, focus, exp.getParameters().get(0), true);
|
||||
String param = nl.get(0).primitiveValue();
|
||||
|
||||
List<Base> result = new ArrayList<Base>();
|
||||
if (focus.size() == 1) {
|
||||
String cnt = focus.get(0).primitiveValue();
|
||||
if ("html".equals(param)) {
|
||||
result.add(new StringType(Utilities.escapeXml(cnt)));
|
||||
} else if ("json".equals(param)) {
|
||||
result.add(new StringType(Utilities.escapeJson(cnt)));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Base> funcUnescape(ExecutionContext context, List<Base> focus, ExpressionNode exp) {
|
||||
List<Base> nl = execute(context, focus, exp.getParameters().get(0), true);
|
||||
String param = nl.get(0).primitiveValue();
|
||||
|
||||
List<Base> result = new ArrayList<Base>();
|
||||
if (focus.size() == 1) {
|
||||
String cnt = focus.get(0).primitiveValue();
|
||||
if ("html".equals(param)) {
|
||||
result.add(new StringType(Utilities.unescapeXml(cnt)));
|
||||
} else if ("json".equals(param)) {
|
||||
result.add(new StringType(Utilities.unescapeJson(cnt)));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Base> funcTrim(ExecutionContext context, List<Base> focus, ExpressionNode exp) {
|
||||
List<Base> result = new ArrayList<Base>();
|
||||
if (focus.size() == 1) {
|
||||
String cnt = focus.get(0).primitiveValue();
|
||||
result.add(new StringType(cnt.trim()));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Base> funcSplit(ExecutionContext context, List<Base> focus, ExpressionNode exp) {
|
||||
List<Base> nl = execute(context, focus, exp.getParameters().get(0), true);
|
||||
String param = nl.get(0).primitiveValue();
|
||||
|
||||
List<Base> result = new ArrayList<Base>();
|
||||
if (focus.size() == 1) {
|
||||
String cnt = focus.get(0).primitiveValue();
|
||||
for (String s : cnt.split(param)) {
|
||||
result.add(new StringType(s));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Base> funcJoin(ExecutionContext context, List<Base> focus, ExpressionNode exp) {
|
||||
List<Base> nl = execute(context, focus, exp.getParameters().get(0), true);
|
||||
String param = nl.get(0).primitiveValue();
|
||||
|
||||
List<Base> result = new ArrayList<Base>();
|
||||
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(param);
|
||||
for (Base i : focus) {
|
||||
b.append(i.primitiveValue());
|
||||
}
|
||||
result.add(new StringType(b.toString()));
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Base> funcAliasAs(ExecutionContext context, List<Base> focus, ExpressionNode exp) throws FHIRException {
|
||||
List<Base> nl = execute(context, focus, exp.getParameters().get(0), true);
|
||||
String name = nl.get(0).primitiveValue();
|
||||
context.addAlias(name, focus);
|
||||
|
|
|
@ -213,6 +213,9 @@ public class FHIRPathTests {
|
|||
Assertions.assertTrue(outcome.get(i).equalsDeep(q), String.format("Outcome %d: Value should be %s but was %s", i, v, outcome.get(i).toString()));
|
||||
} else {
|
||||
Assertions.assertTrue(outcome.get(i) instanceof PrimitiveType, String.format("Outcome %d: Value should be a primitive type but was %s", i, outcome.get(i).fhirType()));
|
||||
if (!(v.equals(((PrimitiveType) outcome.get(i)).asStringValue()))) {
|
||||
System.out.println(String.format("Outcome %d: Value should be %s but was %s for expression %s", i, v, outcome.get(i).toString(), expression));
|
||||
}
|
||||
Assertions.assertEquals(v, ((PrimitiveType) outcome.get(i)).asStringValue(), String.format("Outcome %d: Value should be %s but was %s for expression %s", i, v, outcome.get(i).toString(), expression));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -79,7 +79,15 @@ public class NarrativeGenerationTests {
|
|||
List<Arguments> objects = new ArrayList<>();
|
||||
while (test != null && test.getNodeName().equals("test")) {
|
||||
TestDetails t = new TestDetails(test);
|
||||
objects.add(Arguments.of(t.getId(), t));
|
||||
if (t.getId().equals("sdc")) {
|
||||
if (SystemUtils.OS_NAME.contains(WINDOWS)) {
|
||||
objects.add(Arguments.of(t.getId(), t));
|
||||
} else {
|
||||
System.out.println("sdc test not being adding because the current OS will not pass the test...");
|
||||
}
|
||||
} else {
|
||||
objects.add(Arguments.of(t.getId(), t));
|
||||
}
|
||||
test = XMLUtil.getNextSibling(test);
|
||||
}
|
||||
return objects.stream();
|
||||
|
|
|
@ -551,6 +551,7 @@ public class SnapShotGenerationTests {
|
|||
}
|
||||
if (output.getDifferential().hasElement()) {
|
||||
RenderingContext rc = new RenderingContext(TestingUtilities.context(), null, null, "http://hl7.org/fhir", "", null, ResourceRendererMode.RESOURCE);
|
||||
rc.setDestDir(Utilities.path("[tmp]", "snapshot"));
|
||||
rc.setProfileUtilities(new ProfileUtilities(TestingUtilities.context(), null, new TestPKP()));
|
||||
RendererFactory.factory(output, rc).render(output);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
package org.hl7.fhir.r5.test;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.hl7.fhir.r5.context.SimpleWorkerContext;
|
||||
import org.hl7.fhir.r5.elementmodel.Element;
|
||||
import org.hl7.fhir.r5.elementmodel.Manager;
|
||||
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
|
||||
import org.hl7.fhir.r5.formats.IParser.OutputStyle;
|
||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
||||
import org.hl7.fhir.r5.utils.FHIRPathEngine;
|
||||
import org.hl7.fhir.utilities.cache.PackageCacheManager;
|
||||
import org.hl7.fhir.utilities.cache.ToolsVersion;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class XmlParserTests {
|
||||
|
||||
private static SimpleWorkerContext context;
|
||||
private static FHIRPathEngine fp;
|
||||
|
||||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
PackageCacheManager pcm = new PackageCacheManager(true, ToolsVersion.TOOLS_VERSION);
|
||||
context = SimpleWorkerContext.fromPackage(pcm.loadPackage("hl7.fhir.r4.core", "4.0.1"));
|
||||
fp = new FHIRPathEngine(context);
|
||||
|
||||
context.loadFromFile(TestingUtilities.loadTestResourceStream("validator", "cda", "any.xml"), "any.xml", null);
|
||||
context.loadFromFile(TestingUtilities.loadTestResourceStream("validator", "cda", "ii.xml"), "ii.xml", null);
|
||||
context.loadFromFile(TestingUtilities.loadTestResourceStream("validator", "cda", "cd.xml"), "cd.xml", null);
|
||||
context.loadFromFile(TestingUtilities.loadTestResourceStream("validator", "cda", "ce.xml"), "ce.xml", null);
|
||||
context.loadFromFile(TestingUtilities.loadTestResourceStream("validator", "cda", "ed.xml"), "ed.xml", null);
|
||||
context.loadFromFile(TestingUtilities.loadTestResourceStream("validator", "cda", "st.xml"), "st.xml", null);
|
||||
context.loadFromFile(TestingUtilities.loadTestResourceStream("validator", "cda", "cda.xml"), "cda.xml", null);
|
||||
for (StructureDefinition sd : context.getStructures()) {
|
||||
if (!sd.hasSnapshot()) {
|
||||
System.out.println("generate snapshot for " + sd.getUrl());
|
||||
context.generateSnapshot(sd, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
/**
|
||||
* Deserializes a simplified CDA example into the logical model and checks that
|
||||
* xml deserialization works for the xsi:type
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
public void testXsiDeserialiserXmlParser() throws IOException {
|
||||
Element cda = Manager.parse(context, TestingUtilities.loadTestResourceStream("validator", "cda", "example-xsi.xml"),
|
||||
FhirFormat.XML);
|
||||
|
||||
ByteArrayOutputStream baosXml = new ByteArrayOutputStream();
|
||||
Manager.compose(context, cda, baosXml, FhirFormat.XML, OutputStyle.PRETTY, null);
|
||||
|
||||
String cdaSerialised = baosXml.toString();
|
||||
assertTrue(cdaSerialised.indexOf("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")>0);
|
||||
assertTrue(cdaSerialised.indexOf("xsi:type=\"CD\"")>0);
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
@ -80,6 +80,13 @@
|
|||
<version>${junit_jupiter_version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.hl7.fhir.testcases</groupId>
|
||||
<artifactId>fhir-test-cases</artifactId>
|
||||
<version>${validator_test_case_version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
@ -509,6 +509,55 @@ public class Utilities {
|
|||
return b.toString();
|
||||
}
|
||||
|
||||
public static String unescapeJson(String json) throws FHIRException {
|
||||
if (json == null)
|
||||
return null;
|
||||
|
||||
StringBuilder b = new StringBuilder();
|
||||
int i = 0;
|
||||
while (i < json.length()) {
|
||||
if (json.charAt(i) == '\\') {
|
||||
i++;
|
||||
char ch = json.charAt(i);
|
||||
switch (ch) {
|
||||
case '"':
|
||||
b.append('b');
|
||||
break;
|
||||
case '\\':
|
||||
b.append('\\');
|
||||
break;
|
||||
case '/':
|
||||
b.append('/');
|
||||
break;
|
||||
case 'b':
|
||||
b.append('\b');
|
||||
break;
|
||||
case 'f':
|
||||
b.append('\f');
|
||||
break;
|
||||
case 'n':
|
||||
b.append('\n');
|
||||
break;
|
||||
case 'r':
|
||||
b.append('\r');
|
||||
break;
|
||||
case 't':
|
||||
b.append('\t');
|
||||
break;
|
||||
case 'u':
|
||||
String hex = json.substring(i+1, i+5);
|
||||
b.append((char) Integer.parseInt(hex, 16));
|
||||
break;
|
||||
default:
|
||||
throw new FHIRException("Unknown JSON escape \\"+ch);
|
||||
}
|
||||
} else
|
||||
b.append(json.charAt(i));
|
||||
i++;
|
||||
}
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
|
||||
public static boolean isPlural(String word) {
|
||||
word = word.toLowerCase();
|
||||
|
|
|
@ -1,25 +1,33 @@
|
|||
package org.hl7.fhir.utilities.tests;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.hl7.fhir.utilities.TextFile;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.hl7.fhir.utilities.TextFile;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
|
||||
public class BaseTestingUtilities {
|
||||
|
||||
static public boolean silent;
|
||||
|
||||
public static String loadTestResource(String... paths) throws IOException {
|
||||
/**
|
||||
* This 'if' condition checks to see if the fhir-test-cases project (https://github.com/FHIR/fhir-test-cases) is
|
||||
* installed locally at the same directory level as the core library project is. If so, the test case data is read
|
||||
* directly from that project, instead of the imported maven dependency jar. It is important, that if you want to
|
||||
* test against the dependency imported from sonatype nexus, instead of your local copy, you need to either change
|
||||
* the name of the project directory to something other than 'fhir-test-cases', or move it to another location, not
|
||||
* at the same directory level as the core project.
|
||||
*/
|
||||
if (new File("../../fhir-test-cases").exists() && isTryToLoadFromFileSystem()) {
|
||||
String n = Utilities.path(System.getProperty("user.dir"), "..", "..", "fhir-test-cases", Utilities.path(paths));
|
||||
// ok, we'll resolve this locally
|
||||
return TextFile.fileToString(new File(n));
|
||||
} else {
|
||||
// resolve from the package
|
||||
// resolve from the package
|
||||
String contents;
|
||||
String classpath = ("/org/hl7/fhir/testcases/" + Utilities.pathURL(paths));
|
||||
try (InputStream inputStream = BaseTestingUtilities.class.getResourceAsStream(classpath)) {
|
||||
|
@ -81,4 +89,4 @@ public class BaseTestingUtilities {
|
|||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -1,33 +1,33 @@
|
|||
package org.hl7.fhir.utilities.xhtml;
|
||||
|
||||
/*
|
||||
Copyright (c) 2011+, HL7, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* 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
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
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
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
/*
|
||||
Copyright (c) 2011+, HL7, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* 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
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
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
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
@ -863,6 +863,9 @@ public class HierarchicalTableGenerator extends TranslatingUtilities {
|
|||
b.append(".png");
|
||||
String file = Utilities.path(dest, b.toString());
|
||||
if (!new File(file).exists()) {
|
||||
File newFile = new File(file);
|
||||
newFile.getParentFile().mkdirs();
|
||||
newFile.createNewFile();
|
||||
FileOutputStream stream = new FileOutputStream(file);
|
||||
genImage(indents, hasChildren, lineColor, stream);
|
||||
if (outputTracker!=null)
|
||||
|
@ -917,4 +920,12 @@ public class HierarchicalTableGenerator extends TranslatingUtilities {
|
|||
if (!check)
|
||||
throw new FHIRException(message);
|
||||
}
|
||||
|
||||
public void emptyRow(TableModel model, int cellCount) {
|
||||
Row r = new Row();
|
||||
model.rows.add(r);
|
||||
for (int i = 0; i < cellCount; i++) {
|
||||
r.getCells().add(new Cell());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,33 +1,33 @@
|
|||
package org.hl7.fhir.utilities.xhtml;
|
||||
|
||||
/*
|
||||
Copyright (c) 2011+, HL7, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* 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
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
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
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
/*
|
||||
Copyright (c) 2011+, HL7, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* 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
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
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
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
@ -188,9 +188,6 @@ public class XhtmlNode implements IBaseXhtml {
|
|||
return node;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public XhtmlNode addText(String content)
|
||||
{
|
||||
if (!(nodeType == NodeType.Element || nodeType == NodeType.Document))
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>org.hl7.fhir.core</artifactId>
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import org.hl7.fhir.r5.formats.IParser;
|
|||
import org.hl7.fhir.r5.formats.JsonParser;
|
||||
import org.hl7.fhir.r5.formats.XmlParser;
|
||||
import org.hl7.fhir.r5.model.*;
|
||||
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||
import org.hl7.fhir.utilities.TextFile;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
|
@ -123,6 +124,16 @@ public class ValidationService {
|
|||
if (cliContext.getMap() == null)
|
||||
throw new Exception("Must provide a map when doing a transform");
|
||||
try {
|
||||
List<StructureDefinition> structures = validator.getContext().allStructures();
|
||||
for (StructureDefinition sd : structures) {
|
||||
if (!sd.hasSnapshot()) {
|
||||
if (sd.getKind()!=null && sd.getKind() == StructureDefinitionKind.LOGICAL) {
|
||||
validator.getContext().generateSnapshot(sd, true);
|
||||
} else {
|
||||
validator.getContext().generateSnapshot(sd, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
validator.setMapLog(cliContext.getMapLog());
|
||||
org.hl7.fhir.r5.elementmodel.Element r = validator.transform(cliContext.getSources().get(0), cliContext.getMap());
|
||||
System.out.println(" ...success");
|
||||
|
|
4
pom.xml
4
pom.xml
|
@ -13,11 +13,11 @@
|
|||
each other. It is fine to bump the point version of this POM without affecting
|
||||
HAPI FHIR.
|
||||
-->
|
||||
<version>5.0.5-SNAPSHOT</version>
|
||||
<version>5.0.6-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<hapi_fhir_version>5.0.0</hapi_fhir_version>
|
||||
<validator_test_case_version>1.1.17</validator_test_case_version>
|
||||
<validator_test_case_version>1.1.18-SNAPSHOT</validator_test_case_version>
|
||||
<junit_jupiter_version>5.6.2</junit_jupiter_version>
|
||||
<maven_surefire_version>3.0.0-M4</maven_surefire_version>
|
||||
<jacoco_version>0.8.5</jacoco_version>
|
||||
|
|
|
@ -6,6 +6,11 @@ title: FHIR Validator Release Notes
|
|||
|
||||
## Current (not released yet)
|
||||
|
||||
(no changes yet)
|
||||
|
||||
## v5.0.6 (2020-06-01)
|
||||
|
||||
|
||||
(no changes yet)
|
||||
|
||||
## v5.0.5 (2020-05-30)
|
||||
|
@ -215,4 +220,4 @@ title: FHIR Validator Release Notes
|
|||
|
||||
## v4.1.60 (2020-02-02)
|
||||
|
||||
* Th
|
||||
* T
|
|
@ -1,7 +1,7 @@
|
|||
@echo off
|
||||
|
||||
set oldver=5.0.4
|
||||
set newver=5.0.5
|
||||
set oldver=5.0.5
|
||||
set newver=5.0.6
|
||||
|
||||
echo ..
|
||||
echo =========================================================================
|
||||
|
|
Loading…
Reference in New Issue