Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

start of dual manifest #222

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,28 @@ import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.core.io.ClassPathResource
import java.util.*
import kotlin.streams.toList

@Configuration
class PackageConfiguration(val objectMapper: ObjectMapper) {
private val logger = KotlinLogging.logger {}

@Bean
fun getPackages(): List<NpmPackage> {
val inputStream = ClassPathResource("manifest.json").inputStream
fun baseGetPackages(manifestFile: String): List<NpmPackage> {
val inputStream = ClassPathResource(manifestFile).inputStream
val packages = objectMapper.readValue(inputStream, Array<SimplifierPackage>::class.java)
return Arrays.stream(packages)
.map { "${it.packageName}-${it.version}.tgz" }
.map { ClassPathResource(it).inputStream }
.map { NpmPackage.fromPackage(it) }
.toList()
}

@Bean("npmPackages")
fun getPackages(): List<NpmPackage> {
return baseGetPackages("manifest.json")
}

@Bean("npmPackagesNext")
fun getNextPackages(): List<NpmPackage> {
return baseGetPackages("manifest.next.json")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import ca.uhn.fhir.context.support.DefaultProfileValidationSupport
import ca.uhn.fhir.context.support.IValidationSupport
import ca.uhn.fhir.context.support.ValidationSupportContext
import ca.uhn.fhir.validation.FhirValidator
import com.example.fhirvalidator.service.BaseCapabilityStatementApplier
import com.example.fhirvalidator.service.ImplementationGuideParser
import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.annotation.Resource
import org.hl7.fhir.common.hapi.validation.support.CommonCodeSystemsTerminologyService
import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport
import org.hl7.fhir.common.hapi.validation.support.SnapshotGeneratingValidationSupport
Expand All @@ -16,25 +18,23 @@ import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator
import org.hl7.fhir.instance.model.api.IBaseResource
import org.hl7.fhir.r4.model.StructureDefinition
import org.hl7.fhir.utilities.npm.NpmPackage
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class ValidationConfiguration(private val implementationGuideParser: ImplementationGuideParser) {
open class BaseValidationConfiguration(private val implementationGuideParser: ImplementationGuideParser) {
private val logger = KotlinLogging.logger {}

@Bean
fun validator(fhirContext: FhirContext, instanceValidator: FhirInstanceValidator): FhirValidator {
fun baseValidator(fhirContext: FhirContext, instanceValidator: FhirInstanceValidator): FhirValidator {
return fhirContext.newValidator().registerValidatorModule(instanceValidator)
}

@Bean
fun instanceValidator(supportChain: ValidationSupportChain): FhirInstanceValidator {
fun baseInstanceValidator(supportChain: ValidationSupportChain): FhirInstanceValidator {
return FhirInstanceValidator(supportChain)
}

@Bean("SupportChain")
fun validationSupportChain(
fun baseValidationSupportChain(
fhirContext: FhirContext,
terminologyValidationSupport: InMemoryTerminologyServerValidationSupport,
npmPackages: List<NpmPackage>
Expand All @@ -52,8 +52,7 @@ class ValidationConfiguration(private val implementationGuideParser: Implementat
return supportChain
}

@Bean
fun terminologyValidationSupport(fhirContext: FhirContext): InMemoryTerminologyServerValidationSupport {
fun baseTerminologyValidationSupport(fhirContext: FhirContext): InMemoryTerminologyServerValidationSupport {
return object : InMemoryTerminologyServerValidationSupport(fhirContext) {
override fun validateCodeInValueSet(
theValidationSupportContext: ValidationSupportContext?,
Expand Down Expand Up @@ -156,3 +155,68 @@ class ValidationConfiguration(private val implementationGuideParser: Implementat
return !structureDefinition.hasSnapshot() && structureDefinition.derivation == StructureDefinition.TypeDerivationRule.CONSTRAINT
}
}

@Configuration
class ValidationConfiguration(
private val implementationGuideParser: ImplementationGuideParser
) : BaseValidationConfiguration(implementationGuideParser) {

@Bean("validator")
fun validator(fhirContext: FhirContext, instanceValidator: FhirInstanceValidator): FhirValidator {
return baseValidator(fhirContext, instanceValidator)
}

@Bean("instanceValidator")
fun instanceValidator(supportChain: ValidationSupportChain): FhirInstanceValidator {
return baseInstanceValidator(supportChain)
}

@Bean("supportChain")
fun validationSupportChain(
fhirContext: FhirContext,
terminologyValidationSupport: InMemoryTerminologyServerValidationSupport,
@Autowired
@Qualifier("npmPackages")
npmPackages: List<NpmPackage>
): ValidationSupportChain {
return baseValidationSupportChain(fhirContext, terminologyValidationSupport, npmPackages)
}

@Bean("terminologyValidationSupport")
fun terminologyValidationSupport(fhirContext: FhirContext): InMemoryTerminologyServerValidationSupport {
return baseTerminologyValidationSupport(fhirContext)
}
}

@Configuration
@Resource(name="npmPackagesNext")
class ValidationConfigurationNext(
private val implementationGuideParser: ImplementationGuideParser
) : BaseValidationConfiguration(implementationGuideParser) {

@Bean("validatorNext")
fun validatorNext(fhirContext: FhirContext, instanceValidatorNext: FhirInstanceValidator): FhirValidator {
return baseValidator(fhirContext, instanceValidatorNext)
}

@Bean("instanceValidatorNext")
fun instanceValidatorNext(supportChainNext: ValidationSupportChain): FhirInstanceValidator {
return baseInstanceValidator(supportChainNext)
}

@Bean("supportChainNext")
fun validationSupportChainNext(
fhirContext: FhirContext,
terminologyValidationSupport: InMemoryTerminologyServerValidationSupport,
@Autowired
@Qualifier("npmPackagesNext")
npmPackagesNext: List<NpmPackage>
): ValidationSupportChain {
return baseValidationSupportChain(fhirContext, terminologyValidationSupport, npmPackagesNext)
}

@Bean("terminologyValidationSupportNext")
fun terminologyValidationSupportNext(fhirContext: FhirContext): InMemoryTerminologyServerValidationSupport {
return baseTerminologyValidationSupport(fhirContext)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import ca.uhn.fhir.context.FhirContext
import ca.uhn.fhir.parser.DataFormatException
import ca.uhn.fhir.validation.FhirValidator
import com.example.fhirvalidator.service.CapabilityStatementApplier
import com.example.fhirvalidator.service.CapabilityStatementApplierNext
import com.example.fhirvalidator.service.MessageDefinitionApplier
import com.example.fhirvalidator.service.MessageDefinitionApplierNext
import com.example.fhirvalidator.util.createOperationOutcome
import io.github.oshai.kotlinlogging.KotlinLogging
import org.hl7.fhir.instance.model.api.IBaseResource
Expand All @@ -20,8 +22,11 @@ import org.springframework.web.bind.annotation.RestController
class ValidateController(
private val fhirContext: FhirContext,
private val validator: FhirValidator,
private val validatorNext: FhirValidator,
private val messageDefinitionApplier: MessageDefinitionApplier,
private val capabilityStatementApplier: CapabilityStatementApplier
private val capabilityStatementApplier: CapabilityStatementApplier,
private val messageDefinitionApplierNext: MessageDefinitionApplierNext,
private val capabilityStatementApplierNext: CapabilityStatementApplierNext
) {
private val logger = KotlinLogging.logger {}

Expand Down Expand Up @@ -65,6 +70,15 @@ class ValidateController(
return validator.validateWithResult(resource).toOperationOutcome() as? OperationOutcome
}

fun validateResourceNext(resource: IBaseResource): OperationOutcome? {
capabilityStatementApplierNext.applyCapabilityStatementProfiles(resource)
val messageDefinitionErrors = messageDefinitionApplierNext.applyMessageDefinition(resource)
if (messageDefinitionErrors != null) {
return messageDefinitionErrors
}
return validatorNext.validateWithResult(resource).toOperationOutcome() as? OperationOutcome
}

fun getResourcesToValidate(inputResource: IBaseResource?): List<IBaseResource> {
if (inputResource == null) {
return emptyList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package com.example.fhirvalidator.service

import com.example.fhirvalidator.util.applyProfile
import com.example.fhirvalidator.util.getResourcesOfType
import jakarta.annotation.Resource
import org.hl7.fhir.instance.model.api.IBaseResource
import org.hl7.fhir.r4.model.CapabilityStatement
import org.hl7.fhir.utilities.npm.NpmPackage
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.stereotype.Service

@Service
class CapabilityStatementApplier(
open class BaseCapabilityStatementApplier(
implementationGuideParser: ImplementationGuideParser,
npmPackages: List<NpmPackage>
) {
Expand All @@ -31,3 +33,23 @@ class CapabilityStatementApplier(
}
}
}

@Service
class CapabilityStatementApplier (
implementationGuideParser: ImplementationGuideParser,
@Autowired
@Qualifier("npmPackages")
npmPackages: List<NpmPackage>
) : BaseCapabilityStatementApplier(implementationGuideParser, npmPackages) {

}

@Service
class CapabilityStatementApplierNext (
implementationGuideParser: ImplementationGuideParser,
@Autowired
@Qualifier("npmPackagesNext")
npmPackagesNext: List<NpmPackage>
) : BaseCapabilityStatementApplier(implementationGuideParser, npmPackagesNext) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import com.example.fhirvalidator.util.applyProfile
import com.example.fhirvalidator.util.createOperationOutcome
import com.example.fhirvalidator.util.createOperationOutcomeIssue
import com.example.fhirvalidator.util.getResourcesOfType
import jakarta.annotation.Resource
import org.hl7.fhir.instance.model.api.IBaseResource
import org.hl7.fhir.r4.model.*
import org.hl7.fhir.utilities.npm.NpmPackage
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.stereotype.Service

@Service
class MessageDefinitionApplier(
open class BaseMessageDefinitionApplier(
implementationGuideParser: ImplementationGuideParser,
npmPackages: List<NpmPackage>
) {
Expand Down Expand Up @@ -121,3 +123,24 @@ class MessageDefinitionApplier(
return null
}
}

@Service
class MessageDefinitionApplier(
implementationGuideParser: ImplementationGuideParser,
@Autowired
@Qualifier("npmPackages")
npmPackages: List<NpmPackage>
) : BaseMessageDefinitionApplier(implementationGuideParser, npmPackages) {

}

@Service
@Resource(name="npmPackagesNext")
class MessageDefinitionApplierNext(
implementationGuideParser: ImplementationGuideParser,
@Autowired
@Qualifier("npmPackagesNext")
npmPackagesNext: List<NpmPackage>
) : BaseMessageDefinitionApplier(implementationGuideParser, npmPackagesNext) {

}
14 changes: 14 additions & 0 deletions src/main/resources/manifest.next.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[
{
"packageName": "fhir.r4.ukcore.stu3.currentbuild",
"version": "0.0.3-pre-release"
},
{
"packageName": "uk.nhsdigital.r4.test",
"version": "2.10.1-prerelease"
},
{
"packageName": "uk.nhsdigital.medicines.r4.test",
"version": "2.8.21-prerelease"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import ca.uhn.fhir.context.FhirContext
import ca.uhn.fhir.validation.FhirValidator
import com.example.fhirvalidator.service.CapabilityStatementApplier
import com.example.fhirvalidator.service.MessageDefinitionApplier
import com.example.fhirvalidator.service.CapabilityStatementApplierNext
import com.example.fhirvalidator.service.MessageDefinitionApplierNext
import org.hl7.fhir.r4.model.Bundle
import org.hl7.fhir.r4.model.Patient
import org.junit.jupiter.api.Assertions.*
Expand All @@ -21,12 +23,21 @@ internal class ValidateControllerTest {
@Mock
lateinit var mockValidator: FhirValidator

@Mock
lateinit var mockValidatorNext: FhirValidator

@Mock
lateinit var mockMessageDefinitionApplier: MessageDefinitionApplier

@Mock
lateinit var mockCapabilityStatementApplier: CapabilityStatementApplier

@Mock
lateinit var mockMessageDefinitionApplierNext: MessageDefinitionApplierNext

@Mock
lateinit var mockCapabilityStatementApplierNext: CapabilityStatementApplierNext

@InjectMocks
lateinit var testValidateController: ValidateController

Expand Down
Loading