diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/NativeHostServices.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/NativeHostServices.java index 5c9c787f3..2e19c586b 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/NativeHostServices.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/NativeHostServices.java @@ -164,7 +164,7 @@ public class NativeHostServices { * @throws Exception */ public void load(String pack) throws Exception { - validator.loadIg(pack); + validator.loadIg(pack, false); } /** diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/ValidationEngine.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/ValidationEngine.java index ca34cb4f2..f81b19fbe 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/ValidationEngine.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/ValidationEngine.java @@ -292,7 +292,7 @@ public class ValidationEngine { } public void loadInitialDefinitions(String src) throws Exception { - loadDefinitions(src); + loadDefinitions(src, false); } public void setTerminologyServer(String src, String log, FhirPublication version) throws Exception { @@ -329,7 +329,7 @@ public class ValidationEngine { } public ValidationEngine(String src) throws Exception { - loadDefinitions(src); + loadDefinitions(src, false); pcm = new PackageCacheManager(true, ToolsVersion.TOOLS_VERSION); } @@ -341,8 +341,8 @@ public class ValidationEngine { this.language = language; } - private void loadDefinitions(String src) throws Exception { - Map source = loadIgSource(src); + private void loadDefinitions(String src, boolean recursive) throws Exception { + Map source = loadIgSource(src, recursive); if (version == null) version = getVersionFromPack(source); context = SimpleWorkerContext.fromDefinitions(source, loaderForVersion()); @@ -417,7 +417,7 @@ public class ValidationEngine { return TextFile.fileToBytes(src); } - private Map loadIgSource(String src) throws Exception { + private Map loadIgSource(String src, boolean recursive) throws Exception { // src can be one of the following: // - a canonical url for an ig - this will be converted to a package id and loaded into the cache // - a package id for an ig - this will be loaded into the cache @@ -445,7 +445,7 @@ public class ValidationEngine { if (f.isDirectory() && new File(Utilities.path(src, "validator.pack")).exists()) return readZip(new FileInputStream(Utilities.path(src, "validator.pack"))); if (f.isDirectory()) - return scanDirectory(f); + return scanDirectory(f, recursive); if (src.endsWith(".tgz")) return loadPackage(new FileInputStream(src), src); if (src.endsWith(".pack")) @@ -505,11 +505,12 @@ public class ValidationEngine { } } - private Map scanDirectory(File f) throws FileNotFoundException, IOException { + private Map scanDirectory(File f, boolean recursive) throws FileNotFoundException, IOException { Map res = new HashMap<>(); for (File ff : f.listFiles()) { if (ff.isDirectory()){ - res.putAll(scanDirectory(ff)); + if (recursive) + res.putAll(scanDirectory(ff, true)); } else if (!isIgnoreFile(ff)) { FhirFormat fmt = checkIsResource(ff.getAbsolutePath()); @@ -685,9 +686,9 @@ public class ValidationEngine { context.cacheResource(r); } - public void loadIg(String src) throws IOException, FHIRException, Exception { + public void loadIg(String src, boolean recursive) throws IOException, FHIRException, Exception { String canonical = null; - Map source = loadIgSource(src); + Map source = loadIgSource(src, recursive); String version = Constants.VERSION; if (this.version != null) version = this.version; @@ -808,7 +809,7 @@ public class ValidationEngine { } public Content loadContent(String source, String opName) throws Exception { - Map s = loadIgSource(source); + Map s = loadIgSource(source, false); Content res = new Content(); if (s.size() != 1) throw new Exception("Unable to find resource " + source + " to "+opName); diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/Validator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/Validator.java index 4678ff95b..39da1fe72 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/Validator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/Validator.java @@ -163,6 +163,8 @@ public class Validator { System.out.println(" Default: results are sent to the std out."); System.out.println("-debug"); System.out.println(" Produce additional information about the loading/validation process"); + System.out.println("-recurse"); + System.out.println(" Look in subfolders when -ig refers to a folder"); System.out.println("-native: use schema for validation as well"); System.out.println(" * XML: w3c schema+schematron"); System.out.println(" * JSON: json.schema"); @@ -228,7 +230,7 @@ public class Validator { String s = args[++i]; if (!s.startsWith("hl7.fhir.core-")) { System.out.println("Load Package: "+s); - validator.loadIg(s); + validator.loadIg(s, true); } } } @@ -268,6 +270,7 @@ public class Validator { boolean doNative = false; boolean anyExtensionsAllowed = true; boolean hintAboutNonMustSupport = false; + boolean recursive = false; List profiles = new ArrayList(); EngineMode mode = EngineMode.VALIDATION; String output = null; @@ -323,6 +326,8 @@ public class Validator { doNative = true; else if (args[i].equals("-debug")) doDebug = true; + else if (args[i].equals("-recurse")) + recursive = true; else if (args[i].equals("-strictExtensions")) anyExtensionsAllowed = false; else if (args[i].equals("-hintAboutNonMustSupport")) @@ -390,7 +395,7 @@ public class Validator { validator.setVersion(sv); for (String src : igs) { System.out.println("+ .. load IG from "+src); - validator.loadIg(src); + validator.loadIg(src, recursive); } validator.setQuestionnaires(questionnaires); validator.setNative(doNative); diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ProfileComparisonTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ProfileComparisonTests.java index eb4d18419..5783bab81 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ProfileComparisonTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ProfileComparisonTests.java @@ -22,8 +22,8 @@ public class ProfileComparisonTests { if (!TestUtilities.silent) System.out.println("Compare US Patient Core with AU Patient Base"); ValidationEngine ve = new ValidationEngine("hl7.fhir.core#3.0.1", DEF_TX, null, FhirPublication.R4); - ve.loadIg("hl7.fhir.us.core#1.0.1"); - ve.loadIg("hl7.fhir.au.base#dev"); + ve.loadIg("hl7.fhir.us.core#1.0.1", false); + ve.loadIg("hl7.fhir.au.base#dev", false); String left = "http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"; diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java index a783a5b8e..68c7705f6 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java @@ -159,7 +159,7 @@ public class ValidationEngineTests { ValidationEngine ve = new ValidationEngine("hl7.fhir.core#3.0.1", DEF_TX, null, FhirPublication.STU3); if (!TestUtilities.silent) System.out.println(" .. load USCore"); - ve.loadIg("hl7.fhir.us.core#1.0.1"); + ve.loadIg("hl7.fhir.us.core#1.0.1", false); List profiles = new ArrayList<>(); profiles.add("http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"); OperationOutcome op = ve.validate(TestUtilities.resourceNameToFile("validation-examples", "patient301.xml"), profiles);