fix for questionnaire evaluation bug
This commit is contained in:
parent
a96c12899b
commit
b0260fbfd8
|
@ -145,7 +145,7 @@ public class DefaultEnableWhenEvaluator implements IEnableWhenEvaluator {
|
||||||
return result > 0;
|
return result > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new UnprocessableEntityException("Bad operator for PrimitiveType comparison");
|
throw new UnprocessableEntityException("Bad operator for PrimitiveType comparison: "+questionnaireItemOperator.toCode());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ public class DefaultEnableWhenEvaluator implements IEnableWhenEvaluator {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
private List<Element> findSubItems(Element item) {
|
private List<Element> findSubItems(Element item) {
|
||||||
List<Element> results = item.getChildren(LINKID_ELEMENT)
|
List<Element> results = item.getChildren(ITEM_ELEMENT)
|
||||||
.stream()
|
.stream()
|
||||||
.flatMap(i -> findSubItems(i).stream())
|
.flatMap(i -> findSubItems(i).stream())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
|
@ -2955,7 +2955,7 @@ private boolean isAnswerRequirementFulfilled(QuestionnaireItemComponent qItem, L
|
||||||
for (QuestionnaireItemComponent qItem : qItems) {
|
for (QuestionnaireItemComponent qItem : qItems) {
|
||||||
List<Element> mapItem = map.get(qItem.getLinkId());
|
List<Element> mapItem = map.get(qItem.getLinkId());
|
||||||
if (mapItem != null){
|
if (mapItem != null){
|
||||||
rule(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), myEnableWhenEvaluator.isQuestionEnabled(qItem, questionnaireResponseRoot), "Item has answer, even though it is not enabled "+qItem.getLinkId());
|
rule(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), myEnableWhenEvaluator.isQuestionEnabled(qItem, questionnaireResponseRoot), "Item has answer, even though it is not enabled (item id = '"+qItem.getLinkId()+"')");
|
||||||
validateQuestionannaireResponseItem(qsrc, qItem, errors, mapItem, stack, inProgress, questionnaireResponseRoot);
|
validateQuestionannaireResponseItem(qsrc, qItem, errors, mapItem, stack, inProgress, questionnaireResponseRoot);
|
||||||
} else {
|
} else {
|
||||||
//item is missing, is the question enabled?
|
//item is missing, is the question enabled?
|
||||||
|
|
|
@ -87,6 +87,7 @@ public class ValidationTestSuite implements IEvaluationContext, IValidatorResour
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private JsonObject content;
|
private JsonObject content;
|
||||||
|
private static String veVersion;
|
||||||
|
|
||||||
public ValidationTestSuite(String name, JsonObject content) {
|
public ValidationTestSuite(String name, JsonObject content) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -100,10 +101,24 @@ public class ValidationTestSuite implements IEvaluationContext, IValidatorResour
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
if (ve == null) {
|
String v = "5.0";
|
||||||
ve = new ValidationEngine("hl7.fhir.core#4.0.0", DEF_TX, null, FhirPublication.R4);
|
if (content.has("version"))
|
||||||
|
v = content.get("version").getAsString();
|
||||||
|
|
||||||
|
if (ve == null || !v.equals(veVersion)) {
|
||||||
|
if (v.equals("5.0"))
|
||||||
|
ve = new ValidationEngine("hl7.fhir.core#4.1.0", DEF_TX, null, FhirPublication.R5);
|
||||||
|
else if (v.equals("3.0"))
|
||||||
|
ve = new ValidationEngine("hl7.fhir.core#3.0.1", DEF_TX, null, FhirPublication.STU3);
|
||||||
|
else if (v.equals("4.0"))
|
||||||
|
ve = new ValidationEngine("hl7.fhir.core#4.0.0", DEF_TX, null, FhirPublication.R4);
|
||||||
|
else if (v.equals("1.0"))
|
||||||
|
ve = new ValidationEngine("hl7.fhir.core#1.0.2", DEF_TX, null, FhirPublication.DSTU2);
|
||||||
|
else
|
||||||
|
throw new Exception("unknown version "+v);
|
||||||
ve.getContext().setCanRunWithoutTerminology(true);
|
ve.getContext().setCanRunWithoutTerminology(true);
|
||||||
TestingUtilities.fcontext = ve.getContext();
|
TestingUtilities.fcontext = ve.getContext();
|
||||||
|
veVersion = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.has("use-test") && !content.get("use-test").getAsBoolean())
|
if (content.has("use-test") && !content.get("use-test").getAsBoolean())
|
||||||
|
@ -115,13 +130,13 @@ public class ValidationTestSuite implements IEvaluationContext, IValidatorResour
|
||||||
val.getExtensionDomains().add(content.get("allowed-extension-domain").getAsString());
|
val.getExtensionDomains().add(content.get("allowed-extension-domain").getAsString());
|
||||||
val.setFetcher(this);
|
val.setFetcher(this);
|
||||||
if (content.has("questionnaire")) {
|
if (content.has("questionnaire")) {
|
||||||
ve.getContext().cacheResource(new XmlParser().parse(new FileInputStream(TestUtilities.resourceNameToFile("validation-examples", content.get("questionnaire").getAsString()))));
|
ve.getContext().cacheResource(loadResource(TestUtilities.resourceNameToFile("validation-examples", content.get("questionnaire").getAsString()), v));
|
||||||
}
|
}
|
||||||
if (content.has("profiles")) {
|
if (content.has("profiles")) {
|
||||||
for (JsonElement je : content.getAsJsonArray("profiles")) {
|
for (JsonElement je : content.getAsJsonArray("profiles")) {
|
||||||
String p = je.getAsString();
|
String p = je.getAsString();
|
||||||
String filename = TestUtilities.resourceNameToFile("validation-examples", p);
|
String filename = TestUtilities.resourceNameToFile("validation-examples", p);
|
||||||
StructureDefinition sd = loadProfile(filename, Constants.VERSION);
|
StructureDefinition sd = loadProfile(filename, v);
|
||||||
val.getContext().cacheResource(sd);
|
val.getContext().cacheResource(sd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,7 +150,7 @@ public class ValidationTestSuite implements IEvaluationContext, IValidatorResour
|
||||||
List<ValidationMessage> errorsProfile = new ArrayList<ValidationMessage>();
|
List<ValidationMessage> errorsProfile = new ArrayList<ValidationMessage>();
|
||||||
JsonObject profile = content.getAsJsonObject("profile");
|
JsonObject profile = content.getAsJsonObject("profile");
|
||||||
String filename = TestUtilities.resourceNameToFile("validation-examples", profile.get("source").getAsString());
|
String filename = TestUtilities.resourceNameToFile("validation-examples", profile.get("source").getAsString());
|
||||||
String v = content.has("version") ? content.get("version").getAsString() : Constants.VERSION;
|
v = content.has("version") ? content.get("version").getAsString() : Constants.VERSION;
|
||||||
StructureDefinition sd = loadProfile(filename, v);
|
StructureDefinition sd = loadProfile(filename, v);
|
||||||
if (name.startsWith("Json."))
|
if (name.startsWith("Json."))
|
||||||
val.validate(null, errorsProfile, new FileInputStream(path), FhirFormat.JSON, sd);
|
val.validate(null, errorsProfile, new FileInputStream(path), FhirFormat.JSON, sd);
|
||||||
|
@ -145,19 +160,8 @@ public class ValidationTestSuite implements IEvaluationContext, IValidatorResour
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public StructureDefinition loadProfile(String filename, String v)
|
public StructureDefinition loadProfile(String filename, String v) throws IOException, FHIRFormatError, FileNotFoundException, FHIRException, DefinitionException {
|
||||||
throws IOException, FHIRFormatError, FileNotFoundException, FHIRException, DefinitionException {
|
StructureDefinition sd = (StructureDefinition) loadResource(filename, v);
|
||||||
StructureDefinition sd = null;
|
|
||||||
if (Constants.VERSION.equals(v))
|
|
||||||
sd = (StructureDefinition) new XmlParser().parse(new FileInputStream(filename));
|
|
||||||
else if (org.hl7.fhir.dstu3.model.Constants.VERSION.equals(v))
|
|
||||||
sd = (StructureDefinition) VersionConvertor_30_50.convertResource(new org.hl7.fhir.dstu3.formats.XmlParser().parse(new FileInputStream(filename)), false);
|
|
||||||
else if (org.hl7.fhir.dstu2016may.model.Constants.VERSION.equals(v))
|
|
||||||
sd = (StructureDefinition) VersionConvertor_14_50.convertResource(new org.hl7.fhir.dstu2016may.formats.XmlParser().parse(new FileInputStream(filename)));
|
|
||||||
else if (org.hl7.fhir.dstu2.model.Constants.VERSION.equals(v))
|
|
||||||
sd = (StructureDefinition) new VersionConvertor_10_50(null).convertResource(new org.hl7.fhir.dstu2.formats.XmlParser().parse(new FileInputStream(filename)));
|
|
||||||
else if (org.hl7.fhir.r4.model.Constants.VERSION.equals(v))
|
|
||||||
sd = (StructureDefinition) VersionConvertor_40_50.convertResource(new org.hl7.fhir.r4.formats.XmlParser().parse(new FileInputStream(filename)));
|
|
||||||
if (!sd.hasSnapshot()) {
|
if (!sd.hasSnapshot()) {
|
||||||
ProfileUtilities pu = new ProfileUtilities(TestingUtilities.context(), null, null);
|
ProfileUtilities pu = new ProfileUtilities(TestingUtilities.context(), null, null);
|
||||||
StructureDefinition base = TestingUtilities.context().fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
StructureDefinition base = TestingUtilities.context().fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
||||||
|
@ -166,6 +170,21 @@ public class ValidationTestSuite implements IEvaluationContext, IValidatorResour
|
||||||
}
|
}
|
||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Resource loadResource(String filename, String v) throws IOException, FHIRFormatError, FileNotFoundException, FHIRException, DefinitionException {
|
||||||
|
if (Constants.VERSION.equals(v) || "5.0".equals(v))
|
||||||
|
return new XmlParser().parse(new FileInputStream(filename));
|
||||||
|
else if (org.hl7.fhir.dstu3.model.Constants.VERSION.equals(v) || "3.0".equals(v))
|
||||||
|
return VersionConvertor_30_50.convertResource(new org.hl7.fhir.dstu3.formats.XmlParser().parse(new FileInputStream(filename)), false);
|
||||||
|
else if (org.hl7.fhir.dstu2016may.model.Constants.VERSION.equals(v) || "1.4".equals(v))
|
||||||
|
return VersionConvertor_14_50.convertResource(new org.hl7.fhir.dstu2016may.formats.XmlParser().parse(new FileInputStream(filename)));
|
||||||
|
else if (org.hl7.fhir.dstu2.model.Constants.VERSION.equals(v) || "1.0".equals(v))
|
||||||
|
return new VersionConvertor_10_50(null).convertResource(new org.hl7.fhir.dstu2.formats.XmlParser().parse(new FileInputStream(filename)));
|
||||||
|
else if (org.hl7.fhir.r4.model.Constants.VERSION.equals(v) || "4.0".equals(v))
|
||||||
|
return VersionConvertor_40_50.convertResource(new org.hl7.fhir.r4.formats.XmlParser().parse(new FileInputStream(filename)));
|
||||||
|
else
|
||||||
|
throw new FHIRException("unknown version "+v);
|
||||||
|
}
|
||||||
|
|
||||||
private void checkOutcomes(List<ValidationMessage> errors, JsonObject focus) {
|
private void checkOutcomes(List<ValidationMessage> errors, JsonObject focus) {
|
||||||
int ec = 0;
|
int ec = 0;
|
||||||
|
|
|
@ -331,7 +331,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"uk-nhs-pat.xml" : {
|
"uk-nhs-pat.xml" : {
|
||||||
"version" : "1.0.2",
|
"version" : "1.0",
|
||||||
"use-test" : false,
|
"use-test" : false,
|
||||||
"allowed-extension-domain" : "http://hl7.org/fhir/ccda/StructureDefinition/",
|
"allowed-extension-domain" : "http://hl7.org/fhir/ccda/StructureDefinition/",
|
||||||
"errorCount": 0,
|
"errorCount": 0,
|
||||||
|
@ -451,6 +451,15 @@
|
||||||
"source" : "slice-profile-and-local-profile.xml",
|
"source" : "slice-profile-and-local-profile.xml",
|
||||||
"errorCount": 0
|
"errorCount": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"questionnaireResponse-enableWhen-test.xml" : {
|
||||||
|
"questionnaire" : "questionnaire-enableWhen-test.xml",
|
||||||
|
"errorCount": 0
|
||||||
|
},
|
||||||
|
"questionnaireResponse-enableWhen-test3.xml" : {
|
||||||
|
"version" : "3.0",
|
||||||
|
"questionnaire" : "questionnaire-enableWhen-test3.xml",
|
||||||
|
"errorCount": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Questionnaire xmlns="http://hl7.org/fhir">
|
||||||
|
<id value="questionnaire-enableWhen-test" />
|
||||||
|
<language value="en-US" />
|
||||||
|
<text>
|
||||||
|
<status value="generated" />
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
||||||
|
<p>enableWhen test</p>
|
||||||
|
</div>
|
||||||
|
</text>
|
||||||
|
<url value="http://hl7.org/fhir/us/hai/Questionnaire/questionnaire-enableWhen-test" />
|
||||||
|
<status value="draft" />
|
||||||
|
<item>
|
||||||
|
<linkId value="condition" />
|
||||||
|
<text value="condition" />
|
||||||
|
<type value="boolean" />
|
||||||
|
<required value="true" />
|
||||||
|
<repeats value="false" />
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<linkId value="enable-when" />
|
||||||
|
<text value="enable when condition true" />
|
||||||
|
<type value="boolean" />
|
||||||
|
<enableWhen>
|
||||||
|
<question value="condition" />
|
||||||
|
<operator value="="/>
|
||||||
|
<answerBoolean value="true" />
|
||||||
|
</enableWhen>
|
||||||
|
<required value="true" />
|
||||||
|
<repeats value="false" />
|
||||||
|
</item>
|
||||||
|
</Questionnaire>
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Questionnaire xmlns="http://hl7.org/fhir">
|
||||||
|
<id value="questionnaire-enableWhen-test" />
|
||||||
|
<language value="en-US" />
|
||||||
|
<text>
|
||||||
|
<status value="generated" />
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
||||||
|
<p>enableWhen test</p>
|
||||||
|
</div>
|
||||||
|
</text>
|
||||||
|
<url value="http://hl7.org/fhir/us/hai/Questionnaire/questionnaire-enableWhen-test" />
|
||||||
|
<status value="draft" />
|
||||||
|
<item>
|
||||||
|
<linkId value="condition" />
|
||||||
|
<text value="condition" />
|
||||||
|
<type value="boolean" />
|
||||||
|
<required value="true" />
|
||||||
|
<repeats value="false" />
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<linkId value="enable-when" />
|
||||||
|
<text value="enable when condition true" />
|
||||||
|
<type value="boolean" />
|
||||||
|
<enableWhen>
|
||||||
|
<question value="condition" />
|
||||||
|
<answerBoolean value="true" />
|
||||||
|
</enableWhen>
|
||||||
|
<required value="true" />
|
||||||
|
<repeats value="false" />
|
||||||
|
</item>
|
||||||
|
</Questionnaire>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<QuestionnaireResponse xmlns="http://hl7.org/fhir">
|
||||||
|
<id value="questionnaireResponse-enableWhen-test" />
|
||||||
|
<text>
|
||||||
|
<status value="generated" />
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
||||||
|
<p>enableWhen test response</p>
|
||||||
|
</div>
|
||||||
|
</text>
|
||||||
|
<questionnaire value="http://hl7.org/fhir/us/hai/Questionnaire/questionnaire-enableWhen-test" />
|
||||||
|
<status value="completed" />
|
||||||
|
<item>
|
||||||
|
<linkId value="condition" />
|
||||||
|
<text value="condition" />
|
||||||
|
<answer>
|
||||||
|
<valueBoolean value="true" />
|
||||||
|
</answer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<linkId value="enable-when" />
|
||||||
|
<text value="enable when condition true" />
|
||||||
|
<answer>
|
||||||
|
<valueBoolean value="false" />
|
||||||
|
</answer>
|
||||||
|
</item>
|
||||||
|
</QuestionnaireResponse>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<QuestionnaireResponse xmlns="http://hl7.org/fhir">
|
||||||
|
<id value="questionnaireResponse-enableWhen-test" />
|
||||||
|
<text>
|
||||||
|
<status value="generated" />
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
||||||
|
<p>enableWhen test response</p>
|
||||||
|
</div>
|
||||||
|
</text>
|
||||||
|
<questionnaire>
|
||||||
|
<reference value="http://hl7.org/fhir/us/hai/Questionnaire/questionnaire-enableWhen-test" />
|
||||||
|
</questionnaire>
|
||||||
|
<status value="completed" />
|
||||||
|
<item>
|
||||||
|
<linkId value="condition" />
|
||||||
|
<text value="condition" />
|
||||||
|
<answer>
|
||||||
|
<valueBoolean value="true" />
|
||||||
|
</answer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<linkId value="enable-when" />
|
||||||
|
<text value="enable when condition true" />
|
||||||
|
<answer>
|
||||||
|
<valueBoolean value="false" />
|
||||||
|
</answer>
|
||||||
|
</item>
|
||||||
|
</QuestionnaireResponse>
|
|
@ -0,0 +1,45 @@
|
||||||
|
REM replace versions before running
|
||||||
|
REM make sure you are committed
|
||||||
|
|
||||||
|
echo ===============================================================
|
||||||
|
echo upgrade and release fhir.core from 3.7.15-SNAPSHOT to 3.7.16-SNAPSHOT
|
||||||
|
echo ===============================================================
|
||||||
|
pause
|
||||||
|
|
||||||
|
call mvn versions:set -DnewVersion=3.7.16-SNAPSHOT
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo ===============================================================
|
||||||
|
echo upgraded version number using maven
|
||||||
|
echo next: do git commit / push
|
||||||
|
echo ===============================================================
|
||||||
|
pause
|
||||||
|
|
||||||
|
call git commit -a -m "Release new version"
|
||||||
|
call git push origin master
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo ===============================================================
|
||||||
|
echo done git commit / push
|
||||||
|
echo next: replace references in java code + ivy
|
||||||
|
echo ===============================================================
|
||||||
|
pause
|
||||||
|
|
||||||
|
call "C:\tools\fnr.exe" --cl --dir "C:\work\org.hl7.fhir\build" --fileMask "*.java" --excludeFileMask "*.dll, *.exe" --includeSubDirectories --find "3.7.15-SNAPSHOT" --replace "3.7.16-SNAPSHOT"
|
||||||
|
call "C:\tools\fnr.exe" --cl --dir "C:\work\org.hl7.fhir\build" --fileMask "*.xml" --excludeFileMask "*.dll, *.exe" --find "3.7.15-SNAPSHOT" --replace "3.7.16-SNAPSHOT"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo ===============================================================
|
||||||
|
echo done replacing references
|
||||||
|
echo next: do maven release
|
||||||
|
echo ===============================================================
|
||||||
|
pause
|
||||||
|
|
||||||
|
call mvn deploy
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo ===============================================================
|
||||||
|
echo all done
|
||||||
|
echo ===============================================================
|
||||||
|
pause
|
||||||
|
|
Loading…
Reference in New Issue