fix issues in testing
This commit is contained in:
parent
27e8aa0bec
commit
acbba54d25
|
@ -78,6 +78,9 @@ import org.hl7.fhir.r5.utils.IResourceValidator;
|
||||||
import org.hl7.fhir.utilities.CSFileInputStream;
|
import org.hl7.fhir.utilities.CSFileInputStream;
|
||||||
import org.hl7.fhir.utilities.TextFile;
|
import org.hl7.fhir.utilities.TextFile;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
import org.hl7.fhir.utilities.VersionUtilities;
|
||||||
|
import org.hl7.fhir.utilities.cache.BasePackageCacheManager;
|
||||||
|
import org.hl7.fhir.utilities.cache.FilesystemPackageCacheManager;
|
||||||
import org.hl7.fhir.utilities.cache.NpmPackage;
|
import org.hl7.fhir.utilities.cache.NpmPackage;
|
||||||
import org.hl7.fhir.utilities.cache.NpmPackage.PackageResourceInformation;
|
import org.hl7.fhir.utilities.cache.NpmPackage.PackageResourceInformation;
|
||||||
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
|
@ -141,7 +144,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
private boolean ignoreProfileErrors;
|
private boolean ignoreProfileErrors;
|
||||||
private boolean progress;
|
private boolean progress;
|
||||||
private List<String> loadedPackages = new ArrayList<String>();
|
private List<String> loadedPackages = new ArrayList<String>();
|
||||||
|
|
||||||
public SimpleWorkerContext() throws FileNotFoundException, IOException, FHIRException {
|
public SimpleWorkerContext() throws FileNotFoundException, IOException, FHIRException {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
@ -170,6 +173,11 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
validatorFactory = other.validatorFactory;
|
validatorFactory = other.validatorFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<String> getLoadedPackages() {
|
||||||
|
return loadedPackages;
|
||||||
|
}
|
||||||
|
|
||||||
// -- Initializations
|
// -- Initializations
|
||||||
/**
|
/**
|
||||||
* Load the working context from the validation pack
|
* Load the working context from the validation pack
|
||||||
|
@ -189,13 +197,9 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SimpleWorkerContext fromPackage(NpmPackage pi, boolean allowDuplicates) throws FileNotFoundException, IOException, FHIRException {
|
public static SimpleWorkerContext fromPackage(NpmPackage pi, boolean allowDuplicates) throws FileNotFoundException, IOException, FHIRException {
|
||||||
return fromPackage(pi, allowDuplicates, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SimpleWorkerContext fromPackage(NpmPackage pi, boolean allowDuplicates, ILoadFilter filter) throws FileNotFoundException, IOException, FHIRException {
|
|
||||||
SimpleWorkerContext res = new SimpleWorkerContext();
|
SimpleWorkerContext res = new SimpleWorkerContext();
|
||||||
res.setAllowLoadingDuplicates(allowDuplicates);
|
res.setAllowLoadingDuplicates(allowDuplicates);
|
||||||
res.loadFromPackage(pi, null, filter);
|
res.loadFromPackage(pi, null);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,14 +210,10 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SimpleWorkerContext fromPackage(NpmPackage pi, IContextResourceLoader loader) throws FileNotFoundException, IOException, FHIRException {
|
public static SimpleWorkerContext fromPackage(NpmPackage pi, IContextResourceLoader loader) throws FileNotFoundException, IOException, FHIRException {
|
||||||
return fromPackage(pi, loader, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SimpleWorkerContext fromPackage(NpmPackage pi, IContextResourceLoader loader, ILoadFilter filter) throws FileNotFoundException, IOException, FHIRException {
|
|
||||||
SimpleWorkerContext res = new SimpleWorkerContext();
|
SimpleWorkerContext res = new SimpleWorkerContext();
|
||||||
res.setAllowLoadingDuplicates(true);
|
res.setAllowLoadingDuplicates(true);
|
||||||
res.version = pi.getNpm().get("version").getAsString();
|
res.version = pi.getNpm().get("version").getAsString();
|
||||||
res.loadFromPackage(pi, loader, filter);
|
res.loadFromPackage(pi, loader);
|
||||||
res.finishLoading();
|
res.finishLoading();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -356,46 +356,62 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
loadFromStream(new CSFileInputStream(path), loader);
|
loadFromStream(new CSFileInputStream(path), loader);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadFromPackage(NpmPackage pi, IContextResourceLoader loader, ILoadFilter filter) throws IOException {
|
// public void loadFromPackage(NpmPackage pi, IContextResourceLoader loader, ILoadFilter filter) throws IOException {
|
||||||
|
// if (progress) {
|
||||||
|
// System.out.println("Load Package "+pi.name()+"#"+pi.version());
|
||||||
|
// }
|
||||||
|
// loadedPackages.add(pi.id()+"#"+pi.version());
|
||||||
|
// String [] types = loader != null ? loader.getTypes() : new String[] { "StructureDefinition", "ValueSet", "CodeSystem", "SearchParameter", "OperationDefinition", "Questionnaire", "ConceptMap", "StructureMap", "NamingSystem" };
|
||||||
|
// for (PackageResourceInformation pri : pi.listIndexedResources(types)) {
|
||||||
|
// try {
|
||||||
|
// registerResourceFromPackage(new PackageResourceLoader(pri, loader), new PackageVersion(pi.id(), pi.version()));
|
||||||
|
// } catch (FHIRException e) {
|
||||||
|
// throw new FHIRException(formatMessage(I18nConstants.ERROR_READING__FROM_PACKAGE__, pri.getFilename(), pi.name(), pi.version(), e.getMessage()), e);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// for (String s : pi.list("other")) {
|
||||||
|
// binaries.put(s, TextFile.streamToBytes(pi.load("other", s)));
|
||||||
|
// }
|
||||||
|
// if (version == null) {
|
||||||
|
// version = pi.version();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadFromPackage(NpmPackage pi, IContextResourceLoader loader, String... types) throws FileNotFoundException, IOException, FHIRException {
|
||||||
if (progress) {
|
if (progress) {
|
||||||
System.out.println("Load Package "+pi.name()+"#"+pi.version());
|
System.out.println("Load Package "+pi.name()+"#"+pi.version());
|
||||||
}
|
}
|
||||||
loadedPackages.add(pi.id()+"#"+pi.version());
|
loadedPackages.add(pi.id()+"#"+pi.version());
|
||||||
String [] types = loader != null ? loader.getTypes() : new String[] { "StructureDefinition", "ValueSet", "CodeSystem", "SearchParameter", "OperationDefinition", "Questionnaire", "ConceptMap", "StructureMap", "NamingSystem" };
|
|
||||||
for (PackageResourceInformation pri : pi.listIndexedResources(types)) {
|
|
||||||
try {
|
|
||||||
registerResourceFromPackage(new PackageResourceLoader(pri, loader), new PackageVersion(pi.id(), pi.version()));
|
|
||||||
} catch (FHIRException e) {
|
|
||||||
throw new FHIRException(formatMessage(I18nConstants.ERROR_READING__FROM_PACKAGE__, pri.getFilename(), pi.name(), pi.version(), e.getMessage()), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (String s : pi.list("other")) {
|
|
||||||
binaries.put(s, TextFile.streamToBytes(pi.load("other", s)));
|
|
||||||
}
|
|
||||||
if (version == null) {
|
|
||||||
version = pi.version();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadFromPackage(NpmPackage pi, IContextResourceLoader loader, String... types) throws FileNotFoundException, IOException, FHIRException {
|
|
||||||
if (progress) {
|
|
||||||
System.out.println("Load Package "+pi.name()+"#"+pi.version());
|
|
||||||
}
|
|
||||||
loadedPackages.add(pi.id()+"#"+pi.version());
|
|
||||||
if (types.length == 0 && loader != null) {
|
if (types.length == 0 && loader != null) {
|
||||||
types = loader.getTypes();
|
types = loader.getTypes();
|
||||||
}
|
}
|
||||||
if (types.length == 0) {
|
if (VersionUtilities.isR2Ver(pi.fhirVersion())) {
|
||||||
types = new String[] { "StructureDefinition", "ValueSet", "CodeSystem", "SearchParameter", "OperationDefinition", "Questionnaire", "ConceptMap", "StructureMap", "NamingSystem" };
|
// can't lazy load R2 because of valueset/codesystem implementation
|
||||||
}
|
if (types.length == 0) {
|
||||||
for (PackageResourceInformation pri : pi.listIndexedResources(types)) {
|
types = new String[] { "StructureDefinition", "ValueSet", "SearchParameter", "OperationDefinition", "Questionnaire", "ConceptMap", "StructureMap", "NamingSystem" };
|
||||||
try {
|
|
||||||
registerResourceFromPackage(new PackageResourceLoader(pri, loader), new PackageVersion(pi.id(), pi.version()));
|
|
||||||
} catch (FHIRException e) {
|
|
||||||
throw new FHIRException(formatMessage(I18nConstants.ERROR_READING__FROM_PACKAGE__, pri.getFilename(), pi.name(), pi.version(), e.getMessage()), e);
|
|
||||||
}
|
}
|
||||||
}
|
for (String s : pi.listResources(loader.getTypes())) {
|
||||||
|
try {
|
||||||
|
loadDefinitionItem(s, pi.load("package", s), loader, null, new PackageVersion(pi.id(), pi.version()));
|
||||||
|
} catch (FHIRException e) {
|
||||||
|
throw new FHIRException(formatMessage(I18nConstants.ERROR_READING__FROM_PACKAGE__, s, pi.name(), pi.version(), e.getMessage()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (types.length == 0) {
|
||||||
|
types = new String[] { "StructureDefinition", "ValueSet", "CodeSystem", "SearchParameter", "OperationDefinition", "Questionnaire", "ConceptMap", "StructureMap", "NamingSystem" };
|
||||||
|
}
|
||||||
|
for (PackageResourceInformation pri : pi.listIndexedResources(types)) {
|
||||||
|
try {
|
||||||
|
registerResourceFromPackage(new PackageResourceLoader(pri, loader), new PackageVersion(pi.id(), pi.version()));
|
||||||
|
} catch (FHIRException e) {
|
||||||
|
throw new FHIRException(formatMessage(I18nConstants.ERROR_READING__FROM_PACKAGE__, pri.getFilename(), pi.name(), pi.version(), e.getMessage()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
for (String s : pi.list("other")) {
|
for (String s : pi.list("other")) {
|
||||||
binaries.put(s, TextFile.streamToBytes(pi.load("other", s)));
|
binaries.put(s, TextFile.streamToBytes(pi.load("other", s)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,9 @@ import org.hl7.fhir.r5.model.CodeSystem;
|
||||||
import org.hl7.fhir.r5.model.CodeSystem.CodeSystemContentMode;
|
import org.hl7.fhir.r5.model.CodeSystem.CodeSystemContentMode;
|
||||||
import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent;
|
import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent;
|
||||||
import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionDesignationComponent;
|
import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionDesignationComponent;
|
||||||
|
import org.hl7.fhir.r5.model.CodeSystem.ConceptPropertyComponent;
|
||||||
|
import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent;
|
||||||
|
import org.hl7.fhir.r5.model.CodeSystem.PropertyType;
|
||||||
import org.hl7.fhir.r5.model.DataType;
|
import org.hl7.fhir.r5.model.DataType;
|
||||||
import org.hl7.fhir.r5.model.DateTimeType;
|
import org.hl7.fhir.r5.model.DateTimeType;
|
||||||
import org.hl7.fhir.r5.model.Enumerations.FilterOperator;
|
import org.hl7.fhir.r5.model.Enumerations.FilterOperator;
|
||||||
|
@ -101,11 +104,75 @@ import org.hl7.fhir.r5.model.ValueSet.ValueSetComposeComponent;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionComponent;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
|
||||||
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent;
|
import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent;
|
||||||
|
import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple.AllConceptsFilter;
|
||||||
|
import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple.IConceptFilter;
|
||||||
|
import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple.PropertyFilter;
|
||||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
|
||||||
public class ValueSetExpanderSimple implements ValueSetExpander {
|
public class ValueSetExpanderSimple implements ValueSetExpander {
|
||||||
|
|
||||||
|
public class PropertyFilter implements IConceptFilter {
|
||||||
|
|
||||||
|
private ConceptSetFilterComponent filter;
|
||||||
|
private PropertyComponent property;
|
||||||
|
|
||||||
|
public PropertyFilter(ConceptSetFilterComponent fc, PropertyComponent propertyDefinition) {
|
||||||
|
this.filter = fc;
|
||||||
|
this.property = propertyDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean includeConcept(CodeSystem cs, ConceptDefinitionComponent def) {
|
||||||
|
ConceptPropertyComponent pc = getPropertyForConcept(def);
|
||||||
|
if (pc != null) {
|
||||||
|
String v = pc.getValue().isPrimitive() ? pc.getValue().primitiveValue() : null;
|
||||||
|
switch (filter.getOp()) {
|
||||||
|
case DESCENDENTOF: throw new FHIRException("not supported yet");
|
||||||
|
case EQUAL: return filter.getValue().equals(v);
|
||||||
|
case EXISTS: throw new FHIRException("not supported yet");
|
||||||
|
case GENERALIZES: throw new FHIRException("not supported yet");
|
||||||
|
case IN: throw new FHIRException("not supported yet");
|
||||||
|
case ISA: throw new FHIRException("not supported yet");
|
||||||
|
case ISNOTA: throw new FHIRException("not supported yet");
|
||||||
|
case NOTIN: throw new FHIRException("not supported yet");
|
||||||
|
case NULL: throw new FHIRException("not supported yet");
|
||||||
|
case REGEX: throw new FHIRException("not supported yet");
|
||||||
|
default:
|
||||||
|
throw new FHIRException("Shouldn't get here");
|
||||||
|
}
|
||||||
|
} else if (property.getType() == PropertyType.BOOLEAN && filter.getOp() == FilterOperator.EQUAL) {
|
||||||
|
return "false".equals(filter.getValue());
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConceptPropertyComponent getPropertyForConcept(ConceptDefinitionComponent def) {
|
||||||
|
for (ConceptPropertyComponent pc : def.getProperty()) {
|
||||||
|
if (pc.getCode().equals(property.getCode())) {
|
||||||
|
return pc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AllConceptsFilter implements IConceptFilter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean includeConcept(CodeSystem cs, ConceptDefinitionComponent def) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IConceptFilter {
|
||||||
|
|
||||||
|
boolean includeConcept(CodeSystem cs, ConceptDefinitionComponent def);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private List<ValueSetExpansionContainsComponent> codes = new ArrayList<ValueSet.ValueSetExpansionContainsComponent>();
|
private List<ValueSetExpansionContainsComponent> codes = new ArrayList<ValueSet.ValueSetExpansionContainsComponent>();
|
||||||
private List<ValueSetExpansionContainsComponent> roots = new ArrayList<ValueSet.ValueSetExpansionContainsComponent>();
|
private List<ValueSetExpansionContainsComponent> roots = new ArrayList<ValueSet.ValueSetExpansionContainsComponent>();
|
||||||
private Map<String, ValueSetExpansionContainsComponent> map = new HashMap<String, ValueSet.ValueSetExpansionContainsComponent>();
|
private Map<String, ValueSetExpansionContainsComponent> map = new HashMap<String, ValueSet.ValueSetExpansionContainsComponent>();
|
||||||
|
@ -214,7 +281,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addCodeAndDescendents(CodeSystem cs, String system, ConceptDefinitionComponent def, ValueSetExpansionContainsComponent parent, Parameters expParams, List<ValueSet> filters, ConceptDefinitionComponent exclusion) throws FHIRException {
|
private void addCodeAndDescendents(CodeSystem cs, String system, ConceptDefinitionComponent def, ValueSetExpansionContainsComponent parent, Parameters expParams, List<ValueSet> filters, ConceptDefinitionComponent exclusion, IConceptFilter filterFunc) throws FHIRException {
|
||||||
def.checkNoModifiers("Code in Code System", "expanding");
|
def.checkNoModifiers("Code in Code System", "expanding");
|
||||||
if (exclusion != null) {
|
if (exclusion != null) {
|
||||||
if (exclusion.getCode().equals(def.getCode()))
|
if (exclusion.getCode().equals(def.getCode()))
|
||||||
|
@ -224,24 +291,25 @@ public class ValueSetExpanderSimple implements ValueSetExpander {
|
||||||
ValueSetExpansionContainsComponent np = null;
|
ValueSetExpansionContainsComponent np = null;
|
||||||
boolean abs = CodeSystemUtilities.isNotSelectable(cs, def);
|
boolean abs = CodeSystemUtilities.isNotSelectable(cs, def);
|
||||||
boolean inc = CodeSystemUtilities.isInactive(cs, def);
|
boolean inc = CodeSystemUtilities.isInactive(cs, def);
|
||||||
if (includeAbstract || !abs)
|
if ((includeAbstract || !abs) && filterFunc.includeConcept(cs, def)) {
|
||||||
np = addCode(system, def.getCode(), def.getDisplay(), parent, def.getDesignation(), expParams, abs, inc, filters);
|
np = addCode(system, def.getCode(), def.getDisplay(), parent, def.getDesignation(), expParams, abs, inc, filters);
|
||||||
|
}
|
||||||
for (ConceptDefinitionComponent c : def.getConcept()) {
|
for (ConceptDefinitionComponent c : def.getConcept()) {
|
||||||
addCodeAndDescendents(cs, system, c, np, expParams, filters, exclusion);
|
addCodeAndDescendents(cs, system, c, np, expParams, filters, exclusion, filterFunc);
|
||||||
}
|
}
|
||||||
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
|
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
|
||||||
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
|
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
|
||||||
for (ConceptDefinitionComponent c : children)
|
for (ConceptDefinitionComponent c : children)
|
||||||
addCodeAndDescendents(cs, system, c, np, expParams, filters, exclusion);
|
addCodeAndDescendents(cs, system, c, np, expParams, filters, exclusion, filterFunc);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (ConceptDefinitionComponent c : def.getConcept()) {
|
for (ConceptDefinitionComponent c : def.getConcept()) {
|
||||||
addCodeAndDescendents(cs, system, c, null, expParams, filters, exclusion);
|
addCodeAndDescendents(cs, system, c, null, expParams, filters, exclusion, filterFunc);
|
||||||
}
|
}
|
||||||
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
|
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
|
||||||
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
|
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
|
||||||
for (ConceptDefinitionComponent c : children)
|
for (ConceptDefinitionComponent c : children)
|
||||||
addCodeAndDescendents(cs, system, c, null, expParams, filters, exclusion);
|
addCodeAndDescendents(cs, system, c, null, expParams, filters, exclusion, filterFunc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +585,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander {
|
||||||
if (inc.getConcept().size() == 0 && inc.getFilter().size() == 0) {
|
if (inc.getConcept().size() == 0 && inc.getFilter().size() == 0) {
|
||||||
// special case - add all the code system
|
// special case - add all the code system
|
||||||
for (ConceptDefinitionComponent def : cs.getConcept()) {
|
for (ConceptDefinitionComponent def : cs.getConcept()) {
|
||||||
addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, null);
|
addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, null, new AllConceptsFilter());
|
||||||
}
|
}
|
||||||
if (cs.getContent() == CodeSystemContentMode.FRAGMENT) {
|
if (cs.getContent() == CodeSystemContentMode.FRAGMENT) {
|
||||||
addFragmentWarning(exp, cs);
|
addFragmentWarning(exp, cs);
|
||||||
|
@ -556,14 +624,14 @@ public class ValueSetExpanderSimple implements ValueSetExpander {
|
||||||
ConceptDefinitionComponent def = getConceptForCode(cs.getConcept(), fc.getValue());
|
ConceptDefinitionComponent def = getConceptForCode(cs.getConcept(), fc.getValue());
|
||||||
if (def == null)
|
if (def == null)
|
||||||
throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'");
|
throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'");
|
||||||
addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, null);
|
addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, null, new AllConceptsFilter());
|
||||||
} else if ("concept".equals(fc.getProperty()) && fc.getOp() == FilterOperator.ISNOTA) {
|
} else if ("concept".equals(fc.getProperty()) && fc.getOp() == FilterOperator.ISNOTA) {
|
||||||
// special: all codes in the target code system that are not under the value
|
// special: all codes in the target code system that are not under the value
|
||||||
ConceptDefinitionComponent defEx = getConceptForCode(cs.getConcept(), fc.getValue());
|
ConceptDefinitionComponent defEx = getConceptForCode(cs.getConcept(), fc.getValue());
|
||||||
if (defEx == null)
|
if (defEx == null)
|
||||||
throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'");
|
throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'");
|
||||||
for (ConceptDefinitionComponent def : cs.getConcept()) {
|
for (ConceptDefinitionComponent def : cs.getConcept()) {
|
||||||
addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, defEx);
|
addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, defEx, new AllConceptsFilter());
|
||||||
}
|
}
|
||||||
} else if ("concept".equals(fc.getProperty()) && fc.getOp() == FilterOperator.DESCENDENTOF) {
|
} else if ("concept".equals(fc.getProperty()) && fc.getOp() == FilterOperator.DESCENDENTOF) {
|
||||||
// special: all codes in the target code system under the value
|
// special: all codes in the target code system under the value
|
||||||
|
@ -571,11 +639,11 @@ public class ValueSetExpanderSimple implements ValueSetExpander {
|
||||||
if (def == null)
|
if (def == null)
|
||||||
throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'");
|
throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'");
|
||||||
for (ConceptDefinitionComponent c : def.getConcept())
|
for (ConceptDefinitionComponent c : def.getConcept())
|
||||||
addCodeAndDescendents(cs, inc.getSystem(), c, null, expParams, imports, null);
|
addCodeAndDescendents(cs, inc.getSystem(), c, null, expParams, imports, null, new AllConceptsFilter());
|
||||||
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
|
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
|
||||||
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
|
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
|
||||||
for (ConceptDefinitionComponent c : children)
|
for (ConceptDefinitionComponent c : children)
|
||||||
addCodeAndDescendents(cs, inc.getSystem(), c, null, expParams, imports, null);
|
addCodeAndDescendents(cs, inc.getSystem(), c, null, expParams, imports, null, new AllConceptsFilter());
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ("display".equals(fc.getProperty()) && fc.getOp() == FilterOperator.EQUAL) {
|
} else if ("display".equals(fc.getProperty()) && fc.getOp() == FilterOperator.EQUAL) {
|
||||||
|
@ -590,11 +658,34 @@ public class ValueSetExpanderSimple implements ValueSetExpander {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else if (isDefinedProperty(cs, fc.getProperty())) {
|
||||||
|
for (ConceptDefinitionComponent def : cs.getConcept()) {
|
||||||
|
addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, null, new PropertyFilter(fc, getPropertyDefinition(cs, fc.getProperty())));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
throw new NotImplementedException("Search by property[" + fc.getProperty() + "] and op[" + fc.getOp() + "] is not supported yet");
|
throw new NotImplementedException("Search by property[" + fc.getProperty() + "] and op[" + fc.getOp() + "] is not supported yet");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PropertyComponent getPropertyDefinition(CodeSystem cs, String property) {
|
||||||
|
for (PropertyComponent cp : cs.getProperty()) {
|
||||||
|
if (cp.getCode().equals(property)) {
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isDefinedProperty(CodeSystem cs, String property) {
|
||||||
|
for (PropertyComponent cp : cs.getProperty()) {
|
||||||
|
if (cp.getCode().equals(property)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private void addFragmentWarning(ValueSetExpansionComponent exp, CodeSystem cs) {
|
private void addFragmentWarning(ValueSetExpansionComponent exp, CodeSystem cs) {
|
||||||
for (Extension ex : cs.getExtensionsByUrl(ToolingExtensions.EXT_EXP_FRAGMENT)) {
|
for (Extension ex : cs.getExtensionsByUrl(ToolingExtensions.EXT_EXP_FRAGMENT)) {
|
||||||
if (ex.getValue().primitiveValue().equals(cs.getUrl())) {
|
if (ex.getValue().primitiveValue().equals(cs.getUrl())) {
|
||||||
|
|
|
@ -261,7 +261,6 @@ public class ValidationEngine implements IValidatorResourceFetcher {
|
||||||
private FilesystemPackageCacheManager pcm;
|
private FilesystemPackageCacheManager pcm;
|
||||||
private PrintWriter mapLog;
|
private PrintWriter mapLog;
|
||||||
private boolean debug;
|
private boolean debug;
|
||||||
private Set<String> loadedIgs = new HashSet<>();
|
|
||||||
private IValidatorResourceFetcher fetcher;
|
private IValidatorResourceFetcher fetcher;
|
||||||
private boolean assumeValidRestReferences;
|
private boolean assumeValidRestReferences;
|
||||||
private boolean noExtensibleBindingMessages;
|
private boolean noExtensibleBindingMessages;
|
||||||
|
@ -608,10 +607,10 @@ public class ValidationEngine implements IValidatorResourceFetcher {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, byte[]> loadPackage(NpmPackage pi) throws Exception {
|
public Map<String, byte[]> loadPackage(NpmPackage pi) throws Exception {
|
||||||
loadedIgs.add(pi.name()+"#"+pi.version());
|
context.getLoadedPackages().add(pi.name()+"#"+pi.version());
|
||||||
Map<String, byte[]> res = new HashMap<String, byte[]>();
|
Map<String, byte[]> res = new HashMap<String, byte[]>();
|
||||||
for (String s : pi.dependencies()) {
|
for (String s : pi.dependencies()) {
|
||||||
if (!loadedIgs.contains(s)) {
|
if (! context.getLoadedPackages().contains(s)) {
|
||||||
if (!VersionUtilities.isCorePackage(s)) {
|
if (!VersionUtilities.isCorePackage(s)) {
|
||||||
System.out.println("+ .. load IG from "+s);
|
System.out.println("+ .. load IG from "+s);
|
||||||
res.putAll(fetchByPackage(s));
|
res.putAll(fetchByPackage(s));
|
||||||
|
@ -772,6 +771,13 @@ public class ValidationEngine implements IValidatorResourceFetcher {
|
||||||
public void loadIg(String src, boolean recursive) throws IOException, FHIRException, Exception {
|
public void loadIg(String src, boolean recursive) throws IOException, FHIRException, Exception {
|
||||||
NpmPackage npm = pcm.loadPackage(src, null);
|
NpmPackage npm = pcm.loadPackage(src, null);
|
||||||
if (npm != null) {
|
if (npm != null) {
|
||||||
|
for (String s : npm.dependencies()) {
|
||||||
|
if (!context.getLoadedPackages().contains(s)) {
|
||||||
|
if (!VersionUtilities.isCorePackage(s)) {
|
||||||
|
loadIg(s, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
context.loadFromPackage(npm, loaderForVersion(npm.fhirVersion()));
|
context.loadFromPackage(npm, loaderForVersion(npm.fhirVersion()));
|
||||||
} else {
|
} else {
|
||||||
String canonical = null;
|
String canonical = null;
|
||||||
|
|
|
@ -287,7 +287,7 @@ public class R3R4ConversionTests implements ITransformerServices, IValidatorReso
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pcm = new FilesystemPackageCacheManager(true, ToolsVersion.TOOLS_VERSION);
|
pcm = new FilesystemPackageCacheManager(true, ToolsVersion.TOOLS_VERSION);
|
||||||
R3ToR4Loader ldr = new R3ToR4Loader().setPatchUrls(true).setKillPrimitives(true);
|
R3ToR4Loader ldr = (R3ToR4Loader) new R3ToR4Loader().setPatchUrls(true).setKillPrimitives(true);
|
||||||
|
|
||||||
System.out.println("loading R3");
|
System.out.println("loading R3");
|
||||||
contextR3 = new SimpleWorkerContext();
|
contextR3 = new SimpleWorkerContext();
|
||||||
|
|
Loading…
Reference in New Issue