Merge pull request #1812 from hapifhir/2024-11-gg-user-data-refactor
2024 11 gg user data refactor
This commit is contained in:
commit
56a68d4ea2
|
@ -37,6 +37,7 @@ import org.hl7.fhir.r5.model.UriType;
|
||||||
import org.hl7.fhir.r5.model.ValueSet;
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.IniFile;
|
import org.hl7.fhir.utilities.IniFile;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
@ -522,8 +523,8 @@ public class SpecDifferenceEvaluator {
|
||||||
for (ElementDefinition ed : rev.getDifferential().getElement()) {
|
for (ElementDefinition ed : rev.getDifferential().getElement()) {
|
||||||
ElementDefinition oed = getMatchingElement(rev.getName(), orig.getDifferential().getElement(), ed);
|
ElementDefinition oed = getMatchingElement(rev.getName(), orig.getDifferential().getElement(), ed);
|
||||||
if (oed != null) {
|
if (oed != null) {
|
||||||
ed.setUserData("match", oed);
|
ed.setUserData(UserDataNames.comparison_match, oed);
|
||||||
oed.setUserData("match", ed);
|
oed.setUserData(UserDataNames.comparison_match, ed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -556,9 +557,9 @@ public class SpecDifferenceEvaluator {
|
||||||
right.ul().li().addText("No Changes");
|
right.ul().li().addText("No Changes");
|
||||||
|
|
||||||
for (ElementDefinition ed : rev.getDifferential().getElement())
|
for (ElementDefinition ed : rev.getDifferential().getElement())
|
||||||
ed.clearUserData("match");
|
ed.clearUserData(UserDataNames.comparison_match);
|
||||||
for (ElementDefinition ed : orig.getDifferential().getElement())
|
for (ElementDefinition ed : orig.getDifferential().getElement())
|
||||||
ed.clearUserData("match");
|
ed.clearUserData(UserDataNames.comparison_match);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1078,8 +1079,8 @@ public class SpecDifferenceEvaluator {
|
||||||
for (ElementDefinition ed : rev.getDifferential().getElement()) {
|
for (ElementDefinition ed : rev.getDifferential().getElement()) {
|
||||||
ElementDefinition oed = getMatchingElement(rev.getName(), orig.getDifferential().getElement(), ed);
|
ElementDefinition oed = getMatchingElement(rev.getName(), orig.getDifferential().getElement(), ed);
|
||||||
if (oed != null) {
|
if (oed != null) {
|
||||||
ed.setUserData("match", oed);
|
ed.setUserData(UserDataNames.comparison_match, oed);
|
||||||
oed.setUserData("match", ed);
|
oed.setUserData(UserDataNames.comparison_match, ed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1121,9 +1122,9 @@ public class SpecDifferenceEvaluator {
|
||||||
type.addProperty("status", "no-change");
|
type.addProperty("status", "no-change");
|
||||||
|
|
||||||
for (ElementDefinition ed : rev.getDifferential().getElement())
|
for (ElementDefinition ed : rev.getDifferential().getElement())
|
||||||
ed.clearUserData("match");
|
ed.clearUserData(UserDataNames.comparison_match);
|
||||||
for (ElementDefinition ed : orig.getDifferential().getElement())
|
for (ElementDefinition ed : orig.getDifferential().getElement())
|
||||||
ed.clearUserData("match");
|
ed.clearUserData(UserDataNames.comparison_match);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1137,8 +1138,8 @@ public class SpecDifferenceEvaluator {
|
||||||
for (ElementDefinition ed : rev.getDifferential().getElement()) {
|
for (ElementDefinition ed : rev.getDifferential().getElement()) {
|
||||||
ElementDefinition oed = getMatchingElement(rev.getName(), orig.getDifferential().getElement(), ed);
|
ElementDefinition oed = getMatchingElement(rev.getName(), orig.getDifferential().getElement(), ed);
|
||||||
if (oed != null) {
|
if (oed != null) {
|
||||||
ed.setUserData("match", oed);
|
ed.setUserData(UserDataNames.comparison_match, oed);
|
||||||
oed.setUserData("match", ed);
|
oed.setUserData(UserDataNames.comparison_match, ed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1179,9 +1180,9 @@ public class SpecDifferenceEvaluator {
|
||||||
type.setAttribute("status", "no-change");
|
type.setAttribute("status", "no-change");
|
||||||
|
|
||||||
for (ElementDefinition ed : rev.getDifferential().getElement())
|
for (ElementDefinition ed : rev.getDifferential().getElement())
|
||||||
ed.clearUserData("match");
|
ed.clearUserData(UserDataNames.comparison_match);
|
||||||
for (ElementDefinition ed : orig.getDifferential().getElement())
|
for (ElementDefinition ed : orig.getDifferential().getElement())
|
||||||
ed.clearUserData("match");
|
ed.clearUserData(UserDataNames.comparison_match);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ import org.hl7.fhir.r5.model.UriType;
|
||||||
import org.hl7.fhir.r5.model.ValueSet;
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
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.npm.NpmPackage;
|
import org.hl7.fhir.utilities.npm.NpmPackage;
|
||||||
|
@ -54,9 +55,9 @@ public abstract class BaseLoaderR5 implements IContextResourceLoader {
|
||||||
public void setPath(Resource r) {
|
public void setPath(Resource r) {
|
||||||
String path = lkp.getResourcePath(r);
|
String path = lkp.getResourcePath(r);
|
||||||
if (lkp.getWebRoot() != null) {
|
if (lkp.getWebRoot() != null) {
|
||||||
r.setUserData("webroot", lkp.getWebRoot());
|
r.setUserData(UserDataNames.render_webroot, lkp.getWebRoot());
|
||||||
} else {
|
} else {
|
||||||
r.setUserData("webroot", "");
|
r.setUserData(UserDataNames.render_webroot, "");
|
||||||
}
|
}
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
r.setWebPath(path);
|
r.setWebPath(path);
|
||||||
|
@ -116,7 +117,7 @@ public abstract class BaseLoaderR5 implements IContextResourceLoader {
|
||||||
// and we only patch URLs to support version transforms
|
// and we only patch URLs to support version transforms
|
||||||
// so we just patch sd/od -> vs -> cs
|
// so we just patch sd/od -> vs -> cs
|
||||||
protected void doPatchUrls(Resource resource) {
|
protected void doPatchUrls(Resource resource) {
|
||||||
resource.setUserData("old.load.mode", true);
|
resource.setUserData(UserDataNames.loader_urls_patched, true);
|
||||||
if (resource instanceof CanonicalResource) {
|
if (resource instanceof CanonicalResource) {
|
||||||
CanonicalResource cr = (CanonicalResource) resource;
|
CanonicalResource cr = (CanonicalResource) resource;
|
||||||
cr.setUrl(patchUrl(cr.getUrl(), cr.fhirType()));
|
cr.setUrl(patchUrl(cr.getUrl(), cr.fhirType()));
|
||||||
|
|
|
@ -242,4 +242,14 @@ public class ResourceWrapperR4 extends ResourceWrapper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasUserData(String name) {
|
||||||
|
return element.hasUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getUserData(String name) {
|
||||||
|
return element.getUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -242,4 +242,14 @@ public class ResourceWrapperR4B extends ResourceWrapper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasUserData(String name) {
|
||||||
|
return element.hasUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getUserData(String name) {
|
||||||
|
return element.getUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -430,7 +430,7 @@ public class Validator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSimpleType(String type) {
|
private boolean isSimpleType(String type) {
|
||||||
return Utilities.existsInList(type, "dateTime", "boolean", "integer", "decimal", "string", "base64Binary", "id", "code", "date", "time", "canonical");
|
return Utilities.existsInList(type, "dateTime", "boolean", "integer", "decimal", "string", "base64Binary", "id", "code", "date", "time", "canonical", "uri", "url");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String simpleType(String type) {
|
private String simpleType(String type) {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.hl7.fhir.r5.model.Resource;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.model.ValueSet;
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
|
import org.hl7.fhir.utilities.i18n.RenderingI18nContext;
|
||||||
|
|
||||||
public class ComparisonSession {
|
public class ComparisonSession {
|
||||||
|
@ -191,11 +192,11 @@ public class ComparisonSession {
|
||||||
if (b == null) {
|
if (b == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (b.hasUserData(VersionComparisonAnnotation.USER_DATA_NAME)) {
|
if (b.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
|
||||||
return (VersionComparisonAnnotation) b.getUserData(VersionComparisonAnnotation.USER_DATA_NAME);
|
return (VersionComparisonAnnotation) b.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
} else {
|
} else {
|
||||||
VersionComparisonAnnotation vca = new VersionComparisonAnnotation(AnotationType.NoChange);
|
VersionComparisonAnnotation vca = new VersionComparisonAnnotation(AnotationType.NoChange);
|
||||||
b.setUserData(VersionComparisonAnnotation.USER_DATA_NAME, vca);
|
b.setUserData(UserDataNames.COMP_VERSION_ANNOTATION, vca);
|
||||||
return vca;
|
return vca;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode;
|
||||||
import org.hl7.fhir.r5.utils.DefinitionNavigator;
|
import org.hl7.fhir.r5.utils.DefinitionNavigator;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
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.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
|
@ -870,12 +871,12 @@ public class StructureDefinitionComparer extends CanonicalResourceComparer imple
|
||||||
ex.setProfile(null);
|
ex.setProfile(null);
|
||||||
} else {
|
} else {
|
||||||
// both have profiles. Is one derived from the other?
|
// both have profiles. Is one derived from the other?
|
||||||
StructureDefinition sdex = ((IWorkerContext) ex.getUserData("ctxt")).fetchResource(StructureDefinition.class, ex.getProfile().get(0).getValue(), nwSource);
|
StructureDefinition sdex = ((IWorkerContext) ex.getUserData(UserDataNames.COMP_CONTEXT)).fetchResource(StructureDefinition.class, ex.getProfile().get(0).getValue(), nwSource);
|
||||||
StructureDefinition sdnw = ctxt.fetchResource(StructureDefinition.class, nw.getProfile().get(0).getValue(), nwSource);
|
StructureDefinition sdnw = ctxt.fetchResource(StructureDefinition.class, nw.getProfile().get(0).getValue(), nwSource);
|
||||||
if (sdex != null && sdnw != null) {
|
if (sdex != null && sdnw != null) {
|
||||||
if (sdex.getUrl().equals(sdnw.getUrl())) {
|
if (sdex.getUrl().equals(sdnw.getUrl())) {
|
||||||
pfound = true;
|
pfound = true;
|
||||||
} else if (derivesFrom(sdex, sdnw, ((IWorkerContext) ex.getUserData("ctxt")))) {
|
} else if (derivesFrom(sdex, sdnw, ((IWorkerContext) ex.getUserData(UserDataNames.COMP_CONTEXT)))) {
|
||||||
ex.setProfile(nw.getProfile());
|
ex.setProfile(nw.getProfile());
|
||||||
pfound = true;
|
pfound = true;
|
||||||
} else if (derivesFrom(sdnw, sdex, ctxt)) {
|
} else if (derivesFrom(sdnw, sdex, ctxt)) {
|
||||||
|
@ -898,12 +899,12 @@ public class StructureDefinitionComparer extends CanonicalResourceComparer imple
|
||||||
ex.setTargetProfile(null);
|
ex.setTargetProfile(null);
|
||||||
} else {
|
} else {
|
||||||
// both have profiles. Is one derived from the other?
|
// both have profiles. Is one derived from the other?
|
||||||
StructureDefinition sdex = ((IWorkerContext) ex.getUserData("ctxt")).fetchResource(StructureDefinition.class, ex.getTargetProfile().get(0).getValue(), nwSource);
|
StructureDefinition sdex = ((IWorkerContext) ex.getUserData(UserDataNames.COMP_CONTEXT)).fetchResource(StructureDefinition.class, ex.getTargetProfile().get(0).getValue(), nwSource);
|
||||||
StructureDefinition sdnw = ctxt.fetchResource(StructureDefinition.class, nw.getTargetProfile().get(0).getValue(), nwSource);
|
StructureDefinition sdnw = ctxt.fetchResource(StructureDefinition.class, nw.getTargetProfile().get(0).getValue(), nwSource);
|
||||||
if (sdex != null && sdnw != null) {
|
if (sdex != null && sdnw != null) {
|
||||||
if (matches(sdex, sdnw)) {
|
if (matches(sdex, sdnw)) {
|
||||||
tfound = true;
|
tfound = true;
|
||||||
} else if (derivesFrom(sdex, sdnw, ((IWorkerContext) ex.getUserData("ctxt")))) {
|
} else if (derivesFrom(sdex, sdnw, ((IWorkerContext) ex.getUserData(UserDataNames.COMP_CONTEXT)))) {
|
||||||
ex.setTargetProfile(nw.getTargetProfile());
|
ex.setTargetProfile(nw.getTargetProfile());
|
||||||
tfound = true;
|
tfound = true;
|
||||||
} else if (derivesFrom(sdnw, sdex, ctxt)) {
|
} else if (derivesFrom(sdnw, sdex, ctxt)) {
|
||||||
|
@ -925,7 +926,7 @@ public class StructureDefinitionComparer extends CanonicalResourceComparer imple
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!tfound || !pfound) {
|
if (!tfound || !pfound) {
|
||||||
nw.setUserData("ctxt", ctxt);
|
nw.setUserData(UserDataNames.COMP_CONTEXT, ctxt);
|
||||||
results.add(nw);
|
results.add(nw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import java.util.Map;
|
||||||
import org.hl7.fhir.r5.comparison.CanonicalResourceComparer.CanonicalResourceComparison;
|
import org.hl7.fhir.r5.comparison.CanonicalResourceComparer.CanonicalResourceComparison;
|
||||||
import org.hl7.fhir.r5.model.Base;
|
import org.hl7.fhir.r5.model.Base;
|
||||||
import org.hl7.fhir.r5.model.CanonicalResource;
|
import org.hl7.fhir.r5.model.CanonicalResource;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
|
|
||||||
public class VersionComparisonAnnotation {
|
public class VersionComparisonAnnotation {
|
||||||
|
|
||||||
|
@ -15,7 +16,6 @@ public class VersionComparisonAnnotation {
|
||||||
NoChange, Added, Changed, Deleted;
|
NoChange, Added, Changed, Deleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String USER_DATA_NAME = "version-annotation";
|
|
||||||
|
|
||||||
private AnotationType type;
|
private AnotationType type;
|
||||||
private String original;
|
private String original;
|
||||||
|
@ -66,10 +66,6 @@ public class VersionComparisonAnnotation {
|
||||||
this.comp = comp;
|
this.comp = comp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getUserDataName() {
|
|
||||||
return USER_DATA_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AnotationType getType() {
|
public AnotationType getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
@ -89,8 +85,8 @@ public class VersionComparisonAnnotation {
|
||||||
|
|
||||||
public static boolean hasDeleted(Base base, String... names) {
|
public static boolean hasDeleted(Base base, String... names) {
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
if (base.hasUserData(USER_DATA_NAME)) {
|
if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
|
||||||
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(USER_DATA_NAME);
|
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
for (String name : names) {
|
for (String name : names) {
|
||||||
if (self.deletedChildren != null && self.deletedChildren.containsKey(name)) {
|
if (self.deletedChildren != null && self.deletedChildren.containsKey(name)) {
|
||||||
result = true;
|
result = true;
|
||||||
|
@ -102,8 +98,8 @@ public class VersionComparisonAnnotation {
|
||||||
|
|
||||||
public static List<Base> getDeleted(Base base, String... names) {
|
public static List<Base> getDeleted(Base base, String... names) {
|
||||||
List<Base> result = new ArrayList<>();
|
List<Base> result = new ArrayList<>();
|
||||||
if (base.hasUserData(USER_DATA_NAME)) {
|
if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
|
||||||
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(USER_DATA_NAME);
|
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
for (String name : names) {
|
for (String name : names) {
|
||||||
if (self.deletedChildren != null && self.deletedChildren.containsKey(name)) {
|
if (self.deletedChildren != null && self.deletedChildren.containsKey(name)) {
|
||||||
result.addAll(self.deletedChildren.get(name));
|
result.addAll(self.deletedChildren.get(name));
|
||||||
|
@ -115,8 +111,8 @@ public class VersionComparisonAnnotation {
|
||||||
|
|
||||||
public static Base getDeletedItem(Base base, String name) {
|
public static Base getDeletedItem(Base base, String name) {
|
||||||
List<Base> result = new ArrayList<>();
|
List<Base> result = new ArrayList<>();
|
||||||
if (base.hasUserData(USER_DATA_NAME)) {
|
if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
|
||||||
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(USER_DATA_NAME);
|
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
if (self.deletedChildren != null && self.deletedChildren.containsKey(name)) {
|
if (self.deletedChildren != null && self.deletedChildren.containsKey(name)) {
|
||||||
result.addAll(self.deletedChildren.get(name));
|
result.addAll(self.deletedChildren.get(name));
|
||||||
}
|
}
|
||||||
|
@ -128,8 +124,8 @@ public class VersionComparisonAnnotation {
|
||||||
|
|
||||||
|
|
||||||
public static CanonicalResourceComparison<? extends CanonicalResource> artifactComparison(Base base) {
|
public static CanonicalResourceComparison<? extends CanonicalResource> artifactComparison(Base base) {
|
||||||
if (base.hasUserData(USER_DATA_NAME)) {
|
if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
|
||||||
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(USER_DATA_NAME);
|
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
return self.comp;
|
return self.comp;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionMappingComponent;
|
import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionMappingComponent;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionMappingComponent;
|
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionMappingComponent;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.VersionUtilities;
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
|
@ -47,7 +48,7 @@ public class MappingAssistant {
|
||||||
for (StructureDefinitionMappingComponent m : derived.getMapping()) {
|
for (StructureDefinitionMappingComponent m : derived.getMapping()) {
|
||||||
masterList.add(m);
|
masterList.add(m);
|
||||||
if (!isSuppressed(m)) {
|
if (!isSuppressed(m)) {
|
||||||
m.setUserData("private-marked-as-derived", true);
|
m.setUserData(UserDataNames.mappings_inherited, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +128,7 @@ public class MappingAssistant {
|
||||||
|
|
||||||
derived.getMapping().clear();
|
derived.getMapping().clear();
|
||||||
for (StructureDefinitionMappingComponent t : masterList) {
|
for (StructureDefinitionMappingComponent t : masterList) {
|
||||||
if (usedList.contains(t) || t.hasUserData("private-marked-as-derived")) {
|
if (usedList.contains(t) || t.hasUserData(UserDataNames.mappings_inherited)) {
|
||||||
derived.getMapping().add(t);
|
derived.getMapping().add(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -163,7 +164,7 @@ public class MappingAssistant {
|
||||||
for (ElementDefinitionMappingComponent d : destination) {
|
for (ElementDefinitionMappingComponent d : destination) {
|
||||||
if (compareMaps(name, s, d)) {
|
if (compareMaps(name, s, d)) {
|
||||||
found = true;
|
found = true;
|
||||||
d.setUserData(ProfileUtilities.UD_DERIVATION_EQUALS, true);
|
d.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionSnapshotComponent;
|
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionSnapshotComponent;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.VersionUtilities;
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
|
@ -201,7 +202,7 @@ public class ProfilePathProcessor {
|
||||||
// int i = 0;
|
// int i = 0;
|
||||||
// List<ElementDefinition> list = getDifferential().getElement();
|
// List<ElementDefinition> list = getDifferential().getElement();
|
||||||
// for (ElementDefinition ed : list) {
|
// for (ElementDefinition ed : list) {
|
||||||
// boolean assigned = ed.hasUserData("derived.pointer");
|
// boolean assigned = ed.hasUserData(UserDataNames.UD_DERIVATION_POINTER);
|
||||||
// if (i < cursors.diffCursor) {
|
// if (i < cursors.diffCursor) {
|
||||||
// if (!assigned) {
|
// if (!assigned) {
|
||||||
// throw new Error("what?");
|
// throw new Error("what?");
|
||||||
|
@ -295,7 +296,7 @@ public class ProfilePathProcessor {
|
||||||
|
|
||||||
if (!diffMatches.get(0).hasSlicing()) {
|
if (!diffMatches.get(0).hasSlicing()) {
|
||||||
outcome.setSlicing(profileUtilities.makeExtensionSlicing());
|
outcome.setSlicing(profileUtilities.makeExtensionSlicing());
|
||||||
outcome.setUserData("auto-added-slicing", true);
|
outcome.setUserData(UserDataNames.SNAPSHOT_auto_added_slicing, true);
|
||||||
} else {
|
} else {
|
||||||
outcome.setSlicing(diffMatches.get(0).getSlicing().copy());
|
outcome.setSlicing(diffMatches.get(0).getSlicing().copy());
|
||||||
for (int i = 1; i < diffMatches.size(); i++) {
|
for (int i = 1; i < diffMatches.size(); i++) {
|
||||||
|
@ -1041,9 +1042,9 @@ public class ProfilePathProcessor {
|
||||||
profileUtilities.updateFromDefinition(outcome, diffMatches.get(0), getProfileName(), closed, getUrl(), getSourceStructureDefinition(), getDerived(), diffPath(diffMatches.get(0)), mapHelper); // if there's no slice, we don't want to update the unsliced description
|
profileUtilities.updateFromDefinition(outcome, diffMatches.get(0), getProfileName(), closed, getUrl(), getSourceStructureDefinition(), getDerived(), diffPath(diffMatches.get(0)), mapHelper); // if there's no slice, we don't want to update the unsliced description
|
||||||
profileUtilities.removeStatusExtensions(outcome);
|
profileUtilities.removeStatusExtensions(outcome);
|
||||||
} else if (!diffMatches.get(0).hasSliceName()) {
|
} else if (!diffMatches.get(0).hasSliceName()) {
|
||||||
diffMatches.get(0).setUserData(profileUtilities.UD_GENERATED_IN_SNAPSHOT, outcome); // because of updateFromDefinition isn't called
|
diffMatches.get(0).setUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT, outcome); // because of updateFromDefinition isn't called
|
||||||
} else {
|
} else {
|
||||||
outcome.setUserData("auto-added-slicing", true);
|
outcome.setUserData(UserDataNames.SNAPSHOT_auto_added_slicing, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
debugCheck(outcome);
|
debugCheck(outcome);
|
||||||
|
@ -1143,8 +1144,8 @@ public class ProfilePathProcessor {
|
||||||
outcome.setPath(profileUtilities.fixedPathDest(getContextPathTarget(), outcome.getPath(), getRedirector(), getContextPathSource()));
|
outcome.setPath(profileUtilities.fixedPathDest(getContextPathTarget(), outcome.getPath(), getRedirector(), getContextPathSource()));
|
||||||
if (!outcome.getPath().startsWith(cursors.resultPathBase))
|
if (!outcome.getPath().startsWith(cursors.resultPathBase))
|
||||||
throw new DefinitionException(profileUtilities.getContext().formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
throw new DefinitionException(profileUtilities.getContext().formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
||||||
outcome.setUserData(profileUtilities.UD_BASE_PATH, outcome.getPath());
|
outcome.setUserData(UserDataNames.SNAPSHOT_BASE_PATH, outcome.getPath());
|
||||||
outcome.setUserData(profileUtilities.UD_BASE_MODEL, getSourceStructureDefinition().getUrl());
|
outcome.setUserData(UserDataNames.SNAPSHOT_BASE_MODEL, getSourceStructureDefinition().getUrl());
|
||||||
debugCheck(outcome);
|
debugCheck(outcome);
|
||||||
getResult().getElement().add(outcome);
|
getResult().getElement().add(outcome);
|
||||||
cursors.baseCursor++;
|
cursors.baseCursor++;
|
||||||
|
@ -1463,8 +1464,8 @@ public class ProfilePathProcessor {
|
||||||
throw new DefinitionException(profileUtilities.getContext().formatMessage(I18nConstants.ADDING_WRONG_PATH_IN_PROFILE___VS_, getProfileName(), outcome.getPath(), cursors.resultPathBase));
|
throw new DefinitionException(profileUtilities.getContext().formatMessage(I18nConstants.ADDING_WRONG_PATH_IN_PROFILE___VS_, getProfileName(), outcome.getPath(), cursors.resultPathBase));
|
||||||
debugCheck(outcome);
|
debugCheck(outcome);
|
||||||
getResult().getElement().add(outcome); // so we just copy it in
|
getResult().getElement().add(outcome); // so we just copy it in
|
||||||
outcome.setUserData(profileUtilities.UD_BASE_MODEL, getSourceStructureDefinition().getUrl());
|
outcome.setUserData(UserDataNames.SNAPSHOT_BASE_MODEL, getSourceStructureDefinition().getUrl());
|
||||||
outcome.setUserData(profileUtilities.UD_BASE_PATH, cursors.resultPathBase);
|
outcome.setUserData(UserDataNames.SNAPSHOT_BASE_PATH, cursors.resultPathBase);
|
||||||
cursors.baseCursor++;
|
cursors.baseCursor++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,6 +100,7 @@ import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
||||||
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus;
|
||||||
import org.hl7.fhir.r5.utils.formats.CSVWriter;
|
import org.hl7.fhir.r5.utils.formats.CSVWriter;
|
||||||
|
@ -412,12 +413,6 @@ public class ProfileUtilities {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String UD_BASE_MODEL = "base.model";
|
|
||||||
public static final String UD_BASE_PATH = "base.path";
|
|
||||||
public static final String UD_DERIVATION_EQUALS = "derivation.equals";
|
|
||||||
public static final String UD_DERIVATION_POINTER = "derived.pointer";
|
|
||||||
public static final String UD_IS_DERIVED = "derived.fact";
|
|
||||||
public static final String UD_GENERATED_IN_SNAPSHOT = "profileutilities.snapshot.processed";
|
|
||||||
private static final boolean COPY_BINDING_EXTENSIONS = false;
|
private static final boolean COPY_BINDING_EXTENSIONS = false;
|
||||||
private static final boolean DONT_DO_THIS = false;
|
private static final boolean DONT_DO_THIS = false;
|
||||||
|
|
||||||
|
@ -727,7 +722,7 @@ public class ProfileUtilities {
|
||||||
if (snapshotStack.contains(derived.getUrl())) {
|
if (snapshotStack.contains(derived.getUrl())) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.CIRCULAR_SNAPSHOT_REFERENCES_DETECTED_CANNOT_GENERATE_SNAPSHOT_STACK__, snapshotStack.toString()));
|
throw new DefinitionException(context.formatMessage(I18nConstants.CIRCULAR_SNAPSHOT_REFERENCES_DETECTED_CANNOT_GENERATE_SNAPSHOT_STACK__, snapshotStack.toString()));
|
||||||
}
|
}
|
||||||
derived.setUserData("profileutils.snapshot.generating", true);
|
derived.setUserData(UserDataNames.SNAPSHOT_GENERATING, true);
|
||||||
snapshotStack.add(derived.getUrl());
|
snapshotStack.add(derived.getUrl());
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
@ -755,7 +750,7 @@ public class ProfileUtilities {
|
||||||
|
|
||||||
|
|
||||||
for (ElementDefinition e : derived.getDifferential().getElement())
|
for (ElementDefinition e : derived.getDifferential().getElement())
|
||||||
e.clearUserData(UD_GENERATED_IN_SNAPSHOT);
|
e.clearUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT);
|
||||||
|
|
||||||
// we actually delegate the work to a subroutine so we can re-enter it with a different cursors
|
// we actually delegate the work to a subroutine so we can re-enter it with a different cursors
|
||||||
StructureDefinitionDifferentialComponent diff = cloneDiff(derived.getDifferential()); // we make a copy here because we're sometimes going to hack the differential while processing it. Have to migrate user data back afterwards
|
StructureDefinitionDifferentialComponent diff = cloneDiff(derived.getDifferential()); // we make a copy here because we're sometimes going to hack the differential while processing it. Have to migrate user data back afterwards
|
||||||
|
@ -778,13 +773,13 @@ public class ProfileUtilities {
|
||||||
if (derived.getDerivation() == TypeDerivationRule.SPECIALIZATION) {
|
if (derived.getDerivation() == TypeDerivationRule.SPECIALIZATION) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (ElementDefinition e : diff.getElement()) {
|
for (ElementDefinition e : diff.getElement()) {
|
||||||
if (!e.hasUserData(UD_GENERATED_IN_SNAPSHOT) && e.getPath().contains(".")) {
|
if (!e.hasUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT) && e.getPath().contains(".")) {
|
||||||
ElementDefinition existing = getElementInCurrentContext(e.getPath(), derived.getSnapshot().getElement());
|
ElementDefinition existing = getElementInCurrentContext(e.getPath(), derived.getSnapshot().getElement());
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
updateFromDefinition(existing, e, profileName, false, url, base, derived, "StructureDefinition.differential.element["+i+"]", mappingDetails);
|
updateFromDefinition(existing, e, profileName, false, url, base, derived, "StructureDefinition.differential.element["+i+"]", mappingDetails);
|
||||||
} else {
|
} else {
|
||||||
ElementDefinition outcome = updateURLs(url, webUrl, e.copy(), true);
|
ElementDefinition outcome = updateURLs(url, webUrl, e.copy(), true);
|
||||||
e.setUserData(UD_GENERATED_IN_SNAPSHOT, outcome);
|
e.setUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT, outcome);
|
||||||
derived.getSnapshot().addElement(outcome);
|
derived.getSnapshot().addElement(outcome);
|
||||||
if (walksInto(diff.getElement(), e)) {
|
if (walksInto(diff.getElement(), e)) {
|
||||||
if (e.getType().size() > 1) {
|
if (e.getType().size() > 1) {
|
||||||
|
@ -813,22 +808,22 @@ public class ProfileUtilities {
|
||||||
System.out.println(" "+ed.getId()+" : "+typeSummaryWithProfile(ed)+"["+ed.getMin()+".."+ed.getMax()+"]"+sliceSummary(ed)+" "+constraintSummary(ed));
|
System.out.println(" "+ed.getId()+" : "+typeSummaryWithProfile(ed)+"["+ed.getMin()+".."+ed.getMax()+"]"+sliceSummary(ed)+" "+constraintSummary(ed));
|
||||||
System.out.println("diff: ");
|
System.out.println("diff: ");
|
||||||
for (ElementDefinition ed : diff.getElement())
|
for (ElementDefinition ed : diff.getElement())
|
||||||
System.out.println(" "+ed.getId()+" : "+typeSummaryWithProfile(ed)+"["+ed.getMin()+".."+ed.getMax()+"]"+sliceSummary(ed)+" "+constraintSummary(ed)+" [gen = "+(ed.hasUserData(UD_GENERATED_IN_SNAPSHOT) ? ed.getUserData(UD_GENERATED_IN_SNAPSHOT) : "--")+"]");
|
System.out.println(" "+ed.getId()+" : "+typeSummaryWithProfile(ed)+"["+ed.getMin()+".."+ed.getMax()+"]"+sliceSummary(ed)+" "+constraintSummary(ed)+" [gen = "+(ed.hasUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT) ? ed.getUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT) : "--")+"]");
|
||||||
}
|
}
|
||||||
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
|
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
|
||||||
//Check that all differential elements have a corresponding snapshot element
|
//Check that all differential elements have a corresponding snapshot element
|
||||||
int ce = 0;
|
int ce = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (ElementDefinition e : diff.getElement()) {
|
for (ElementDefinition e : diff.getElement()) {
|
||||||
if (!e.hasUserData("diff-source"))
|
if (!e.hasUserData(UserDataNames.SNAPSHOT_diff_source))
|
||||||
throw new Error(context.formatMessage(I18nConstants.UNXPECTED_INTERNAL_CONDITION__NO_SOURCE_ON_DIFF_ELEMENT));
|
throw new Error(context.formatMessage(I18nConstants.UNXPECTED_INTERNAL_CONDITION__NO_SOURCE_ON_DIFF_ELEMENT));
|
||||||
else {
|
else {
|
||||||
if (e.hasUserData(UD_DERIVATION_EQUALS))
|
if (e.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS))
|
||||||
((Base) e.getUserData("diff-source")).setUserData(UD_DERIVATION_EQUALS, e.getUserData(UD_DERIVATION_EQUALS));
|
((Base) e.getUserData(UserDataNames.SNAPSHOT_diff_source)).setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, e.getUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS));
|
||||||
if (e.hasUserData(UD_DERIVATION_POINTER))
|
if (e.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER))
|
||||||
((Base) e.getUserData("diff-source")).setUserData(UD_DERIVATION_POINTER, e.getUserData(UD_DERIVATION_POINTER));
|
((Base) e.getUserData(UserDataNames.SNAPSHOT_diff_source)).setUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER, e.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER));
|
||||||
}
|
}
|
||||||
if (!e.hasUserData(UD_GENERATED_IN_SNAPSHOT)) {
|
if (!e.hasUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT)) {
|
||||||
b.append(e.hasId() ? "id: "+e.getId() : "path: "+e.getPath());
|
b.append(e.hasId() ? "id: "+e.getId() : "path: "+e.getPath());
|
||||||
ce++;
|
ce++;
|
||||||
if (e.hasId()) {
|
if (e.hasId()) {
|
||||||
|
@ -902,7 +897,7 @@ public class ProfileUtilities {
|
||||||
int count = slice.checkMin();
|
int count = slice.checkMin();
|
||||||
boolean repeats = !"1".equals(slice.getFocus().getBase().getMax()); // type slicing if repeats = 1
|
boolean repeats = !"1".equals(slice.getFocus().getBase().getMax()); // type slicing if repeats = 1
|
||||||
if (count > -1 && repeats) {
|
if (count > -1 && repeats) {
|
||||||
if (slice.getFocus().hasUserData("auto-added-slicing")) {
|
if (slice.getFocus().hasUserData(UserDataNames.SNAPSHOT_auto_added_slicing)) {
|
||||||
slice.getFocus().setMin(count);
|
slice.getFocus().setMin(count);
|
||||||
} else {
|
} else {
|
||||||
String msg = "The slice definition for "+slice.getFocus().getId()+" has a minimum of "+slice.getFocus().getMin()+" but the slices add up to a minimum of "+count;
|
String msg = "The slice definition for "+slice.getFocus().getId()+" has a minimum of "+slice.getFocus().getMin()+" but the slices add up to a minimum of "+count;
|
||||||
|
@ -985,15 +980,15 @@ public class ProfileUtilities {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// if we had an exception generating the snapshot, make sure we don't leave any half generated snapshot behind
|
// if we had an exception generating the snapshot, make sure we don't leave any half generated snapshot behind
|
||||||
derived.setSnapshot(null);
|
derived.setSnapshot(null);
|
||||||
derived.clearUserData("profileutils.snapshot.generating");
|
derived.clearUserData(UserDataNames.SNAPSHOT_GENERATING);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
derived.clearUserData("profileutils.snapshot.generating");
|
derived.clearUserData(UserDataNames.SNAPSHOT_GENERATING);
|
||||||
snapshotStack.remove(derived.getUrl());
|
snapshotStack.remove(derived.getUrl());
|
||||||
}
|
}
|
||||||
derived.setUserData("profileutils.snapshot.generated", true); // used by the publisher
|
derived.setUserData(UserDataNames.SNAPSHOT_GENERATED, true); // used by the publisher
|
||||||
derived.setUserData("profileutils.snapshot.generated.messages", messages); // used by the publisher
|
derived.setUserData(UserDataNames.SNAPSHOT_GENERATED_MESSAGES, messages); // used by the publisher
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1304,7 +1299,7 @@ public class ProfileUtilities {
|
||||||
for (ElementDefinition sed : source.getElement()) {
|
for (ElementDefinition sed : source.getElement()) {
|
||||||
ElementDefinition ted = sed.copy();
|
ElementDefinition ted = sed.copy();
|
||||||
diff.getElement().add(ted);
|
diff.getElement().add(ted);
|
||||||
ted.setUserData("diff-source", sed);
|
ted.setUserData(UserDataNames.SNAPSHOT_diff_source, sed);
|
||||||
}
|
}
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
@ -1504,12 +1499,12 @@ public class ProfileUtilities {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isGenerating(StructureDefinition sd) {
|
protected boolean isGenerating(StructureDefinition sd) {
|
||||||
return sd.hasUserData("profileutils.snapshot.generating");
|
return sd.hasUserData(UserDataNames.SNAPSHOT_GENERATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void checkNotGenerating(StructureDefinition sd, String role) {
|
protected void checkNotGenerating(StructureDefinition sd, String role) {
|
||||||
if (sd.hasUserData("profileutils.snapshot.generating")) {
|
if (sd.hasUserData(UserDataNames.SNAPSHOT_GENERATING)) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ATTEMPT_TO_USE_A_SNAPSHOT_ON_PROFILE__AS__BEFORE_IT_IS_GENERATED, sd.getUrl(), role));
|
throw new FHIRException(context.formatMessage(I18nConstants.ATTEMPT_TO_USE_A_SNAPSHOT_ON_PROFILE__AS__BEFORE_IT_IS_GENERATED, sd.getUrl(), role));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1792,7 +1787,7 @@ public class ProfileUtilities {
|
||||||
|
|
||||||
protected void markDerived(ElementDefinition outcome) {
|
protected void markDerived(ElementDefinition outcome) {
|
||||||
for (ElementDefinitionConstraintComponent inv : outcome.getConstraint())
|
for (ElementDefinitionConstraintComponent inv : outcome.getConstraint())
|
||||||
inv.setUserData(UD_IS_DERIVED, true);
|
inv.setUserData(UserDataNames.SNAPSHOT_IS_DERIVED, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1823,8 +1818,8 @@ public class ProfileUtilities {
|
||||||
|
|
||||||
|
|
||||||
protected void updateFromBase(ElementDefinition derived, ElementDefinition base, String baseProfileUrl) {
|
protected void updateFromBase(ElementDefinition derived, ElementDefinition base, String baseProfileUrl) {
|
||||||
derived.setUserData(UD_BASE_MODEL, baseProfileUrl);
|
derived.setUserData(UserDataNames.SNAPSHOT_BASE_MODEL, baseProfileUrl);
|
||||||
derived.setUserData(UD_BASE_PATH, base.getPath());
|
derived.setUserData(UserDataNames.SNAPSHOT_BASE_PATH, base.getPath());
|
||||||
if (base.hasBase()) {
|
if (base.hasBase()) {
|
||||||
if (!derived.hasBase())
|
if (!derived.hasBase())
|
||||||
derived.setBase(new ElementDefinitionBaseComponent());
|
derived.setBase(new ElementDefinitionBaseComponent());
|
||||||
|
@ -2395,12 +2390,12 @@ public class ProfileUtilities {
|
||||||
|
|
||||||
|
|
||||||
protected void updateFromDefinition(ElementDefinition dest, ElementDefinition source, String pn, boolean trimDifferential, String purl, StructureDefinition srcSD, StructureDefinition derivedSrc, String path, MappingAssistant mappings) throws DefinitionException, FHIRException {
|
protected void updateFromDefinition(ElementDefinition dest, ElementDefinition source, String pn, boolean trimDifferential, String purl, StructureDefinition srcSD, StructureDefinition derivedSrc, String path, MappingAssistant mappings) throws DefinitionException, FHIRException {
|
||||||
source.setUserData(UD_GENERATED_IN_SNAPSHOT, dest);
|
source.setUserData(UserDataNames.SNAPSHOT_GENERATED_IN_SNAPSHOT, dest);
|
||||||
// we start with a clone of the base profile ('dest') and we copy from the profile ('source')
|
// we start with a clone of the base profile ('dest') and we copy from the profile ('source')
|
||||||
// over the top for anything the source has
|
// over the top for anything the source has
|
||||||
ElementDefinition base = dest;
|
ElementDefinition base = dest;
|
||||||
ElementDefinition derived = source;
|
ElementDefinition derived = source;
|
||||||
derived.setUserData(UD_DERIVATION_POINTER, base);
|
derived.setUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER, base);
|
||||||
boolean isExtension = checkExtensionDoco(base);
|
boolean isExtension = checkExtensionDoco(base);
|
||||||
List<ElementDefinition> obligationProfileElements = new ArrayList<>();
|
List<ElementDefinition> obligationProfileElements = new ArrayList<>();
|
||||||
for (StructureDefinition sd : obligationProfiles) {
|
for (StructureDefinition sd : obligationProfiles) {
|
||||||
|
@ -2461,7 +2456,7 @@ public class ProfileUtilities {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.SNAPSHOT_IS_EMPTY, profile.getVersionedUrl()));
|
throw new DefinitionException(context.formatMessage(I18nConstants.SNAPSHOT_IS_EMPTY, profile.getVersionedUrl()));
|
||||||
}
|
}
|
||||||
ElementDefinition e = profile.getSnapshot().getElement().get(0);
|
ElementDefinition e = profile.getSnapshot().getElement().get(0);
|
||||||
String webroot = profile.getUserString("webroot");
|
String webroot = profile.getUserString(UserDataNames.render_webroot);
|
||||||
|
|
||||||
if (e.hasDefinition()) {
|
if (e.hasDefinition()) {
|
||||||
base.setDefinition(processRelativeUrls(e.getDefinition(), webroot, context.getSpecUrl(), context.getResourceNames(), masterSourceFileNames, localFileNames, true));
|
base.setDefinition(processRelativeUrls(e.getDefinition(), webroot, context.getSpecUrl(), context.getResourceNames(), masterSourceFileNames, localFileNames, true));
|
||||||
|
@ -2506,7 +2501,7 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
derived.setShortElement(null);
|
derived.setShortElement(null);
|
||||||
else if (derived.hasShortElement())
|
else if (derived.hasShortElement())
|
||||||
derived.getShortElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getShortElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasDefinitionElement()) {
|
if (derived.hasDefinitionElement()) {
|
||||||
|
@ -2517,7 +2512,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setDefinitionElement(null);
|
derived.setDefinitionElement(null);
|
||||||
else if (derived.hasDefinitionElement())
|
else if (derived.hasDefinitionElement())
|
||||||
derived.getDefinitionElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getDefinitionElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasCommentElement()) {
|
if (derived.hasCommentElement()) {
|
||||||
|
@ -2528,7 +2523,7 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
base.setCommentElement(derived.getCommentElement().copy());
|
base.setCommentElement(derived.getCommentElement().copy());
|
||||||
else if (derived.hasCommentElement())
|
else if (derived.hasCommentElement())
|
||||||
derived.getCommentElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getCommentElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasLabelElement()) {
|
if (derived.hasLabelElement()) {
|
||||||
|
@ -2539,7 +2534,7 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
base.setLabelElement(derived.getLabelElement().copy());
|
base.setLabelElement(derived.getLabelElement().copy());
|
||||||
else if (derived.hasLabelElement())
|
else if (derived.hasLabelElement())
|
||||||
derived.getLabelElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getLabelElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasRequirementsElement()) {
|
if (derived.hasRequirementsElement()) {
|
||||||
|
@ -2550,7 +2545,7 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
base.setRequirementsElement(derived.getRequirementsElement().copy());
|
base.setRequirementsElement(derived.getRequirementsElement().copy());
|
||||||
else if (derived.hasRequirementsElement())
|
else if (derived.hasRequirementsElement())
|
||||||
derived.getRequirementsElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getRequirementsElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
// sdf-9
|
// sdf-9
|
||||||
if (derived.hasRequirements() && !base.getPath().contains("."))
|
if (derived.hasRequirements() && !base.getPath().contains("."))
|
||||||
|
@ -2568,7 +2563,7 @@ public class ProfileUtilities {
|
||||||
derived.getAlias().clear();
|
derived.getAlias().clear();
|
||||||
else
|
else
|
||||||
for (StringType t : derived.getAlias())
|
for (StringType t : derived.getAlias())
|
||||||
t.setUserData(UD_DERIVATION_EQUALS, true);
|
t.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasMinElement()) {
|
if (derived.hasMinElement()) {
|
||||||
|
@ -2579,7 +2574,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setMinElement(null);
|
derived.setMinElement(null);
|
||||||
else
|
else
|
||||||
derived.getMinElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getMinElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasMaxElement()) {
|
if (derived.hasMaxElement()) {
|
||||||
|
@ -2590,7 +2585,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setMaxElement(null);
|
derived.setMaxElement(null);
|
||||||
else
|
else
|
||||||
derived.getMaxElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getMaxElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasFixed()) {
|
if (derived.hasFixed()) {
|
||||||
|
@ -2599,7 +2594,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setFixed(null);
|
derived.setFixed(null);
|
||||||
else
|
else
|
||||||
derived.getFixed().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getFixed().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasPattern()) {
|
if (derived.hasPattern()) {
|
||||||
|
@ -2609,7 +2604,7 @@ public class ProfileUtilities {
|
||||||
if (trimDifferential)
|
if (trimDifferential)
|
||||||
derived.setPattern(null);
|
derived.setPattern(null);
|
||||||
else
|
else
|
||||||
derived.getPattern().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getPattern().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ElementDefinitionExampleComponent> toDelB = new ArrayList<>();
|
List<ElementDefinitionExampleComponent> toDelB = new ArrayList<>();
|
||||||
|
@ -2636,7 +2631,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential) {
|
} else if (trimDifferential) {
|
||||||
derived.getExample().remove(ex);
|
derived.getExample().remove(ex);
|
||||||
} else {
|
} else {
|
||||||
ex.setUserData(UD_DERIVATION_EQUALS, true);
|
ex.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2649,7 +2644,7 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
derived.setMaxLengthElement(null);
|
derived.setMaxLengthElement(null);
|
||||||
else
|
else
|
||||||
derived.getMaxLengthElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getMaxLengthElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasMaxValue()) {
|
if (derived.hasMaxValue()) {
|
||||||
|
@ -2658,7 +2653,7 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
derived.setMaxValue(null);
|
derived.setMaxValue(null);
|
||||||
else
|
else
|
||||||
derived.getMaxValue().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getMaxValue().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasMinValue()) {
|
if (derived.hasMinValue()) {
|
||||||
|
@ -2667,7 +2662,7 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
derived.setMinValue(null);
|
derived.setMinValue(null);
|
||||||
else
|
else
|
||||||
derived.getMinValue().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getMinValue().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: what to do about conditions?
|
// todo: what to do about conditions?
|
||||||
|
@ -2693,7 +2688,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setMustSupportElement(null);
|
derived.setMustSupportElement(null);
|
||||||
else
|
else
|
||||||
derived.getMustSupportElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getMustSupportElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasMustHaveValueElement()) {
|
if (derived.hasMustHaveValueElement()) {
|
||||||
|
@ -2705,7 +2700,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setMustHaveValueElement(null);
|
derived.setMustHaveValueElement(null);
|
||||||
else
|
else
|
||||||
derived.getMustHaveValueElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getMustHaveValueElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
if (derived.hasValueAlternatives()) {
|
if (derived.hasValueAlternatives()) {
|
||||||
if (!Base.compareDeep(derived.getValueAlternatives(), base.getValueAlternatives(), false))
|
if (!Base.compareDeep(derived.getValueAlternatives(), base.getValueAlternatives(), false))
|
||||||
|
@ -2717,7 +2712,7 @@ public class ProfileUtilities {
|
||||||
derived.getValueAlternatives().clear();
|
derived.getValueAlternatives().clear();
|
||||||
else
|
else
|
||||||
for (CanonicalType t : derived.getValueAlternatives())
|
for (CanonicalType t : derived.getValueAlternatives())
|
||||||
t.setUserData(UD_DERIVATION_EQUALS, true);
|
t.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// profiles cannot change : isModifier, defaultValue, meaningWhenMissing
|
// profiles cannot change : isModifier, defaultValue, meaningWhenMissing
|
||||||
|
@ -2728,13 +2723,13 @@ public class ProfileUtilities {
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
derived.setIsModifierElement(null);
|
derived.setIsModifierElement(null);
|
||||||
else if (derived.hasIsModifierElement())
|
else if (derived.hasIsModifierElement())
|
||||||
derived.getIsModifierElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getIsModifierElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
if (derived.hasIsModifierReasonElement() && !(base.hasIsModifierReasonElement() && Base.compareDeep(derived.getIsModifierReasonElement(), base.getIsModifierReasonElement(), false)))
|
if (derived.hasIsModifierReasonElement() && !(base.hasIsModifierReasonElement() && Base.compareDeep(derived.getIsModifierReasonElement(), base.getIsModifierReasonElement(), false)))
|
||||||
base.setIsModifierReasonElement(derived.getIsModifierReasonElement().copy());
|
base.setIsModifierReasonElement(derived.getIsModifierReasonElement().copy());
|
||||||
else if (trimDifferential)
|
else if (trimDifferential)
|
||||||
derived.setIsModifierReasonElement(null);
|
derived.setIsModifierReasonElement(null);
|
||||||
else if (derived.hasIsModifierReasonElement())
|
else if (derived.hasIsModifierReasonElement())
|
||||||
derived.getIsModifierReasonElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getIsModifierReasonElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hasBinding = derived.hasBinding();
|
boolean hasBinding = derived.hasBinding();
|
||||||
|
@ -2830,7 +2825,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setBinding(null);
|
derived.setBinding(null);
|
||||||
else
|
else
|
||||||
derived.getBinding().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getBinding().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
} else if (base.hasBinding()) {
|
} else if (base.hasBinding()) {
|
||||||
base.getBinding().getExtension().removeIf(ext -> Utilities.existsInList(ext.getUrl(), ProfileUtilities.NON_INHERITED_ED_URLS));
|
base.getBinding().getExtension().removeIf(ext -> Utilities.existsInList(ext.getUrl(), ProfileUtilities.NON_INHERITED_ED_URLS));
|
||||||
}
|
}
|
||||||
|
@ -2843,7 +2838,7 @@ public class ProfileUtilities {
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setIsSummaryElement(null);
|
derived.setIsSummaryElement(null);
|
||||||
else
|
else
|
||||||
derived.getIsSummaryElement().setUserData(UD_DERIVATION_EQUALS, true);
|
derived.getIsSummaryElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (derived.hasType()) {
|
if (derived.hasType()) {
|
||||||
|
@ -2864,14 +2859,14 @@ public class ProfileUtilities {
|
||||||
derived.getType().clear();
|
derived.getType().clear();
|
||||||
else
|
else
|
||||||
for (TypeRefComponent t : derived.getType())
|
for (TypeRefComponent t : derived.getType())
|
||||||
t.setUserData(UD_DERIVATION_EQUALS, true);
|
t.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
mappings.merge(derived, base); // note reversal of names to be correct in .merge()
|
mappings.merge(derived, base); // note reversal of names to be correct in .merge()
|
||||||
|
|
||||||
// todo: constraints are cumulative. there is no replacing
|
// todo: constraints are cumulative. there is no replacing
|
||||||
for (ElementDefinitionConstraintComponent s : base.getConstraint()) {
|
for (ElementDefinitionConstraintComponent s : base.getConstraint()) {
|
||||||
s.setUserData(UD_IS_DERIVED, true);
|
s.setUserData(UserDataNames.SNAPSHOT_IS_DERIVED, true);
|
||||||
if (!s.hasSource()) {
|
if (!s.hasSource()) {
|
||||||
s.setSource(srcSD.getUrl());
|
s.setSource(srcSD.getUrl());
|
||||||
}
|
}
|
||||||
|
@ -3505,7 +3500,7 @@ public class ProfileUtilities {
|
||||||
public void sortDifferential(StructureDefinition base, StructureDefinition diff, String name, List<String> errors, boolean errorIfChanges) throws FHIRException {
|
public void sortDifferential(StructureDefinition base, StructureDefinition diff, String name, List<String> errors, boolean errorIfChanges) throws FHIRException {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (ElementDefinition ed : diff.getDifferential().getElement()) {
|
for (ElementDefinition ed : diff.getDifferential().getElement()) {
|
||||||
ed.setUserData("ed.index", Integer.toString(index));
|
ed.setUserData(UserDataNames.SNAPSHOT_SORT_ed_index, Integer.toString(index));
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
List<ElementDefinition> original = new ArrayList<>();
|
List<ElementDefinition> original = new ArrayList<>();
|
||||||
|
@ -3565,7 +3560,7 @@ public class ProfileUtilities {
|
||||||
ElementDefinition e = diffList.get(i);
|
ElementDefinition e = diffList.get(i);
|
||||||
ElementDefinition n = newDiff.get(i);
|
ElementDefinition n = newDiff.get(i);
|
||||||
if (!n.getPath().equals(e.getPath())) {
|
if (!n.getPath().equals(e.getPath())) {
|
||||||
errors.add("The element "+(e.hasId() ? e.getId() : e.getPath())+" @diff["+e.getUserString("ed.index")+"] is out of order (and maybe others after it)");
|
errors.add("The element "+(e.hasId() ? e.getId() : e.getPath())+" @diff["+e.getUserString(UserDataNames.SNAPSHOT_SORT_ed_index)+"] is out of order (and maybe others after it)");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4252,8 +4247,8 @@ public class ProfileUtilities {
|
||||||
// first, name them
|
// first, name them
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (ElementDefinition ed : slices) {
|
for (ElementDefinition ed : slices) {
|
||||||
if (ed.hasUserData("slice-name")) {
|
if (ed.hasUserData(UserDataNames.SNAPSHOT_slice_name)) {
|
||||||
ed.setSliceName(ed.getUserString("slice-name"));
|
ed.setSliceName(ed.getUserString(UserDataNames.SNAPSHOT_slice_name));
|
||||||
} else {
|
} else {
|
||||||
i++;
|
i++;
|
||||||
ed.setSliceName("slice-"+Integer.toString(i));
|
ed.setSliceName("slice-"+Integer.toString(i));
|
||||||
|
|
|
@ -136,6 +136,7 @@ import org.hl7.fhir.r5.terminologies.client.TerminologyClientContext;
|
||||||
import org.hl7.fhir.r5.utils.PackageHackerR5;
|
import org.hl7.fhir.r5.utils.PackageHackerR5;
|
||||||
import org.hl7.fhir.r5.utils.ResourceUtilities;
|
import org.hl7.fhir.r5.utils.ResourceUtilities;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.client.EFhirClientException;
|
import org.hl7.fhir.r5.utils.client.EFhirClientException;
|
||||||
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
|
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
|
||||||
import org.hl7.fhir.utilities.FhirPublication;
|
import org.hl7.fhir.utilities.FhirPublication;
|
||||||
|
@ -1116,7 +1117,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
|
||||||
} else {
|
} else {
|
||||||
be.getRequest().setUrl("CodeSystem/$validate-code");
|
be.getRequest().setUrl("CodeSystem/$validate-code");
|
||||||
}
|
}
|
||||||
be.setUserData("source", codingValidationRequest);
|
be.setUserData(UserDataNames.TX_REQUEST, codingValidationRequest);
|
||||||
systems.add(codingValidationRequest.getCoding().getSystem());
|
systems.add(codingValidationRequest.getCoding().getSystem());
|
||||||
findRelevantSystems(systems, codingValidationRequest.getCoding());
|
findRelevantSystems(systems, codingValidationRequest.getCoding());
|
||||||
}
|
}
|
||||||
|
@ -1126,7 +1127,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
|
||||||
TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, false);
|
TerminologyClientContext tc = terminologyClientManager.chooseServer(vs, systems, false);
|
||||||
Bundle resp = processBatch(tc, batch, systems);
|
Bundle resp = processBatch(tc, batch, systems);
|
||||||
for (int i = 0; i < batch.getEntry().size(); i++) {
|
for (int i = 0; i < batch.getEntry().size(); i++) {
|
||||||
CodingValidationRequest t = (CodingValidationRequest) batch.getEntry().get(i).getUserData("source");
|
CodingValidationRequest t = (CodingValidationRequest) batch.getEntry().get(i).getUserData(UserDataNames.TX_REQUEST);
|
||||||
BundleEntryComponent r = resp.getEntry().get(i);
|
BundleEntryComponent r = resp.getEntry().get(i);
|
||||||
|
|
||||||
if (r.getResource() instanceof Parameters) {
|
if (r.getResource() instanceof Parameters) {
|
||||||
|
@ -1224,7 +1225,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
|
||||||
} else {
|
} else {
|
||||||
be.getRequest().setUrl("CodeSystem/$validate-code");
|
be.getRequest().setUrl("CodeSystem/$validate-code");
|
||||||
}
|
}
|
||||||
be.setUserData("source", codingValidationRequest);
|
be.setUserData(UserDataNames.TX_REQUEST, codingValidationRequest);
|
||||||
systems.add(codingValidationRequest.getCoding().getSystem());
|
systems.add(codingValidationRequest.getCoding().getSystem());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1233,7 +1234,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
|
||||||
if (batch.getEntry().size() > 0) {
|
if (batch.getEntry().size() > 0) {
|
||||||
Bundle resp = processBatch(tc, batch, systems);
|
Bundle resp = processBatch(tc, batch, systems);
|
||||||
for (int i = 0; i < batch.getEntry().size(); i++) {
|
for (int i = 0; i < batch.getEntry().size(); i++) {
|
||||||
CodingValidationRequest t = (CodingValidationRequest) batch.getEntry().get(i).getUserData("source");
|
CodingValidationRequest t = (CodingValidationRequest) batch.getEntry().get(i).getUserData(UserDataNames.TX_REQUEST);
|
||||||
BundleEntryComponent r = resp.getEntry().get(i);
|
BundleEntryComponent r = resp.getEntry().get(i);
|
||||||
|
|
||||||
if (r.getResource() instanceof Parameters) {
|
if (r.getResource() instanceof Parameters) {
|
||||||
|
@ -3275,7 +3276,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
|
||||||
web = Utilities.pathURL(svs.getServer(), "ValueSet", svs.getVs().getIdBase());
|
web = Utilities.pathURL(svs.getServer(), "ValueSet", svs.getVs().getIdBase());
|
||||||
}
|
}
|
||||||
svs.getVs().setWebPath(web);
|
svs.getVs().setWebPath(web);
|
||||||
svs.getVs().setUserData("External.Link", svs.getServer()); // so we can render it differently
|
svs.getVs().setUserData(UserDataNames.render_external_link, svs.getServer()); // so we can render it differently
|
||||||
}
|
}
|
||||||
if (svs == null) {
|
if (svs == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -3297,7 +3298,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
|
||||||
web = Utilities.pathURL(scs.getServer(), "ValueSet", scs.getCs().getIdBase());
|
web = Utilities.pathURL(scs.getServer(), "ValueSet", scs.getCs().getIdBase());
|
||||||
}
|
}
|
||||||
scs.getCs().setWebPath(web);
|
scs.getCs().setWebPath(web);
|
||||||
scs.getCs().setUserData("External.Link", scs.getServer()); // so we can render it differently
|
scs.getCs().setUserData(UserDataNames.render_external_link, scs.getServer()); // so we can render it differently
|
||||||
}
|
}
|
||||||
if (scs == null) {
|
if (scs == null) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -26,6 +26,7 @@ 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.StructureMap;
|
import org.hl7.fhir.r5.model.StructureMap;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
import org.hl7.fhir.r5.model.Identifier;
|
import org.hl7.fhir.r5.model.Identifier;
|
||||||
import org.hl7.fhir.r5.model.NamingSystem;
|
import org.hl7.fhir.r5.model.NamingSystem;
|
||||||
|
@ -278,7 +279,7 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
|
||||||
for (String err : errors) {
|
for (String err : errors) {
|
||||||
msgs.add(new ValidationMessage(Source.ProfileValidator, IssueType.EXCEPTION, p.getWebPath(), "Error sorting Differential: "+err, ValidationMessage.IssueSeverity.ERROR));
|
msgs.add(new ValidationMessage(Source.ProfileValidator, IssueType.EXCEPTION, p.getWebPath(), "Error sorting Differential: "+err, ValidationMessage.IssueSeverity.ERROR));
|
||||||
}
|
}
|
||||||
pu.generateSnapshot(sd, p, p.getUrl(), sd.getUserString("webroot"), p.getName());
|
pu.generateSnapshot(sd, p, p.getUrl(), sd.getUserString(UserDataNames.render_webroot), p.getName());
|
||||||
for (ValidationMessage msg : msgs) {
|
for (ValidationMessage msg : msgs) {
|
||||||
if ((!ProfileUtilities.isSuppressIgnorableExceptions() && msg.getLevel() == ValidationMessage.IssueSeverity.ERROR) || msg.getLevel() == ValidationMessage.IssueSeverity.FATAL) {
|
if ((!ProfileUtilities.isSuppressIgnorableExceptions() && msg.getLevel() == ValidationMessage.IssueSeverity.ERROR) || msg.getLevel() == ValidationMessage.IssueSeverity.FATAL) {
|
||||||
if (!msg.isIgnorableError()) {
|
if (!msg.isIgnorableError()) {
|
||||||
|
@ -298,9 +299,9 @@ public class ContextUtilities implements ProfileKnowledgeProvider {
|
||||||
|
|
||||||
// work around the fact that some Implementation guides were published with old snapshot generators that left invalid snapshots behind.
|
// work around the fact that some Implementation guides were published with old snapshot generators that left invalid snapshots behind.
|
||||||
private boolean isProfileNeedsRegenerate(StructureDefinition p) {
|
private boolean isProfileNeedsRegenerate(StructureDefinition p) {
|
||||||
boolean needs = !p.hasUserData("hack.regnerated") && Utilities.existsInList(p.getUrl(), "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse");
|
boolean needs = !p.hasUserData(UserDataNames.SNAPSHOT_regeneration_tracker) && Utilities.existsInList(p.getUrl(), "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse");
|
||||||
if (needs) {
|
if (needs) {
|
||||||
p.setUserData("hack.regnerated", "yes");
|
p.setUserData(UserDataNames.SNAPSHOT_regeneration_tracker, "yes");
|
||||||
}
|
}
|
||||||
return needs;
|
return needs;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,9 @@ import org.hl7.fhir.r5.terminologies.client.TerminologyClientManager;
|
||||||
import org.hl7.fhir.r5.terminologies.client.TerminologyClientManager.ITerminologyClientFactory;
|
import org.hl7.fhir.r5.terminologies.client.TerminologyClientManager.ITerminologyClientFactory;
|
||||||
import org.hl7.fhir.r5.terminologies.client.TerminologyClientR5;
|
import org.hl7.fhir.r5.terminologies.client.TerminologyClientR5;
|
||||||
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.r5.utils.R5Hacker;
|
import org.hl7.fhir.r5.utils.R5Hacker;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
import org.hl7.fhir.utilities.ByteProvider;
|
import org.hl7.fhir.utilities.ByteProvider;
|
||||||
import org.hl7.fhir.utilities.MagicResources;
|
import org.hl7.fhir.utilities.MagicResources;
|
||||||
|
@ -139,8 +141,8 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IValidatorFactory {
|
public interface IValidatorFactory {
|
||||||
IResourceValidator makeValidator(IWorkerContext ctxt) throws FHIRException;
|
IResourceValidator makeValidator(IWorkerContext ctxt, ValidatorSession session) throws FHIRException;
|
||||||
IResourceValidator makeValidator(IWorkerContext ctxts, XVerExtensionManager xverManager) throws FHIRException;
|
IResourceValidator makeValidator(IWorkerContext ctxts, XVerExtensionManager xverManager, ValidatorSession session) throws FHIRException;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Questionnaire questionnaire;
|
private Questionnaire questionnaire;
|
||||||
|
@ -610,7 +612,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
public IResourceValidator newValidator() throws FHIRException {
|
public IResourceValidator newValidator() throws FHIRException {
|
||||||
if (validatorFactory == null)
|
if (validatorFactory == null)
|
||||||
throw new Error(formatMessage(I18nConstants.NO_VALIDATOR_CONFIGURED));
|
throw new Error(formatMessage(I18nConstants.NO_VALIDATOR_CONFIGURED));
|
||||||
return validatorFactory.makeValidator(this, xverManager).setJurisdiction(JurisdictionUtilities.getJurisdictionCodingFromLocale(Locale.getDefault().getCountry()));
|
return validatorFactory.makeValidator(this, xverManager, null).setJurisdiction(JurisdictionUtilities.getJurisdictionCodingFromLocale(Locale.getDefault().getCountry()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -620,7 +622,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
public List<String> getResourceNames() {
|
public List<String> getResourceNames() {
|
||||||
Set<String> result = new HashSet<String>();
|
Set<String> result = new HashSet<String>();
|
||||||
for (StructureDefinition sd : listStructures()) {
|
for (StructureDefinition sd : listStructures()) {
|
||||||
if (sd.getKind() == StructureDefinitionKind.RESOURCE && sd.getDerivation() == TypeDerivationRule.SPECIALIZATION && !sd.hasUserData("old.load.mode"))
|
if (sd.getKind() == StructureDefinitionKind.RESOURCE && sd.getDerivation() == TypeDerivationRule.SPECIALIZATION && !sd.hasUserData(UserDataNames.loader_urls_patched))
|
||||||
result.add(sd.getName());
|
result.add(sd.getName());
|
||||||
}
|
}
|
||||||
return Utilities.sorted(result);
|
return Utilities.sorted(result);
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.hl7.fhir.r5.context.CanonicalResourceManager.CanonicalResourceProxy;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule;
|
import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
|
||||||
public class TypeManager {
|
public class TypeManager {
|
||||||
|
@ -55,7 +56,7 @@ public class TypeManager {
|
||||||
typeDefinitions.put(type, types);
|
typeDefinitions.put(type, types);
|
||||||
}
|
}
|
||||||
types.add(sd);
|
types.add(sd);
|
||||||
if (sd.getUrl().startsWith("http://hl7.org/fhir/StructureDefinition/")) {
|
if (sd.getUrl().startsWith("http://hl7.org/fhir/StructureDefinition/") || "true".equals(sd.getUserString(UserDataNames.loader_custom_resource))) {
|
||||||
types = fhirTypeDefinitions.get(type);
|
types = fhirTypeDefinitions.get(type);
|
||||||
if (types == null) {
|
if (types == null) {
|
||||||
types = new HashSet<>();
|
types = new HashSet<>();
|
||||||
|
|
|
@ -54,6 +54,7 @@ import org.hl7.fhir.r5.model.TypeConvertor;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
||||||
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.ElementDecoration;
|
import org.hl7.fhir.utilities.ElementDecoration;
|
||||||
import org.hl7.fhir.utilities.ElementDecoration.DecorationType;
|
import org.hl7.fhir.utilities.ElementDecoration.DecorationType;
|
||||||
import org.hl7.fhir.utilities.FhirPublication;
|
import org.hl7.fhir.utilities.FhirPublication;
|
||||||
|
@ -691,7 +692,7 @@ public class Element extends Base implements NamedItem {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearDecorations() {
|
public void clearDecorations() {
|
||||||
clearUserData("fhir.decorations");
|
clearUserData(UserDataNames.rendering_xml_decorations);
|
||||||
for (Element e : children) {
|
for (Element e : children) {
|
||||||
e.clearDecorations();
|
e.clearDecorations();
|
||||||
}
|
}
|
||||||
|
@ -699,10 +700,10 @@ public class Element extends Base implements NamedItem {
|
||||||
|
|
||||||
public void markValidation(StructureDefinition profile, ElementDefinition definition) {
|
public void markValidation(StructureDefinition profile, ElementDefinition definition) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<ElementDecoration> decorations = (List<ElementDecoration>) getUserData("fhir.decorations");
|
List<ElementDecoration> decorations = (List<ElementDecoration>) getUserData(UserDataNames.rendering_xml_decorations);
|
||||||
if (decorations == null) {
|
if (decorations == null) {
|
||||||
decorations = new ArrayList<>();
|
decorations = new ArrayList<>();
|
||||||
setUserData("fhir.decorations", decorations);
|
setUserData(UserDataNames.rendering_xml_decorations, decorations);
|
||||||
}
|
}
|
||||||
decorations.add(new ElementDecoration(DecorationType.TYPE, profile.getWebPath(), definition.getPath()));
|
decorations.add(new ElementDecoration(DecorationType.TYPE, profile.getWebPath(), definition.getPath()));
|
||||||
if (definition.getId() != null && tail(definition.getId()).contains(":")) {
|
if (definition.getId() != null && tail(definition.getId()).contains(":")) {
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.hl7.fhir.r5.model.StringType;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
|
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
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.i18n.AcceptLanguageHeader;
|
import org.hl7.fhir.utilities.i18n.AcceptLanguageHeader;
|
||||||
|
@ -59,11 +60,6 @@ public class LanguageUtils {
|
||||||
|
|
||||||
public static final List<String> TRANSLATION_SUPPLEMENT_RESOURCE_TYPES = Arrays.asList("CodeSystem", "StructureDefinition", "Questionnaire");
|
public static final List<String> TRANSLATION_SUPPLEMENT_RESOURCE_TYPES = Arrays.asList("CodeSystem", "StructureDefinition", "Questionnaire");
|
||||||
|
|
||||||
private static final String ORPHAN_TRANSLATIONS_NAME = "translations.orphans";
|
|
||||||
|
|
||||||
private static final String SUPPLEMENT_SOURCE_RESOURCE = "translations.supplemented";
|
|
||||||
private static final String SUPPLEMENT_SOURCE_TRANSLATIONS = "translations.source-list";
|
|
||||||
|
|
||||||
IWorkerContext context;
|
IWorkerContext context;
|
||||||
private List<String> crlist;
|
private List<String> crlist;
|
||||||
|
|
||||||
|
@ -401,8 +397,8 @@ public class LanguageUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fillSupplement(CodeSystem csSrc, CodeSystem csDst, List<TranslationUnit> list) {
|
public void fillSupplement(CodeSystem csSrc, CodeSystem csDst, List<TranslationUnit> list) {
|
||||||
csDst.setUserData(SUPPLEMENT_SOURCE_RESOURCE, csSrc);
|
csDst.setUserData(UserDataNames.LANGUTILS_SOURCE_SUPPLEMENT, csSrc);
|
||||||
csDst.setUserData(SUPPLEMENT_SOURCE_TRANSLATIONS, list);
|
csDst.setUserData(UserDataNames.LANGUTILS_SOURCE_TRANSLATIONS, list);
|
||||||
for (TranslationUnit tu : list) {
|
for (TranslationUnit tu : list) {
|
||||||
String code = tu.getId();
|
String code = tu.getId();
|
||||||
String subCode = null;
|
String subCode = null;
|
||||||
|
@ -458,10 +454,10 @@ public class LanguageUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addOrphanTranslation(CodeSystem cs, TranslationUnit tu) {
|
private void addOrphanTranslation(CodeSystem cs, TranslationUnit tu) {
|
||||||
List<TranslationUnit> list = (List<TranslationUnit>) cs.getUserData(ORPHAN_TRANSLATIONS_NAME);
|
List<TranslationUnit> list = (List<TranslationUnit>) cs.getUserData(UserDataNames.LANGUTILS_ORPHAN);
|
||||||
if (list == null) {
|
if (list == null) {
|
||||||
list = new ArrayList<>();
|
list = new ArrayList<>();
|
||||||
cs.setUserData(ORPHAN_TRANSLATIONS_NAME, list);
|
cs.setUserData(UserDataNames.LANGUTILS_ORPHAN, list);
|
||||||
}
|
}
|
||||||
list.add(tu);
|
list.add(tu);
|
||||||
}
|
}
|
||||||
|
@ -489,7 +485,7 @@ public class LanguageUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean handlesAsResource(Resource resource) {
|
public boolean handlesAsResource(Resource resource) {
|
||||||
return (resource instanceof CodeSystem && resource.hasUserData(SUPPLEMENT_SOURCE_RESOURCE)) || (resource instanceof StructureDefinition);
|
return (resource instanceof CodeSystem && resource.hasUserData(UserDataNames.LANGUTILS_SOURCE_SUPPLEMENT)) || (resource instanceof StructureDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean handlesAsElement(Element element) {
|
public boolean handlesAsElement(Element element) {
|
||||||
|
@ -501,20 +497,20 @@ public class LanguageUtils {
|
||||||
if (res instanceof StructureDefinition) {
|
if (res instanceof StructureDefinition) {
|
||||||
StructureDefinition sd = (StructureDefinition) res;
|
StructureDefinition sd = (StructureDefinition) res;
|
||||||
generateTranslations(list, sd, lang);
|
generateTranslations(list, sd, lang);
|
||||||
if (res.hasUserData(ORPHAN_TRANSLATIONS_NAME)) {
|
if (res.hasUserData(UserDataNames.LANGUTILS_ORPHAN)) {
|
||||||
List<TranslationUnit> orphans = (List<TranslationUnit>) res.getUserData(ORPHAN_TRANSLATIONS_NAME);
|
List<TranslationUnit> orphans = (List<TranslationUnit>) res.getUserData(UserDataNames.LANGUTILS_ORPHAN);
|
||||||
for (TranslationUnit t : orphans) {
|
for (TranslationUnit t : orphans) {
|
||||||
list.add(new TranslationUnit(lang, "!!"+t.getId(), t.getContext1(), t.getSrcText(), t.getTgtText()));
|
list.add(new TranslationUnit(lang, "!!"+t.getId(), t.getContext1(), t.getSrcText(), t.getTgtText()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
CodeSystem cs = (CodeSystem) res.getUserData(SUPPLEMENT_SOURCE_RESOURCE);
|
CodeSystem cs = (CodeSystem) res.getUserData(UserDataNames.LANGUTILS_SOURCE_SUPPLEMENT);
|
||||||
List<TranslationUnit> inputs = res.hasUserData(SUPPLEMENT_SOURCE_TRANSLATIONS) ? (List<TranslationUnit>) res.getUserData(SUPPLEMENT_SOURCE_TRANSLATIONS) : new ArrayList<>();
|
List<TranslationUnit> inputs = res.hasUserData(UserDataNames.LANGUTILS_SOURCE_TRANSLATIONS) ? (List<TranslationUnit>) res.getUserData(UserDataNames.LANGUTILS_SOURCE_TRANSLATIONS) : new ArrayList<>();
|
||||||
for (ConceptDefinitionComponent cd : cs.getConcept()) {
|
for (ConceptDefinitionComponent cd : cs.getConcept()) {
|
||||||
generateTranslations(list, cd, lang, inputs);
|
generateTranslations(list, cd, lang, inputs);
|
||||||
}
|
}
|
||||||
if (cs.hasUserData(ORPHAN_TRANSLATIONS_NAME)) {
|
if (cs.hasUserData(UserDataNames.LANGUTILS_ORPHAN)) {
|
||||||
List<TranslationUnit> orphans = (List<TranslationUnit>) cs.getUserData(ORPHAN_TRANSLATIONS_NAME);
|
List<TranslationUnit> orphans = (List<TranslationUnit>) cs.getUserData(UserDataNames.LANGUTILS_ORPHAN);
|
||||||
for (TranslationUnit t : orphans) {
|
for (TranslationUnit t : orphans) {
|
||||||
list.add(new TranslationUnit(lang, "!!"+t.getId(), t.getContext1(), t.getSrcText(), t.getTgtText()));
|
list.add(new TranslationUnit(lang, "!!"+t.getId(), t.getContext1(), t.getSrcText(), t.getTgtText()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,6 +66,7 @@ import org.hl7.fhir.r5.model.ElementDefinition.PropertyRepresentation;
|
||||||
import org.hl7.fhir.r5.model.Enumeration;
|
import org.hl7.fhir.r5.model.Enumeration;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.formats.XmlLocationAnnotator;
|
import org.hl7.fhir.r5.utils.formats.XmlLocationAnnotator;
|
||||||
import org.hl7.fhir.r5.utils.formats.XmlLocationData;
|
import org.hl7.fhir.r5.utils.formats.XmlLocationData;
|
||||||
import org.hl7.fhir.utilities.ElementDecoration;
|
import org.hl7.fhir.utilities.ElementDecoration;
|
||||||
|
@ -802,7 +803,7 @@ public class XmlParser extends ParserBase {
|
||||||
if (!(isElideElements() && element.isElided())) {
|
if (!(isElideElements() && element.isElided())) {
|
||||||
if (showDecorations) {
|
if (showDecorations) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<ElementDecoration> decorations = (List<ElementDecoration>) element.getUserData("fhir.decorations");
|
List<ElementDecoration> decorations = (List<ElementDecoration>) element.getUserData(UserDataNames.rendering_xml_decorations);
|
||||||
if (decorations != null)
|
if (decorations != null)
|
||||||
for (ElementDecoration d : decorations)
|
for (ElementDecoration d : decorations)
|
||||||
xml.decorate(d);
|
xml.decorate(d);
|
||||||
|
|
|
@ -36,6 +36,7 @@ import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.r5.model.Enumerations.*;
|
import org.hl7.fhir.r5.model.Enumerations.*;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
|
import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.instance.model.api.ICompositeType;
|
import org.hl7.fhir.instance.model.api.ICompositeType;
|
||||||
|
@ -596,8 +597,8 @@ public abstract class CanonicalResource extends DomainResource {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String present() {
|
public String present() {
|
||||||
if (hasUserData("presentation")) {
|
if (hasUserData(UserDataNames.render_presentation)) {
|
||||||
return getUserString("presentation");
|
return getUserString(UserDataNames.render_presentation);
|
||||||
}
|
}
|
||||||
if (hasTitle())
|
if (hasTitle())
|
||||||
return getTitle();
|
return getTitle();
|
||||||
|
|
|
@ -53,6 +53,7 @@ import org.hl7.fhir.r5.profilemodel.PEBuilder;
|
||||||
import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy;
|
import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy;
|
||||||
import org.hl7.fhir.r5.profilemodel.gen.PECodeGenerator.ExtensionPolicy;
|
import org.hl7.fhir.r5.profilemodel.gen.PECodeGenerator.ExtensionPolicy;
|
||||||
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.profilemodel.PEDefinition;
|
import org.hl7.fhir.r5.profilemodel.PEDefinition;
|
||||||
import org.hl7.fhir.r5.profilemodel.PEInstance;
|
import org.hl7.fhir.r5.profilemodel.PEInstance;
|
||||||
import org.hl7.fhir.r5.profilemodel.PEType;
|
import org.hl7.fhir.r5.profilemodel.PEType;
|
||||||
|
@ -261,14 +262,14 @@ public class PECodeGenerator {
|
||||||
if (cc.getAbstract()) {
|
if (cc.getAbstract()) {
|
||||||
code = "_"+code;
|
code = "_"+code;
|
||||||
}
|
}
|
||||||
cc.setUserData("java.code", code);
|
cc.setUserData(UserDataNames.java_code, code);
|
||||||
w(enums, " "+code+(i < vse.getValueset().getExpansion().getContains().size() - 1 ? "," : ";")+" // \""+cc.getDisplay()+"\" = "+cc.getSystem()+"#"+cc.getCode());
|
w(enums, " "+code+(i < vse.getValueset().getExpansion().getContains().size() - 1 ? "," : ";")+" // \""+cc.getDisplay()+"\" = "+cc.getSystem()+"#"+cc.getCode());
|
||||||
}
|
}
|
||||||
w(enums, "");
|
w(enums, "");
|
||||||
w(enums, " public static "+name+" fromCode(String s) {");
|
w(enums, " public static "+name+" fromCode(String s) {");
|
||||||
w(enums, " switch (s) {");
|
w(enums, " switch (s) {");
|
||||||
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
||||||
w(enums, " case \""+cc.getCode()+"\": return "+cc.getUserString("java.code")+";");
|
w(enums, " case \""+cc.getCode()+"\": return "+cc.getUserString(UserDataNames.java_code)+";");
|
||||||
}
|
}
|
||||||
w(enums, " default: return null;");
|
w(enums, " default: return null;");
|
||||||
w(enums, " }");
|
w(enums, " }");
|
||||||
|
@ -281,7 +282,7 @@ public class PECodeGenerator {
|
||||||
} else {
|
} else {
|
||||||
w(enums, " if (\""+cc.getSystem()+"\".equals(c.getSystem()) && \""+cc.getCode()+"\".equals(c.getCode())) {");
|
w(enums, " if (\""+cc.getSystem()+"\".equals(c.getSystem()) && \""+cc.getCode()+"\".equals(c.getCode())) {");
|
||||||
}
|
}
|
||||||
w(enums, " return "+cc.getUserString("java.code")+";");
|
w(enums, " return "+cc.getUserString(UserDataNames.java_code)+";");
|
||||||
w(enums, " }");
|
w(enums, " }");
|
||||||
}
|
}
|
||||||
w(enums, " return null;");
|
w(enums, " return null;");
|
||||||
|
@ -301,7 +302,7 @@ public class PECodeGenerator {
|
||||||
w(enums, " public String toDisplay() {");
|
w(enums, " public String toDisplay() {");
|
||||||
w(enums, " switch (this) {");
|
w(enums, " switch (this) {");
|
||||||
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
||||||
w(enums, " case "+cc.getUserString("java.code")+": return \""+Utilities.escapeJava(cc.getDisplay())+"\";");
|
w(enums, " case "+cc.getUserString(UserDataNames.java_code)+": return \""+Utilities.escapeJava(cc.getDisplay())+"\";");
|
||||||
}
|
}
|
||||||
w(enums, " default: return null;");
|
w(enums, " default: return null;");
|
||||||
w(enums, " }");
|
w(enums, " }");
|
||||||
|
@ -311,7 +312,7 @@ public class PECodeGenerator {
|
||||||
w(enums, " public String toCode() {");
|
w(enums, " public String toCode() {");
|
||||||
w(enums, " switch (this) {");
|
w(enums, " switch (this) {");
|
||||||
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
||||||
w(enums, " case "+cc.getUserString("java.code")+": return \""+cc.getCode()+"\";");
|
w(enums, " case "+cc.getUserString(UserDataNames.java_code)+": return \""+cc.getCode()+"\";");
|
||||||
}
|
}
|
||||||
w(enums, " default: return null;");
|
w(enums, " default: return null;");
|
||||||
w(enums, " }");
|
w(enums, " }");
|
||||||
|
@ -321,9 +322,9 @@ public class PECodeGenerator {
|
||||||
w(enums, " switch (this) {");
|
w(enums, " switch (this) {");
|
||||||
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
for (ValueSetExpansionContainsComponent cc : vse.getValueset().getExpansion().getContains()) {
|
||||||
if (cc.hasVersion()) {
|
if (cc.hasVersion()) {
|
||||||
w(enums, " case "+cc.getUserString("java.code")+": return new Coding().setSystem(\""+cc.getSystem()+"\").setVersion(\""+cc.getVersion()+"\").setCode()\""+cc.getCode()+"\";");
|
w(enums, " case "+cc.getUserString(UserDataNames.java_code)+": return new Coding().setSystem(\""+cc.getSystem()+"\").setVersion(\""+cc.getVersion()+"\").setCode()\""+cc.getCode()+"\";");
|
||||||
} else {
|
} else {
|
||||||
w(enums, " case "+cc.getUserString("java.code")+": return new Coding().setSystem(\""+cc.getSystem()+"\").setCode(\""+cc.getCode()+"\");");
|
w(enums, " case "+cc.getUserString(UserDataNames.java_code)+": return new Coding().setSystem(\""+cc.getSystem()+"\").setCode(\""+cc.getCode()+"\");");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
w(enums, " default: return null;");
|
w(enums, " default: return null;");
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.hl7.fhir.r5.model.ValueSet;
|
||||||
import org.hl7.fhir.r5.renderers.CodeResolver.CodeResolution;
|
import org.hl7.fhir.r5.renderers.CodeResolver.CodeResolution;
|
||||||
import org.hl7.fhir.r5.renderers.Renderer.RenderingStatus;
|
import org.hl7.fhir.r5.renderers.Renderer.RenderingStatus;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
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.xhtml.HierarchicalTableGenerator;
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
|
||||||
|
@ -117,7 +118,7 @@ public class AdditionalBindingsRenderer {
|
||||||
abr.compare = new AdditionalBindingDetail();
|
abr.compare = new AdditionalBindingDetail();
|
||||||
abr.compare.valueSet = compExt==null ? null : compExt.getValue().primitiveValue();
|
abr.compare.valueSet = compExt==null ? null : compExt.getValue().primitiveValue();
|
||||||
} else {
|
} else {
|
||||||
abr.isUnchanged = ext.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS);
|
abr.isUnchanged = ext.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS);
|
||||||
}
|
}
|
||||||
bindings.add(abr);
|
bindings.add(abr);
|
||||||
}
|
}
|
||||||
|
@ -181,7 +182,7 @@ public class AdditionalBindingsRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
abr.any = "any".equals(ext.getExtensionString("scope"));
|
abr.any = "any".equals(ext.getExtensionString("scope"));
|
||||||
abr.isUnchanged = ext.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS);
|
abr.isUnchanged = ext.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS);
|
||||||
return abr;
|
return abr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +194,7 @@ public class AdditionalBindingsRenderer {
|
||||||
abr.docoShort = ab.getShortDoco();
|
abr.docoShort = ab.getShortDoco();
|
||||||
abr.usages.addAll(ab.getUsage());
|
abr.usages.addAll(ab.getUsage());
|
||||||
abr.any = ab.getAny();
|
abr.any = ab.getAny();
|
||||||
abr.isUnchanged = ab.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS);
|
abr.isUnchanged = ab.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS);
|
||||||
return abr;
|
return abr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
|
||||||
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities.CodeSystemNavigator;
|
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities.CodeSystemNavigator;
|
||||||
import org.hl7.fhir.r5.utils.EOperationOutcome;
|
import org.hl7.fhir.r5.utils.EOperationOutcome;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.LoincLinker;
|
import org.hl7.fhir.utilities.LoincLinker;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
||||||
|
@ -409,7 +410,7 @@ public class CodeSystemRenderer extends TerminologyRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean conceptsHaveVersion(ConceptDefinitionComponent c) {
|
private boolean conceptsHaveVersion(ConceptDefinitionComponent c) {
|
||||||
if (c.hasUserData("cs.version.notes"))
|
if (c.hasUserData(UserDataNames.tx_cs_version_notes))
|
||||||
return true;
|
return true;
|
||||||
for (ConceptDefinitionComponent g : c.getConcept())
|
for (ConceptDefinitionComponent g : c.getConcept())
|
||||||
if (conceptsHaveVersion(g))
|
if (conceptsHaveVersion(g))
|
||||||
|
@ -567,8 +568,9 @@ public class CodeSystemRenderer extends TerminologyRenderer {
|
||||||
}
|
}
|
||||||
if (version) {
|
if (version) {
|
||||||
td = tr.td();
|
td = tr.td();
|
||||||
if (c.hasUserData("cs.version.notes"))
|
if (c.hasUserData(UserDataNames.tx_cs_version_notes)) { // todo: this is never set
|
||||||
td.addText(c.getUserString("cs.version.notes"));
|
td.addText(c.getUserString(UserDataNames.tx_cs_version_notes));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (properties != null) {
|
if (properties != null) {
|
||||||
for (PropertyComponent pc : properties) {
|
for (PropertyComponent pc : properties) {
|
||||||
|
|
|
@ -50,6 +50,7 @@ import org.hl7.fhir.r5.terminologies.JurisdictionUtilities;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.SnomedUtilities;
|
import org.hl7.fhir.r5.terminologies.utilities.SnomedUtilities;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
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.VersionUtilities;
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
|
@ -148,7 +149,7 @@ public class DataRenderer extends Renderer implements CodeResolver {
|
||||||
}
|
}
|
||||||
url = p.getWebPath();
|
url = p.getWebPath();
|
||||||
if (url == null) {
|
if (url == null) {
|
||||||
url = p.getUserString("filename");
|
url = p.getUserString(UserDataNames.render_filename);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new DefinitionException(context.formatPhrase(RenderingContext.DATA_REND_MKDWN_LNK, link) + " ");
|
throw new DefinitionException(context.formatPhrase(RenderingContext.DATA_REND_MKDWN_LNK, link) + " ");
|
||||||
|
@ -261,8 +262,8 @@ public class DataRenderer extends Renderer implements CodeResolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String crPresent(CanonicalResource cr) {
|
private String crPresent(CanonicalResource cr) {
|
||||||
if (cr.hasUserData("presentation")) {
|
if (cr.hasUserData(UserDataNames.render_presentation)) {
|
||||||
return cr.getUserString("presentation");
|
return cr.getUserString(UserDataNames.render_presentation);
|
||||||
}
|
}
|
||||||
if (cr.hasTitle())
|
if (cr.hasTitle())
|
||||||
return context.getTranslated(cr.getTitleElement());
|
return context.getTranslated(cr.getTitleElement());
|
||||||
|
|
|
@ -19,6 +19,7 @@ import org.hl7.fhir.r5.model.ValueSet;
|
||||||
import org.hl7.fhir.r5.renderers.CodeResolver.CodeResolution;
|
import org.hl7.fhir.r5.renderers.CodeResolver.CodeResolution;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
||||||
import org.hl7.fhir.r5.renderers.utils.ResourceWrapper;
|
import org.hl7.fhir.r5.renderers.utils.ResourceWrapper;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
|
||||||
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell;
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell;
|
||||||
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece;
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece;
|
||||||
|
@ -65,7 +66,7 @@ public class ObligationsRenderer extends Renderer {
|
||||||
for (Extension eid : ext.getExtensionsByUrl("elementId")) {
|
for (Extension eid : ext.getExtensionsByUrl("elementId")) {
|
||||||
this.elementIds.add(eid.getValue().primitiveValue());
|
this.elementIds.add(eid.getValue().primitiveValue());
|
||||||
}
|
}
|
||||||
this.isUnchanged = ext.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS);
|
this.isUnchanged = ext.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getKey() {
|
private String getKey() {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext.KnownLinkType;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext.KnownLinkType;
|
||||||
import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode;
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.renderers.utils.ResourceWrapper;
|
import org.hl7.fhir.r5.renderers.utils.ResourceWrapper;
|
||||||
import org.hl7.fhir.utilities.MarkDownProcessor;
|
import org.hl7.fhir.utilities.MarkDownProcessor;
|
||||||
import org.hl7.fhir.utilities.MarkDownProcessor.Dialect;
|
import org.hl7.fhir.utilities.MarkDownProcessor.Dialect;
|
||||||
|
@ -87,7 +88,7 @@ public class Renderer {
|
||||||
if (b == null || context.getChangeVersion() == null) {
|
if (b == null || context.getChangeVersion() == null) {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
VersionComparisonAnnotation vca = (VersionComparisonAnnotation) b.getUserData(VersionComparisonAnnotation.USER_DATA_NAME);
|
VersionComparisonAnnotation vca = (VersionComparisonAnnotation) b.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
if (vca == null) {
|
if (vca == null) {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +120,7 @@ public class Renderer {
|
||||||
if (b == null || context.getChangeVersion() == null) {
|
if (b == null || context.getChangeVersion() == null) {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
VersionComparisonAnnotation vca = (VersionComparisonAnnotation) b.getUserData(VersionComparisonAnnotation.USER_DATA_NAME);
|
VersionComparisonAnnotation vca = (VersionComparisonAnnotation) b.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
if (vca == null) {
|
if (vca == null) {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -152,7 +153,7 @@ public class Renderer {
|
||||||
if (b == null || context.getChangeVersion() == null) {
|
if (b == null || context.getChangeVersion() == null) {
|
||||||
return tr.td();
|
return tr.td();
|
||||||
}
|
}
|
||||||
VersionComparisonAnnotation vca = (VersionComparisonAnnotation) b.getUserData(VersionComparisonAnnotation.USER_DATA_NAME);
|
VersionComparisonAnnotation vca = (VersionComparisonAnnotation) b.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
if (vca == null) {
|
if (vca == null) {
|
||||||
return tr.td();
|
return tr.td();
|
||||||
}
|
}
|
||||||
|
@ -191,8 +192,8 @@ public class Renderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void renderStatusSummary(RenderingContext context, Base base, XhtmlNode x, String version, String... metadataFields) {
|
public static void renderStatusSummary(RenderingContext context, Base base, XhtmlNode x, String version, String... metadataFields) {
|
||||||
if (base.hasUserData(VersionComparisonAnnotation.USER_DATA_NAME)) {
|
if (base.hasUserData(UserDataNames.COMP_VERSION_ANNOTATION)) {
|
||||||
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(VersionComparisonAnnotation.USER_DATA_NAME);
|
VersionComparisonAnnotation self = (VersionComparisonAnnotation) base.getUserData(UserDataNames.COMP_VERSION_ANNOTATION);
|
||||||
switch (self.getType()) {
|
switch (self.getType()) {
|
||||||
case Added:
|
case Added:
|
||||||
XhtmlNode spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", context.formatPhrase(RenderingContext.REND_SINCE_ADDED, version));
|
XhtmlNode spanInner = x.span("background-color: #fff2ff; border-left: solid 3px #ffa0ff; margin: 2px; padding: 2px", context.formatPhrase(RenderingContext.REND_SINCE_ADDED, version));
|
||||||
|
|
|
@ -70,7 +70,7 @@ public class RendererFactory {
|
||||||
switch (resource.fhirType()) {
|
switch (resource.fhirType()) {
|
||||||
case "DiagnosticReport": return new DiagnosticReportRenderer(context);
|
case "DiagnosticReport": return new DiagnosticReportRenderer(context);
|
||||||
case "Library": return new LibraryRenderer(context);
|
case "Library": return new LibraryRenderer(context);
|
||||||
case "Questionnaire": return new LibraryRenderer(context);
|
case "ViewDefinition": return new ViewDefinitionRenderer(context);
|
||||||
case "List": return new ListRenderer(context);
|
case "List": return new ListRenderer(context);
|
||||||
case "Patient": return new PatientRenderer(context);
|
case "Patient": return new PatientRenderer(context);
|
||||||
case "Provenance": return new ProvenanceRenderer(context);
|
case "Provenance": return new ProvenanceRenderer(context);
|
||||||
|
|
|
@ -66,6 +66,10 @@ public abstract class ResourceRenderer extends DataRenderer {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean renderingUsesValidation() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Just build the narrative that would go in the resource (per @renderResource()), but don't put it in the resource
|
* Just build the narrative that would go in the resource (per @renderResource()), but don't put it in the resource
|
||||||
* @param dr
|
* @param dr
|
||||||
|
|
|
@ -75,6 +75,7 @@ import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.EOperationOutcome;
|
import org.hl7.fhir.r5.utils.EOperationOutcome;
|
||||||
import org.hl7.fhir.r5.utils.PublicationHacker;
|
import org.hl7.fhir.r5.utils.PublicationHacker;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.MarkDownProcessor;
|
import org.hl7.fhir.utilities.MarkDownProcessor;
|
||||||
import org.hl7.fhir.utilities.StandardsStatus;
|
import org.hl7.fhir.utilities.StandardsStatus;
|
||||||
|
@ -292,8 +293,8 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderDetails(XhtmlNode f) {
|
public void renderDetails(XhtmlNode f) {
|
||||||
if (value.hasUserData("render.link")) {
|
if (value.hasUserData(UserDataNames.render_link)) {
|
||||||
f = f.ah(context.prefixLocalHref(value.getUserString("render.link")));
|
f = f.ah(context.prefixLocalHref(value.getUserString(UserDataNames.render_link)));
|
||||||
}
|
}
|
||||||
f.tx(value.asStringValue());
|
f.tx(value.asStringValue());
|
||||||
}
|
}
|
||||||
|
@ -312,8 +313,8 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
|
|
||||||
public void renderDetails(XhtmlNode f) throws IOException {
|
public void renderDetails(XhtmlNode f) throws IOException {
|
||||||
|
|
||||||
if (value.hasUserData("render.link")) {
|
if (value.hasUserData(UserDataNames.render_link)) {
|
||||||
f = f.ah(context.prefixLocalHref(value.getUserString("render.link")));
|
f = f.ah(context.prefixLocalHref(value.getUserString(UserDataNames.render_link)));
|
||||||
}
|
}
|
||||||
f.tx(summarize(value));
|
f.tx(summarize(value));
|
||||||
}
|
}
|
||||||
|
@ -777,7 +778,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
} else {
|
} else {
|
||||||
row.setIcon("icon_resource.png", context.formatPhrase(RenderingContext.GENERAL_RESOURCE));
|
row.setIcon("icon_resource.png", context.formatPhrase(RenderingContext.GENERAL_RESOURCE));
|
||||||
}
|
}
|
||||||
if (element.hasUserData("render.opaque")) {
|
if (element.hasUserData(UserDataNames.render_opaque)) {
|
||||||
row.setOpacity("0.5");
|
row.setOpacity("0.5");
|
||||||
}
|
}
|
||||||
UnusedTracker used = new UnusedTracker();
|
UnusedTracker used = new UnusedTracker();
|
||||||
|
@ -790,8 +791,8 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
if (logicalModel) {
|
if (logicalModel) {
|
||||||
if (element.hasRepresentation(PropertyRepresentation.XMLATTR)) {
|
if (element.hasRepresentation(PropertyRepresentation.XMLATTR)) {
|
||||||
sName = "@"+sName;
|
sName = "@"+sName;
|
||||||
} else if (element.hasUserData("derived.pointer")) {
|
} else if (element.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER)) {
|
||||||
ElementDefinition drv = (ElementDefinition) element.getUserData("derived.pointer");
|
ElementDefinition drv = (ElementDefinition) element.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER);
|
||||||
if (drv.hasRepresentation(PropertyRepresentation.XMLATTR)) {
|
if (drv.hasRepresentation(PropertyRepresentation.XMLATTR)) {
|
||||||
sName = "@"+sName;
|
sName = "@"+sName;
|
||||||
}
|
}
|
||||||
|
@ -969,7 +970,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isTypeSlice(ElementDefinition child) {
|
private boolean isTypeSlice(ElementDefinition child) {
|
||||||
ElementDefinition derived = (ElementDefinition) child.getUserData("derived.pointer");
|
ElementDefinition derived = (ElementDefinition) child.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER);
|
||||||
return derived != null && derived.getBase().getPath().endsWith("[x]");
|
return derived != null && derived.getBase().getPath().endsWith("[x]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1138,7 +1139,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
if (extDefn == null) {
|
if (extDefn == null) {
|
||||||
res.add(genCardinality(gen, element, row, hasDef, used, null));
|
res.add(genCardinality(gen, element, row, hasDef, used, null));
|
||||||
res.add(addCell(row, gen.new Cell(null, null, "?gen-e1? "+element.getType().get(0).getProfile(), null, null)));
|
res.add(addCell(row, gen.new Cell(null, null, "?gen-e1? "+element.getType().get(0).getProfile(), null, null)));
|
||||||
res.add(generateDescription(status, gen, row, element, (ElementDefinition) element.getUserData(ProfileUtilities.UD_DERIVATION_POINTER), used.used, profile == null ? "" : profile.getUrl(), eurl, profile, corePath, imagePath, root, logicalModel, allInvariants, snapshot, mustSupport, allowSubRows, rc, inScopeElements, resource));
|
res.add(generateDescription(status, gen, row, element, (ElementDefinition) element.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER), used.used, profile == null ? "" : profile.getUrl(), eurl, profile, corePath, imagePath, root, logicalModel, allInvariants, snapshot, mustSupport, allowSubRows, rc, inScopeElements, resource));
|
||||||
} else {
|
} else {
|
||||||
String name = element.hasSliceName() ? element.getSliceName() : urltail(eurl);
|
String name = element.hasSliceName() ? element.getSliceName() : urltail(eurl);
|
||||||
nameCell.getPieces().get(0).setText(name);
|
nameCell.getPieces().get(0).setText(name);
|
||||||
|
@ -1159,7 +1160,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
res.add(addCell(row, gen.new Cell()));
|
res.add(addCell(row, gen.new Cell()));
|
||||||
else
|
else
|
||||||
res.add(genTypes(gen, row, element, profileBaseFileName, profile, corePath, imagePath, root, mustSupport));
|
res.add(genTypes(gen, row, element, profileBaseFileName, profile, corePath, imagePath, root, mustSupport));
|
||||||
res.add(generateDescription(status, gen, row, element, (ElementDefinition) element.getUserData(ProfileUtilities.UD_DERIVATION_POINTER), used.used, null, null, profile, corePath, imagePath, root, logicalModel, allInvariants, snapshot, mustSupport, allowSubRows, rc, inScopeElements, resource));
|
res.add(generateDescription(status, gen, row, element, (ElementDefinition) element.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER), used.used, null, null, profile, corePath, imagePath, root, logicalModel, allInvariants, snapshot, mustSupport, allowSubRows, rc, inScopeElements, resource));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (element != null) {
|
} else if (element != null) {
|
||||||
|
@ -1168,7 +1169,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
res.add(genTypes(gen, row, element, profileBaseFileName, profile, corePath, imagePath, root, mustSupport));
|
res.add(genTypes(gen, row, element, profileBaseFileName, profile, corePath, imagePath, root, mustSupport));
|
||||||
else
|
else
|
||||||
res.add(addCell(row, gen.new Cell()));
|
res.add(addCell(row, gen.new Cell()));
|
||||||
res.add(generateDescription(status, gen, row, element, (ElementDefinition) element.getUserData(ProfileUtilities.UD_DERIVATION_POINTER), used.used, null, null, profile, corePath, imagePath, root, logicalModel, allInvariants, snapshot, mustSupport, allowSubRows, rc, inScopeElements, resource));
|
res.add(generateDescription(status, gen, row, element, (ElementDefinition) element.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER), used.used, null, null, profile, corePath, imagePath, root, logicalModel, allInvariants, snapshot, mustSupport, allowSubRows, rc, inScopeElements, resource));
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1176,18 +1177,18 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
private Cell genCardinality(HierarchicalTableGenerator gen, ElementDefinition definition, Row row, boolean hasDef, UnusedTracker tracker, ElementDefinition fallback) {
|
private Cell genCardinality(HierarchicalTableGenerator gen, ElementDefinition definition, Row row, boolean hasDef, UnusedTracker tracker, ElementDefinition fallback) {
|
||||||
IntegerType min = !hasDef ? new IntegerType() : definition.hasMinElement() ? definition.getMinElement() : new IntegerType();
|
IntegerType min = !hasDef ? new IntegerType() : definition.hasMinElement() ? definition.getMinElement() : new IntegerType();
|
||||||
StringType max = !hasDef ? new StringType() : definition.hasMaxElement() ? definition.getMaxElement() : new StringType();
|
StringType max = !hasDef ? new StringType() : definition.hasMaxElement() ? definition.getMaxElement() : new StringType();
|
||||||
if (min.isEmpty() && definition.getUserData(ProfileUtilities.UD_DERIVATION_POINTER) != null) {
|
if (min.isEmpty() && definition.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER) != null) {
|
||||||
ElementDefinition base = (ElementDefinition) definition.getUserData(ProfileUtilities.UD_DERIVATION_POINTER);
|
ElementDefinition base = (ElementDefinition) definition.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER);
|
||||||
if (base.hasMinElement()) {
|
if (base.hasMinElement()) {
|
||||||
min = base.getMinElement().copy();
|
min = base.getMinElement().copy();
|
||||||
min.setUserData(ProfileUtilities.UD_DERIVATION_EQUALS, true);
|
min.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (max.isEmpty() && definition.getUserData(ProfileUtilities.UD_DERIVATION_POINTER) != null) {
|
if (max.isEmpty() && definition.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER) != null) {
|
||||||
ElementDefinition base = (ElementDefinition) definition.getUserData(ProfileUtilities.UD_DERIVATION_POINTER);
|
ElementDefinition base = (ElementDefinition) definition.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER);
|
||||||
if (base.hasMaxElement()) {
|
if (base.hasMaxElement()) {
|
||||||
max = base.getMaxElement().copy();
|
max = base.getMaxElement().copy();
|
||||||
max.setUserData(ProfileUtilities.UD_DERIVATION_EQUALS, true);
|
max.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (min.isEmpty() && fallback != null)
|
if (min.isEmpty() && fallback != null)
|
||||||
|
@ -1848,14 +1849,14 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Piece checkForNoChange(Element source, Piece piece) {
|
private Piece checkForNoChange(Element source, Piece piece) {
|
||||||
if (source.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS)) {
|
if (source.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS)) {
|
||||||
piece.addStyle("opacity: 0.5");
|
piece.addStyle("opacity: 0.5");
|
||||||
}
|
}
|
||||||
return piece;
|
return piece;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String checkForNoChange(Element source) {
|
private String checkForNoChange(Element source) {
|
||||||
if (source.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS)) {
|
if (source.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS)) {
|
||||||
return "opacity: 0.5";
|
return "opacity: 0.5";
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
@ -1875,7 +1876,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
c.getPieces().add(gen.new Piece("#"+ed.getElement().getPath(), tail(ed.getElement().getPath()), ed.getElement().getPath()));
|
c.getPieces().add(gen.new Piece("#"+ed.getElement().getPath(), tail(ed.getElement().getPath()), ed.getElement().getPath()));
|
||||||
} else {
|
} else {
|
||||||
c.getPieces().add(gen.new Piece(null, context.formatPhrase(RenderingContext.STRUC_DEF_SEE)+" ", null));
|
c.getPieces().add(gen.new Piece(null, context.formatPhrase(RenderingContext.STRUC_DEF_SEE)+" ", null));
|
||||||
c.getPieces().add(gen.new Piece(pfx(corePath, ed.getSource().getWebPath())+"#"+ed.getElement().getPath(), tail(ed.getElement().getPath())+" ("+ed.getSource().getTypeName()+")", ed.getElement().getPath()));
|
c.getPieces().add(gen.new Piece(typePath(corePath, ed.getSource())+"#"+ed.getElement().getPath(), tail(ed.getElement().getPath())+" ("+ed.getSource().getTypeName()+")", ed.getElement().getPath()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
|
@ -1899,12 +1900,12 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
} else if (e.hasContentReference()) {
|
} else if (e.hasContentReference()) {
|
||||||
return c;
|
return c;
|
||||||
} else {
|
} else {
|
||||||
ElementDefinition d = (ElementDefinition) e.getUserData(ProfileUtilities.UD_DERIVATION_POINTER);
|
ElementDefinition d = (ElementDefinition) e.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER);
|
||||||
if (d != null && d.hasType()) {
|
if (d != null && d.hasType()) {
|
||||||
types = new ArrayList<ElementDefinition.TypeRefComponent>();
|
types = new ArrayList<ElementDefinition.TypeRefComponent>();
|
||||||
for (TypeRefComponent tr : d.getType()) {
|
for (TypeRefComponent tr : d.getType()) {
|
||||||
TypeRefComponent tt = tr.copy();
|
TypeRefComponent tt = tr.copy();
|
||||||
tt.setUserData(ProfileUtilities.UD_DERIVATION_EQUALS, true);
|
tt.setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, true);
|
||||||
types.add(tt);
|
types.add(tt);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2054,6 +2055,14 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String typePath(String cp, StructureDefinition source) {
|
||||||
|
if (source.hasUserData(UserDataNames.loader_custom_resource)) {
|
||||||
|
return source.getWebPath();
|
||||||
|
} else {
|
||||||
|
return pfx(cp, source.getWebPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean hasMultipleVersions(List<? extends CanonicalResource> list) {
|
private boolean hasMultipleVersions(List<? extends CanonicalResource> list) {
|
||||||
Set<String> vl = new HashSet<>();
|
Set<String> vl = new HashSet<>();
|
||||||
for (CanonicalResource cr : list) {
|
for (CanonicalResource cr : list) {
|
||||||
|
@ -2281,33 +2290,33 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ElementDefinitionBindingComponent makeUnifiedBinding(ElementDefinitionBindingComponent binding, ElementDefinition element) {
|
private ElementDefinitionBindingComponent makeUnifiedBinding(ElementDefinitionBindingComponent binding, ElementDefinition element) {
|
||||||
if (!element.hasUserData(ProfileUtilities.UD_DERIVATION_POINTER)) {
|
if (!element.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER)) {
|
||||||
return binding;
|
return binding;
|
||||||
}
|
}
|
||||||
ElementDefinition base = (ElementDefinition) element.getUserData(ProfileUtilities.UD_DERIVATION_POINTER);
|
ElementDefinition base = (ElementDefinition) element.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER);
|
||||||
if (!base.hasBinding()) {
|
if (!base.hasBinding()) {
|
||||||
return binding;
|
return binding;
|
||||||
}
|
}
|
||||||
ElementDefinitionBindingComponent o = base.getBinding();
|
ElementDefinitionBindingComponent o = base.getBinding();
|
||||||
ElementDefinitionBindingComponent b = new ElementDefinitionBindingComponent();
|
ElementDefinitionBindingComponent b = new ElementDefinitionBindingComponent();
|
||||||
b.setUserData(ProfileUtilities.UD_DERIVATION_POINTER, o);
|
b.setUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER, o);
|
||||||
if (binding.hasValueSet()) {
|
if (binding.hasValueSet()) {
|
||||||
b.setValueSet(binding.getValueSet());
|
b.setValueSet(binding.getValueSet());
|
||||||
} else if (o.hasValueSet()) {
|
} else if (o.hasValueSet()) {
|
||||||
b.setValueSet(o.getValueSet());
|
b.setValueSet(o.getValueSet());
|
||||||
b.getValueSetElement().setUserData(ProfileUtilities.UD_DERIVATION_EQUALS, o.getValueSetElement());
|
b.getValueSetElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, o.getValueSetElement());
|
||||||
}
|
}
|
||||||
if (binding.hasStrength()) {
|
if (binding.hasStrength()) {
|
||||||
b.setStrength(binding.getStrength());
|
b.setStrength(binding.getStrength());
|
||||||
} else if (o.hasStrength()) {
|
} else if (o.hasStrength()) {
|
||||||
b.setStrength(o.getStrength());
|
b.setStrength(o.getStrength());
|
||||||
b.getStrengthElement().setUserData(ProfileUtilities.UD_DERIVATION_EQUALS, o.getStrengthElement());
|
b.getStrengthElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, o.getStrengthElement());
|
||||||
}
|
}
|
||||||
if (binding.hasDescription()) {
|
if (binding.hasDescription()) {
|
||||||
b.setDescription(binding.getDescription());
|
b.setDescription(binding.getDescription());
|
||||||
} else if (o.hasDescription()) {
|
} else if (o.hasDescription()) {
|
||||||
b.setDescription(o.getDescription());
|
b.setDescription(o.getDescription());
|
||||||
b.getDescriptionElement().setUserData(ProfileUtilities.UD_DERIVATION_EQUALS, o.getDescriptionElement());
|
b.getDescriptionElement().setUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS, o.getDescriptionElement());
|
||||||
}
|
}
|
||||||
// todo: derivation?
|
// todo: derivation?
|
||||||
b.getExtension().addAll(binding.getExtension());
|
b.getExtension().addAll(binding.getExtension());
|
||||||
|
@ -2913,7 +2922,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Piece checkForNoChange(Element src1, Element src2, Piece piece) {
|
private Piece checkForNoChange(Element src1, Element src2, Piece piece) {
|
||||||
if (src1.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS) && src2.hasUserData(ProfileUtilities.UD_DERIVATION_EQUALS)) {
|
if (src1.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS) && src2.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_EQUALS)) {
|
||||||
piece.addStyle("opacity: 0.5");
|
piece.addStyle("opacity: 0.5");
|
||||||
}
|
}
|
||||||
return piece;
|
return piece;
|
||||||
|
@ -3460,7 +3469,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
sdCache = new HashMap<String, ElementDefinition>();
|
sdCache = new HashMap<String, ElementDefinition>();
|
||||||
sdMapCache.put(url, sdCache);
|
sdMapCache.put(url, sdCache);
|
||||||
String webroot = sd.getUserString("webroot");
|
String webroot = sd.getUserString(UserDataNames.render_webroot);
|
||||||
for (ElementDefinition e : sd.getSnapshot().getElement()) {
|
for (ElementDefinition e : sd.getSnapshot().getElement()) {
|
||||||
context.getProfileUtilities().updateURLs(sd.getUrl(), webroot, e, false);
|
context.getProfileUtilities().updateURLs(sd.getUrl(), webroot, e, false);
|
||||||
sdCache.put(e.getId(), e);
|
sdCache.put(e.getId(), e);
|
||||||
|
@ -3472,8 +3481,8 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
|
|
||||||
// Returns the ElementDefinition for the 'parent' of the current element
|
// Returns the ElementDefinition for the 'parent' of the current element
|
||||||
private ElementDefinition getBaseElement(ElementDefinition e, String url) {
|
private ElementDefinition getBaseElement(ElementDefinition e, String url) {
|
||||||
if (e.hasUserData(ProfileUtilities.UD_DERIVATION_POINTER)) {
|
if (e.hasUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER)) {
|
||||||
return getElementById(url, e.getUserString(ProfileUtilities.UD_DERIVATION_POINTER));
|
return getElementById(url, e.getUserString(UserDataNames.SNAPSHOT_DERIVATION_POINTER));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -3550,13 +3559,13 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
} else {
|
} else {
|
||||||
// we delete it from the other
|
// we delete it from the other
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<String> other = (List<String>) allAnchors.get(s).getUserData("dict.generator.anchors");
|
List<String> other = (List<String>) allAnchors.get(s).getUserData(UserDataNames.render_dict_generator_anchors);
|
||||||
other.remove(s);
|
other.remove(s);
|
||||||
allAnchors.put(s, ed);
|
allAnchors.put(s, ed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
list.removeAll(removed);
|
list.removeAll(removed);
|
||||||
ed.setUserData("dict.generator.anchors", list);
|
ed.setUserData(UserDataNames.render_dict_generator_anchors, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addToStack(List<ElementDefinition> stack, ElementDefinition ec) {
|
private void addToStack(List<ElementDefinition> stack, ElementDefinition ec) {
|
||||||
|
@ -3571,7 +3580,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> makeAnchors(ElementDefinition ed, String anchorPrefix) {
|
private List<String> makeAnchors(ElementDefinition ed, String anchorPrefix) {
|
||||||
List<String> list = (List<String>) ed.getUserData("dict.generator.anchors");
|
List<String> list = (List<String>) ed.getUserData(UserDataNames.render_dict_generator_anchors);
|
||||||
List<String> res = new ArrayList<>();
|
List<String> res = new ArrayList<>();
|
||||||
res.add(anchorPrefix + ed.getId());
|
res.add(anchorPrefix + ed.getId());
|
||||||
for (String s : list) {
|
for (String s : list) {
|
||||||
|
@ -3908,7 +3917,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
// gc.addStyledText("Standards Status = "+ss.toDisplay(), ss.getAbbrev(), "black", ss.getColor(), baseSpecUrl()+, true);
|
// gc.addStyledText("Standards Status = "+ss.toDisplay(), ss.getAbbrev(), "black", ss.getColor(), baseSpecUrl()+, true);
|
||||||
StructureDefinition sdb = context.getContext().fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
StructureDefinition sdb = context.getContext().fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
||||||
if (sdb != null) {
|
if (sdb != null) {
|
||||||
StandardsStatus base = determineStandardsStatus(sdb, (ElementDefinition) d.getUserData("derived.pointer"));
|
StandardsStatus base = determineStandardsStatus(sdb, (ElementDefinition) d.getUserData(UserDataNames.SNAPSHOT_DERIVATION_POINTER));
|
||||||
if (base != null) {
|
if (base != null) {
|
||||||
tableRow(tbl, context.formatPhrase(RenderingContext.STRUC_DEF_STAND_STAT), "versions.html#std-process", strikethrough, ss.toDisplay()+" (from "+base.toDisplay()+")");
|
tableRow(tbl, context.formatPhrase(RenderingContext.STRUC_DEF_STAND_STAT), "versions.html#std-process", strikethrough, ss.toDisplay()+" (from "+base.toDisplay()+")");
|
||||||
} else {
|
} else {
|
||||||
|
@ -4501,11 +4510,11 @@ public class StructureDefinitionRenderer extends ResourceRenderer {
|
||||||
if (!t.getAggregation().isEmpty() || (compare!=null && !compare.getAggregation().isEmpty())) {
|
if (!t.getAggregation().isEmpty() || (compare!=null && !compare.getAggregation().isEmpty())) {
|
||||||
|
|
||||||
for (Enumeration<AggregationMode> a :t.getAggregation()) {
|
for (Enumeration<AggregationMode> a :t.getAggregation()) {
|
||||||
a.setUserData("render.link", corePath + "codesystem-resource-aggregation-mode.html#content");
|
a.setUserData(UserDataNames.render_link, corePath + "codesystem-resource-aggregation-mode.html#content");
|
||||||
}
|
}
|
||||||
if (compare!=null) {
|
if (compare!=null) {
|
||||||
for (Enumeration<AggregationMode> a : compare.getAggregation()) {
|
for (Enumeration<AggregationMode> a : compare.getAggregation()) {
|
||||||
a.setUserData("render.link", corePath + "codesystem-resource-aggregation-mode.html#content");
|
a.setUserData(UserDataNames.render_link, corePath + "codesystem-resource-aggregation-mode.html#content");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var xt = compareSimpleTypeLists(t.getAggregation(), compare == null ? null : compare.getAggregation(), mode);
|
var xt = compareSimpleTypeLists(t.getAggregation(), compare == null ? null : compare.getAggregation(), mode);
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
||||||
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
|
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.CanonicalPair;
|
import org.hl7.fhir.utilities.CanonicalPair;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
||||||
|
@ -149,9 +150,9 @@ public abstract class TerminologyRenderer extends ResourceRenderer {
|
||||||
String ref = null;
|
String ref = null;
|
||||||
boolean addHtml = true;
|
boolean addHtml = true;
|
||||||
if (cs != null) {
|
if (cs != null) {
|
||||||
ref = (String) cs.getUserData("external.url");
|
ref = (String) cs.getUserData(UserDataNames.render_external_link);
|
||||||
if (Utilities.noString(ref))
|
if (Utilities.noString(ref))
|
||||||
ref = (String) cs.getUserData("filename");
|
ref = (String) cs.getUserData(UserDataNames.render_filename);
|
||||||
else
|
else
|
||||||
addHtml = false;
|
addHtml = false;
|
||||||
if (Utilities.noString(ref)) {
|
if (Utilities.noString(ref)) {
|
||||||
|
|
|
@ -55,6 +55,7 @@ import org.hl7.fhir.r5.terminologies.utilities.SnomedUtilities;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.EOperationOutcome;
|
import org.hl7.fhir.r5.utils.EOperationOutcome;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.LoincLinker;
|
import org.hl7.fhir.utilities.LoincLinker;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
|
||||||
|
@ -159,7 +160,7 @@ public class ValueSetRenderer extends TerminologyRenderer {
|
||||||
// String url = "";
|
// String url = "";
|
||||||
// ValueSet vsr = context.getWorker().findTxResource(ValueSet.class, ((Reference) a.getTarget()).getReference());
|
// ValueSet vsr = context.getWorker().findTxResource(ValueSet.class, ((Reference) a.getTarget()).getReference());
|
||||||
// if (vsr != null)
|
// if (vsr != null)
|
||||||
// url = (String) vsr.getUserData("filename");
|
// url = (String) vsr.getUserData(UserDataNames.filename);
|
||||||
// mymaps.put(a, url);
|
// mymaps.put(a, url);
|
||||||
// }
|
// }
|
||||||
// Map<ConceptMap, String> mymaps = new HashMap<ConceptMap, String>();
|
// Map<ConceptMap, String> mymaps = new HashMap<ConceptMap, String>();
|
||||||
|
@ -167,7 +168,7 @@ public class ValueSetRenderer extends TerminologyRenderer {
|
||||||
// String url = "";
|
// String url = "";
|
||||||
// ValueSet vsr = context.getWorker().fetchResource(ValueSet.class, ((Reference) a.getTarget()).getReference());
|
// ValueSet vsr = context.getWorker().fetchResource(ValueSet.class, ((Reference) a.getTarget()).getReference());
|
||||||
// if (vsr != null)
|
// if (vsr != null)
|
||||||
// url = (String) vsr.getUserData("filename");
|
// url = (String) vsr.getUserData(UserDataNames.filename);
|
||||||
// mymaps.put(a, url);
|
// mymaps.put(a, url);
|
||||||
// }
|
// }
|
||||||
// also, look in the contained resources for a concept map
|
// also, look in the contained resources for a concept map
|
||||||
|
@ -178,7 +179,7 @@ public class ValueSetRenderer extends TerminologyRenderer {
|
||||||
// String url = "";
|
// String url = "";
|
||||||
// ValueSet vsr = context.getWorker().findTxResource(ValueSet.class, ((Reference) cm.getTarget()).getReference());
|
// ValueSet vsr = context.getWorker().findTxResource(ValueSet.class, ((Reference) cm.getTarget()).getReference());
|
||||||
// if (vsr != null)
|
// if (vsr != null)
|
||||||
// url = (String) vsr.getUserData("filename");
|
// url = (String) vsr.getUserData(UserDataNames.filename);
|
||||||
// mymaps.put(cm, url);
|
// mymaps.put(cm, url);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
@ -753,7 +754,7 @@ public class ValueSetRenderer extends TerminologyRenderer {
|
||||||
}
|
}
|
||||||
String ref = cs.getWebPath();
|
String ref = cs.getWebPath();
|
||||||
if (ref == null) {
|
if (ref == null) {
|
||||||
ref = cs.getUserString("filename");
|
ref = cs.getUserString(UserDataNames.render_filename);
|
||||||
}
|
}
|
||||||
return ref == null ? null : ref.replace("\\", "/");
|
return ref == null ? null : ref.replace("\\", "/");
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,247 @@
|
||||||
|
package org.hl7.fhir.r5.renderers;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
import org.hl7.fhir.exceptions.DefinitionException;
|
||||||
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
|
import org.hl7.fhir.exceptions.FHIRFormatError;
|
||||||
|
import org.hl7.fhir.r5.model.CanonicalResource;
|
||||||
|
import org.hl7.fhir.r5.model.Resource;
|
||||||
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext;
|
||||||
|
import org.hl7.fhir.r5.renderers.utils.ResourceWrapper;
|
||||||
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules;
|
||||||
|
import org.hl7.fhir.r5.renderers.utils.RenderingContext.KnownLinkType;
|
||||||
|
import org.hl7.fhir.r5.utils.EOperationOutcome;
|
||||||
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
|
import org.hl7.fhir.r5.utils.sql.Column;
|
||||||
|
import org.hl7.fhir.r5.utils.sql.ColumnKind;
|
||||||
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.NodeType;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel;
|
||||||
|
import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Title;
|
||||||
|
|
||||||
|
public class ViewDefinitionRenderer extends ResourceRenderer {
|
||||||
|
|
||||||
|
public ViewDefinitionRenderer(RenderingContext context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean renderingUsesValidation() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String buildSummary(ResourceWrapper r) throws UnsupportedEncodingException, IOException {
|
||||||
|
return canonicalTitle(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void buildNarrative(RenderingStatus status, XhtmlNode x, ResourceWrapper vd) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome {
|
||||||
|
renderResourceTechDetails(vd, x);
|
||||||
|
genSummaryTable(status, x, vd);
|
||||||
|
|
||||||
|
XhtmlNode p = x.para();
|
||||||
|
p.tx("This view acts on the "+vd.primitiveValue("resource")+" resource");
|
||||||
|
var vers = vd.children("fhirVersion");
|
||||||
|
for (int i = 0; i < vers.size(); i++) {
|
||||||
|
if (i == 0) {
|
||||||
|
p.tx(" for version"+(vers.size() == 1 ? "" : "s")+" ");
|
||||||
|
} else if (i == vers.size() - 1) {
|
||||||
|
p.tx(" and ");
|
||||||
|
} else {
|
||||||
|
p.tx(", ");
|
||||||
|
}
|
||||||
|
String ver = vers.get(i).primitiveValue();
|
||||||
|
p.ah(VersionUtilities.getSpecUrl(ver)).tx(VersionUtilities.getNameForVersion(ver));
|
||||||
|
}
|
||||||
|
if (vd.has("resourceProfile")) {
|
||||||
|
p.tx(" using profile ?");
|
||||||
|
}
|
||||||
|
if (vd.has("name")) {
|
||||||
|
p.tx(" to produce a table named \"");
|
||||||
|
p.code().tx(vd.primitiveValue("name"));
|
||||||
|
p.tx("\"");
|
||||||
|
} else {
|
||||||
|
p.tx(" to produce a unnamed table");
|
||||||
|
}
|
||||||
|
if (vd.has("where")) {
|
||||||
|
List<ResourceWrapper> wheres = vd.children("where");
|
||||||
|
if (wheres.size() == 1) {
|
||||||
|
p.tx(" where ");
|
||||||
|
p.code().tx(wheres.get(0).primitiveValue("path"));
|
||||||
|
if (wheres.get(0).has("description")) {
|
||||||
|
p.tx(" ("+wheres.get(0).primitiveValue("description")+")");
|
||||||
|
}
|
||||||
|
p.tx(".");
|
||||||
|
} else {
|
||||||
|
p.tx(" where:");
|
||||||
|
XhtmlNode ul = x.ul();
|
||||||
|
for (ResourceWrapper w : wheres) {
|
||||||
|
XhtmlNode li = ul.li();
|
||||||
|
li.code().tx(wheres.get(0).primitiveValue("path"));
|
||||||
|
if (wheres.get(0).has("description")) {
|
||||||
|
li.tx(" ("+wheres.get(0).primitiveValue("description")+")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.tx(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vd.hasUserData(UserDataNames.db_columns)) {
|
||||||
|
x.para().tx("The table contains the following columns:");
|
||||||
|
List<Column> cols = (List<Column>) vd.getUserData(UserDataNames.db_columns);
|
||||||
|
boolean hasNotes = false;
|
||||||
|
for (Column col : cols) {
|
||||||
|
hasNotes = hasNotes || !Utilities.noString(col.getNotes());
|
||||||
|
}
|
||||||
|
|
||||||
|
XhtmlNode t2 = x.table("grid");
|
||||||
|
XhtmlNode tr = t2.tr();
|
||||||
|
tr.th().tx("Name");
|
||||||
|
tr.th().tx("Fhir Type");
|
||||||
|
tr.th().tx("SQL Type");
|
||||||
|
tr.th().tx("Collection");
|
||||||
|
if (hasNotes) {
|
||||||
|
tr.th().tx("Notes");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Column col : cols) {
|
||||||
|
tr = t2.tr();
|
||||||
|
tr.td().tx(col.getName());
|
||||||
|
tr.td().tx(col.getType());
|
||||||
|
tr.td().tx(col.getKind().name());
|
||||||
|
tr.td().tx(col.isColl() == null ? "" : col.isColl() ? "Y" : "N");
|
||||||
|
if (hasNotes) {
|
||||||
|
tr.td().tx(col.getNotes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vd.has("constant")) {
|
||||||
|
x.para().tx("Constants:");
|
||||||
|
|
||||||
|
XhtmlNode t2 = x.table("grid");
|
||||||
|
XhtmlNode tr = t2.tr();
|
||||||
|
tr.th().tx("Name");
|
||||||
|
tr.th().tx("Value");
|
||||||
|
|
||||||
|
for (ResourceWrapper cnst : vd.children("constant")) {
|
||||||
|
tr = t2.tr();
|
||||||
|
tr.td().tx(cnst.primitiveValue("name"));
|
||||||
|
tr.td().tx(cnst.primitiveValue("value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// row 4: select tree
|
||||||
|
x.para().tx("Selection Rules:");
|
||||||
|
|
||||||
|
HierarchicalTableGenerator gen = new HierarchicalTableGenerator(context, context.getDestDir(), context.isInlineGraphics(), true, "");
|
||||||
|
TableModel model = gen.new TableModel("vd="+vd.getId(), context.getRules() == GenerationRules.IG_PUBLISHER);
|
||||||
|
model.setAlternating(true);
|
||||||
|
if (context.getRules() == GenerationRules.VALID_RESOURCE || context.isInlineGraphics()) {
|
||||||
|
model.setDocoImg(HierarchicalTableGenerator.help16AsData());
|
||||||
|
} else {
|
||||||
|
model.setDocoImg(Utilities.pathURL(context.getLink(KnownLinkType.SPEC), "help16.png"));
|
||||||
|
}
|
||||||
|
model.getTitles().add(gen.new Title(null, model.getDocoRef(), ("Item"), (context.formatPhrase(RenderingContext.QUEST_LINK)), null, 0));
|
||||||
|
model.getTitles().add(gen.new Title(null, model.getDocoRef(), ("Coll"), (context.formatPhrase(RenderingContext.QUEST_TEXTFOR)), null, 0));
|
||||||
|
model.getTitles().add(gen.new Title(null, model.getDocoRef(), ("Type"), (context.formatPhrase(RenderingContext.QUEST_TIMES)), null, 0));
|
||||||
|
model.getTitles().add(gen.new Title(null, model.getDocoRef(), ("Description"), (context.formatPhrase(RenderingContext.QUEST_TYPE_ITEM)), null, 0));
|
||||||
|
|
||||||
|
// first we add a root for the questionaire itself
|
||||||
|
Row row = addViewRoot(gen, model.getRows(), vd);
|
||||||
|
for (ResourceWrapper select : vd.children("select")) {
|
||||||
|
renderSelect(status, gen, row.getSubRows(), vd, select);
|
||||||
|
}
|
||||||
|
XhtmlNode xn = gen.generate(model, context.getLocalPrefix(), 1, null);
|
||||||
|
x.addChildNode(xn);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderSelect(RenderingStatus status, HierarchicalTableGenerator gen, List<Row> rows, ResourceWrapper vd, ResourceWrapper select) {
|
||||||
|
Row r = gen.new Row();
|
||||||
|
rows.add(r);
|
||||||
|
|
||||||
|
r.setIcon("icon_vd_select.png", "Select");
|
||||||
|
Cell c1 = gen.new Cell(null, null, "Select", null, null);
|
||||||
|
r.getCells().add(c1);
|
||||||
|
r.getCells().add(gen.new Cell(null, null, null, null, null));
|
||||||
|
r.getCells().add(gen.new Cell(null, null, null, null, null));
|
||||||
|
Cell cell = gen.new Cell(null, null, null, null, null);
|
||||||
|
if (select.has("forEach")) {
|
||||||
|
addFHIRPath(cell.getPieces().get(0), "for each ", select.primitiveValue("forEach"), null);
|
||||||
|
} else if (select.has("forEachOrNull")) {
|
||||||
|
addFHIRPath(cell.getPieces().get(0), "for each ", select.primitiveValue("forEachOrNull"), ", or null");
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
r.getCells().add(cell);
|
||||||
|
|
||||||
|
for (ResourceWrapper column : select.children("column")) {
|
||||||
|
renderColumn(status, gen, r.getSubRows(), vd, select, column);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ResourceWrapper child : select.children("select")) {
|
||||||
|
renderSelect(status, gen, r.getSubRows(), vd, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderColumn(RenderingStatus status, HierarchicalTableGenerator gen, List<Row> rows, ResourceWrapper vd, ResourceWrapper select, ResourceWrapper column) {
|
||||||
|
Row r = gen.new Row();
|
||||||
|
rows.add(r);
|
||||||
|
|
||||||
|
r.setIcon("icon_vd_col.png", "Column");
|
||||||
|
Cell c1 = gen.new Cell(null, null, column.primitiveValue("name"), null, null);
|
||||||
|
r.getCells().add(c1);
|
||||||
|
String coll = column.has("collection") ? "true".equals(column.primitiveValue("collection")) ? "Y" : "N" : "";
|
||||||
|
r.getCells().add(gen.new Cell(null, null, coll, null, null));
|
||||||
|
r.getCells().add(gen.new Cell(null, null, column.primitiveValue("type"), null, null));
|
||||||
|
Cell cell = gen.new Cell(null, null, null, null, null);
|
||||||
|
addFHIRPath(cell.getPieces().get(0), null, column.primitiveValue("path"), null);
|
||||||
|
if (column.has("description")) {
|
||||||
|
cell.addPiece(gen.new Piece("br"));
|
||||||
|
cell.addPiece(gen.new Piece(null, column.primitiveValue("description"), null));
|
||||||
|
}
|
||||||
|
for (ResourceWrapper tag : column.children("tag")) {
|
||||||
|
cell.addPiece(gen.new Piece("br"));
|
||||||
|
cell.addPiece(gen.new Piece(null, tag.primitiveValue("name")+"="+tag.primitiveValue("value"), null));
|
||||||
|
}
|
||||||
|
r.getCells().add(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addFHIRPath(Piece p, String pfx, String expr, String sfx) {
|
||||||
|
XhtmlNode x = new XhtmlNode(NodeType.Element, "span").style("font-size: 11px");
|
||||||
|
p.addHtml(x);
|
||||||
|
if (pfx != null) {
|
||||||
|
x.tx(pfx);
|
||||||
|
}
|
||||||
|
x.code(expr);
|
||||||
|
if (sfx != null) {
|
||||||
|
x.tx(sfx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Row addViewRoot(HierarchicalTableGenerator gen, List<Row> rows, ResourceWrapper vd) throws IOException {
|
||||||
|
Row r = gen.new Row();
|
||||||
|
rows.add(r);
|
||||||
|
|
||||||
|
r.setIcon("icon_vd_view.png", context.formatPhrase(RenderingContext.QUEST_ROOT));
|
||||||
|
r.getCells().add(gen.new Cell(null, null, vd.primitiveValue("name"), null, null));
|
||||||
|
r.getCells().add(gen.new Cell(null, null, "", null, null));
|
||||||
|
r.getCells().add(gen.new Cell(null, null, vd.primitiveValue("resource"), null, null));
|
||||||
|
r.getCells().add(gen.new Cell(null, null, vd.primitiveValue("description"), null, null));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -522,6 +522,8 @@ public abstract class ResourceWrapper {
|
||||||
public abstract boolean hasPrimitiveValue();
|
public abstract boolean hasPrimitiveValue();
|
||||||
public abstract String primitiveValue();
|
public abstract String primitiveValue();
|
||||||
public abstract boolean isResource();
|
public abstract boolean isResource();
|
||||||
|
public abstract boolean hasUserData(String name);
|
||||||
|
public abstract Object getUserData(String name);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -270,5 +270,15 @@ public class ResourceWrapperModel extends ResourceWrapper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasUserData(String name) {
|
||||||
|
return model.hasUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getUserData(String name) {
|
||||||
|
return model.getUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -10,6 +10,7 @@ import org.hl7.fhir.r5.model.Enumeration;
|
||||||
import org.hl7.fhir.r5.model.Narrative;
|
import org.hl7.fhir.r5.model.Narrative;
|
||||||
import org.hl7.fhir.r5.model.Property;
|
import org.hl7.fhir.r5.model.Property;
|
||||||
import org.hl7.fhir.r5.model.Resource;
|
import org.hl7.fhir.r5.model.Resource;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
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;
|
||||||
|
|
||||||
|
@ -143,7 +144,7 @@ public class ResourceWrapperNative extends ResourceWrapper {
|
||||||
public void setNarrative(XhtmlNode x, String status, boolean multiLangMode, Locale locale, boolean isPretty) {
|
public void setNarrative(XhtmlNode x, String status, boolean multiLangMode, Locale locale, boolean isPretty) {
|
||||||
if (element instanceof DomainResource) {
|
if (element instanceof DomainResource) {
|
||||||
DomainResource r = (DomainResource) element;
|
DomainResource r = (DomainResource) element;
|
||||||
r.getText().setUserData("renderer.generated", true);
|
r.getText().setUserData(UserDataNames.renderer_is_generated, true);
|
||||||
if (!r.hasText() || !r.getText().hasDiv()) {
|
if (!r.hasText() || !r.getText().hasDiv()) {
|
||||||
r.setText(new Narrative());
|
r.setText(new Narrative());
|
||||||
r.getText().setStatusAsString(status);
|
r.getText().setStatusAsString(status);
|
||||||
|
@ -231,4 +232,14 @@ public class ResourceWrapperNative extends ResourceWrapper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasUserData(String name) {
|
||||||
|
return element.hasUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getUserData(String name) {
|
||||||
|
return element.getUserData(name);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -67,6 +67,7 @@ import org.hl7.fhir.r5.model.StringType;
|
||||||
import org.hl7.fhir.r5.model.UriType;
|
import org.hl7.fhir.r5.model.UriType;
|
||||||
import org.hl7.fhir.r5.utils.CanonicalResourceUtilities;
|
import org.hl7.fhir.r5.utils.CanonicalResourceUtilities;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.MarkDownProcessor;
|
import org.hl7.fhir.utilities.MarkDownProcessor;
|
||||||
import org.hl7.fhir.utilities.StandardsStatus;
|
import org.hl7.fhir.utilities.StandardsStatus;
|
||||||
|
@ -590,11 +591,11 @@ public class CodeSystemUtilities extends TerminologyUtilities {
|
||||||
if (ss == null || ss.isLowerThan(status))
|
if (ss == null || ss.isLowerThan(status))
|
||||||
ToolingExtensions.setStandardsStatus(cs, status, normativeVersion);
|
ToolingExtensions.setStandardsStatus(cs, status, normativeVersion);
|
||||||
if (pckage != null) {
|
if (pckage != null) {
|
||||||
if (!cs.hasUserData("ballot.package"))
|
if (!cs.hasUserData(UserDataNames.kindling_ballot_package))
|
||||||
cs.setUserData("ballot.package", pckage);
|
cs.setUserData(UserDataNames.kindling_ballot_package, pckage);
|
||||||
else if (!pckage.equals(cs.getUserString("ballot.package")))
|
else if (!pckage.equals(cs.getUserString(UserDataNames.kindling_ballot_package)))
|
||||||
if (!"infrastructure".equals(cs.getUserString("ballot.package")))
|
if (!"infrastructure".equals(cs.getUserString(UserDataNames.kindling_ballot_package)))
|
||||||
System.out.println("Code System "+cs.getUrl()+": ownership clash "+pckage+" vs "+cs.getUserString("ballot.package"));
|
System.out.println("Code System "+cs.getUrl()+": ownership clash "+pckage+" vs "+cs.getUserString(UserDataNames.kindling_ballot_package));
|
||||||
}
|
}
|
||||||
if (status == StandardsStatus.NORMATIVE) {
|
if (status == StandardsStatus.NORMATIVE) {
|
||||||
cs.setExperimental(false);
|
cs.setExperimental(false);
|
||||||
|
@ -842,7 +843,7 @@ public class CodeSystemUtilities extends TerminologyUtilities {
|
||||||
for (CodeSystem sup : supplements) {
|
for (CodeSystem sup : supplements) {
|
||||||
b.append(sup.getVersionedUrl());
|
b.append(sup.getVersionedUrl());
|
||||||
}
|
}
|
||||||
ret.setUserData("supplements.installed", b.toString());
|
ret.setUserData(UserDataNames.tx_known_supplements, b.toString());
|
||||||
|
|
||||||
for (ConceptDefinitionComponent t : ret.getConcept()) {
|
for (ConceptDefinitionComponent t : ret.getConcept()) {
|
||||||
mergeSupplements(ret, t, supplements);
|
mergeSupplements(ret, t, supplements);
|
||||||
|
|
|
@ -67,6 +67,7 @@ import org.hl7.fhir.r5.terminologies.CodeSystemUtilities.ConceptDefinitionCompon
|
||||||
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities.ConceptStatus;
|
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities.ConceptStatus;
|
||||||
import org.hl7.fhir.r5.utils.CanonicalResourceUtilities;
|
import org.hl7.fhir.r5.utils.CanonicalResourceUtilities;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.StandardsStatus;
|
import org.hl7.fhir.utilities.StandardsStatus;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.VersionUtilities;
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
|
@ -167,7 +168,7 @@ public class ValueSetUtilities extends TerminologyUtilities {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void markStatus(ValueSet vs, String wg, StandardsStatus status, String pckage, String fmm, IWorkerContext context, String normativeVersion) throws FHIRException {
|
public static void markStatus(ValueSet vs, String wg, StandardsStatus status, String pckage, String fmm, IWorkerContext context, String normativeVersion) throws FHIRException {
|
||||||
if (vs.hasUserData("external.url"))
|
if (vs.hasUserData(UserDataNames.render_external_link))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (wg != null) {
|
if (wg != null) {
|
||||||
|
@ -181,11 +182,11 @@ public class ValueSetUtilities extends TerminologyUtilities {
|
||||||
if (ss == null || ss.isLowerThan(status))
|
if (ss == null || ss.isLowerThan(status))
|
||||||
ToolingExtensions.setStandardsStatus(vs, status, normativeVersion);
|
ToolingExtensions.setStandardsStatus(vs, status, normativeVersion);
|
||||||
if (pckage != null) {
|
if (pckage != null) {
|
||||||
if (!vs.hasUserData("ballot.package"))
|
if (!vs.hasUserData(UserDataNames.kindling_ballot_package))
|
||||||
vs.setUserData("ballot.package", pckage);
|
vs.setUserData(UserDataNames.kindling_ballot_package, pckage);
|
||||||
else if (!pckage.equals(vs.getUserString("ballot.package")))
|
else if (!pckage.equals(vs.getUserString(UserDataNames.kindling_ballot_package)))
|
||||||
if (!"infrastructure".equals(vs.getUserString("ballot.package")))
|
if (!"infrastructure".equals(vs.getUserString(UserDataNames.kindling_ballot_package)))
|
||||||
System.out.println("Value Set "+vs.getUrl()+": ownership clash "+pckage+" vs "+vs.getUserString("ballot.package"));
|
System.out.println("Value Set "+vs.getUrl()+": ownership clash "+pckage+" vs "+vs.getUserString(UserDataNames.kindling_ballot_package));
|
||||||
}
|
}
|
||||||
if (status == StandardsStatus.NORMATIVE) {
|
if (status == StandardsStatus.NORMATIVE) {
|
||||||
vs.setExperimental(false);
|
vs.setExperimental(false);
|
||||||
|
@ -201,8 +202,8 @@ public class ValueSetUtilities extends TerminologyUtilities {
|
||||||
vs.setExperimental(true);
|
vs.setExperimental(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (vs.hasUserData("cs"))
|
if (vs.hasUserData(UserDataNames.TX_ASSOCIATED_CODESYSTEM))
|
||||||
CodeSystemUtilities.markStatus((CodeSystem) vs.getUserData("cs"), wg, status, pckage, fmm, normativeVersion);
|
CodeSystemUtilities.markStatus((CodeSystem) vs.getUserData(UserDataNames.TX_ASSOCIATED_CODESYSTEM), wg, status, pckage, fmm, normativeVersion);
|
||||||
else if (status == StandardsStatus.NORMATIVE && context != null) {
|
else if (status == StandardsStatus.NORMATIVE && context != null) {
|
||||||
for (ConceptSetComponent csc : vs.getCompose().getInclude()) {
|
for (ConceptSetComponent csc : vs.getCompose().getInclude()) {
|
||||||
if (csc.hasSystem()) {
|
if (csc.hasSystem()) {
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.SourcedCodeSystem;
|
import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.SourcedCodeSystem;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.SourcedValueSet;
|
import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.SourcedValueSet;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.ToolingClientLogger;
|
import org.hl7.fhir.utilities.ToolingClientLogger;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
@ -241,8 +242,8 @@ public class TerminologyClientManager {
|
||||||
|
|
||||||
// no agreement? Then what we do depends
|
// no agreement? Then what we do depends
|
||||||
if (vs != null) {
|
if (vs != null) {
|
||||||
if (vs.hasUserData("External.Link")) {
|
if (vs.hasUserData(UserDataNames.render_external_link)) {
|
||||||
String el = vs.getUserString("External.Link");
|
String el = vs.getUserString(UserDataNames.render_external_link);
|
||||||
if ("https://vsac.nlm.nih.gov".equals(el)) {
|
if ("https://vsac.nlm.nih.gov".equals(el)) {
|
||||||
el = getMaster().getAddress();
|
el = getMaster().getAddress();
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,6 +125,7 @@ import org.hl7.fhir.r5.terminologies.utilities.TerminologyOperationContext.Termi
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass;
|
import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValueSetProcessBase;
|
import org.hl7.fhir.r5.terminologies.utilities.ValueSetProcessBase;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.client.EFhirClientException;
|
import org.hl7.fhir.r5.utils.client.EFhirClientException;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
@ -1022,8 +1023,8 @@ public class ValueSetExpander extends ValueSetProcessBase {
|
||||||
if (ValueSetUtilities.isServerSide(inc.getSystem()) || (cs == null || (cs.getContent() != CodeSystemContentMode.COMPLETE && cs.getContent() != CodeSystemContentMode.FRAGMENT))) {
|
if (ValueSetUtilities.isServerSide(inc.getSystem()) || (cs == null || (cs.getContent() != CodeSystemContentMode.COMPLETE && cs.getContent() != CodeSystemContentMode.FRAGMENT))) {
|
||||||
doServerIncludeCodes(inc, heirarchical, exp, imports, expParams, extensions, noInactive, valueSet.getExpansion().getProperty());
|
doServerIncludeCodes(inc, heirarchical, exp, imports, expParams, extensions, noInactive, valueSet.getExpansion().getProperty());
|
||||||
} else {
|
} else {
|
||||||
if (cs.hasUserData("supplements.installed")) {
|
if (cs.hasUserData(UserDataNames.tx_known_supplements)) {
|
||||||
for (String s : cs.getUserString("supplements.installed").split("\\,")) {
|
for (String s : cs.getUserString(UserDataNames.tx_known_supplements).split("\\,")) {
|
||||||
requiredSupplements.remove(s);
|
requiredSupplements.remove(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1090,8 +1091,8 @@ public class ValueSetExpander extends ValueSetProcessBase {
|
||||||
UriType u = new UriType(cs.getUrl() + (cs.hasVersion() ? "|"+cs.getVersion() : ""));
|
UriType u = new UriType(cs.getUrl() + (cs.hasVersion() ? "|"+cs.getVersion() : ""));
|
||||||
if (!existsInParams(exp.getParameter(), "used-codesystem", u))
|
if (!existsInParams(exp.getParameter(), "used-codesystem", u))
|
||||||
exp.getParameter().add(new ValueSetExpansionParameterComponent().setName("used-codesystem").setValue(u));
|
exp.getParameter().add(new ValueSetExpansionParameterComponent().setName("used-codesystem").setValue(u));
|
||||||
if (cs.hasUserData("supplements.installed")) {
|
if (cs.hasUserData(UserDataNames.tx_known_supplements)) {
|
||||||
for (String s : cs.getUserString("supplements.installed").split("\\,")) {
|
for (String s : cs.getUserString(UserDataNames.tx_known_supplements).split("\\,")) {
|
||||||
u = new UriType(s);
|
u = new UriType(s);
|
||||||
if (!existsInParams(exp.getParameter(), "used-supplement", u)) {
|
if (!existsInParams(exp.getParameter(), "used-supplement", u)) {
|
||||||
exp.getParameter().add(new ValueSetExpansionParameterComponent().setName("used-supplement").setValue(u));
|
exp.getParameter().add(new ValueSetExpansionParameterComponent().setName("used-supplement").setValue(u));
|
||||||
|
|
|
@ -18,6 +18,7 @@ import org.hl7.fhir.r5.model.UrlType;
|
||||||
import org.hl7.fhir.r5.model.ValueSet;
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionComponent;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.StandardsStatus;
|
import org.hl7.fhir.utilities.StandardsStatus;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
|
@ -181,8 +182,8 @@ public class ValueSetProcessBase {
|
||||||
List<OperationOutcomeIssueComponent> iss = makeIssue(IssueSeverity.INFORMATION, IssueType.BUSINESSRULE, null, context.formatMessage(msg, resource.getVersionedUrl(), null, resource.fhirType()), OpIssueCode.StatusCheck, null);
|
List<OperationOutcomeIssueComponent> iss = makeIssue(IssueSeverity.INFORMATION, IssueType.BUSINESSRULE, null, context.formatMessage(msg, resource.getVersionedUrl(), null, resource.fhirType()), OpIssueCode.StatusCheck, null);
|
||||||
|
|
||||||
// this is a testing hack - see TerminologyServiceTests
|
// this is a testing hack - see TerminologyServiceTests
|
||||||
iss.get(0).setUserData("status-msg-name", "warning-"+id);
|
iss.get(0).setUserData(UserDataNames.tx_status_msg_name, "warning-"+id);
|
||||||
iss.get(0).setUserData("status-msg-value", new UriType(resource.getVersionedUrl()));
|
iss.get(0).setUserData(UserDataNames.tx_status_msg_value, new UriType(resource.getVersionedUrl()));
|
||||||
ToolingExtensions.setStringExtension(iss.get(0), ToolingExtensions.EXT_ISSUE_MSG_ID, msg);
|
ToolingExtensions.setStringExtension(iss.get(0), ToolingExtensions.EXT_ISSUE_MSG_ID, msg);
|
||||||
|
|
||||||
return iss;
|
return iss;
|
||||||
|
|
|
@ -92,6 +92,7 @@ import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValueSetProcessBase;
|
import org.hl7.fhir.r5.terminologies.utilities.ValueSetProcessBase;
|
||||||
import org.hl7.fhir.r5.utils.OperationOutcomeUtilities;
|
import org.hl7.fhir.r5.utils.OperationOutcomeUtilities;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
|
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
|
||||||
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.ValidationContextResourceProxy;
|
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.ValidationContextResourceProxy;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
|
@ -240,8 +241,8 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
if (!options.isMembershipOnly()) {
|
if (!options.isMembershipOnly()) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Coding c : code.getCoding()) {
|
for (Coding c : code.getCoding()) {
|
||||||
if (!c.hasSystem() && !c.hasUserData("val.sys.error")) {
|
if (!c.hasSystem() && !c.hasUserData(UserDataNames.tx_val_sys_error)) {
|
||||||
c.setUserData("val.sys.error", true);
|
c.setUserData(UserDataNames.tx_val_sys_error, true);
|
||||||
info.addIssue(makeIssue(IssueSeverity.WARNING, IssueType.INVALID, path+".coding["+i+"]", context.formatMessage(I18nConstants.CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE), OpIssueCode.InvalidData, null));
|
info.addIssue(makeIssue(IssueSeverity.WARNING, IssueType.INVALID, path+".coding["+i+"]", context.formatMessage(I18nConstants.CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE), OpIssueCode.InvalidData, null));
|
||||||
} else {
|
} else {
|
||||||
VersionInfo vi = new VersionInfo(this);
|
VersionInfo vi = new VersionInfo(this);
|
||||||
|
@ -278,7 +279,7 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
c.setUserData("cs", cs);
|
c.setUserData(UserDataNames.TX_ASSOCIATED_CODESYSTEM, cs);
|
||||||
|
|
||||||
checkCanonical(info.getIssues(), path, cs, valueset);
|
checkCanonical(info.getIssues(), path, cs, valueset);
|
||||||
res = validateCode(path+".coding["+i+"]", c, cs, vcc, info);
|
res = validateCode(path+".coding["+i+"]", c, cs, vcc, info);
|
||||||
|
@ -361,7 +362,7 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
cd.setDisplay(lookupDisplay(foundCoding));
|
cd.setDisplay(lookupDisplay(foundCoding));
|
||||||
res.setDefinition(cd);
|
res.setDefinition(cd);
|
||||||
res.setSystem(foundCoding.getSystem());
|
res.setSystem(foundCoding.getSystem());
|
||||||
res.setVersion(foundCoding.hasVersion() ? foundCoding.getVersion() : foundCoding.hasUserData("cs") ? ((CodeSystem) foundCoding.getUserData("cs")).getVersion() : null);
|
res.setVersion(foundCoding.hasVersion() ? foundCoding.getVersion() : foundCoding.hasUserData(UserDataNames.TX_ASSOCIATED_CODESYSTEM) ? ((CodeSystem) foundCoding.getUserData(UserDataNames.TX_ASSOCIATED_CODESYSTEM)).getVersion() : null);
|
||||||
res.setDisplay(cd.getDisplay());
|
res.setDisplay(cd.getDisplay());
|
||||||
}
|
}
|
||||||
if (info.getErr() != null) {
|
if (info.getErr() != null) {
|
||||||
|
@ -463,8 +464,8 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
private String getVersion(Coding c) {
|
private String getVersion(Coding c) {
|
||||||
if (c.hasVersion()) {
|
if (c.hasVersion()) {
|
||||||
return c.getVersion();
|
return c.getVersion();
|
||||||
} else if (c.hasUserData("cs")) {
|
} else if (c.hasUserData(UserDataNames.TX_ASSOCIATED_CODESYSTEM)) {
|
||||||
return ((CodeSystem) c.getUserData("cs")).getVersion();
|
return ((CodeSystem) c.getUserData(UserDataNames.TX_ASSOCIATED_CODESYSTEM)).getVersion();
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -562,8 +563,8 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
}
|
}
|
||||||
if (!code.hasSystem()) {
|
if (!code.hasSystem()) {
|
||||||
res = new ValidationResult(IssueSeverity.WARNING, context.formatMessage(I18nConstants.CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE), null);
|
res = new ValidationResult(IssueSeverity.WARNING, context.formatMessage(I18nConstants.CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE), null);
|
||||||
if (!code.hasUserData("val.sys.error")) {
|
if (!code.hasUserData(UserDataNames.tx_val_sys_error)) {
|
||||||
code.setUserData("val.sys.error", true);
|
code.setUserData(UserDataNames.tx_val_sys_error, true);
|
||||||
res.getIssues().addAll(makeIssue(IssueSeverity.WARNING, IssueType.INVALID, path, context.formatMessage(I18nConstants.CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE), OpIssueCode.InvalidData, null));
|
res.getIssues().addAll(makeIssue(IssueSeverity.WARNING, IssueType.INVALID, path, context.formatMessage(I18nConstants.CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE), OpIssueCode.InvalidData, null));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -831,7 +832,7 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
if ("urn:ietf:rfc:3986".equals(system)) {
|
if ("urn:ietf:rfc:3986".equals(system)) {
|
||||||
CodeSystem cs = new CodeSystem();
|
CodeSystem cs = new CodeSystem();
|
||||||
cs.setUrl(system);
|
cs.setUrl(system);
|
||||||
cs.setUserData("tx.cs.special", new URICodeSystem());
|
cs.setUserData(UserDataNames.tx_cs_special, new URICodeSystem());
|
||||||
cs.setContent(CodeSystemContentMode.COMPLETE);
|
cs.setContent(CodeSystemContentMode.COMPLETE);
|
||||||
return cs;
|
return cs;
|
||||||
}
|
}
|
||||||
|
@ -886,7 +887,7 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ValidationResult validateCode(String path, Coding code, CodeSystem cs, CodeableConcept vcc, ValidationProcessInfo info) {
|
private ValidationResult validateCode(String path, Coding code, CodeSystem cs, CodeableConcept vcc, ValidationProcessInfo info) {
|
||||||
ConceptDefinitionComponent cc = cs.hasUserData("tx.cs.special") ? ((SpecialCodeSystem) cs.getUserData("tx.cs.special")).findConcept(code) : findCodeInConcept(cs.getConcept(), code.getCode(), cs.getCaseSensitive(), allAltCodes);
|
ConceptDefinitionComponent cc = cs.hasUserData(UserDataNames.tx_cs_special) ? ((SpecialCodeSystem) cs.getUserData(UserDataNames.tx_cs_special)).findConcept(code) : findCodeInConcept(cs.getConcept(), code.getCode(), cs.getCaseSensitive(), allAltCodes);
|
||||||
if (cc == null) {
|
if (cc == null) {
|
||||||
cc = findSpecialConcept(code, cs);
|
cc = findSpecialConcept(code, cs);
|
||||||
}
|
}
|
||||||
|
@ -1592,8 +1593,8 @@ public class ValueSetValidator extends ValueSetProcessBase {
|
||||||
|
|
||||||
public boolean validateCodeInConceptList(String code, CodeSystem def, List<ConceptDefinitionComponent> list, AlternateCodesProcessingRules altCodeRules) {
|
public boolean validateCodeInConceptList(String code, CodeSystem def, List<ConceptDefinitionComponent> list, AlternateCodesProcessingRules altCodeRules) {
|
||||||
opContext.deadCheck("validateCodeInConceptList");
|
opContext.deadCheck("validateCodeInConceptList");
|
||||||
if (def.hasUserData("tx.cs.special")) {
|
if (def.hasUserData(UserDataNames.tx_cs_special)) {
|
||||||
return ((SpecialCodeSystem) def.getUserData("tx.cs.special")).findConcept(new Coding().setCode(code)) != null;
|
return ((SpecialCodeSystem) def.getUserData(UserDataNames.tx_cs_special)).findConcept(new Coding().setCode(code)) != null;
|
||||||
} else if (def.getCaseSensitive()) {
|
} else if (def.getCaseSensitive()) {
|
||||||
for (ConceptDefinitionComponent cc : list) {
|
for (ConceptDefinitionComponent cc : list) {
|
||||||
if (cc.getCode().equals(code)) {
|
if (cc.getCode().equals(code)) {
|
||||||
|
|
|
@ -75,7 +75,7 @@ import org.hl7.fhir.utilities.npm.ToolsVersion;
|
||||||
public class NPMPackageGenerator {
|
public class NPMPackageGenerator {
|
||||||
|
|
||||||
public enum Category {
|
public enum Category {
|
||||||
RESOURCE, EXAMPLE, OPENAPI, SCHEMATRON, RDF, OTHER, TOOL, TEMPLATE, JEKYLL, TEST;
|
RESOURCE, EXAMPLE, OPENAPI, SCHEMATRON, RDF, OTHER, TOOL, TEMPLATE, JEKYLL, TEST, CUSTOM;
|
||||||
|
|
||||||
private String getDirectory() {
|
private String getDirectory() {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
|
@ -89,6 +89,7 @@ public class NPMPackageGenerator {
|
||||||
case JEKYLL: return "package/jekyll/";
|
case JEKYLL: return "package/jekyll/";
|
||||||
case TEST: return "package/tests/";
|
case TEST: return "package/tests/";
|
||||||
case TOOL: return "package/bin/";
|
case TOOL: return "package/bin/";
|
||||||
|
case CUSTOM: return "package/custom/";
|
||||||
}
|
}
|
||||||
return "/";
|
return "/";
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ public class OperationOutcomeUtilities {
|
||||||
|
|
||||||
public static OperationOutcomeIssueComponent convertToIssue(ValidationMessage message, OperationOutcome op) {
|
public static OperationOutcomeIssueComponent convertToIssue(ValidationMessage message, OperationOutcome op) {
|
||||||
OperationOutcomeIssueComponent issue = new OperationOutcome.OperationOutcomeIssueComponent();
|
OperationOutcomeIssueComponent issue = new OperationOutcome.OperationOutcomeIssueComponent();
|
||||||
issue.setUserData("source.vm", message);
|
issue.setUserData(UserDataNames.validator_source_vm, message);
|
||||||
issue.setCode(convert(message.getType()));
|
issue.setCode(convert(message.getType()));
|
||||||
|
|
||||||
if (message.getLocation() != null) {
|
if (message.getLocation() != null) {
|
||||||
|
@ -76,7 +76,7 @@ public class OperationOutcomeUtilities {
|
||||||
if (message.getMessageId() != null) {
|
if (message.getMessageId() != null) {
|
||||||
issue.getExtension().add(ToolingExtensions.makeIssueMessageId(message.getMessageId()));
|
issue.getExtension().add(ToolingExtensions.makeIssueMessageId(message.getMessageId()));
|
||||||
}
|
}
|
||||||
issue.setUserData("source.msg", message);
|
issue.setUserData(UserDataNames.validator_source_msg, message);
|
||||||
return issue;
|
return issue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ public class OperationOutcomeUtilities {
|
||||||
|
|
||||||
public static OperationOutcomeIssueComponent convertToIssueSimple(ValidationMessage message, OperationOutcome op) {
|
public static OperationOutcomeIssueComponent convertToIssueSimple(ValidationMessage message, OperationOutcome op) {
|
||||||
OperationOutcomeIssueComponent issue = new OperationOutcome.OperationOutcomeIssueComponent();
|
OperationOutcomeIssueComponent issue = new OperationOutcome.OperationOutcomeIssueComponent();
|
||||||
issue.setUserData("source.vm", message);
|
issue.setUserData(UserDataNames.validator_source_vm, message);
|
||||||
issue.setCode(convert(message.getType()));
|
issue.setCode(convert(message.getType()));
|
||||||
|
|
||||||
if (message.getLocation() != null) {
|
if (message.getLocation() != null) {
|
||||||
|
|
|
@ -97,12 +97,14 @@ public class PackageHackerR5 {
|
||||||
StructureDefinition sd = (StructureDefinition) r.getResource();
|
StructureDefinition sd = (StructureDefinition) r.getResource();
|
||||||
for (ElementDefinition ed : sd.getSnapshot().getElement()) {
|
for (ElementDefinition ed : sd.getSnapshot().getElement()) {
|
||||||
if (ed.getType().removeIf(tr -> Utilities.existsInList(tr.getCode(), "integer64", "CodeableReference", "RatioRange", "Availability", "ExtendedContactDetail"))) {
|
if (ed.getType().removeIf(tr -> Utilities.existsInList(tr.getCode(), "integer64", "CodeableReference", "RatioRange", "Availability", "ExtendedContactDetail"))) {
|
||||||
sd.setUserData("fixed-by-loader", true);
|
// sd.setUserData(UserDataNames.fixed_by_loader, true);
|
||||||
|
// don't need to track this (for now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ElementDefinition ed : sd.getDifferential().getElement()) {
|
for (ElementDefinition ed : sd.getDifferential().getElement()) {
|
||||||
if (ed.getType().removeIf(tr -> Utilities.existsInList(tr.getCode(), "integer64", "CodeableReference", "RatioRange", "Availability", "ExtendedContactDetail"))) {
|
if (ed.getType().removeIf(tr -> Utilities.existsInList(tr.getCode(), "integer64", "CodeableReference", "RatioRange", "Availability", "ExtendedContactDetail"))) {
|
||||||
sd.setUserData("fixed-by-loader", true);
|
// sd.setUserData(UserDataNames.fixed_by_loader, true);
|
||||||
|
// don't need to track this (for now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,7 +249,7 @@ public class QuestionnaireBuilder {
|
||||||
QuestionnaireResponse.QuestionnaireResponseItemComponent item = new QuestionnaireResponse.QuestionnaireResponseItemComponent();
|
QuestionnaireResponse.QuestionnaireResponseItemComponent item = new QuestionnaireResponse.QuestionnaireResponseItemComponent();
|
||||||
response.addItem(item);
|
response.addItem(item);
|
||||||
item.setLinkId("meta");
|
item.setLinkId("meta");
|
||||||
item.setUserData("object", resource);
|
item.setUserData(UserDataNames.questionnaire_object, resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -353,12 +353,12 @@ public class QuestionnaireBuilder {
|
||||||
private void processExisting(String path, List<QuestionnaireResponse.QuestionnaireResponseItemComponent> answerGroups, QuestionnaireItemComponent item, List<QuestionnaireResponse.QuestionnaireResponseItemComponent> nResponse) throws FHIRException {
|
private void processExisting(String path, List<QuestionnaireResponse.QuestionnaireResponseItemComponent> answerGroups, QuestionnaireItemComponent item, List<QuestionnaireResponse.QuestionnaireResponseItemComponent> nResponse) throws FHIRException {
|
||||||
// processing existing data
|
// processing existing data
|
||||||
for (QuestionnaireResponse.QuestionnaireResponseItemComponent ag : answerGroups) {
|
for (QuestionnaireResponse.QuestionnaireResponseItemComponent ag : answerGroups) {
|
||||||
List<Base> children = ((Element) ag.getUserData("object")).listChildrenByName(tail(path));
|
List<Base> children = ((Element) ag.getUserData(UserDataNames.questionnaire_object)).listChildrenByName(tail(path));
|
||||||
for (Base child : children) {
|
for (Base child : children) {
|
||||||
if (child != null) {
|
if (child != null) {
|
||||||
QuestionnaireResponse.QuestionnaireResponseItemComponent ans = ag.addItem();
|
QuestionnaireResponse.QuestionnaireResponseItemComponent ans = ag.addItem();
|
||||||
ag.setLinkId(item.getLinkId());
|
ag.setLinkId(item.getLinkId());
|
||||||
ans.setUserData("object", child);
|
ans.setUserData(UserDataNames.questionnaire_object, child);
|
||||||
nResponse.add(ans);
|
nResponse.add(ans);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -393,13 +393,13 @@ public class QuestionnaireBuilder {
|
||||||
for (TypeRefComponent t : types) {
|
for (TypeRefComponent t : types) {
|
||||||
Questionnaire.QuestionnaireItemComponent sub = q.addItem();
|
Questionnaire.QuestionnaireItemComponent sub = q.addItem();
|
||||||
sub.setType(QuestionnaireItemType.GROUP);
|
sub.setType(QuestionnaireItemType.GROUP);
|
||||||
sub.setLinkId(element.getPath()+"._"+t.getUserData("text"));
|
sub.setLinkId(element.getPath()+"._"+t.getUserData(UserDataNames.questionnaire_text));
|
||||||
sub.setText((String) t.getUserData("text"));
|
sub.setText((String) t.getUserData(UserDataNames.questionnaire_text));
|
||||||
// always optional, never repeats
|
// always optional, never repeats
|
||||||
|
|
||||||
List<QuestionnaireResponse.QuestionnaireResponseItemComponent> selected = new ArrayList<QuestionnaireResponse.QuestionnaireResponseItemComponent>();
|
List<QuestionnaireResponse.QuestionnaireResponseItemComponent> selected = new ArrayList<QuestionnaireResponse.QuestionnaireResponseItemComponent>();
|
||||||
selectTypes(profile, sub, t, answerGroups, selected);
|
selectTypes(profile, sub, t, answerGroups, selected);
|
||||||
processDataType(profile, sub, element, element.getPath()+"._"+t.getUserData("text"), t, selected, parents);
|
processDataType(profile, sub, element, element.getPath()+"._"+t.getUserData(UserDataNames.questionnaire_text), t, selected, parents);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
// now we have to build the question panel for each different data type
|
// now we have to build the question panel for each different data type
|
||||||
|
@ -483,7 +483,7 @@ public class QuestionnaireBuilder {
|
||||||
List<QuestionnaireResponse.QuestionnaireResponseItemComponent> temp = new ArrayList<QuestionnaireResponse.QuestionnaireResponseItemComponent>();
|
List<QuestionnaireResponse.QuestionnaireResponseItemComponent> temp = new ArrayList<QuestionnaireResponse.QuestionnaireResponseItemComponent>();
|
||||||
|
|
||||||
for (QuestionnaireResponse.QuestionnaireResponseItemComponent g : source)
|
for (QuestionnaireResponse.QuestionnaireResponseItemComponent g : source)
|
||||||
if (instanceOf(t, (Element) g.getUserData("object")))
|
if (instanceOf(t, (Element) g.getUserData(UserDataNames.questionnaire_object)))
|
||||||
temp.add(g);
|
temp.add(g);
|
||||||
for (QuestionnaireResponse.QuestionnaireResponseItemComponent g : temp)
|
for (QuestionnaireResponse.QuestionnaireResponseItemComponent g : temp)
|
||||||
source.remove(g);
|
source.remove(g);
|
||||||
|
@ -526,7 +526,7 @@ public class QuestionnaireBuilder {
|
||||||
dest.add(subg);
|
dest.add(subg);
|
||||||
subg.setLinkId(sub.getLinkId());
|
subg.setLinkId(sub.getLinkId());
|
||||||
subg.setText(sub.getText());
|
subg.setText(sub.getText());
|
||||||
subg.setUserData("object", g.getUserData("object"));
|
subg.setUserData(UserDataNames.questionnaire_object, g.getUserData(UserDataNames.questionnaire_object));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -590,7 +590,7 @@ public class QuestionnaireBuilder {
|
||||||
List<Base> children = new ArrayList<Base>();
|
List<Base> children = new ArrayList<Base>();
|
||||||
|
|
||||||
QuestionnaireResponse.QuestionnaireResponseItemComponent aq = null;
|
QuestionnaireResponse.QuestionnaireResponseItemComponent aq = null;
|
||||||
Element obj = (Element) ag.getUserData("object");
|
Element obj = (Element) ag.getUserData(UserDataNames.questionnaire_object);
|
||||||
if (isPrimitive((TypeRefComponent) obj))
|
if (isPrimitive((TypeRefComponent) obj))
|
||||||
children.add(obj);
|
children.add(obj);
|
||||||
else if (obj instanceof Enumeration) {
|
else if (obj instanceof Enumeration) {
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
package org.hl7.fhir.r5.utils;
|
||||||
|
|
||||||
|
// other than render_src_package, all these are intended to be made consistent in format, using
|
||||||
|
// the standard format scope-name-name where scope is one of
|
||||||
|
// lib - core library (most of them)
|
||||||
|
// validator - validator CLI or web functionality
|
||||||
|
// pub - IG publisher functionality
|
||||||
|
// kindling - kindling related functionality
|
||||||
|
|
||||||
|
public class UserDataNames {
|
||||||
|
public static final String loader_urls_patched = "old.load.mode";
|
||||||
|
public static final String loader_custom_resource = "loader-custom-resource";
|
||||||
|
|
||||||
|
public static final String SNAPSHOT_BASE_MODEL = "base.model";
|
||||||
|
public static final String SNAPSHOT_BASE_PATH = "base.path";
|
||||||
|
public static final String SNAPSHOT_DERIVATION_EQUALS = "derivation.equals";
|
||||||
|
public static final String SNAPSHOT_DERIVATION_POINTER = "derived.pointer";
|
||||||
|
public static final String SNAPSHOT_IS_DERIVED = "derived.fact";
|
||||||
|
public static final String SNAPSHOT_GENERATED_IN_SNAPSHOT = "profileutilities.snapshot.processed";
|
||||||
|
public static final String SNAPSHOT_GENERATING = "profileutils.snapshot.generating";
|
||||||
|
public static final String SNAPSHOT_GENERATED = "profileutils.snapshot.generated";
|
||||||
|
public static final String SNAPSHOT_GENERATED_MESSAGES = "profileutils.snapshot.generated.messages";
|
||||||
|
public static final String SNAPSHOT_ERRORS = "profileutils.snapshot.errors";
|
||||||
|
public static final String SNAPSHOT_auto_added_slicing = "auto-added-slicing";
|
||||||
|
public static final String SNAPSHOT_messages = "profileutils.snapshot.messages";
|
||||||
|
public static final String SNAPSHOT_slice_name = "slice-name";
|
||||||
|
public static final String SNAPSHOT_SORT_ed_index = "ed.index";
|
||||||
|
public static final String SNAPSHOT_diff_source = "diff-source";
|
||||||
|
public static final String SNAPSHOT_regeneration_tracker = "hack.regnerated";
|
||||||
|
|
||||||
|
public static final String LANGUTILS_ORPHAN = "translations.orphans";
|
||||||
|
public static final String LANGUTILS_SOURCE_SUPPLEMENT = "translations.supplemented";
|
||||||
|
public static final String LANGUTILS_SOURCE_TRANSLATIONS = "translations.source-list";
|
||||||
|
|
||||||
|
public static final String rendering_xml_decorations = "fhir_decorations";
|
||||||
|
public static final String render_extension_slice = "slice";
|
||||||
|
public static final String render_opaque = "render.opaque";
|
||||||
|
public static final String render_tx_value = "tx.value";
|
||||||
|
public static final String render_tx_pattern = "tx.pattern";
|
||||||
|
public static final String render_link = "render.link";
|
||||||
|
public static final String render_external_link = "External.Link";
|
||||||
|
public static final String render_dict_generator_anchors = "dict.generator.anchors";
|
||||||
|
public static final String render_presentation = "presentation";
|
||||||
|
public static final String render_src_package = "package"; // <--- this value is reused by HAPI and can't change without consultation
|
||||||
|
public static final String renderer_is_generated = "renderer.generated";
|
||||||
|
|
||||||
|
public static final String keyview_elementSupported = "elementSupported";
|
||||||
|
public static final String keyview_hasFixed = "hasFixed";
|
||||||
|
public static final String keyview_usesMustSupport = "usesMustSupport";
|
||||||
|
|
||||||
|
public static final String LAYOUT_SvgLeft = "SvgLeft";
|
||||||
|
public static final String LAYOUT_SvgTop = "SvgTop";
|
||||||
|
public static final String LAYOUT_SvgWidth = "SvgWidth";
|
||||||
|
public static final String LAYOUT_UmlBreak = "UmlBreak";
|
||||||
|
public static final String LAYOUT_UmlDir = "UmlDir";
|
||||||
|
|
||||||
|
public static final String questionnaire_object = "object";
|
||||||
|
public static final String questionnaire_text = "text";
|
||||||
|
public static final String mappings_inherited = "private-marked-as-derived";
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public static final String deprecated_committee = "committee";
|
||||||
|
@Deprecated
|
||||||
|
public static final String render_filename = "filename";
|
||||||
|
public static final String render_webroot = "webroot";
|
||||||
|
|
||||||
|
public static final String comparison_match = "match";
|
||||||
|
public static final String COMP_VERSION_ANNOTATION = "version-annotation";
|
||||||
|
public static final String COMP_CONTEXT = "ctxt"; //!
|
||||||
|
|
||||||
|
public static final String tx_status_msg_name = "status-msg-name";
|
||||||
|
public static final String tx_status_msg_value = "status-msg-value";
|
||||||
|
public static final String tx_val_sys_error = "val.sys.error";
|
||||||
|
public static final String tx_cs_special = "tx.cs.special";
|
||||||
|
public static final String TX_REQUEST = "source";
|
||||||
|
public static final String TX_ASSOCIATED_CODESYSTEM = "cs";
|
||||||
|
public static final String tx_cs_version_notes = "cs.version.notes";
|
||||||
|
public static final String tx_known_supplements = "supplements.installed";
|
||||||
|
|
||||||
|
public static final String validator_bundle_resolution = "validator.bundle.resolution";
|
||||||
|
public static final String validator_bundle_resolved = "validator.bundle.resolved";
|
||||||
|
public static final String validator_expression_cache = "validator.expression.cache";
|
||||||
|
public static final String validator_slice_expression_cache = "slice.expression.cache";
|
||||||
|
public static final String validator_entry_map = "validator.entrymap";
|
||||||
|
public static final String validator_entry_map_reverse = "validator.entrymapR";
|
||||||
|
public static final String validation_bundle_error = "bundle.error.noted";
|
||||||
|
|
||||||
|
public static final String map_profile = "profile";
|
||||||
|
public static final String map_validated = "structuremap.validated";
|
||||||
|
public static final String map_parameters = "structuremap.parameters";
|
||||||
|
public static final String map_source = "element.source";
|
||||||
|
public static final String MAP_slice_name = "map-slice-name";
|
||||||
|
|
||||||
|
public static final String Storage_key = "Storage.key";
|
||||||
|
public static final String db_key = "db.key";
|
||||||
|
public static final String db_columns = "columns";
|
||||||
|
public static final String db_column = "column";
|
||||||
|
public static final String db_forEach = "forEach";
|
||||||
|
public static final String db_forEachOrNull = "forEachOrNull";
|
||||||
|
public static final String db_path = "path";
|
||||||
|
public static final String db_name = "name";
|
||||||
|
public static final String db_value = "value";
|
||||||
|
|
||||||
|
public static final String xver_rows = "rows";
|
||||||
|
public static final String xver_links = "links";
|
||||||
|
public static final String xver_sed = "sed";
|
||||||
|
public static final String xver_desc = "desc";
|
||||||
|
public static final String xver_cm_used = "cm.used";
|
||||||
|
public static final String xver_sliceName = "sliceName";
|
||||||
|
public static final String xver_delete = "delete";
|
||||||
|
public static final String xver_abstract = "abstract";
|
||||||
|
public static final String xver_expression = "expression";
|
||||||
|
|
||||||
|
|
||||||
|
public static final String java_code = "java.code";
|
||||||
|
|
||||||
|
public static final String validator_source_msg = "source.msg";
|
||||||
|
public static final String validator_source_vm = "source.vm";
|
||||||
|
|
||||||
|
|
||||||
|
public static final String PUB_CS_CONVERTED = "conv-vs";
|
||||||
|
public static final String pub_xref_used = "xref.used";
|
||||||
|
public static final String pub_xref_sources = "xref.sources";
|
||||||
|
public static final String pub_resource_config = "config";
|
||||||
|
public static final String pub_excel_inv_context = "context";
|
||||||
|
public static final String pub_excel_sheet_id = "id";
|
||||||
|
public static final String pub_element = "element";
|
||||||
|
public static final String pub_loaded_resource = "loaded.resource";
|
||||||
|
public static final String pub_source_filename = "source.filename";
|
||||||
|
public static final String pub_imposes_compare_id = "imposes.compare.id";
|
||||||
|
public static final String pub_analysis = "analysis";
|
||||||
|
public static final String pub_logical = "logical";
|
||||||
|
public static final String pub_context_file = "igpub.context.file";
|
||||||
|
public static final String pub_context_resource = "igpub.context.resource";
|
||||||
|
public static final String pub_no_load_deps = "no-load-deps";
|
||||||
|
|
||||||
|
public static final String kindling_ballot_package = "ballot.package";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -6,14 +6,15 @@ public class Column {
|
||||||
private int length;
|
private int length;
|
||||||
private String type;
|
private String type;
|
||||||
private ColumnKind kind;
|
private ColumnKind kind;
|
||||||
private boolean isColl;
|
private Boolean isColl;
|
||||||
private boolean duplicateReported;
|
private boolean duplicateReported;
|
||||||
|
private String notes;
|
||||||
|
|
||||||
protected Column() {
|
protected Column() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Column(String name, boolean isColl, String type, ColumnKind kind) {
|
public Column(String name, Boolean isColl, String type, ColumnKind kind) {
|
||||||
super();
|
super();
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.isColl = isColl;
|
this.isColl = isColl;
|
||||||
|
@ -51,11 +52,11 @@ public class Column {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isColl() {
|
public Boolean isColl() {
|
||||||
return isColl;
|
return isColl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setColl(boolean isColl) {
|
public void setColl(Boolean isColl) {
|
||||||
this.isColl = isColl;
|
this.isColl = isColl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +95,18 @@ public class Column {
|
||||||
return "Column [name=" + name + ", length=" + length + ", type=" + type + ", kind=" + kind + ", isColl=" + isColl
|
return "Column [name=" + name + ", length=" + length + ", type=" + type + ", kind=" + kind + ", isColl=" + isColl
|
||||||
+ "]";
|
+ "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getNotes() {
|
||||||
|
return notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNotes(String notes) {
|
||||||
|
this.notes = notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addNote(String note) {
|
||||||
|
this.notes = notes == null ? note : notes+"; "+note;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import org.apache.commons.codec.binary.Base64;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.exceptions.PathEngineException;
|
import org.hl7.fhir.exceptions.PathEngineException;
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.fhirpath.ExpressionNode;
|
import org.hl7.fhir.r5.fhirpath.ExpressionNode;
|
||||||
import org.hl7.fhir.r5.fhirpath.FHIRPathEngine;
|
import org.hl7.fhir.r5.fhirpath.FHIRPathEngine;
|
||||||
import org.hl7.fhir.r5.fhirpath.TypeDetails;
|
import org.hl7.fhir.r5.fhirpath.TypeDetails;
|
||||||
|
@ -23,6 +24,7 @@ import org.hl7.fhir.r5.model.IntegerType;
|
||||||
import org.hl7.fhir.r5.model.Property;
|
import org.hl7.fhir.r5.model.Property;
|
||||||
import org.hl7.fhir.r5.model.StringType;
|
import org.hl7.fhir.r5.model.StringType;
|
||||||
import org.hl7.fhir.r5.model.ValueSet;
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.json.model.JsonObject;
|
import org.hl7.fhir.utilities.json.model.JsonObject;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
|
|
||||||
|
@ -150,7 +152,7 @@ public class Runner implements IEvaluationContext {
|
||||||
validator.dump();
|
validator.dump();
|
||||||
validator.check();
|
validator.check();
|
||||||
resourceName = validator.getResourceName();
|
resourceName = validator.getResourceName();
|
||||||
wc.store = storage.createStore(wc.vd.asString("name"), (List<Column>) wc.vd.getUserData("columns"));
|
wc.store = storage.createStore(wc.vd.asString("name"), (List<Column>) wc.vd.getUserData(UserDataNames.db_columns));
|
||||||
return wc;
|
return wc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,7 +202,7 @@ public class Runner implements IEvaluationContext {
|
||||||
|
|
||||||
focus.addAll(executeForEachOrNull(vd, select, b));
|
focus.addAll(executeForEachOrNull(vd, select, b));
|
||||||
if (focus.isEmpty()) {
|
if (focus.isEmpty()) {
|
||||||
List<Column> columns = (List<Column>) select.getUserData("columns");
|
List<Column> columns = (List<Column>) select.getUserData(UserDataNames.db_columns);
|
||||||
for (List<Cell> row : rows) {
|
for (List<Cell> row : rows) {
|
||||||
for (Column c : columns) {
|
for (Column c : columns) {
|
||||||
Cell cell = cell(row, c.getName());
|
Cell cell = cell(row, c.getName());
|
||||||
|
@ -272,26 +274,26 @@ public class Runner implements IEvaluationContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Base> executeForEach(JsonObject vd, JsonObject focus, Base b) {
|
private List<Base> executeForEach(JsonObject vd, JsonObject focus, Base b) {
|
||||||
ExpressionNode n = (ExpressionNode) focus.getUserData("forEach");
|
ExpressionNode n = (ExpressionNode) focus.getUserData(UserDataNames.db_forEach);
|
||||||
List<Base> result = new ArrayList<>();
|
List<Base> result = new ArrayList<>();
|
||||||
result.addAll(fpe.evaluate(vd, b, n));
|
result.addAll(fpe.evaluate(vd, b, n));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Base> executeForEachOrNull(JsonObject vd, JsonObject focus, Base b) {
|
private List<Base> executeForEachOrNull(JsonObject vd, JsonObject focus, Base b) {
|
||||||
ExpressionNode n = (ExpressionNode) focus.getUserData("forEachOrNull");
|
ExpressionNode n = (ExpressionNode) focus.getUserData(UserDataNames.db_forEachOrNull);
|
||||||
List<Base> result = new ArrayList<>();
|
List<Base> result = new ArrayList<>();
|
||||||
result.addAll(fpe.evaluate(vd, b, n));
|
result.addAll(fpe.evaluate(vd, b, n));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void executeColumn(JsonObject vd, JsonObject column, Base b, List<List<Cell>> rows) {
|
private void executeColumn(JsonObject vd, JsonObject column, Base b, List<List<Cell>> rows) {
|
||||||
ExpressionNode n = (ExpressionNode) column.getUserData("path");
|
ExpressionNode n = (ExpressionNode) column.getUserData(UserDataNames.db_path);
|
||||||
List<Base> bl2 = new ArrayList<>();
|
List<Base> bl2 = new ArrayList<>();
|
||||||
if (b != null) {
|
if (b != null) {
|
||||||
bl2.addAll(fpe.evaluate(vd, b, n));
|
bl2.addAll(fpe.evaluate(vd, b, n));
|
||||||
}
|
}
|
||||||
Column col = (Column) column.getUserData("column");
|
Column col = (Column) column.getUserData(UserDataNames.db_column);
|
||||||
if (col == null) {
|
if (col == null) {
|
||||||
System.out.println("Error");
|
System.out.println("Error");
|
||||||
} else {
|
} else {
|
||||||
|
@ -416,7 +418,7 @@ public class Runner implements IEvaluationContext {
|
||||||
JsonObject vd = (JsonObject) appContext;
|
JsonObject vd = (JsonObject) appContext;
|
||||||
JsonObject constant = findConstant(vd, name);
|
JsonObject constant = findConstant(vd, name);
|
||||||
if (constant != null) {
|
if (constant != null) {
|
||||||
Base b = (Base) constant.getUserData("value");
|
Base b = (Base) constant.getUserData(UserDataNames.db_value);
|
||||||
if (b != null) {
|
if (b != null) {
|
||||||
list.add(b);
|
list.add(b);
|
||||||
}
|
}
|
||||||
|
@ -428,12 +430,23 @@ public class Runner implements IEvaluationContext {
|
||||||
@Override
|
@Override
|
||||||
public TypeDetails resolveConstantType(FHIRPathEngine engine, Object appContext, String name, boolean explicitConstant) throws PathEngineException {
|
public TypeDetails resolveConstantType(FHIRPathEngine engine, Object appContext, String name, boolean explicitConstant) throws PathEngineException {
|
||||||
if (explicitConstant) {
|
if (explicitConstant) {
|
||||||
JsonObject vd = (JsonObject) appContext;
|
if (appContext instanceof JsonObject) {
|
||||||
JsonObject constant = findConstant(vd, name.substring(1));
|
JsonObject vd = (JsonObject) appContext;
|
||||||
if (constant != null) {
|
JsonObject constant = findConstant(vd, name.substring(1));
|
||||||
Base b = (Base) constant.getUserData("value");
|
if (constant != null) {
|
||||||
if (b != null) {
|
Base b = (Base) constant.getUserData(UserDataNames.db_value);
|
||||||
return new TypeDetails(CollectionStatus.SINGLETON, b.fhirType());
|
if (b != null) {
|
||||||
|
return new TypeDetails(CollectionStatus.SINGLETON, b.fhirType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (appContext instanceof Element) {
|
||||||
|
Element vd = (Element) appContext;
|
||||||
|
Element constant = findConstant(vd, name.substring(1));
|
||||||
|
if (constant != null) {
|
||||||
|
Element v = constant.getNamedChild("value");
|
||||||
|
if (v != null) {
|
||||||
|
return new TypeDetails(CollectionStatus.SINGLETON, v.fhirType());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -448,6 +461,16 @@ public class Runner implements IEvaluationContext {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Element findConstant(Element vd, String name) {
|
||||||
|
for (Element o : vd.getChildren("constant")) {
|
||||||
|
if (name.equals(o.getNamedChildValue("name"))) {
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean log(String argument, List<Base> focus) {
|
public boolean log(String argument, List<Base> focus) {
|
||||||
throw new Error("Not implemented yet: log");
|
throw new Error("Not implemented yet: log");
|
||||||
|
@ -483,15 +506,15 @@ public class Runner implements IEvaluationContext {
|
||||||
List<Base> base = new ArrayList<Base>();
|
List<Base> base = new ArrayList<Base>();
|
||||||
if (focus.size() == 1) {
|
if (focus.size() == 1) {
|
||||||
Base res = focus.get(0);
|
Base res = focus.get(0);
|
||||||
if (!res.hasUserData("Storage.key")) {
|
if (!res.hasUserData(UserDataNames.Storage_key)) {
|
||||||
String key = storage.getKeyForSourceResource(res);
|
String key = storage.getKeyForSourceResource(res);
|
||||||
if (key == null) {
|
if (key == null) {
|
||||||
throw new FHIRException("Unidentified resource: "+res.fhirType()+"/"+res.getIdBase());
|
throw new FHIRException("Unidentified resource: "+res.fhirType()+"/"+res.getIdBase());
|
||||||
} else {
|
} else {
|
||||||
res.setUserData("Storage.key", key);
|
res.setUserData(UserDataNames.Storage_key, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
base.add(new StringType(res.getUserString("Storage.key")));
|
base.add(new StringType(res.getUserString(UserDataNames.Storage_key)));
|
||||||
}
|
}
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
@ -518,15 +541,15 @@ public class Runner implements IEvaluationContext {
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
Base target = provider.resolveReference(rootResource, ref, rt);
|
Base target = provider.resolveReference(rootResource, ref, rt);
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
if (!res.hasUserData("Storage.key")) {
|
if (!res.hasUserData(UserDataNames.Storage_key)) {
|
||||||
String key = storage.getKeyForTargetResource(target);
|
String key = storage.getKeyForTargetResource(target);
|
||||||
if (key == null) {
|
if (key == null) {
|
||||||
throw new FHIRException("Unidentified resource: "+res.fhirType()+"/"+res.getIdBase());
|
throw new FHIRException("Unidentified resource: "+res.fhirType()+"/"+res.getIdBase());
|
||||||
} else {
|
} else {
|
||||||
res.setUserData("Storage.key", key);
|
res.setUserData(UserDataNames.Storage_key, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
base.add(new StringType(res.getUserString("Storage.key")));
|
base.add(new StringType(res.getUserString(UserDataNames.Storage_key)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.hl7.fhir.r5.model.UnsignedIntType;
|
||||||
import org.hl7.fhir.r5.model.UriType;
|
import org.hl7.fhir.r5.model.UriType;
|
||||||
import org.hl7.fhir.r5.model.UrlType;
|
import org.hl7.fhir.r5.model.UrlType;
|
||||||
import org.hl7.fhir.r5.model.UuidType;
|
import org.hl7.fhir.r5.model.UuidType;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.sql.Validator.TrueFalseOrUnknown;
|
import org.hl7.fhir.r5.utils.sql.Validator.TrueFalseOrUnknown;
|
||||||
import org.hl7.fhir.r5.fhirpath.ExpressionNode.CollectionStatus;
|
import org.hl7.fhir.r5.fhirpath.ExpressionNode.CollectionStatus;
|
||||||
import org.hl7.fhir.r5.fhirpath.FHIRPathEngine.IssueMessage;
|
import org.hl7.fhir.r5.fhirpath.FHIRPathEngine.IssueMessage;
|
||||||
|
@ -50,6 +51,8 @@ import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
|
||||||
|
|
||||||
|
// see also org.hl7.fhir.validation.instance.type.ViewDefinitionValidator
|
||||||
|
|
||||||
public class Validator {
|
public class Validator {
|
||||||
|
|
||||||
public enum TrueFalseOrUnknown {
|
public enum TrueFalseOrUnknown {
|
||||||
|
@ -105,7 +108,7 @@ public class Validator {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Column> columns = new ArrayList<>();
|
List<Column> columns = new ArrayList<>();
|
||||||
viewDefinition.setUserData("columns", columns);
|
viewDefinition.setUserData(UserDataNames.db_columns, columns);
|
||||||
|
|
||||||
JsonElement resourceNameJ = viewDefinition.get("resource");
|
JsonElement resourceNameJ = viewDefinition.get("resource");
|
||||||
if (resourceNameJ == null) {
|
if (resourceNameJ == null) {
|
||||||
|
@ -149,7 +152,7 @@ public class Validator {
|
||||||
|
|
||||||
private List<Column> checkSelect(JsonObject vd, String path, JsonObject select, TypeDetails t) {
|
private List<Column> checkSelect(JsonObject vd, String path, JsonObject select, TypeDetails t) {
|
||||||
List<Column> columns = new ArrayList<>();
|
List<Column> columns = new ArrayList<>();
|
||||||
select.setUserData("columns", columns);
|
select.setUserData(UserDataNames.db_columns, columns);
|
||||||
checkProperties(select, path, "column", "select", "forEach", "forEachOrNull", "unionAll");
|
checkProperties(select, path, "column", "select", "forEach", "forEachOrNull", "unionAll");
|
||||||
|
|
||||||
if (select.has("forEach")) {
|
if (select.has("forEach")) {
|
||||||
|
@ -246,7 +249,7 @@ public class Validator {
|
||||||
error(path+".unionAll["+i+"]", ((JsonArray) a).get(ic), "unionAll["+i+"] column definitions do not match: "+diff, IssueType.INVALID);
|
error(path+".unionAll["+i+"]", ((JsonArray) a).get(ic), "unionAll["+i+"] column definitions do not match: "+diff, IssueType.INVALID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
a.setUserData("colunms", columns);
|
a.setUserData(UserDataNames.db_columns, columns);
|
||||||
return columns;
|
return columns;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,7 +290,7 @@ public class Validator {
|
||||||
ExpressionNode node = null;
|
ExpressionNode node = null;
|
||||||
try {
|
try {
|
||||||
node = fpe.parse(expr);
|
node = fpe.parse(expr);
|
||||||
column.setUserData("path", node);
|
column.setUserData(UserDataNames.db_path, node);
|
||||||
td = fpe.checkOnTypes(vd, resourceName, t, node, warnings);
|
td = fpe.checkOnTypes(vd, resourceName, t, node, warnings);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
error(path, expression, e.getMessage(), IssueType.INVALID);
|
error(path, expression, e.getMessage(), IssueType.INVALID);
|
||||||
|
@ -323,7 +326,7 @@ public class Validator {
|
||||||
}
|
}
|
||||||
// ok, name is sorted!
|
// ok, name is sorted!
|
||||||
if (columnName != null) {
|
if (columnName != null) {
|
||||||
column.setUserData("name", columnName);
|
column.setUserData(UserDataNames.db_name, columnName);
|
||||||
boolean isColl = false;
|
boolean isColl = false;
|
||||||
if (column.has("collection")) {
|
if (column.has("collection")) {
|
||||||
JsonElement collectionJ = column.get("collection");
|
JsonElement collectionJ = column.get("collection");
|
||||||
|
@ -396,7 +399,7 @@ public class Validator {
|
||||||
}
|
}
|
||||||
if (ok) {
|
if (ok) {
|
||||||
Column col = new Column(columnName, isColl, type, kindForType(type));
|
Column col = new Column(columnName, isColl, type, kindForType(type));
|
||||||
column.setUserData("column", col);
|
column.setUserData(UserDataNames.db_column, col);
|
||||||
return col;
|
return col;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -429,7 +432,7 @@ public class Validator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSimpleType(String type) {
|
private boolean isSimpleType(String type) {
|
||||||
return Utilities.existsInList(type, "dateTime", "boolean", "integer", "decimal", "string", "base64Binary", "id", "code", "date", "time", "canonical");
|
return Utilities.existsInList(type, "dateTime", "boolean", "integer", "decimal", "string", "base64Binary", "id", "code", "date", "time", "canonical", "uri", "url");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String simpleType(String type) {
|
private String simpleType(String type) {
|
||||||
|
@ -469,7 +472,7 @@ public class Validator {
|
||||||
TypeDetails td = null;
|
TypeDetails td = null;
|
||||||
try {
|
try {
|
||||||
ExpressionNode n = fpe.parse(expr);
|
ExpressionNode n = fpe.parse(expr);
|
||||||
focus.setUserData("forEach", n);
|
focus.setUserData(UserDataNames.db_forEach, n);
|
||||||
td = fpe.checkOnTypes(vd, resourceName, t, n, warnings);
|
td = fpe.checkOnTypes(vd, resourceName, t, n, warnings);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
error(path, expression, e.getMessage(), IssueType.INVALID);
|
error(path, expression, e.getMessage(), IssueType.INVALID);
|
||||||
|
@ -494,7 +497,7 @@ public class Validator {
|
||||||
TypeDetails td = null;
|
TypeDetails td = null;
|
||||||
try {
|
try {
|
||||||
ExpressionNode n = fpe.parse(expr);
|
ExpressionNode n = fpe.parse(expr);
|
||||||
focus.setUserData("forEachOrNull", n);
|
focus.setUserData(UserDataNames.db_forEachOrNull, n);
|
||||||
td = fpe.checkOnTypes(vd, resourceName, t, n, warnings);
|
td = fpe.checkOnTypes(vd, resourceName, t, n, warnings);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
error(path, expression, e.getMessage(), IssueType.INVALID);
|
error(path, expression, e.getMessage(), IssueType.INVALID);
|
||||||
|
@ -570,7 +573,7 @@ public class Validator {
|
||||||
error(path+"."+name, j, name+" must be a string", IssueType.INVALID);
|
error(path+"."+name, j, name+" must be a string", IssueType.INVALID);
|
||||||
} else {
|
} else {
|
||||||
value.setValueAsString(j.asString());
|
value.setValueAsString(j.asString());
|
||||||
constant.setUserData("value", value);
|
constant.setUserData(UserDataNames.db_value, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,7 +583,7 @@ public class Validator {
|
||||||
error(path+"."+name, j, name+" must be a boolean", IssueType.INVALID);
|
error(path+"."+name, j, name+" must be a boolean", IssueType.INVALID);
|
||||||
} else {
|
} else {
|
||||||
value.setValueAsString(j.asString());
|
value.setValueAsString(j.asString());
|
||||||
constant.setUserData("value", value);
|
constant.setUserData(UserDataNames.db_value, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -590,7 +593,7 @@ public class Validator {
|
||||||
error(path+"."+name, j, name+" must be a number", IssueType.INVALID);
|
error(path+"."+name, j, name+" must be a number", IssueType.INVALID);
|
||||||
} else {
|
} else {
|
||||||
value.setValueAsString(j.asString());
|
value.setValueAsString(j.asString());
|
||||||
constant.setUserData("value", value);
|
constant.setUserData(UserDataNames.db_value, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -607,7 +610,7 @@ public class Validator {
|
||||||
TypeDetails td = null;
|
TypeDetails td = null;
|
||||||
try {
|
try {
|
||||||
ExpressionNode n = fpe.parse(expr);
|
ExpressionNode n = fpe.parse(expr);
|
||||||
where.setUserData("path", n);
|
where.setUserData(UserDataNames.db_path, n);
|
||||||
td = fpe.checkOnTypes(vd, resourceName, types, n, warnings);
|
td = fpe.checkOnTypes(vd, resourceName, types, n, warnings);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
error(path, where.get("path"), e.getMessage(), IssueType.INVALID);
|
error(path, where.get("path"), e.getMessage(), IssueType.INVALID);
|
||||||
|
|
|
@ -70,6 +70,7 @@ import org.hl7.fhir.r5.renderers.TerminologyRenderer;
|
||||||
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.FhirPublication;
|
import org.hl7.fhir.utilities.FhirPublication;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
@ -1793,8 +1794,8 @@ public class StructureMapUtilities {
|
||||||
if (services != null)
|
if (services != null)
|
||||||
res = services.createResource(context.getAppInfo(), res, root);
|
res = services.createResource(context.getAppInfo(), res, root);
|
||||||
}
|
}
|
||||||
if (tgt.hasUserData("profile"))
|
if (tgt.hasUserData(UserDataNames.map_profile))
|
||||||
res.setUserData("profile", tgt.getUserData("profile"));
|
res.setUserData(UserDataNames.map_profile, tgt.getUserData(UserDataNames.map_profile));
|
||||||
return res;
|
return res;
|
||||||
case COPY:
|
case COPY:
|
||||||
return getParam(vars, tgt.getParameter().get(0));
|
return getParam(vars, tgt.getParameter().get(0));
|
||||||
|
@ -2468,7 +2469,7 @@ public class StructureMapUtilities {
|
||||||
StructureDefinition sd = var.getProperty().getProfileProperty().getStructure();
|
StructureDefinition sd = var.getProperty().getProfileProperty().getStructure();
|
||||||
ElementDefinition ednew = sd.getDifferential().addElement();
|
ElementDefinition ednew = sd.getDifferential().addElement();
|
||||||
ednew.setPath(var.getProperty().getProfileProperty().getDefinition().getPath() + "." + pc.getName());
|
ednew.setPath(var.getProperty().getProfileProperty().getDefinition().getPath() + "." + pc.getName());
|
||||||
ednew.setUserData("slice-name", sliceName);
|
ednew.setUserData(UserDataNames.MAP_slice_name, sliceName); // todo.. why do this?
|
||||||
ednew.setFixed(fixed);
|
ednew.setFixed(fixed);
|
||||||
for (ProfiledType pt : type.getProfiledTypes()) {
|
for (ProfiledType pt : type.getProfiledTypes()) {
|
||||||
if (pt.hasBindings())
|
if (pt.hasBindings())
|
||||||
|
@ -2620,7 +2621,7 @@ public class StructureMapUtilities {
|
||||||
profile.setBaseDefinition(prop.getBaseProperty().getStructure().getUrl());
|
profile.setBaseDefinition(prop.getBaseProperty().getStructure().getUrl());
|
||||||
profile.setName("Profile for " + profile.getType() + " for " + sliceName);
|
profile.setName("Profile for " + profile.getType() + " for " + sliceName);
|
||||||
profile.setUrl(map.getUrl().replace("StructureMap", "StructureDefinition") + "-" + profile.getType() + suffix);
|
profile.setUrl(map.getUrl().replace("StructureMap", "StructureDefinition") + "-" + profile.getType() + suffix);
|
||||||
ctxt.setUserData("profile", profile.getUrl()); // then we can easily assign this profile url for validation later when we actually transform
|
ctxt.setUserData(UserDataNames.map_profile, profile.getUrl()); // then we can easily assign this profile url for validation later when we actually transform
|
||||||
profile.setId(map.getId() + "-" + profile.getType() + suffix);
|
profile.setId(map.getId() + "-" + profile.getType() + suffix);
|
||||||
profile.setStatus(map.getStatus());
|
profile.setStatus(map.getStatus());
|
||||||
profile.setExperimental(map.getExperimental());
|
profile.setExperimental(map.getExperimental());
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
package org.hl7.fhir.r5.utils.validation;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by the validation infrastructure to cache internal infrastructure that
|
||||||
|
* will be cast away when the session is closed by the application
|
||||||
|
*/
|
||||||
|
public class ValidatorSession {
|
||||||
|
|
||||||
|
public static final String VIEW_DEFINITION_CONTEXT = "VIEW_DEFINITION_CONTEXT";
|
||||||
|
|
||||||
|
private Map<String, Object> objects = new HashMap<>();
|
||||||
|
protected String sessionId;
|
||||||
|
|
||||||
|
public ValidatorSession() {
|
||||||
|
super();
|
||||||
|
sessionId = Utilities.makeUuidLC();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSessionId() {
|
||||||
|
return sessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> getObjects() {
|
||||||
|
return objects;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
objects.clear();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1126,4 +1126,20 @@ public class I18nConstants {
|
||||||
public static final String SD_PATH_SLICING_DEPRECATED = "SD_PATH_SLICING_DEPRECATED";
|
public static final String SD_PATH_SLICING_DEPRECATED = "SD_PATH_SLICING_DEPRECATED";
|
||||||
public static final String SD_PATH_NOT_VALID = "SD_PATH_NOT_VALID";
|
public static final String SD_PATH_NOT_VALID = "SD_PATH_NOT_VALID";
|
||||||
public static final String SD_PATH_ERROR = "SD_PATH_ERROR";
|
public static final String SD_PATH_ERROR = "SD_PATH_ERROR";
|
||||||
|
public static final String VIEWDEFINITION_SHOULD_HAVE_NAME = "VIEWDEFINITION_SHOULD_HAVE_NAME";
|
||||||
|
public static final String VIEWDEFINITION_NAME_INVALID = "VIEWDEFINITION_NAME_INVALID";
|
||||||
|
public static final String VIEWDEFINITION_PATH_ERROR = "VIEWDEFINITION_PATH_ERROR";
|
||||||
|
public static final String VIEWDEFINITION_PATH_WRONG_RETURN = "VIEWDEFINITION_PATH_WRONG_RETURN";
|
||||||
|
public static final String VIEWDEFINITION_PATH_WARNING = "VIEWDEFINITION_PATH_WARNING";
|
||||||
|
public static final String VIEWDEFINITION_UNKNOWN_RESOURCE = "VIEWDEFINITION_UNKNOWN_RESOURCE";
|
||||||
|
public static final String VIEWDEFINITION_DUPL_COL_NAME = "VIEWDEFINITION_DUPL_COL_NAME";
|
||||||
|
public static final String VIEWDEFINITION_NAME_REQUIRED = "VIEWDEFINITION_NAME_REQUIRED";
|
||||||
|
public static final String VIEWDEFINITION_NAME_REQUIRED_HINT = "VIEWDEFINITION_NAME_REQUIRED_HINT";
|
||||||
|
public static final String VIEWDEFINITION_COLLECTION_NOT_NEEDED = "VIEWDEFINITION_COLLECTION_NOT_NEEDED";
|
||||||
|
public static final String VIEWDEFINITION_COLLECTION_NOT_ALWAYS = "VIEWDEFINITION_COLLECTION_NOT_ALWAYS";
|
||||||
|
public static final String VIEWDEFINITION_COLLECTION_NEEDED1 = "VIEWDEFINITION_COLLECTION_NEEDED1";
|
||||||
|
public static final String VIEWDEFINITION_COLLECTION_NEEDED2 = "VIEWDEFINITION_COLLECTION_NEEDED2";
|
||||||
|
public static final String VIEWDEFINITION_TYPE_MISMATCH = "VIEWDEFINITION_TYPE_MISMATCH";
|
||||||
|
public static final String VIEWDEFINITION_UNABLE_TO_TYPE = "VIEWDEFINITION_UNABLE_TO_TYPE";
|
||||||
|
public static final String VIEWDEFINITION_COMPLEX_TYPE = "VIEWDEFINITION_COMPLEX_TYPE";
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,6 +119,10 @@ public abstract class XhtmlFluent {
|
||||||
return addTag("ul");
|
return addTag("ul");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public XhtmlNode ol() {
|
||||||
|
return addTag("ol");
|
||||||
|
}
|
||||||
|
|
||||||
public XhtmlNode li() {
|
public XhtmlNode li() {
|
||||||
return addTag("li");
|
return addTag("li");
|
||||||
}
|
}
|
||||||
|
|
|
@ -586,7 +586,6 @@ public class XhtmlParser {
|
||||||
if (t.length() > 0)
|
if (t.length() > 0)
|
||||||
{
|
{
|
||||||
lastText = t;
|
lastText = t;
|
||||||
// System.out.println(t);
|
|
||||||
node.addText(t).setLocation(markLocation());
|
node.addText(t).setLocation(markLocation());
|
||||||
s.setLength(0);
|
s.setLength(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1156,4 +1156,19 @@ CANONICAL_MULTIPLE_VERSIONS_KNOWN = The version {2} for the {0} {1} is not known
|
||||||
SD_PATH_SLICING_DEPRECATED = The discriminator type ''{0}'' has been deprecated. Use type=value with a pattern[x] instead
|
SD_PATH_SLICING_DEPRECATED = The discriminator type ''{0}'' has been deprecated. Use type=value with a pattern[x] instead
|
||||||
SD_PATH_NOT_VALID = The discriminator path ''{0}'' does not appear to be valid for the element that is being sliced ''{1}''
|
SD_PATH_NOT_VALID = The discriminator path ''{0}'' does not appear to be valid for the element that is being sliced ''{1}''
|
||||||
SD_PATH_ERROR = The discriminator path ''{0}'' does not appear to be valid for the element that is being sliced ''{1}'': {2}
|
SD_PATH_ERROR = The discriminator path ''{0}'' does not appear to be valid for the element that is being sliced ''{1}'': {2}
|
||||||
|
VIEWDEFINITION_SHOULD_HAVE_NAME = No name provided. A name is required in many contexts where a ViewDefinition is used
|
||||||
|
VIEWDEFINITION_NAME_INVALID = The {0} name ''{1}'' is not valid
|
||||||
|
VIEWDEFINITION_PATH_ERROR = Expression Error: {0}{1}
|
||||||
|
VIEWDEFINITION_PATH_WRONG_RETURN = A where path must return a boolean, but the expression ''{0}'' returns a ''{1}''
|
||||||
|
VIEWDEFINITION_PATH_WARNING = Expression Warning: {0}
|
||||||
|
VIEWDEFINITION_UNKNOWN_RESOURCE = The name ''{0}'' is not a valid resource{1}
|
||||||
|
VIEWDEFINITION_DUPL_COL_NAME = Duplicate Column Name ''{0}''
|
||||||
|
VIEWDEFINITION_NAME_REQUIRED = A column name is required
|
||||||
|
VIEWDEFINITION_NAME_REQUIRED_HINT = A column name is required. The natural name to chose is ''{0}'' (from the path)
|
||||||
|
VIEWDEFINITION_COLLECTION_NOT_NEEDED = collection is true, but the path statement ''{0}'' can only return single values for the column ''{1}''{2}
|
||||||
|
VIEWDEFINITION_COLLECTION_NOT_ALWAYS = The column ''{0}'' is defined as a collection, but collections are not supported in all execution contexts
|
||||||
|
VIEWDEFINITION_COLLECTION_NEEDED1 = This column is not defined as a collection, but the path statement ''{0}'' might return multiple values for the column ''{1}'' for some inputs{2}
|
||||||
|
VIEWDEFINITION_COLLECTION_NEEDED2 = This column is defined to be not a collection, but the path statement ''{0}'' might return multiple values for the column ''{1}'' for some inputs{2}
|
||||||
|
VIEWDEFINITION_TYPE_MISMATCH = The path expression ''{0}'' does not return a value of the type ''{1}'' - found ''{2}''{3}
|
||||||
|
VIEWDEFINITION_UNABLE_TO_TYPE = Unable to determine a type (found ''{0}''){1}
|
||||||
|
VIEWDEFINITION_COMPLEX_TYPE = Column from path ''{0}'' is a complex type (''{1}''){2}. This is not supported in some Runners
|
||||||
|
|
|
@ -65,12 +65,14 @@ import org.hl7.fhir.r5.model.Enumerations.PublicationStatus;
|
||||||
import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent;
|
import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent;
|
||||||
import org.hl7.fhir.r5.terminologies.ValueSetUtilities;
|
import org.hl7.fhir.r5.terminologies.ValueSetUtilities;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus;
|
||||||
import org.hl7.fhir.r5.utils.validation.IMessagingServices;
|
import org.hl7.fhir.r5.utils.validation.IMessagingServices;
|
||||||
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
||||||
import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor;
|
import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor;
|
||||||
import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher;
|
import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.IValidationContextResourceLoader;
|
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.IValidationContextResourceLoader;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.ReferenceValidationPolicy;
|
import org.hl7.fhir.r5.utils.validation.constants.ReferenceValidationPolicy;
|
||||||
|
@ -168,7 +170,6 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
protected final String BUNDLE = "Bundle";
|
protected final String BUNDLE = "Bundle";
|
||||||
protected final String LAST_UPDATED = "lastUpdated";
|
protected final String LAST_UPDATED = "lastUpdated";
|
||||||
|
|
||||||
protected String sessionId;
|
|
||||||
protected BaseValidator parent;
|
protected BaseValidator parent;
|
||||||
protected IWorkerContext context;
|
protected IWorkerContext context;
|
||||||
protected ValidationTimeTracker timeTracker = new ValidationTimeTracker();
|
protected ValidationTimeTracker timeTracker = new ValidationTimeTracker();
|
||||||
|
@ -183,6 +184,7 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
// don't repeatedly raise the same warnings all the time
|
// don't repeatedly raise the same warnings all the time
|
||||||
protected Set<String> statusWarnings = new HashSet<>();
|
protected Set<String> statusWarnings = new HashSet<>();
|
||||||
|
|
||||||
|
protected ValidatorSession session;
|
||||||
protected Source source; // @configuration
|
protected Source source; // @configuration
|
||||||
protected ValidationLevel level = ValidationLevel.HINTS; // @configuration
|
protected ValidationLevel level = ValidationLevel.HINTS; // @configuration
|
||||||
protected Coding jurisdiction; // @configuration
|
protected Coding jurisdiction; // @configuration
|
||||||
|
@ -194,15 +196,18 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
protected List<UsageContext> usageContexts = new ArrayList<UsageContext>(); // @configuration
|
protected List<UsageContext> usageContexts = new ArrayList<UsageContext>(); // @configuration
|
||||||
protected ValidationOptions baseOptions = new ValidationOptions(FhirPublication.R5); // @configuration
|
protected ValidationOptions baseOptions = new ValidationOptions(FhirPublication.R5); // @configuration
|
||||||
|
|
||||||
public BaseValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug) {
|
public BaseValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, ValidatorSession session) {
|
||||||
super();
|
super();
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
this.session = session;
|
||||||
|
if (this.session == null) {
|
||||||
|
this.session = new ValidatorSession();
|
||||||
|
}
|
||||||
this.xverManager = xverManager;
|
this.xverManager = xverManager;
|
||||||
if (this.xverManager == null) {
|
if (this.xverManager == null) {
|
||||||
this.xverManager = new XVerExtensionManager(context);
|
this.xverManager = new XVerExtensionManager(context);
|
||||||
}
|
}
|
||||||
this.debug = debug;
|
this.debug = debug;
|
||||||
sessionId = Utilities.makeUuidLC();
|
|
||||||
policyAdvisor = new BasePolicyAdvisorForFullValidation(ReferenceValidationPolicy.CHECK_VALID);
|
policyAdvisor = new BasePolicyAdvisorForFullValidation(ReferenceValidationPolicy.CHECK_VALID);
|
||||||
urlRegex = Constants.URI_REGEX_XVER.replace("$$", CommaSeparatedStringBuilder.join("|", context.getResourceNames()));
|
urlRegex = Constants.URI_REGEX_XVER.replace("$$", CommaSeparatedStringBuilder.join("|", context.getResourceNames()));
|
||||||
}
|
}
|
||||||
|
@ -210,6 +215,7 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
public BaseValidator(BaseValidator parent) {
|
public BaseValidator(BaseValidator parent) {
|
||||||
super();
|
super();
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
this.session = parent.session;
|
||||||
this.context = parent.context;
|
this.context = parent.context;
|
||||||
this.xverManager = parent.xverManager;
|
this.xverManager = parent.xverManager;
|
||||||
this.debug = parent.debug;
|
this.debug = parent.debug;
|
||||||
|
@ -228,7 +234,6 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
this.usageContexts.addAll(parent.usageContexts);
|
this.usageContexts.addAll(parent.usageContexts);
|
||||||
this.baseOptions = parent.baseOptions;
|
this.baseOptions = parent.baseOptions;
|
||||||
this.fetcher = parent.fetcher;
|
this.fetcher = parent.fetcher;
|
||||||
this.sessionId = parent.sessionId;
|
|
||||||
this.policyAdvisor = parent.policyAdvisor;
|
this.policyAdvisor = parent.policyAdvisor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1022,16 +1027,16 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
|
|
||||||
protected Element resolveInBundle(Element bundle, List<Element> entries, String ref, String fullUrl, String type, String id, NodeStack stack, List<ValidationMessage> errors, String name, Element source, boolean isWarning, boolean isNLLink) {
|
protected Element resolveInBundle(Element bundle, List<Element> entries, String ref, String fullUrl, String type, String id, NodeStack stack, List<ValidationMessage> errors, String name, Element source, boolean isWarning, boolean isNLLink) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
Map<String, List<Element>> map = (Map<String, List<Element>>) bundle.getUserData("validator.entrymap");
|
Map<String, List<Element>> map = (Map<String, List<Element>>) bundle.getUserData(UserDataNames.validator_entry_map);
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
Map<String, List<Element>> relMap = (Map<String, List<Element>>) bundle.getUserData("validator.entrymapR");
|
Map<String, List<Element>> relMap = (Map<String, List<Element>>) bundle.getUserData(UserDataNames.validator_entry_map_reverse);
|
||||||
List<Element> list = null;
|
List<Element> list = null;
|
||||||
|
|
||||||
if (map == null) {
|
if (map == null) {
|
||||||
map = new HashMap<>();
|
map = new HashMap<>();
|
||||||
bundle.setUserData("validator.entrymap", map);
|
bundle.setUserData(UserDataNames.validator_entry_map, map);
|
||||||
relMap = new HashMap<>();
|
relMap = new HashMap<>();
|
||||||
bundle.setUserData("validator.entrymapR", relMap);
|
bundle.setUserData(UserDataNames.validator_entry_map_reverse, relMap);
|
||||||
for (Element entry : entries) {
|
for (Element entry : entries) {
|
||||||
String fu = entry.getNamedChildValue(FULL_URL, false);
|
String fu = entry.getNamedChildValue(FULL_URL, false);
|
||||||
list = map.get(fu);
|
list = map.get(fu);
|
||||||
|
@ -1075,8 +1080,8 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
String tt = extractResourceType(ref);
|
String tt = extractResourceType(ref);
|
||||||
ok = VersionUtilities.getCanonicalResourceNames(context.getVersion()).contains(tt);
|
ok = VersionUtilities.getCanonicalResourceNames(context.getVersion()).contains(tt);
|
||||||
}
|
}
|
||||||
if (!ok && stack != null && !sessionId.equals(source.getUserString("bundle.error.noted"))) {
|
if (!ok && stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
hintOrError(!isWarning, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND, ref, name);
|
hintOrError(!isWarning, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND, ref, name);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -1084,17 +1089,17 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
if (fragment != null) {
|
if (fragment != null) {
|
||||||
int i = countFragmentMatches(el.get(0), fragment);
|
int i = countFragmentMatches(el.get(0), fragment);
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
hintOrError(isNLLink, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_FRAGMENT, ref, fragment, name);
|
hintOrError(isNLLink, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_FRAGMENT, ref, fragment, name);
|
||||||
} else if (i > 1) {
|
} else if (i > 1) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE_FRAGMENT, i, ref, fragment, name);
|
rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE_FRAGMENT, i, ref, fragment, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return el.get(0);
|
return el.get(0);
|
||||||
} else {
|
} else {
|
||||||
if (stack != null && !sessionId.equals(source.getUserString("bundle.error.noted"))) {
|
if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE, el.size(), ref, name);
|
rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE, el.size(), ref, name);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -1110,8 +1115,8 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
if (el.size() == 1) {
|
if (el.size() == 1) {
|
||||||
return el.get(0);
|
return el.get(0);
|
||||||
} else {
|
} else {
|
||||||
if (stack != null && !sessionId.equals(source.getUserString("bundle.error.noted"))) {
|
if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE, el.size(), ref, name);
|
rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE, el.size(), ref, name);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -1132,17 +1137,17 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi
|
||||||
if (!VersionUtilities.isR4Plus(context.getVersion())) {
|
if (!VersionUtilities.isR4Plus(context.getVersion())) {
|
||||||
if (el.size() == 1) {
|
if (el.size() == 1) {
|
||||||
return el.get(0);
|
return el.get(0);
|
||||||
} else if (stack != null && !sessionId.equals(source.getUserString("bundle.error.noted"))) {
|
} else if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
rulePlural(errors, "2023-11-15", IssueType.INVALID, stack, false, el.size(), I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT, ref, name, CommaSeparatedStringBuilder.join(",", Utilities.sorted(tl)));
|
rulePlural(errors, "2023-11-15", IssueType.INVALID, stack, false, el.size(), I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT, ref, name, CommaSeparatedStringBuilder.join(",", Utilities.sorted(tl)));
|
||||||
}
|
}
|
||||||
} else if (stack != null && !sessionId.equals(source.getUserString("bundle.error.noted"))) {
|
} else if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
rulePlural(errors, "2023-11-15", IssueType.INVALID, stack, false, el.size(), I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT, ref, name, CommaSeparatedStringBuilder.join(",", Utilities.sorted(tl)));
|
rulePlural(errors, "2023-11-15", IssueType.INVALID, stack, false, el.size(), I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT, ref, name, CommaSeparatedStringBuilder.join(",", Utilities.sorted(tl)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (stack != null && !sessionId.equals(source.getUserString("bundle.error.noted"))) {
|
if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) {
|
||||||
source.setUserData("bundle.error.noted", sessionId);
|
source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId());
|
||||||
hintOrError(!isWarning, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND, ref, name);
|
hintOrError(!isWarning, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND, ref, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,7 @@ import org.hl7.fhir.r5.utils.validation.IMessagingServices;
|
||||||
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
||||||
import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor;
|
import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor;
|
||||||
import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher;
|
import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.BindingKind;
|
import org.hl7.fhir.r5.utils.validation.constants.BindingKind;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.CheckDisplayOption;
|
import org.hl7.fhir.r5.utils.validation.constants.CheckDisplayOption;
|
||||||
|
@ -865,7 +866,7 @@ public class ValidationEngine implements IValidatorResourceFetcher, IValidationP
|
||||||
}
|
}
|
||||||
|
|
||||||
public InstanceValidator getValidator(FhirFormat format) throws FHIRException, IOException {
|
public InstanceValidator getValidator(FhirFormat format) throws FHIRException, IOException {
|
||||||
InstanceValidator validator = new InstanceValidator(context, null, null);
|
InstanceValidator validator = new InstanceValidator(context, null, null, new ValidatorSession());
|
||||||
context.getTxClientManager().setUsage("validation");
|
context.getTxClientManager().setUsage("validation");
|
||||||
validator.setHintAboutNonMustSupport(hintAboutNonMustSupport);
|
validator.setHintAboutNonMustSupport(hintAboutNonMustSupport);
|
||||||
validator.setAnyExtensionsAllowed(anyExtensionsAllowed);
|
validator.setAnyExtensionsAllowed(anyExtensionsAllowed);
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.io.File;
|
||||||
import org.hl7.fhir.r5.model.OperationOutcome;
|
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.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
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;
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ public class DefaultRenderer extends ValidationOutputRenderer {
|
||||||
dst.println((error == 0 ? "Success" : "*FAILURE*") + ": " + Integer.toString(error) + " errors, " + Integer.toString(warn) + " warnings, " + Integer.toString(info) + " notes");
|
dst.println((error == 0 ? "Success" : "*FAILURE*") + ": " + Integer.toString(error) + " errors, " + Integer.toString(warn) + " warnings, " + Integer.toString(info) + " notes");
|
||||||
for (OperationOutcome.OperationOutcomeIssueComponent issue : oo.getIssue()) {
|
for (OperationOutcome.OperationOutcomeIssueComponent issue : oo.getIssue()) {
|
||||||
dst.println(getIssueSummary(issue)+renderMessageId(issue));
|
dst.println(getIssueSummary(issue)+renderMessageId(issue));
|
||||||
ValidationMessage vm = (ValidationMessage) issue.getUserData("source.msg");
|
ValidationMessage vm = (ValidationMessage) issue.getUserData(UserDataNames.validator_source_msg);
|
||||||
if (vm != null && vm.sliceText != null && (crumbTrails || vm.isCriticalSignpost())) {
|
if (vm != null && vm.sliceText != null && (crumbTrails || vm.isCriticalSignpost())) {
|
||||||
for (String s : vm.sliceText) {
|
for (String s : vm.sliceText) {
|
||||||
dst.println(" slice info: "+s);
|
dst.println(" slice info: "+s);
|
||||||
|
|
|
@ -5,14 +5,15 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyOperation;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyOperation;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidationRules;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidationRules;
|
||||||
|
|
||||||
public class BCP47Checker extends CodeSystemChecker {
|
public class BCP47Checker extends CodeSystemChecker {
|
||||||
|
|
||||||
public BCP47Checker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
public BCP47Checker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.model.CodeSystem.CodeSystemFilterComponent;
|
import org.hl7.fhir.r5.model.CodeSystem.CodeSystemFilterComponent;
|
||||||
import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent;
|
import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType;
|
||||||
|
@ -15,8 +16,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio
|
||||||
|
|
||||||
public class CPTChecker extends CodeSystemChecker {
|
public class CPTChecker extends CodeSystemChecker {
|
||||||
|
|
||||||
public CPTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
public CPTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.hl7.fhir.r5.model.CodeSystem.CodeSystemFilterComponent;
|
||||||
import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent;
|
import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent;
|
||||||
import org.hl7.fhir.r5.model.Enumerations.FilterOperator;
|
import org.hl7.fhir.r5.model.Enumerations.FilterOperator;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
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.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
||||||
|
@ -21,8 +22,8 @@ public class CodeSystemBasedChecker extends CodeSystemChecker {
|
||||||
|
|
||||||
private CodeSystem cs;
|
private CodeSystem cs;
|
||||||
|
|
||||||
public CodeSystemBasedChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, CodeSystem cs) {
|
public CodeSystemBasedChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, CodeSystem cs, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
this.cs = cs;
|
this.cs = cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import java.util.List;
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
|
@ -23,8 +24,8 @@ public abstract class CodeSystemChecker extends BaseValidator {
|
||||||
private boolean hasDisplay = false;
|
private boolean hasDisplay = false;
|
||||||
protected List<ValidationMessage> errors;
|
protected List<ValidationMessage> errors;
|
||||||
|
|
||||||
protected CodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
protected CodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug);
|
super(context, xverManager, debug, session);
|
||||||
this.errors = errors;
|
this.errors = errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.hl7.fhir.r5.model.CodeableConcept;
|
||||||
import org.hl7.fhir.r5.model.Coding;
|
import org.hl7.fhir.r5.model.Coding;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest;
|
import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
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;
|
||||||
|
@ -33,8 +34,8 @@ public class CodingsObserver extends BaseValidator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public CodingsObserver(@Nonnull IWorkerContext context, @Nonnull XVerExtensionManager xverManager, boolean debug) {
|
public CodingsObserver(@Nonnull IWorkerContext context, @Nonnull XVerExtensionManager xverManager, boolean debug, ValidatorSession session) {
|
||||||
super(context, xverManager, debug);
|
super(context, xverManager, debug, session);
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,12 +4,13 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
|
|
||||||
public class GeneralCodeSystemChecker extends CodeSystemChecker {
|
public class GeneralCodeSystemChecker extends CodeSystemChecker {
|
||||||
|
|
||||||
public GeneralCodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
public GeneralCodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
// TODO Auto-generated constructor stub
|
// TODO Auto-generated constructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
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.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
||||||
|
@ -14,8 +15,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio
|
||||||
|
|
||||||
public class LoincChecker extends CodeSystemChecker {
|
public class LoincChecker extends CodeSystemChecker {
|
||||||
|
|
||||||
public LoincChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
public LoincChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType;
|
||||||
|
@ -13,8 +14,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio
|
||||||
|
|
||||||
public class RxNormChecker extends CodeSystemChecker {
|
public class RxNormChecker extends CodeSystemChecker {
|
||||||
|
|
||||||
public RxNormChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
public RxNormChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import java.util.List;
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.elementmodel.Element;
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
|
@ -23,8 +24,8 @@ public class SnomedCTChecker extends CodeSystemChecker {
|
||||||
private boolean hasTag = false;
|
private boolean hasTag = false;
|
||||||
private List<String> tags = new ArrayList<>();
|
private List<String> tags = new ArrayList<>();
|
||||||
|
|
||||||
public SnomedCTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
public SnomedCTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkConcept(String code, String display) {
|
public void checkConcept(String code, String display) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType;
|
||||||
|
@ -13,8 +14,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio
|
||||||
|
|
||||||
public class UcumChecker extends CodeSystemChecker {
|
public class UcumChecker extends CodeSystemChecker {
|
||||||
|
|
||||||
public UcumChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
|
public UcumChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
|
||||||
super(context, xverManager, debug, errors);
|
super(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,7 @@ import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.BuildExtensions;
|
import org.hl7.fhir.r5.utils.BuildExtensions;
|
||||||
import org.hl7.fhir.r5.utils.ResourceUtilities;
|
import org.hl7.fhir.r5.utils.ResourceUtilities;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus;
|
||||||
import org.hl7.fhir.r5.utils.sql.Validator;
|
import org.hl7.fhir.r5.utils.sql.Validator;
|
||||||
|
@ -171,6 +172,7 @@ import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor.CodedContentVal
|
||||||
import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor.ElementValidationAction;
|
import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor.ElementValidationAction;
|
||||||
import org.hl7.fhir.r5.utils.validation.IValidationProfileUsageTracker;
|
import org.hl7.fhir.r5.utils.validation.IValidationProfileUsageTracker;
|
||||||
import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher;
|
import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.BindingKind;
|
import org.hl7.fhir.r5.utils.validation.constants.BindingKind;
|
||||||
import org.hl7.fhir.r5.utils.validation.constants.CheckDisplayOption;
|
import org.hl7.fhir.r5.utils.validation.constants.CheckDisplayOption;
|
||||||
|
@ -216,6 +218,7 @@ import org.hl7.fhir.validation.instance.type.StructureMapValidator;
|
||||||
import org.hl7.fhir.validation.instance.type.StructureMapValidator.VariableDefn;
|
import org.hl7.fhir.validation.instance.type.StructureMapValidator.VariableDefn;
|
||||||
import org.hl7.fhir.validation.instance.type.StructureMapValidator.VariableSet;
|
import org.hl7.fhir.validation.instance.type.StructureMapValidator.VariableSet;
|
||||||
import org.hl7.fhir.validation.instance.type.ValueSetValidator;
|
import org.hl7.fhir.validation.instance.type.ValueSetValidator;
|
||||||
|
import org.hl7.fhir.validation.instance.type.ViewDefinitionValidator;
|
||||||
import org.hl7.fhir.validation.instance.utils.Base64Util;
|
import org.hl7.fhir.validation.instance.utils.Base64Util;
|
||||||
import org.hl7.fhir.validation.instance.utils.CanonicalResourceLookupResult;
|
import org.hl7.fhir.validation.instance.utils.CanonicalResourceLookupResult;
|
||||||
import org.hl7.fhir.validation.instance.utils.CanonicalTypeSorter;
|
import org.hl7.fhir.validation.instance.utils.CanonicalTypeSorter;
|
||||||
|
@ -442,8 +445,8 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
public Base resolveReference(FHIRPathEngine engine, Object appContext, String url, Base refContext) throws FHIRException {
|
public Base resolveReference(FHIRPathEngine engine, Object appContext, String url, Base refContext) throws FHIRException {
|
||||||
ValidationContext c = (ValidationContext) appContext;
|
ValidationContext c = (ValidationContext) appContext;
|
||||||
|
|
||||||
if (refContext != null && refContext.hasUserData("validator.bundle.resolution")) {
|
if (refContext != null && refContext.hasUserData(UserDataNames.validator_bundle_resolution)) {
|
||||||
return (Base) refContext.getUserData("validator.bundle.resolution");
|
return (Base) refContext.getUserData(UserDataNames.validator_bundle_resolution);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c.getAppContext() instanceof Element) {
|
if (c.getAppContext() instanceof Element) {
|
||||||
|
@ -616,8 +619,8 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
private boolean unknownCodeSystemsCauseErrors;
|
private boolean unknownCodeSystemsCauseErrors;
|
||||||
private boolean noExperimentalContent;
|
private boolean noExperimentalContent;
|
||||||
|
|
||||||
public InstanceValidator(@Nonnull IWorkerContext theContext, @Nonnull IEvaluationContext hostServices, @Nonnull XVerExtensionManager xverManager) {
|
public InstanceValidator(@Nonnull IWorkerContext theContext, @Nonnull IEvaluationContext hostServices, @Nonnull XVerExtensionManager xverManager, ValidatorSession session) {
|
||||||
super(theContext, xverManager, false);
|
super(theContext, xverManager, false, session);
|
||||||
start = System.currentTimeMillis();
|
start = System.currentTimeMillis();
|
||||||
this.externalHostServices = hostServices;
|
this.externalHostServices = hostServices;
|
||||||
this.profileUtilities = new ProfileUtilities(theContext, null, null);
|
this.profileUtilities = new ProfileUtilities(theContext, null, null);
|
||||||
|
@ -630,7 +633,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
source = Source.InstanceValidator;
|
source = Source.InstanceValidator;
|
||||||
fpe.setDoNotEnforceAsSingletonRule(!VersionUtilities.isR5VerOrLater(theContext.getVersion()));
|
fpe.setDoNotEnforceAsSingletonRule(!VersionUtilities.isR5VerOrLater(theContext.getVersion()));
|
||||||
fpe.setAllowDoubleQuotes(allowDoubleQuotesInFHIRPath);
|
fpe.setAllowDoubleQuotes(allowDoubleQuotesInFHIRPath);
|
||||||
codingObserver = new CodingsObserver(theContext, xverManager, debug);
|
codingObserver = new CodingsObserver(theContext, xverManager, debug, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1023,9 +1026,9 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
|| (element.getName().equals("id") && !element.getPath().substring(0, element.getPath().length()-3).contains("."))
|
|| (element.getName().equals("id") && !element.getPath().substring(0, element.getPath().length()-3).contains("."))
|
||||||
|| (element.getName().equals("text") && !element.getPath().substring(0, element.getPath().length()-5).contains(".")))
|
|| (element.getName().equals("text") && !element.getPath().substring(0, element.getPath().length()-5).contains(".")))
|
||||||
return;
|
return;
|
||||||
String hasFixed = element.getUserString("hasFixed");
|
String hasFixed = element.getUserString(UserDataNames.keyview_hasFixed);
|
||||||
if (element.getPath().contains(".") && (hasFixed== null || !hasFixed.equals("Y"))) {
|
if (element.getPath().contains(".") && (hasFixed== null || !hasFixed.equals("Y"))) {
|
||||||
String elementUsage = element.getUserString("elementSupported");
|
String elementUsage = element.getUserString(UserDataNames.keyview_elementSupported);
|
||||||
hint(errors, NO_RULE_DATE, IssueType.INFORMATIONAL, element.line(), element.col(), stack.getLiteralPath(), elementUsage != null && (elementUsage.equals("Y") || elementUsage.equals("NA")), I18nConstants.MUSTSUPPORT_VAL_MUSTSUPPORT, element.getName(), element.getProperty().getStructure().getVersionedUrl());
|
hint(errors, NO_RULE_DATE, IssueType.INFORMATIONAL, element.line(), element.col(), stack.getLiteralPath(), elementUsage != null && (elementUsage.equals("Y") || elementUsage.equals("NA")), I18nConstants.MUSTSUPPORT_VAL_MUSTSUPPORT, element.getName(), element.getProperty().getStructure().getVersionedUrl());
|
||||||
if (elementUsage==null || !elementUsage.equals("Y"))
|
if (elementUsage==null || !elementUsage.equals("Y"))
|
||||||
return;
|
return;
|
||||||
|
@ -5112,7 +5115,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (!slicer.getSlicing().hasDiscriminator())
|
if (!slicer.getSlicing().hasDiscriminator())
|
||||||
return false; // cannot validate in this case
|
return false; // cannot validate in this case
|
||||||
|
|
||||||
ExpressionNode n = (ExpressionNode) ed.getUserData("slice.expression.cache");
|
ExpressionNode n = (ExpressionNode) ed.getUserData(UserDataNames.validator_slice_expression_cache);
|
||||||
if (n == null) {
|
if (n == null) {
|
||||||
long t = System.nanoTime();
|
long t = System.nanoTime();
|
||||||
// GG: this approach is flawed because it treats discriminators individually rather than collectively
|
// GG: this approach is flawed because it treats discriminators individually rather than collectively
|
||||||
|
@ -5230,7 +5233,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.PROBLEM_PROCESSING_EXPRESSION__IN_PROFILE__PATH__, expression, profile.getVersionedUrl(), path, e.getMessage()));
|
throw new FHIRException(context.formatMessage(I18nConstants.PROBLEM_PROCESSING_EXPRESSION__IN_PROFILE__PATH__, expression, profile.getVersionedUrl(), path, e.getMessage()));
|
||||||
}
|
}
|
||||||
timeTracker.fpe(t);
|
timeTracker.fpe(t);
|
||||||
ed.setUserData("slice.expression.cache", n);
|
ed.setUserData(UserDataNames.validator_slice_expression_cache, n);
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5780,8 +5783,8 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
// }
|
// }
|
||||||
|
|
||||||
private void resolveBundleReferences(Element element, List<Element> bundles) {
|
private void resolveBundleReferences(Element element, List<Element> bundles) {
|
||||||
if (!element.hasUserData("validator.bundle.resolved")) {
|
if (!element.hasUserData(UserDataNames.validator_bundle_resolved)) {
|
||||||
element.setUserData("validator.bundle.resolved", true);
|
element.setUserData(UserDataNames.validator_bundle_resolved, true);
|
||||||
List<Element> list = new ArrayList<Element>();
|
List<Element> list = new ArrayList<Element>();
|
||||||
list.addAll(bundles);
|
list.addAll(bundles);
|
||||||
list.add(0, element);
|
list.add(0, element);
|
||||||
|
@ -5814,7 +5817,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
List<Element> entries = bundle.getChildren(ENTRY);
|
List<Element> entries = bundle.getChildren(ENTRY);
|
||||||
Element tgt = resolveInBundle(bundle, entries, ref, fu, resource.fhirType(), resource.getIdBase(), null, null, null, element, false, false);
|
Element tgt = resolveInBundle(bundle, entries, ref, fu, resource.fhirType(), resource.getIdBase(), null, null, null, element, false, false);
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
element.setUserData("validator.bundle.resolution", tgt.getNamedChild(RESOURCE, false));
|
element.setUserData(UserDataNames.validator_bundle_resolution, tgt.getNamedChild(RESOURCE, false));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5943,8 +5946,10 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
return new StructureMapValidator(this, fpe, profileUtilities).validateStructureMap(valContext, errors, element, stack) && ok;
|
return new StructureMapValidator(this, fpe, profileUtilities).validateStructureMap(valContext, errors, element, stack) && ok;
|
||||||
} else if (element.getType().equals("ValueSet")) {
|
} else if (element.getType().equals("ValueSet")) {
|
||||||
return new ValueSetValidator(this).validateValueSet(valContext, errors, element, stack) && ok;
|
return new ValueSetValidator(this).validateValueSet(valContext, errors, element, stack) && ok;
|
||||||
|
} else if (element.getType().equals("ViewDefinition")) {
|
||||||
|
return new ViewDefinitionValidator(this).validateViewDefinition(valContext, errors, element, stack) && ok;
|
||||||
} else if (element.getType().equals("ImplementationGuide")) {
|
} else if (element.getType().equals("ImplementationGuide")) {
|
||||||
return new ImplementationGuideValidator(this.context, xverManager, debug).validateImplementationGuide(valContext, errors, element, stack) && ok;
|
return new ImplementationGuideValidator(this.context, xverManager, debug, session).validateImplementationGuide(valContext, errors, element, stack) && ok;
|
||||||
} else if ("http://hl7.org/fhir/uv/sql-on-fhir/StructureDefinition/ViewDefinition".equals(element.getProperty().getStructure().getUrl())) {
|
} else if ("http://hl7.org/fhir/uv/sql-on-fhir/StructureDefinition/ViewDefinition".equals(element.getProperty().getStructure().getUrl())) {
|
||||||
if (element.getNativeObject() != null && element.getNativeObject() instanceof JsonObject) {
|
if (element.getNativeObject() != null && element.getNativeObject() instanceof JsonObject) {
|
||||||
JsonObject json = (JsonObject) element.getNativeObject();
|
JsonObject json = (JsonObject) element.getNativeObject();
|
||||||
|
@ -6921,7 +6926,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkMustSupport(StructureDefinition profile, ElementInfo ei) {
|
public void checkMustSupport(StructureDefinition profile, ElementInfo ei) {
|
||||||
String usesMustSupport = profile.getUserString("usesMustSupport");
|
String usesMustSupport = profile.getUserString(UserDataNames.keyview_usesMustSupport);
|
||||||
if (usesMustSupport == null) {
|
if (usesMustSupport == null) {
|
||||||
usesMustSupport = "N";
|
usesMustSupport = "N";
|
||||||
for (ElementDefinition pe : profile.getSnapshot().getElement()) {
|
for (ElementDefinition pe : profile.getSnapshot().getElement()) {
|
||||||
|
@ -6930,18 +6935,18 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
profile.setUserData("usesMustSupport", usesMustSupport);
|
profile.setUserData(UserDataNames.keyview_usesMustSupport, usesMustSupport);
|
||||||
}
|
}
|
||||||
String elementSupported = ei.getElement().getUserString("elementSupported");
|
String elementSupported = ei.getElement().getUserString(UserDataNames.keyview_elementSupported);
|
||||||
String fixedValue = ei.getElement().getUserString("hasFixed");
|
String fixedValue = ei.getElement().getUserString(UserDataNames.keyview_hasFixed);
|
||||||
if ((elementSupported == null || !elementSupported.equals("Y")) && ei.definition.getMustSupport()) {
|
if ((elementSupported == null || !elementSupported.equals("Y")) && ei.definition.getMustSupport()) {
|
||||||
if (ei.definition.getMustSupport()) {
|
if (ei.definition.getMustSupport()) {
|
||||||
ei.getElement().setUserData("elementSupported", "Y");
|
ei.getElement().setUserData(UserDataNames.keyview_elementSupported, "Y");
|
||||||
}
|
}
|
||||||
} else if (elementSupported == null && !usesMustSupport.equals("Y"))
|
} else if (elementSupported == null && !usesMustSupport.equals("Y"))
|
||||||
ei.getElement().setUserData("elementSupported", "NA");
|
ei.getElement().setUserData(UserDataNames.keyview_elementSupported, "NA");
|
||||||
if (fixedValue==null && (ei.definition.hasFixed() || ei.definition.hasPattern()))
|
if (fixedValue==null && (ei.definition.hasFixed() || ei.definition.hasPattern()))
|
||||||
ei.getElement().setUserData("hasFixed", "Y");
|
ei.getElement().setUserData(UserDataNames.keyview_hasFixed, "Y");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean checkCardinalities(List<ValidationMessage> errors, StructureDefinition profile, Element element, NodeStack stack,
|
public boolean checkCardinalities(List<ValidationMessage> errors, StructureDefinition profile, Element element, NodeStack stack,
|
||||||
|
@ -7352,7 +7357,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if ("dom-3".equals(inv.getKey())) {
|
if ("dom-3".equals(inv.getKey())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
ExpressionNode n = (ExpressionNode) inv.getUserData("validator.expression.cache");
|
ExpressionNode n = (ExpressionNode) inv.getUserData(UserDataNames.validator_expression_cache);
|
||||||
if (n == null) {
|
if (n == null) {
|
||||||
long t = System.nanoTime();
|
long t = System.nanoTime();
|
||||||
try {
|
try {
|
||||||
|
@ -7363,7 +7368,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
timeTracker.fpe(t);
|
timeTracker.fpe(t);
|
||||||
inv.setUserData("validator.expression.cache", n);
|
inv.setUserData(UserDataNames.validator_expression_cache, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
valContext.setProfile(profile);
|
valContext.setProfile(profile);
|
||||||
|
@ -7665,10 +7670,10 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
for (ElementDefinitionConstraintComponent inv : ed.getConstraint()) {
|
for (ElementDefinitionConstraintComponent inv : ed.getConstraint()) {
|
||||||
if (inv.hasExpression()) {
|
if (inv.hasExpression()) {
|
||||||
try {
|
try {
|
||||||
ExpressionNode n = (ExpressionNode) inv.getUserData("validator.expression.cache");
|
ExpressionNode n = (ExpressionNode) inv.getUserData(UserDataNames.validator_expression_cache);
|
||||||
if (n == null) {
|
if (n == null) {
|
||||||
n = fpe.parse(FHIRPathExpressionFixer.fixExpr(inv.getExpression(), inv.getKey(), context.getVersion()));
|
n = fpe.parse(FHIRPathExpressionFixer.fixExpr(inv.getExpression(), inv.getKey(), context.getVersion()));
|
||||||
inv.setUserData("validator.expression.cache", n);
|
inv.setUserData(UserDataNames.validator_expression_cache, n);
|
||||||
}
|
}
|
||||||
fpe.check(null, sd.getKind() == StructureDefinitionKind.RESOURCE ? sd.getType() : "DomainResource", ed.getPath(), n);
|
fpe.check(null, sd.getKind() == StructureDefinitionKind.RESOURCE ? sd.getType() : "DomainResource", ed.getPath(), n);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -37,17 +37,18 @@ import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.context.SimpleWorkerContext.IValidatorFactory;
|
import org.hl7.fhir.r5.context.SimpleWorkerContext.IValidatorFactory;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
|
|
||||||
public class InstanceValidatorFactory implements IValidatorFactory {
|
public class InstanceValidatorFactory implements IValidatorFactory {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IResourceValidator makeValidator(IWorkerContext ctxt, XVerExtensionManager xverManager) throws FHIRException {
|
public IResourceValidator makeValidator(IWorkerContext ctxt, XVerExtensionManager xverManager, ValidatorSession session) throws FHIRException {
|
||||||
return new InstanceValidator(ctxt, null, xverManager);
|
return new InstanceValidator(ctxt, null, xverManager, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IResourceValidator makeValidator(IWorkerContext ctxt) throws FHIRException {
|
public IResourceValidator makeValidator(IWorkerContext ctxt, ValidatorSession session) throws FHIRException {
|
||||||
return new InstanceValidator(ctxt, null, null);
|
return new InstanceValidator(ctxt, null, null, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -75,7 +75,6 @@ public class BundleValidator extends BaseValidator {
|
||||||
|
|
||||||
public boolean validateBundle(List<ValidationMessage> errors, Element bundle, NodeStack stack, boolean checkSpecials, ValidationContext hostContext, PercentageTracker pct, ValidationMode mode) {
|
public boolean validateBundle(List<ValidationMessage> errors, Element bundle, NodeStack stack, boolean checkSpecials, ValidationContext hostContext, PercentageTracker pct, ValidationMode mode) {
|
||||||
boolean ok = true;
|
boolean ok = true;
|
||||||
sessionId = Utilities.makeUuidLC();
|
|
||||||
|
|
||||||
String type = bundle.getNamedChildValue(TYPE, false);
|
String type = bundle.getNamedChildValue(TYPE, false);
|
||||||
type = StringUtils.defaultString(type);
|
type = StringUtils.defaultString(type);
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
|
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.ValidationContextResourceProxy;
|
import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.ValidationContextResourceProxy;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.FhirPublication;
|
import org.hl7.fhir.utilities.FhirPublication;
|
||||||
|
@ -53,8 +54,8 @@ import ca.uhn.fhir.util.ObjectUtil;
|
||||||
|
|
||||||
public class ImplementationGuideValidator extends BaseValidator {
|
public class ImplementationGuideValidator extends BaseValidator {
|
||||||
|
|
||||||
public ImplementationGuideValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug) {
|
public ImplementationGuideValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, ValidatorSession session) {
|
||||||
super(context, xverManager, debug);
|
super(context, xverManager, debug, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validateImplementationGuide(ValidationContext valContext, List<ValidationMessage> errors, Element ig, NodeStack stack) {
|
public boolean validateImplementationGuide(ValidationContext valContext, List<ValidationMessage> errors, Element ig, NodeStack stack) {
|
||||||
|
|
|
@ -44,6 +44,7 @@ import org.hl7.fhir.r5.model.ValueSet;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass;
|
import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass;
|
||||||
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
import org.hl7.fhir.r5.terminologies.utilities.ValidationResult;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.FhirPublication;
|
import org.hl7.fhir.utilities.FhirPublication;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
@ -98,7 +99,7 @@ public class StructureDefinitionValidator extends BaseValidator {
|
||||||
ok = rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), bok, I18nConstants.SD_CONSTRAINED_KIND_NO_MATCH, sd.getKind().toCode(), base.getKind().toCode(), base.getType(), base.getUrl()) && ok;
|
ok = rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), bok, I18nConstants.SD_CONSTRAINED_KIND_NO_MATCH, sd.getKind().toCode(), base.getKind().toCode(), base.getType(), base.getUrl()) && ok;
|
||||||
if (sd.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
if (sd.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
||||||
ok = rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), sd.hasType() && sd.getType().equals(base.getType()), I18nConstants.SD_CONSTRAINED_TYPE_NO_MATCH, sd.getType(), base.getType()) && ok;
|
ok = rule(errors, "2022-11-02", IssueType.NOTFOUND, stack.getLiteralPath(), sd.hasType() && sd.getType().equals(base.getType()), I18nConstants.SD_CONSTRAINED_TYPE_NO_MATCH, sd.getType(), base.getType()) && ok;
|
||||||
if (!src.hasUserData("profileutils.snapshot.errors")) { // if it does, we've already logged these errors elsewhere
|
if (!src.hasUserData(UserDataNames.SNAPSHOT_ERRORS)) { // if it does, we've already logged these errors elsewhere
|
||||||
List<ValidationMessage> msgs = new ArrayList<>();
|
List<ValidationMessage> msgs = new ArrayList<>();
|
||||||
ProfileUtilities pu = new ProfileUtilities(context, msgs, null);
|
ProfileUtilities pu = new ProfileUtilities(context, msgs, null);
|
||||||
pu.setForPublication(forPublication);
|
pu.setForPublication(forPublication);
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
||||||
import org.hl7.fhir.r5.terminologies.ConceptMapUtilities;
|
import org.hl7.fhir.r5.terminologies.ConceptMapUtilities;
|
||||||
import org.hl7.fhir.r5.terminologies.ValueSetUtilities;
|
import org.hl7.fhir.r5.terminologies.ValueSetUtilities;
|
||||||
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
import org.hl7.fhir.r5.utils.structuremap.ResolvedGroup;
|
import org.hl7.fhir.r5.utils.structuremap.ResolvedGroup;
|
||||||
import org.hl7.fhir.r5.utils.structuremap.StructureMapUtilities;
|
import org.hl7.fhir.r5.utils.structuremap.StructureMapUtilities;
|
||||||
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
import org.hl7.fhir.r5.utils.validation.IResourceValidator;
|
||||||
|
@ -355,9 +356,9 @@ public class StructureMapValidator extends BaseValidator {
|
||||||
fired = false;
|
fired = false;
|
||||||
cc = 0;
|
cc = 0;
|
||||||
for (Element group : groups) {
|
for (Element group : groups) {
|
||||||
if (!group.hasUserData("structuremap.validated")) {
|
if (!group.hasUserData(UserDataNames.map_validated)) {
|
||||||
if (hasInputTypes(group) || group.hasUserData("structuremap.parameters")) {
|
if (hasInputTypes(group) || group.hasUserData(UserDataNames.map_parameters)) {
|
||||||
group.setUserData("structuremap.validated", true);
|
group.setUserData(UserDataNames.map_validated, true);
|
||||||
fired = true;
|
fired = true;
|
||||||
ok = validateGroup(valContext, errors, src, group, stack.push(group, cc, null, null), grpNames) && ok;
|
ok = validateGroup(valContext, errors, src, group, stack.push(group, cc, null, null), grpNames) && ok;
|
||||||
}
|
}
|
||||||
|
@ -368,7 +369,7 @@ public class StructureMapValidator extends BaseValidator {
|
||||||
|
|
||||||
cc = 0;
|
cc = 0;
|
||||||
for (Element group : groups) {
|
for (Element group : groups) {
|
||||||
if (!group.hasUserData("structuremap.validated")) {
|
if (!group.hasUserData(UserDataNames.map_validated)) {
|
||||||
hint(errors, "2023-03-01", IssueType.INFORMATIONAL, group.line(), group.col(), stack.push(group, cc, null, null).getLiteralPath(), ok, I18nConstants.SM_ORPHAN_GROUP, group.getChildValue("name"));
|
hint(errors, "2023-03-01", IssueType.INFORMATIONAL, group.line(), group.col(), stack.push(group, cc, null, null).getLiteralPath(), ok, I18nConstants.SM_ORPHAN_GROUP, group.getChildValue("name"));
|
||||||
ok = validateGroup(valContext, errors, src, group, stack.push(group, cc, null, null), grpNames) && ok;
|
ok = validateGroup(valContext, errors, src, group, stack.push(group, cc, null, null), grpNames) && ok;
|
||||||
}
|
}
|
||||||
|
@ -421,7 +422,7 @@ public class StructureMapValidator extends BaseValidator {
|
||||||
}
|
}
|
||||||
|
|
||||||
VariableSet variables = new VariableSet();
|
VariableSet variables = new VariableSet();
|
||||||
VariableSet pvars = (VariableSet) group.getUserData("structuremap.parameters");
|
VariableSet pvars = (VariableSet) group.getUserData(UserDataNames.map_parameters);
|
||||||
|
|
||||||
// first, load all the inputs
|
// first, load all the inputs
|
||||||
List<Element> inputs = group.getChildrenByName("input");
|
List<Element> inputs = group.getChildrenByName("input");
|
||||||
|
@ -466,7 +467,7 @@ public class StructureMapValidator extends BaseValidator {
|
||||||
|
|
||||||
private StructureMapGroupComponent makeGroupComponent(Element group) {
|
private StructureMapGroupComponent makeGroupComponent(Element group) {
|
||||||
StructureMapGroupComponent grp = new StructureMapGroupComponent();
|
StructureMapGroupComponent grp = new StructureMapGroupComponent();
|
||||||
grp.setUserData("element.source", group);
|
grp.setUserData(UserDataNames.map_source, group);
|
||||||
grp.setName(group.getChildValue("name"));
|
grp.setName(group.getChildValue("name"));
|
||||||
List<Element> inputs = group.getChildrenByName("input");
|
List<Element> inputs = group.getChildrenByName("input");
|
||||||
for (Element input : inputs) {
|
for (Element input : inputs) {
|
||||||
|
@ -1274,13 +1275,13 @@ public class StructureMapValidator extends BaseValidator {
|
||||||
}
|
}
|
||||||
cc++;
|
cc++;
|
||||||
}
|
}
|
||||||
if (ok && grp.getTargetGroup().hasUserData("element.source")) {
|
if (ok && grp.getTargetGroup().hasUserData(UserDataNames.map_source)) {
|
||||||
Element g = (Element) grp.getTargetGroup().getUserData("element.source");
|
Element g = (Element) grp.getTargetGroup().getUserData(UserDataNames.map_source);
|
||||||
if (g.hasUserData("structuremap.parameters")) {
|
if (g.hasUserData(UserDataNames.map_parameters)) {
|
||||||
VariableSet pvars = (VariableSet) g.getUserData("structuremap.parameters");
|
VariableSet pvars = (VariableSet) g.getUserData(UserDataNames.map_parameters);
|
||||||
warning(errors, "2023-03-01", IssueType.INVALID, dependent.line(), dependent.col(), stack.getLiteralPath(), pvars.matches(lvars), I18nConstants.SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE, grp.getTargetGroup().getName(), pvars.summary(), lvars.summary());
|
warning(errors, "2023-03-01", IssueType.INVALID, dependent.line(), dependent.col(), stack.getLiteralPath(), pvars.matches(lvars), I18nConstants.SM_DEPENDENT_PARAM_TYPE_MISMATCH_DUPLICATE, grp.getTargetGroup().getName(), pvars.summary(), lvars.summary());
|
||||||
} else {
|
} else {
|
||||||
g.setUserData("structuremap.parameters", lvars);
|
g.setUserData(UserDataNames.map_parameters, lvars);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,21 +132,21 @@ public class ValueSetValidator extends BaseValidator {
|
||||||
|
|
||||||
private CodeSystemChecker getSystemValidator(String system, List<ValidationMessage> errors) {
|
private CodeSystemChecker getSystemValidator(String system, List<ValidationMessage> errors) {
|
||||||
if (system == null) {
|
if (system == null) {
|
||||||
return new GeneralCodeSystemChecker(context, xverManager, debug, errors);
|
return new GeneralCodeSystemChecker(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
switch (system) {
|
switch (system) {
|
||||||
case "http://snomed.info/sct" :return new SnomedCTChecker(context, xverManager, debug, errors);
|
case "http://snomed.info/sct" :return new SnomedCTChecker(context, xverManager, debug, errors, session);
|
||||||
case "http://loinc.org": return new LoincChecker(context, xverManager, debug, errors);
|
case "http://loinc.org": return new LoincChecker(context, xverManager, debug, errors, session);
|
||||||
case "http://www.nlm.nih.gov/research/umls/rxnorm": return new RxNormChecker(context, xverManager, debug, errors);
|
case "http://www.nlm.nih.gov/research/umls/rxnorm": return new RxNormChecker(context, xverManager, debug, errors, session);
|
||||||
case "http://unitsofmeasure.org": return new UcumChecker(context, xverManager, debug, errors);
|
case "http://unitsofmeasure.org": return new UcumChecker(context, xverManager, debug, errors, session);
|
||||||
case "http://www.ama-assn.org/go/cpt": return new CPTChecker(context, xverManager, debug, errors);
|
case "http://www.ama-assn.org/go/cpt": return new CPTChecker(context, xverManager, debug, errors, session);
|
||||||
case "urn:ietf:bcp:47": return new BCP47Checker(context, xverManager, debug, errors);
|
case "urn:ietf:bcp:47": return new BCP47Checker(context, xverManager, debug, errors, session);
|
||||||
default:
|
default:
|
||||||
CodeSystem cs = context.fetchCodeSystem(system);
|
CodeSystem cs = context.fetchCodeSystem(system);
|
||||||
if (cs != null) {
|
if (cs != null) {
|
||||||
return new CodeSystemBasedChecker(context, xverManager, debug, errors, cs);
|
return new CodeSystemBasedChecker(context, xverManager, debug, errors, cs, session);
|
||||||
} else {
|
} else {
|
||||||
return new GeneralCodeSystemChecker(context, xverManager, debug, errors);
|
return new GeneralCodeSystemChecker(context, xverManager, debug, errors, session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,531 @@
|
||||||
|
package org.hl7.fhir.validation.instance.type;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
|
import org.hl7.fhir.r5.context.SimpleWorkerContext;
|
||||||
|
import org.hl7.fhir.r5.elementmodel.Element;
|
||||||
|
import org.hl7.fhir.r5.fhirpath.ExpressionNode;
|
||||||
|
import org.hl7.fhir.r5.fhirpath.ExpressionNode.CollectionStatus;
|
||||||
|
import org.hl7.fhir.r5.fhirpath.FHIRPathEngine;
|
||||||
|
import org.hl7.fhir.r5.fhirpath.FHIRPathEngine.IssueMessage;
|
||||||
|
import org.hl7.fhir.r5.fhirpath.TypeDetails;
|
||||||
|
import org.hl7.fhir.r5.utils.UserDataNames;
|
||||||
|
import org.hl7.fhir.r5.utils.sql.Column;
|
||||||
|
import org.hl7.fhir.r5.utils.sql.ColumnKind;
|
||||||
|
import org.hl7.fhir.r5.utils.sql.Runner;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
|
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
|
||||||
|
import org.hl7.fhir.utilities.npm.NpmPackage;
|
||||||
|
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||||
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||||
|
import org.hl7.fhir.validation.BaseValidator;
|
||||||
|
import org.hl7.fhir.validation.instance.utils.NodeStack;
|
||||||
|
import org.hl7.fhir.validation.instance.utils.ValidationContext;
|
||||||
|
|
||||||
|
// see also org.hl7.fhir.r5.utils.sql.Validator
|
||||||
|
public class ViewDefinitionValidator extends BaseValidator {
|
||||||
|
|
||||||
|
private static class VersionEvaluationContext {
|
||||||
|
private IWorkerContext context;
|
||||||
|
private Runner runner;
|
||||||
|
private FHIRPathEngine fpe;
|
||||||
|
public VersionEvaluationContext(IWorkerContext context) {
|
||||||
|
this.context = context;
|
||||||
|
runner = new Runner();
|
||||||
|
runner.setContext(context);
|
||||||
|
|
||||||
|
fpe = new FHIRPathEngine(context); // we need our own customised one
|
||||||
|
fpe.setHostServices(runner);
|
||||||
|
fpe.setEmitSQLonFHIRWarning(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ViewDefinitionValidator(BaseValidator parent) {
|
||||||
|
super(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean validateViewDefinition(ValidationContext hostContext, List<ValidationMessage> errors, Element vd, NodeStack stack) throws FHIRException {
|
||||||
|
boolean ok = true;
|
||||||
|
if (warning(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, vd.hasChild("name"), I18nConstants.VIEWDEFINITION_SHOULD_HAVE_NAME)) {
|
||||||
|
warning(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, isValidName(vd.getNamedChildValue("name")), I18nConstants.VIEWDEFINITION_NAME_INVALID, "view", vd.getNamedChildValue("name"));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Column> columns = new ArrayList<>();
|
||||||
|
vd.setUserData(UserDataNames.db_columns, columns);
|
||||||
|
|
||||||
|
List<VersionEvaluationContext> versions = new ArrayList<>();
|
||||||
|
if (vd.hasChildren("fhirVersion")) {
|
||||||
|
for (Element v : vd.getChildren("fhirVersion")) {
|
||||||
|
String ver = v.primitiveValue();
|
||||||
|
if (ver.equals(context.getVersion())) {
|
||||||
|
makeDefaultContext(versions);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
makeVersionSpecificContext(versions, ver);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new FHIRException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
makeDefaultContext(versions);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean first = true;
|
||||||
|
for (VersionEvaluationContext vec : versions) {
|
||||||
|
String vdesc = versions.size() == 1 ? "" : " for version "+VersionUtilities.getNameForVersion(vec.context.getVersion());
|
||||||
|
|
||||||
|
String resourceName = vd.getNamedChildValue("resource");
|
||||||
|
if (resourceName != null) {
|
||||||
|
if (rule(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, context.getResourceNamesAsSet().contains(resourceName), I18nConstants.VIEWDEFINITION_UNKNOWN_RESOURCE, resourceName)) {
|
||||||
|
int i = 0;
|
||||||
|
if (first) {
|
||||||
|
for (Element constant : vd.getChildren("constant")) {
|
||||||
|
ok = checkConstant(hostContext, errors, stack.push(constant, i, null, null), constant) && ok;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
for (Element where : vd.getChildren("where")) {
|
||||||
|
ok = checkWhere(hostContext, errors, vd, stack.push(where, i, null, null), where, resourceName, vec, vdesc, first) && ok;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
TypeDetails t = new TypeDetails(CollectionStatus.SINGLETON, resourceName);
|
||||||
|
i = 0;
|
||||||
|
for (Element select : vd.getChildren("select")) {
|
||||||
|
ok = checkSelect(hostContext, errors, vd, vd, stack.push(select, i, null, null), select, resourceName, t, columns, vec, vdesc, first) && ok;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeVersionSpecificContext(List<VersionEvaluationContext> versions, String ver) throws FHIRException, IOException {
|
||||||
|
if (session.getObjects().containsKey(ValidatorSession.VIEW_DEFINITION_CONTEXT+"."+ver)) {
|
||||||
|
versions.add((VersionEvaluationContext) session.getObjects().get(ValidatorSession.VIEW_DEFINITION_CONTEXT+"."+ver));
|
||||||
|
} else {
|
||||||
|
FilesystemPackageCacheManager pcm = new FilesystemPackageCacheManager.Builder().build();
|
||||||
|
NpmPackage npm = pcm.loadPackage(VersionUtilities.packageForVersion(ver));
|
||||||
|
SimpleWorkerContext context = new SimpleWorkerContext.SimpleWorkerContextBuilder().withAllowLoadingDuplicates(true).fromPackage(npm);
|
||||||
|
var vec = new VersionEvaluationContext(context);
|
||||||
|
session.getObjects().put(ValidatorSession.VIEW_DEFINITION_CONTEXT+"."+context.getVersion(), vec);
|
||||||
|
versions.add(vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeDefaultContext(List<VersionEvaluationContext> versions) {
|
||||||
|
if (session.getObjects().containsKey(ValidatorSession.VIEW_DEFINITION_CONTEXT+"."+context.getVersion())) {
|
||||||
|
versions.add((VersionEvaluationContext) session.getObjects().get(ValidatorSession.VIEW_DEFINITION_CONTEXT+"."+context.getVersion()));
|
||||||
|
} else {
|
||||||
|
var vec = new VersionEvaluationContext(context);
|
||||||
|
session.getObjects().put(ValidatorSession.VIEW_DEFINITION_CONTEXT+"."+context.getVersion(), vec);
|
||||||
|
versions.add(vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkSelect(ValidationContext hostContext, List<ValidationMessage> errors, Element vd, Element parent, NodeStack stack, Element select,
|
||||||
|
String resourceName, TypeDetails t, List<Column> columns, VersionEvaluationContext vec, String vdesc, boolean first) {
|
||||||
|
select.setUserData(UserDataNames.db_columns, columns);
|
||||||
|
boolean ok = true;
|
||||||
|
|
||||||
|
if (select.hasChild("forEach")) {
|
||||||
|
Element e = select.getNamedChild("forEach");
|
||||||
|
t = checkForEach(hostContext, errors, vd, select, stack.push(e, -1, null, null), e, resourceName, t, vec, vdesc, first);
|
||||||
|
} else if (select.hasChild("forEachOrNull")) {
|
||||||
|
Element e = select.getNamedChild("forEachOrNull");
|
||||||
|
t = checkForEachOrNull(hostContext, errors, vd, select, stack.push(e, -1, null, null), e, resourceName, t, vec, vdesc, first);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t == null) {
|
||||||
|
ok = false;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (select.hasChildren("column")) {
|
||||||
|
int i = 0;
|
||||||
|
for (Element e : select.getChildren("column")) {
|
||||||
|
ok = checkColumn(hostContext, errors, vd,select, stack.push(e, i, null, null), e, resourceName, t, columns, vec, vdesc, first) && ok;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (select.hasChildren("select")) {
|
||||||
|
int i = 0;
|
||||||
|
for (Element e : select.getChildren("select")) {
|
||||||
|
ok = checkSelect(hostContext, errors, vd, select, stack.push(e, i, null, null), e, resourceName, t, columns, vec, vdesc, first) && ok;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (select.hasChildren("unionAll")) {
|
||||||
|
int i = 0;
|
||||||
|
for (Element e : select.getChildren("unionAll")) {
|
||||||
|
ok = checkUnion(hostContext, errors, vd, parent, stack.push(e, i, null, null), e, resourceName, t, columns, vec, vdesc, first) && ok;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkColumnNamesUnique(errors, stack, columns);
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void checkColumnNamesUnique(List<ValidationMessage> errors, NodeStack stack, List<Column> columns) {
|
||||||
|
Set<String> names = new HashSet<>();
|
||||||
|
for (Column col : columns) {
|
||||||
|
if (col != null) {
|
||||||
|
String name = col.getName();
|
||||||
|
if (!names.contains(name)) {
|
||||||
|
names.add(name);
|
||||||
|
} else if (!col.isDuplicateReported()) {
|
||||||
|
col.setDuplicateReported(true);
|
||||||
|
rule(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, false, I18nConstants.VIEWDEFINITION_DUPL_COL_NAME, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkUnion(ValidationContext hostContext, List<ValidationMessage> errors, Element vd, Element parent, NodeStack stack,
|
||||||
|
Element unionAll, String resourceName, TypeDetails t, List<Column> columns, VersionEvaluationContext vec, String vdesc, boolean first) {
|
||||||
|
return false;
|
||||||
|
// List<List<Column>> unionColumns = new ArrayList<>();
|
||||||
|
// int i = 0;
|
||||||
|
// for (JsonElement e : ((JsonArray) a)) {
|
||||||
|
// if (!(e instanceof JsonObject)) {
|
||||||
|
// error(path+".unionAll["+i+"]", e, "unionAll["+i+"] is not an object", IssueType.INVALID);
|
||||||
|
// } else {
|
||||||
|
// unionColumns.add(checkSelect(vd, path+".unionAll["+i+"]", (JsonObject) e, t));
|
||||||
|
// }
|
||||||
|
// i++;
|
||||||
|
// }
|
||||||
|
// if (i < 2) {
|
||||||
|
// warning(path+".unionAll", a, "unionAll should have more than one item");
|
||||||
|
// }
|
||||||
|
// if (unionColumns.size() > 1) {
|
||||||
|
// List<Column> columns = unionColumns.get(0);
|
||||||
|
// for (int ic = 1; ic < unionColumns.size(); ic++) {
|
||||||
|
// String diff = columnDiffs(columns, unionColumns.get(ic));
|
||||||
|
// if (diff != null) {
|
||||||
|
// error(path+".unionAll["+i+"]", ((JsonArray) a).get(ic), "unionAll["+i+"] column definitions do not match: "+diff, IssueType.INVALID);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// a.setUserData(UserDataNames.db_columns, columns);
|
||||||
|
// return columns;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String columnDiffs(List<Column> list1, List<Column> list2) {
|
||||||
|
if (list1.size() == list2.size()) {
|
||||||
|
for (int i = 0; i < list1.size(); i++) {
|
||||||
|
if (list1.get(i) == null || list2.get(i) == null) {
|
||||||
|
return null; // just suppress any addition errors
|
||||||
|
}
|
||||||
|
String diff = list1.get(i).diff(list2.get(i));
|
||||||
|
if (diff != null) {
|
||||||
|
return diff+" at #"+i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return "Column counts differ: "+list1.size()+" vs "+list2.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkColumn(ValidationContext hostContext, List<ValidationMessage> errors, Element vd, Element parent, NodeStack stack, Element column, String resourceName,
|
||||||
|
TypeDetails t, List<Column> columns, VersionEvaluationContext vec, String vdesc, boolean first) {
|
||||||
|
boolean ok = false;
|
||||||
|
String expr = column.getNamedChildValue("path");
|
||||||
|
if (expr != null) {
|
||||||
|
ExpressionNode n = getParsedExpression(column, vec.fpe, expr, errors, stack, UserDataNames.db_path);
|
||||||
|
if (n != null) {
|
||||||
|
ok = true;
|
||||||
|
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder("; ");
|
||||||
|
List<IssueMessage> warnings = new ArrayList<>();
|
||||||
|
TypeDetails td = null;
|
||||||
|
try {
|
||||||
|
td = vec.fpe.checkOnTypes(vd, resourceName, t, n, warnings);
|
||||||
|
} catch (Exception e) {
|
||||||
|
rule(errors, "2024-11-14", IssueType.EXCEPTION, stack, false, I18nConstants.VIEWDEFINITION_PATH_ERROR, e.getMessage(), vdesc);
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
if (td != null) {
|
||||||
|
for (IssueMessage s : warnings) {
|
||||||
|
warning(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, false, I18nConstants.VIEWDEFINITION_PATH_WARNING, s.getMessage(), vdesc);
|
||||||
|
}
|
||||||
|
String columnName = column.getNamedChildValue("name");
|
||||||
|
if (columnName == null) {
|
||||||
|
List<String> names = n.getDistalNames();
|
||||||
|
if (names.size() == 1 && names.get(0) != null) {
|
||||||
|
columnName = names.get(0);
|
||||||
|
ok = rule(errors, "2024-11-14", IssueType.INVALID, stack, isValidName(columnName), I18nConstants.VIEWDEFINITION_NAME_REQUIRED_HINT, columnName) && ok;
|
||||||
|
} else {
|
||||||
|
ok = false;
|
||||||
|
rule(errors, "2024-11-14", IssueType.INVALID, stack, false, I18nConstants.VIEWDEFINITION_NAME_REQUIRED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (columnName != null) {
|
||||||
|
// ok = rule(errors, "2024-11-14", IssueType.INVALID, stack, false, I18nConstants.VIEWDEFINITION_NAME_ REQUIRED) && ok;
|
||||||
|
column.setUserData(UserDataNames.db_name, columnName);
|
||||||
|
Boolean isColl = null;
|
||||||
|
if (column.hasChild("collection")) {
|
||||||
|
isColl = "true".equals(column.getNamedChildValue("collection"));
|
||||||
|
}
|
||||||
|
if (isColl != null && isColl) {
|
||||||
|
if (td.getCollectionStatus() == CollectionStatus.SINGLETON) {
|
||||||
|
if (!hint(errors, "2024-11-14", IssueType.INFORMATIONAL, stack, false, I18nConstants.VIEWDEFINITION_COLLECTION_NOT_NEEDED, expr, columnName)) {
|
||||||
|
b.append(context.formatMessage(I18nConstants.VIEWDEFINITION_COLLECTION_NOT_NEEDED, expr, columnName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!hint(errors, "2024-11-14", IssueType.INFORMATIONAL, stack, false, I18nConstants.VIEWDEFINITION_COLLECTION_NOT_ALWAYS)) {
|
||||||
|
b.append(context.formatMessage(I18nConstants.VIEWDEFINITION_COLLECTION_NOT_ALWAYS));
|
||||||
|
}
|
||||||
|
} else if (isColl == null) {
|
||||||
|
if (!hint(errors, "2024-11-14", IssueType.INFORMATIONAL, stack, td.getCollectionStatus() == CollectionStatus.SINGLETON, I18nConstants.VIEWDEFINITION_COLLECTION_NEEDED1, expr, columnName, vdesc)) {
|
||||||
|
b.append(context.formatMessage(I18nConstants.VIEWDEFINITION_COLLECTION_NEEDED1, expr, columnName, vdesc));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!hint(errors, "2024-11-14", IssueType.INFORMATIONAL, stack, td.getCollectionStatus() == CollectionStatus.SINGLETON, I18nConstants.VIEWDEFINITION_COLLECTION_NEEDED1, expr, columnName, vdesc)) {
|
||||||
|
b.append(context.formatMessage(I18nConstants.VIEWDEFINITION_COLLECTION_NEEDED2, expr, columnName, vdesc));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Set<String> types = new HashSet<>();
|
||||||
|
if (n.isNullSet()) {
|
||||||
|
types.add("null");
|
||||||
|
} else {
|
||||||
|
// ok collection is sorted
|
||||||
|
for (String type : td.getTypes()) {
|
||||||
|
types.add(simpleType(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
String type = column.getNamedChildValue("type");
|
||||||
|
if (type != null) {
|
||||||
|
if (td.hasType(type)) {
|
||||||
|
types.clear();
|
||||||
|
types.add(simpleType(type));
|
||||||
|
} else {
|
||||||
|
ok = rule(errors, "2024-11-14", IssueType.INVALID, stack, false, I18nConstants.VIEWDEFINITION_TYPE_MISMATCH, expr, type, td.describe(), vdesc) && ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (types.size() != 1) {
|
||||||
|
ok = rule(errors, "2024-11-14", IssueType.INVALID, stack, false, I18nConstants.VIEWDEFINITION_UNABLE_TO_TYPE, td.describe(), vdesc) && ok;
|
||||||
|
} else {
|
||||||
|
String type = types.iterator().next();
|
||||||
|
boolean tok = false;
|
||||||
|
if (!isSimpleType(type) && !"null".equals(type)) {
|
||||||
|
hint(errors, "2024-11-14", IssueType.INFORMATIONAL, stack, false, I18nConstants.VIEWDEFINITION_COMPLEX_TYPE, expr, type, vdesc);
|
||||||
|
} else {
|
||||||
|
tok = true;
|
||||||
|
}
|
||||||
|
if (tok) {
|
||||||
|
if (first) {
|
||||||
|
Column col = new Column(columnName, isColl, type, kindForType(type));
|
||||||
|
column.setUserData(UserDataNames.db_column, col);
|
||||||
|
col.setNotes(b.toString());
|
||||||
|
columns.add(col);
|
||||||
|
} else if (b.count() > 0){
|
||||||
|
Column col = null;
|
||||||
|
for (Column c : columns) {
|
||||||
|
if (c.getName().equals(columnName)) {
|
||||||
|
col = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (col != null) {
|
||||||
|
col.addNote(b.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ColumnKind kindForType(String type) {
|
||||||
|
switch (type) {
|
||||||
|
case "null": return ColumnKind.Null;
|
||||||
|
case "dateTime": return ColumnKind.DateTime;
|
||||||
|
case "boolean": return ColumnKind.Boolean;
|
||||||
|
case "integer": return ColumnKind.Integer;
|
||||||
|
case "decimal": return ColumnKind.Decimal;
|
||||||
|
case "string": return ColumnKind.String;
|
||||||
|
case "canonical": return ColumnKind.String;
|
||||||
|
case "url": return ColumnKind.String;
|
||||||
|
case "uri": return ColumnKind.String;
|
||||||
|
case "oid": return ColumnKind.String;
|
||||||
|
case "uuid": return ColumnKind.String;
|
||||||
|
case "id": return ColumnKind.String;
|
||||||
|
case "code": return ColumnKind.String;
|
||||||
|
case "base64Binary": return ColumnKind.Binary;
|
||||||
|
case "time": return ColumnKind.Time;
|
||||||
|
default: return ColumnKind.Complex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isSimpleType(String type) {
|
||||||
|
return Utilities.existsInList(type, "dateTime", "boolean", "integer", "decimal", "string", "base64Binary", "id", "code", "date", "time", "canonical", "uri", "url");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String simpleType(String type) {
|
||||||
|
type = type.replace("http://hl7.org/fhirpath/System.", "").replace("http://hl7.org/fhir/StructureDefinition/", "");
|
||||||
|
if (Utilities.existsInList(type, "date", "dateTime", "instant")) {
|
||||||
|
return "dateTime";
|
||||||
|
}
|
||||||
|
if (Utilities.existsInList(type, "Boolean", "boolean")) {
|
||||||
|
return "boolean";
|
||||||
|
}
|
||||||
|
if (Utilities.existsInList(type, "Integer", "integer", "integer64")) {
|
||||||
|
return "integer";
|
||||||
|
}
|
||||||
|
if (Utilities.existsInList(type, "Decimal", "decimal")) {
|
||||||
|
return "decimal";
|
||||||
|
}
|
||||||
|
if (Utilities.existsInList(type, "String", "string", "code")) {
|
||||||
|
return "string";
|
||||||
|
}
|
||||||
|
if (Utilities.existsInList(type, "Time", "time")) {
|
||||||
|
return "time";
|
||||||
|
}
|
||||||
|
if (Utilities.existsInList(type, "base64Binary")) {
|
||||||
|
return "base64Binary";
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypeDetails checkForEach(ValidationContext hostContext, List<ValidationMessage> errors, Element vd, Element parent, NodeStack stack,
|
||||||
|
Element expression, String resourceName, TypeDetails t, VersionEvaluationContext vec, String vdesc, boolean first) {
|
||||||
|
String expr = expression.primitiveValue();
|
||||||
|
if (expr != null) {
|
||||||
|
ExpressionNode n = getParsedExpression(parent, vec.fpe, expr, errors, stack, UserDataNames.db_forEach);
|
||||||
|
if (n != null) {
|
||||||
|
|
||||||
|
List<IssueMessage> warnings = new ArrayList<>();
|
||||||
|
TypeDetails td = null;
|
||||||
|
try {
|
||||||
|
td = vec.fpe.checkOnTypes(vd, resourceName, t, n, warnings);
|
||||||
|
} catch (Exception e) {
|
||||||
|
rule(errors, "2024-11-14", IssueType.EXCEPTION, stack, false, I18nConstants.VIEWDEFINITION_PATH_ERROR, e.getMessage(), vdesc);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (td != null) {
|
||||||
|
for (IssueMessage s : warnings) {
|
||||||
|
warning(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, false, I18nConstants.VIEWDEFINITION_PATH_WARNING, s.getMessage(), vdesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return td;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypeDetails checkForEachOrNull(ValidationContext hostContext, List<ValidationMessage> errors, Element vd, Element parent, NodeStack stack,
|
||||||
|
Element expression, String resourceName, TypeDetails t, VersionEvaluationContext vec, String vdesc, boolean first) {
|
||||||
|
String expr = expression.primitiveValue();
|
||||||
|
if (expr != null) {
|
||||||
|
ExpressionNode n = getParsedExpression(parent, vec.fpe, expr, errors, stack, UserDataNames.db_forEachOrNull);
|
||||||
|
if (n != null) {
|
||||||
|
List<IssueMessage> warnings = new ArrayList<>();
|
||||||
|
TypeDetails td = null;
|
||||||
|
try {
|
||||||
|
td = vec.fpe.checkOnTypes(vd, resourceName, t, n, warnings);
|
||||||
|
} catch (Exception e) {
|
||||||
|
rule(errors, "2024-11-14", IssueType.EXCEPTION, stack, false, I18nConstants.VIEWDEFINITION_PATH_ERROR, e.getMessage(), vdesc);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (td != null) {
|
||||||
|
for (IssueMessage s : warnings) {
|
||||||
|
warning(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, false, I18nConstants.VIEWDEFINITION_PATH_WARNING, s.getMessage(), vdesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return td;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkConstant(ValidationContext hostContext, List<ValidationMessage> errors, NodeStack stack, Element constant) {
|
||||||
|
String name = constant.getNamedChildValue("name");
|
||||||
|
warning(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, isValidName(name), I18nConstants.VIEWDEFINITION_NAME_INVALID, "constant", name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkWhere(ValidationContext hostContext, List<ValidationMessage> errors, Element vd, NodeStack stack, Element where,
|
||||||
|
String resourceName, VersionEvaluationContext vec, String vdesc, boolean first) {
|
||||||
|
boolean ok = true;
|
||||||
|
String expr = where.getNamedChildValue("path");
|
||||||
|
if (expr != null) {
|
||||||
|
ExpressionNode n = getParsedExpression(where, vec.fpe, expr, errors, stack, UserDataNames.db_path);
|
||||||
|
if (n != null) {
|
||||||
|
List<String> types = new ArrayList<>();
|
||||||
|
List<IssueMessage> warnings = new ArrayList<>();
|
||||||
|
types.add(resourceName);
|
||||||
|
TypeDetails td = null;
|
||||||
|
try {
|
||||||
|
td = vec.fpe.checkOnTypes(vd, resourceName, types, n, warnings);}
|
||||||
|
catch (Exception e) {
|
||||||
|
rule(errors, "2024-11-14", IssueType.EXCEPTION, stack, false, I18nConstants.VIEWDEFINITION_PATH_ERROR, e.getMessage(), vdesc);
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
if (td != null) {
|
||||||
|
if (td.getCollectionStatus() != CollectionStatus.SINGLETON || td.getTypes().size() != 1 || !td.hasType("boolean")) {
|
||||||
|
rule(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, false, I18nConstants.VIEWDEFINITION_PATH_WRONG_RETURN, expr, td.describe(), vdesc);
|
||||||
|
ok = false;
|
||||||
|
} else {
|
||||||
|
for (IssueMessage s : warnings) {
|
||||||
|
warning(errors, "2024-11-14", IssueType.BUSINESSRULE, stack, false, I18nConstants.VIEWDEFINITION_PATH_WARNING, s.getMessage(), vdesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ExpressionNode getParsedExpression(Element focus, FHIRPathEngine fpe, String expr, List<ValidationMessage> errors, NodeStack stack, String udName) {
|
||||||
|
if (focus.hasUserData(UserDataNames.db_path)) {
|
||||||
|
return (ExpressionNode) focus.getUserData(udName);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpressionNode n = null;
|
||||||
|
try {
|
||||||
|
n = fpe.parse(expr);
|
||||||
|
} catch (Exception e) {
|
||||||
|
rule(errors, "2024-11-14", IssueType.EXCEPTION, stack, false, I18nConstants.VIEWDEFINITION_PATH_ERROR, e.getMessage(), "");
|
||||||
|
}
|
||||||
|
focus.setUserData(udName, n);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidName(String name) {
|
||||||
|
boolean first = true;
|
||||||
|
for (char c : name.toCharArray()) {
|
||||||
|
if (!(Character.isAlphabetic(c) || Character.isDigit(c) || (!first && c == '_'))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -42,6 +42,7 @@ import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
||||||
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
import org.hl7.fhir.r5.utils.XVerExtensionManager;
|
||||||
|
import org.hl7.fhir.r5.utils.validation.ValidatorSession;
|
||||||
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;
|
||||||
|
@ -54,8 +55,8 @@ public class ProfileValidator extends BaseValidator {
|
||||||
private boolean allowDoubleQuotesInFHIRPath = false;
|
private boolean allowDoubleQuotesInFHIRPath = false;
|
||||||
private FHIRPathEngine fpe;
|
private FHIRPathEngine fpe;
|
||||||
|
|
||||||
public ProfileValidator(IWorkerContext context, XVerExtensionManager xverManager) {
|
public ProfileValidator(IWorkerContext context, XVerExtensionManager xverManager, ValidatorSession session) {
|
||||||
super(context, xverManager, false);
|
super(context, xverManager, false, session);
|
||||||
fpe = new FHIRPathEngine(context);
|
fpe = new FHIRPathEngine(context);
|
||||||
fpe.setAllowDoubleQuotes(allowDoubleQuotesInFHIRPath);
|
fpe.setAllowDoubleQuotes(allowDoubleQuotesInFHIRPath);
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,7 +187,7 @@ public class R4R5MapTester implements IValidatorResourceFetcher {
|
||||||
loadPackage("hl7.fhir.r4.core#4.0.1", false);
|
loadPackage("hl7.fhir.r4.core#4.0.1", false);
|
||||||
loadPackage("hl7.fhir.r4b.core#4.3.0", false);
|
loadPackage("hl7.fhir.r4b.core#4.3.0", false);
|
||||||
|
|
||||||
validator = new InstanceValidator(context, null, null);
|
validator = new InstanceValidator(context, null, null, null);
|
||||||
validator.setSuppressLoincSnomedMessages(true);
|
validator.setSuppressLoincSnomedMessages(true);
|
||||||
validator.setResourceIdRule(IdStatus.REQUIRED);
|
validator.setResourceIdRule(IdStatus.REQUIRED);
|
||||||
validator.setBestPracticeWarningLevel(BestPracticeWarningLevel.Warning);
|
validator.setBestPracticeWarningLevel(BestPracticeWarningLevel.Warning);
|
||||||
|
|
|
@ -37,7 +37,7 @@ class InstanceValidatorTests {
|
||||||
IWorkerContext context = mock(IWorkerContext.class);
|
IWorkerContext context = mock(IWorkerContext.class);
|
||||||
when(context.getLocale()).thenReturn(Locale.KOREA);
|
when(context.getLocale()).thenReturn(Locale.KOREA);
|
||||||
when(context.getVersion()).thenReturn("5.0.1");
|
when(context.getVersion()).thenReturn("5.0.1");
|
||||||
InstanceValidator instanceValidator = new InstanceValidator(context, null, null);
|
InstanceValidator instanceValidator = new InstanceValidator(context, null, null, null);
|
||||||
|
|
||||||
|
|
||||||
when(context.validateCode((ValidationOptions) any(ValidationOptions.class), (CodeableConcept) any(CodeableConcept.class), (ValueSet)any(ValueSet.class))).thenReturn(new ValidationResult(ValidationMessage.IssueSeverity.NULL, "Blah!", Collections.emptyList()));
|
when(context.validateCode((ValidationOptions) any(ValidationOptions.class), (CodeableConcept) any(CodeableConcept.class), (ValueSet)any(ValueSet.class))).thenReturn(new ValidationResult(ValidationMessage.IssueSeverity.NULL, "Blah!", Collections.emptyList()));
|
||||||
|
|
|
@ -11,6 +11,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.utils.OperationOutcomeUtilities;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.FhirPublication;
|
import org.hl7.fhir.utilities.FhirPublication;
|
||||||
import org.hl7.fhir.utilities.settings.FhirSettings;
|
import org.hl7.fhir.utilities.settings.FhirSettings;
|
||||||
|
@ -89,6 +90,7 @@ public class ValidationEngineTests {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
System.err.println("Thread " + index + " failed");
|
System.err.println("Thread " + index + " failed");
|
||||||
|
outcomes[index] = OperationOutcomeUtilities.outcomeFromTextError(e.getMessage());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
t.start();
|
t.start();
|
||||||
|
|
Loading…
Reference in New Issue