Merge branch 'master' into i18n
This commit is contained in:
commit
5be8bc9f74
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -2685,38 +2685,33 @@ public class VersionConvertor_10_30 {
|
||||||
return null;
|
return null;
|
||||||
org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.Enumerations.SearchParamType> tgt = new org.hl7.fhir.dstu3.model.Enumeration<>(new org.hl7.fhir.dstu3.model.Enumerations.SearchParamTypeEnumFactory());
|
org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.Enumerations.SearchParamType> tgt = new org.hl7.fhir.dstu3.model.Enumeration<>(new org.hl7.fhir.dstu3.model.Enumerations.SearchParamTypeEnumFactory());
|
||||||
VersionConvertor_10_30.copyElement(src, tgt);
|
VersionConvertor_10_30.copyElement(src, tgt);
|
||||||
switch(src.getValue()) {
|
tgt.setValue(convertSearchParamType(src.getValue()));
|
||||||
case NUMBER:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.NUMBER);
|
|
||||||
break;
|
|
||||||
case DATE:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.DATE);
|
|
||||||
break;
|
|
||||||
case STRING:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.STRING);
|
|
||||||
break;
|
|
||||||
case TOKEN:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.TOKEN);
|
|
||||||
break;
|
|
||||||
case REFERENCE:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.REFERENCE);
|
|
||||||
break;
|
|
||||||
case COMPOSITE:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.COMPOSITE);
|
|
||||||
break;
|
|
||||||
case QUANTITY:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.QUANTITY);
|
|
||||||
break;
|
|
||||||
case URI:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.URI);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return tgt;
|
return tgt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public org.hl7.fhir.dstu3.model.Enumerations.SearchParamType convertSearchParamType(org.hl7.fhir.dstu2.model.Enumerations.SearchParamType src) throws FHIRException {
|
||||||
|
switch(src) {
|
||||||
|
case NUMBER:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.NUMBER;
|
||||||
|
case DATE:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.DATE;
|
||||||
|
case STRING:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.STRING;
|
||||||
|
case TOKEN:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.TOKEN;
|
||||||
|
case REFERENCE:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.REFERENCE;
|
||||||
|
case COMPOSITE:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.COMPOSITE;
|
||||||
|
case QUANTITY:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.QUANTITY;
|
||||||
|
case URI:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.URI;
|
||||||
|
default:
|
||||||
|
return org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static public org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.Enumerations.SearchParamType> convertSearchParamType(org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.Enumerations.SearchParamType> src) throws FHIRException {
|
static public org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.Enumerations.SearchParamType> convertSearchParamType(org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.Enumerations.SearchParamType> src) throws FHIRException {
|
||||||
if (src == null || src.isEmpty())
|
if (src == null || src.isEmpty())
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -105,29 +105,27 @@ public class SearchParameter10_30 {
|
||||||
return null;
|
return null;
|
||||||
org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType> tgt = new org.hl7.fhir.dstu2.model.Enumeration<>(new org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageTypeEnumFactory());
|
org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType> tgt = new org.hl7.fhir.dstu2.model.Enumeration<>(new org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageTypeEnumFactory());
|
||||||
VersionConvertor_10_30.copyElement(src, tgt);
|
VersionConvertor_10_30.copyElement(src, tgt);
|
||||||
switch(src.getValue()) {
|
tgt.setValue(convertXPathUsageType(src.getValue()));
|
||||||
case NORMAL:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.NORMAL);
|
|
||||||
break;
|
|
||||||
case PHONETIC:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.PHONETIC);
|
|
||||||
break;
|
|
||||||
case NEARBY:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.NEARBY);
|
|
||||||
break;
|
|
||||||
case DISTANCE:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.DISTANCE);
|
|
||||||
break;
|
|
||||||
case OTHER:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.OTHER);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
tgt.setValue(org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return tgt;
|
return tgt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType convertXPathUsageType(org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType src) throws FHIRException {
|
||||||
|
switch(src) {
|
||||||
|
case NORMAL:
|
||||||
|
return org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.NORMAL;
|
||||||
|
case PHONETIC:
|
||||||
|
return org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.PHONETIC;
|
||||||
|
case NEARBY:
|
||||||
|
return org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.NEARBY;
|
||||||
|
case DISTANCE:
|
||||||
|
return org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.DISTANCE;
|
||||||
|
case OTHER:
|
||||||
|
return org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.OTHER;
|
||||||
|
default:
|
||||||
|
return org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType.NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static public org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType> convertXPathUsageType(org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType> src) throws FHIRException {
|
static public org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType> convertXPathUsageType(org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType> src) throws FHIRException {
|
||||||
if (src == null || src.isEmpty())
|
if (src == null || src.isEmpty())
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -105,29 +105,27 @@ public class SearchParameter10_40 {
|
||||||
return null;
|
return null;
|
||||||
org.hl7.fhir.r4.model.Enumeration<org.hl7.fhir.r4.model.SearchParameter.XPathUsageType> tgt = new org.hl7.fhir.r4.model.Enumeration<>(new org.hl7.fhir.r4.model.SearchParameter.XPathUsageTypeEnumFactory());
|
org.hl7.fhir.r4.model.Enumeration<org.hl7.fhir.r4.model.SearchParameter.XPathUsageType> tgt = new org.hl7.fhir.r4.model.Enumeration<>(new org.hl7.fhir.r4.model.SearchParameter.XPathUsageTypeEnumFactory());
|
||||||
VersionConvertor_10_40.copyElement(src, tgt);
|
VersionConvertor_10_40.copyElement(src, tgt);
|
||||||
switch(src.getValue()) {
|
tgt.setValue(convertXPathUsageType(src.getValue()));
|
||||||
case NORMAL:
|
|
||||||
tgt.setValue(org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.NORMAL);
|
|
||||||
break;
|
|
||||||
case PHONETIC:
|
|
||||||
tgt.setValue(org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.PHONETIC);
|
|
||||||
break;
|
|
||||||
case NEARBY:
|
|
||||||
tgt.setValue(org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.NEARBY);
|
|
||||||
break;
|
|
||||||
case DISTANCE:
|
|
||||||
tgt.setValue(org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.DISTANCE);
|
|
||||||
break;
|
|
||||||
case OTHER:
|
|
||||||
tgt.setValue(org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.OTHER);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
tgt.setValue(org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return tgt;
|
return tgt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public org.hl7.fhir.r4.model.SearchParameter.XPathUsageType convertXPathUsageType(org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType src) {
|
||||||
|
switch(src) {
|
||||||
|
case NORMAL:
|
||||||
|
return org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.NORMAL;
|
||||||
|
case PHONETIC:
|
||||||
|
return org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.PHONETIC;
|
||||||
|
case NEARBY:
|
||||||
|
return org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.NEARBY;
|
||||||
|
case DISTANCE:
|
||||||
|
return org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.DISTANCE;
|
||||||
|
case OTHER:
|
||||||
|
return org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.OTHER;
|
||||||
|
default:
|
||||||
|
return org.hl7.fhir.r4.model.SearchParameter.XPathUsageType.NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static public org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType> convertXPathUsageType(org.hl7.fhir.r4.model.Enumeration<org.hl7.fhir.r4.model.SearchParameter.XPathUsageType> src) throws FHIRException {
|
static public org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.SearchParameter.XPathUsageType> convertXPathUsageType(org.hl7.fhir.r4.model.Enumeration<org.hl7.fhir.r4.model.SearchParameter.XPathUsageType> src) throws FHIRException {
|
||||||
if (src == null || src.isEmpty())
|
if (src == null || src.isEmpty())
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -758,7 +758,11 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public <T extends Resource> T fetchResourceWithException(Class<T> class_, String uri) throws FHIRException {
|
public <T extends Resource> T fetchResourceWithException(Class<T> class_, String uri) throws FHIRException {
|
||||||
if (class_ == StructureDefinition.class)
|
if (uri == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (class_ == StructureDefinition.class)
|
||||||
uri = ProfileUtilities.sdNs(uri, getOverrideVersionNs());
|
uri = ProfileUtilities.sdNs(uri, getOverrideVersionNs());
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
|
|
||||||
|
|
|
@ -3334,10 +3334,12 @@ public class FHIRPathEngine {
|
||||||
Base res = null;
|
Base res = null;
|
||||||
if (s.startsWith("#")) {
|
if (s.startsWith("#")) {
|
||||||
Property p = context.rootResource.getChildByName("contained");
|
Property p = context.rootResource.getChildByName("contained");
|
||||||
for (Base c : p.getValues()) {
|
if (p != null) {
|
||||||
if (chompHash(s).equals(chompHash(c.getIdBase()))) {
|
for (Base c : p.getValues()) {
|
||||||
res = c;
|
if (chompHash(s).equals(chompHash(c.getIdBase()))) {
|
||||||
break;
|
res = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (hostServices != null) {
|
} else if (hostServices != null) {
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -219,9 +219,9 @@ public class NpmPackage {
|
||||||
}
|
}
|
||||||
loadSubFolders(res, dir.getAbsolutePath(), f);
|
loadSubFolders(res, dir.getAbsolutePath(), f);
|
||||||
} else {
|
} else {
|
||||||
NpmPackageFolder folder = res.new NpmPackageFolder("package/$root");
|
NpmPackageFolder folder = res.new NpmPackageFolder(Utilities.path("package", "$root"));
|
||||||
folder.folder = dir;
|
folder.folder = dir;
|
||||||
res.folders.put("package/$root", folder);
|
res.folders.put(Utilities.path("package", "$root"), folder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,9 @@ public class PackageClient {
|
||||||
this.fhirVersion = fhirVersion;
|
this.fhirVersion = fhirVersion;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
|
if (url == null && id != null && version != null) {
|
||||||
|
url = Utilities.pathURL(address, id, version);
|
||||||
|
}
|
||||||
this.canonical = canonical;
|
this.canonical = canonical;
|
||||||
}
|
}
|
||||||
public String getId() {
|
public String getId() {
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@
|
||||||
<archive>
|
<archive>
|
||||||
<manifest>
|
<manifest>
|
||||||
<addClasspath>true</addClasspath>
|
<addClasspath>true</addClasspath>
|
||||||
<mainClass>org.hl7.fhir.r5.validation.Validator</mainClass>
|
<mainClass>org.hl7.fhir.validation.Validator</mainClass>
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
@ -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>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -1,228 +0,0 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* #%L
|
|
||||||
* org.hl7.fhir.validation
|
|
||||||
* %%
|
|
||||||
* Copyright (C) 2014 - 2019 Health Level 7
|
|
||||||
* %%
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
* #L%
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
|
||||||
import org.hl7.fhir.utilities.*;
|
|
||||||
import org.hl7.fhir.utilities.Logger.LogMessageType;
|
|
||||||
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;
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
import org.w3c.dom.ls.LSInput;
|
|
||||||
import org.w3c.dom.ls.LSResourceResolver;
|
|
||||||
import org.xml.sax.ErrorHandler;
|
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
import org.xml.sax.SAXParseException;
|
|
||||||
|
|
||||||
import javax.xml.XMLConstants;
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.stream.StreamSource;
|
|
||||||
import javax.xml.validation.Schema;
|
|
||||||
import javax.xml.validation.SchemaFactory;
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class XmlValidator {
|
|
||||||
|
|
||||||
private Schema schema;
|
|
||||||
private Map<String, byte[]> schemas;
|
|
||||||
private Map<String, byte[]> transforms;
|
|
||||||
private List<ValidationMessage> errors;
|
|
||||||
private Logger logger;
|
|
||||||
|
|
||||||
public XmlValidator(List<ValidationMessage> errors, Map<String, byte[]> schemas, Map<String, byte[]> transforms) throws FileNotFoundException, IOException, SAXException {
|
|
||||||
this.errors = errors;
|
|
||||||
this.schemas = schemas;
|
|
||||||
this.transforms = transforms;
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
public XmlValidator(List<ValidationMessage> validationErrors, String srcDir, String xsltDir, String[] schemaNames) throws FileNotFoundException, IOException, SAXException {
|
|
||||||
loadTransforms(xsltDir);
|
|
||||||
loadSchemas(srcDir, schemaNames);
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void load() throws SAXException {
|
|
||||||
int c = 0;
|
|
||||||
for (String s : schemas.keySet())
|
|
||||||
if (s.endsWith(".xsd"))
|
|
||||||
c++;
|
|
||||||
StreamSource[] sources = new StreamSource[c];
|
|
||||||
int i = 0;
|
|
||||||
for (String s : schemas.keySet()) {
|
|
||||||
if (s.endsWith(".xsd")) {
|
|
||||||
sources[i] = new StreamSource(new ByteArrayInputStream(schemas.get(s)), s);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
|
|
||||||
schemaFactory.setErrorHandler(new MyErrorHandler(errors, null));
|
|
||||||
schemaFactory.setResourceResolver(new MyResourceResolver());
|
|
||||||
schema = schemaFactory.newSchema(sources);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadTransforms(String xsltDir) throws FileNotFoundException, IOException {
|
|
||||||
Map<String, byte[]> res = new HashMap<String, byte[]>();
|
|
||||||
for (String s : new File(xsltDir).list()) {
|
|
||||||
if (s.endsWith(".xslt"))
|
|
||||||
res.put(s, TextFile.fileToBytes(Utilities.path(xsltDir, s)));
|
|
||||||
}
|
|
||||||
this.transforms = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadSchemas(String dir, String[] names) throws FileNotFoundException, IOException {
|
|
||||||
Map<String, byte[]> res = new HashMap<String, byte[]>();
|
|
||||||
for (String s : new File(dir).list()) {
|
|
||||||
if (s.endsWith(".sch"))
|
|
||||||
res.put(s, TextFile.fileToBytes(Utilities.path(dir, s)));
|
|
||||||
boolean ok = false;
|
|
||||||
for (String b : names)
|
|
||||||
ok = ok || b.equals(s);
|
|
||||||
if (ok)
|
|
||||||
res.put(s, TextFile.fileToBytes(Utilities.path(dir, s)));
|
|
||||||
}
|
|
||||||
this.schemas = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Element checkBySchema(String fileToCheck, boolean wantThrow) throws FileNotFoundException, SAXException, IOException, ParserConfigurationException, FHIRException {
|
|
||||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
|
||||||
factory.setNamespaceAware(true);
|
|
||||||
factory.setValidating(false);
|
|
||||||
factory.setSchema(schema);
|
|
||||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
|
||||||
MyErrorHandler err = new MyErrorHandler(errors, fileToCheck);
|
|
||||||
builder.setErrorHandler(err);
|
|
||||||
CSFileInputStream f = new CSFileInputStream(new CSFile(fileToCheck));
|
|
||||||
Document doc = builder.parse(f);
|
|
||||||
if (wantThrow && err.getErrors().size() > 0)
|
|
||||||
throw new FHIRException("File " + fileToCheck + " failed schema validation");
|
|
||||||
return doc.getDocumentElement();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkBySchematron(String filename, String sch, boolean wantThrow) throws IOException, ParserConfigurationException, SAXException, FileNotFoundException, FHIRException {
|
|
||||||
DocumentBuilderFactory factory;
|
|
||||||
DocumentBuilder builder;
|
|
||||||
Document doc;
|
|
||||||
byte[] out = null;
|
|
||||||
try {
|
|
||||||
out = XsltUtilities.saxonTransform(transforms, schemas.get(sch), transforms.get("iso_svrl_for_xslt2.xsl"));
|
|
||||||
out = XsltUtilities.saxonTransform(transforms, TextFile.fileToBytes(filename), out);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
errors.add(new ValidationMessage(Source.InstanceValidator, IssueType.STRUCTURE, -1, -1, filename + ":" + sch, e.getMessage(), IssueSeverity.ERROR));
|
|
||||||
if (wantThrow)
|
|
||||||
throw new FHIRException("Error validating " + filename + " with schematrons", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
factory = DocumentBuilderFactory.newInstance();
|
|
||||||
factory.setNamespaceAware(true);
|
|
||||||
builder = factory.newDocumentBuilder();
|
|
||||||
doc = builder.parse(new ByteArrayInputStream(out));
|
|
||||||
NodeList nl = doc.getDocumentElement().getElementsByTagNameNS("http://purl.oclc.org/dsdl/svrl", "failed-assert");
|
|
||||||
if (nl.getLength() > 0) {
|
|
||||||
logger.log("Schematron Validation Failed for " + filename, LogMessageType.Error);
|
|
||||||
for (int i = 0; i < nl.getLength(); i++) {
|
|
||||||
Element e = (Element) nl.item(i);
|
|
||||||
logger.log(" @" + e.getAttribute("location") + ": " + e.getTextContent(), LogMessageType.Error);
|
|
||||||
errors.add(new ValidationMessage(Source.InstanceValidator, IssueType.STRUCTURE, -1, -1, filename + ":" + e.getAttribute("location"), e.getTextContent(), IssueSeverity.ERROR));
|
|
||||||
}
|
|
||||||
if (wantThrow)
|
|
||||||
throw new FHIRException("Schematron Validation Failed for " + filename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MyErrorHandler implements ErrorHandler {
|
|
||||||
|
|
||||||
private List<String> errors = new ArrayList<String>();
|
|
||||||
private List<ValidationMessage> list;
|
|
||||||
private String path;
|
|
||||||
|
|
||||||
public MyErrorHandler(List<ValidationMessage> list, String path) {
|
|
||||||
this.list = list;
|
|
||||||
this.path = path;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void error(SAXParseException arg0) throws SAXException {
|
|
||||||
if (list != null)
|
|
||||||
list.add(new ValidationMessage(Source.InstanceValidator, IssueType.STRUCTURE, arg0.getLineNumber(), arg0.getColumnNumber(), path == null ? arg0.getSystemId() : path, arg0.getMessage(), IssueSeverity.ERROR));
|
|
||||||
if (logger != null)
|
|
||||||
logger.log("error: " + arg0.toString(), LogMessageType.Error);
|
|
||||||
errors.add(arg0.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fatalError(SAXParseException arg0) throws SAXException {
|
|
||||||
if (list != null)
|
|
||||||
list.add(new ValidationMessage(Source.InstanceValidator, IssueType.STRUCTURE, arg0.getLineNumber(), arg0.getColumnNumber(), path == null ? arg0.getSystemId() : path, arg0.getMessage(), IssueSeverity.FATAL));
|
|
||||||
if (logger != null)
|
|
||||||
logger.log("fatal error: " + arg0.toString(), LogMessageType.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void warning(SAXParseException arg0) throws SAXException {
|
|
||||||
if (list != null)
|
|
||||||
list.add(new ValidationMessage(Source.InstanceValidator, IssueType.STRUCTURE, arg0.getLineNumber(), arg0.getColumnNumber(), path == null ? arg0.getSystemId() : path, arg0.getMessage(), IssueSeverity.WARNING));
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> getErrors() {
|
|
||||||
return errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPath() {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPath(String path) {
|
|
||||||
this.path = path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MyResourceResolver implements LSResourceResolver {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LSInput resolveResource(final String type, final String namespaceURI, final String publicId, String systemId, final String baseURI) {
|
|
||||||
try {
|
|
||||||
if (!schemas.containsKey(systemId))
|
|
||||||
return null;
|
|
||||||
return new SchemaInputSource(new ByteArrayInputStream(schemas.get(systemId)), publicId, systemId, namespaceURI);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation;
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* #%L
|
* #%L
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation;
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -67,7 +67,7 @@ import com.google.gson.JsonObject;
|
||||||
* This class allows you to host the java validator in another service, and use the services it has in a wider context. The way it works is
|
* This class allows you to host the java validator in another service, and use the services it has in a wider context. The way it works is
|
||||||
|
|
||||||
- put the jar in your class path
|
- put the jar in your class path
|
||||||
- Find the class org.hl7.fhir.r5.validation.NativeHostServices or org.hl7.fhir.dstu3.validation.NativeHostServices
|
- Find the class org.hl7.fhir.validation.NativeHostServices
|
||||||
- call init(path) where path refers to one of the definitions files from the main build (e.g. definitions.xml.zip) - required, do only once, do before anything else
|
- call init(path) where path refers to one of the definitions files from the main build (e.g. definitions.xml.zip) - required, do only once, do before anything else
|
||||||
- call load(path) where path refers to the igpack.zip produced by the ig publisher (do this once for each IG you care about)
|
- call load(path) where path refers to the igpack.zip produced by the ig publisher (do this once for each IG you care about)
|
||||||
- call connectToTxSvc(url) where the url is your terminology service of choice (can be http://tx.fhir.org/r4 or /r3)
|
- call connectToTxSvc(url) where the url is your terminology service of choice (can be http://tx.fhir.org/r4 or /r3)
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.hl7.fhir.convertors.*;
|
import org.hl7.fhir.convertors.*;
|
||||||
|
@ -22,7 +22,7 @@ import org.hl7.fhir.r5.terminologies.ConceptMapEngine;
|
||||||
import org.hl7.fhir.r5.utils.*;
|
import org.hl7.fhir.r5.utils.*;
|
||||||
import org.hl7.fhir.r5.utils.IResourceValidator.*;
|
import org.hl7.fhir.r5.utils.IResourceValidator.*;
|
||||||
import org.hl7.fhir.r5.utils.StructureMapUtilities.ITransformerServices;
|
import org.hl7.fhir.r5.utils.StructureMapUtilities.ITransformerServices;
|
||||||
import org.hl7.fhir.r5.validation.instancevalidator.InstanceValidator;
|
import org.hl7.fhir.validation.instance.InstanceValidator;
|
||||||
import org.hl7.fhir.utilities.IniFile;
|
import org.hl7.fhir.utilities.IniFile;
|
||||||
import org.hl7.fhir.utilities.TextFile;
|
import org.hl7.fhir.utilities.TextFile;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
@ -1102,7 +1102,6 @@ public class ValidationEngine implements IValidatorResourceFetcher {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateXmlSchema(String location, List<ValidationMessage> messages) throws FileNotFoundException, IOException, SAXException {
|
private void validateXmlSchema(String location, List<ValidationMessage> messages) throws FileNotFoundException, IOException, SAXException {
|
||||||
XmlValidator xml = new XmlValidator(messages, loadSchemas(), loadTransforms());
|
|
||||||
messages.add(new ValidationMessage(Source.InstanceValidator, IssueType.INFORMATIONAL, location, "XML Schema Validation is not done yet", IssueSeverity.INFORMATION));
|
messages.add(new ValidationMessage(Source.InstanceValidator, IssueType.INFORMATIONAL, location, "XML Schema Validation is not done yet", IssueSeverity.INFORMATION));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation;
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -49,13 +49,8 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.awt.Desktop;
|
import java.awt.Desktop;
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.HttpURLConnection;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -85,14 +80,13 @@ 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.KeyGenerator;
|
import org.hl7.fhir.r5.utils.KeyGenerator;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
import org.hl7.fhir.r5.validation.ValidationEngine.ScanOutputItem;
|
import org.hl7.fhir.validation.ValidationEngine.ScanOutputItem;
|
||||||
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.VersionUtilities;
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
import org.hl7.fhir.utilities.cache.PackageCacheManager;
|
import org.hl7.fhir.utilities.cache.PackageCacheManager;
|
||||||
import org.hl7.fhir.utilities.cache.ToolsVersion;
|
import org.hl7.fhir.utilities.cache.ToolsVersion;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
import org.hl7.fhir.utilities.xhtml.XhtmlComposer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A executable class that will validate one or more FHIR resources against
|
* A executable class that will validate one or more FHIR resources against
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* #%L
|
* #%L
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -16,7 +16,6 @@ import org.hl7.fhir.r5.model.StructureDefinition.ExtensionContextType;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule;
|
import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule;
|
||||||
import org.hl7.fhir.r5.model.UriType;
|
import org.hl7.fhir.r5.model.UriType;
|
||||||
import org.hl7.fhir.r5.validation.XVerExtensionManager.XVerExtensionStatus;
|
|
||||||
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.json.JsonTrackingParser;
|
import org.hl7.fhir.utilities.json.JsonTrackingParser;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation.codesystem;
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -30,6 +30,7 @@ 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.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||||
|
import org.hl7.fhir.validation.BaseValidator;
|
||||||
|
|
||||||
public class CodeSystemValidator extends BaseValidator {
|
public class CodeSystemValidator extends BaseValidator {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation.instance;
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -9,9 +9,9 @@ package org.hl7.fhir.r5.validation;
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@ -28,14 +28,13 @@ import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.model.*;
|
import org.hl7.fhir.r5.model.*;
|
||||||
import org.hl7.fhir.r5.model.Questionnaire.*;
|
import org.hl7.fhir.r5.model.Questionnaire.*;
|
||||||
import org.hl7.fhir.r5.utils.FHIRPathEngine;
|
import org.hl7.fhir.r5.utils.FHIRPathEngine;
|
||||||
import org.hl7.fhir.r5.validation.instancevalidator.utils.ValidatorHostContext;
|
import org.hl7.fhir.validation.instance.utils.ValidatorHostContext;
|
||||||
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Evaluates Questionnaire.item.enableWhen against a QuestionnaireResponse.
|
* Evaluates Questionnaire.item.enableWhen against a QuestionnaireResponse.
|
||||||
* Ignores possible modifierExtensions and extensions.
|
* Ignores possible modifierExtensions and extensions.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class EnableWhenEvaluator {
|
public class EnableWhenEvaluator {
|
||||||
public static final String LINKID_ELEMENT = "linkId";
|
public static final String LINKID_ELEMENT = "linkId";
|
||||||
|
@ -46,26 +45,29 @@ public class EnableWhenEvaluator {
|
||||||
public static class QuestionnaireAnswerPair {
|
public static class QuestionnaireAnswerPair {
|
||||||
private QuestionnaireItemComponent q;
|
private QuestionnaireItemComponent q;
|
||||||
private Element a;
|
private Element a;
|
||||||
|
|
||||||
public QuestionnaireAnswerPair(QuestionnaireItemComponent q, Element a) {
|
public QuestionnaireAnswerPair(QuestionnaireItemComponent q, Element a) {
|
||||||
super();
|
super();
|
||||||
this.q = q;
|
this.q = q;
|
||||||
this.a = a;
|
this.a = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuestionnaireItemComponent getQ() {
|
public QuestionnaireItemComponent getQ() {
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Element getA() {
|
public Element getA() {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class QStack extends ArrayList<QuestionnaireAnswerPair> {
|
public static class QStack extends ArrayList<QuestionnaireAnswerPair> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private Questionnaire q;
|
private Questionnaire q;
|
||||||
private Element a;
|
private Element a;
|
||||||
|
|
||||||
public QStack(Questionnaire q, Element a) {
|
public QStack(Questionnaire q, Element a) {
|
||||||
super();
|
super();
|
||||||
this.q = q;
|
this.q = q;
|
||||||
|
@ -97,40 +99,30 @@ public class EnableWhenEvaluator {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Evaluation result of enableWhen condition
|
* Evaluation result of enableWhen condition
|
||||||
*
|
*
|
||||||
* @param enabled
|
* @param enabled Evaluation result
|
||||||
* Evaluation result
|
* @param enableWhenCondition Evaluated enableWhen condition
|
||||||
* @param linkId
|
|
||||||
* LinkId of the questionnaire item
|
|
||||||
* @param enableWhenCondition
|
|
||||||
* Evaluated enableWhen condition
|
|
||||||
* @param responseItem
|
|
||||||
* item in QuestionnaireResponse
|
|
||||||
*/
|
*/
|
||||||
public EnableWhenResult(boolean enabled, QuestionnaireItemEnableWhenComponent enableWhenCondition) {
|
public EnableWhenResult(boolean enabled, QuestionnaireItemEnableWhenComponent enableWhenCondition) {
|
||||||
this.enabled = enabled;
|
this.enabled = enabled;
|
||||||
this.enableWhenCondition = enableWhenCondition;
|
this.enableWhenCondition = enableWhenCondition;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
return enabled;
|
return enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuestionnaireItemEnableWhenComponent getEnableWhenCondition() {
|
public QuestionnaireItemEnableWhenComponent getEnableWhenCondition() {
|
||||||
return enableWhenCondition;
|
return enableWhenCondition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the stack contains a set of QR items that represent the tree of the QR being validated, each tagged with the definition of the item from the Q for the QR being validated
|
* the stack contains a set of QR items that represent the tree of the QR being validated, each tagged with the definition of the item from the Q for the QR being validated
|
||||||
*
|
* <p>
|
||||||
* the itembeing validated is in the context of the stack. For root items, the stack is empty.
|
* the itembeing validated is in the context of the stack. For root items, the stack is empty.
|
||||||
*
|
* <p>
|
||||||
* The context Questionnaire and QuestionnaireResponse are always available
|
* The context Questionnaire and QuestionnaireResponse are always available
|
||||||
*
|
|
||||||
* @param questionnaireItem
|
|
||||||
* @param questionnaireResponse
|
|
||||||
* @param qstack
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
public boolean isQuestionEnabled(ValidatorHostContext hostContext, QuestionnaireItemComponent qitem, QStack qstack, FHIRPathEngine engine) {
|
public boolean isQuestionEnabled(ValidatorHostContext hostContext, QuestionnaireItemComponent qitem, QStack qstack, FHIRPathEngine engine) {
|
||||||
if (hasExpressionExtension(qitem)) {
|
if (hasExpressionExtension(qitem)) {
|
||||||
|
@ -138,22 +130,22 @@ public class EnableWhenEvaluator {
|
||||||
ExpressionNode node = engine.parse(expr);
|
ExpressionNode node = engine.parse(expr);
|
||||||
return engine.evaluateToBoolean(hostContext, qstack.a, qstack.a, qstack.a, node);
|
return engine.evaluateToBoolean(hostContext, qstack.a, qstack.a, qstack.a, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!qitem.hasEnableWhen()) {
|
if (!qitem.hasEnableWhen()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<EnableWhenResult> evaluationResults = qitem.getEnableWhen()
|
List<EnableWhenResult> evaluationResults = qitem.getEnableWhen()
|
||||||
.stream()
|
.stream()
|
||||||
.map(enableCondition -> evaluateCondition(enableCondition, qitem, qstack))
|
.map(enableCondition -> evaluateCondition(enableCondition, qitem, qstack))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
return checkConditionResults(evaluationResults, qitem);
|
return checkConditionResults(evaluationResults, qitem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean hasExpressionExtension(QuestionnaireItemComponent qitem) {
|
private boolean hasExpressionExtension(QuestionnaireItemComponent qitem) {
|
||||||
return qitem.hasExtension("http://phr.kanta.fi/StructureDefinition/fiphr-ext-questionnaire-enablewhen") || // finnish extension
|
return qitem.hasExtension("http://phr.kanta.fi/StructureDefinition/fiphr-ext-questionnaire-enablewhen") || // finnish extension
|
||||||
qitem.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression"); // sdc extension
|
qitem.hasExtension("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression"); // sdc extension
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getExpression(QuestionnaireItemComponent qitem) {
|
private String getExpression(QuestionnaireItemComponent qitem) {
|
||||||
|
@ -164,17 +156,18 @@ public class EnableWhenEvaluator {
|
||||||
if ("text/fhirpath".equals(expr.getLanguage())) {
|
if ("text/fhirpath".equals(expr.getLanguage())) {
|
||||||
return expr.getExpression();
|
return expr.getExpression();
|
||||||
} else {
|
} else {
|
||||||
throw new FHIRException("Unsupported language '"+expr.getLanguage()+"' for enableWhen extension http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression");
|
throw new FHIRException("Unsupported language '" + expr.getLanguage() + "' for enableWhen extension http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new Error("How did you get here?");
|
throw new Error("How did you get here?");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean checkConditionResults(List<EnableWhenResult> evaluationResults, QuestionnaireItemComponent questionnaireItem) {
|
public boolean checkConditionResults(List<EnableWhenResult> evaluationResults, QuestionnaireItemComponent questionnaireItem) {
|
||||||
if ((questionnaireItem.hasEnableBehavior() && questionnaireItem.getEnableBehavior() == EnableWhenBehavior.ANY) || evaluationResults.size() == 1){
|
if ((questionnaireItem.hasEnableBehavior() && questionnaireItem.getEnableBehavior() == EnableWhenBehavior.ANY) || evaluationResults.size() == 1) {
|
||||||
return evaluationResults.stream().anyMatch(EnableWhenResult::isEnabled);
|
return evaluationResults.stream().anyMatch(EnableWhenResult::isEnabled);
|
||||||
} if (questionnaireItem.hasEnableBehavior() && questionnaireItem.getEnableBehavior() == EnableWhenBehavior.ALL){
|
}
|
||||||
|
if (questionnaireItem.hasEnableBehavior() && questionnaireItem.getEnableBehavior() == EnableWhenBehavior.ALL) {
|
||||||
return evaluationResults.stream().allMatch(EnableWhenResult::isEnabled);
|
return evaluationResults.stream().allMatch(EnableWhenResult::isEnabled);
|
||||||
}
|
}
|
||||||
//TODO: Throw exception? enableBehavior is mandatory when there are multiple conditions
|
//TODO: Throw exception? enableBehavior is mandatory when there are multiple conditions
|
||||||
|
@ -183,18 +176,18 @@ public class EnableWhenEvaluator {
|
||||||
|
|
||||||
|
|
||||||
protected EnableWhenResult evaluateCondition(QuestionnaireItemEnableWhenComponent enableCondition, QuestionnaireItemComponent qitem, QStack qstack) {
|
protected EnableWhenResult evaluateCondition(QuestionnaireItemEnableWhenComponent enableCondition, QuestionnaireItemComponent qitem, QStack qstack) {
|
||||||
List<Element> answerItems = findQuestionAnswers(qstack, qitem, enableCondition);
|
List<Element> answerItems = findQuestionAnswers(qstack, qitem, enableCondition);
|
||||||
QuestionnaireItemOperator operator = enableCondition.getOperator();
|
QuestionnaireItemOperator operator = enableCondition.getOperator();
|
||||||
if (operator == QuestionnaireItemOperator.EXISTS){
|
if (operator == QuestionnaireItemOperator.EXISTS) {
|
||||||
DataType answer = enableCondition.getAnswer();
|
DataType answer = enableCondition.getAnswer();
|
||||||
if (!(answer instanceof BooleanType)){
|
if (!(answer instanceof BooleanType)) {
|
||||||
throw new UnprocessableEntityException("Exists-operator requires answerBoolean");
|
throw new UnprocessableEntityException("Exists-operator requires answerBoolean");
|
||||||
}
|
}
|
||||||
return new EnableWhenResult(((BooleanType)answer).booleanValue() != answerItems.isEmpty(), enableCondition);
|
return new EnableWhenResult(((BooleanType) answer).booleanValue() != answerItems.isEmpty(), enableCondition);
|
||||||
}
|
}
|
||||||
boolean result = answerItems
|
boolean result = answerItems
|
||||||
.stream()
|
.stream()
|
||||||
.anyMatch(answer -> evaluateAnswer(answer, enableCondition.getAnswer(), enableCondition.getOperator()));
|
.anyMatch(answer -> evaluateAnswer(answer, enableCondition.getAnswer(), enableCondition.getOperator()));
|
||||||
return new EnableWhenResult(result, enableCondition);
|
return new EnableWhenResult(result, enableCondition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,71 +228,71 @@ public class EnableWhenEvaluator {
|
||||||
}
|
}
|
||||||
if (!actualAnswer.getClass().equals(expectedAnswer.getClass())) {
|
if (!actualAnswer.getClass().equals(expectedAnswer.getClass())) {
|
||||||
throw new UnprocessableEntityException("Expected answer and actual answer have incompatible types");
|
throw new UnprocessableEntityException("Expected answer and actual answer have incompatible types");
|
||||||
}
|
}
|
||||||
if (expectedAnswer instanceof Coding) {
|
if (expectedAnswer instanceof Coding) {
|
||||||
return compareCodingAnswer((Coding)expectedAnswer, (Coding)actualAnswer, questionnaireItemOperator);
|
return compareCodingAnswer((Coding) expectedAnswer, (Coding) actualAnswer, questionnaireItemOperator);
|
||||||
} else if ((expectedAnswer instanceof PrimitiveType)) {
|
} else if ((expectedAnswer instanceof PrimitiveType)) {
|
||||||
return comparePrimitiveAnswer((PrimitiveType<?>)actualAnswer, (PrimitiveType<?>)expectedAnswer, questionnaireItemOperator);
|
return comparePrimitiveAnswer((PrimitiveType<?>) actualAnswer, (PrimitiveType<?>) expectedAnswer, questionnaireItemOperator);
|
||||||
} else if (expectedAnswer instanceof Quantity) {
|
} else if (expectedAnswer instanceof Quantity) {
|
||||||
return compareQuantityAnswer((Quantity)actualAnswer, (Quantity)expectedAnswer, questionnaireItemOperator);
|
return compareQuantityAnswer((Quantity) actualAnswer, (Quantity) expectedAnswer, questionnaireItemOperator);
|
||||||
}
|
}
|
||||||
// TODO: Attachment, reference?
|
// TODO: Attachment, reference?
|
||||||
throw new UnprocessableEntityException("Unimplemented answer type: " + expectedAnswer.getClass());
|
throw new UnprocessableEntityException("Unimplemented answer type: " + expectedAnswer.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean compareQuantityAnswer(Quantity actualAnswer, Quantity expectedAnswer, QuestionnaireItemOperator questionnaireItemOperator) {
|
private boolean compareQuantityAnswer(Quantity actualAnswer, Quantity expectedAnswer, QuestionnaireItemOperator questionnaireItemOperator) {
|
||||||
return compareComparable(actualAnswer.getValue(), expectedAnswer.getValue(), questionnaireItemOperator);
|
return compareComparable(actualAnswer.getValue(), expectedAnswer.getValue(), questionnaireItemOperator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean comparePrimitiveAnswer(PrimitiveType<?> actualAnswer, PrimitiveType<?> expectedAnswer, QuestionnaireItemOperator questionnaireItemOperator) {
|
private boolean comparePrimitiveAnswer(PrimitiveType<?> actualAnswer, PrimitiveType<?> expectedAnswer, QuestionnaireItemOperator questionnaireItemOperator) {
|
||||||
if (actualAnswer.getValue() instanceof Comparable){
|
if (actualAnswer.getValue() instanceof Comparable) {
|
||||||
return compareComparable((Comparable<?>)actualAnswer.getValue(), (Comparable<?>) expectedAnswer.getValue(), questionnaireItemOperator);
|
return compareComparable((Comparable<?>) actualAnswer.getValue(), (Comparable<?>) expectedAnswer.getValue(), questionnaireItemOperator);
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.EQUAL){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.EQUAL) {
|
||||||
return actualAnswer.equalsShallow(expectedAnswer);
|
return actualAnswer.equalsShallow(expectedAnswer);
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.NOT_EQUAL){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.NOT_EQUAL) {
|
||||||
return !actualAnswer.equalsShallow(expectedAnswer);
|
return !actualAnswer.equalsShallow(expectedAnswer);
|
||||||
}
|
}
|
||||||
throw new UnprocessableEntityException("Bad operator for PrimitiveType comparison");
|
throw new UnprocessableEntityException("Bad operator for PrimitiveType comparison");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
private boolean compareComparable(Comparable actual, Comparable expected,
|
private boolean compareComparable(Comparable actual, Comparable expected,
|
||||||
QuestionnaireItemOperator questionnaireItemOperator) {
|
QuestionnaireItemOperator questionnaireItemOperator) {
|
||||||
int result = actual.compareTo(expected);
|
int result = actual.compareTo(expected);
|
||||||
|
|
||||||
if (questionnaireItemOperator == QuestionnaireItemOperator.EQUAL){
|
if (questionnaireItemOperator == QuestionnaireItemOperator.EQUAL) {
|
||||||
return result == 0;
|
return result == 0;
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.NOT_EQUAL){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.NOT_EQUAL) {
|
||||||
return result != 0;
|
return result != 0;
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.GREATER_OR_EQUAL){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.GREATER_OR_EQUAL) {
|
||||||
return result >= 0;
|
return result >= 0;
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.LESS_OR_EQUAL){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.LESS_OR_EQUAL) {
|
||||||
return result <= 0;
|
return result <= 0;
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.LESS_THAN){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.LESS_THAN) {
|
||||||
return result < 0;
|
return result < 0;
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.GREATER_THAN){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.GREATER_THAN) {
|
||||||
return result > 0;
|
return result > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new UnprocessableEntityException("Bad operator for PrimitiveType comparison: "+questionnaireItemOperator.toCode());
|
throw new UnprocessableEntityException("Bad operator for PrimitiveType comparison: " + questionnaireItemOperator.toCode());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively look for answers to questions with the given link id, working upwards given the context
|
* Recursively look for answers to questions with the given link id, working upwards given the context
|
||||||
*
|
* <p>
|
||||||
* For discussion about this, see https://chat.fhir.org/#narrow/stream/179255-questionnaire/topic/enable-when
|
* For discussion about this, see https://chat.fhir.org/#narrow/stream/179255-questionnaire/topic/enable-when
|
||||||
*
|
* <p>
|
||||||
- given sourceQ - question that contains the enableWhen reference and targetQ - question that the enableWhen references in the Q and also sourceA - answer for sourceQ and targetA - answer for targetQ in the QR
|
* - given sourceQ - question that contains the enableWhen reference and targetQ - question that the enableWhen references in the Q and also sourceA - answer for sourceQ and targetA - answer for targetQ in the QR
|
||||||
- work up from sourceQ until you find the Q group that also contains targetQ - this is groupQ
|
* - work up from sourceQ until you find the Q group that also contains targetQ - this is groupQ
|
||||||
- work up from sourceA until you find the QR group that matches groupQ - this is groupA
|
* - work up from sourceA until you find the QR group that matches groupQ - this is groupA
|
||||||
- any targetA in groupA are input for the enableWhen decision
|
* - any targetA in groupA are input for the enableWhen decision
|
||||||
*/
|
*/
|
||||||
private List<Element> findQuestionAnswers(QStack qstack, QuestionnaireItemComponent sourceQ, QuestionnaireItemEnableWhenComponent ew) {
|
private List<Element> findQuestionAnswers(QStack qstack, QuestionnaireItemComponent sourceQ, QuestionnaireItemEnableWhenComponent ew) {
|
||||||
QuestionnaireItemComponent targetQ = qstack.getQ().getQuestion(ew.getQuestion());
|
QuestionnaireItemComponent targetQ = qstack.getQ().getQuestion(ew.getQuestion());
|
||||||
if (targetQ != null) {
|
if (targetQ != null) {
|
||||||
QuestionnaireItemComponent groupQ = qstack.getQ().getCommonGroup(sourceQ, targetQ);
|
QuestionnaireItemComponent groupQ = qstack.getQ().getCommonGroup(sourceQ, targetQ);
|
||||||
if (groupQ == null) { // root is Q itself
|
if (groupQ == null) { // root is Q itself
|
||||||
return findOnItem(qstack.getA(), ew.getQuestion());
|
return findOnItem(qstack.getA(), ew.getQuestion());
|
||||||
|
@ -341,16 +334,16 @@ public class EnableWhenEvaluator {
|
||||||
|
|
||||||
private List<Element> extractAnswer(Element item) {
|
private List<Element> extractAnswer(Element item) {
|
||||||
return item.getChildrenByName(ANSWER_ELEMENT)
|
return item.getChildrenByName(ANSWER_ELEMENT)
|
||||||
.stream()
|
.stream()
|
||||||
.flatMap(c -> c.getChildren().stream())
|
.flatMap(c -> c.getChildren().stream())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean compareCodingAnswer(Coding expectedAnswer, Coding actualAnswer, QuestionnaireItemOperator questionnaireItemOperator) {
|
private boolean compareCodingAnswer(Coding expectedAnswer, Coding actualAnswer, QuestionnaireItemOperator questionnaireItemOperator) {
|
||||||
boolean result = compareSystems(expectedAnswer, actualAnswer) && compareCodes(expectedAnswer, actualAnswer);
|
boolean result = compareSystems(expectedAnswer, actualAnswer) && compareCodes(expectedAnswer, actualAnswer);
|
||||||
if (questionnaireItemOperator == QuestionnaireItemOperator.EQUAL){
|
if (questionnaireItemOperator == QuestionnaireItemOperator.EQUAL) {
|
||||||
return result == true;
|
return result == true;
|
||||||
} else if (questionnaireItemOperator == QuestionnaireItemOperator.NOT_EQUAL){
|
} else if (questionnaireItemOperator == QuestionnaireItemOperator.NOT_EQUAL) {
|
||||||
return result == false;
|
return result == false;
|
||||||
}
|
}
|
||||||
throw new UnprocessableEntityException("Bad operator for Coding comparison");
|
throw new UnprocessableEntityException("Bad operator for Coding comparison");
|
||||||
|
@ -378,7 +371,7 @@ public class EnableWhenEvaluator {
|
||||||
|
|
||||||
private boolean hasLinkId(Element item, String linkId) {
|
private boolean hasLinkId(Element item, String linkId) {
|
||||||
Element linkIdChild = item.getNamedChild(LINKID_ELEMENT);
|
Element linkIdChild = item.getNamedChild(LINKID_ELEMENT);
|
||||||
if (linkIdChild != null && linkIdChild.getValue().equals(linkId)){
|
if (linkIdChild != null && linkIdChild.getValue().equals(linkId)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator;
|
package org.hl7.fhir.validation.instance;
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -126,11 +126,9 @@ import org.hl7.fhir.r5.utils.FHIRPathEngine;
|
||||||
import org.hl7.fhir.r5.utils.FHIRPathEngine.IEvaluationContext;
|
import org.hl7.fhir.r5.utils.FHIRPathEngine.IEvaluationContext;
|
||||||
import org.hl7.fhir.r5.utils.IResourceValidator;
|
import org.hl7.fhir.r5.utils.IResourceValidator;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
import org.hl7.fhir.r5.validation.BaseValidator;
|
import org.hl7.fhir.validation.BaseValidator;
|
||||||
import org.hl7.fhir.r5.validation.EnableWhenEvaluator;
|
import org.hl7.fhir.validation.instance.EnableWhenEvaluator.QStack;
|
||||||
import org.hl7.fhir.r5.validation.EnableWhenEvaluator.QStack;
|
import org.hl7.fhir.validation.XVerExtensionManager;
|
||||||
import org.hl7.fhir.r5.validation.XVerExtensionManager;
|
|
||||||
import org.hl7.fhir.r5.validation.instancevalidator.utils.*;
|
|
||||||
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.Utilities.DecimalStatus;
|
import org.hl7.fhir.utilities.Utilities.DecimalStatus;
|
||||||
|
@ -142,6 +140,7 @@ import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
|
||||||
import org.hl7.fhir.utilities.xhtml.NodeType;
|
import org.hl7.fhir.utilities.xhtml.NodeType;
|
||||||
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
||||||
|
import org.hl7.fhir.validation.instance.utils.*;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
@ -152,7 +151,7 @@ import ca.uhn.fhir.util.ObjectUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thinking of using this in a java program? Don't!
|
* Thinking of using this in a java program? Don't!
|
||||||
* You should use one of the wrappers instead. Either in HAPI, or use ValidationEngine
|
* You should use one of the wrappers instead. Either in HAPI, or use ValidationEngine, or NativeHostServices
|
||||||
* <p>
|
* <p>
|
||||||
* Validation todo:
|
* Validation todo:
|
||||||
* - support @default slices
|
* - support @default slices
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator;
|
package org.hl7.fhir.validation.instance;
|
||||||
|
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator.utils;
|
package org.hl7.fhir.validation.instance.utils;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.validation.instancevalidator.InstanceValidator;
|
import org.hl7.fhir.validation.instance.InstanceValidator;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
|
||||||
public class ChildIterator {
|
public class ChildIterator {
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator.utils;
|
package org.hl7.fhir.validation.instance.utils;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.model.ElementDefinition;
|
import org.hl7.fhir.r5.model.ElementDefinition;
|
|
@ -1,7 +1,6 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator.utils;
|
package org.hl7.fhir.validation.instance.utils;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.validation.instancevalidator.InstanceValidator;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator.utils;
|
package org.hl7.fhir.validation.instance.utils;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator.utils;
|
package org.hl7.fhir.validation.instance.utils;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.validation.instancevalidator.InstanceValidator;
|
import org.hl7.fhir.validation.instance.InstanceValidator;
|
||||||
|
|
||||||
public class ResolvedReference {
|
public class ResolvedReference {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator.utils;
|
package org.hl7.fhir.validation.instance.utils;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation.instancevalidator.utils;
|
package org.hl7.fhir.validation.instance.utils;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hl7.fhir.r5.validation;
|
package org.hl7.fhir.validation.profile;
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* #%L
|
* #%L
|
||||||
|
@ -20,7 +20,6 @@ package org.hl7.fhir.r5.validation;
|
||||||
* #L%
|
* #L%
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -34,6 +33,7 @@ import org.hl7.fhir.r5.utils.FHIRPathEngine;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||||
|
import org.hl7.fhir.validation.BaseValidator;
|
||||||
|
|
||||||
public class ProfileValidator extends BaseValidator {
|
public class ProfileValidator extends BaseValidator {
|
||||||
|
|
|
@ -2,8 +2,7 @@ package org.hl7.fhir.validation.tests;
|
||||||
|
|
||||||
import org.hl7.fhir.r4.context.SimpleWorkerContext;
|
import org.hl7.fhir.r4.context.SimpleWorkerContext;
|
||||||
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
||||||
import org.hl7.fhir.r5.validation.Validator;
|
import org.hl7.fhir.validation.Validator;
|
||||||
import org.hl7.fhir.validation.tests.utilities.TestUtilities;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class CDAValidationTestCase {
|
public class CDAValidationTestCase {
|
||||||
|
|
|
@ -2,9 +2,7 @@ package org.hl7.fhir.validation.tests;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
|
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
|
||||||
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
||||||
import org.hl7.fhir.r5.validation.NativeHostServices;
|
import org.hl7.fhir.validation.NativeHostServices;
|
||||||
import org.hl7.fhir.utilities.TextFile;
|
|
||||||
import org.hl7.fhir.validation.tests.utilities.TestUtilities;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class NativeHostServiceTester {
|
public class NativeHostServiceTester {
|
||||||
|
|
|
@ -1,19 +1,15 @@
|
||||||
package org.hl7.fhir.validation.tests;
|
package org.hl7.fhir.validation.tests;
|
||||||
|
|
||||||
import java.awt.Desktop;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.conformance.ProfileComparer;
|
import org.hl7.fhir.r5.conformance.ProfileComparer;
|
||||||
import org.hl7.fhir.r5.model.FhirPublication;
|
import org.hl7.fhir.r5.model.FhirPublication;
|
||||||
import org.hl7.fhir.r5.model.OperationOutcome;
|
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.utils.KeyGenerator;
|
import org.hl7.fhir.r5.utils.KeyGenerator;
|
||||||
import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent;
|
|
||||||
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
||||||
import org.hl7.fhir.r5.validation.ValidationEngine;
|
import org.hl7.fhir.validation.ValidationEngine;
|
||||||
import org.hl7.fhir.validation.tests.utilities.TestUtilities;
|
import org.hl7.fhir.validation.tests.utilities.TestUtilities;
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class ProfileComparisonTests {
|
public class ProfileComparisonTests {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package org.hl7.fhir.validation.tests;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import org.hl7.fhir.r4.test.utils.TestingUtilities;
|
import org.hl7.fhir.r4.test.utils.TestingUtilities;
|
||||||
import org.hl7.fhir.r5.validation.Validator;
|
import org.hl7.fhir.validation.Validator;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package org.hl7.fhir.validation.tests;
|
package org.hl7.fhir.validation.tests;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -10,8 +9,7 @@ import org.hl7.fhir.r5.model.OperationOutcome;
|
||||||
import org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity;
|
import org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity;
|
||||||
import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent;
|
import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent;
|
||||||
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
import org.hl7.fhir.r5.test.utils.TestingUtilities;
|
||||||
import org.hl7.fhir.r5.validation.ValidationEngine;
|
import org.hl7.fhir.validation.ValidationEngine;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
|
||||||
import org.hl7.fhir.validation.tests.utilities.TestUtilities;
|
import org.hl7.fhir.validation.tests.utilities.TestUtilities;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
|
@ -26,8 +26,8 @@ import org.hl7.fhir.r5.utils.FHIRPathEngine.IEvaluationContext;
|
||||||
import org.hl7.fhir.r5.utils.IResourceValidator;
|
import org.hl7.fhir.r5.utils.IResourceValidator;
|
||||||
import org.hl7.fhir.r5.utils.IResourceValidator.IValidatorResourceFetcher;
|
import org.hl7.fhir.r5.utils.IResourceValidator.IValidatorResourceFetcher;
|
||||||
import org.hl7.fhir.r5.utils.IResourceValidator.ReferenceValidationPolicy;
|
import org.hl7.fhir.r5.utils.IResourceValidator.ReferenceValidationPolicy;
|
||||||
import org.hl7.fhir.r5.validation.instancevalidator.InstanceValidator;
|
import org.hl7.fhir.validation.instance.InstanceValidator;
|
||||||
import org.hl7.fhir.r5.validation.ValidationEngine;
|
import org.hl7.fhir.validation.ValidationEngine;
|
||||||
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.VersionUtilities;
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
|
|
2
pom.xml
2
pom.xml
|
@ -13,7 +13,7 @@
|
||||||
each other. It is fine to bump the point version of this POM without affecting
|
each other. It is fine to bump the point version of this POM without affecting
|
||||||
HAPI FHIR.
|
HAPI FHIR.
|
||||||
-->
|
-->
|
||||||
<version>4.2.1-SNAPSHOT</version>
|
<version>4.2.3-SNAPSHOT</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<hapi_fhir_version>4.2.0</hapi_fhir_version>
|
<hapi_fhir_version>4.2.0</hapi_fhir_version>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
set oldver=4.1.63
|
set oldver=4.2.2
|
||||||
set newver=4.2.1
|
set newver=4.2.3
|
||||||
|
|
||||||
echo ..
|
echo ..
|
||||||
echo =========================================================================
|
echo =========================================================================
|
||||||
|
|
Loading…
Reference in New Issue