Merge remote-tracking branch 'origin/master' into i18n
# Conflicts: # org.hl7.fhir.validation/src/main/resources/Messages_de.properties
This commit is contained in:
commit
34c63d0555
|
@ -0,0 +1,180 @@
|
||||||
|
package org.hl7.fhir.convertors;
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* org.hl7.fhir.convertors
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2019 Health Level 7
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
|
import org.hl7.fhir.r5.formats.JsonParser;
|
||||||
|
import org.hl7.fhir.r5.formats.XmlParser;
|
||||||
|
import org.hl7.fhir.r5.model.Resource;
|
||||||
|
import org.hl7.fhir.r5.context.SimpleWorkerContext.IContextResourceLoader;
|
||||||
|
import org.hl7.fhir.r5.model.Bundle;
|
||||||
|
import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent;
|
||||||
|
import org.hl7.fhir.r5.model.Bundle.BundleType;
|
||||||
|
import org.hl7.fhir.r5.model.CanonicalResource;
|
||||||
|
import org.hl7.fhir.r5.model.CanonicalType;
|
||||||
|
import org.hl7.fhir.r5.model.CodeSystem;
|
||||||
|
import org.hl7.fhir.r5.model.ElementDefinition;
|
||||||
|
import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent;
|
||||||
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
|
import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind;
|
||||||
|
import org.hl7.fhir.r5.model.UriType;
|
||||||
|
import org.hl7.fhir.r5.model.ValueSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This loader doesn't really do anything, but it's defined for structural consistency
|
||||||
|
*
|
||||||
|
* @author graha
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class R5ToR5Loader extends BaseLoader implements IContextResourceLoader, VersionConvertorAdvisor50 {
|
||||||
|
|
||||||
|
public R5ToR5Loader(String[] types) {
|
||||||
|
super(types);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<CodeSystem> cslist = new ArrayList<>();
|
||||||
|
private boolean patchUrls;
|
||||||
|
private boolean killPrimitives;;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Bundle loadBundle(InputStream stream, boolean isJson) throws FHIRException, IOException {
|
||||||
|
Resource r5 = null;
|
||||||
|
if (isJson)
|
||||||
|
r5 = new JsonParser().parse(stream);
|
||||||
|
else
|
||||||
|
r5 = new XmlParser().parse(stream);
|
||||||
|
|
||||||
|
Bundle b;
|
||||||
|
if (r5 instanceof Bundle)
|
||||||
|
b = (Bundle) r5;
|
||||||
|
else {
|
||||||
|
b = new Bundle();
|
||||||
|
b.setId(UUID.randomUUID().toString().toLowerCase());
|
||||||
|
b.setType(BundleType.COLLECTION);
|
||||||
|
b.addEntry().setResource(r5).setFullUrl(r5 instanceof CanonicalResource ? ((CanonicalResource) r5).getUrl() : null);
|
||||||
|
}
|
||||||
|
for (CodeSystem cs : cslist) {
|
||||||
|
BundleEntryComponent be = b.addEntry();
|
||||||
|
be.setFullUrl(cs.getUrl());
|
||||||
|
be.setResource(cs);
|
||||||
|
}
|
||||||
|
if (killPrimitives) {
|
||||||
|
List<BundleEntryComponent> remove = new ArrayList<BundleEntryComponent>();
|
||||||
|
for (BundleEntryComponent be : b.getEntry()) {
|
||||||
|
if (be.hasResource() && be.getResource() instanceof StructureDefinition) {
|
||||||
|
StructureDefinition sd = (StructureDefinition) be.getResource();
|
||||||
|
if (sd.getKind() == StructureDefinitionKind.PRIMITIVETYPE)
|
||||||
|
remove.add(be);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.getEntry().removeAll(remove);
|
||||||
|
}
|
||||||
|
if (patchUrls) {
|
||||||
|
for (BundleEntryComponent be : b.getEntry()) {
|
||||||
|
if (be.hasResource() && be.getResource() instanceof StructureDefinition) {
|
||||||
|
StructureDefinition sd = (StructureDefinition) be.getResource();
|
||||||
|
sd.setUrl(sd.getUrl().replace("http://hl7.org/fhir/", "http://hl7.org/fhir/4.0/"));
|
||||||
|
sd.addExtension().setUrl("http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace").setValue(new UriType("http://hl7.org/fhir"));
|
||||||
|
for (ElementDefinition ed : sd.getSnapshot().getElement())
|
||||||
|
patchUrl(ed);
|
||||||
|
for (ElementDefinition ed : sd.getDifferential().getElement())
|
||||||
|
patchUrl(ed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void patchUrl(ElementDefinition ed) {
|
||||||
|
for (TypeRefComponent tr : ed.getType()) {
|
||||||
|
for (CanonicalType s : tr.getTargetProfile()) {
|
||||||
|
s.setValue(s.getValue().replace("http://hl7.org/fhir/", "http://hl7.org/fhir/4.0/"));
|
||||||
|
}
|
||||||
|
for (CanonicalType s : tr.getProfile()) {
|
||||||
|
s.setValue(s.getValue().replace("http://hl7.org/fhir/", "http://hl7.org/fhir/4.0/"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean ignoreEntry(BundleEntryComponent src) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.hl7.fhir.dstu2.model.Resource convertR2(org.hl7.fhir.r5.model.Resource resource) throws FHIRException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.hl7.fhir.dstu2016may.model.Resource convertR2016May(org.hl7.fhir.r5.model.Resource resource) throws FHIRException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.hl7.fhir.r4.model.Resource convertR4(org.hl7.fhir.r5.model.Resource resource) throws FHIRException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleCodeSystem(CodeSystem cs, ValueSet vs) {
|
||||||
|
cs.setId(vs.getId());
|
||||||
|
cs.setValueSet(vs.getUrl());
|
||||||
|
cslist.add(cs);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CodeSystem getCodeSystem(ValueSet src) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPatchUrls() {
|
||||||
|
return patchUrls;
|
||||||
|
}
|
||||||
|
|
||||||
|
public R5ToR5Loader setPatchUrls(boolean patchUrls) {
|
||||||
|
this.patchUrls = patchUrls;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isKillPrimitives() {
|
||||||
|
return killPrimitives;
|
||||||
|
}
|
||||||
|
|
||||||
|
public R5ToR5Loader setKillPrimitives(boolean killPrimitives) {
|
||||||
|
this.killPrimitives = killPrimitives;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.hl7.fhir.dstu3.model.Resource convertR3(org.hl7.fhir.r5.model.Resource resource) throws FHIRException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ import org.hl7.fhir.convertors.VersionConvertor_10_50;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.r5.model.Dosage;
|
import org.hl7.fhir.r5.model.Dosage;
|
||||||
import org.hl7.fhir.r5.model.Dosage.DosageDoseAndRateComponent;
|
import org.hl7.fhir.r5.model.Dosage.DosageDoseAndRateComponent;
|
||||||
import org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodesEnumFactory;
|
|
||||||
|
|
||||||
public class MedicationDispense10_50 {
|
public class MedicationDispense10_50 {
|
||||||
|
|
||||||
|
@ -128,7 +127,7 @@ public class MedicationDispense10_50 {
|
||||||
public static org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> convertMedicationDispenseStatus(org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.MedicationDispense.MedicationDispenseStatus> src) throws FHIRException {
|
public static org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> convertMedicationDispenseStatus(org.hl7.fhir.dstu2.model.Enumeration<org.hl7.fhir.dstu2.model.MedicationDispense.MedicationDispenseStatus> src) throws FHIRException {
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<>(new MedicationDispenseStatusCodesEnumFactory());
|
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes>();
|
||||||
VersionConvertor_10_50.copyElement(src, tgt);
|
VersionConvertor_10_50.copyElement(src, tgt);
|
||||||
switch(src.getValue()) {
|
switch(src.getValue()) {
|
||||||
case COMPLETED:
|
case COMPLETED:
|
||||||
|
|
|
@ -3,7 +3,6 @@ package org.hl7.fhir.convertors.conv30_50;
|
||||||
import org.hl7.fhir.convertors.VersionConvertor_30_50;
|
import org.hl7.fhir.convertors.VersionConvertor_30_50;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.r5.model.CodeableReference;
|
import org.hl7.fhir.r5.model.CodeableReference;
|
||||||
import org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodesEnumFactory;
|
|
||||||
|
|
||||||
public class MedicationAdministration30_50 {
|
public class MedicationAdministration30_50 {
|
||||||
|
|
||||||
|
@ -140,7 +139,7 @@ public class MedicationAdministration30_50 {
|
||||||
static public org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes> convertMedicationAdministrationStatus(org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.MedicationAdministration.MedicationAdministrationStatus> src) {
|
static public org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes> convertMedicationAdministrationStatus(org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.MedicationAdministration.MedicationAdministrationStatus> src) {
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<>(new MedicationAdministrationStatusCodesEnumFactory());
|
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes>();
|
||||||
VersionConvertor_30_50.copyElement(src, tgt);
|
VersionConvertor_30_50.copyElement(src, tgt);
|
||||||
tgt.setValue(org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes.fromCode(src.getValueAsString()));
|
tgt.setValue(org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes.fromCode(src.getValueAsString()));
|
||||||
return tgt;
|
return tgt;
|
||||||
|
|
|
@ -25,7 +25,6 @@ import org.hl7.fhir.r4.model.CodeType;
|
||||||
import org.hl7.fhir.r5.model.CodeableReference;
|
import org.hl7.fhir.r5.model.CodeableReference;
|
||||||
import org.hl7.fhir.r5.model.Enumeration;
|
import org.hl7.fhir.r5.model.Enumeration;
|
||||||
import org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes;
|
import org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodes;
|
||||||
import org.hl7.fhir.r5.model.MedicationAdministration.MedicationAdministrationStatusCodesEnumFactory;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2011+, HL7, Inc.
|
Copyright (c) 2011+, HL7, Inc.
|
||||||
|
@ -142,7 +141,7 @@ public class MedicationAdministration40_50 extends VersionConvertor_40_50 {
|
||||||
private static Enumeration<MedicationAdministrationStatusCodes> convertMedicationAdministrationStatus(CodeType src) {
|
private static Enumeration<MedicationAdministrationStatusCodes> convertMedicationAdministrationStatus(CodeType src) {
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
Enumeration<MedicationAdministrationStatusCodes> tgt = new Enumeration<>(new MedicationAdministrationStatusCodesEnumFactory());
|
Enumeration<MedicationAdministrationStatusCodes> tgt = new Enumeration<MedicationAdministrationStatusCodes>();
|
||||||
copyElement(src, tgt);
|
copyElement(src, tgt);
|
||||||
tgt.setValue(MedicationAdministrationStatusCodes.fromCode(src.getCode()));
|
tgt.setValue(MedicationAdministrationStatusCodes.fromCode(src.getCode()));
|
||||||
return tgt;
|
return tgt;
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.hl7.fhir.convertors.VersionConvertor_40_50;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.r4.model.CodeType;
|
import org.hl7.fhir.r4.model.CodeType;
|
||||||
import org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes;
|
import org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes;
|
||||||
import org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodesEnumFactory;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2011+, HL7, Inc.
|
Copyright (c) 2011+, HL7, Inc.
|
||||||
|
@ -163,7 +162,7 @@ public class MedicationDispense40_50 extends VersionConvertor_40_50 {
|
||||||
private static org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> convertMedicationStatus(org.hl7.fhir.r4.model.CodeType src) {
|
private static org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> convertMedicationStatus(org.hl7.fhir.r4.model.CodeType src) {
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<>(new MedicationDispenseStatusCodesEnumFactory());
|
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationDispense.MedicationDispenseStatusCodes>();
|
||||||
copyElement(src, tgt);
|
copyElement(src, tgt);
|
||||||
if (src.hasCode())
|
if (src.hasCode())
|
||||||
tgt.setValue(MedicationDispenseStatusCodes.fromCode(src.getCode()));
|
tgt.setValue(MedicationDispenseStatusCodes.fromCode(src.getCode()));
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.r4.model.CodeType;
|
import org.hl7.fhir.r4.model.CodeType;
|
||||||
import org.hl7.fhir.r5.model.Enumeration;
|
import org.hl7.fhir.r5.model.Enumeration;
|
||||||
import org.hl7.fhir.r5.model.MedicationKnowledge.MedicationKnowledgeStatusCodes;
|
import org.hl7.fhir.r5.model.MedicationKnowledge.MedicationKnowledgeStatusCodes;
|
||||||
import org.hl7.fhir.r5.model.MedicationKnowledge.MedicationKnowledgeStatusCodesEnumFactory;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2011+, HL7, Inc.
|
Copyright (c) 2011+, HL7, Inc.
|
||||||
|
@ -149,7 +148,7 @@ public class MedicationKnowledge40_50 extends VersionConvertor_40_50 {
|
||||||
private static Enumeration<MedicationKnowledgeStatusCodes> convertMedicationKnowledgeStatus(CodeType src) {
|
private static Enumeration<MedicationKnowledgeStatusCodes> convertMedicationKnowledgeStatus(CodeType src) {
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationKnowledge.MedicationKnowledgeStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<>(new MedicationKnowledgeStatusCodesEnumFactory());
|
org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationKnowledge.MedicationKnowledgeStatusCodes> tgt = new org.hl7.fhir.r5.model.Enumeration<org.hl7.fhir.r5.model.MedicationKnowledge.MedicationKnowledgeStatusCodes>();
|
||||||
copyElement(src, tgt);
|
copyElement(src, tgt);
|
||||||
tgt.setValue(MedicationKnowledgeStatusCodes.fromCode(src.getCode()));
|
tgt.setValue(MedicationKnowledgeStatusCodes.fromCode(src.getCode()));
|
||||||
return tgt;
|
return tgt;
|
||||||
|
|
|
@ -23,15 +23,11 @@ package org.hl7.fhir.dstu2.utils;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.ResourceBundle;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.dstu2.model.BooleanType;
|
import org.hl7.fhir.dstu2.model.BooleanType;
|
||||||
|
@ -77,8 +73,6 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
// private ValueSetExpansionCache expansionCache; //
|
// private ValueSetExpansionCache expansionCache; //
|
||||||
|
|
||||||
protected FHIRToolingClient txServer;
|
protected FHIRToolingClient txServer;
|
||||||
private Locale locale;
|
|
||||||
private ResourceBundle i18Nmessages;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ValueSet fetchCodeSystem(String system) {
|
public ValueSet fetchCodeSystem(String system) {
|
||||||
|
@ -408,37 +402,4 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
return fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+typeName);
|
return fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+typeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Locale getLocale() {
|
|
||||||
if (Objects.nonNull(locale)){
|
|
||||||
return locale;
|
|
||||||
} else {
|
|
||||||
return Locale.US;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setLocale(Locale locale) {
|
|
||||||
this.locale = locale;
|
|
||||||
setValidationMessageLanguage(getLocale());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String formatMessage(String theMessage, Object... theMessageArguments) {
|
|
||||||
String message = theMessage;
|
|
||||||
if (Objects.nonNull(i18Nmessages) && i18Nmessages.containsKey(theMessage)) {
|
|
||||||
if (Objects.nonNull(theMessageArguments) && theMessageArguments.length > 0) {
|
|
||||||
message = MessageFormat.format(i18Nmessages.getString(theMessage), theMessageArguments);
|
|
||||||
} else {
|
|
||||||
message = i18Nmessages.getString(theMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setValidationMessageLanguage(Locale locale) {
|
|
||||||
i18Nmessages = ResourceBundle.getBundle("Messages", locale );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ package org.hl7.fhir.dstu2.utils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import org.hl7.fhir.dstu2.formats.IParser;
|
import org.hl7.fhir.dstu2.formats.IParser;
|
||||||
import org.hl7.fhir.dstu2.formats.ParserType;
|
import org.hl7.fhir.dstu2.formats.ParserType;
|
||||||
import org.hl7.fhir.dstu2.model.CodeableConcept;
|
import org.hl7.fhir.dstu2.model.CodeableConcept;
|
||||||
|
@ -210,14 +209,6 @@ public interface IWorkerContext {
|
||||||
*/
|
*/
|
||||||
public ValueSetExpansionComponent expandVS(ConceptSetComponent inc);
|
public ValueSetExpansionComponent expandVS(ConceptSetComponent inc);
|
||||||
|
|
||||||
Locale getLocale();
|
|
||||||
|
|
||||||
void setLocale(Locale locale);
|
|
||||||
|
|
||||||
String formatMessage(String theMessage, Object... theMessageArguments);
|
|
||||||
|
|
||||||
void setValidationMessageLanguage(Locale locale);
|
|
||||||
|
|
||||||
public class ValidationResult {
|
public class ValidationResult {
|
||||||
private ConceptDefinitionComponent definition;
|
private ConceptDefinitionComponent definition;
|
||||||
private IssueSeverity severity;
|
private IssueSeverity severity;
|
||||||
|
|
|
@ -23,15 +23,11 @@ package org.hl7.fhir.dstu2016may.utils;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.ResourceBundle;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.dstu2016may.model.BooleanType;
|
import org.hl7.fhir.dstu2016may.model.BooleanType;
|
||||||
|
@ -79,8 +75,6 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
|
|
||||||
protected FHIRToolingClient txServer;
|
protected FHIRToolingClient txServer;
|
||||||
private Bundle bndCodeSystems;
|
private Bundle bndCodeSystems;
|
||||||
private Locale locale;
|
|
||||||
private ResourceBundle i18Nmessages;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CodeSystem fetchCodeSystem(String system) {
|
public CodeSystem fetchCodeSystem(String system) {
|
||||||
|
@ -447,37 +441,5 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
return fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+typeName);
|
return fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+typeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Locale getLocale() {
|
|
||||||
if (Objects.nonNull(locale)){
|
|
||||||
return locale;
|
|
||||||
} else {
|
|
||||||
return Locale.US;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setLocale(Locale locale) {
|
|
||||||
this.locale = locale;
|
|
||||||
setValidationMessageLanguage(getLocale());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String formatMessage(String theMessage, Object... theMessageArguments) {
|
|
||||||
String message = theMessage;
|
|
||||||
if (Objects.nonNull(i18Nmessages) && i18Nmessages.containsKey(theMessage)) {
|
|
||||||
if (Objects.nonNull(theMessageArguments) && theMessageArguments.length > 0) {
|
|
||||||
message = MessageFormat.format(i18Nmessages.getString(theMessage), theMessageArguments);
|
|
||||||
} else {
|
|
||||||
message = i18Nmessages.getString(theMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setValidationMessageLanguage(Locale locale) {
|
|
||||||
i18Nmessages = ResourceBundle.getBundle("Messages", locale );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ package org.hl7.fhir.dstu2016may.utils;
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.dstu2016may.formats.IParser;
|
import org.hl7.fhir.dstu2016may.formats.IParser;
|
||||||
|
@ -206,14 +205,6 @@ public interface IWorkerContext {
|
||||||
*/
|
*/
|
||||||
public ValueSetExpansionComponent expandVS(ConceptSetComponent inc);
|
public ValueSetExpansionComponent expandVS(ConceptSetComponent inc);
|
||||||
|
|
||||||
Locale getLocale();
|
|
||||||
|
|
||||||
void setLocale(Locale locale);
|
|
||||||
|
|
||||||
String formatMessage(String theMessage, Object... theMessageArguments);
|
|
||||||
|
|
||||||
void setValidationMessageLanguage(Locale locale);
|
|
||||||
|
|
||||||
public class ValidationResult {
|
public class ValidationResult {
|
||||||
private ConceptDefinitionComponent definition;
|
private ConceptDefinitionComponent definition;
|
||||||
private IssueSeverity severity;
|
private IssueSeverity severity;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -22,7 +22,6 @@ package org.hl7.fhir.dstu3.context;
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hl7.fhir.dstu3.formats.IParser;
|
import org.hl7.fhir.dstu3.formats.IParser;
|
||||||
|
@ -238,14 +237,6 @@ public interface IWorkerContext {
|
||||||
*/
|
*/
|
||||||
public ValueSetExpansionComponent expandVS(ConceptSetComponent inc, boolean heiarchical) throws TerminologyServiceException;
|
public ValueSetExpansionComponent expandVS(ConceptSetComponent inc, boolean heiarchical) throws TerminologyServiceException;
|
||||||
|
|
||||||
Locale getLocale();
|
|
||||||
|
|
||||||
void setLocale(Locale locale);
|
|
||||||
|
|
||||||
String formatMessage(String theMessage, Object... theMessageArguments);
|
|
||||||
|
|
||||||
void setValidationMessageLanguage(Locale locale);
|
|
||||||
|
|
||||||
public class ValidationResult {
|
public class ValidationResult {
|
||||||
private ConceptDefinitionComponent definition;
|
private ConceptDefinitionComponent definition;
|
||||||
private IssueSeverity severity;
|
private IssueSeverity severity;
|
||||||
|
|
|
@ -21,10 +21,6 @@ package org.hl7.fhir.r4.context;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.ResourceBundle;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.fhir.ucum.UcumService;
|
import org.fhir.ucum.UcumService;
|
||||||
import org.hl7.fhir.exceptions.DefinitionException;
|
import org.hl7.fhir.exceptions.DefinitionException;
|
||||||
|
@ -103,8 +99,6 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
protected TerminologyCache txCache;
|
protected TerminologyCache txCache;
|
||||||
|
|
||||||
private boolean tlogging = true;
|
private boolean tlogging = true;
|
||||||
private Locale locale;
|
|
||||||
private ResourceBundle i18Nmessages;
|
|
||||||
|
|
||||||
public BaseWorkerContext() throws FileNotFoundException, IOException, FHIRException {
|
public BaseWorkerContext() throws FileNotFoundException, IOException, FHIRException {
|
||||||
super();
|
super();
|
||||||
|
@ -1180,37 +1174,5 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Locale getLocale() {
|
|
||||||
if (Objects.nonNull(locale)){
|
|
||||||
return locale;
|
|
||||||
} else {
|
|
||||||
return Locale.US;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setLocale(Locale locale) {
|
|
||||||
this.locale = locale;
|
|
||||||
setValidationMessageLanguage(getLocale());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String formatMessage(String theMessage, Object... theMessageArguments) {
|
|
||||||
String message = theMessage;
|
|
||||||
if (Objects.nonNull(i18Nmessages) && i18Nmessages.containsKey(theMessage)) {
|
|
||||||
if (Objects.nonNull(theMessageArguments) && theMessageArguments.length > 0) {
|
|
||||||
message = MessageFormat.format(i18Nmessages.getString(theMessage), theMessageArguments);
|
|
||||||
} else {
|
|
||||||
message = i18Nmessages.getString(theMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setValidationMessageLanguage(Locale locale) {
|
|
||||||
i18Nmessages = ResourceBundle.getBundle("Messages", locale );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ package org.hl7.fhir.r4.context;
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -285,14 +284,6 @@ public interface IWorkerContext {
|
||||||
*/
|
*/
|
||||||
public ValueSetExpansionOutcome expandVS(ConceptSetComponent inc, boolean heirarchical) throws TerminologyServiceException;
|
public ValueSetExpansionOutcome expandVS(ConceptSetComponent inc, boolean heirarchical) throws TerminologyServiceException;
|
||||||
|
|
||||||
Locale getLocale();
|
|
||||||
|
|
||||||
void setLocale(Locale locale);
|
|
||||||
|
|
||||||
String formatMessage(String theMessage, Object... theMessageArguments);
|
|
||||||
|
|
||||||
void setValidationMessageLanguage(Locale locale);
|
|
||||||
|
|
||||||
public class ValidationResult {
|
public class ValidationResult {
|
||||||
private ConceptDefinitionComponent definition;
|
private ConceptDefinitionComponent definition;
|
||||||
private IssueSeverity severity;
|
private IssueSeverity severity;
|
||||||
|
|
|
@ -31,13 +31,13 @@ import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.ResourceBundle;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.exceptions.DefinitionException;
|
import org.hl7.fhir.exceptions.DefinitionException;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.exceptions.FHIRFormatError;
|
import org.hl7.fhir.exceptions.FHIRFormatError;
|
||||||
|
import org.hl7.fhir.r5.conformance.ProfileUtilities.BaseTypeSlice;
|
||||||
import org.hl7.fhir.r5.conformance.ProfileUtilities.ProfileKnowledgeProvider.BindingResolution;
|
import org.hl7.fhir.r5.conformance.ProfileUtilities.ProfileKnowledgeProvider.BindingResolution;
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext;
|
import org.hl7.fhir.r5.context.IWorkerContext;
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult;
|
import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult;
|
||||||
|
@ -95,7 +95,7 @@ import org.hl7.fhir.r5.utils.TranslatingUtilities;
|
||||||
import org.hl7.fhir.r5.utils.formats.CSVWriter;
|
import org.hl7.fhir.r5.utils.formats.CSVWriter;
|
||||||
import org.hl7.fhir.r5.utils.formats.XLSXWriter;
|
import org.hl7.fhir.r5.utils.formats.XLSXWriter;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
import org.hl7.fhir.utilities.TerminologyServiceOptions;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.VersionUtilities;
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationOptions;
|
import org.hl7.fhir.utilities.validation.ValidationOptions;
|
||||||
|
@ -266,7 +266,6 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
private boolean newSlicingProcessing;
|
private boolean newSlicingProcessing;
|
||||||
private String defWebRoot;
|
private String defWebRoot;
|
||||||
private boolean autoFixSliceNames;
|
private boolean autoFixSliceNames;
|
||||||
private ResourceBundle i18nMessages;
|
|
||||||
|
|
||||||
public ProfileUtilities(IWorkerContext context, List<ValidationMessage> messages, ProfileKnowledgeProvider pkp) {
|
public ProfileUtilities(IWorkerContext context, List<ValidationMessage> messages, ProfileKnowledgeProvider pkp) {
|
||||||
super();
|
super();
|
||||||
|
@ -299,20 +298,19 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface ProfileKnowledgeProvider {
|
public interface ProfileKnowledgeProvider {
|
||||||
class BindingResolution {
|
public class BindingResolution {
|
||||||
public String display;
|
public String display;
|
||||||
public String url;
|
public String url;
|
||||||
}
|
}
|
||||||
boolean isDatatype(String typeSimple);
|
public boolean isDatatype(String typeSimple);
|
||||||
boolean isResource(String typeSimple);
|
public boolean isResource(String typeSimple);
|
||||||
boolean hasLinkFor(String typeSimple);
|
public boolean hasLinkFor(String typeSimple);
|
||||||
String getLinkFor(String corePath, String typeSimple);
|
public String getLinkFor(String corePath, String typeSimple);
|
||||||
BindingResolution resolveBinding(StructureDefinition def,
|
public BindingResolution resolveBinding(StructureDefinition def, ElementDefinitionBindingComponent binding, String path) throws FHIRException;
|
||||||
ElementDefinitionBindingComponent binding, String path) throws FHIRException;
|
public BindingResolution resolveBinding(StructureDefinition def, String url, String path) throws FHIRException;
|
||||||
BindingResolution resolveBinding(StructureDefinition def, String url, String path) throws FHIRException;
|
public String getLinkForProfile(StructureDefinition profile, String url);
|
||||||
String getLinkForProfile(StructureDefinition profile, String url);
|
public boolean prependLinks();
|
||||||
boolean prependLinks();
|
public String getLinkForUrl(String corePath, String s);
|
||||||
String getLinkForUrl(String corePath, String s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -323,7 +321,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (element.getContentReference().equals("#"+e.getId()))
|
if (element.getContentReference().equals("#"+e.getId()))
|
||||||
return getChildMap(profile, e);
|
return getChildMap(profile, e);
|
||||||
}
|
}
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_NAME_REFERENCE__AT_PATH_, element.getContentReference(), element.getPath()));
|
throw new DefinitionException("Unable to resolve name reference "+element.getContentReference()+" at path "+element.getPath());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
List<ElementDefinition> res = new ArrayList<ElementDefinition>();
|
List<ElementDefinition> res = new ArrayList<ElementDefinition>();
|
||||||
|
@ -345,7 +343,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
|
|
||||||
public List<ElementDefinition> getSliceList(StructureDefinition profile, ElementDefinition element) throws DefinitionException {
|
public List<ElementDefinition> getSliceList(StructureDefinition profile, ElementDefinition element) throws DefinitionException {
|
||||||
if (!element.hasSlicing())
|
if (!element.hasSlicing())
|
||||||
throw new Error(context.formatMessage(I18nConstants.GETSLICELIST_SHOULD_ONLY_BE_CALLED_WHEN_THE_ELEMENT_HAS_SLICING));
|
throw new Error("getSliceList should only be called when the element has slicing");
|
||||||
|
|
||||||
List<ElementDefinition> res = new ArrayList<ElementDefinition>();
|
List<ElementDefinition> res = new ArrayList<ElementDefinition>();
|
||||||
List<ElementDefinition> elements = profile.getSnapshot().getElement();
|
List<ElementDefinition> elements = profile.getSnapshot().getElement();
|
||||||
|
@ -384,9 +382,9 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement();
|
List<ElementDefinition> list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement();
|
||||||
for (ElementDefinition e : list) {
|
for (ElementDefinition e : list) {
|
||||||
if (e == null)
|
if (e == null)
|
||||||
throw new Error(context.formatMessage(I18nConstants.ELEMENT__NULL_, profile.getUrl()));
|
throw new Error("element = null: "+profile.getUrl());
|
||||||
if (e.getId() == null)
|
if (e.getId() == null)
|
||||||
throw new Error(context.formatMessage(I18nConstants.ELEMENT_ID__NULL__ON_, e.toString(), profile.getUrl()));
|
throw new Error("element id = null: "+e.toString()+" on "+profile.getUrl());
|
||||||
|
|
||||||
if (!capturing && id!=null && e.getId().equals(id)) {
|
if (!capturing && id!=null && e.getId().equals(id)) {
|
||||||
capturing = true;
|
capturing = true;
|
||||||
|
@ -427,9 +425,9 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
|
|
||||||
public void updateMaps(StructureDefinition base, StructureDefinition derived) throws DefinitionException {
|
public void updateMaps(StructureDefinition base, StructureDefinition derived) throws DefinitionException {
|
||||||
if (base == null)
|
if (base == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NO_BASE_PROFILE_PROVIDED));
|
throw new DefinitionException("no base profile provided");
|
||||||
if (derived == null)
|
if (derived == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NO_DERIVED_STRUCTURE_PROVIDED));
|
throw new DefinitionException("no derived structure provided");
|
||||||
|
|
||||||
for (StructureDefinitionMappingComponent baseMap : base.getMapping()) {
|
for (StructureDefinitionMappingComponent baseMap : base.getMapping()) {
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
|
@ -460,30 +458,30 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
*/
|
*/
|
||||||
public void generateSnapshot(StructureDefinition base, StructureDefinition derived, String url, String webUrl, String profileName) throws DefinitionException, FHIRException {
|
public void generateSnapshot(StructureDefinition base, StructureDefinition derived, String url, String webUrl, String profileName) throws DefinitionException, FHIRException {
|
||||||
if (base == null) {
|
if (base == null) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NO_BASE_PROFILE_PROVIDED));
|
throw new DefinitionException("no base profile provided");
|
||||||
}
|
}
|
||||||
if (derived == null) {
|
if (derived == null) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NO_DERIVED_STRUCTURE_PROVIDED));
|
throw new DefinitionException("no derived structure provided");
|
||||||
}
|
}
|
||||||
checkNotGenerating(base, "Base for generating a snapshot for the profile "+derived.getUrl());
|
checkNotGenerating(base, "Base for generating a snapshot for the profile "+derived.getUrl());
|
||||||
checkNotGenerating(derived, "Focus for generating a snapshot");
|
checkNotGenerating(derived, "Focus for generating a snapshot");
|
||||||
derived.setUserData("profileutils.snapshot.generating", true);
|
derived.setUserData("profileutils.snapshot.generating", true);
|
||||||
|
|
||||||
if (!base.hasType()) {
|
if (!base.hasType()) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.BASE_PROFILE__HAS_NO_TYPE, base.getUrl()));
|
throw new DefinitionException("Base profile "+base.getUrl()+" has no type");
|
||||||
}
|
}
|
||||||
if (!derived.hasType()) {
|
if (!derived.hasType()) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.DERIVED_PROFILE__HAS_NO_TYPE, derived.getUrl()));
|
throw new DefinitionException("Derived profile "+derived.getUrl()+" has no type");
|
||||||
}
|
}
|
||||||
if (!derived.hasDerivation()) {
|
if (!derived.hasDerivation()) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.DERIVED_PROFILE__HAS_NO_DERIVATION_VALUE_AND_SO_CANT_BE_PROCESSED, derived.getUrl()));
|
throw new DefinitionException("Derived profile "+derived.getUrl()+" has no derivation value and so can't be processed");
|
||||||
}
|
}
|
||||||
if (!base.getType().equals(derived.getType()) && derived.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
if (!base.getType().equals(derived.getType()) && derived.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.BASE__DERIVED_PROFILES_HAVE_DIFFERENT_TYPES____VS___, base.getUrl(), base.getType(), derived.getUrl(), derived.getType()));
|
throw new DefinitionException("Base & Derived profiles have different types ("+base.getUrl()+" = "+base.getType()+" vs "+derived.getUrl()+" = "+derived.getType()+")");
|
||||||
}
|
}
|
||||||
|
|
||||||
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("Circular snapshot references detected; cannot generate snapshot (stack = "+snapshotStack.toString()+")");
|
||||||
}
|
}
|
||||||
snapshotStack.add(derived.getUrl());
|
snapshotStack.add(derived.getUrl());
|
||||||
|
|
||||||
|
@ -507,7 +505,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
int diffCursor = 0; // we need a diff cursor because we can only look ahead, in the bound scoped by longer paths
|
int diffCursor = 0; // we need a diff cursor because we can only look ahead, in the bound scoped by longer paths
|
||||||
|
|
||||||
if (derived.hasDifferential() && !derived.getDifferential().getElementFirstRep().getPath().contains(".") && !derived.getDifferential().getElementFirstRep().getType().isEmpty())
|
if (derived.hasDifferential() && !derived.getDifferential().getElementFirstRep().getPath().contains(".") && !derived.getDifferential().getElementFirstRep().getType().isEmpty())
|
||||||
throw new Error(context.formatMessage(I18nConstants.TYPE_ON_FIRST_DIFFERENTIAL_ELEMENT));
|
throw new Error("type on first differential element!");
|
||||||
|
|
||||||
for (ElementDefinition e : derived.getDifferential().getElement())
|
for (ElementDefinition e : derived.getDifferential().getElement())
|
||||||
e.clearUserData(GENERATED_IN_SNAPSHOT);
|
e.clearUserData(GENERATED_IN_SNAPSHOT);
|
||||||
|
@ -538,7 +536,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!derived.getSnapshot().getElementFirstRep().getType().isEmpty())
|
if (!derived.getSnapshot().getElementFirstRep().getType().isEmpty())
|
||||||
throw new Error(context.formatMessage(I18nConstants.TYPE_ON_FIRST_SNAPSHOT_ELEMENT_FOR__IN__FROM_, derived.getSnapshot().getElementFirstRep().getPath(), derived.getUrl(), base.getUrl()));
|
throw new Error("type on first snapshot element for "+derived.getSnapshot().getElementFirstRep().getPath()+" in "+derived.getUrl()+" from "+base.getUrl());
|
||||||
updateMaps(base, derived);
|
updateMaps(base, derived);
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
|
@ -555,7 +553,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
int ce = 0;
|
int ce = 0;
|
||||||
for (ElementDefinition e : diff.getElement()) {
|
for (ElementDefinition e : diff.getElement()) {
|
||||||
if (!e.hasUserData("diff-source"))
|
if (!e.hasUserData("diff-source"))
|
||||||
throw new Error(context.formatMessage(I18nConstants.UNXPECTED_INTERNAL_CONDITION__NO_SOURCE_ON_DIFF_ELEMENT));
|
throw new Error("Unxpected internal condition - no source on diff element");
|
||||||
else {
|
else {
|
||||||
if (e.hasUserData(DERIVATION_EQUALS))
|
if (e.hasUserData(DERIVATION_EQUALS))
|
||||||
((Base) e.getUserData("diff-source")).setUserData(DERIVATION_EQUALS, e.getUserData(DERIVATION_EQUALS));
|
((Base) e.getUserData("diff-source")).setUserData(DERIVATION_EQUALS, e.getUserData(DERIVATION_EQUALS));
|
||||||
|
@ -641,14 +639,14 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
for (ElementDefinition ed : elements) {
|
for (ElementDefinition ed : elements) {
|
||||||
if (!ed.hasPath()) {
|
if (!ed.hasPath()) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.NO_PATH_ON_ELEMENT_IN_DIFFERENTIAL_IN_, url));
|
throw new FHIRException("No path on element in differential in "+url);
|
||||||
}
|
}
|
||||||
String p = ed.getPath();
|
String p = ed.getPath();
|
||||||
if (p == null) {
|
if (p == null) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.NO_PATH_VALUE_ON_ELEMENT_IN_DIFFERENTIAL_IN_, url));
|
throw new FHIRException("No path value on element in differential in "+url);
|
||||||
}
|
}
|
||||||
if (!((first && type.equals(p)) || p.startsWith(type+"."))) {
|
if (!((first && type.equals(p)) || p.startsWith(type+"."))) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__MUST_START_WITH_, p, url, type, (first ? " (o be '"+type+"')" : "")));
|
throw new FHIRException("Illegal path '"+p+"' in differential in "+url+": must start with "+type+"."+(first ? " (o be '"+type+"')" : ""));
|
||||||
}
|
}
|
||||||
if (p.contains(".")) {
|
if (p.contains(".")) {
|
||||||
// Element names (the parts of a path delineated by the '.' character) SHALL NOT contain whitespace (i.e. Unicode characters marked as whitespace)
|
// Element names (the parts of a path delineated by the '.' character) SHALL NOT contain whitespace (i.e. Unicode characters marked as whitespace)
|
||||||
|
@ -658,25 +656,25 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
String[] pl = p.split("\\.");
|
String[] pl = p.split("\\.");
|
||||||
for (String pp : pl) {
|
for (String pp : pl) {
|
||||||
if (pp.length() < 1) {
|
if (pp.length() < 1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_MISING_, p, url));
|
throw new FHIRException("Illegal path '"+p+"' in differential in "+url+": name portion mising ('..')");
|
||||||
}
|
}
|
||||||
if (pp.length() > 64) {
|
if (pp.length() > 64) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_EXCEEDS_64_CHARS_IN_LENGTH, p, url));
|
throw new FHIRException("Illegal path '"+p+"' in differential in "+url+": name portion exceeds 64 chars in length");
|
||||||
}
|
}
|
||||||
for (char ch : pp.toCharArray()) {
|
for (char ch : pp.toCharArray()) {
|
||||||
if (Character.isWhitespace(ch)) {
|
if (Character.isWhitespace(ch)) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NO_UNICODE_WHITESPACE, p, url));
|
throw new FHIRException("Illegal path '"+p+"' in differential in "+url+": no unicode whitespace");
|
||||||
}
|
}
|
||||||
if (Utilities.existsInList(ch, ',', ':', ';', '\'', '"', '/', '|', '?', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}')) {
|
if (Utilities.existsInList(ch, ',', ':', ';', '\'', '"', '/', '|', '?', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}')) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTER_, p, url, ch));
|
throw new FHIRException("Illegal path '"+p+"' in differential in "+url+": illegal character '"+ch+"'");
|
||||||
}
|
}
|
||||||
if (ch < ' ' || ch > 'z') {
|
if (ch < ' ' || ch > 'z') {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTER_, p, url, ch));
|
throw new FHIRException("Illegal path '"+p+"' in differential in "+url+": illegal character '"+ch+"'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pp.contains("[") || pp.contains("]")) {
|
if (pp.contains("[") || pp.contains("]")) {
|
||||||
if (!pp.endsWith("[x]") || (pp.substring(0, pp.length()-3).contains("[") || (pp.substring(0, pp.length()-3).contains("]")))) {
|
if (!pp.endsWith("[x]") || (pp.substring(0, pp.length()-3).contains("[") || (pp.substring(0, pp.length()-3).contains("]")))) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTERS_, p, url));
|
throw new FHIRException("Illegal path '"+p+"' in differential in "+url+": illegal characters []");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -830,7 +828,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (resultPathBase == null)
|
if (resultPathBase == null)
|
||||||
resultPathBase = outcome.getPath();
|
resultPathBase = outcome.getPath();
|
||||||
else if (!outcome.getPath().startsWith(resultPathBase))
|
else if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH__OUTCOMEGETPATH___RESULTPATHBASE__, outcome.getPath(), resultPathBase));
|
throw new DefinitionException("Adding wrong path - outcome.getPath() = "+outcome.getPath()+", resultPathBase = "+resultPathBase);
|
||||||
result.getElement().add(outcome);
|
result.getElement().add(outcome);
|
||||||
if (hasInnerDiffMatches(differential, cpath, diffCursor, diffLimit, base.getElement(), true)) {
|
if (hasInnerDiffMatches(differential, cpath, diffCursor, diffLimit, base.getElement(), true)) {
|
||||||
// well, the profile walks into this, so we need to as well
|
// well, the profile walks into this, so we need to as well
|
||||||
|
@ -840,17 +838,17 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
baseCursor = indexOfFirstNonChild(base, currentBase, baseCursor+1, baseLimit);
|
baseCursor = indexOfFirstNonChild(base, currentBase, baseCursor+1, baseLimit);
|
||||||
} else {
|
} else {
|
||||||
if (outcome.getType().size() == 0) {
|
if (outcome.getType().size() == 0) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has no children ("+differential.getElement().get(diffCursor).getPath()+") and no types in profile "+profileName);
|
||||||
}
|
}
|
||||||
if (outcome.getType().size() > 1) {
|
if (outcome.getType().size() > 1) {
|
||||||
for (TypeRefComponent t : outcome.getType()) {
|
for (TypeRefComponent t : outcome.getType()) {
|
||||||
if (!t.getWorkingCode().equals("Reference"))
|
if (!t.getWorkingCode().equals("Reference"))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has children ("+differential.getElement().get(diffCursor).getPath()+") and multiple types ("+typeCode(outcome.getType())+") in profile "+profileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StructureDefinition dt = getProfileForDataType(outcome.getType().get(0));
|
StructureDefinition dt = getProfileForDataType(outcome.getType().get(0));
|
||||||
if (dt == null)
|
if (dt == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath()));
|
throw new DefinitionException("Unknown type "+outcome.getType().get(0)+" at "+diffMatches.get(0).getPath());
|
||||||
contextName = dt.getUrl();
|
contextName = dt.getUrl();
|
||||||
int start = diffCursor;
|
int start = diffCursor;
|
||||||
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+"."))
|
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+"."))
|
||||||
|
@ -870,7 +868,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (!sd.hasSnapshot()) {
|
if (!sd.hasSnapshot()) {
|
||||||
StructureDefinition sdb = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
StructureDefinition sdb = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
||||||
if (sdb == null)
|
if (sdb == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_BASE__FOR_, sd.getBaseDefinition(), sd.getUrl()));
|
throw new DefinitionException("Unable to find base "+sd.getBaseDefinition()+" for "+sd.getUrl());
|
||||||
checkNotGenerating(sdb, "an extension base");
|
checkNotGenerating(sdb, "an extension base");
|
||||||
generateSnapshot(sdb, sd, sd.getUrl(), (sdb.hasUserData("path")) ? Utilities.extractBaseUrl(sdb.getUserString("path")) : webUrl, sd.getName());
|
generateSnapshot(sdb, sd, sd.getUrl(), (sdb.hasUserData("path")) ? Utilities.extractBaseUrl(sdb.getUserString("path")) : webUrl, sd.getName());
|
||||||
}
|
}
|
||||||
|
@ -883,7 +881,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
src = t;
|
src = t;
|
||||||
}
|
}
|
||||||
if (src == null)
|
if (src == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_ELEMENT__IN_, eid, p.getValue()));
|
throw new DefinitionException("Unable to find element "+eid+" in "+p.getValue());
|
||||||
} else
|
} else
|
||||||
src = sd.getSnapshot().getElement().get(0);
|
src = sd.getSnapshot().getElement().get(0);
|
||||||
template = src.copy().setPath(currentBase.getPath());
|
template = src.copy().setPath(currentBase.getPath());
|
||||||
|
@ -916,7 +914,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (resultPathBase == null)
|
if (resultPathBase == null)
|
||||||
resultPathBase = outcome.getPath();
|
resultPathBase = outcome.getPath();
|
||||||
else if (!outcome.getPath().startsWith(resultPathBase))
|
else if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
throw new DefinitionException("Adding wrong path");
|
||||||
result.getElement().add(outcome);
|
result.getElement().add(outcome);
|
||||||
baseCursor++;
|
baseCursor++;
|
||||||
diffCursor = differential.getElement().indexOf(diffMatches.get(0))+1;
|
diffCursor = differential.getElement().indexOf(diffMatches.get(0))+1;
|
||||||
|
@ -943,7 +941,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (ed != diffMatches.get(0) && !ed.getPath().endsWith(".extension"))
|
if (ed != diffMatches.get(0) && !ed.getPath().endsWith(".extension"))
|
||||||
nonExtension = true;
|
nonExtension = true;
|
||||||
if (nonExtension)
|
if (nonExtension)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has children ("+differential.getElement().get(diffCursor).getPath()+") and multiple types ("+typeCode(outcome.getType())+") in profile "+profileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -953,7 +951,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (outcome.hasContentReference()) {
|
if (outcome.hasContentReference()) {
|
||||||
ElementDefinition tgt = getElementById(base.getElement(), outcome.getContentReference());
|
ElementDefinition tgt = getElementById(base.getElement(), outcome.getContentReference());
|
||||||
if (tgt == null)
|
if (tgt == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_REFERENCE_TO_, outcome.getContentReference()));
|
throw new DefinitionException("Unable to resolve reference to "+outcome.getContentReference());
|
||||||
replaceFromContentReference(outcome, tgt);
|
replaceFromContentReference(outcome, tgt);
|
||||||
int nbc = base.getElement().indexOf(tgt)+1;
|
int nbc = base.getElement().indexOf(tgt)+1;
|
||||||
int nbl = nbc;
|
int nbl = nbc;
|
||||||
|
@ -963,7 +961,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
} else {
|
} else {
|
||||||
StructureDefinition dt = outcome.getType().size() == 1 ? getProfileForDataType(outcome.getType().get(0)) : getProfileForDataType("Element");
|
StructureDefinition dt = outcome.getType().size() == 1 ? getProfileForDataType(outcome.getType().get(0)) : getProfileForDataType("Element");
|
||||||
if (dt == null)
|
if (dt == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has children ("+differential.getElement().get(diffCursor).getPath()+") for type "+typeCode(outcome.getType())+" in profile "+profileName+", but can't find type");
|
||||||
contextName = dt.getUrl();
|
contextName = dt.getUrl();
|
||||||
processPaths(indent+" ", result, dt.getSnapshot(), differential, 1 /* starting again on the data type, but skip the root */, start, dt.getSnapshot().getElement().size()-1,
|
processPaths(indent+" ", result, dt.getSnapshot(), differential, 1 /* starting again on the data type, but skip the root */, start, dt.getSnapshot().getElement().size()-1,
|
||||||
diffCursor - 1, url, getWebUrl(dt, webUrl, indent), profileName+pathTail(diffMatches, 0), diffMatches.get(0).getPath(), outcome.getPath(), trimDifferential, contextName, resultPathBase, false, null, new ArrayList<ElementRedirection>(), srcSD);
|
diffCursor - 1, url, getWebUrl(dt, webUrl, indent), profileName+pathTail(diffMatches, 0), diffMatches.get(0).getPath(), outcome.getPath(), trimDifferential, contextName, resultPathBase, false, null, new ArrayList<ElementRedirection>(), srcSD);
|
||||||
|
@ -1013,18 +1011,18 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
|
|
||||||
if (diffMatches.get(0).getSlicing().hasOrdered()) {
|
if (diffMatches.get(0).getSlicing().hasOrdered()) {
|
||||||
if (diffMatches.get(0).getSlicing().getOrdered()) {
|
if (diffMatches.get(0).getSlicing().getOrdered()) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGORDERED__TRUE, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.ordered = true");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (diffMatches.get(0).getSlicing().hasDiscriminator()) {
|
if (diffMatches.get(0).getSlicing().hasDiscriminator()) {
|
||||||
if (diffMatches.get(0).getSlicing().getDiscriminator().size() != 1) {
|
if (diffMatches.get(0).getSlicing().getDiscriminator().size() != 1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORCOUNT__1, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.discriminator.count() > 1");
|
||||||
}
|
}
|
||||||
if (diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getType() != DiscriminatorType.TYPE) {
|
if (diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getType() != DiscriminatorType.TYPE) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORTYPE__TYPE, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.discriminator.type != 'type'");
|
||||||
}
|
}
|
||||||
if (!"$this".equals(diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getPath())) {
|
if (!"$this".equals(diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getPath())) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORPATH__THIS, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.discriminator.path != '$this'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check the slice names too while we're at it...
|
// check the slice names too while we're at it...
|
||||||
|
@ -1037,14 +1035,14 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (autoFixSliceNames) {
|
if (autoFixSliceNames) {
|
||||||
ts.defn.setSliceName(tn);
|
ts.defn.setSliceName(tn);
|
||||||
} else {
|
} else {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.getSliceName()));
|
throw new FHIRException("Error at path "+(!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath)+": Slice name must be '"+tn+"' but is '"+ts.defn.getSliceName()+"'");
|
||||||
}
|
}
|
||||||
} if (!ts.defn.hasType()) {
|
} if (!ts.defn.hasType()) {
|
||||||
ts.defn.addType().setCode(ts.type);
|
ts.defn.addType().setCode(ts.type);
|
||||||
} else if (ts.defn.getType().size() > 1) {
|
} else if (ts.defn.getType().size() > 1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_MORE_THAN_ONE_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary()));
|
throw new FHIRException("Error at path "+(!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath)+": Slice for type '"+tn+"' has more than one type '"+ts.defn.typeSummary()+"'");
|
||||||
} else if (!ts.defn.getType().get(0).getCode().equals(ts.type)) {
|
} else if (!ts.defn.getType().get(0).getCode().equals(ts.type)) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_WRONG_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary()));
|
throw new FHIRException("Error at path "+(!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath)+": Slice for type '"+tn+"' has wrong type '"+ts.defn.typeSummary()+"'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1054,7 +1052,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst,
|
ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst,
|
||||||
trimDifferential, contextName, resultPathBase, true, null, redirector, srcSD);
|
trimDifferential, contextName, resultPathBase, true, null, redirector, srcSD);
|
||||||
if (e==null)
|
if (e==null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.DID_NOT_FIND_TYPE_ROOT_, diffMatches.get(0).getPath()));
|
throw new FHIRException("Did not find type root: " + diffMatches.get(0).getPath());
|
||||||
// now set up slicing on the e (cause it was wiped by what we called.
|
// now set up slicing on the e (cause it was wiped by what we called.
|
||||||
e.setSlicing(new ElementDefinitionSlicingComponent());
|
e.setSlicing(new ElementDefinitionSlicingComponent());
|
||||||
e.getSlicing().addDiscriminator().setType(DiscriminatorType.TYPE).setPath("$this");
|
e.getSlicing().addDiscriminator().setType(DiscriminatorType.TYPE).setPath("$this");
|
||||||
|
@ -1069,7 +1067,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
// our processing scope for the differential is the item in the list, and all the items before the next one in the list
|
// our processing scope for the differential is the item in the list, and all the items before the next one in the list
|
||||||
if (diffMatches.get(i).getMin() > 0) {
|
if (diffMatches.get(i).getMin() > 0) {
|
||||||
if (diffMatches.size() > i+1) {
|
if (diffMatches.size() > i+1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName()));
|
throw new FHIRException("Invalid slicing : there is more than one type slice at "+diffMatches.get(i).getPath()+", but one of them ("+diffMatches.get(i).getSliceName()+") has min = 1, so the other slices cannot exist");
|
||||||
} else {
|
} else {
|
||||||
e.setMin(1);
|
e.setMin(1);
|
||||||
}
|
}
|
||||||
|
@ -1101,9 +1099,9 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (!unbounded(currentBase) && !isSlicedToOneOnly(diffMatches.get(0)))
|
if (!unbounded(currentBase) && !isSlicedToOneOnly(diffMatches.get(0)))
|
||||||
// you can only slice an element that doesn't repeat if the sum total of your slices is limited to 1
|
// you can only slice an element that doesn't repeat if the sum total of your slices is limited to 1
|
||||||
// (but you might do that in order to split up constraints by type)
|
// (but you might do that in order to split up constraints by type)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ATTEMPT_TO_A_SLICE_AN_ELEMENT_THAT_DOES_NOT_REPEAT__FROM__IN_, currentBase.getPath(), currentBase.getPath(), contextName, url));
|
throw new DefinitionException("Attempt to a slice an element that does not repeat: "+currentBase.getPath()+"/"+currentBase.getPath()+" from "+contextName+" in "+url);
|
||||||
if (!diffMatches.get(0).hasSlicing() && !isExtension(currentBase)) // well, the diff has set up a slice, but hasn't defined it. this is an error
|
if (!diffMatches.get(0).hasSlicing() && !isExtension(currentBase)) // well, the diff has set up a slice, but hasn't defined it. this is an error
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.DIFFERENTIAL_DOES_NOT_HAVE_A_SLICE__B_OF_____IN_PROFILE_, currentBase.getPath(), baseCursor, baseLimit, diffCursor, diffLimit, url));
|
throw new DefinitionException("Differential does not have a slice: "+currentBase.getPath()+"/ (b:"+baseCursor+" of "+ baseLimit+" / "+ diffCursor +"/ "+diffLimit+") in profile "+url);
|
||||||
|
|
||||||
// well, if it passed those preconditions then we slice the dest.
|
// well, if it passed those preconditions then we slice the dest.
|
||||||
int start = 0;
|
int start = 0;
|
||||||
|
@ -1115,7 +1113,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst,
|
ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst,
|
||||||
trimDifferential, contextName, resultPathBase, true, null, redirector, srcSD);
|
trimDifferential, contextName, resultPathBase, true, null, redirector, srcSD);
|
||||||
if (e==null)
|
if (e==null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.DID_NOT_FIND_SINGLE_SLICE_, diffMatches.get(0).getPath()));
|
throw new FHIRException("Did not find single slice: " + diffMatches.get(0).getPath());
|
||||||
e.setSlicing(diffMatches.get(0).getSlicing());
|
e.setSlicing(diffMatches.get(0).getSlicing());
|
||||||
start++;
|
start++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1129,7 +1127,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
else
|
else
|
||||||
outcome.setSlicing(diffMatches.get(0).getSlicing().copy());
|
outcome.setSlicing(diffMatches.get(0).getSlicing().copy());
|
||||||
if (!outcome.getPath().startsWith(resultPathBase))
|
if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
throw new DefinitionException("Adding wrong path");
|
||||||
result.getElement().add(outcome);
|
result.getElement().add(outcome);
|
||||||
|
|
||||||
// differential - if the first one in the list has a name, we'll process it. Else we'll treat it as the base definition of the slice.
|
// differential - if the first one in the list has a name, we'll process it. Else we'll treat it as the base definition of the slice.
|
||||||
|
@ -1137,7 +1135,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
updateFromDefinition(outcome, diffMatches.get(0), profileName, trimDifferential, url, srcSD);
|
updateFromDefinition(outcome, diffMatches.get(0), profileName, trimDifferential, url, srcSD);
|
||||||
removeStatusExtensions(outcome);
|
removeStatusExtensions(outcome);
|
||||||
if (!outcome.hasContentReference() && !outcome.hasType()) {
|
if (!outcome.hasContentReference() && !outcome.hasType()) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NOT_DONE_YET));
|
throw new DefinitionException("not done yet");
|
||||||
}
|
}
|
||||||
start++;
|
start++;
|
||||||
// result.getElement().remove(result.getElement().size()-1);
|
// result.getElement().remove(result.getElement().size()-1);
|
||||||
|
@ -1186,7 +1184,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (resultPathBase == null)
|
if (resultPathBase == null)
|
||||||
resultPathBase = outcome.getPath();
|
resultPathBase = outcome.getPath();
|
||||||
else if (!outcome.getPath().startsWith(resultPathBase))
|
else if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
throw new DefinitionException("Adding wrong path");
|
||||||
result.getElement().add(outcome);
|
result.getElement().add(outcome);
|
||||||
// the profile walks into this, so we need to as well
|
// the profile walks into this, so we need to as well
|
||||||
// did we implicitly step into a new type?
|
// did we implicitly step into a new type?
|
||||||
|
@ -1195,17 +1193,17 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
baseCursor = indexOfFirstNonChild(base, currentBase, baseCursor, baseLimit);
|
baseCursor = indexOfFirstNonChild(base, currentBase, baseCursor, baseLimit);
|
||||||
} else {
|
} else {
|
||||||
if (outcome.getType().size() == 0) {
|
if (outcome.getType().size() == 0) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has no children ("+differential.getElement().get(diffCursor).getPath()+") and no types in profile "+profileName);
|
||||||
}
|
}
|
||||||
if (outcome.getType().size() > 1) {
|
if (outcome.getType().size() > 1) {
|
||||||
for (TypeRefComponent t : outcome.getType()) {
|
for (TypeRefComponent t : outcome.getType()) {
|
||||||
if (!t.getWorkingCode().equals("Reference"))
|
if (!t.getWorkingCode().equals("Reference"))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has children ("+differential.getElement().get(diffCursor).getPath()+") and multiple types ("+typeCode(outcome.getType())+") in profile "+profileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StructureDefinition dt = getProfileForDataType(outcome.getType().get(0));
|
StructureDefinition dt = getProfileForDataType(outcome.getType().get(0));
|
||||||
if (dt == null)
|
if (dt == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath()));
|
throw new DefinitionException("Unknown type "+outcome.getType().get(0)+" at "+diffMatches.get(0).getPath());
|
||||||
contextName = dt.getUrl();
|
contextName = dt.getUrl();
|
||||||
int start = diffCursor;
|
int start = diffCursor;
|
||||||
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+"."))
|
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+"."))
|
||||||
|
@ -1221,7 +1219,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
ElementDefinition outcome = updateURLs(url, webUrl, base.getElement().get(baseCursor).copy());
|
ElementDefinition outcome = updateURLs(url, webUrl, base.getElement().get(baseCursor).copy());
|
||||||
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
||||||
if (!outcome.getPath().startsWith(resultPathBase))
|
if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH_IN_PROFILE___VS_, profileName, outcome.getPath(), resultPathBase));
|
throw new DefinitionException("Adding wrong path in profile " + profileName + ": "+outcome.getPath()+" vs " + resultPathBase);
|
||||||
result.getElement().add(outcome); // so we just copy it in
|
result.getElement().add(outcome); // so we just copy it in
|
||||||
baseCursor++;
|
baseCursor++;
|
||||||
}
|
}
|
||||||
|
@ -1269,18 +1267,18 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
|
|
||||||
if (diffMatches.get(0).getSlicing().hasOrdered()) {
|
if (diffMatches.get(0).getSlicing().hasOrdered()) {
|
||||||
if (diffMatches.get(0).getSlicing().getOrdered()) {
|
if (diffMatches.get(0).getSlicing().getOrdered()) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGORDERED__TRUE, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.ordered = true");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (diffMatches.get(0).getSlicing().hasDiscriminator()) {
|
if (diffMatches.get(0).getSlicing().hasDiscriminator()) {
|
||||||
if (diffMatches.get(0).getSlicing().getDiscriminator().size() != 1) {
|
if (diffMatches.get(0).getSlicing().getDiscriminator().size() != 1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORCOUNT__1, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.discriminator.count() > 1");
|
||||||
}
|
}
|
||||||
if (diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getType() != DiscriminatorType.TYPE) {
|
if (diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getType() != DiscriminatorType.TYPE) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORTYPE__TYPE, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.discriminator.type != 'type'");
|
||||||
}
|
}
|
||||||
if (!"$this".equals(diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getPath())) {
|
if (!"$this".equals(diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getPath())) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORPATH__THIS, cpath, url));
|
throw new FHIRException("Error at path "+cpath+" in "+url+": Type slicing with slicing.discriminator.path != '$this'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check the slice names too while we're at it...
|
// check the slice names too while we're at it...
|
||||||
|
@ -1290,13 +1288,13 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (!ts.defn.hasSliceName()) {
|
if (!ts.defn.hasSliceName()) {
|
||||||
ts.defn.setSliceName(tn);
|
ts.defn.setSliceName(tn);
|
||||||
} else if (!ts.defn.getSliceName().equals(tn)) {
|
} else if (!ts.defn.getSliceName().equals(tn)) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.getSliceName()));
|
throw new FHIRException("Error at path "+(!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath)+": Slice name must be '"+tn+"' but is '"+ts.defn.getSliceName()+"'");
|
||||||
} if (!ts.defn.hasType()) {
|
} if (!ts.defn.hasType()) {
|
||||||
ts.defn.addType().setCode(ts.type);
|
ts.defn.addType().setCode(ts.type);
|
||||||
} else if (ts.defn.getType().size() > 1) {
|
} else if (ts.defn.getType().size() > 1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_MORE_THAN_ONE_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary()));
|
throw new FHIRException("Error at path "+(!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath)+": Slice for type '"+tn+"' has more than one type '"+ts.defn.typeSummary()+"'");
|
||||||
} else if (!ts.defn.getType().get(0).getCode().equals(ts.type)) {
|
} else if (!ts.defn.getType().get(0).getCode().equals(ts.type)) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_WRONG_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary()));
|
throw new FHIRException("Error at path "+(!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath)+": Slice for type '"+tn+"' has wrong type '"+ts.defn.typeSummary()+"'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1306,7 +1304,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst,
|
ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst,
|
||||||
trimDifferential, contextName, resultPathBase, true, cpath, redirector, srcSD);
|
trimDifferential, contextName, resultPathBase, true, cpath, redirector, srcSD);
|
||||||
if (e==null)
|
if (e==null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.DID_NOT_FIND_TYPE_ROOT_, diffMatches.get(0).getPath()));
|
throw new FHIRException("Did not find type root: " + diffMatches.get(0).getPath());
|
||||||
// now set up slicing on the e (cause it was wiped by what we called.
|
// now set up slicing on the e (cause it was wiped by what we called.
|
||||||
e.setSlicing(new ElementDefinitionSlicingComponent());
|
e.setSlicing(new ElementDefinitionSlicingComponent());
|
||||||
e.getSlicing().addDiscriminator().setType(DiscriminatorType.TYPE).setPath("$this");
|
e.getSlicing().addDiscriminator().setType(DiscriminatorType.TYPE).setPath("$this");
|
||||||
|
@ -1323,7 +1321,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
// our processing scope for the differential is the item in the list, and all the items before the next one in the list
|
// our processing scope for the differential is the item in the list, and all the items before the next one in the list
|
||||||
if (diffMatches.get(i).getMin() > 0) {
|
if (diffMatches.get(i).getMin() > 0) {
|
||||||
if (diffMatches.size() > i+1) {
|
if (diffMatches.size() > i+1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName()));
|
throw new FHIRException("Invalid slicing : there is more than one type slice at "+diffMatches.get(i).getPath()+", but one of them ("+diffMatches.get(i).getSliceName()+") has min = 1, so the other slices cannot exist");
|
||||||
}
|
}
|
||||||
fixedType = type;
|
fixedType = type;
|
||||||
}
|
}
|
||||||
|
@ -1375,11 +1373,11 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
ElementDefinitionSlicingComponent dSlice = diffMatches.get(0).getSlicing();
|
ElementDefinitionSlicingComponent dSlice = diffMatches.get(0).getSlicing();
|
||||||
ElementDefinitionSlicingComponent bSlice = currentBase.getSlicing();
|
ElementDefinitionSlicingComponent bSlice = currentBase.getSlicing();
|
||||||
if (dSlice.hasOrderedElement() && bSlice.hasOrderedElement() && !orderMatches(dSlice.getOrderedElement(), bSlice.getOrderedElement()))
|
if (dSlice.hasOrderedElement() && bSlice.hasOrderedElement() && !orderMatches(dSlice.getOrderedElement(), bSlice.getOrderedElement()))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___ORDER___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName));
|
throw new DefinitionException("Slicing rules on differential ("+summarizeSlicing(dSlice)+") do not match those on base ("+summarizeSlicing(bSlice)+") - order @ "+path+" ("+contextName+")");
|
||||||
if (!discriminatorMatches(dSlice.getDiscriminator(), bSlice.getDiscriminator()))
|
if (!discriminatorMatches(dSlice.getDiscriminator(), bSlice.getDiscriminator()))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___DISCIMINATOR___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName));
|
throw new DefinitionException("Slicing rules on differential ("+summarizeSlicing(dSlice)+") do not match those on base ("+summarizeSlicing(bSlice)+") - disciminator @ "+path+" ("+contextName+")");
|
||||||
if (!currentBase.isChoice() && !ruleMatches(dSlice.getRules(), bSlice.getRules()))
|
if (!currentBase.isChoice() && !ruleMatches(dSlice.getRules(), bSlice.getRules()))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___RULE___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName));
|
throw new DefinitionException("Slicing rules on differential ("+summarizeSlicing(dSlice)+") do not match those on base ("+summarizeSlicing(bSlice)+") - rule @ "+path+" ("+contextName+")");
|
||||||
}
|
}
|
||||||
ElementDefinition outcome = updateURLs(url, webUrl, currentBase.copy());
|
ElementDefinition outcome = updateURLs(url, webUrl, currentBase.copy());
|
||||||
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
||||||
|
@ -1403,11 +1401,11 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
int ndl = findEndOfElement(differential, ndx);
|
int ndl = findEndOfElement(differential, ndx);
|
||||||
if (nbl == baseCursor) {
|
if (nbl == baseCursor) {
|
||||||
if (base.getElement().get(baseCursor).getType().size() != 1) {
|
if (base.getElement().get(baseCursor).getType().size() != 1) {
|
||||||
throw new Error(context.formatMessage(I18nConstants.DIFFERENTIAL_WALKS_INTO____BUT_THE_BASE_DOES_NOT_AND_THERE_IS_NOT_A_SINGLE_FIXED_TYPE_THE_TYPE_IS__THIS_IS_NOT_HANDLED_YET, cpath, diffMatches.get(0).toString(), base.getElement().get(baseCursor).typeSummary()));
|
throw new Error("Differential walks into '"+cpath+" (@ "+diffMatches.get(0).toString()+")', but the base does not, and there is not a single fixed type. The type is "+base.getElement().get(baseCursor).typeSummary()+". This is not handled yet");
|
||||||
}
|
}
|
||||||
StructureDefinition dt = getProfileForDataType(base.getElement().get(baseCursor).getType().get(0));
|
StructureDefinition dt = getProfileForDataType(base.getElement().get(baseCursor).getType().get(0));
|
||||||
if (dt == null) {
|
if (dt == null) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath()));
|
throw new DefinitionException("Unknown type "+outcome.getType().get(0)+" at "+diffMatches.get(0).getPath());
|
||||||
}
|
}
|
||||||
contextName = dt.getUrl();
|
contextName = dt.getUrl();
|
||||||
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+"."))
|
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+"."))
|
||||||
|
@ -1438,7 +1436,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
||||||
outcome.setSlicing(null);
|
outcome.setSlicing(null);
|
||||||
if (!outcome.getPath().startsWith(resultPathBase))
|
if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
throw new DefinitionException("Adding wrong path");
|
||||||
if (diffpos < diffMatches.size() && diffMatches.get(diffpos).hasSliceName() && diffMatches.get(diffpos).getSliceName().equals(outcome.getSliceName())) {
|
if (diffpos < diffMatches.size() && diffMatches.get(diffpos).hasSliceName() && diffMatches.get(diffpos).getSliceName().equals(outcome.getSliceName())) {
|
||||||
// if there's a diff, we update the outcome with diff
|
// if there's a diff, we update the outcome with diff
|
||||||
// no? updateFromDefinition(outcome, diffMatches.get(diffpos), profileName, closed, url);
|
// no? updateFromDefinition(outcome, diffMatches.get(diffpos), profileName, closed, url);
|
||||||
|
@ -1460,7 +1458,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
outcome = updateURLs(url, webUrl, base.getElement().get(baseCursor).copy());
|
outcome = updateURLs(url, webUrl, base.getElement().get(baseCursor).copy());
|
||||||
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
||||||
if (!outcome.getPath().startsWith(resultPathBase))
|
if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
throw new DefinitionException("Adding wrong path");
|
||||||
result.getElement().add(outcome);
|
result.getElement().add(outcome);
|
||||||
baseCursor++;
|
baseCursor++;
|
||||||
}
|
}
|
||||||
|
@ -1475,7 +1473,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (currentBase.getPath().endsWith("[x]")) {
|
if (currentBase.getPath().endsWith("[x]")) {
|
||||||
checkImplicitTypes = true;
|
checkImplicitTypes = true;
|
||||||
} else {
|
} else {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.THE_BASE_SNAPSHOT_MARKS_A_SLICING_AS_CLOSED_BUT_THE_DIFFERENTIAL_TRIES_TO_EXTEND_IT_IN__AT__, profileName, path, cpath));
|
throw new DefinitionException("The base snapshot marks a slicing as closed, but the differential tries to extend it in "+profileName+" at "+path+" ("+cpath+")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (diffpos == diffMatches.size()) {
|
if (diffpos == diffMatches.size()) {
|
||||||
|
@ -1486,14 +1484,14 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
ElementDefinition diffItem = diffMatches.get(diffpos);
|
ElementDefinition diffItem = diffMatches.get(diffpos);
|
||||||
for (ElementDefinition baseItem : baseMatches)
|
for (ElementDefinition baseItem : baseMatches)
|
||||||
if (baseItem.getSliceName().equals(diffItem.getSliceName()))
|
if (baseItem.getSliceName().equals(diffItem.getSliceName()))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NAMED_ITEMS_ARE_OUT_OF_ORDER_IN_THE_SLICE));
|
throw new DefinitionException("Named items are out of order in the slice");
|
||||||
outcome = updateURLs(url, webUrl, currentBase.copy());
|
outcome = updateURLs(url, webUrl, currentBase.copy());
|
||||||
// outcome = updateURLs(url, diffItem.copy());
|
// outcome = updateURLs(url, diffItem.copy());
|
||||||
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc));
|
||||||
updateFromBase(outcome, currentBase);
|
updateFromBase(outcome, currentBase);
|
||||||
outcome.setSlicing(null);
|
outcome.setSlicing(null);
|
||||||
if (!outcome.getPath().startsWith(resultPathBase))
|
if (!outcome.getPath().startsWith(resultPathBase))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH));
|
throw new DefinitionException("Adding wrong path");
|
||||||
result.getElement().add(outcome);
|
result.getElement().add(outcome);
|
||||||
updateFromDefinition(outcome, diffItem, profileName, trimDifferential, url, srcSD);
|
updateFromDefinition(outcome, diffItem, profileName, trimDifferential, url, srcSD);
|
||||||
removeStatusExtensions(outcome);
|
removeStatusExtensions(outcome);
|
||||||
|
@ -1505,7 +1503,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (outcome.getType().size() > 1)
|
if (outcome.getType().size() > 1)
|
||||||
for (TypeRefComponent t : outcome.getType()) {
|
for (TypeRefComponent t : outcome.getType()) {
|
||||||
if (!t.getCode().equals("Reference"))
|
if (!t.getCode().equals("Reference"))
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has children ("+differential.getElement().get(diffCursor).getPath()+") and multiple types ("+typeCode(outcome.getType())+") in profile "+profileName);
|
||||||
}
|
}
|
||||||
TypeRefComponent t = outcome.getType().get(0);
|
TypeRefComponent t = outcome.getType().get(0);
|
||||||
if (t.getCode().equals("BackboneElement")) {
|
if (t.getCode().equals("BackboneElement")) {
|
||||||
|
@ -1525,7 +1523,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
// lloydfix dt =
|
// lloydfix dt =
|
||||||
// }
|
// }
|
||||||
if (dt == null)
|
if (dt == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName));
|
throw new DefinitionException(diffMatches.get(0).getPath()+" has children ("+differential.getElement().get(diffCursor).getPath()+") for type "+typeCode(outcome.getType())+" in profile "+profileName+", but can't find type");
|
||||||
contextName = dt.getUrl();
|
contextName = dt.getUrl();
|
||||||
int start = diffCursor;
|
int start = diffCursor;
|
||||||
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), diffMatches.get(0).getPath()+"."))
|
while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), diffMatches.get(0).getPath()+"."))
|
||||||
|
@ -1549,7 +1547,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
for (ElementDefinition e : result.getElement()) {
|
for (ElementDefinition e : result.getElement()) {
|
||||||
i++;
|
i++;
|
||||||
if (e.hasMinElement() && e.getMinElement().getValue()==null)
|
if (e.hasMinElement() && e.getMinElement().getValue()==null)
|
||||||
throw new Error(context.formatMessage(I18nConstants.NULL_MIN));
|
throw new Error("null min");
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1557,7 +1555,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
|
|
||||||
private void checkNotGenerating(StructureDefinition sd, String role) {
|
private void checkNotGenerating(StructureDefinition sd, String role) {
|
||||||
if (sd.hasUserData("profileutils.snapshot.generating")) {
|
if (sd.hasUserData("profileutils.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("Attempt to use a snapshot on profile '"+sd.getUrl()+"' as "+role+" before it is generated");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1582,12 +1580,12 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
} else if (isPrimitive(Utilities.uncapitalize(t))) {
|
} else if (isPrimitive(Utilities.uncapitalize(t))) {
|
||||||
fixedType = Utilities.uncapitalize(t);
|
fixedType = Utilities.uncapitalize(t);
|
||||||
} else {
|
} else {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__10_AND_IMPLICIT_SLICE_NAME_DOES_NOT_CONTAIN_A_VALID_TYPE__AT_, t, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName()));
|
throw new FHIRException("Unexpected condition in differential: type-slice.type-list.size() == 10 and implicit slice name does not contain a valid type ('"+t+"'?) at "+diffMatches.get(i).getPath()+"/"+diffMatches.get(i).getSliceName());
|
||||||
}
|
}
|
||||||
} else if (diffMatches.get(i).getType().size() == 1) {
|
} else if (diffMatches.get(i).getType().size() == 1) {
|
||||||
fixedType = diffMatches.get(i).getType().get(0).getCode();
|
fixedType = diffMatches.get(i).getType().get(0).getCode();
|
||||||
} else {
|
} else {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__1_AT_, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName()));
|
throw new FHIRException("Unexpected condition in differential: type-slice.type-list.size() != 1 at "+diffMatches.get(i).getPath()+"/"+diffMatches.get(i).getSliceName());
|
||||||
}
|
}
|
||||||
return fixedType;
|
return fixedType;
|
||||||
}
|
}
|
||||||
|
@ -2462,7 +2460,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (derived.hasIsSummaryElement()) {
|
if (derived.hasIsSummaryElement()) {
|
||||||
if (!Base.compareDeep(derived.getIsSummaryElement(), base.getIsSummaryElement(), false)) {
|
if (!Base.compareDeep(derived.getIsSummaryElement(), base.getIsSummaryElement(), false)) {
|
||||||
if (base.hasIsSummary())
|
if (base.hasIsSummary())
|
||||||
throw new Error(context.formatMessage(I18nConstants.ERROR_IN_PROFILE__AT__BASE_ISSUMMARY___DERIVED_ISSUMMARY__, pn, derived.getPath(), base.getIsSummaryElement().asStringValue(), derived.getIsSummaryElement().asStringValue()));
|
throw new Error("Error in profile "+pn+" at "+derived.getPath()+": Base isSummary = "+base.getIsSummaryElement().asStringValue()+", derived isSummary = "+derived.getIsSummaryElement().asStringValue());
|
||||||
base.setIsSummaryElement(derived.getIsSummaryElement().copy());
|
base.setIsSummaryElement(derived.getIsSummaryElement().copy());
|
||||||
} else if (trimDifferential)
|
} else if (trimDifferential)
|
||||||
derived.setIsSummaryElement(null);
|
derived.setIsSummaryElement(null);
|
||||||
|
@ -2608,7 +2606,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
}
|
}
|
||||||
if (!tgtOk) {
|
if (!tgtOk) {
|
||||||
if (messages == null) {
|
if (messages == null) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT__THE_TARGET_PROFILE__IS_NOT__VALID_CONSTRAINT_ON_THE_BASE_, purl, derived.getPath(), url, td.getTargetProfile()));
|
throw new FHIRException("Error at "+purl+"#"+derived.getPath()+": The target profile "+url+" is not valid constraint on the base ("+td.getTargetProfile()+")");
|
||||||
} else {
|
} else {
|
||||||
messages.add(new ValidationMessage(Source.InstanceValidator, IssueType.BUSINESSRULE, derived.getPath(), "The target profile "+u.getValue()+" is not a valid constraint on the base ("+td.getTargetProfile()+") at "+derived.getPath(), IssueSeverity.ERROR));
|
messages.add(new ValidationMessage(Source.InstanceValidator, IssueType.BUSINESSRULE, derived.getPath(), "The target profile "+u.getValue()+" is not a valid constraint on the base ("+td.getTargetProfile()+") at "+derived.getPath(), IssueSeverity.ERROR));
|
||||||
}
|
}
|
||||||
|
@ -2617,7 +2615,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.STRUCTUREDEFINITION__AT__ILLEGAL_CONSTRAINED_TYPE__FROM__IN_, purl, derived.getPath(), t, b.toString(), srcSD.getUrl()));
|
throw new DefinitionException("StructureDefinition "+purl+" at "+derived.getPath()+": illegal constrained type "+t+" from "+b.toString()+" in "+srcSD.getUrl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3196,7 +3194,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
try {
|
try {
|
||||||
return gen.generate(model, imagePath, 0, outputTracker);
|
return gen.generate(model, imagePath, 0, outputTracker);
|
||||||
} catch (org.hl7.fhir.exceptions.FHIRException e) {
|
} catch (org.hl7.fhir.exceptions.FHIRException e) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.ERROR_GENERATING_TABLE_FOR_PROFILE__, profile.getUrl(), e.getMessage()), e);
|
throw new FHIRException("Error generating table for profile " + profile.getUrl() + ": " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4023,7 +4021,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (ed.getPath().equals(path))
|
if (ed.getPath().equals(path))
|
||||||
return ed;
|
return ed;
|
||||||
}
|
}
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_ELEMENT_, path));
|
throw new FHIRException("Unable to find element "+path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4292,7 +4290,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
return sd.getType();
|
return sd.getType();
|
||||||
if (Utilities.existsInList(value, "SimpleQuantity", "MoneyQuantity"))
|
if (Utilities.existsInList(value, "SimpleQuantity", "MoneyQuantity"))
|
||||||
return "Quantity";
|
return "Quantity";
|
||||||
throw new Error(context.formatMessage(I18nConstants.INTERNAL_ERROR___TYPE_NOT_KNOWN_, value));
|
throw new Error("Internal error - type not known "+value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4592,7 +4590,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (ed.getType().isEmpty() || isAbstract(ed.getType().get(0).getWorkingCode()) || ed.getType().get(0).getWorkingCode().equals(ed.getPath())) {
|
if (ed.getType().isEmpty() || isAbstract(ed.getType().get(0).getWorkingCode()) || ed.getType().get(0).getWorkingCode().equals(ed.getPath())) {
|
||||||
if (ed.hasType() && "Resource".equals(ed.getType().get(0).getWorkingCode()) && child.getSelf().getType().get(0).hasProfile()) {
|
if (ed.hasType() && "Resource".equals(ed.getType().get(0).getWorkingCode()) && child.getSelf().getType().get(0).hasProfile()) {
|
||||||
if (child.getSelf().getType().get(0).getProfile().size() > 1) {
|
if (child.getSelf().getType().get(0).getProfile().size() > 1) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNHANDLED_SITUATION_RESOURCE_IS_PROFILED_TO_MORE_THAN_ONE_OPTION__CANNOT_SORT_PROFILE));
|
throw new FHIRException("Unhandled situation: resource is profiled to more than one option - cannot sort profile");
|
||||||
}
|
}
|
||||||
StructureDefinition profile = context.fetchResource(StructureDefinition.class, child.getSelf().getType().get(0).getProfile().get(0).getValue());
|
StructureDefinition profile = context.fetchResource(StructureDefinition.class, child.getSelf().getType().get(0).getProfile().get(0).getValue());
|
||||||
while (profile != null && profile.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
while (profile != null && profile.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
||||||
|
@ -4615,12 +4613,12 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
} else if (ed.getType().size() == 1 && !ed.getType().get(0).getWorkingCode().equals("*")) {
|
} else if (ed.getType().size() == 1 && !ed.getType().get(0).getWorkingCode().equals("*")) {
|
||||||
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode()));
|
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode()));
|
||||||
if (profile==null)
|
if (profile==null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath()));
|
throw new FHIRException("Unable to resolve profile " + sdNs(ed.getType().get(0).getWorkingCode()) + " in element " + ed.getPath());
|
||||||
ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), ed.getType().get(0).getWorkingCode(), child.getSelf().getPath().length(), cmp.name);
|
ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), ed.getType().get(0).getWorkingCode(), child.getSelf().getPath().length(), cmp.name);
|
||||||
} else if (child.getSelf().getType().size() == 1) {
|
} else if (child.getSelf().getType().size() == 1) {
|
||||||
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(child.getSelf().getType().get(0).getWorkingCode()));
|
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(child.getSelf().getType().get(0).getWorkingCode()));
|
||||||
if (profile==null)
|
if (profile==null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath()));
|
throw new FHIRException("Unable to resolve profile " + sdNs(ed.getType().get(0).getWorkingCode()) + " in element " + ed.getPath());
|
||||||
ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), child.getSelf().getType().get(0).getWorkingCode(), child.getSelf().getPath().length(), cmp.name);
|
ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), child.getSelf().getType().get(0).getWorkingCode(), child.getSelf().getPath().length(), cmp.name);
|
||||||
} else if (ed.getPath().endsWith("[x]") && !child.getSelf().getPath().endsWith("[x]")) {
|
} else if (ed.getPath().endsWith("[x]") && !child.getSelf().getPath().endsWith("[x]")) {
|
||||||
String edLastNode = ed.getPath().replaceAll("(.*\\.)*(.*)", "$2");
|
String edLastNode = ed.getPath().replaceAll("(.*\\.)*(.*)", "$2");
|
||||||
|
@ -4630,12 +4628,12 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
p = Utilities.uncapitalize(p);
|
p = Utilities.uncapitalize(p);
|
||||||
StructureDefinition sd = context.fetchResource(StructureDefinition.class, sdNs(p));
|
StructureDefinition sd = context.fetchResource(StructureDefinition.class, sdNs(p));
|
||||||
if (sd == null)
|
if (sd == null)
|
||||||
throw new Error(context.formatMessage(I18nConstants.UNABLE_TO_FIND_PROFILE__AT_, p, ed.getId()));
|
throw new Error("Unable to find profile '"+p+"' at "+ed.getId());
|
||||||
ccmp = new ElementDefinitionComparer(false, sd.getSnapshot().getElement(), p, child.getSelf().getPath().length(), cmp.name);
|
ccmp = new ElementDefinitionComparer(false, sd.getSnapshot().getElement(), p, child.getSelf().getPath().length(), cmp.name);
|
||||||
} else if (child.getSelf().hasType() && child.getSelf().getType().get(0).getWorkingCode().equals("Reference")) {
|
} else if (child.getSelf().hasType() && child.getSelf().getType().get(0).getWorkingCode().equals("Reference")) {
|
||||||
for (TypeRefComponent t: child.getSelf().getType()) {
|
for (TypeRefComponent t: child.getSelf().getType()) {
|
||||||
if (!t.getWorkingCode().equals("Reference")) {
|
if (!t.getWorkingCode().equals("Reference")) {
|
||||||
throw new Error(context.formatMessage(I18nConstants.CANT_HAVE_CHILDREN_ON_AN_ELEMENT_WITH_A_POLYMORPHIC_TYPE__YOU_MUST_SLICE_AND_CONSTRAIN_THE_TYPES_FIRST_SORTELEMENTS_, ed.getPath(), typeCode(ed.getType())));
|
throw new Error("Can't have children on an element with a polymorphic type - you must slice and constrain the types first (sortElements: "+ed.getPath()+":"+typeCode(ed.getType())+")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode()));
|
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode()));
|
||||||
|
@ -4643,7 +4641,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
} else if (!child.getSelf().hasType() && ed.getType().get(0).getWorkingCode().equals("Reference")) {
|
} else if (!child.getSelf().hasType() && ed.getType().get(0).getWorkingCode().equals("Reference")) {
|
||||||
for (TypeRefComponent t: ed.getType()) {
|
for (TypeRefComponent t: ed.getType()) {
|
||||||
if (!t.getWorkingCode().equals("Reference")) {
|
if (!t.getWorkingCode().equals("Reference")) {
|
||||||
throw new Error(context.formatMessage(I18nConstants.NOT_HANDLED_YET_SORTELEMENTS_, ed.getPath(), typeCode(ed.getType())));
|
throw new Error("Not handled yet (sortElements: "+ed.getPath()+":"+typeCode(ed.getType())+")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode()));
|
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode()));
|
||||||
|
@ -4652,7 +4650,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
// this is allowed if we only profile the extensions
|
// this is allowed if we only profile the extensions
|
||||||
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs("Element"));
|
StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs("Element"));
|
||||||
if (profile==null)
|
if (profile==null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath()));
|
throw new FHIRException("Unable to resolve profile " + sdNs(ed.getType().get(0).getWorkingCode()) + " in element " + ed.getPath());
|
||||||
ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), "Element", child.getSelf().getPath().length(), cmp.name);
|
ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), "Element", child.getSelf().getPath().length(), cmp.name);
|
||||||
// throw new Error("Not handled yet (sortElements: "+ed.getPath()+":"+typeCode(ed.getType())+")");
|
// throw new Error("Not handled yet (sortElements: "+ed.getPath()+":"+typeCode(ed.getType())+")");
|
||||||
}
|
}
|
||||||
|
@ -4721,9 +4719,9 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
// generate schematrons for the rules in a structure definition
|
// generate schematrons for the rules in a structure definition
|
||||||
public void generateSchematrons(OutputStream dest, StructureDefinition structure) throws IOException, DefinitionException {
|
public void generateSchematrons(OutputStream dest, StructureDefinition structure) throws IOException, DefinitionException {
|
||||||
if (structure.getDerivation() != TypeDerivationRule.CONSTRAINT)
|
if (structure.getDerivation() != TypeDerivationRule.CONSTRAINT)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NOT_THE_RIGHT_KIND_OF_STRUCTURE_TO_GENERATE_SCHEMATRONS_FOR));
|
throw new DefinitionException("not the right kind of structure to generate schematrons for");
|
||||||
if (!structure.hasSnapshot())
|
if (!structure.hasSnapshot())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NEEDS_A_SNAPSHOT));
|
throw new DefinitionException("needs a snapshot");
|
||||||
|
|
||||||
StructureDefinition base = context.fetchResource(StructureDefinition.class, structure.getBaseDefinition());
|
StructureDefinition base = context.fetchResource(StructureDefinition.class, structure.getBaseDefinition());
|
||||||
|
|
||||||
|
@ -4739,7 +4737,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
// generate a CSV representation of the structure definition
|
// generate a CSV representation of the structure definition
|
||||||
public void generateCsvs(OutputStream dest, StructureDefinition structure, boolean asXml) throws IOException, DefinitionException, Exception {
|
public void generateCsvs(OutputStream dest, StructureDefinition structure, boolean asXml) throws IOException, DefinitionException, Exception {
|
||||||
if (!structure.hasSnapshot())
|
if (!structure.hasSnapshot())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NEEDS_A_SNAPSHOT));
|
throw new DefinitionException("needs a snapshot");
|
||||||
|
|
||||||
CSVWriter csv = new CSVWriter(dest, structure, asXml);
|
CSVWriter csv = new CSVWriter(dest, structure, asXml);
|
||||||
|
|
||||||
|
@ -4755,7 +4753,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
System.out.println("no structure!");
|
System.out.println("no structure!");
|
||||||
}
|
}
|
||||||
if (!structure.hasSnapshot()) {
|
if (!structure.hasSnapshot()) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NEEDS_A_SNAPSHOT));
|
throw new DefinitionException("needs a snapshot");
|
||||||
}
|
}
|
||||||
|
|
||||||
XLSXWriter xlsx = new XLSXWriter(dest, structure, asXml, hideMustSupportFalse);
|
XLSXWriter xlsx = new XLSXWriter(dest, structure, asXml, hideMustSupportFalse);
|
||||||
|
@ -4915,7 +4913,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
for (ElementDefinition ed : list) {
|
for (ElementDefinition ed : list) {
|
||||||
List<String> paths = new ArrayList<String>();
|
List<String> paths = new ArrayList<String>();
|
||||||
if (!ed.hasPath())
|
if (!ed.hasPath())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.NO_PATH_ON_ELEMENT_DEFINITION__IN_, Integer.toString(list.indexOf(ed)), name));
|
throw new DefinitionException("No path on element Definition "+Integer.toString(list.indexOf(ed))+" in "+name);
|
||||||
sliceInfo.seeElement(ed);
|
sliceInfo.seeElement(ed);
|
||||||
String[] pl = ed.getPath().split("\\.");
|
String[] pl = ed.getPath().split("\\.");
|
||||||
for (int i = paths.size(); i < pl.length; i++) // -1 because the last path is in focus
|
for (int i = paths.size(); i < pl.length; i++) // -1 because the last path is in focus
|
||||||
|
@ -4939,7 +4937,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
ed.setId(bs);
|
ed.setId(bs);
|
||||||
if (idList.containsKey(bs)) {
|
if (idList.containsKey(bs)) {
|
||||||
if (exception || messages == null) {
|
if (exception || messages == null) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.SAME_ID_ON_MULTIPLE_ELEMENTS__IN_, bs, idList.get(bs), ed.getPath(), name));
|
throw new DefinitionException("Same id '"+bs+"'on multiple elements "+idList.get(bs)+"/"+ed.getPath()+" in "+name);
|
||||||
} else
|
} else
|
||||||
messages.add(new ValidationMessage(Source.ProfileValidator, ValidationMessage.IssueType.BUSINESSRULE, name+"."+bs, "Duplicate Element id "+bs, ValidationMessage.IssueSeverity.ERROR));
|
messages.add(new ValidationMessage(Source.ProfileValidator, ValidationMessage.IssueType.BUSINESSRULE, name+"."+bs, "Duplicate Element id "+bs, ValidationMessage.IssueSeverity.ERROR));
|
||||||
}
|
}
|
||||||
|
@ -5133,7 +5131,7 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
if (sd.hasBaseDefinition()) {
|
if (sd.hasBaseDefinition()) {
|
||||||
StructureDefinition base = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
StructureDefinition base = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition());
|
||||||
if (base == null)
|
if (base == null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_BASE_DEFINITION_FOR_LOGICAL_MODEL__FROM_, sd.getBaseDefinition(), sd.getUrl()));
|
throw new FHIRException("Unable to find base definition for logical model: "+sd.getBaseDefinition()+" from "+sd.getUrl());
|
||||||
copyElements(sd, base.getSnapshot().getElement());
|
copyElements(sd, base.getSnapshot().getElement());
|
||||||
}
|
}
|
||||||
copyElements(sd, sd.getDifferential().getElement());
|
copyElements(sd, sd.getDifferential().getElement());
|
||||||
|
|
|
@ -22,18 +22,17 @@ package org.hl7.fhir.r5.context;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.ResourceBundle;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -42,6 +41,7 @@ import org.hl7.fhir.exceptions.DefinitionException;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.exceptions.TerminologyServiceException;
|
import org.hl7.fhir.exceptions.TerminologyServiceException;
|
||||||
import org.hl7.fhir.r5.conformance.ProfileUtilities;
|
import org.hl7.fhir.r5.conformance.ProfileUtilities;
|
||||||
|
import org.hl7.fhir.r5.context.BaseWorkerContext.MetadataResourceVersionComparator;
|
||||||
import org.hl7.fhir.r5.context.IWorkerContext.ILoggingService.LogCategory;
|
import org.hl7.fhir.r5.context.IWorkerContext.ILoggingService.LogCategory;
|
||||||
import org.hl7.fhir.r5.context.TerminologyCache.CacheToken;
|
import org.hl7.fhir.r5.context.TerminologyCache.CacheToken;
|
||||||
import org.hl7.fhir.r5.model.BooleanType;
|
import org.hl7.fhir.r5.model.BooleanType;
|
||||||
|
@ -82,7 +82,6 @@ import org.hl7.fhir.r5.terminologies.ValueSetExpander.ValueSetExpansionOutcome;
|
||||||
import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple;
|
import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
import org.hl7.fhir.r5.utils.client.ToolingClientLogger;
|
import org.hl7.fhir.r5.utils.client.ToolingClientLogger;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
|
||||||
import org.hl7.fhir.utilities.OIDUtils;
|
import org.hl7.fhir.utilities.OIDUtils;
|
||||||
import org.hl7.fhir.utilities.TranslationServices;
|
import org.hl7.fhir.utilities.TranslationServices;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
@ -96,7 +95,6 @@ import com.google.gson.JsonObject;
|
||||||
|
|
||||||
public abstract class BaseWorkerContext implements IWorkerContext {
|
public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
|
|
||||||
private ResourceBundle i18Nmessages;
|
|
||||||
private Locale locale;
|
private Locale locale;
|
||||||
|
|
||||||
public class MetadataResourceVersionComparator<T extends CanonicalResource> implements Comparator<T> {
|
public class MetadataResourceVersionComparator<T extends CanonicalResource> implements Comparator<T> {
|
||||||
|
@ -168,23 +166,19 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
private boolean tlogging = true;
|
private boolean tlogging = true;
|
||||||
|
|
||||||
public BaseWorkerContext() throws FileNotFoundException, IOException, FHIRException {
|
public BaseWorkerContext() throws FileNotFoundException, IOException, FHIRException {
|
||||||
|
super();
|
||||||
txCache = new TerminologyCache(lock, null);
|
txCache = new TerminologyCache(lock, null);
|
||||||
setValidationMessageLanguage(getLocale());
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseWorkerContext(Locale locale) throws FileNotFoundException, IOException, FHIRException {
|
|
||||||
txCache = new TerminologyCache(lock, null);
|
|
||||||
setValidationMessageLanguage(locale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseWorkerContext(CanonicalResourceManager<CodeSystem> codeSystems, CanonicalResourceManager<ValueSet> valueSets, CanonicalResourceManager<ConceptMap> maps, CanonicalResourceManager<StructureDefinition> profiles,
|
public BaseWorkerContext(CanonicalResourceManager<CodeSystem> codeSystems, CanonicalResourceManager<ValueSet> valueSets, CanonicalResourceManager<ConceptMap> maps, CanonicalResourceManager<StructureDefinition> profiles,
|
||||||
CanonicalResourceManager<ImplementationGuide> guides) throws FileNotFoundException, IOException, FHIRException {
|
CanonicalResourceManager<ImplementationGuide> guides) throws FileNotFoundException, IOException, FHIRException {
|
||||||
this();
|
super();
|
||||||
this.codeSystems = codeSystems;
|
this.codeSystems = codeSystems;
|
||||||
this.valueSets = valueSets;
|
this.valueSets = valueSets;
|
||||||
this.maps = maps;
|
this.maps = maps;
|
||||||
this.structures = profiles;
|
this.structures = profiles;
|
||||||
this.guides = guides;
|
this.guides = guides;
|
||||||
|
txCache = new TerminologyCache(lock, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void copy(BaseWorkerContext other) {
|
protected void copy(BaseWorkerContext other) {
|
||||||
|
@ -238,7 +232,7 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
if (Utilities.existsInList(url, "http://hl7.org/fhir/SearchParameter/example")) {
|
if (Utilities.existsInList(url, "http://hl7.org/fhir/SearchParameter/example")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
throw new DefinitionException(formatMessage(I18nConstants.DUPLICATE_RESOURCE_, url));
|
throw new DefinitionException("Duplicate Resource " + url);
|
||||||
}
|
}
|
||||||
if (r instanceof StructureDefinition)
|
if (r instanceof StructureDefinition)
|
||||||
structures.see((StructureDefinition) m);
|
structures.see((StructureDefinition) m);
|
||||||
|
@ -312,7 +306,7 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
return laterVersion(newParts[i], oldParts[i]);
|
return laterVersion(newParts[i], oldParts[i]);
|
||||||
}
|
}
|
||||||
// This should never happen
|
// This should never happen
|
||||||
throw new Error(formatMessage(I18nConstants.DELIMITED_VERSIONS_HAVE_EXACT_MATCH_FOR_DELIMITER____VS_, delimiter, newParts, oldParts));
|
throw new Error("Delimited versions have exact match for delimiter '"+delimiter+"' : "+newParts+" vs "+oldParts);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected <T extends CanonicalResource> void seeMetadataResource(T r, Map<String, T> map, List<T> list, boolean addId) throws FHIRException {
|
protected <T extends CanonicalResource> void seeMetadataResource(T r, Map<String, T> map, List<T> list, boolean addId) throws FHIRException {
|
||||||
|
@ -426,12 +420,25 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
this.expandCodesLimit = expandCodesLimit;
|
this.expandCodesLimit = expandCodesLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Locale getLocale() {
|
||||||
|
if (Objects.nonNull(locale)){
|
||||||
|
return locale;
|
||||||
|
} else {
|
||||||
|
return Locale.US;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLocale(Locale locale) {
|
||||||
|
this.locale = locale;
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public ValueSetExpansionOutcome expandVS(ElementDefinitionBindingComponent binding, boolean cacheOk, boolean heirarchical) throws FHIRException {
|
public ValueSetExpansionOutcome expandVS(ElementDefinitionBindingComponent binding, boolean cacheOk, boolean heirarchical) throws FHIRException {
|
||||||
ValueSet vs = null;
|
ValueSet vs = null;
|
||||||
vs = fetchResource(ValueSet.class, binding.getValueSet());
|
vs = fetchResource(ValueSet.class, binding.getValueSet());
|
||||||
if (vs == null)
|
if (vs == null)
|
||||||
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_RESOLVE_VALUE_SET_, binding.getValueSet()));
|
throw new FHIRException("Unable to resolve value Set "+binding.getValueSet());
|
||||||
return expandVS(vs, cacheOk, heirarchical);
|
return expandVS(vs, cacheOk, heirarchical);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,7 +457,7 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
p.setParameter("excludeNested", !hierarchical);
|
p.setParameter("excludeNested", !hierarchical);
|
||||||
|
|
||||||
if (noTerminologyServer)
|
if (noTerminologyServer)
|
||||||
return new ValueSetExpansionOutcome(formatMessage(I18nConstants.ERROR_EXPANDING_VALUESET_RUNNING_WITHOUT_TERMINOLOGY_SERVICES), TerminologyServiceErrorClass.NOSERVICE);
|
return new ValueSetExpansionOutcome("Error expanding ValueSet: running without terminology services", TerminologyServiceErrorClass.NOSERVICE);
|
||||||
Map<String, String> params = new HashMap<String, String>();
|
Map<String, String> params = new HashMap<String, String>();
|
||||||
params.put("_limit", Integer.toString(expandCodesLimit ));
|
params.put("_limit", Integer.toString(expandCodesLimit ));
|
||||||
params.put("_incomplete", "true");
|
params.put("_incomplete", "true");
|
||||||
|
@ -470,19 +477,19 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
@Override
|
@Override
|
||||||
public ValueSetExpansionOutcome expandVS(ValueSet vs, boolean cacheOk, boolean heirarchical) {
|
public ValueSetExpansionOutcome expandVS(ValueSet vs, boolean cacheOk, boolean heirarchical) {
|
||||||
if (expParameters == null)
|
if (expParameters == null)
|
||||||
throw new Error(formatMessage(I18nConstants.NO_EXPANSION_PARAMETERS_PROVIDED));
|
throw new Error("No Expansion Parameters provided");
|
||||||
Parameters p = expParameters.copy();
|
Parameters p = expParameters.copy();
|
||||||
return expandVS(vs, cacheOk, heirarchical, p);
|
return expandVS(vs, cacheOk, heirarchical, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ValueSetExpansionOutcome expandVS(ValueSet vs, boolean cacheOk, boolean heirarchical, Parameters p) {
|
public ValueSetExpansionOutcome expandVS(ValueSet vs, boolean cacheOk, boolean heirarchical, Parameters p) {
|
||||||
if (p == null)
|
if (p == null)
|
||||||
throw new Error(formatMessage(I18nConstants.NO_PARAMETERS_PROVIDED_TO_EXPANDVS));
|
throw new Error("No Parameters provided to expandVS");
|
||||||
if (vs.hasExpansion()) {
|
if (vs.hasExpansion()) {
|
||||||
return new ValueSetExpansionOutcome(vs.copy());
|
return new ValueSetExpansionOutcome(vs.copy());
|
||||||
}
|
}
|
||||||
if (!vs.hasUrl())
|
if (!vs.hasUrl())
|
||||||
throw new Error(formatMessage(I18nConstants.NO_VALUE_SET));
|
throw new Error("no value set");
|
||||||
|
|
||||||
CacheToken cacheToken = txCache.generateExpandToken(vs, heirarchical);
|
CacheToken cacheToken = txCache.generateExpandToken(vs, heirarchical);
|
||||||
ValueSetExpansionOutcome res;
|
ValueSetExpansionOutcome res;
|
||||||
|
@ -499,7 +506,7 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
ValueSetExpanderSimple vse = new ValueSetExpanderSimple(this);
|
ValueSetExpanderSimple vse = new ValueSetExpanderSimple(this);
|
||||||
res = vse.doExpand(vs, p);
|
res = vse.doExpand(vs, p);
|
||||||
if (!res.getValueset().hasUrl())
|
if (!res.getValueset().hasUrl())
|
||||||
throw new Error(formatMessage(I18nConstants.NO_URL_IN_EXPAND_VALUE_SET));
|
throw new Error("no url in expand value set");
|
||||||
txCache.cacheExpansion(cacheToken, res, TerminologyCache.TRANSIENT);
|
txCache.cacheExpansion(cacheToken, res, TerminologyCache.TRANSIENT);
|
||||||
return res;
|
return res;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -507,7 +514,7 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
|
|
||||||
// if that failed, we try to expand on the server
|
// if that failed, we try to expand on the server
|
||||||
if (noTerminologyServer)
|
if (noTerminologyServer)
|
||||||
return new ValueSetExpansionOutcome(formatMessage(I18nConstants.ERROR_EXPANDING_VALUESET_RUNNING_WITHOUT_TERMINOLOGY_SERVICES), TerminologyServiceErrorClass.NOSERVICE);
|
return new ValueSetExpansionOutcome("Error expanding ValueSet: running without terminology services", TerminologyServiceErrorClass.NOSERVICE);
|
||||||
Map<String, String> params = new HashMap<String, String>();
|
Map<String, String> params = new HashMap<String, String>();
|
||||||
params.put("_limit", Integer.toString(expandCodesLimit ));
|
params.put("_limit", Integer.toString(expandCodesLimit ));
|
||||||
params.put("_incomplete", "true");
|
params.put("_incomplete", "true");
|
||||||
|
@ -517,7 +524,7 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
if (!result.hasUrl())
|
if (!result.hasUrl())
|
||||||
result.setUrl(vs.getUrl());
|
result.setUrl(vs.getUrl());
|
||||||
if (!result.hasUrl())
|
if (!result.hasUrl())
|
||||||
throw new Error(formatMessage(I18nConstants.NO_URL_IN_EXPAND_VALUE_SET_2));
|
throw new Error("no url in expand value set 2");
|
||||||
res = new ValueSetExpansionOutcome(result).setTxLink(txLog.getLastId());
|
res = new ValueSetExpansionOutcome(result).setTxLink(txLog.getLastId());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
res = new ValueSetExpansionOutcome(e.getMessage() == null ? e.getClass().getName() : e.getMessage(), TerminologyServiceErrorClass.UNKNOWN).setTxLink(txLog == null ? null : txLog.getLastId());
|
res = new ValueSetExpansionOutcome(e.getMessage() == null ? e.getClass().getName() : e.getMessage(), TerminologyServiceErrorClass.UNKNOWN).setTxLink(txLog == null ? null : txLog.getLastId());
|
||||||
|
@ -577,12 +584,12 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!options.isUseServer()) {
|
if (!options.isUseServer()) {
|
||||||
return new ValidationResult(IssueSeverity.WARNING,formatMessage(I18nConstants.UNABLE_TO_VALIDATE_CODE_WITHOUT_USING_SERVER), TerminologyServiceErrorClass.BLOCKED_BY_OPTIONS);
|
return new ValidationResult(IssueSeverity.WARNING, "Unable to validate code without using server", TerminologyServiceErrorClass.BLOCKED_BY_OPTIONS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if that failed, we try to validate on the server
|
// if that failed, we try to validate on the server
|
||||||
if (noTerminologyServer) {
|
if (noTerminologyServer) {
|
||||||
return new ValidationResult(IssueSeverity.ERROR,formatMessage(I18nConstants.ERROR_VALIDATING_CODE_RUNNING_WITHOUT_TERMINOLOGY_SERVICES), TerminologyServiceErrorClass.NOSERVICE);
|
return new ValidationResult(IssueSeverity.ERROR, "Error validating code: running without terminology services", TerminologyServiceErrorClass.NOSERVICE);
|
||||||
}
|
}
|
||||||
String csumm = txCache != null ? txCache.summary(code) : null;
|
String csumm = txCache != null ? txCache.summary(code) : null;
|
||||||
if (txCache != null) {
|
if (txCache != null) {
|
||||||
|
@ -657,15 +664,15 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
pin.addParameter().setName("valueSet").setResource(vs);
|
pin.addParameter().setName("valueSet").setResource(vs);
|
||||||
for (ParametersParameterComponent pp : pin.getParameter())
|
for (ParametersParameterComponent pp : pin.getParameter())
|
||||||
if (pp.getName().equals("profile"))
|
if (pp.getName().equals("profile"))
|
||||||
throw new Error(formatMessage(I18nConstants.CAN_ONLY_SPECIFY_PROFILE_IN_THE_CONTEXT));
|
throw new Error("Can only specify profile in the context");
|
||||||
if (expParameters == null)
|
if (expParameters == null)
|
||||||
throw new Error(formatMessage(I18nConstants.NO_EXPANSIONPROFILE_PROVIDED));
|
throw new Error("No ExpansionProfile provided");
|
||||||
pin.addParameter().setName("profile").setResource(expParameters);
|
pin.addParameter().setName("profile").setResource(expParameters);
|
||||||
if (txLog != null) {
|
if (txLog != null) {
|
||||||
txLog.clearLastId();
|
txLog.clearLastId();
|
||||||
}
|
}
|
||||||
if (txClient == null) {
|
if (txClient == null) {
|
||||||
throw new FHIRException(formatMessage(I18nConstants.ATTEMPT_TO_USE_TERMINOLOGY_SERVER_WHEN_NO_TERMINOLOGY_SERVER_IS_AVAILABLE));
|
throw new FHIRException("Attempt to use Terminology server when no Terminology server is available");
|
||||||
}
|
}
|
||||||
Parameters pOut;
|
Parameters pOut;
|
||||||
if (vs == null)
|
if (vs == null)
|
||||||
|
@ -872,7 +879,7 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
}
|
}
|
||||||
if (supportedCodeSystems.contains(uri))
|
if (supportedCodeSystems.contains(uri))
|
||||||
return null;
|
return null;
|
||||||
throw new FHIRException(formatMessage(I18nConstants.NOT_DONE_YET_CANT_FETCH_, uri));
|
throw new FHIRException("not done yet: can't fetch "+uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -918,10 +925,10 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
if (parts.length >= 2) {
|
if (parts.length >= 2) {
|
||||||
if (!Utilities.noString(type))
|
if (!Utilities.noString(type))
|
||||||
if (!type.equals(parts[parts.length-2]))
|
if (!type.equals(parts[parts.length-2]))
|
||||||
throw new Error(formatMessage(I18nConstants.RESOURCE_TYPE_MISMATCH_FOR___, type, uri));
|
throw new Error("Resource type mismatch for "+type+" / "+uri);
|
||||||
return allResourcesById.get(parts[parts.length-2]).get(parts[parts.length-1]);
|
return allResourcesById.get(parts[parts.length-2]).get(parts[parts.length-1]);
|
||||||
} else
|
} else
|
||||||
throw new Error(formatMessage(I18nConstants.UNABLE_TO_PROCESS_REQUEST_FOR_RESOURCE_FOR___, type, uri));
|
throw new Error("Unable to process request for resource for "+type+" / "+uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1281,36 +1288,5 @@ public abstract class BaseWorkerContext implements IWorkerContext {
|
||||||
return binaries;
|
return binaries;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Locale getLocale() {
|
|
||||||
if (Objects.nonNull(locale)){
|
|
||||||
return locale;
|
|
||||||
} else {
|
|
||||||
return Locale.US;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setLocale(Locale locale) {
|
|
||||||
this.locale = locale;
|
|
||||||
setValidationMessageLanguage(getLocale());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String formatMessage(String theMessage, Object... theMessageArguments) {
|
|
||||||
String message = theMessage;
|
|
||||||
if (Objects.nonNull(i18Nmessages) && i18Nmessages.containsKey(theMessage)) {
|
|
||||||
if (Objects.nonNull(theMessageArguments) && theMessageArguments.length > 0) {
|
|
||||||
message = MessageFormat.format(i18Nmessages.getString(theMessage), theMessageArguments);
|
|
||||||
} else {
|
|
||||||
message = i18Nmessages.getString(theMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setValidationMessageLanguage(Locale locale) {
|
|
||||||
i18Nmessages = ResourceBundle.getBundle("Messages", locale );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -326,17 +326,13 @@ public interface IWorkerContext {
|
||||||
* @return
|
* @return
|
||||||
* @throws FHIRException
|
* @throws FHIRException
|
||||||
*/
|
*/
|
||||||
ValueSetExpansionOutcome expandVS(ConceptSetComponent inc, boolean hierarchical) throws TerminologyServiceException;
|
public ValueSetExpansionOutcome expandVS(ConceptSetComponent inc, boolean hierarchical) throws TerminologyServiceException;
|
||||||
|
|
||||||
Locale getLocale();
|
Locale getLocale();
|
||||||
|
|
||||||
void setLocale(Locale locale);
|
void setLocale(Locale locale);
|
||||||
|
|
||||||
String formatMessage(String theMessage, Object... theMessageArguments);
|
public class ValidationResult {
|
||||||
|
|
||||||
void setValidationMessageLanguage(Locale locale);
|
|
||||||
|
|
||||||
class ValidationResult {
|
|
||||||
private ConceptDefinitionComponent definition;
|
private ConceptDefinitionComponent definition;
|
||||||
private IssueSeverity severity;
|
private IssueSeverity severity;
|
||||||
private String message;
|
private String message;
|
||||||
|
|
|
@ -35,7 +35,6 @@ import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
|
@ -73,7 +72,6 @@ import org.hl7.fhir.r5.utils.INarrativeGenerator;
|
||||||
import org.hl7.fhir.r5.utils.IResourceValidator;
|
import org.hl7.fhir.r5.utils.IResourceValidator;
|
||||||
import org.hl7.fhir.r5.utils.NarrativeGenerator;
|
import org.hl7.fhir.r5.utils.NarrativeGenerator;
|
||||||
import org.hl7.fhir.utilities.CSFileInputStream;
|
import org.hl7.fhir.utilities.CSFileInputStream;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
|
||||||
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.cache.NpmPackage;
|
import org.hl7.fhir.utilities.cache.NpmPackage;
|
||||||
|
@ -120,20 +118,11 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimpleWorkerContext(Locale locale) throws FileNotFoundException, IOException, FHIRException {
|
|
||||||
super(locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleWorkerContext(SimpleWorkerContext other) throws FileNotFoundException, IOException, FHIRException {
|
public SimpleWorkerContext(SimpleWorkerContext other) throws FileNotFoundException, IOException, FHIRException {
|
||||||
super();
|
super();
|
||||||
copy(other);
|
copy(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimpleWorkerContext(SimpleWorkerContext other, Locale locale) throws FileNotFoundException, IOException, FHIRException {
|
|
||||||
super(locale);
|
|
||||||
copy(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void copy(SimpleWorkerContext other) {
|
protected void copy(SimpleWorkerContext other) {
|
||||||
super.copy(other);
|
super.copy(other);
|
||||||
questionnaire = other.questionnaire;
|
questionnaire = other.questionnaire;
|
||||||
|
@ -260,7 +249,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
txClient.setLogger(txLog);
|
txClient.setLogger(txLog);
|
||||||
return txClient.getCapabilitiesStatementQuick().getSoftware().getVersion();
|
return txClient.getCapabilitiesStatementQuick().getSoftware().getVersion();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_CONNECT_TO_TERMINOLOGY_SERVER_USE_PARAMETER_TX_NA_TUN_RUN_WITHOUT_USING_TERMINOLOGY_SERVICES_TO_VALIDATE_LOINC_SNOMED_ICDX_ETC_ERROR__, e.getMessage()), e);
|
throw new FHIRException("Unable to connect to terminology server. Use parameter '-tx n/a' tun run without using terminology services to validate LOINC, SNOMED, ICD-X etc. Error = "+e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,9 +267,9 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
f = xml.parse(stream);
|
f = xml.parse(stream);
|
||||||
}
|
}
|
||||||
} catch (DataFormatException e1) {
|
} catch (DataFormatException e1) {
|
||||||
throw new org.hl7.fhir.exceptions.FHIRFormatError(formatMessage(I18nConstants.ERROR_PARSING_, name, e1.getMessage()), e1);
|
throw new org.hl7.fhir.exceptions.FHIRFormatError("Error parsing "+name+":" +e1.getMessage(), e1);
|
||||||
} catch (Exception e1) {
|
} catch (Exception e1) {
|
||||||
throw new org.hl7.fhir.exceptions.FHIRFormatError(formatMessage(I18nConstants.ERROR_PARSING_, name, e1.getMessage()), e1);
|
throw new org.hl7.fhir.exceptions.FHIRFormatError("Error parsing "+name+":" +e1.getMessage(), e1);
|
||||||
}
|
}
|
||||||
if (f instanceof Bundle) {
|
if (f instanceof Bundle) {
|
||||||
Bundle bnd = (Bundle) f;
|
Bundle bnd = (Bundle) f;
|
||||||
|
@ -336,7 +325,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
try {
|
try {
|
||||||
loadDefinitionItem(s, pi.load("package", s), loader, filter);
|
loadDefinitionItem(s, pi.load("package", s), loader, filter);
|
||||||
} catch (FHIRException | IOException e) {
|
} catch (FHIRException | IOException e) {
|
||||||
throw new FHIRException(formatMessage(I18nConstants.ERROR_READING__FROM_PACKAGE__, s, pi.name(), pi.version(), e.getMessage()), e);
|
throw new FHIRException("Error reading "+s+" from package "+pi.name()+"#"+pi.version()+": "+e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (String s : pi.list("other")) {
|
for (String s : pi.list("other")) {
|
||||||
|
@ -388,7 +377,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
if (version == null)
|
if (version == null)
|
||||||
version = s.substring(8);
|
version = s.substring(8);
|
||||||
else if (!version.equals(s.substring(8)))
|
else if (!version.equals(s.substring(8)))
|
||||||
throw new DefinitionException(formatMessage(I18nConstants.VERSION_MISMATCH_THE_CONTEXT_HAS_VERSION__LOADED_AND_THE_NEW_CONTENT_BEING_LOADED_IS_VERSION_, version, s.substring(8)));
|
throw new DefinitionException("Version mismatch. The context has version "+version+" loaded, and the new content being loaded is version "+s.substring(8));
|
||||||
}
|
}
|
||||||
if (s.startsWith("revision="))
|
if (s.startsWith("revision="))
|
||||||
revision = s.substring(9);
|
revision = s.substring(9);
|
||||||
|
@ -408,7 +397,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
case JSON: return newJsonParser();
|
case JSON: return newJsonParser();
|
||||||
case XML: return newXmlParser();
|
case XML: return newXmlParser();
|
||||||
default:
|
default:
|
||||||
throw new Error(formatMessage(I18nConstants.PARSER_TYPE__NOT_SUPPORTED, type.toString()));
|
throw new Error("Parser Type "+type.toString()+" not supported");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,7 +407,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
return new JsonParser();
|
return new JsonParser();
|
||||||
if (type.equalsIgnoreCase("XML"))
|
if (type.equalsIgnoreCase("XML"))
|
||||||
return new XmlParser();
|
return new XmlParser();
|
||||||
throw new Error(formatMessage(I18nConstants.PARSER_TYPE__NOT_SUPPORTED, type.toString()));
|
throw new Error("Parser Type "+type.toString()+" not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -438,7 +427,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
@Override
|
@Override
|
||||||
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("No validator configured");
|
||||||
return validatorFactory.makeValidator(this);
|
return validatorFactory.makeValidator(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -666,13 +655,13 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
public void generateSnapshot(StructureDefinition p, boolean logical) throws DefinitionException, FHIRException {
|
public void generateSnapshot(StructureDefinition p, boolean logical) throws DefinitionException, FHIRException {
|
||||||
if (!p.hasSnapshot() && (logical || p.getKind() != StructureDefinitionKind.LOGICAL)) {
|
if (!p.hasSnapshot() && (logical || p.getKind() != StructureDefinitionKind.LOGICAL)) {
|
||||||
if (!p.hasBaseDefinition())
|
if (!p.hasBaseDefinition())
|
||||||
throw new DefinitionException(formatMessage(I18nConstants.PROFILE___HAS_NO_BASE_AND_NO_SNAPSHOT, p.getName(), p.getUrl()));
|
throw new DefinitionException("Profile "+p.getName()+" ("+p.getUrl()+") has no base and no snapshot");
|
||||||
StructureDefinition sd = fetchResource(StructureDefinition.class, p.getBaseDefinition());
|
StructureDefinition sd = fetchResource(StructureDefinition.class, p.getBaseDefinition());
|
||||||
if (sd == null && "http://hl7.org/fhir/StructureDefinition/Base".equals(p.getBaseDefinition())) {
|
if (sd == null && "http://hl7.org/fhir/StructureDefinition/Base".equals(p.getBaseDefinition())) {
|
||||||
sd = ProfileUtilities.makeBaseDefinition(p.getFhirVersion());
|
sd = ProfileUtilities.makeBaseDefinition(p.getFhirVersion());
|
||||||
}
|
}
|
||||||
if (sd == null) {
|
if (sd == null) {
|
||||||
throw new DefinitionException(formatMessage(I18nConstants.PROFILE___BASE__COULD_NOT_BE_RESOLVED, p.getName(), p.getUrl(), p.getBaseDefinition()));
|
throw new DefinitionException("Profile "+p.getName()+" ("+p.getUrl()+") base "+p.getBaseDefinition()+" could not be resolved");
|
||||||
}
|
}
|
||||||
List<ValidationMessage> msgs = new ArrayList<ValidationMessage>();
|
List<ValidationMessage> msgs = new ArrayList<ValidationMessage>();
|
||||||
List<String> errors = new ArrayList<String>();
|
List<String> errors = new ArrayList<String>();
|
||||||
|
@ -688,10 +677,10 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
pu.generateSnapshot(sd, p, p.getUrl(), Utilities.extractBaseUrl(sd.getUserString("path")), p.getName());
|
pu.generateSnapshot(sd, p, p.getUrl(), Utilities.extractBaseUrl(sd.getUserString("path")), p.getName());
|
||||||
for (ValidationMessage msg : msgs) {
|
for (ValidationMessage msg : msgs) {
|
||||||
if ((!ignoreProfileErrors && msg.getLevel() == ValidationMessage.IssueSeverity.ERROR) || msg.getLevel() == ValidationMessage.IssueSeverity.FATAL)
|
if ((!ignoreProfileErrors && msg.getLevel() == ValidationMessage.IssueSeverity.ERROR) || msg.getLevel() == ValidationMessage.IssueSeverity.FATAL)
|
||||||
throw new DefinitionException(formatMessage(I18nConstants.PROFILE___ELEMENT__ERROR_GENERATING_SNAPSHOT_, p.getName(), p.getUrl(), msg.getLocation(), msg.getMessage()));
|
throw new DefinitionException("Profile "+p.getName()+" ("+p.getUrl()+"), element "+msg.getLocation()+". Error generating snapshot: "+msg.getMessage());
|
||||||
}
|
}
|
||||||
if (!p.hasSnapshot())
|
if (!p.hasSnapshot())
|
||||||
throw new FHIRException(formatMessage(I18nConstants.PROFILE___ERROR_GENERATING_SNAPSHOT, p.getName(), p.getUrl()));
|
throw new FHIRException("Profile "+p.getName()+" ("+p.getUrl()+"). Error generating snapshot");
|
||||||
pu = null;
|
pu = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,6 @@ import org.hl7.fhir.r5.formats.JsonCreatorCanonical;
|
||||||
import org.hl7.fhir.r5.formats.JsonCreatorGson;
|
import org.hl7.fhir.r5.formats.JsonCreatorGson;
|
||||||
import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent;
|
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.utilities.I18nConstants;
|
|
||||||
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.json.JsonTrackingParser;
|
import org.hl7.fhir.utilities.json.JsonTrackingParser;
|
||||||
|
@ -95,7 +94,7 @@ public class JsonParser extends ParserBase {
|
||||||
try {
|
try {
|
||||||
obj = JsonTrackingParser.parse(source, map);
|
obj = JsonTrackingParser.parse(source, map);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logError(-1, -1,context.formatMessage(I18nConstants.DOCUMENT), IssueType.INVALID, context.formatMessage(I18nConstants.ERROR_PARSING_JSON_, e.getMessage()), IssueSeverity.FATAL);
|
logError(-1, -1, "(document)", IssueType.INVALID, "Error parsing JSON: "+e.getMessage(), IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
assert (map.containsKey(obj));
|
assert (map.containsKey(obj));
|
||||||
|
@ -115,7 +114,7 @@ public class JsonParser extends ParserBase {
|
||||||
public Element parse(JsonObject object) throws FHIRException {
|
public Element parse(JsonObject object) throws FHIRException {
|
||||||
JsonElement rt = object.get("resourceType");
|
JsonElement rt = object.get("resourceType");
|
||||||
if (rt == null) {
|
if (rt == null) {
|
||||||
logError(line(object), col(object), "$", IssueType.INVALID, context.formatMessage(I18nConstants.UNABLE_TO_FIND_RESOURCETYPE_PROPERTY), IssueSeverity.FATAL);
|
logError(line(object), col(object), "$", IssueType.INVALID, "Unable to find resourceType property", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
String name = rt.getAsString();
|
String name = rt.getAsString();
|
||||||
|
@ -145,13 +144,13 @@ public class JsonParser extends ParserBase {
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
if (!found)
|
if (!found)
|
||||||
logError(line(object), col(object), path, IssueType.INVALID, context.formatMessage(I18nConstants.OBJECT_MUST_HAVE_SOME_CONTENT), IssueSeverity.ERROR);
|
logError(line(object), col(object), path, IssueType.INVALID, "Object must have some content", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildren(String path, JsonObject object, Element element, boolean hasResourceType) throws FHIRException {
|
private void parseChildren(String path, JsonObject object, Element context, boolean hasResourceType) throws FHIRException {
|
||||||
reapComments(object, element);
|
reapComments(object, context);
|
||||||
List<Property> properties = element.getProperty().getChildProperties(element.getName(), null);
|
List<Property> properties = context.getProperty().getChildProperties(context.getName(), null);
|
||||||
Set<String> processed = new HashSet<String>();
|
Set<String> processed = new HashSet<String>();
|
||||||
if (hasResourceType)
|
if (hasResourceType)
|
||||||
processed.add("resourceType");
|
processed.add("resourceType");
|
||||||
|
@ -160,14 +159,14 @@ public class JsonParser extends ParserBase {
|
||||||
// note that we do not trouble ourselves to maintain the wire format order here - we don't even know what it was anyway
|
// note that we do not trouble ourselves to maintain the wire format order here - we don't even know what it was anyway
|
||||||
// first pass: process the properties
|
// first pass: process the properties
|
||||||
for (Property property : properties) {
|
for (Property property : properties) {
|
||||||
parseChildItem(path, object, element, processed, property);
|
parseChildItem(path, object, context, processed, property);
|
||||||
}
|
}
|
||||||
|
|
||||||
// second pass: check for things not processed
|
// second pass: check for things not processed
|
||||||
if (policy != ValidationPolicy.NONE) {
|
if (policy != ValidationPolicy.NONE) {
|
||||||
for (Entry<String, JsonElement> e : object.entrySet()) {
|
for (Entry<String, JsonElement> e : object.entrySet()) {
|
||||||
if (!processed.contains(e.getKey())) {
|
if (!processed.contains(e.getKey())) {
|
||||||
logError(line(e.getValue()), col(e.getValue()), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.UNRECOGNISED_PROPERTY_, e.getKey()), IssueSeverity.ERROR);
|
logError(line(e.getValue()), col(e.getValue()), path, IssueType.STRUCTURE, "Unrecognised property '@"+e.getKey()+"'", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,7 +191,7 @@ public class JsonParser extends ParserBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildComplex(String path, JsonObject object, Element element, Set<String> processed, Property property, String name) throws FHIRException {
|
private void parseChildComplex(String path, JsonObject object, Element context, Set<String> processed, Property property, String name) throws FHIRException {
|
||||||
processed.add(name);
|
processed.add(name);
|
||||||
String npath = path+"."+property.getName();
|
String npath = path+"."+property.getName();
|
||||||
JsonElement e = object.get(name);
|
JsonElement e = object.get(name);
|
||||||
|
@ -200,14 +199,14 @@ public class JsonParser extends ParserBase {
|
||||||
JsonArray arr = (JsonArray) e;
|
JsonArray arr = (JsonArray) e;
|
||||||
int c = 0;
|
int c = 0;
|
||||||
for (JsonElement am : arr) {
|
for (JsonElement am : arr) {
|
||||||
parseChildComplexInstance(npath+"["+c+"]", object, element, property, name, am);
|
parseChildComplexInstance(npath+"["+c+"]", object, context, property, name, am);
|
||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (property.isList()) {
|
if (property.isList()) {
|
||||||
logError(line(e), col(e), npath, IssueType.INVALID, context.formatMessage(I18nConstants.THIS_PROPERTY_MUST_BE_AN_ARRAY_NOT_, describeType(e)), IssueSeverity.ERROR);
|
logError(line(e), col(e), npath, IssueType.INVALID, "This property must be an Array, not "+describeType(e), IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
parseChildComplexInstance(npath, object, element, property, name, e);
|
parseChildComplexInstance(npath, object, context, property, name, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,18 +222,18 @@ public class JsonParser extends ParserBase {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildComplexInstance(String npath, JsonObject object, Element element, Property property, String name, JsonElement e) throws FHIRException {
|
private void parseChildComplexInstance(String npath, JsonObject object, Element context, Property property, String name, JsonElement e) throws FHIRException {
|
||||||
if (e instanceof JsonObject) {
|
if (e instanceof JsonObject) {
|
||||||
JsonObject child = (JsonObject) e;
|
JsonObject child = (JsonObject) e;
|
||||||
Element n = new Element(name, property).markLocation(line(child), col(child));
|
Element n = new Element(name, property).markLocation(line(child), col(child));
|
||||||
checkObject(child, npath);
|
checkObject(child, npath);
|
||||||
element.getChildren().add(n);
|
context.getChildren().add(n);
|
||||||
if (property.isResource())
|
if (property.isResource())
|
||||||
parseResource(npath, child, n, property);
|
parseResource(npath, child, n, property);
|
||||||
else
|
else
|
||||||
parseChildren(npath, child, n, false);
|
parseChildren(npath, child, n, false);
|
||||||
} else
|
} else
|
||||||
logError(line(e), col(e), npath, IssueType.INVALID, context.formatMessage(I18nConstants.THIS_PROPERTY_MUST_BE__NOT_, (property.isList() ? "an Array" : "an Object"), describe(e)), IssueSeverity.ERROR);
|
logError(line(e), col(e), npath, IssueType.INVALID, "This property must be "+(property.isList() ? "an Array" : "an Object")+", not "+describe(e), IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String describe(JsonElement e) {
|
private String describe(JsonElement e) {
|
||||||
|
@ -247,7 +246,7 @@ public class JsonParser extends ParserBase {
|
||||||
return "a primitive property";
|
return "a primitive property";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildPrimitive(JsonObject object, Element element, Set<String> processed, Property property, String path, String name) throws FHIRException {
|
private void parseChildPrimitive(JsonObject object, Element context, Set<String> processed, Property property, String path, String name) throws FHIRException {
|
||||||
String npath = path+"."+property.getName();
|
String npath = path+"."+property.getName();
|
||||||
processed.add(name);
|
processed.add(name);
|
||||||
processed.add("_"+name);
|
processed.add("_"+name);
|
||||||
|
@ -257,11 +256,11 @@ public class JsonParser extends ParserBase {
|
||||||
if (property.isList()) {
|
if (property.isList()) {
|
||||||
boolean ok = true;
|
boolean ok = true;
|
||||||
if (!(main == null || main instanceof JsonArray)) {
|
if (!(main == null || main instanceof JsonArray)) {
|
||||||
logError(line(main), col(main), npath, IssueType.INVALID, context.formatMessage(I18nConstants.THIS_PROPERTY_MUST_BE_AN_ARRAY_NOT_A_, describe(main)), IssueSeverity.ERROR);
|
logError(line(main), col(main), npath, IssueType.INVALID, "This property must be an Array, not a "+describe(main), IssueSeverity.ERROR);
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
if (!(fork == null || fork instanceof JsonArray)) {
|
if (!(fork == null || fork instanceof JsonArray)) {
|
||||||
logError(line(fork), col(fork), npath, IssueType.INVALID, context.formatMessage(I18nConstants.THIS_BASE_PROPERTY_MUST_BE_AN_ARRAY_NOT_A_, describe(main)), IssueSeverity.ERROR);
|
logError(line(fork), col(fork), npath, IssueType.INVALID, "This base property must be an Array, not a "+describe(main), IssueSeverity.ERROR);
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
if (ok) {
|
if (ok) {
|
||||||
|
@ -270,11 +269,11 @@ public class JsonParser extends ParserBase {
|
||||||
for (int i = 0; i < Math.max(arrC(arr1), arrC(arr2)); i++) {
|
for (int i = 0; i < Math.max(arrC(arr1), arrC(arr2)); i++) {
|
||||||
JsonElement m = arrI(arr1, i);
|
JsonElement m = arrI(arr1, i);
|
||||||
JsonElement f = arrI(arr2, i);
|
JsonElement f = arrI(arr2, i);
|
||||||
parseChildPrimitiveInstance(element, property, name, npath, m, f);
|
parseChildPrimitiveInstance(context, property, name, npath, m, f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
parseChildPrimitiveInstance(element, property, name, npath, main, fork);
|
parseChildPrimitiveInstance(context, property, name, npath, main, fork);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,16 +286,15 @@ public class JsonParser extends ParserBase {
|
||||||
return arr == null ? 0 : arr.size();
|
return arr == null ? 0 : arr.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildPrimitiveInstance(Element element, Property property, String name, String npath,
|
private void parseChildPrimitiveInstance(Element context, Property property, String name, String npath,
|
||||||
JsonElement main, JsonElement fork) throws FHIRException {
|
JsonElement main, JsonElement fork) throws FHIRException {
|
||||||
if (main != null && !(main instanceof JsonPrimitive))
|
if (main != null && !(main instanceof JsonPrimitive))
|
||||||
logError(line(main), col(main), npath, IssueType.INVALID, context.formatMessage(
|
logError(line(main), col(main), npath, IssueType.INVALID, "This property must be an simple value, not "+describe(main), IssueSeverity.ERROR);
|
||||||
I18nConstants.THIS_PROPERTY_MUST_BE_AN_SIMPLE_VALUE_NOT_, describe(main)), IssueSeverity.ERROR);
|
|
||||||
else if (fork != null && !(fork instanceof JsonObject))
|
else if (fork != null && !(fork instanceof JsonObject))
|
||||||
logError(line(fork), col(fork), npath, IssueType.INVALID, context.formatMessage(I18nConstants.THIS_PROPERTY_MUST_BE_AN_OBJECT_NOT_, describe(fork)), IssueSeverity.ERROR);
|
logError(line(fork), col(fork), npath, IssueType.INVALID, "This property must be an object, not "+describe(fork), IssueSeverity.ERROR);
|
||||||
else {
|
else {
|
||||||
Element n = new Element(name, property).markLocation(line(main != null ? main : fork), col(main != null ? main : fork));
|
Element n = new Element(name, property).markLocation(line(main != null ? main : fork), col(main != null ? main : fork));
|
||||||
element.getChildren().add(n);
|
context.getChildren().add(n);
|
||||||
if (main != null) {
|
if (main != null) {
|
||||||
JsonPrimitive p = (JsonPrimitive) main;
|
JsonPrimitive p = (JsonPrimitive) main;
|
||||||
if (p.isNumber() && p.getAsNumber() instanceof JsonTrackingParser.PresentedBigDecimal) {
|
if (p.isNumber() && p.getAsNumber() instanceof JsonTrackingParser.PresentedBigDecimal) {
|
||||||
|
@ -309,19 +307,19 @@ public class JsonParser extends ParserBase {
|
||||||
try {
|
try {
|
||||||
n.setXhtml(new XhtmlParser().setValidatorMode(policy == ValidationPolicy.EVERYTHING).parse(n.getValue(), null).getDocumentElement());
|
n.setXhtml(new XhtmlParser().setValidatorMode(policy == ValidationPolicy.EVERYTHING).parse(n.getValue(), null).getDocumentElement());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logError(line(main), col(main), npath, IssueType.INVALID, context.formatMessage(I18nConstants.ERROR_PARSING_XHTML_, e.getMessage()), IssueSeverity.ERROR);
|
logError(line(main), col(main), npath, IssueType.INVALID, "Error parsing XHTML: "+e.getMessage(), IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (policy == ValidationPolicy.EVERYTHING) {
|
if (policy == ValidationPolicy.EVERYTHING) {
|
||||||
// now we cross-check the primitive format against the stated type
|
// now we cross-check the primitive format against the stated type
|
||||||
if (Utilities.existsInList(n.getType(), "boolean")) {
|
if (Utilities.existsInList(n.getType(), "boolean")) {
|
||||||
if (!p.isBoolean())
|
if (!p.isBoolean())
|
||||||
logError(line(main), col(main), npath, IssueType.INVALID, context.formatMessage(I18nConstants.ERROR_PARSING_JSON_THE_PRIMITIVE_VALUE_MUST_BE_A_BOOLEAN), IssueSeverity.ERROR);
|
logError(line(main), col(main), npath, IssueType.INVALID, "Error parsing JSON: the primitive value must be a boolean", IssueSeverity.ERROR);
|
||||||
} else if (Utilities.existsInList(n.getType(), "integer", "unsignedInt", "positiveInt", "decimal")) {
|
} else if (Utilities.existsInList(n.getType(), "integer", "unsignedInt", "positiveInt", "decimal")) {
|
||||||
if (!p.isNumber())
|
if (!p.isNumber())
|
||||||
logError(line(main), col(main), npath, IssueType.INVALID, context.formatMessage(I18nConstants.ERROR_PARSING_JSON_THE_PRIMITIVE_VALUE_MUST_BE_A_NUMBER), IssueSeverity.ERROR);
|
logError(line(main), col(main), npath, IssueType.INVALID, "Error parsing JSON: the primitive value must be a number", IssueSeverity.ERROR);
|
||||||
} else if (!p.isString())
|
} else if (!p.isString())
|
||||||
logError(line(main), col(main), npath, IssueType.INVALID, context.formatMessage(I18nConstants.ERROR_PARSING_JSON_THE_PRIMITIVE_VALUE_MUST_BE_A_STRING), IssueSeverity.ERROR);
|
logError(line(main), col(main), npath, IssueType.INVALID, "Error parsing JSON: the primitive value must be a string", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fork != null) {
|
if (fork != null) {
|
||||||
|
@ -336,12 +334,12 @@ public class JsonParser extends ParserBase {
|
||||||
private void parseResource(String npath, JsonObject res, Element parent, Property elementProperty) throws FHIRException {
|
private void parseResource(String npath, JsonObject res, Element parent, Property elementProperty) throws FHIRException {
|
||||||
JsonElement rt = res.get("resourceType");
|
JsonElement rt = res.get("resourceType");
|
||||||
if (rt == null) {
|
if (rt == null) {
|
||||||
logError(line(res), col(res), npath, IssueType.INVALID, context.formatMessage(I18nConstants.UNABLE_TO_FIND_RESOURCETYPE_PROPERTY), IssueSeverity.FATAL);
|
logError(line(res), col(res), npath, IssueType.INVALID, "Unable to find resourceType property", IssueSeverity.FATAL);
|
||||||
} else {
|
} else {
|
||||||
String name = rt.getAsString();
|
String name = rt.getAsString();
|
||||||
StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(name, context.getOverrideVersionNs()));
|
StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(name, context.getOverrideVersionNs()));
|
||||||
if (sd == null)
|
if (sd == null)
|
||||||
throw new FHIRFormatError(context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, name));
|
throw new FHIRFormatError("Contained resource does not appear to be a FHIR resource (unknown name '"+name+"')");
|
||||||
parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(parent.getProperty()), elementProperty);
|
parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(parent.getProperty()), elementProperty);
|
||||||
parent.setType(name);
|
parent.setType(name);
|
||||||
parseChildren(npath, res, parent, true);
|
parseChildren(npath, res, parent, true);
|
||||||
|
@ -505,7 +503,7 @@ public class JsonParser extends ParserBase {
|
||||||
try {
|
try {
|
||||||
json.value(new BigDecimal(item.getValue()));
|
json.value(new BigDecimal(item.getValue()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new NumberFormatException(context.formatMessage(I18nConstants.ERROR_WRITING_NUMBER__TO_JSON, item.getValue()));
|
throw new NumberFormatException("error writing number '"+item.getValue()+"' to JSON");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
json.value(item.getValue());
|
json.value(item.getValue());
|
||||||
|
|
|
@ -35,7 +35,6 @@ import org.hl7.fhir.r5.formats.IParser.OutputStyle;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||||
import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule;
|
import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
|
||||||
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.IssueSeverity;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
|
||||||
|
@ -92,11 +91,11 @@ public abstract class ParserBase {
|
||||||
|
|
||||||
protected StructureDefinition getDefinition(int line, int col, String ns, String name) throws FHIRFormatError {
|
protected StructureDefinition getDefinition(int line, int col, String ns, String name) throws FHIRFormatError {
|
||||||
if (ns == null) {
|
if (ns == null) {
|
||||||
logError(line, col, name, IssueType.STRUCTURE, context.formatMessage(I18nConstants.THIS__CANNOT_BE_PARSED_AS_A_FHIR_OBJECT_NO_NAMESPACE, name), IssueSeverity.FATAL);
|
logError(line, col, name, IssueType.STRUCTURE, "This '"+name+"' cannot be parsed as a FHIR object (no namespace)", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
logError(line, col, name, IssueType.STRUCTURE, context.formatMessage(I18nConstants.THIS_CANNOT_BE_PARSED_AS_A_FHIR_OBJECT_NO_NAME), IssueSeverity.FATAL);
|
logError(line, col, name, IssueType.STRUCTURE, "This cannot be parsed as a FHIR object (no name)", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
for (StructureDefinition sd : context.allStructures()) {
|
for (StructureDefinition sd : context.allStructures()) {
|
||||||
|
@ -108,13 +107,13 @@ public abstract class ParserBase {
|
||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logError(line, col, name, IssueType.STRUCTURE, context.formatMessage(I18nConstants.THIS_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAMESPACENAME_, ns, name), IssueSeverity.FATAL);
|
logError(line, col, name, IssueType.STRUCTURE, "This does not appear to be a FHIR resource (unknown namespace/name '"+ns+"::"+name+"')", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected StructureDefinition getDefinition(int line, int col, String name) throws FHIRFormatError {
|
protected StructureDefinition getDefinition(int line, int col, String name) throws FHIRFormatError {
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
logError(line, col, name, IssueType.STRUCTURE, context.formatMessage(I18nConstants.THIS_CANNOT_BE_PARSED_AS_A_FHIR_OBJECT_NO_NAME), IssueSeverity.FATAL);
|
logError(line, col, name, IssueType.STRUCTURE, "This cannot be parsed as a FHIR object (no name)", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// first pass: only look at base definitions
|
// first pass: only look at base definitions
|
||||||
|
@ -130,7 +129,7 @@ public abstract class ParserBase {
|
||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logError(line, col, name, IssueType.STRUCTURE, context.formatMessage(I18nConstants.THIS_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, name), IssueSeverity.FATAL);
|
logError(line, col, name, IssueType.STRUCTURE, "This does not appear to be a FHIR resource (unknown name '"+name+"')", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@ import org.hl7.fhir.r5.utils.formats.Turtle.TTLList;
|
||||||
import org.hl7.fhir.r5.utils.formats.Turtle.TTLLiteral;
|
import org.hl7.fhir.r5.utils.formats.Turtle.TTLLiteral;
|
||||||
import org.hl7.fhir.r5.utils.formats.Turtle.TTLObject;
|
import org.hl7.fhir.r5.utils.formats.Turtle.TTLObject;
|
||||||
import org.hl7.fhir.r5.utils.formats.Turtle.TTLURL;
|
import org.hl7.fhir.r5.utils.formats.Turtle.TTLURL;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
|
||||||
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.validation.ValidationMessage.IssueSeverity;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
|
||||||
|
@ -70,7 +69,7 @@ public class TurtleParser extends ParserBase {
|
||||||
try {
|
try {
|
||||||
src.parse(TextFile.streamToString(input));
|
src.parse(TextFile.streamToString(input));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logError(-1, -1, "(document)", IssueType.INVALID, context.formatMessage(I18nConstants.ERROR_PARSING_TURTLE_, e.getMessage()), IssueSeverity.FATAL);
|
logError(-1, -1, "(document)", IssueType.INVALID, "Error parsing Turtle: "+e.getMessage(), IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return parse(src);
|
return parse(src);
|
||||||
|
@ -102,7 +101,7 @@ public class TurtleParser extends ParserBase {
|
||||||
private Element parse(Turtle src, TTLComplex cmp) throws FHIRException {
|
private Element parse(Turtle src, TTLComplex cmp) throws FHIRException {
|
||||||
TTLObject type = cmp.getPredicates().get("http://www.w3.org/2000/01/rdf-schema#type");
|
TTLObject type = cmp.getPredicates().get("http://www.w3.org/2000/01/rdf-schema#type");
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
logError(cmp.getLine(), cmp.getCol(), "(document)", IssueType.INVALID, context.formatMessage(I18nConstants.UNKNOWN_RESOURCE_TYPE_MISSING_RDFSTYPE), IssueSeverity.FATAL);
|
logError(cmp.getLine(), cmp.getCol(), "(document)", IssueType.INVALID, "Unknown resource type (missing rdfs:type)", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (type instanceof TTLList) {
|
if (type instanceof TTLList) {
|
||||||
|
@ -115,7 +114,7 @@ public class TurtleParser extends ParserBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!(type instanceof TTLURL)) {
|
if (!(type instanceof TTLURL)) {
|
||||||
logError(cmp.getLine(), cmp.getCol(), "(document)", IssueType.INVALID, context.formatMessage(I18nConstants.UNEXPECTED_DATATYPE_FOR_RDFSTYPE), IssueSeverity.FATAL);
|
logError(cmp.getLine(), cmp.getCol(), "(document)", IssueType.INVALID, "Unexpected datatype for rdfs:type)", IssueSeverity.FATAL);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String name = ((TTLURL) type).getUri();
|
String name = ((TTLURL) type).getUri();
|
||||||
|
@ -135,9 +134,9 @@ public class TurtleParser extends ParserBase {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildren(Turtle src, String path, TTLComplex object, Element element, boolean primitive) throws FHIRException {
|
private void parseChildren(Turtle src, String path, TTLComplex object, Element context, boolean primitive) throws FHIRException {
|
||||||
|
|
||||||
List<Property> properties = element.getProperty().getChildProperties(element.getName(), null);
|
List<Property> properties = context.getProperty().getChildProperties(context.getName(), null);
|
||||||
Set<String> processed = new HashSet<String>();
|
Set<String> processed = new HashSet<String>();
|
||||||
if (primitive)
|
if (primitive)
|
||||||
processed.add(FHIR_URI_BASE + "value");
|
processed.add(FHIR_URI_BASE + "value");
|
||||||
|
@ -148,10 +147,10 @@ public class TurtleParser extends ParserBase {
|
||||||
if (property.isChoice()) {
|
if (property.isChoice()) {
|
||||||
for (TypeRefComponent type : property.getDefinition().getType()) {
|
for (TypeRefComponent type : property.getDefinition().getType()) {
|
||||||
String eName = property.getName().substring(0, property.getName().length()-3) + Utilities.capitalize(type.getCode());
|
String eName = property.getName().substring(0, property.getName().length()-3) + Utilities.capitalize(type.getCode());
|
||||||
parseChild(src, object, element, processed, property, path, getFormalName(property, eName));
|
parseChild(src, object, context, processed, property, path, getFormalName(property, eName));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
parseChild(src, object, element, processed, property, path, getFormalName(property));
|
parseChild(src, object, context, processed, property, path, getFormalName(property));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,7 +159,7 @@ public class TurtleParser extends ParserBase {
|
||||||
for (String u : object.getPredicates().keySet()) {
|
for (String u : object.getPredicates().keySet()) {
|
||||||
if (!processed.contains(u)) {
|
if (!processed.contains(u)) {
|
||||||
TTLObject n = object.getPredicates().get(u);
|
TTLObject n = object.getPredicates().get(u);
|
||||||
logError(n.getLine(), n.getCol(), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.UNRECOGNISED_PREDICATE_, u), IssueSeverity.ERROR);
|
logError(n.getLine(), n.getCol(), path, IssueType.STRUCTURE, "Unrecognised predicate '"+u+"'", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,13 +181,13 @@ public class TurtleParser extends ParserBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildInstance(Turtle src, String npath, TTLComplex object, Element element, Property property, String name, TTLObject e) throws FHIRException {
|
private void parseChildInstance(Turtle src, String npath, TTLComplex object, Element context, Property property, String name, TTLObject e) throws FHIRException {
|
||||||
if (property.isResource())
|
if (property.isResource())
|
||||||
parseResource(src, npath, object, element, property, name, e);
|
parseResource(src, npath, object, context, property, name, e);
|
||||||
else if (e instanceof TTLComplex) {
|
else if (e instanceof TTLComplex) {
|
||||||
TTLComplex child = (TTLComplex) e;
|
TTLComplex child = (TTLComplex) e;
|
||||||
Element n = new Element(tail(name), property).markLocation(e.getLine(), e.getCol());
|
Element n = new Element(tail(name), property).markLocation(e.getLine(), e.getCol());
|
||||||
element.getChildren().add(n);
|
context.getChildren().add(n);
|
||||||
if (property.isPrimitive(property.getType(tail(name)))) {
|
if (property.isPrimitive(property.getType(tail(name)))) {
|
||||||
parseChildren(src, npath, child, n, true);
|
parseChildren(src, npath, child, n, true);
|
||||||
TTLObject val = child.getPredicates().get(FHIR_URI_BASE + "value");
|
TTLObject val = child.getPredicates().get(FHIR_URI_BASE + "value");
|
||||||
|
@ -199,13 +198,13 @@ public class TurtleParser extends ParserBase {
|
||||||
// todo: check type
|
// todo: check type
|
||||||
n.setValue(value);
|
n.setValue(value);
|
||||||
} else
|
} else
|
||||||
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, context.formatMessage(I18nConstants.THIS_PROPERTY_MUST_BE_A_LITERAL_NOT_A_, e.getClass().getName()), IssueSeverity.ERROR);
|
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, "This property must be a Literal, not a "+e.getClass().getName(), IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
parseChildren(src, npath, child, n, false);
|
parseChildren(src, npath, child, n, false);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, context.formatMessage(I18nConstants.THIS_PROPERTY_MUST_BE_A_URI_OR_BNODE_NOT_A_, e.getClass().getName()), IssueSeverity.ERROR);
|
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, "This property must be a URI or bnode, not a "+e.getClass().getName(), IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -213,7 +212,7 @@ public class TurtleParser extends ParserBase {
|
||||||
return name.substring(name.lastIndexOf(".")+1);
|
return name.substring(name.lastIndexOf(".")+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseResource(Turtle src, String npath, TTLComplex object, Element element, Property property, String name, TTLObject e) throws FHIRException {
|
private void parseResource(Turtle src, String npath, TTLComplex object, Element context, Property property, String name, TTLObject e) throws FHIRException {
|
||||||
TTLComplex obj;
|
TTLComplex obj;
|
||||||
if (e instanceof TTLComplex)
|
if (e instanceof TTLComplex)
|
||||||
obj = (TTLComplex) e;
|
obj = (TTLComplex) e;
|
||||||
|
@ -221,15 +220,15 @@ public class TurtleParser extends ParserBase {
|
||||||
String url = ((TTLURL) e).getUri();
|
String url = ((TTLURL) e).getUri();
|
||||||
obj = src.getObject(url);
|
obj = src.getObject(url);
|
||||||
if (obj == null) {
|
if (obj == null) {
|
||||||
logError(e.getLine(), e.getCol(), npath, IssueType.INVALID, context.formatMessage(I18nConstants.REFERENCE_TO__CANNOT_BE_RESOLVED, url), IssueSeverity.FATAL);
|
logError(e.getLine(), e.getCol(), npath, IssueType.INVALID, "reference to "+url+" cannot be resolved", IssueSeverity.FATAL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
throw new FHIRFormatError(context.formatMessage(I18nConstants.WRONG_TYPE_FOR_RESOURCE));
|
throw new FHIRFormatError("Wrong type for resource");
|
||||||
|
|
||||||
TTLObject type = obj.getPredicates().get("http://www.w3.org/2000/01/rdf-schema#type");
|
TTLObject type = obj.getPredicates().get("http://www.w3.org/2000/01/rdf-schema#type");
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, context.formatMessage(I18nConstants.UNKNOWN_RESOURCE_TYPE_MISSING_RDFSTYPE), IssueSeverity.FATAL);
|
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, "Unknown resource type (missing rdfs:type)", IssueSeverity.FATAL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (type instanceof TTLList) {
|
if (type instanceof TTLList) {
|
||||||
|
@ -242,7 +241,7 @@ public class TurtleParser extends ParserBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!(type instanceof TTLURL)) {
|
if (!(type instanceof TTLURL)) {
|
||||||
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, context.formatMessage(I18nConstants.UNEXPECTED_DATATYPE_FOR_RDFSTYPE), IssueSeverity.FATAL);
|
logError(object.getLine(), object.getCol(), npath, IssueType.INVALID, "Unexpected datatype for rdfs:type)", IssueSeverity.FATAL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String rt = ((TTLURL) type).getUri();
|
String rt = ((TTLURL) type).getUri();
|
||||||
|
@ -254,7 +253,7 @@ public class TurtleParser extends ParserBase {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Element n = new Element(tail(name), property).markLocation(object.getLine(), object.getCol());
|
Element n = new Element(tail(name), property).markLocation(object.getLine(), object.getCol());
|
||||||
element.getChildren().add(n);
|
context.getChildren().add(n);
|
||||||
n.updateProperty(new Property(this.context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(n.getProperty()), property);
|
n.updateProperty(new Property(this.context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(n.getProperty()), property);
|
||||||
n.setType(rt);
|
n.setType(rt);
|
||||||
parseChildren(src, npath, obj, n, false);
|
parseChildren(src, npath, obj, n, false);
|
||||||
|
@ -279,7 +278,7 @@ public class TurtleParser extends ParserBase {
|
||||||
if (en == null)
|
if (en == null)
|
||||||
en = property.getDefinition().getPath();
|
en = property.getDefinition().getPath();
|
||||||
if (!en.endsWith("[x]"))
|
if (!en.endsWith("[x]"))
|
||||||
throw new Error(context.formatMessage(I18nConstants.ATTEMPT_TO_REPLACE_ELEMENT_NAME_FOR_A_NONCHOICE_TYPE));
|
throw new Error("Attempt to replace element name for a non-choice type");
|
||||||
return en.substring(0, en.lastIndexOf(".")+1)+elementName;
|
return en.substring(0, en.lastIndexOf(".")+1)+elementName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,6 @@ import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
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;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||||
|
@ -141,8 +140,7 @@ public class XmlParser extends ParserBase {
|
||||||
Node node = document.getFirstChild();
|
Node node = document.getFirstChild();
|
||||||
while (node != null) {
|
while (node != null) {
|
||||||
if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE)
|
if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE)
|
||||||
logError(line(document), col(document), "(document)", IssueType.INVALID, context.formatMessage(
|
logError(line(document), col(document), "(document)", IssueType.INVALID, "No processing instructions allowed in resources", IssueSeverity.ERROR);
|
||||||
I18nConstants.NO_PROCESSING_INSTRUCTIONS_ALLOWED_IN_RESOURCES), IssueSeverity.ERROR);
|
|
||||||
node = node.getNextSibling();
|
node = node.getNextSibling();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -216,14 +214,14 @@ public class XmlParser extends ParserBase {
|
||||||
private void checkElement(org.w3c.dom.Element element, String path, Property prop) throws FHIRFormatError {
|
private void checkElement(org.w3c.dom.Element element, String path, Property prop) throws FHIRFormatError {
|
||||||
if (policy == ValidationPolicy.EVERYTHING) {
|
if (policy == ValidationPolicy.EVERYTHING) {
|
||||||
if (empty(element) && FormatUtilities.FHIR_NS.equals(element.getNamespaceURI())) // this rule only applies to FHIR Content
|
if (empty(element) && FormatUtilities.FHIR_NS.equals(element.getNamespaceURI())) // this rule only applies to FHIR Content
|
||||||
logError(line(element), col(element), path, IssueType.INVALID, context.formatMessage(I18nConstants.ELEMENT_MUST_HAVE_SOME_CONTENT), IssueSeverity.ERROR);
|
logError(line(element), col(element), path, IssueType.INVALID, "Element must have some content", IssueSeverity.ERROR);
|
||||||
String ns = FormatUtilities.FHIR_NS;
|
String ns = FormatUtilities.FHIR_NS;
|
||||||
if (ToolingExtensions.hasExtension(prop.getDefinition(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace"))
|
if (ToolingExtensions.hasExtension(prop.getDefinition(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace"))
|
||||||
ns = ToolingExtensions.readStringExtension(prop.getDefinition(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace");
|
ns = ToolingExtensions.readStringExtension(prop.getDefinition(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace");
|
||||||
else if (ToolingExtensions.hasExtension(prop.getStructure(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace"))
|
else if (ToolingExtensions.hasExtension(prop.getStructure(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace"))
|
||||||
ns = ToolingExtensions.readStringExtension(prop.getStructure(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace");
|
ns = ToolingExtensions.readStringExtension(prop.getStructure(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace");
|
||||||
if (!element.getNamespaceURI().equals(ns))
|
if (!element.getNamespaceURI().equals(ns))
|
||||||
logError(line(element), col(element), path, IssueType.INVALID, context.formatMessage(I18nConstants.WRONG_NAMESPACE__EXPECTED_, ns), IssueSeverity.ERROR);
|
logError(line(element), col(element), path, IssueType.INVALID, "Wrong namespace - expected '"+ns+"'", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,10 +236,10 @@ public class XmlParser extends ParserBase {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseChildren(String path, org.w3c.dom.Element node, Element element) throws FHIRFormatError, FHIRException, IOException, DefinitionException {
|
private void parseChildren(String path, org.w3c.dom.Element node, Element context) throws FHIRFormatError, FHIRException, IOException, DefinitionException {
|
||||||
// this parsing routine retains the original order in a the XML file, to support validation
|
// this parsing routine retains the original order in a the XML file, to support validation
|
||||||
reapComments(node, element);
|
reapComments(node, context);
|
||||||
List<Property> properties = element.getProperty().getChildProperties(element.getName(), XMLUtil.getXsiType(node));
|
List<Property> properties = context.getProperty().getChildProperties(context.getName(), XMLUtil.getXsiType(node));
|
||||||
|
|
||||||
String text = XMLUtil.getDirectText(node).trim();
|
String text = XMLUtil.getDirectText(node).trim();
|
||||||
if (!Utilities.noString(text)) {
|
if (!Utilities.noString(text)) {
|
||||||
|
@ -249,17 +247,17 @@ public class XmlParser extends ParserBase {
|
||||||
if (property != null) {
|
if (property != null) {
|
||||||
if ("ED.data[x]".equals(property.getDefinition().getId()) || (property.getDefinition()!=null && property.getDefinition().getBase()!=null && "ED.data[x]".equals(property.getDefinition().getBase().getPath()))) {
|
if ("ED.data[x]".equals(property.getDefinition().getId()) || (property.getDefinition()!=null && property.getDefinition().getBase()!=null && "ED.data[x]".equals(property.getDefinition().getBase().getPath()))) {
|
||||||
if ("B64".equals(node.getAttribute("representation"))) {
|
if ("B64".equals(node.getAttribute("representation"))) {
|
||||||
element.getChildren().add(new Element("dataBase64Binary", property, "base64Binary", text).markLocation(line(node), col(node)));
|
context.getChildren().add(new Element("dataBase64Binary", property, "base64Binary", text).markLocation(line(node), col(node)));
|
||||||
} else {
|
} else {
|
||||||
element.getChildren().add(new Element("dataString", property, "string", text).markLocation(line(node), col(node)));
|
context.getChildren().add(new Element("dataString", property, "string", text).markLocation(line(node), col(node)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
element.getChildren().add(
|
context.getChildren().add(
|
||||||
new Element(property.getName(), property, property.getType(), text).markLocation(line(node), col(node)));
|
new Element(property.getName(), property, property.getType(), text).markLocation(line(node), col(node)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logError(line(node), col(node), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.TEXT_SHOULD_NOT_BE_PRESENT), IssueSeverity.ERROR);
|
logError(line(node), col(node), path, IssueType.STRUCTURE, "Text should not be present", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,10 +269,10 @@ public class XmlParser extends ParserBase {
|
||||||
String av = attr.getNodeValue();
|
String av = attr.getNodeValue();
|
||||||
if (ToolingExtensions.hasExtension(property.getDefinition(), "http://www.healthintersections.com.au/fhir/StructureDefinition/elementdefinition-dateformat"))
|
if (ToolingExtensions.hasExtension(property.getDefinition(), "http://www.healthintersections.com.au/fhir/StructureDefinition/elementdefinition-dateformat"))
|
||||||
av = convertForDateFormatFromExternal(ToolingExtensions.readStringExtension(property.getDefinition(), "http://www.healthintersections.com.au/fhir/StructureDefinition/elementdefinition-dateformat"), av);
|
av = convertForDateFormatFromExternal(ToolingExtensions.readStringExtension(property.getDefinition(), "http://www.healthintersections.com.au/fhir/StructureDefinition/elementdefinition-dateformat"), av);
|
||||||
if (property.getName().equals("value") && element.isPrimitive())
|
if (property.getName().equals("value") && context.isPrimitive())
|
||||||
element.setValue(av);
|
context.setValue(av);
|
||||||
else
|
else
|
||||||
element.getChildren().add(new Element(property.getName(), property, property.getType(), av).markLocation(line(node), col(node)));
|
context.getChildren().add(new Element(property.getName(), property, property.getType(), av).markLocation(line(node), col(node)));
|
||||||
} else {
|
} else {
|
||||||
boolean ok = false;
|
boolean ok = false;
|
||||||
if (FormatUtilities.FHIR_NS.equals(node.getNamespaceURI())) {
|
if (FormatUtilities.FHIR_NS.equals(node.getNamespaceURI())) {
|
||||||
|
@ -283,9 +281,9 @@ public class XmlParser extends ParserBase {
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
ok = ok || (attr.getLocalName().equals("schemaLocation")); // xsi:schemalocation allowed for non FHIR content
|
ok = ok || (attr.getLocalName().equals("schemaLocation")); // xsi:schemalocation allowed for non FHIR content
|
||||||
ok = ok || (hasTypeAttr(element) && attr.getLocalName().equals("type") && FormatUtilities.NS_XSI.equals(attr.getNamespaceURI())); // xsi:type allowed if element says so
|
ok = ok || (hasTypeAttr(context) && attr.getLocalName().equals("type") && FormatUtilities.NS_XSI.equals(attr.getNamespaceURI())); // xsi:type allowed if element says so
|
||||||
if (!ok)
|
if (!ok)
|
||||||
logError(line(node), col(node), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.UNDEFINED_ATTRIBUTE__ON__FOR_TYPE__PROPERTIES__, attr.getNodeName(), node.getNodeName(), element.fhirType(), properties), IssueSeverity.ERROR);
|
logError(line(node), col(node), path, IssueType.STRUCTURE, "Undefined attribute '@"+attr.getNodeName()+"' on "+node.getNodeName()+" for type "+context.fhirType()+" (properties = "+properties+")", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,7 +299,7 @@ public class XmlParser extends ParserBase {
|
||||||
xhtml = new CDANarrativeFormat().convert((org.w3c.dom.Element) child);
|
xhtml = new CDANarrativeFormat().convert((org.w3c.dom.Element) child);
|
||||||
else
|
else
|
||||||
xhtml = new XhtmlParser().setValidatorMode(true).parseHtmlNode((org.w3c.dom.Element) child);
|
xhtml = new XhtmlParser().setValidatorMode(true).parseHtmlNode((org.w3c.dom.Element) child);
|
||||||
element.getChildren().add(new Element(property.getName(), property, "xhtml", new XhtmlComposer(XhtmlComposer.XML, false).compose(xhtml)).setXhtml(xhtml).markLocation(line(child), col(child)));
|
context.getChildren().add(new Element(property.getName(), property, "xhtml", new XhtmlComposer(XhtmlComposer.XML, false).compose(xhtml)).setXhtml(xhtml).markLocation(line(child), col(child)));
|
||||||
} else {
|
} else {
|
||||||
String npath = path+"/"+pathPrefix(child.getNamespaceURI())+child.getLocalName();
|
String npath = path+"/"+pathPrefix(child.getNamespaceURI())+child.getLocalName();
|
||||||
Element n = new Element(child.getLocalName(), property).markLocation(line(child), col(child));
|
Element n = new Element(child.getLocalName(), property).markLocation(line(child), col(child));
|
||||||
|
@ -315,7 +313,7 @@ public class XmlParser extends ParserBase {
|
||||||
xsiType = ToolingExtensions.readStringExtension(property.getDefinition(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-defaulttype");
|
xsiType = ToolingExtensions.readStringExtension(property.getDefinition(), "http://hl7.org/fhir/StructureDefinition/elementdefinition-defaulttype");
|
||||||
n.setType(xsiType);
|
n.setType(xsiType);
|
||||||
} else {
|
} else {
|
||||||
logError(line(child), col(child), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.NO_TYPE_FOUND_ON_, child.getLocalName()), IssueSeverity.ERROR);
|
logError(line(child), col(child), path, IssueType.STRUCTURE, "No type found on '"+child.getLocalName()+'"', IssueSeverity.ERROR);
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -327,7 +325,7 @@ public class XmlParser extends ParserBase {
|
||||||
} else
|
} else
|
||||||
n.setType(n.getType());
|
n.setType(n.getType());
|
||||||
}
|
}
|
||||||
element.getChildren().add(n);
|
context.getChildren().add(n);
|
||||||
if (ok) {
|
if (ok) {
|
||||||
if (property.isResource())
|
if (property.isResource())
|
||||||
parseResource(npath, (org.w3c.dom.Element) child, n, property);
|
parseResource(npath, (org.w3c.dom.Element) child, n, property);
|
||||||
|
@ -336,11 +334,11 @@ public class XmlParser extends ParserBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
logError(line(child), col(child), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.UNDEFINED_ELEMENT_, child.getLocalName()), IssueSeverity.ERROR);
|
logError(line(child), col(child), path, IssueType.STRUCTURE, "Undefined element '"+child.getLocalName()+"'", IssueSeverity.ERROR);
|
||||||
} else if (child.getNodeType() == Node.CDATA_SECTION_NODE){
|
} else if (child.getNodeType() == Node.CDATA_SECTION_NODE){
|
||||||
logError(line(child), col(child), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.CDATA_IS_NOT_ALLOWED), IssueSeverity.ERROR);
|
logError(line(child), col(child), path, IssueType.STRUCTURE, "CDATA is not allowed", IssueSeverity.ERROR);
|
||||||
} else if (!Utilities.existsInList(child.getNodeType(), 3, 8)) {
|
} else if (!Utilities.existsInList(child.getNodeType(), 3, 8)) {
|
||||||
logError(line(child), col(child), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.NODE_TYPE__IS_NOT_ALLOWED, Integer.toString(child.getNodeType())), IssueSeverity.ERROR);
|
logError(line(child), col(child), path, IssueType.STRUCTURE, "Node type "+Integer.toString(child.getNodeType())+" is not allowed", IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
child = child.getNextSibling();
|
child = child.getNextSibling();
|
||||||
}
|
}
|
||||||
|
@ -357,8 +355,7 @@ public class XmlParser extends ParserBase {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
for (Property p : propsSortedByLongestFirst)
|
for (Property p : propsSortedByLongestFirst)
|
||||||
if (!p.getDefinition().hasRepresentation(PropertyRepresentation.XMLATTR) && !p.getDefinition().hasRepresentation(
|
if (!p.getDefinition().hasRepresentation(PropertyRepresentation.XMLATTR) && !p.getDefinition().hasRepresentation(PropertyRepresentation.XMLTEXT)) {
|
||||||
PropertyRepresentation.XMLTEXT)) {
|
|
||||||
if (p.getName().equals(nodeName))
|
if (p.getName().equals(nodeName))
|
||||||
return p;
|
return p;
|
||||||
if (p.getName().endsWith("[x]") && nodeName.length() > p.getName().length()-3 && p.getName().substring(0, p.getName().length()-3).equals(nodeName.substring(0, p.getName().length()-3)))
|
if (p.getName().endsWith("[x]") && nodeName.length() > p.getName().length()-3 && p.getName().substring(0, p.getName().length()-3).equals(nodeName.substring(0, p.getName().length()-3)))
|
||||||
|
@ -369,8 +366,7 @@ public class XmlParser extends ParserBase {
|
||||||
|
|
||||||
private Property getAttrProp(List<Property> properties, String nodeName) {
|
private Property getAttrProp(List<Property> properties, String nodeName) {
|
||||||
for (Property p : properties)
|
for (Property p : properties)
|
||||||
if (p.getName().equals(nodeName) && p.getDefinition().hasRepresentation(
|
if (p.getName().equals(nodeName) && p.getDefinition().hasRepresentation(PropertyRepresentation.XMLATTR))
|
||||||
PropertyRepresentation.XMLATTR))
|
|
||||||
return p;
|
return p;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -387,7 +383,7 @@ public class XmlParser extends ParserBase {
|
||||||
DateTimeType d = DateTimeType.parseV3(av);
|
DateTimeType d = DateTimeType.parseV3(av);
|
||||||
return d.asStringValue();
|
return d.asStringValue();
|
||||||
} else
|
} else
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNKNOWN_DATA_FORMAT_, fmt));
|
throw new FHIRException("Unknown Data format '"+fmt+"'");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String convertForDateFormatToExternal(String fmt, String av) throws FHIRException {
|
private String convertForDateFormatToExternal(String fmt, String av) throws FHIRException {
|
||||||
|
@ -395,7 +391,7 @@ public class XmlParser extends ParserBase {
|
||||||
DateTimeType d = new DateTimeType(av);
|
DateTimeType d = new DateTimeType(av);
|
||||||
return d.getAsV3();
|
return d.getAsV3();
|
||||||
} else
|
} else
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNKNOWN_DATE_FORMAT_, fmt));
|
throw new FHIRException("Unknown Date format '"+fmt+"'");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseResource(String string, org.w3c.dom.Element container, Element parent, Property elementProperty) throws FHIRFormatError, DefinitionException, FHIRException, IOException {
|
private void parseResource(String string, org.w3c.dom.Element container, Element parent, Property elementProperty) throws FHIRFormatError, DefinitionException, FHIRException, IOException {
|
||||||
|
@ -403,7 +399,7 @@ public class XmlParser extends ParserBase {
|
||||||
String name = res.getLocalName();
|
String name = res.getLocalName();
|
||||||
StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(name, context.getOverrideVersionNs()));
|
StructureDefinition sd = context.fetchResource(StructureDefinition.class, ProfileUtilities.sdNs(name, context.getOverrideVersionNs()));
|
||||||
if (sd == null)
|
if (sd == null)
|
||||||
throw new FHIRFormatError(context.formatMessage(I18nConstants.CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_, res.getLocalName()));
|
throw new FHIRFormatError("Contained resource does not appear to be a FHIR resource (unknown name '"+res.getLocalName()+"')");
|
||||||
parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(parent.getProperty()), elementProperty);
|
parent.updateProperty(new Property(context, sd.getSnapshot().getElement().get(0), sd), SpecialElement.fromProperty(parent.getProperty()), elementProperty);
|
||||||
parent.setType(name);
|
parent.setType(name);
|
||||||
parseChildren(res.getLocalName(), res, parent);
|
parseChildren(res.getLocalName(), res, parent);
|
||||||
|
|
|
@ -45,7 +45,6 @@ import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ConceptSetFilterComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ConceptSetFilterComponent;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
||||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationOptions;
|
import org.hl7.fhir.utilities.validation.ValidationOptions;
|
||||||
import org.hl7.fhir.utilities.validation.ValidationOptions.ValueSetMode;
|
import org.hl7.fhir.utilities.validation.ValidationOptions.ValueSetMode;
|
||||||
|
@ -71,7 +70,7 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
if (options.getValueSetMode() != ValueSetMode.CHECK_MEMERSHIP_ONLY) {
|
if (options.getValueSetMode() != ValueSetMode.CHECK_MEMERSHIP_ONLY) {
|
||||||
for (Coding c : code.getCoding()) {
|
for (Coding c : code.getCoding()) {
|
||||||
if (!c.hasSystem())
|
if (!c.hasSystem())
|
||||||
warnings.add(context.formatMessage(I18nConstants.CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE));
|
warnings.add("Coding has no system - cannot validate");
|
||||||
CodeSystem cs = context.fetchCodeSystem(c.getSystem());
|
CodeSystem cs = context.fetchCodeSystem(c.getSystem());
|
||||||
ValidationResult res = null;
|
ValidationResult res = null;
|
||||||
if (cs == null || cs.getContent() != CodeSystemContentMode.COMPLETE) {
|
if (cs == null || cs.getContent() != CodeSystemContentMode.COMPLETE) {
|
||||||
|
@ -91,7 +90,7 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
ok = ok || codeInValueSet(c.getSystem(), c.getCode());
|
ok = ok || codeInValueSet(c.getSystem(), c.getCode());
|
||||||
}
|
}
|
||||||
if (!ok)
|
if (!ok)
|
||||||
errors.add(0, context.formatMessage(I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl()));
|
errors.add(0, "None of the provided codes are in the value set "+valueset.getUrl());
|
||||||
}
|
}
|
||||||
if (errors.size() > 0)
|
if (errors.size() > 0)
|
||||||
return new ValidationResult(IssueSeverity.ERROR, errors.toString());
|
return new ValidationResult(IssueSeverity.ERROR, errors.toString());
|
||||||
|
@ -139,7 +138,7 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
if (!inExpansion)
|
if (!inExpansion)
|
||||||
res.setMessage("Not in value set "+valueset.getUrl()).setSeverity(IssueSeverity.ERROR);
|
res.setMessage("Not in value set "+valueset.getUrl()).setSeverity(IssueSeverity.ERROR);
|
||||||
else if (warningMessage!=null)
|
else if (warningMessage!=null)
|
||||||
res = new ValidationResult(IssueSeverity.WARNING, context.formatMessage(I18nConstants.CODE_FOUND_IN_EXPANSION_HOWEVER_, warningMessage));
|
res = new ValidationResult(IssueSeverity.WARNING, "Code found in expansion, however: " + warningMessage);
|
||||||
else
|
else
|
||||||
res.setMessage("Code found in expansion, however: " + res.getMessage());
|
res.setMessage("Code found in expansion, however: " + res.getMessage());
|
||||||
}
|
}
|
||||||
|
@ -166,7 +165,7 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
private ValidationResult validateCode(Coding code, CodeSystem cs) {
|
private ValidationResult validateCode(Coding code, CodeSystem cs) {
|
||||||
ConceptDefinitionComponent cc = findCodeInConcept(cs.getConcept(), code.getCode());
|
ConceptDefinitionComponent cc = findCodeInConcept(cs.getConcept(), code.getCode());
|
||||||
if (cc == null)
|
if (cc == null)
|
||||||
return new ValidationResult(IssueSeverity.ERROR, context.formatMessage(I18nConstants.UNKNOWN_CODE__IN_, gen(code), cs.getUrl()));
|
return new ValidationResult(IssueSeverity.ERROR, "Unknown Code "+gen(code)+" in "+cs.getUrl());
|
||||||
if (code.getDisplay() == null)
|
if (code.getDisplay() == null)
|
||||||
return new ValidationResult(cc);
|
return new ValidationResult(cc);
|
||||||
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
|
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
|
||||||
|
@ -194,7 +193,7 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
return new ValidationResult(cc);
|
return new ValidationResult(cc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new ValidationResult(IssueSeverity.WARNING, context.formatMessage(I18nConstants.DISPLAY_NAME_FOR__SHOULD_BE_ONE_OF__INSTEAD_OF_, code.getSystem(), code.getCode(), b.toString(), code.getDisplay()), cc);
|
return new ValidationResult(IssueSeverity.WARNING, "Display Name for "+code.getSystem()+"#"+code.getCode()+" should be one of '"+b.toString()+"' instead of '"+code.getDisplay()+"'", cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ConceptReferenceComponent findValueSetRef(String system, String code) {
|
private ConceptReferenceComponent findValueSetRef(String system, String code) {
|
||||||
|
@ -234,25 +233,25 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
|
|
||||||
private String getValueSetSystem() throws FHIRException {
|
private String getValueSetSystem() throws FHIRException {
|
||||||
if (valueset == null)
|
if (valueset == null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SYSTEM__NO_VALUE_SET));
|
throw new FHIRException("Unable to resolve system - no value set");
|
||||||
if (valueset.getCompose().hasExclude())
|
if (valueset.getCompose().hasExclude())
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_EXCLUDES));
|
throw new FHIRException("Unable to resolve system - value set has excludes");
|
||||||
if (valueset.getCompose().getInclude().size() == 0) {
|
if (valueset.getCompose().getInclude().size() == 0) {
|
||||||
if (!valueset.hasExpansion() || valueset.getExpansion().getContains().size() == 0)
|
if (!valueset.hasExpansion() || valueset.getExpansion().getContains().size() == 0)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_NO_INCLUDES_OR_EXPANSION));
|
throw new FHIRException("Unable to resolve system - value set has no includes or expansion");
|
||||||
else {
|
else {
|
||||||
String cs = valueset.getExpansion().getContains().get(0).getSystem();
|
String cs = valueset.getExpansion().getContains().get(0).getSystem();
|
||||||
if (cs != null && checkSystem(valueset.getExpansion().getContains(), cs))
|
if (cs != null && checkSystem(valueset.getExpansion().getContains(), cs))
|
||||||
return cs;
|
return cs;
|
||||||
else
|
else
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_EXPANSION_HAS_MULTIPLE_SYSTEMS));
|
throw new FHIRException("Unable to resolve system - value set expansion has multiple systems");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ConceptSetComponent inc : valueset.getCompose().getInclude()) {
|
for (ConceptSetComponent inc : valueset.getCompose().getInclude()) {
|
||||||
if (inc.hasValueSet())
|
if (inc.hasValueSet())
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_IMPORTS));
|
throw new FHIRException("Unable to resolve system - value set has imports");
|
||||||
if (!inc.hasSystem())
|
if (!inc.hasSystem())
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_INCLUDE_WITH_NO_SYSTEM));
|
throw new FHIRException("Unable to resolve system - value set has include with no system");
|
||||||
}
|
}
|
||||||
if (valueset.getCompose().getInclude().size() == 1)
|
if (valueset.getCompose().getInclude().size() == 1)
|
||||||
return valueset.getCompose().getInclude().get(0).getSystem();
|
return valueset.getCompose().getInclude().get(0).getSystem();
|
||||||
|
@ -396,7 +395,7 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
return codeInConceptFilter(cs, f, code);
|
return codeInConceptFilter(cs, f, code);
|
||||||
else {
|
else {
|
||||||
System.out.println("todo: handle filters with property = "+f.getProperty());
|
System.out.println("todo: handle filters with property = "+f.getProperty());
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_HANDLE_SYSTEM__FILTER_WITH_PROPERTY__, cs.getUrl(), f.getProperty()));
|
throw new FHIRException("Unable to handle system "+cs.getUrl()+" filter with property = "+f.getProperty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -406,7 +405,7 @@ public class ValueSetCheckerSimple implements ValueSetChecker {
|
||||||
case ISNOTA: return !codeInConceptIsAFilter(cs, f, code);
|
case ISNOTA: return !codeInConceptIsAFilter(cs, f, code);
|
||||||
default:
|
default:
|
||||||
System.out.println("todo: handle concept filters with op = "+f.getOp());
|
System.out.println("todo: handle concept filters with op = "+f.getOp());
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_HANDLE_SYSTEM__CONCEPT_FILTER_WITH_OP__, cs.getUrl(), f.getOp()));
|
throw new FHIRException("Unable to handle system "+cs.getUrl()+" concept filter with op = "+f.getOp());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,9 +144,8 @@ public interface IResourceValidator {
|
||||||
public boolean isShowMessagesFromReferences();
|
public boolean isShowMessagesFromReferences();
|
||||||
public void setShowMessagesFromReferences(boolean value);
|
public void setShowMessagesFromReferences(boolean value);
|
||||||
|
|
||||||
//FIXME: don't need that, gets never used?
|
public String getValidationLanguage();
|
||||||
// public String getValidationLanguage();
|
public void setValidationLanguage(String value);
|
||||||
// public void setValidationLanguage(String value);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* It's common to see references such as Patient/234234 - these usually mean a reference to a Patient resource.
|
* It's common to see references such as Patient/234234 - these usually mean a reference to a Patient resource.
|
||||||
|
|
|
@ -64,16 +64,17 @@ public class BaseValidator {
|
||||||
|
|
||||||
protected Source source;
|
protected Source source;
|
||||||
protected IWorkerContext context;
|
protected IWorkerContext context;
|
||||||
|
private ResourceBundle messages;
|
||||||
|
|
||||||
public BaseValidator(IWorkerContext context){
|
public BaseValidator(IWorkerContext context){
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
messages = ResourceBundle.getBundle("Messages", context.getLocale() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void setContext(IWorkerContext context) {
|
public void setContext(IWorkerContext context) {
|
||||||
// this.context = context;
|
this.context = context;
|
||||||
// i18Nmessages = ResourceBundle.getBundle("Messages", context.getLocale() );
|
messages = ResourceBundle.getBundle("Messages", context.getLocale() );
|
||||||
// }
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test a rule and add a {@link IssueSeverity#FATAL} validation message if the validation fails
|
* Test a rule and add a {@link IssueSeverity#FATAL} validation message if the validation fails
|
||||||
|
@ -92,7 +93,7 @@ public class BaseValidator {
|
||||||
|
|
||||||
protected boolean fail(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean fail(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String msg = context.formatMessage(theMessage, theMessageArguments);
|
String msg = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, line, col, path, msg, IssueSeverity.FATAL);
|
addValidationMessage(errors, type, line, col, path, msg, IssueSeverity.FATAL);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -123,7 +124,7 @@ public class BaseValidator {
|
||||||
protected boolean fail(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean fail(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String path = toPath(pathParts);
|
String path = toPath(pathParts);
|
||||||
addValidationMessage(errors, type, -1, -1, path, context.formatMessage(theMessage, theMessageArguments), IssueSeverity.FATAL);
|
addValidationMessage(errors, type, -1, -1, path, formatMessage(theMessage, theMessageArguments), IssueSeverity.FATAL);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
}
|
}
|
||||||
|
@ -142,6 +143,21 @@ public class BaseValidator {
|
||||||
return thePass;
|
return thePass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected String formatMessage(String theMessage, Object... theMessageArguments) {
|
||||||
|
String message = "";
|
||||||
|
if (messages.containsKey(theMessage)) {
|
||||||
|
if (theMessageArguments != null && theMessageArguments.length > 0) {
|
||||||
|
message = MessageFormat.format(messages.getString(theMessage), theMessageArguments);
|
||||||
|
} else if (messages.containsKey(theMessage)) {
|
||||||
|
message = messages.getString(theMessage);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
message = theMessage;
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean grammarWord(String w) {
|
protected boolean grammarWord(String w) {
|
||||||
return w.equals("and") || w.equals("or") || w.equals("a") || w.equals("the") || w.equals("for") || w.equals("this") || w.equals("that") || w.equals("of");
|
return w.equals("and") || w.equals("or") || w.equals("a") || w.equals("the") || w.equals("for") || w.equals("this") || w.equals("that") || w.equals("of");
|
||||||
}
|
}
|
||||||
|
@ -155,7 +171,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean hint(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg) {
|
protected boolean hint(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String message = context.formatMessage(msg);
|
String message = formatMessage(msg);
|
||||||
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION);
|
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -185,7 +201,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean hint(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean hint(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION);
|
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -193,7 +209,7 @@ public class BaseValidator {
|
||||||
|
|
||||||
protected boolean txHint(List<ValidationMessage> errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean txHint(List<ValidationMessage> errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION, Source.TerminologyEngine).setTxLink(txLink);
|
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION, Source.TerminologyEngine).setTxLink(txLink);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -209,7 +225,7 @@ public class BaseValidator {
|
||||||
protected boolean hint(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean hint(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String path = toPath(pathParts);
|
String path = toPath(pathParts);
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.INFORMATION);
|
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.INFORMATION);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -238,7 +254,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean rule(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean rule(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.ERROR);
|
addValidationMessage(errors, type, line, col, path, message, IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -246,7 +262,7 @@ public class BaseValidator {
|
||||||
|
|
||||||
protected boolean txRule(List<ValidationMessage> errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean txRule(List<ValidationMessage> errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
errors.add(new ValidationMessage(Source.TerminologyEngine, type, line, col, path, message, IssueSeverity.ERROR).setTxLink(txLink));
|
errors.add(new ValidationMessage(Source.TerminologyEngine, type, line, col, path, message, IssueSeverity.ERROR).setTxLink(txLink));
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -277,7 +293,7 @@ public class BaseValidator {
|
||||||
protected boolean rule(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean rule(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String path = toPath(pathParts);
|
String path = toPath(pathParts);
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.ERROR);
|
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -301,7 +317,7 @@ public class BaseValidator {
|
||||||
|
|
||||||
protected boolean rule(List<ValidationMessage> errors, IssueType type, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean rule(List<ValidationMessage> errors, IssueType type, String path, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.ERROR);
|
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.ERROR);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -365,7 +381,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean warning(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
protected boolean warning(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
msg = context.formatMessage(msg, theMessageArguments);
|
msg = formatMessage(msg, theMessageArguments);
|
||||||
IssueSeverity severity = IssueSeverity.WARNING;
|
IssueSeverity severity = IssueSeverity.WARNING;
|
||||||
addValidationMessage(errors, type, line, col, path, msg, severity);
|
addValidationMessage(errors, type, line, col, path, msg, severity);
|
||||||
}
|
}
|
||||||
|
@ -393,7 +409,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean txWarning(List<ValidationMessage> errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
protected boolean txWarning(List<ValidationMessage> errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
msg = context.formatMessage(msg, theMessageArguments);
|
msg = formatMessage(msg, theMessageArguments);
|
||||||
errors.add(new ValidationMessage(Source.TerminologyEngine, type, line, col, path, msg, IssueSeverity.WARNING).setTxLink(txLink));
|
errors.add(new ValidationMessage(Source.TerminologyEngine, type, line, col, path, msg, IssueSeverity.WARNING).setTxLink(txLink));
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -402,7 +418,7 @@ public class BaseValidator {
|
||||||
|
|
||||||
protected boolean warningOrError(boolean isError, List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
protected boolean warningOrError(boolean isError, List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
msg = context.formatMessage(msg, theMessageArguments);
|
msg = formatMessage(msg, theMessageArguments);
|
||||||
addValidationMessage(errors, type, line, col, path, msg, isError ? IssueSeverity.ERROR : IssueSeverity.WARNING);
|
addValidationMessage(errors, type, line, col, path, msg, isError ? IssueSeverity.ERROR : IssueSeverity.WARNING);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -419,7 +435,7 @@ public class BaseValidator {
|
||||||
protected boolean warning(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean warning(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String path = toPath(pathParts);
|
String path = toPath(pathParts);
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.WARNING);
|
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.WARNING);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -462,7 +478,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean warning(List<ValidationMessage> errors, IssueType type, String path, boolean thePass, String msg, String html, Object... theMessageArguments) {
|
protected boolean warning(List<ValidationMessage> errors, IssueType type, String path, boolean thePass, String msg, String html, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
msg = context.formatMessage(msg, theMessageArguments);
|
msg = formatMessage(msg, theMessageArguments);
|
||||||
addValidationMessage(errors, type, path, msg, html, IssueSeverity.WARNING);
|
addValidationMessage(errors, type, path, msg, html, IssueSeverity.WARNING);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -478,7 +494,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean suppressedwarning(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
protected boolean suppressedwarning(List<ValidationMessage> errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
msg = context.formatMessage(msg, theMessageArguments);
|
msg = formatMessage(msg, theMessageArguments);
|
||||||
addValidationMessage(errors, type, line, col, path, msg, IssueSeverity.INFORMATION);
|
addValidationMessage(errors, type, line, col, path, msg, IssueSeverity.INFORMATION);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -495,7 +511,7 @@ public class BaseValidator {
|
||||||
protected boolean suppressedwarning(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
protected boolean suppressedwarning(List<ValidationMessage> errors, IssueType type, List<String> pathParts, boolean thePass, String theMessage, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
String path = toPath(pathParts);
|
String path = toPath(pathParts);
|
||||||
String message = context.formatMessage(theMessage, theMessageArguments);
|
String message = formatMessage(theMessage, theMessageArguments);
|
||||||
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.INFORMATION);
|
addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.INFORMATION);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
@ -543,7 +559,7 @@ public class BaseValidator {
|
||||||
*/
|
*/
|
||||||
protected boolean suppressedwarning(List<ValidationMessage> errors, IssueType type, String path, boolean thePass, String msg, String html, Object... theMessageArguments) {
|
protected boolean suppressedwarning(List<ValidationMessage> errors, IssueType type, String path, boolean thePass, String msg, String html, Object... theMessageArguments) {
|
||||||
if (!thePass) {
|
if (!thePass) {
|
||||||
msg = context.formatMessage(msg, theMessageArguments);
|
msg = formatMessage(msg, theMessageArguments);
|
||||||
addValidationMessage(errors, type, path, msg, html, IssueSeverity.INFORMATION);
|
addValidationMessage(errors, type, path, msg, html, IssueSeverity.INFORMATION);
|
||||||
}
|
}
|
||||||
return thePass;
|
return thePass;
|
||||||
|
|
|
@ -126,7 +126,6 @@ import org.hl7.fhir.r5.utils.FHIRPathEngine;
|
||||||
import org.hl7.fhir.r5.utils.FHIRPathEngine.IEvaluationContext;
|
import org.hl7.fhir.r5.utils.FHIRPathEngine.IEvaluationContext;
|
||||||
import org.hl7.fhir.r5.utils.IResourceValidator;
|
import org.hl7.fhir.r5.utils.IResourceValidator;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
import org.hl7.fhir.utilities.I18nConstants;
|
|
||||||
import org.hl7.fhir.validation.BaseValidator;
|
import org.hl7.fhir.validation.BaseValidator;
|
||||||
import org.hl7.fhir.validation.instance.EnableWhenEvaluator.QStack;
|
import org.hl7.fhir.validation.instance.EnableWhenEvaluator.QStack;
|
||||||
import org.hl7.fhir.validation.XVerExtensionManager;
|
import org.hl7.fhir.validation.XVerExtensionManager;
|
||||||
|
@ -142,6 +141,7 @@ import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
|
||||||
import org.hl7.fhir.utilities.xhtml.NodeType;
|
import org.hl7.fhir.utilities.xhtml.NodeType;
|
||||||
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
||||||
import org.hl7.fhir.validation.instance.utils.*;
|
import org.hl7.fhir.validation.instance.utils.*;
|
||||||
|
import org.hl7.fhir.validation.utils.I18nConstants;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
@ -197,17 +197,17 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FunctionDetails resolveFunction(String functionName) {
|
public FunctionDetails resolveFunction(String functionName) {
|
||||||
throw new Error(context.formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESRESOLVEFUNCTION_, functionName));
|
throw new Error(formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESRESOLVEFUNCTION_, functionName));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeDetails checkFunction(Object appContext, String functionName, List<TypeDetails> parameters) throws PathEngineException {
|
public TypeDetails checkFunction(Object appContext, String functionName, List<TypeDetails> parameters) throws PathEngineException {
|
||||||
throw new Error(context.formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESCHECKFUNCTION));
|
throw new Error(formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESCHECKFUNCTION));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Base> executeFunction(Object appContext, String functionName, List<List<Base>> parameters) {
|
public List<Base> executeFunction(Object appContext, String functionName, List<List<Base>> parameters) {
|
||||||
throw new Error(context.formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESEXECUTEFUNCTION));
|
throw new Error(formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESEXECUTEFUNCTION));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -240,7 +240,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
throw new FHIRException(e);
|
throw new FHIRException(e);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new Error(context.formatMessage(I18nConstants.NOT_DONE_YET__RESOLVE__LOCALLY_2, url));
|
throw new Error(formatMessage(I18nConstants.NOT_DONE_YET__RESOLVE__LOCALLY_2, url));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
ValidatorHostContext ctxt = (ValidatorHostContext) appContext;
|
ValidatorHostContext ctxt = (ValidatorHostContext) appContext;
|
||||||
StructureDefinition sd = context.fetchResource(StructureDefinition.class, url);
|
StructureDefinition sd = context.fetchResource(StructureDefinition.class, url);
|
||||||
if (sd == null) {
|
if (sd == null) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_, url));
|
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_RESOLVE_, url));
|
||||||
}
|
}
|
||||||
InstanceValidator self = InstanceValidator.this;
|
InstanceValidator self = InstanceValidator.this;
|
||||||
List<ValidationMessage> valerrors = new ArrayList<ValidationMessage>();
|
List<ValidationMessage> valerrors = new ArrayList<ValidationMessage>();
|
||||||
|
@ -285,10 +285,10 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (e.isResource()) {
|
if (e.isResource()) {
|
||||||
self.validateResource(new ValidatorHostContext(ctxt.getAppContext(), e), valerrors, e, e, sd, IdStatus.OPTIONAL, new NodeStack(e));
|
self.validateResource(new ValidatorHostContext(ctxt.getAppContext(), e), valerrors, e, e, sd, IdStatus.OPTIONAL, new NodeStack(e));
|
||||||
} else {
|
} else {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.NOT_SUPPORTED_YET));
|
throw new FHIRException(formatMessage(I18nConstants.NOT_SUPPORTED_YET));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
throw new NotImplementedException(context.formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESCONFORMSTOPROFILE_WHEN_ITEM_IS_NOT_AN_ELEMENT));
|
throw new NotImplementedException(formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESCONFORMSTOPROFILE_WHEN_ITEM_IS_NOT_AN_ELEMENT));
|
||||||
boolean ok = true;
|
boolean ok = true;
|
||||||
List<ValidationMessage> record = new ArrayList<>();
|
List<ValidationMessage> record = new ArrayList<>();
|
||||||
for (ValidationMessage v : valerrors) {
|
for (ValidationMessage v : valerrors) {
|
||||||
|
@ -312,7 +312,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (r instanceof ValueSet)
|
if (r instanceof ValueSet)
|
||||||
return (ValueSet) r;
|
return (ValueSet) r;
|
||||||
else
|
else
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.REFERENCE__REFERS_TO_A__NOT_A_VALUESET, url, r.fhirType()));
|
throw new FHIRException(formatMessage(I18nConstants.REFERENCE__REFERS_TO_A__NOT_A_VALUESET, url, r.fhirType()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -515,7 +515,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
private StructureDefinition getSpecifiedProfile(String profile) {
|
private StructureDefinition getSpecifiedProfile(String profile) {
|
||||||
StructureDefinition sd = context.fetchResource(StructureDefinition.class, profile);
|
StructureDefinition sd = context.fetchResource(StructureDefinition.class, profile);
|
||||||
if (sd == null) {
|
if (sd == null) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_LOCATE_THE_PROFILE__IN_ORDER_TO_VALIDATE_AGAINST_IT, profile));
|
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_LOCATE_THE_PROFILE__IN_ORDER_TO_VALIDATE_AGAINST_IT, profile));
|
||||||
}
|
}
|
||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
|
@ -1568,7 +1568,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new Error(context.formatMessage(I18nConstants.UNRECOGNISED_EXTENSION_CONTEXT_, ctxt.getTypeElement().asStringValue()));
|
throw new Error(formatMessage(I18nConstants.UNRECOGNISED_EXTENSION_CONTEXT_, ctxt.getTypeElement().asStringValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
@ -2095,7 +2095,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (we == null) {
|
if (we == null) {
|
||||||
if (fetcher == null) {
|
if (fetcher == null) {
|
||||||
if (!refType.equals("contained"))
|
if (!refType.equals("contained"))
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.RESOURCE_RESOLUTION_SERVICES_NOT_PROVIDED));
|
throw new FHIRException(formatMessage(I18nConstants.RESOURCE_RESOLUTION_SERVICES_NOT_PROVIDED));
|
||||||
} else {
|
} else {
|
||||||
Element ext = null;
|
Element ext = null;
|
||||||
if (fetchCache.containsKey(ref)) {
|
if (fetchCache.containsKey(ref)) {
|
||||||
|
@ -2190,8 +2190,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (!isShowMessagesFromReferences()) {
|
if (!isShowMessagesFromReferences()) {
|
||||||
rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path, areAllBaseProfiles(profiles), I18nConstants.REFERENCE_REF_CANTMATCHCHOICE, ref, asList(type.getTargetProfile()));
|
rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path, areAllBaseProfiles(profiles), I18nConstants.REFERENCE_REF_CANTMATCHCHOICE, ref, asList(type.getTargetProfile()));
|
||||||
for (StructureDefinition sd : badProfiles.keySet()) {
|
for (StructureDefinition sd : badProfiles.keySet()) {
|
||||||
slicingHint(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false,
|
slicingHint(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false, "Details for " + ref + " matching against Profile" + sd.getUrl(), errorSummaryForSlicingAsHtml(badProfiles.get(sd)));
|
||||||
context.formatMessage(I18nConstants.DETAILS_FOR__MATCHING_AGAINST_PROFILE_, ref, sd.getUrl()), errorSummaryForSlicingAsHtml(badProfiles.get(sd)));
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path, profiles.size() == 1, I18nConstants.REFERENCE_REF_CANTMATCHCHOICE, ref, asList(type.getTargetProfile()));
|
rule(errors, IssueType.STRUCTURE, element.line(), element.col(), path, profiles.size() == 1, I18nConstants.REFERENCE_REF_CANTMATCHCHOICE, ref, asList(type.getTargetProfile()));
|
||||||
|
@ -2207,7 +2206,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (!isShowMessagesFromReferences()) {
|
if (!isShowMessagesFromReferences()) {
|
||||||
warning(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false, I18nConstants.REFERENCE_REF_MULTIPLEMATCHES, ref, asListByUrl(goodProfiles.keySet()));
|
warning(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false, I18nConstants.REFERENCE_REF_MULTIPLEMATCHES, ref, asListByUrl(goodProfiles.keySet()));
|
||||||
for (StructureDefinition sd : badProfiles.keySet()) {
|
for (StructureDefinition sd : badProfiles.keySet()) {
|
||||||
slicingHint(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false, context.formatMessage(I18nConstants.DETAILS_FOR__MATCHING_AGAINST_PROFILE_, ref, sd.getUrl()), errorSummaryForSlicingAsHtml(badProfiles.get(sd)));
|
slicingHint(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false, "Details for " + ref + " matching against Profile" + sd.getUrl(), errorSummaryForSlicingAsHtml(badProfiles.get(sd)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
warning(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false, I18nConstants.REFERENCE_REF_MULTIPLEMATCHES, ref, asListByUrl(goodProfiles.keySet()));
|
warning(errors, IssueType.STRUCTURE, element.line(), element.col(), path, false, I18nConstants.REFERENCE_REF_MULTIPLEMATCHES, ref, asListByUrl(goodProfiles.keySet()));
|
||||||
|
@ -2481,7 +2480,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
String id = p.hasExtension(ToolingExtensions.EXT_PROFILE_ELEMENT) ? p.getExtensionString(ToolingExtensions.EXT_PROFILE_ELEMENT) : null;
|
String id = p.hasExtension(ToolingExtensions.EXT_PROFILE_ELEMENT) ? p.getExtensionString(ToolingExtensions.EXT_PROFILE_ELEMENT) : null;
|
||||||
StructureDefinition sd = context.fetchResource(StructureDefinition.class, p.getValue());
|
StructureDefinition sd = context.fetchResource(StructureDefinition.class, p.getValue());
|
||||||
if (sd == null)
|
if (sd == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE_, p));
|
throw new DefinitionException(formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE_, p));
|
||||||
profile = sd;
|
profile = sd;
|
||||||
if (id == null)
|
if (id == null)
|
||||||
element = sd.getSnapshot().getElementFirstRep();
|
element = sd.getSnapshot().getElementFirstRep();
|
||||||
|
@ -2492,7 +2491,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
element = t;
|
element = t;
|
||||||
}
|
}
|
||||||
if (element == null)
|
if (element == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_ELEMENT__IN_PROFILE_, id, p));
|
throw new DefinitionException(formatMessage(I18nConstants.UNABLE_TO_RESOLVE_ELEMENT__IN_PROFILE_, id, p));
|
||||||
}
|
}
|
||||||
expr = fpe.parse(fixExpr(discriminator));
|
expr = fpe.parse(fixExpr(discriminator));
|
||||||
t2 = System.nanoTime();
|
t2 = System.nanoTime();
|
||||||
|
@ -2643,20 +2642,20 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (focus.fhirType().equals("Reference") && d.equals("reference")) {
|
if (focus.fhirType().equals("Reference") && d.equals("reference")) {
|
||||||
String url = focus.getChildValue("reference");
|
String url = focus.getChildValue("reference");
|
||||||
if (Utilities.noString(url))
|
if (Utilities.noString(url))
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.NO_REFERENCE_RESOLVING_DISCRIMINATOR__FROM_, discriminator, element.getProperty().getName()));
|
throw new FHIRException(formatMessage(I18nConstants.NO_REFERENCE_RESOLVING_DISCRIMINATOR__FROM_, discriminator, element.getProperty().getName()));
|
||||||
// Note that we use the passed in stack here. This might be a problem if the discriminator is deep enough?
|
// Note that we use the passed in stack here. This might be a problem if the discriminator is deep enough?
|
||||||
Element target = resolve(appContext, url, stack, errors, p);
|
Element target = resolve(appContext, url, stack, errors, p);
|
||||||
if (target == null)
|
if (target == null)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_RESOURCE__AT__RESOLVING_DISCRIMINATOR__FROM_, url, d, discriminator, element.getProperty().getName()));
|
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_FIND_RESOURCE__AT__RESOLVING_DISCRIMINATOR__FROM_, url, d, discriminator, element.getProperty().getName()));
|
||||||
focus = target;
|
focus = target;
|
||||||
} else if (d.equals("value") && focus.isPrimitive()) {
|
} else if (d.equals("value") && focus.isPrimitive()) {
|
||||||
return focus;
|
return focus;
|
||||||
} else {
|
} else {
|
||||||
List<Element> children = focus.getChildren(d);
|
List<Element> children = focus.getChildren(d);
|
||||||
if (children.isEmpty())
|
if (children.isEmpty())
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_FIND__RESOLVING_DISCRIMINATOR__FROM_, d, discriminator, element.getProperty().getName()));
|
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_FIND__RESOLVING_DISCRIMINATOR__FROM_, d, discriminator, element.getProperty().getName()));
|
||||||
if (children.size() > 1)
|
if (children.size() > 1)
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.FOUND__ITEMS_FOR__RESOLVING_DISCRIMINATOR__FROM_, Integer.toString(children.size()), d, discriminator, element.getProperty().getName()));
|
throw new FHIRException(formatMessage(I18nConstants.FOUND__ITEMS_FOR__RESOLVING_DISCRIMINATOR__FROM_, Integer.toString(children.size()), d, discriminator, element.getProperty().getName()));
|
||||||
focus = children.get(0);
|
focus = children.get(0);
|
||||||
p = p + "." + d;
|
p = p + "." + d;
|
||||||
}
|
}
|
||||||
|
@ -3081,23 +3080,23 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
discriminator = discriminator.substring(0, discriminator.indexOf('['));
|
discriminator = discriminator.substring(0, discriminator.indexOf('['));
|
||||||
type = criteriaElement.getType().get(0).getWorkingCode();
|
type = criteriaElement.getType().get(0).getWorkingCode();
|
||||||
} else if (criteriaElement.getType().size() > 1) {
|
} else if (criteriaElement.getType().size() > 1) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.DISCRIMINATOR__IS_BASED_ON_TYPE_BUT_SLICE__IN__HAS_MULTIPLE_TYPES_, discriminator, ed.getId(), profile.getUrl(), criteriaElement.typeSummary()));
|
throw new DefinitionException(formatMessage(I18nConstants.DISCRIMINATOR__IS_BASED_ON_TYPE_BUT_SLICE__IN__HAS_MULTIPLE_TYPES_, discriminator, ed.getId(), profile.getUrl(), criteriaElement.typeSummary()));
|
||||||
} else
|
} else
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.DISCRIMINATOR__IS_BASED_ON_TYPE_BUT_SLICE__IN__HAS_NO_TYPES, discriminator, ed.getId(), profile.getUrl()));
|
throw new DefinitionException(formatMessage(I18nConstants.DISCRIMINATOR__IS_BASED_ON_TYPE_BUT_SLICE__IN__HAS_NO_TYPES, discriminator, ed.getId(), profile.getUrl()));
|
||||||
if (discriminator.isEmpty())
|
if (discriminator.isEmpty())
|
||||||
expression.append(" and $this is " + type);
|
expression.append(" and $this is " + type);
|
||||||
else
|
else
|
||||||
expression.append(" and " + discriminator + " is " + type);
|
expression.append(" and " + discriminator + " is " + type);
|
||||||
} else if (s.getType() == DiscriminatorType.PROFILE) {
|
} else if (s.getType() == DiscriminatorType.PROFILE) {
|
||||||
if (criteriaElement.getType().size() == 0) {
|
if (criteriaElement.getType().size() == 0) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.PROFILE_BASED_DISCRIMINATORS_MUST_HAVE_A_TYPE__IN_PROFILE_, criteriaElement.getId(), profile.getUrl()));
|
throw new DefinitionException(formatMessage(I18nConstants.PROFILE_BASED_DISCRIMINATORS_MUST_HAVE_A_TYPE__IN_PROFILE_, criteriaElement.getId(), profile.getUrl()));
|
||||||
}
|
}
|
||||||
if (criteriaElement.getType().size() != 1) {
|
if (criteriaElement.getType().size() != 1) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.PROFILE_BASED_DISCRIMINATORS_MUST_HAVE_ONLY_ONE_TYPE__IN_PROFILE_, criteriaElement.getId(), profile.getUrl()));
|
throw new DefinitionException(formatMessage(I18nConstants.PROFILE_BASED_DISCRIMINATORS_MUST_HAVE_ONLY_ONE_TYPE__IN_PROFILE_, criteriaElement.getId(), profile.getUrl()));
|
||||||
}
|
}
|
||||||
List<CanonicalType> list = discriminator.endsWith(".resolve()") || discriminator.equals("resolve()") ? criteriaElement.getType().get(0).getTargetProfile() : criteriaElement.getType().get(0).getProfile();
|
List<CanonicalType> list = discriminator.endsWith(".resolve()") || discriminator.equals("resolve()") ? criteriaElement.getType().get(0).getTargetProfile() : criteriaElement.getType().get(0).getProfile();
|
||||||
if (list.size() == 0) {
|
if (list.size() == 0) {
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.PROFILE_BASED_DISCRIMINATORS_MUST_HAVE_A_TYPE_WITH_A_PROFILE__IN_PROFILE_, criteriaElement.getId(), profile.getUrl()));
|
throw new DefinitionException(formatMessage(I18nConstants.PROFILE_BASED_DISCRIMINATORS_MUST_HAVE_A_TYPE_WITH_A_PROFILE__IN_PROFILE_, criteriaElement.getId(), profile.getUrl()));
|
||||||
} else if (list.size() > 1) {
|
} else if (list.size() > 1) {
|
||||||
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(" or ");
|
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(" or ");
|
||||||
for (CanonicalType c : list) {
|
for (CanonicalType c : list) {
|
||||||
|
@ -3113,7 +3112,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
else if (criteriaElement.hasMax() && criteriaElement.getMax().equals("0"))
|
else if (criteriaElement.hasMax() && criteriaElement.getMax().equals("0"))
|
||||||
expression.append(" and (" + discriminator + ".exists().not())");
|
expression.append(" and (" + discriminator + ".exists().not())");
|
||||||
else
|
else
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.DISCRIMINATOR__IS_BASED_ON_ELEMENT_EXISTENCE_BUT_SLICE__NEITHER_SETS_MIN1_OR_MAX0, discriminator, ed.getId()));
|
throw new FHIRException(formatMessage(I18nConstants.DISCRIMINATOR__IS_BASED_ON_ELEMENT_EXISTENCE_BUT_SLICE__NEITHER_SETS_MIN1_OR_MAX0, discriminator, ed.getId()));
|
||||||
} else if (criteriaElement.hasFixed()) {
|
} else if (criteriaElement.hasFixed()) {
|
||||||
buildFixedExpression(ed, expression, discriminator, criteriaElement);
|
buildFixedExpression(ed, expression, discriminator, criteriaElement);
|
||||||
} else if (criteriaElement.hasPattern()) {
|
} else if (criteriaElement.hasPattern()) {
|
||||||
|
@ -3131,15 +3130,15 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
}
|
}
|
||||||
if (!anyFound) {
|
if (!anyFound) {
|
||||||
if (slicer.getSlicing().getDiscriminator().size() > 1)
|
if (slicer.getSlicing().getDiscriminator().size() > 1)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.COULD_NOT_MATCH_ANY_DISCRIMINATORS__FOR_SLICE__IN_PROFILE___NONE_OF_THE_DISCRIMINATOR__HAVE_FIXED_VALUE_BINDING_OR_EXISTENCE_ASSERTIONS, discriminators, ed.getId(), profile.getUrl(), discriminators));
|
throw new DefinitionException(formatMessage(I18nConstants.COULD_NOT_MATCH_ANY_DISCRIMINATORS__FOR_SLICE__IN_PROFILE___NONE_OF_THE_DISCRIMINATOR__HAVE_FIXED_VALUE_BINDING_OR_EXISTENCE_ASSERTIONS, discriminators, ed.getId(), profile.getUrl(), discriminators));
|
||||||
else
|
else
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.COULD_NOT_MATCH_DISCRIMINATOR__FOR_SLICE__IN_PROFILE___THE_DISCRIMINATOR__DOES_NOT_HAVE_FIXED_VALUE_BINDING_OR_EXISTENCE_ASSERTIONS, discriminators, ed.getId(), profile.getUrl(), discriminators));
|
throw new DefinitionException(formatMessage(I18nConstants.COULD_NOT_MATCH_DISCRIMINATOR__FOR_SLICE__IN_PROFILE___THE_DISCRIMINATOR__DOES_NOT_HAVE_FIXED_VALUE_BINDING_OR_EXISTENCE_ASSERTIONS, discriminators, ed.getId(), profile.getUrl(), discriminators));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
n = fpe.parse(fixExpr(expression.toString()));
|
n = fpe.parse(fixExpr(expression.toString()));
|
||||||
} catch (FHIRLexerException e) {
|
} catch (FHIRLexerException e) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.PROBLEM_PROCESSING_EXPRESSION__IN_PROFILE__PATH__, expression, profile.getUrl(), path, e.getMessage()));
|
throw new FHIRException(formatMessage(I18nConstants.PROBLEM_PROCESSING_EXPRESSION__IN_PROFILE__PATH__, expression, profile.getUrl(), path, e.getMessage()));
|
||||||
}
|
}
|
||||||
fpeTime = fpeTime + (System.nanoTime() - t);
|
fpeTime = fpeTime + (System.nanoTime() - t);
|
||||||
ed.setUserData("slice.expression.cache", n);
|
ed.setUserData("slice.expression.cache", n);
|
||||||
|
@ -3148,13 +3147,10 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
ValidatorHostContext shc = hostContext.forSlicing();
|
ValidatorHostContext shc = hostContext.forSlicing();
|
||||||
boolean pass = evaluateSlicingExpression(shc, element, path, profile, n);
|
boolean pass = evaluateSlicingExpression(shc, element, path, profile, n);
|
||||||
if (!pass) {
|
if (!pass) {
|
||||||
slicingHint(sliceInfo, IssueType.STRUCTURE, element.line(), element.col(), path, false, (context.formatMessage(I18nConstants.DOES_NOT_MATCH_SLICE_, ed.getSliceName())), "discriminator = " + Utilities.escapeXml(n.toString()));
|
slicingHint(sliceInfo, IssueType.STRUCTURE, element.line(), element.col(), path, false, "Does not match slice'" + ed.getSliceName(), "discriminator = " + Utilities.escapeXml(n.toString()));
|
||||||
for (String url : shc.getSliceRecords().keySet()) {
|
for (String url : shc.getSliceRecords().keySet()) {
|
||||||
slicingHint(sliceInfo, IssueType.STRUCTURE, element.line(), element.col(), path, false,
|
slicingHint(sliceInfo, IssueType.STRUCTURE, element.line(), element.col(), path, false, "Details for " + stack.getLiteralPath() + " against profile " + url,
|
||||||
context.formatMessage(I18nConstants.DETAILS_FOR__MATCHING_AGAINST_PROFILE_, stack.getLiteralPath(), url),
|
"Profile " + url + " does not match for " + stack.getLiteralPath() + " because of the following profile issues: " + errorSummaryForSlicingAsHtml(shc.getSliceRecords().get(url)));
|
||||||
context.formatMessage(I18nConstants.PROFILE__DOES_NOT_MATCH_FOR__BECAUSE_OF_THE_FOLLOWING_PROFILE_ISSUES__,
|
|
||||||
url,
|
|
||||||
stack.getLiteralPath(), errorSummaryForSlicingAsHtml(shc.getSliceRecords().get(url))));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pass;
|
return pass;
|
||||||
|
@ -3170,7 +3166,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
msg = fpe.forLog();
|
msg = fpe.forLog();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.PROBLEM_EVALUATING_SLICING_EXPRESSION_FOR_ELEMENT_IN_PROFILE__PATH__FHIRPATH___, profile.getUrl(), path, n, ex.getMessage()));
|
throw new FHIRException(formatMessage(I18nConstants.PROBLEM_EVALUATING_SLICING_EXPRESSION_FOR_ELEMENT_IN_PROFILE__PATH__FHIRPATH___, profile.getUrl(), path, n, ex.getMessage()));
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
@ -3189,15 +3185,14 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
Identifier ii = (Identifier) pattern;
|
Identifier ii = (Identifier) pattern;
|
||||||
expression.append(" and ");
|
expression.append(" and ");
|
||||||
buildIdentifierExpression(ed, expression, discriminator, ii);
|
buildIdentifierExpression(ed, expression, discriminator, ii);
|
||||||
} else {
|
} else
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_FIXED_PATTERN_TYPE_FOR_DISCRIMINATOR_FOR_SLICE__, discriminator, ed.getId(), pattern.getClass().getName()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_FIXED_PATTERN_TYPE_FOR_DISCRIMINATOR_FOR_SLICE__, discriminator, ed.getId(), pattern.getClass().getName()));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buildIdentifierExpression(ElementDefinition ed, StringBuilder expression, String discriminator, Identifier ii)
|
private void buildIdentifierExpression(ElementDefinition ed, StringBuilder expression, String discriminator, Identifier ii)
|
||||||
throws DefinitionException {
|
throws DefinitionException {
|
||||||
if (ii.hasExtension())
|
if (ii.hasExtension())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_IDENTIFIER_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_IDENTIFIER_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
expression.append(discriminator + ".where(");
|
expression.append(discriminator + ".where(");
|
||||||
if (ii.hasSystem()) {
|
if (ii.hasSystem()) {
|
||||||
|
@ -3231,15 +3226,15 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
private void buildCodeableConceptExpression(ElementDefinition ed, StringBuilder expression, String discriminator, CodeableConcept cc)
|
private void buildCodeableConceptExpression(ElementDefinition ed, StringBuilder expression, String discriminator, CodeableConcept cc)
|
||||||
throws DefinitionException {
|
throws DefinitionException {
|
||||||
if (cc.hasText())
|
if (cc.hasText())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__USING_TEXT__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__USING_TEXT__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
||||||
if (!cc.hasCoding())
|
if (!cc.hasCoding())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__MUST_HAVE_AT_LEAST_ONE_CODING__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__MUST_HAVE_AT_LEAST_ONE_CODING__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
||||||
if (cc.hasExtension())
|
if (cc.hasExtension())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
||||||
boolean firstCoding = true;
|
boolean firstCoding = true;
|
||||||
for (Coding c : cc.getCoding()) {
|
for (Coding c : cc.getCoding()) {
|
||||||
if (c.hasExtension())
|
if (c.hasExtension())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
||||||
if (firstCoding) firstCoding = false;
|
if (firstCoding) firstCoding = false;
|
||||||
else expression.append(" and ");
|
else expression.append(" and ");
|
||||||
expression.append(discriminator + ".coding.where(");
|
expression.append(discriminator + ".coding.where(");
|
||||||
|
@ -3270,7 +3265,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
private void buildCodingExpression(ElementDefinition ed, StringBuilder expression, String discriminator, Coding c)
|
private void buildCodingExpression(ElementDefinition ed, StringBuilder expression, String discriminator, Coding c)
|
||||||
throws DefinitionException {
|
throws DefinitionException {
|
||||||
if (c.hasExtension())
|
if (c.hasExtension())
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_CODEABLECONCEPT_PATTERN__EXTENSIONS_ARE_NOT_ALLOWED__FOR_DISCRIMINATOR_FOR_SLICE_, discriminator, ed.getId()));
|
||||||
expression.append(discriminator + ".where(");
|
expression.append(discriminator + ".where(");
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
if (c.hasSystem()) {
|
if (c.hasSystem()) {
|
||||||
|
@ -3326,7 +3321,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
} else if (fixed instanceof BooleanType) {
|
} else if (fixed instanceof BooleanType) {
|
||||||
expression.append(((BooleanType) fixed).asStringValue());
|
expression.append(((BooleanType) fixed).asStringValue());
|
||||||
} else
|
} else
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNSUPPORTED_FIXED_VALUE_TYPE_FOR_DISCRIMINATOR_FOR_SLICE__, discriminator, ed.getId(), fixed.getClass().getName()));
|
throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_FIXED_VALUE_TYPE_FOR_DISCRIMINATOR_FOR_SLICE__, discriminator, ed.getId(), fixed.getClass().getName()));
|
||||||
expression.append(" in " + discriminator + ")");
|
expression.append(" in " + discriminator + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3340,7 +3335,6 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
}
|
}
|
||||||
startInner(hostContext, errors, resource, element, defn, stack, hostContext.isCheckSpecials());
|
startInner(hostContext, errors, resource, element, defn, stack, hostContext.isCheckSpecials());
|
||||||
|
|
||||||
List<String> res = new ArrayList<>();
|
|
||||||
Element meta = element.getNamedChild("meta");
|
Element meta = element.getNamedChild("meta");
|
||||||
if (meta != null) {
|
if (meta != null) {
|
||||||
List<Element> profiles = new ArrayList<Element>();
|
List<Element> profiles = new ArrayList<Element>();
|
||||||
|
@ -3688,7 +3682,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
byte[] json = bs.toByteArray();
|
byte[] json = bs.toByteArray();
|
||||||
switch (v) {
|
switch (v) {
|
||||||
case DSTU1:
|
case DSTU1:
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNSUPPORTED_VERSION_R1));
|
throw new FHIRException(formatMessage(I18nConstants.UNSUPPORTED_VERSION_R1));
|
||||||
case DSTU2:
|
case DSTU2:
|
||||||
org.hl7.fhir.dstu2.model.Resource r2 = new org.hl7.fhir.dstu2.formats.JsonParser().parse(json);
|
org.hl7.fhir.dstu2.model.Resource r2 = new org.hl7.fhir.dstu2.formats.JsonParser().parse(json);
|
||||||
Resource r5 = VersionConvertor_10_50.convertResource(r2);
|
Resource r5 = VersionConvertor_10_50.convertResource(r2);
|
||||||
|
@ -4630,7 +4624,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
else
|
else
|
||||||
dt = this.context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/" + actualType);
|
dt = this.context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/" + actualType);
|
||||||
if (dt == null)
|
if (dt == null)
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_ACTUAL_TYPE_, actualType));
|
throw new DefinitionException(formatMessage(I18nConstants.UNABLE_TO_RESOLVE_ACTUAL_TYPE_, actualType));
|
||||||
trackUsage(dt, hostContext, element);
|
trackUsage(dt, hostContext, element);
|
||||||
|
|
||||||
childDefinitions = profileUtilities.getChildMap(dt, dt.getSnapshot().getElement().get(0));
|
childDefinitions = profileUtilities.getChildMap(dt, dt.getSnapshot().getElement().get(0));
|
||||||
|
@ -4988,7 +4982,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
String errorContext = "profile " + profile.getUrl();
|
String errorContext = "profile " + profile.getUrl();
|
||||||
if (!resource.getChildValue("id").isEmpty())
|
if (!resource.getChildValue("id").isEmpty())
|
||||||
errorContext += "; instance " + resource.getChildValue("id");
|
errorContext += "; instance " + resource.getChildValue("id");
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.SLICE_ENCOUNTERED_MIDWAY_THROUGH_SET_PATH___ID___, slicer.getPath(), slicer.getId(), errorContext));
|
throw new DefinitionException(formatMessage(I18nConstants.SLICE_ENCOUNTERED_MIDWAY_THROUGH_SET_PATH___ID___, slicer.getPath(), slicer.getId(), errorContext));
|
||||||
}
|
}
|
||||||
slicer = ed;
|
slicer = ed;
|
||||||
process = false;
|
process = false;
|
||||||
|
@ -5013,12 +5007,10 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (ei.additionalSlice && ei.definition != null) {
|
if (ei.additionalSlice && ei.definition != null) {
|
||||||
if (ei.definition.getSlicing().getRules().equals(ElementDefinition.SlicingRules.OPEN) ||
|
if (ei.definition.getSlicing().getRules().equals(ElementDefinition.SlicingRules.OPEN) ||
|
||||||
ei.definition.getSlicing().getRules().equals(ElementDefinition.SlicingRules.OPENATEND) && true /* TODO: replace "true" with condition to check that this element is at "end" */) {
|
ei.definition.getSlicing().getRules().equals(ElementDefinition.SlicingRules.OPENATEND) && true /* TODO: replace "true" with condition to check that this element is at "end" */) {
|
||||||
slicingHint(errors, IssueType.INFORMATIONAL, ei.line(), ei.col(), ei.getPath(), false,
|
slicingHint(errors, IssueType.INFORMATIONAL, ei.line(), ei.col(), ei.getPath(), false, "This element does not match any known slice" + (profile == null ? "" : " defined in the profile " + profile.getUrl()),
|
||||||
context.formatMessage(I18nConstants.THIS_ELEMENT_DOES_NOT_MATCH_ANY_KNOWN_SLICE_,
|
"This element does not match any known slice" + (profile == null ? "" : " defined in the profile " + profile.getUrl() + ": " + errorSummaryForSlicingAsHtml(ei.sliceInfo)));
|
||||||
profile == null ? "" : " defined in the profile " + profile.getUrl()),
|
|
||||||
context.formatMessage(I18nConstants.THIS_ELEMENT_DOES_NOT_MATCH_ANY_KNOWN_SLICE_, profile == null ? "" : I18nConstants.DEFINED_IN_THE_PROFILE + profile.getUrl()) + errorSummaryForSlicingAsHtml(ei.sliceInfo));
|
|
||||||
} else if (ei.definition.getSlicing().getRules().equals(ElementDefinition.SlicingRules.CLOSED)) {
|
} else if (ei.definition.getSlicing().getRules().equals(ElementDefinition.SlicingRules.CLOSED)) {
|
||||||
rule(errors, IssueType.INVALID, ei.line(), ei.col(), ei.getPath(), false, I18nConstants.VALIDATION_VAL_PROFILE_NOTSLICE, (profile == null ? "" : " defined in the profile " + profile.getUrl()), errorSummaryForSlicing(ei.sliceInfo));
|
rule(errors, IssueType.INVALID, ei.line(), ei.col(), ei.getPath(), false, I18nConstants.VALIDATION_VAL_PROFILE_NOTSLICE, (profile == null ? "" : " defined in the profile " + profile.getUrl() + " and slicing is CLOSED: " + errorSummaryForSlicing(ei.sliceInfo)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Don't raise this if we're in an abstract profile, like Resource
|
// Don't raise this if we're in an abstract profile, like Resource
|
||||||
|
@ -5114,7 +5106,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
if (tail.equals(t.getId()))
|
if (tail.equals(t.getId()))
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_ELEMENT_WITH_ID_, tail));
|
throw new DefinitionException(formatMessage(I18nConstants.UNABLE_TO_FIND_ELEMENT_WITH_ID_, tail));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IdStatus idStatusForEntry(Element ep, ElementInfo ei) {
|
private IdStatus idStatusForEntry(Element ep, ElementInfo ei) {
|
||||||
|
@ -5201,7 +5193,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
try {
|
try {
|
||||||
n = fpe.parse(fixExpr(inv.getExpression()));
|
n = fpe.parse(fixExpr(inv.getExpression()));
|
||||||
} catch (FHIRLexerException e) {
|
} catch (FHIRLexerException e) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.PROBLEM_PROCESSING_EXPRESSION__IN_PROFILE__PATH__, inv.getExpression(), profile.getUrl(), path, e.getMessage()));
|
throw new FHIRException(formatMessage(I18nConstants.PROBLEM_PROCESSING_EXPRESSION__IN_PROFILE__PATH__, inv.getExpression(), profile.getUrl(), path, e.getMessage()));
|
||||||
}
|
}
|
||||||
fpeTime = fpeTime + (System.nanoTime() - t);
|
fpeTime = fpeTime + (System.nanoTime() - t);
|
||||||
inv.setUserData("validator.expression.cache", n);
|
inv.setUserData("validator.expression.cache", n);
|
||||||
|
@ -5340,9 +5332,9 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
checkFixedValue(msgs, "{virtual}", value, criteria.getFixed(), profile.getUrl(), "value", null);
|
checkFixedValue(msgs, "{virtual}", value, criteria.getFixed(), profile.getUrl(), "value", null);
|
||||||
return msgs.size() == 0;
|
return msgs.size() == 0;
|
||||||
} else if (criteria.hasBinding() && criteria.getBinding().getStrength() == BindingStrength.REQUIRED && criteria.getBinding().hasValueSet()) {
|
} else if (criteria.hasBinding() && criteria.getBinding().getStrength() == BindingStrength.REQUIRED && criteria.getBinding().hasValueSet()) {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SLICE_MATCHING__SLICE_MATCHING_BY_VALUE_SET_NOT_DONE));
|
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SLICE_MATCHING__SLICE_MATCHING_BY_VALUE_SET_NOT_DONE));
|
||||||
} else {
|
} else {
|
||||||
throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SLICE_MATCHING__NO_FIXED_VALUE_OR_REQUIRED_VALUE_SET));
|
throw new FHIRException(formatMessage(I18nConstants.UNABLE_TO_RESOLVE_SLICE_MATCHING__NO_FIXED_VALUE_OR_REQUIRED_VALUE_SET));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5601,4 +5593,6 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat
|
||||||
public void setDebug(boolean debug) {
|
public void setDebug(boolean debug) {
|
||||||
this.debug = debug;
|
this.debug = debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
package org.hl7.fhir.utilities;
|
package org.hl7.fhir.validation.utils;
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.ResourceBundle;
|
|
||||||
|
|
||||||
public class I18nConstants {
|
public class I18nConstants {
|
||||||
|
|
||||||
|
@ -271,163 +268,5 @@ public class I18nConstants {
|
||||||
public final static String NOT_DONE_YET_VALIDATORHOSTSERVICESEXECUTEFUNCTION = "Not_done_yet_ValidatorHostServicesexecuteFunction";
|
public final static String NOT_DONE_YET_VALIDATORHOSTSERVICESEXECUTEFUNCTION = "Not_done_yet_ValidatorHostServicesexecuteFunction";
|
||||||
public final static String NOT_DONE_YET_VALIDATORHOSTSERVICESCHECKFUNCTION = "Not_done_yet_ValidatorHostServicescheckFunction";
|
public final static String NOT_DONE_YET_VALIDATORHOSTSERVICESCHECKFUNCTION = "Not_done_yet_ValidatorHostServicescheckFunction";
|
||||||
public final static String NOT_DONE_YET_VALIDATORHOSTSERVICESRESOLVEFUNCTION_ = "Not_done_yet_ValidatorHostServicesresolveFunction_";
|
public final static String NOT_DONE_YET_VALIDATORHOSTSERVICESRESOLVEFUNCTION_ = "Not_done_yet_ValidatorHostServicesresolveFunction_";
|
||||||
public final static String UNABLE_TO_FIND_BASE_DEFINITION_FOR_LOGICAL_MODEL__FROM_ = "Unable_to_find_base_definition_for_logical_model__from_";
|
|
||||||
public final static String SAME_ID_ON_MULTIPLE_ELEMENTS__IN_ = "Same_id_on_multiple_elements__in_";
|
|
||||||
public final static String NO_PATH_ON_ELEMENT_DEFINITION__IN_ = "No_path_on_element_Definition__in_";
|
|
||||||
public final static String NEEDS_A_SNAPSHOT = "needs_a_snapshot";
|
|
||||||
public final static String NOT_THE_RIGHT_KIND_OF_STRUCTURE_TO_GENERATE_SCHEMATRONS_FOR = "not_the_right_kind_of_structure_to_generate_schematrons_for";
|
|
||||||
public final static String NOT_HANDLED_YET_SORTELEMENTS_ = "Not_handled_yet_sortElements_";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_ = "Unable_to_resolve_profile__in_element_";
|
|
||||||
public final static String CANT_HAVE_CHILDREN_ON_AN_ELEMENT_WITH_A_POLYMORPHIC_TYPE__YOU_MUST_SLICE_AND_CONSTRAIN_THE_TYPES_FIRST_SORTELEMENTS_ = "Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_";
|
|
||||||
public final static String UNABLE_TO_FIND_PROFILE__AT_ = "Unable_to_find_profile__at_";
|
|
||||||
public final static String UNHANDLED_SITUATION_RESOURCE_IS_PROFILED_TO_MORE_THAN_ONE_OPTION__CANNOT_SORT_PROFILE = "Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile";
|
|
||||||
public final static String INTERNAL_RECURSION_DETECTION_FIND_LOOP_PATH_RECURSION____CHECK_PATHS_ARE_VALID_FOR_PATH_ = "Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_";
|
|
||||||
public final static String INTERNAL_ERROR___TYPE_NOT_KNOWN_ = "Internal_error___type_not_known_";
|
|
||||||
public final static String UNABLE_TO_FIND_ELEMENT_ = "Unable_to_find_element_";
|
|
||||||
public final static String ERROR_GENERATING_TABLE_FOR_PROFILE__ = "Error_generating_table_for_profile__";
|
|
||||||
public final static String STRUCTUREDEFINITION__AT__ILLEGAL_CONSTRAINED_TYPE__FROM__IN_ = "StructureDefinition__at__illegal_constrained_type__from__in_";
|
|
||||||
public final static String ERROR_AT__THE_TARGET_PROFILE__IS_NOT__VALID_CONSTRAINT_ON_THE_BASE_ = "Error_at__The_target_profile__is_not__valid_constraint_on_the_base_";
|
|
||||||
public final static String ERROR_IN_PROFILE__AT__BASE_ISSUMMARY___DERIVED_ISSUMMARY__ = "Error_in_profile__at__Base_isSummary___derived_isSummary__";
|
|
||||||
public final static String UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__1_AT_ = "Unexpected_condition_in_differential_typeslicetypelistsize__1_at_";
|
|
||||||
public final static String UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__10_AND_IMPLICIT_SLICE_NAME_DOES_NOT_CONTAIN_A_VALID_TYPE__AT_ = "Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_";
|
|
||||||
public final static String ATTEMPT_TO_USE_A_SNAPSHOT_ON_PROFILE__AS__BEFORE_IT_IS_GENERATED = "Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated";
|
|
||||||
public final static String NULL_MIN = "null_min";
|
|
||||||
public final static String _HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE = "_has_children__for_type__in_profile__but_cant_find_type";
|
|
||||||
public final static String _HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_ = "_has_children__and_multiple_types__in_profile_";
|
|
||||||
public final static String ADDING_WRONG_PATH = "Adding_wrong_path";
|
|
||||||
public final static String NAMED_ITEMS_ARE_OUT_OF_ORDER_IN_THE_SLICE = "Named_items_are_out_of_order_in_the_slice";
|
|
||||||
public final static String THE_BASE_SNAPSHOT_MARKS_A_SLICING_AS_CLOSED_BUT_THE_DIFFERENTIAL_TRIES_TO_EXTEND_IT_IN__AT__ = "The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__";
|
|
||||||
public final static String NOT_DONE_YET = "Not_done_yet";
|
|
||||||
public final static String UNKNOWN_TYPE__AT_ = "Unknown_type__at_";
|
|
||||||
public final static String DIFFERENTIAL_WALKS_INTO____BUT_THE_BASE_DOES_NOT_AND_THERE_IS_NOT_A_SINGLE_FIXED_TYPE_THE_TYPE_IS__THIS_IS_NOT_HANDLED_YET = "Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet";
|
|
||||||
public final static String SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___RULE___ = "Slicing_rules_on_differential__do_not_match_those_on_base___rule___";
|
|
||||||
public final static String SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___DISCIMINATOR___ = "Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___";
|
|
||||||
public final static String SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___ORDER___ = "Slicing_rules_on_differential__do_not_match_those_on_base___order___";
|
|
||||||
public final static String INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST = "Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist";
|
|
||||||
public final static String DID_NOT_FIND_TYPE_ROOT_ = "Did_not_find_type_root_";
|
|
||||||
public final static String ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_WRONG_TYPE_ = "Error_at_path__Slice_for_type__has_wrong_type_";
|
|
||||||
public final static String ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_MORE_THAN_ONE_TYPE_ = "Error_at_path__Slice_for_type__has_more_than_one_type_";
|
|
||||||
public final static String ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_ = "Error_at_path__Slice_name_must_be__but_is_";
|
|
||||||
public final static String ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORPATH__THIS = "Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this";
|
|
||||||
public final static String ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORTYPE__TYPE = "Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type";
|
|
||||||
public final static String ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORCOUNT__1 = "Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1";
|
|
||||||
public final static String ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGORDERED__TRUE = "Error_at_path__in__Type_slicing_with_slicingordered__true";
|
|
||||||
public final static String ADDING_WRONG_PATH_IN_PROFILE___VS_ = "Adding_wrong_path_in_profile___vs_";
|
|
||||||
public final static String _HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_ = "_has_no_children__and_no_types_in_profile_";
|
|
||||||
public final static String DID_NOT_FIND_SINGLE_SLICE_ = "Did_not_find_single_slice_";
|
|
||||||
public final static String DIFFERENTIAL_DOES_NOT_HAVE_A_SLICE__B_OF_____IN_PROFILE_ = "Differential_does_not_have_a_slice__b_of_____in_profile_";
|
|
||||||
public final static String ATTEMPT_TO_A_SLICE_AN_ELEMENT_THAT_DOES_NOT_REPEAT__FROM__IN_ = "Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_REFERENCE_TO_ = "Unable_to_resolve_reference_to_";
|
|
||||||
public final static String UNABLE_TO_FIND_ELEMENT__IN_ = "Unable_to_find_element__in_";
|
|
||||||
public final static String UNABLE_TO_FIND_BASE__FOR_ = "Unable_to_find_base__for_";
|
|
||||||
public final static String ADDING_WRONG_PATH__OUTCOMEGETPATH___RESULTPATHBASE__ = "Adding_wrong_path__outcomegetPath___resultPathBase__";
|
|
||||||
public final static String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTERS_ = "Illegal_path__in_differential_in__illegal_characters_";
|
|
||||||
public final static String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTER_ = "Illegal_path__in_differential_in__illegal_character_";
|
|
||||||
public final static String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NO_UNICODE_WHITESPACE = "Illegal_path__in_differential_in__no_unicode_whitespace";
|
|
||||||
public final static String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_EXCEEDS_64_CHARS_IN_LENGTH = "Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length";
|
|
||||||
public final static String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_MISING_ = "Illegal_path__in_differential_in__name_portion_mising_";
|
|
||||||
public final static String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__MUST_START_WITH_ = "Illegal_path__in_differential_in__must_start_with_";
|
|
||||||
public final static String NO_PATH_VALUE_ON_ELEMENT_IN_DIFFERENTIAL_IN_ = "No_path_value_on_element_in_differential_in_";
|
|
||||||
public final static String NO_PATH_ON_ELEMENT_IN_DIFFERENTIAL_IN_ = "No_path_on_element_in_differential_in_";
|
|
||||||
public final static String UNXPECTED_INTERNAL_CONDITION__NO_SOURCE_ON_DIFF_ELEMENT = "Unxpected_internal_condition__no_source_on_diff_element";
|
|
||||||
public final static String TYPE_ON_FIRST_SNAPSHOT_ELEMENT_FOR__IN__FROM_ = "type_on_first_snapshot_element_for__in__from_";
|
|
||||||
public final static String TYPE_ON_FIRST_DIFFERENTIAL_ELEMENT = "type_on_first_differential_element";
|
|
||||||
public final static String CIRCULAR_SNAPSHOT_REFERENCES_DETECTED_CANNOT_GENERATE_SNAPSHOT_STACK__ = "Circular_snapshot_references_detected_cannot_generate_snapshot_stack__";
|
|
||||||
public final static String BASE__DERIVED_PROFILES_HAVE_DIFFERENT_TYPES____VS___ = "Base__Derived_profiles_have_different_types____vs___";
|
|
||||||
public final static String DERIVED_PROFILE__HAS_NO_DERIVATION_VALUE_AND_SO_CANT_BE_PROCESSED = "Derived_profile__has_no_derivation_value_and_so_cant_be_processed";
|
|
||||||
public final static String DERIVED_PROFILE__HAS_NO_TYPE = "Derived_profile__has_no_type";
|
|
||||||
public final static String BASE_PROFILE__HAS_NO_TYPE = "Base_profile__has_no_type";
|
|
||||||
public final static String NO_DERIVED_STRUCTURE_PROVIDED = "no_derived_structure_provided";
|
|
||||||
public final static String NO_BASE_PROFILE_PROVIDED = "no_base_profile_provided";
|
|
||||||
public final static String ELEMENT_ID__NULL__ON_ = "element_id__null__on_";
|
|
||||||
public final static String ELEMENT__NULL_ = "element__null_";
|
|
||||||
public final static String GETSLICELIST_SHOULD_ONLY_BE_CALLED_WHEN_THE_ELEMENT_HAS_SLICING = "getSliceList_should_only_be_called_when_the_element_has_slicing";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_NAME_REFERENCE__AT_PATH_ = "Unable_to_resolve_name_reference__at_path_";
|
|
||||||
public final static String DETAILS_FOR__MATCHING_AGAINST_PROFILE_ = "Details_for__matching_against_Profile_";
|
|
||||||
public final static String DOES_NOT_MATCH_SLICE_ = "Does_not_match_slice_";
|
|
||||||
public final static String PROFILE__DOES_NOT_MATCH_FOR__BECAUSE_OF_THE_FOLLOWING_PROFILE_ISSUES__ = "Profile__does_not_match_for__because_of_the_following_profile_issues__";
|
|
||||||
public final static String THIS_ELEMENT_DOES_NOT_MATCH_ANY_KNOWN_SLICE_ = "This_element_does_not_match_any_known_slice_";
|
|
||||||
public final static String DEFINED_IN_THE_PROFILE = "defined_in_the_profile";
|
|
||||||
public final static String THIS_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_ = "This_does_not_appear_to_be_a_FHIR_resource_unknown_name_";
|
|
||||||
public final static String THIS_CANNOT_BE_PARSED_AS_A_FHIR_OBJECT_NO_NAME = "This_cannot_be_parsed_as_a_FHIR_object_no_name";
|
|
||||||
public final static String THIS_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAMESPACENAME_ = "This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_";
|
|
||||||
public final static String THIS__CANNOT_BE_PARSED_AS_A_FHIR_OBJECT_NO_NAMESPACE = "This__cannot_be_parsed_as_a_FHIR_object_no_namespace";
|
|
||||||
public final static String UNABLE_TO_FIND_RESOURCETYPE_PROPERTY = "Unable_to_find_resourceType_property";
|
|
||||||
public final static String ERROR_PARSING_JSON_THE_PRIMITIVE_VALUE_MUST_BE_A_STRING = "Error_parsing_JSON_the_primitive_value_must_be_a_string";
|
|
||||||
public final static String ERROR_PARSING_JSON_THE_PRIMITIVE_VALUE_MUST_BE_A_NUMBER = "Error_parsing_JSON_the_primitive_value_must_be_a_number";
|
|
||||||
public final static String ERROR_PARSING_JSON_THE_PRIMITIVE_VALUE_MUST_BE_A_BOOLEAN = "Error_parsing_JSON_the_primitive_value_must_be_a_boolean";
|
|
||||||
public final static String ERROR_PARSING_XHTML_ = "Error_parsing_XHTML_";
|
|
||||||
public final static String THIS_PROPERTY_MUST_BE_AN_OBJECT_NOT_ = "This_property_must_be_an_object_not_";
|
|
||||||
public final static String THIS_PROPERTY_MUST_BE_AN_SIMPLE_VALUE_NOT_ = "This_property_must_be_an_simple_value_not_";
|
|
||||||
public final static String THIS_PROPERTY_MUST_BE__NOT_ = "This_property_must_be__not_";
|
|
||||||
public final static String THIS_PROPERTY_MUST_BE_AN_ARRAY_NOT_ = "This_property_must_be_an_Array_not_";
|
|
||||||
public final static String UNRECOGNISED_PROPERTY_ = "Unrecognised_property_";
|
|
||||||
public final static String OBJECT_MUST_HAVE_SOME_CONTENT = "Object_must_have_some_content";
|
|
||||||
public final static String ERROR_PARSING_JSON_ = "Error_parsing_JSON_";
|
|
||||||
public final static String NODE_TYPE__IS_NOT_ALLOWED = "Node_type__is_not_allowed";
|
|
||||||
public final static String CDATA_IS_NOT_ALLOWED = "CDATA_is_not_allowed";
|
|
||||||
public final static String UNDEFINED_ELEMENT_ = "Undefined_element_";
|
|
||||||
public final static String UNDEFINED_ATTRIBUTE__ON__FOR_TYPE__PROPERTIES__ = "Undefined_attribute__on__for_type__properties__";
|
|
||||||
public final static String TEXT_SHOULD_NOT_BE_PRESENT = "Text_should_not_be_present";
|
|
||||||
public final static String WRONG_NAMESPACE__EXPECTED_ = "Wrong_namespace__expected_";
|
|
||||||
public final static String ELEMENT_MUST_HAVE_SOME_CONTENT = "Element_must_have_some_content";
|
|
||||||
public final static String NO_PROCESSING_INSTRUCTIONS_ALLOWED_IN_RESOURCES = "No_processing_instructions_allowed_in_resources";
|
|
||||||
public final static String UNKNOWN_RESOURCE_TYPE_MISSING_RDFSTYPE = "Unknown_resource_type_missing_rdfstype";
|
|
||||||
public final static String REFERENCE_TO__CANNOT_BE_RESOLVED = "reference_to__cannot_be_resolved";
|
|
||||||
public final static String THIS_PROPERTY_MUST_BE_A_URI_OR_BNODE_NOT_A_ = "This_property_must_be_a_URI_or_bnode_not_a_";
|
|
||||||
public final static String THIS_PROPERTY_MUST_BE_A_LITERAL_NOT_A_ = "This_property_must_be_a_Literal_not_a_";
|
|
||||||
public final static String UNRECOGNISED_PREDICATE_ = "Unrecognised_predicate_";
|
|
||||||
public final static String ERROR_PARSING_TURTLE_ = "Error_parsing_Turtle_";
|
|
||||||
public final static String UNEXPECTED_DATATYPE_FOR_RDFSTYPE = "Unexpected_datatype_for_rdfstype";
|
|
||||||
public final static String ATTEMPT_TO_REPLACE_ELEMENT_NAME_FOR_A_NONCHOICE_TYPE = "Attempt_to_replace_element_name_for_a_nonchoice_type";
|
|
||||||
public final static String WRONG_TYPE_FOR_RESOURCE = "Wrong_type_for_resource";
|
|
||||||
public final static String CONTAINED_RESOURCE_DOES_NOT_APPEAR_TO_BE_A_FHIR_RESOURCE_UNKNOWN_NAME_ = "Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_";
|
|
||||||
public final static String UNKNOWN_DATE_FORMAT_ = "Unknown_Date_format_";
|
|
||||||
public final static String UNKNOWN_DATA_FORMAT_ = "Unknown_Data_format_";
|
|
||||||
public final static String NO_TYPE_FOUND_ON_ = "No_type_found_on_";
|
|
||||||
public final static String ERROR_WRITING_NUMBER__TO_JSON = "error_writing_number__to_JSON";
|
|
||||||
public final static String UNABLE_TO_PROCESS_REQUEST_FOR_RESOURCE_FOR___ = "Unable_to_process_request_for_resource_for___";
|
|
||||||
public final static String RESOURCE_TYPE_MISMATCH_FOR___ = "Resource_type_mismatch_for___";
|
|
||||||
public final static String NOT_DONE_YET_CANT_FETCH_ = "not_done_yet_cant_fetch_";
|
|
||||||
public final static String ATTEMPT_TO_USE_TERMINOLOGY_SERVER_WHEN_NO_TERMINOLOGY_SERVER_IS_AVAILABLE = "Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available";
|
|
||||||
public final static String NO_EXPANSIONPROFILE_PROVIDED = "No_ExpansionProfile_provided";
|
|
||||||
public final static String CAN_ONLY_SPECIFY_PROFILE_IN_THE_CONTEXT = "Can_only_specify_profile_in_the_context";
|
|
||||||
public final static String NO_URL_IN_EXPAND_VALUE_SET_2 = "no_url_in_expand_value_set_2";
|
|
||||||
public final static String NO_URL_IN_EXPAND_VALUE_SET = "no_url_in_expand_value_set";
|
|
||||||
public final static String NO_VALUE_SET = "no_value_set";
|
|
||||||
public final static String NO_PARAMETERS_PROVIDED_TO_EXPANDVS = "No_Parameters_provided_to_expandVS";
|
|
||||||
public final static String NO_EXPANSION_PARAMETERS_PROVIDED = "No_Expansion_Parameters_provided";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_VALUE_SET_ = "Unable_to_resolve_value_Set_";
|
|
||||||
public final static String DELIMITED_VERSIONS_HAVE_EXACT_MATCH_FOR_DELIMITER____VS_ = "Delimited_versions_have_exact_match_for_delimiter____vs_";
|
|
||||||
public final static String DUPLICATE_RESOURCE_ = "Duplicate_Resource_";
|
|
||||||
public final static String ERROR_EXPANDING_VALUESET_RUNNING_WITHOUT_TERMINOLOGY_SERVICES = "Error_expanding_ValueSet_running_without_terminology_services";
|
|
||||||
public final static String ERROR_VALIDATING_CODE_RUNNING_WITHOUT_TERMINOLOGY_SERVICES = "Error_validating_code_running_without_terminology_services";
|
|
||||||
public final static String UNABLE_TO_VALIDATE_CODE_WITHOUT_USING_SERVER = "Unable_to_validate_code_without_using_server";
|
|
||||||
public final static String PROFILE___ERROR_GENERATING_SNAPSHOT = "Profile___Error_generating_snapshot";
|
|
||||||
public final static String PROFILE___ELEMENT__ERROR_GENERATING_SNAPSHOT_ = "Profile___element__Error_generating_snapshot_";
|
|
||||||
public final static String PROFILE___BASE__COULD_NOT_BE_RESOLVED = "Profile___base__could_not_be_resolved";
|
|
||||||
public final static String PROFILE___HAS_NO_BASE_AND_NO_SNAPSHOT = "Profile___has_no_base_and_no_snapshot";
|
|
||||||
public final static String NO_VALIDATOR_CONFIGURED = "No_validator_configured";
|
|
||||||
public final static String PARSER_TYPE__NOT_SUPPORTED = "Parser_Type__not_supported";
|
|
||||||
public final static String VERSION_MISMATCH_THE_CONTEXT_HAS_VERSION__LOADED_AND_THE_NEW_CONTENT_BEING_LOADED_IS_VERSION_ = "Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_";
|
|
||||||
public final static String ERROR_READING__FROM_PACKAGE__ = "Error_reading__from_package__";
|
|
||||||
public final static String ERROR_PARSING_ = "Error_parsing_";
|
|
||||||
public final static String UNABLE_TO_CONNECT_TO_TERMINOLOGY_SERVER_USE_PARAMETER_TX_NA_TUN_RUN_WITHOUT_USING_TERMINOLOGY_SERVICES_TO_VALIDATE_LOINC_SNOMED_ICDX_ETC_ERROR__ = "Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__";
|
|
||||||
public final static String DISPLAY_NAME_FOR__SHOULD_BE_ONE_OF__INSTEAD_OF_ = "Display_Name_for__should_be_one_of__instead_of_";
|
|
||||||
public final static String UNKNOWN_CODE__IN_ = "Unknown_Code__in_";
|
|
||||||
public final static String CODE_FOUND_IN_EXPANSION_HOWEVER_ = "Code_found_in_expansion_however_";
|
|
||||||
public final static String NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_ = "None_of_the_provided_codes_are_in_the_value_set_";
|
|
||||||
public final static String CODING_HAS_NO_SYSTEM__CANNOT_VALIDATE = "Coding_has_no_system__cannot_validate";
|
|
||||||
public final static String UNABLE_TO_HANDLE_SYSTEM__CONCEPT_FILTER_WITH_OP__ = "Unable_to_handle_system__concept_filter_with_op__";
|
|
||||||
public final static String UNABLE_TO_HANDLE_SYSTEM__FILTER_WITH_PROPERTY__ = "Unable_to_handle_system__filter_with_property__";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_INCLUDE_WITH_NO_SYSTEM = "Unable_to_resolve_system__value_set_has_include_with_no_system";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_IMPORTS = "Unable_to_resolve_system__value_set_has_imports";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_EXPANSION_HAS_MULTIPLE_SYSTEMS = "Unable_to_resolve_system__value_set_expansion_has_multiple_systems";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_NO_INCLUDES_OR_EXPANSION = "Unable_to_resolve_system__value_set_has_no_includes_or_expansion";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_SYSTEM__VALUE_SET_HAS_EXCLUDES = "Unable_to_resolve_system__value_set_has_excludes";
|
|
||||||
public final static String UNABLE_TO_RESOLVE_SYSTEM__NO_VALUE_SET = "Unable_to_resolve_system__no_value_set";
|
|
||||||
public final static String THIS_BASE_PROPERTY_MUST_BE_AN_ARRAY_NOT_A_ = "This_base_property_must_be_an_Array_not_a_";
|
|
||||||
public final static String THIS_PROPERTY_MUST_BE_AN_ARRAY_NOT_A_ = "This_property_must_be_an_Array_not_a_";
|
|
||||||
public final static String DOCUMENT = "documentmsg";
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -212,7 +212,7 @@ Validation_VAL_Profile_NoMatch = Unable to find matching profile among choices:
|
||||||
Validation_VAL_Profile_NoSnapshot = StructureDefinition has no snapshot - validation is against the snapshot, so it must be provided
|
Validation_VAL_Profile_NoSnapshot = StructureDefinition has no snapshot - validation is against the snapshot, so it must be provided
|
||||||
Validation_VAL_Profile_NoType = The type of element {0} is not known, which is illegal. Valid types at this point are {1}
|
Validation_VAL_Profile_NoType = The type of element {0} is not known, which is illegal. Valid types at this point are {1}
|
||||||
Validation_VAL_Profile_NotAllowed = This element is not allowed by the profile {0}
|
Validation_VAL_Profile_NotAllowed = This element is not allowed by the profile {0}
|
||||||
Validation_VAL_Profile_NotSlice = This element does not match any known slice {0} and slicing is CLOSED: {1}
|
Validation_VAL_Profile_NotSlice = This element does not match any known slice {0}
|
||||||
Validation_VAL_Profile_OutOfOrder = As specified by profile {0}, Element "{1}" is out of order
|
Validation_VAL_Profile_OutOfOrder = As specified by profile {0}, Element "{1}" is out of order
|
||||||
Validation_VAL_Profile_SliceOrder = As specified by profile {0}, Element "{1}" is out of order in ordered slice
|
Validation_VAL_Profile_SliceOrder = As specified by profile {0}, Element "{1}" is out of order in ordered slice
|
||||||
Validation_VAL_Profile_Unknown = Profile reference "{0}" could not be resolved, so has not been checked
|
Validation_VAL_Profile_Unknown = Profile reference "{0}" could not be resolved, so has not been checked
|
||||||
|
@ -265,166 +265,3 @@ Not_done_yet__resolve__locally_2 = Not done yet - resolve {0} locally (2)
|
||||||
Not_done_yet_ValidatorHostServicesexecuteFunction = Not done yet (ValidatorHostServices.executeFunction)
|
Not_done_yet_ValidatorHostServicesexecuteFunction = Not done yet (ValidatorHostServices.executeFunction)
|
||||||
Not_done_yet_ValidatorHostServicescheckFunction = Not done yet (ValidatorHostServices.checkFunction)
|
Not_done_yet_ValidatorHostServicescheckFunction = Not done yet (ValidatorHostServices.checkFunction)
|
||||||
Not_done_yet_ValidatorHostServicesresolveFunction_ = Not done yet (ValidatorHostServices.resolveFunction): {0}
|
Not_done_yet_ValidatorHostServicesresolveFunction_ = Not done yet (ValidatorHostServices.resolveFunction): {0}
|
||||||
Unable_to_find_base_definition_for_logical_model__from_ = Unable to find base definition for logical model: {0} from {1}
|
|
||||||
Same_id_on_multiple_elements__in_ = Same id ''{0}''on multiple elements {1}/{2} in {3}
|
|
||||||
No_path_on_element_Definition__in_ = No path on element Definition {0} in {1}
|
|
||||||
needs_a_snapshot = needs a snapshot
|
|
||||||
not_the_right_kind_of_structure_to_generate_schematrons_for = not the right kind of structure to generate schematrons for
|
|
||||||
Not_handled_yet_sortElements_ = Not handled yet (sortElements: {0}:{1})
|
|
||||||
Unable_to_resolve_profile__in_element_ = Unable to resolve profile {0} in element {1}
|
|
||||||
Cant_have_children_on_an_element_with_a_polymorphic_type__you_must_slice_and_constrain_the_types_first_sortElements_ = Can''t have children on an element with a polymorphic type - you must slice and constrain the types first (sortElements: {0}:{1})
|
|
||||||
Unable_to_find_profile__at_ = Unable to find profile ''{0}'' at {1}
|
|
||||||
Unhandled_situation_resource_is_profiled_to_more_than_one_option__cannot_sort_profile = Unhandled situation: resource is profiled to more than one option - cannot sort profile
|
|
||||||
Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_ = Internal recursion detection: find() loop path recursion > {0} - check paths are valid (for path {1}/{2})
|
|
||||||
Internal_error___type_not_known_ = Internal error - type not known {0}
|
|
||||||
Unable_to_find_element_ = Unable to find element {0}
|
|
||||||
Error_generating_table_for_profile__ = Error generating table for profile {0}: {1}
|
|
||||||
StructureDefinition__at__illegal_constrained_type__from__in_ = StructureDefinition {0} at {1}: illegal constrained type {2} from {3} in {4}
|
|
||||||
Error_at__The_target_profile__is_not__valid_constraint_on_the_base_ = Error at {0}#{1}: The target profile {2} is not valid constraint on the base ({3})
|
|
||||||
Error_in_profile__at__Base_isSummary___derived_isSummary__ = Error in profile {0} at {1}: Base isSummary = {2}, derived isSummary = {3}
|
|
||||||
StructureDefinition__at__illegal_attempt_to_change_a_binding_from__to_ = StructureDefinition {0} at {1}: illegal attempt to change a binding from {2} to {3}
|
|
||||||
Unexpected_condition_in_differential_typeslicetypelistsize__1_at_ = Unexpected condition in differential: type-slice.type-list.size() != 1 at {0}/{1}
|
|
||||||
Unexpected_condition_in_differential_typeslicetypelistsize__10_and_implicit_slice_name_does_not_contain_a_valid_type__at_ = Unexpected condition in differential: type-slice.type-list.size() == 10 and implicit slice name does not contain a valid type (''{0}''?) at {1}/{2}
|
|
||||||
Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated = Attempt to use a snapshot on profile ''{0}'' as {1} before it is generated
|
|
||||||
null_min = null min
|
|
||||||
_has_children__for_type__in_profile__but_cant_find_type = {0} has children ({1}) for type {2} in profile {3}, but can''t find type
|
|
||||||
_has_children__and_multiple_types__in_profile_ = {0} has children ({1}) and multiple types ({2}) in profile {3}
|
|
||||||
Adding_wrong_path = Adding wrong path
|
|
||||||
Named_items_are_out_of_order_in_the_slice=Named items are out of order in the slice
|
|
||||||
The_base_snapshot_marks_a_slicing_as_closed_but_the_differential_tries_to_extend_it_in__at__ = The base snapshot marks a slicing as closed, but the differential tries to extend it in {0} at {1} ({2})
|
|
||||||
Not_done_yet = Not done yet
|
|
||||||
Unknown_type__at_ = Unknown type {0} at {1}
|
|
||||||
Differential_walks_into____but_the_base_does_not_and_there_is_not_a_single_fixed_type_The_type_is__This_is_not_handled_yet = Differential walks into ''{0} (@ {1})'', but the base does not, and there is not a single fixed type. The type is {2}. This is not handled yet
|
|
||||||
Slicing_rules_on_differential__do_not_match_those_on_base___rule___ = Slicing rules on differential ({0}) do not match those on base ({1}) - rule @ {2} ({3})
|
|
||||||
Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___ = Slicing rules on differential ({0}) do not match those on base ({1}) - disciminator @ {2} ({3})
|
|
||||||
Slicing_rules_on_differential__do_not_match_those_on_base___order___ = Slicing rules on differential ({0}) do not match those on base ({1}) - order @ {2} ({3})
|
|
||||||
not_done_yet__slicing__types__ = not done yet - slicing / types @ {0}
|
|
||||||
Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist=Invalid slicing: there is more than one type slice at {0}, but one of them ({1}) has min = 1, so the other slices cannot exist
|
|
||||||
Did_not_find_type_root_ = Did not find type root: {0}
|
|
||||||
Error_at_path__Slice_for_type__has_wrong_type_ = Error at path {0}: Slice for type ''{1}'' has wrong type ''{2}''
|
|
||||||
Error_at_path__Slice_for_type__has_more_than_one_type_ = Error at path {0}: Slice for type '{1}' has more than one type '{2}'
|
|
||||||
Error_at_path__Slice_name_must_be__but_is_ = Error at path {0}: Slice name must be ''{1}'' but is ''{2}''
|
|
||||||
Error_at_path__in__Type_slicing_with_slicingdiscriminatorpath__this = Error at path {0} in {1}: Type slicing with slicing.discriminator.path != ''$this''
|
|
||||||
Error_at_path__in__Type_slicing_with_slicingdiscriminatortype__type = Error at path {0} in {1}: Type slicing with slicing.discriminator.type != ''type''
|
|
||||||
Error_at_path__in__Type_slicing_with_slicingdiscriminatorcount__1 = Error at path {0} in {1}: Type slicing with slicing.discriminator.count() > 1
|
|
||||||
Error_at_path__in__Type_slicing_with_slicingordered__true = Error at path {0} in {1}: Type slicing with slicing.ordered = true
|
|
||||||
Adding_wrong_path_in_profile___vs_ = Adding wrong path in profile {0}: {1} vs {2}
|
|
||||||
_has_no_children__and_no_types_in_profile_ = {0} has no children ({1}) and no types in profile {2}
|
|
||||||
not_done_yet = not done yet
|
|
||||||
Did_not_find_single_slice_ = Did not find single slice: {0}
|
|
||||||
Differential_does_not_have_a_slice__b_of_____in_profile_ = Differential does not have a slice: {0}/ (b:{1} of {2} / {3}/ {4}) in profile {5}
|
|
||||||
Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_ = Attempt to a slice an element that does not repeat: {0}/{1} from {2} in {3}
|
|
||||||
Unable_to_resolve_reference_to_ = Unable to resolve reference to {0}
|
|
||||||
Unable_to_find_element__in_ = Unable to find element {0} in {1}
|
|
||||||
Unable_to_find_base__for_ = Unable to find base {0} for {1}
|
|
||||||
Adding_wrong_path__outcomegetPath___resultPathBase__ = Adding wrong path - outcome.getPath() = {0}, resultPathBase = {1}
|
|
||||||
Illegal_path__in_differential_in__illegal_characters_ = Illegal path ''{0}'' in differential in {1}: illegal characters []
|
|
||||||
Illegal_path__in_differential_in__illegal_character_ = Illegal path ''{0}'' in differential in {1}: illegal character ''{2}''
|
|
||||||
Illegal_path__in_differential_in__no_unicode_whitespace = Illegal path ''{0}'' in differential in {1}: no unicode whitespace
|
|
||||||
Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length = Illegal path ''{0}'' in differential in {1}: name portion exceeds 64 chars in length
|
|
||||||
Illegal_path__in_differential_in__name_portion_mising_ = Illegal path ''{0}'' in differential in {1}: name portion missing (''..'')
|
|
||||||
Illegal_path__in_differential_in__must_start_with_ = Illegal path ''{0}'' in differential in {1}: must start with {2}.{3}
|
|
||||||
No_path_value_on_element_in_differential_in_ = No path value on element in differential in {0}
|
|
||||||
No_path_on_element_in_differential_in_ = No path on element in differential in {0}
|
|
||||||
Unxpected_internal_condition__no_source_on_diff_element = Unxpected internal condition - no source on diff element
|
|
||||||
type_on_first_snapshot_element_for__in__from_ = type on first snapshot element for {0} in {1} from {2}
|
|
||||||
type_on_first_differential_element = type on first differential element!
|
|
||||||
Circular_snapshot_references_detected_cannot_generate_snapshot_stack__ = Circular snapshot references detected; cannot generate snapshot (stack = {0})
|
|
||||||
Base__Derived_profiles_have_different_types____vs___ = Base & Derived profiles have different types ({0} = {1} vs {2} = {3})
|
|
||||||
Derived_profile__has_no_derivation_value_and_so_cant_be_processed = Derived profile {0} has no derivation value and so can''t be processed
|
|
||||||
Derived_profile__has_no_type = Derived profile {0} has no type
|
|
||||||
Base_profile__has_no_type = Base profile {0} has no type
|
|
||||||
no_derived_structure_provided = no derived structure provided
|
|
||||||
no_base_profile_provided = no base profile provided
|
|
||||||
element_id__null__on_ = element id = null: {0} on {1}
|
|
||||||
element__null_ = element = null: {0}
|
|
||||||
getSliceList_should_only_be_called_when_the_element_has_slicing = getSliceList should only be called when the element has slicing
|
|
||||||
Unable_to_resolve_name_reference__at_path_ = Unable to resolve name reference {0} at path {1}
|
|
||||||
Details_for__matching_against_Profile_ = Details for {0} matching against Profile{1}
|
|
||||||
Does_not_match_slice_ = Does not match slice "{0}"
|
|
||||||
Profile__does_not_match_for__because_of_the_following_profile_issues__ = Profile {0} does not match for {1} because of the following profile issues: {2}
|
|
||||||
This_element_does_not_match_any_known_slice_ = This element does not match any known slice{0}
|
|
||||||
defined_in_the_profile = defined in the profile
|
|
||||||
This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = This does not appear to be a FHIR resource (unknown name "{0}")
|
|
||||||
This_cannot_be_parsed_as_a_FHIR_object_no_name = This cannot be parsed as a FHIR object (no name)
|
|
||||||
This_does_not_appear_to_be_a_FHIR_resource_unknown_namespacename_ = This does not appear to be a FHIR resource (unknown namespace/name "{0}::{1}")
|
|
||||||
This__cannot_be_parsed_as_a_FHIR_object_no_namespace = This "{0}2 cannot be parsed as a FHIR object (no namespace)
|
|
||||||
Unable_to_find_resourceType_property = Unable to find resourceType property
|
|
||||||
Error_parsing_JSON_the_primitive_value_must_be_a_string = Error parsing JSON: the primitive value must be a string
|
|
||||||
Error_parsing_JSON_the_primitive_value_must_be_a_number = Error parsing JSON: the primitive value must be a number
|
|
||||||
Error_parsing_JSON_the_primitive_value_must_be_a_boolean = Error parsing JSON: the primitive value must be a boolean
|
|
||||||
Error_parsing_XHTML_ = Error parsing XHTML: {0}
|
|
||||||
This_property_must_be_an_object_not_ = This property must be an object, not {0}
|
|
||||||
This_property_must_be_an_simple_value_not_ = This property must be an simple value, not {0}
|
|
||||||
This_property_must_be__not_ = This property must be {0}, not {1}
|
|
||||||
This_property_must_be_an_Array_not_ = This property must be an Array, not {0}
|
|
||||||
Unrecognised_property_ = Unrecognised property ''@{0}''
|
|
||||||
Object_must_have_some_content = Object must have some content
|
|
||||||
Error_parsing_JSON_ = Error parsing JSON: {0}
|
|
||||||
Node_type__is_not_allowed = Node type {0} is not allowed
|
|
||||||
CDATA_is_not_allowed = CDATA is not allowed
|
|
||||||
Undefined_element_ = Undefined element ''{0}''
|
|
||||||
Undefined_attribute__on__for_type__properties__ = Undefined attribute ''@{0}'' on {1} for type {2} (properties = {3})
|
|
||||||
Text_should_not_be_present = Text should not be present
|
|
||||||
Wrong_namespace__expected_ = Wrong namespace - expected ''{0}''
|
|
||||||
Element_must_have_some_content = Element must have some content
|
|
||||||
No_processing_instructions_allowed_in_resources = No processing instructions allowed in resources
|
|
||||||
Unknown_resource_type_missing_rdfstype = Unknown resource type (missing rdfs:type)
|
|
||||||
reference_to__cannot_be_resolved = reference to {0} cannot be resolved
|
|
||||||
This_property_must_be_a_URI_or_bnode_not_a_ = This property must be a URI or bnode, not a {0}
|
|
||||||
This_property_must_be_a_Literal_not_a_ = This property must be a Literal, not a {0}
|
|
||||||
Unrecognised_predicate_ = Unrecognised predicate ''{0}''
|
|
||||||
Error_parsing_Turtle_ = Error parsing Turtle: {0}
|
|
||||||
Unexpected_datatype_for_rdfstype = Unexpected datatype for rdfs:type
|
|
||||||
Attempt_to_replace_element_name_for_a_nonchoice_type=Attempt to replace element name for a non-choice type
|
|
||||||
Wrong_type_for_resource = Wrong type for resource
|
|
||||||
Contained_resource_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = Contained resource does not appear to be a FHIR resource (unknown name ''{0}'')
|
|
||||||
Unknown_Date_format_ = Unknown Date format ''{0}''
|
|
||||||
Unknown_Data_format_ = Unknown Data format ''{0}''
|
|
||||||
No_type_found_on_ = No type found on ''{0}''
|
|
||||||
error_writing_number__to_JSON = error writing number ''{0}'' to JSON
|
|
||||||
Unable_to_process_request_for_resource_for___ = Unable to process request for resource for {0} / {1}
|
|
||||||
Resource_type_mismatch_for___ = Resource type mismatch for {0} / {1}
|
|
||||||
not_done_yet_cant_fetch_ = not done yet: can''t fetch {0}
|
|
||||||
Attempt_to_use_Terminology_server_when_no_Terminology_server_is_available = Attempt to use Terminology server when no Terminology server is available
|
|
||||||
No_ExpansionProfile_provided = No ExpansionProfile provided
|
|
||||||
Can_only_specify_profile_in_the_context = Can only specify profile in the context
|
|
||||||
no_url_in_expand_value_set_2 = no url in expand value set 2
|
|
||||||
no_url_in_expand_value_set = no url in expand value set
|
|
||||||
no_value_set = no value set
|
|
||||||
No_Parameters_provided_to_expandVS = No Parameters provided to expandVS
|
|
||||||
No_Expansion_Parameters_provided = No Expansion Parameters provided
|
|
||||||
Unable_to_resolve_value_Set_ = Unable to resolve value Set {0}
|
|
||||||
Delimited_versions_have_exact_match_for_delimiter____vs_ = Delimited versions have exact match for delimiter ''{0}'' : {1} vs {2}
|
|
||||||
Duplicate_Resource_ = Duplicate Resource {0}
|
|
||||||
Error_expanding_ValueSet_running_without_terminology_services = Error expanding ValueSet: running without terminology services
|
|
||||||
Error_validating_code_running_without_terminology_services = Error validating code: running without terminology services
|
|
||||||
Unable_to_validate_code_without_using_server = Unable to validate code without using server
|
|
||||||
Profile___Error_generating_snapshot = Profile {0} ({1}). Error generating snapshot
|
|
||||||
Profile___element__Error_generating_snapshot_ = Profile {0} ({1}), element {2}. Error generating snapshot: {3}
|
|
||||||
Profile___base__could_not_be_resolved = Profile {0} ({1}) base {2} could not be resolved
|
|
||||||
Profile___has_no_base_and_no_snapshot = Profile {0} ({1}) has no base and no snapshot
|
|
||||||
No_validator_configured = No validator configured
|
|
||||||
Parser_Type__not_supported = Parser Type {0} not supported
|
|
||||||
Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_ = Version mismatch. The context has version {0} loaded, and the new content being loaded is version {1}
|
|
||||||
Error_reading__from_package__ = Error reading {0} from package {1}#{2}: {3}
|
|
||||||
Error_parsing_ = Error parsing {0}:{1}
|
|
||||||
Unable_to_connect_to_terminology_server_Use_parameter_tx_na_tun_run_without_using_terminology_services_to_validate_LOINC_SNOMED_ICDX_etc_Error__ = Unable to connect to terminology server. Use parameter ''-tx n/a'' tun run without using terminology services to validate LOINC, SNOMED, ICD-X etc. Error = {0}
|
|
||||||
Display_Name_for__should_be_one_of__instead_of_ = Display Name for {0}#{1} should be one of ''{2}'' instead of ''{3}''
|
|
||||||
Unknown_Code__in_ = Unknown Code {0} in {1}
|
|
||||||
Code_found_in_expansion_however_ = Code found in expansion, however: {0}
|
|
||||||
None_of_the_provided_codes_are_in_the_value_set_ = None of the provided codes are in the value set {0}
|
|
||||||
Coding_has_no_system__cannot_validate = Coding has no system - cannot validate
|
|
||||||
Unable_to_handle_system__concept_filter_with_op__ = Unable to handle system {0} concept filter with op = {1}
|
|
||||||
Unable_to_handle_system__filter_with_property__ = Unable to handle system {0} filter with property = {1}
|
|
||||||
Unable_to_resolve_system__value_set_has_include_with_no_system = Unable to resolve system - value set has include with no system
|
|
||||||
Unable_to_resolve_system__value_set_has_imports = Unable to resolve system - value set has imports
|
|
||||||
Unable_to_resolve_system__value_set_expansion_has_multiple_systems = Unable to resolve system - value set expansion has multiple systems
|
|
||||||
Unable_to_resolve_system__value_set_has_no_includes_or_expansion = Unable to resolve system - value set has no includes or expansion
|
|
||||||
Unable_to_resolve_system__value_set_has_excludes = Unable to resolve system - value set has excludes
|
|
||||||
Unable_to_resolve_system__no_value_set = Unable to resolve system - no value set
|
|
||||||
This_base_property_must_be_an_Array_not_a_ = This base property must be an Array, not a {0}
|
|
||||||
This_property_must_be_an_Array_not_a_ = This property must be an Array, not a {0}
|
|
||||||
documentmsg = (document)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue