44import java .io .InputStream ;
55import java .util .ArrayList ;
66import java .util .List ;
7+ import java .util .stream .Collectors ;
78
89import com .google .gson .Gson ;
910
1011import org .hl7 .fhir .common .hapi .validation .support .CachingValidationSupport ;
1112import org .hl7 .fhir .common .hapi .validation .support .CommonCodeSystemsTerminologyService ;
1213import org .hl7 .fhir .common .hapi .validation .support .InMemoryTerminologyServerValidationSupport ;
13- import org .hl7 .fhir .common .hapi .validation .support .NpmPackageValidationSupport ;
14+ import org .hl7 .fhir .common .hapi .validation .support .PrePopulatedValidationSupport ;
1415import org .hl7 .fhir .common .hapi .validation .support .SnapshotGeneratingValidationSupport ;
1516import org .hl7 .fhir .common .hapi .validation .support .ValidationSupportChain ;
1617import org .hl7 .fhir .common .hapi .validation .validator .FhirInstanceValidator ;
1718import org .hl7 .fhir .instance .model .api .IBaseResource ;
1819import org .hl7 .fhir .r4 .model .CanonicalType ;
20+ import org .hl7 .fhir .r4 .model .CodeSystem ;
1921import org .hl7 .fhir .r4 .model .ElementDefinition ;
22+ import org .hl7 .fhir .r4 .model .Resource ;
2023import org .hl7 .fhir .r4 .model .StructureDefinition ;
24+ import org .hl7 .fhir .r4 .model .ValueSet ;
2125import org .hl7 .fhir .utilities .npm .NpmPackage ;
2226
2327import ca .uhn .fhir .context .FhirContext ;
2428import ca .uhn .fhir .context .support .ConceptValidationOptions ;
2529import ca .uhn .fhir .context .support .DefaultProfileValidationSupport ;
2630import ca .uhn .fhir .context .support .IValidationSupport ;
2731import ca .uhn .fhir .context .support .ValidationSupportContext ;
32+ import ca .uhn .fhir .parser .IParser ;
2833import ca .uhn .fhir .rest .server .exceptions .InternalErrorException ;
2934import ca .uhn .fhir .util .ClasspathUtil ;
3035import ca .uhn .fhir .validation .FhirValidator ;
@@ -48,6 +53,44 @@ public class ValidatorConfiguration {
4853
4954 Logger log = LogManager .getLogger (ValidatorConfiguration .class );
5055
56+ private <T extends Resource > List <T > getResourcesOfType (NpmPackage npmPackage , T resourceType ) throws IOException {
57+ IParser jsonParser = fhirContext .newJsonParser ();
58+
59+ return npmPackage .listResources (resourceType .fhirType ()).stream ()
60+ .map (t -> {
61+ try {
62+ return npmPackage .loadResource (t );
63+ } catch (IOException e ) {
64+ // TODO Auto-generated catch block
65+ e .printStackTrace ();
66+ }
67+ return null ;
68+ })
69+ .map (jsonParser ::parseResource )
70+ .filter (resource -> resourceType .getClass ().isInstance (resource ))
71+ .map (resource -> (T ) resource )
72+ .collect (Collectors .toList ());
73+ }
74+
75+ private PrePopulatedValidationSupport createPrePopulatedValidationSupport (InputStream inputStream ) throws IOException {
76+ NpmPackage npmPackage = NpmPackage .fromPackage (inputStream );
77+ PrePopulatedValidationSupport prePopulatedSupport = new PrePopulatedValidationSupport (fhirContext );
78+
79+ for (StructureDefinition sd : getResourcesOfType (npmPackage , new StructureDefinition ())) {
80+ prePopulatedSupport .addStructureDefinition (sd );
81+ }
82+
83+ for (CodeSystem cs : getResourcesOfType (npmPackage , new CodeSystem ())) {
84+ prePopulatedSupport .addCodeSystem (cs );
85+ }
86+
87+ for (ValueSet vs : getResourcesOfType (npmPackage , new ValueSet ())) {
88+ prePopulatedSupport .addValueSet (vs );
89+ }
90+
91+ return prePopulatedSupport ;
92+ }
93+
5194 public ValidatorConfiguration (String _PROFILE_MANIFEST_FILE ) {
5295 PROFILE_MANIFEST_FILE = _PROFILE_MANIFEST_FILE ;
5396 fhirContext = FhirContext .forR4 ();
@@ -60,23 +103,22 @@ public ValidatorConfiguration(String _PROFILE_MANIFEST_FILE) {
60103 new SnapshotGeneratingValidationSupport (fhirContext ));
61104
62105 SimplifierPackage [] packages = getPackages ();
63- NpmPackageValidationSupport npmPackageSupport = new NpmPackageValidationSupport (fhirContext );
64106
65107 try {
66108 for (SimplifierPackage individualPackage : packages ) {
67109 String packagePath = String .format ("classpath:package/%s-%s.tgz" , individualPackage .packageName ,
68110 individualPackage .version );
69- npmPackageSupport .loadPackageFromClasspath (packagePath );
70111 try (InputStream is = ClasspathUtil .loadResourceAsStream (packagePath )) {
71112 NpmPackage pkg = NpmPackage .fromPackage (is );
72113 npmPackages .add (pkg );
114+ PrePopulatedValidationSupport foo = createPrePopulatedValidationSupport (is );
115+ supportChain .addValidationSupport (foo );
73116 }
74117 }
75118 } catch (InternalErrorException | IOException ex ) {
76119 log .error (ex .getMessage (), ex );
77120 throw new RuntimeException ("error loading simplifier packages" , ex );
78121 }
79- supportChain .addValidationSupport (npmPackageSupport );
80122 generateSnapshots (supportChain );
81123 supportChain .fetchCodeSystem ("http://snomed.info/sct" );
82124
@@ -183,7 +225,7 @@ public IValidationSupport.CodeValidationResult validateCodeInValueSet(
183225 String theCode ,
184226 String theDisplay ,
185227 IBaseResource theValueSet ) {
186- String valueSetUrl = CommonCodeSystemsTerminologyService .getValueSetUrl (fhirContext , theValueSet );
228+ String valueSetUrl = CommonCodeSystemsTerminologyService .getValueSetUrl (theValueSet );
187229
188230 if ("https://fhir.nhs.uk/ValueSet/NHSDigital-MedicationRequest-Code" .equals (valueSetUrl )
189231 || "https://fhir.nhs.uk/ValueSet/NHSDigital-MedicationDispense-Code" .equals (valueSetUrl )
0 commit comments