HAPI FHIR Instance Validator
---
HAPI FHIR中,用來做FHIR Validation的工具為Instance Validator。最基本的Instance Vlidator如下:
```
FhirContext ctx = FhirContext.forR4();
// Ask the context for a validator
FhirValidator validator = ctx.newValidator();
// Create a validation module and register it
IValidatorModule module = new FhirInstanceValidator(ctx);
validator.registerValidatorModule(module);
...
ValidationResult result = validator.validateWithResult(resource);
```
和其他的功能類似,FhirContext為基礎,第一步為產生一validtor,然後生成一validation module並註冊於剛建立的validator。這樣就建立了一個可以實現基本的FHIR Validation。使用方法為呼叫validator.validateWithResult()
由於相關資源都來自基本的FhirContext,可以預期這樣的validator可以做的驗證工作就受限於FHIR標準。
除了使用標準的FhirContext外,也可以使用validation support chain,舉例如下:
```
FhirContext ctx = FhirContext.forR4();
// Create a validation support chain
ValidationSupportChain validationSupportChain = new ValidationSupportChain(
new DefaultProfileValidationSupport(ctx),
new InMemoryTerminologyServerValidationSupport(ctx),
new CommonCodeSystemsTerminologyService(ctx));
// Create a FhirInstanceValidator and register it to a validator
FhirValidator validator = ctx.newValidator();
FhirInstanceValidator instanceValidator = new FhirInstanceValidator(validationSupportChain);
validator.registerValidatorModule(instanceValidator);
```
和前面的範例比較可知,validation support chain可以視為"客製化"vlidation module的方式,也就是說,驗證的標準(包含StructureDefinition、CodeSystem、Terminology)可以依照使用者的實際需要彈性定義(範例還是以FhirContext為基礎,拆分profiles與Terminology)。
validation suport chain是由`IValidationSupport`所組成,換句話說,StructureDefinition和Terminology都可以實作對應的`IValidationSupport`。
`NpmPackageValidationSupport`和`LocalFileValidationSupport `都是Validation Support Modules的實作案例。[Validation Support Modules](https://hapifhir.io/hapi-fhir/docs/validation/validation_support_modules.html)可以找到相關參考資料。
舉例來說,如果我們要開發一個使用TW Core IG的Validator,我們就要使用`NpmPackageValidationSupport`相關程式範例如下:
```
// Create a validator and register it with the context
FhirValidator validator = ctx.newValidator();
NpmPackageValidationSupport npmPackageSupport1 = new NpmPackageValidationSupport(ctx);
npmPackageSupport.loadPackageFromClasspath("classpath:profiles/tw-core-ig/v0.2.1/package.tgz");
// Create a validation support chain
ValidationSupportChain validationSupportChain = new (
npmPackageSupport,
new DefaultProfileValidationSupport(ctx),
new InMemoryTerminologyServerValidationSupport(ctx),
new CommonCodeSystemsTerminologyService(ctx),
new SnapshotGeneratingValidationSupport(ctx));
// Set the chain on the validator
FhirInstanceValidator instanceValidator = new FhirInstanceValidator(validationSupportChain);
validator.registerValidatorModule(instanceValidator);
```
程式邏輯其實完全一樣,唯一的差別在於使用`NpmPackageValidationSupport`產生適用於TW Core IG的Validation Support Modules。