Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Tjek relevant overordnede dele er til stede i input (så validatorer ikke behøver blive negative, hvis de ikke er)

Indhold:

Table of Contents

...

På NSP deles i dag CDA dokumenter vha. en XDS infrastruktur. Et CDA dokumenter dokument er et struktureret XML dokument, som følger en bestemt standard for kliniske dokumenter. Der findes forskellige typer af CDA dokumenter. Medcom har lavet de , hvor der er lavet danske profileringer (Udgivelser), som dækker typernefølgende:

  • Appointment Document (APD) til aftaler
  • Careplan (CPD)
  • Personal Data Card/Stamkort (PDC)
  • Personal Health Monitoring Report (PHMR) til hjemmemonitorering
  • Questionnaire Form Definition Document (QFDD) og Questionnaire Response Document (QRD) til patientrapporterede oplysninger (PRO)

Fælles for alle dokumenterne er en et fælles CDA header format, der indeholder metadata om dokumentet. Denne skal overholde Medcoms standard standarden for den danske profilering af metadata (XDS Metadata for Document Sharing. Danish profile).  Ligesom data i headeren skal findes i Medcoms den fælles liste over tilladet værdisæt (DK-IHE_Metadata-Common_Code_systems-Value_sets). 

Dokumenter, som gemmes i XDS infrasktrukturen, registreres under deres metadata - herunder dokumentid, og kan fremsøges ud fra disse igen. Det registerede metadata er underlagt samme standarder, som CDA dokumenterne selv er,  dvs. de skal overholde Medcoms de danske standarder.

For at gemme eller hente et dokument, anvendet et ITI kald. ITI kald er standardiserede SOAP services, der overholder IHE XDS specifikationenEt ITI kald opererer med begreberne SubmissionSet, DocumentEntry og Association, hvis indhold lægger sig op af dokumentets metadata. Disse skal derfor også overholde standarderne.

For yderligere Yderligere detaljer og introduktion til dokumentdeling læskan læses i Dokumentdeling på NSP

For at lette arbejdet med at overholde/validerere for standarderne, findes XdsValidation biblioteket. DROS komponenten gør kan gøre brug af denne validering, for at sikre, at der ikke komme ugyldige data ind i XDS infrastrukturen. Anvendere af DROS kan selv implementere validering vha. af XdsValidation biblioteket, hvis man ønsker at finde " fejl" , inden det faktisk faktiske kald udføres. Alle, der er koblet på NSP XDS infrastrukturen med enten registry eller repository eller som har sit eget affinitetsdomæne, kan med fordel anvende XdsValiderings biblioteket. Også som supplement til eventuel egen validering.

XdsValiderings biblioteket er under fortsat udvikling. Se afsnittet "Understøttede valideringsregler" for den nuværende implementering.

For at anvende XdsValidation biblioteket, skal man gøre brug af tredjepartsproduktet IPF Open eHealth Integration Platform, da interaktionen foregår vha. dette.

Da DROS, som nævnt gør brug af XdsValidationlXdsValidation, kan man her finde yderligere inspiration for implementering , hvis man som ekstern anvender ønsker at gøre brug af XDS valideringder. Dette dokument beskriver overordnet tilgængelighed funktionalitet af modulet samt anvendelsebiblioteket.

API Beskrivelse og anvendelse

...

Biblioteket består af en række valideringsregler/klasser, som kan sættes sammen efter behov. Det er muligt at sætte en validering sammen, som en lang kæde, eller lave en træstruktur, sådan at vise visse valideringer, stopper for yderligere validering i specifikt område. Sidstnævnte kan f.eks. være, at hvis et dokument ikke er en kendt CDA type, så behøver man ikke validerere yderligere på dets metadata.

...

Figur: kæde- eller træstruktur

Men for For at lette arbejdet med bibliotekt, findes der en default opsætning per område, som det anbefales at arbejde med (såkaldet såkaldt factories). Se figuren "Validator overblik" i design og arkitekturdokumentet, for en overblik over disse. Hvordan disse factories anvendes er beskrevet i næste afsnit.

Hver valideringsregel er implementeret som en ud af 4 fire typer . (Navngivning samt hvilken klasse den extender, illustrerer dette dette). Disse er beskrevet i det efterfølgende.

En valideringsregel returnerer enten null (hvis den ikke forstår det input den modtager) eller et object ValidationResultSet. ValidationResultSet kan indholde en række fejl, hvis sådanne er fundet under valideringen.

Validator

En almindelig validering. Den består af en validering, samt mulighed for at angive " under-validatorerer" validatorer samt indikation af, om disse " under-validatorer " skal køresudføres, hvis dens validatorens egen validering fejler. 

Man kan altså med denne validator gruppere en række valideringer, som man ønskes ønsker udført efter hinanden, baseret på validatorens eget udfald. Den almindelige validatorer validator returner så, den fulde mængde af resultater/fejl fundet.

Et eksempel på sådan en validering er Apd2StartStopTimeValidator. Den tjekker om ServiceStartTime på et aftaledokument er udfyldt,  Den har ikke nogen " under-validatorer " i default opsætningen for ITI41 kaldet. Men på sigt kunne disse tilføjes, hvis der opstår behov for specifikke regler omkring StartTime valideringen, når den er udfyldt. Se følgende eksempel:

Code Block
languagejava
titleIti41ValidationFactory - validator eksempel
linenumberstruecollapsetrue
//nuværende eksempel på almindelig felt validering:
Apd2StartStopTimeValidator apd2StartStopTimeValidator = new Apd2StartStopTimeValidator();

//fremtidigt eksempel med yderligere validering:
Apd2StartStopTimeValidator apd2StartStopTimeValidator = new Apd2StartStopTimeValidator(false);
Apd2StartStopTimeSpecifikValueValidator apd2StartStopTimeSpecifikValueValidator = new Apd2StartStopTimeSpecifikValueValidator();
apd2StartStopTimeValidator.appendValidator(apd2StartStopTimeSpecifikValueValidator);

...

AtLeastOneValidator

Denne validator har lidt mere logik end en almindelig validator: Den kræver, at mindst een af dens under-validatorer vil kendes ved det input, den får, for at AtLeastOneValidatoren selv validerer noget ok. 

Man kan altså med denne validator gruppere en række valideringer, og forvente, at mindst een af dem vil kendes ved det input, den får. Den/de " under-validering" validatorer, som kendes ved input, forventes så at udføre relevant validering.

Et eksempel på sådan en validering er CdaDocumentTypeValidator. Den er default konfigureret med en række " under-validatorer" , der hver især kan håndtere en dokument type. Aktiveres CdaDocumentTypeValidator på et dokument, vil den " under-validator" , der kendes ved dokumenttypen, sørge for at validere specifikke regler for denne type. Kendes ingen af " under-validatorne" validatorerne ved dokumentindholdet/typen, vil AtLeastOneValidatoren melde en fejl retur. Se følgende eksempel:

Code Block
languagejava
titleIti41ValidationFactory - AtLeastOneValidator eksempel
linenumberstrue
collapsetrue
CdaDocumentTypeValidator cdaDocumentTypeValidator = new CdaDocumentTypeValidator();

CdaDocumentApdV2ModelEnricher cdaDocumentApdV2ModelEnricher = new CdaDocumentApdV2ModelEnricher();
cdaDocumentTypeValidator.appendValidator(cdaDocumentApdV2ModelEnricher);

Apd2StartStopTimeValidator apd2StartStopTimeValidator//validering hvor CdaDocumentTypeValidator forventer at ens af dens under-validatorer vil kendes ved input (dokumentet)

CdaDocumentTypeValidator cdaDocumentTypeValidator = new CdaDocumentTypeValidator();

CdaDocumentApdV2ModelEnricher cdaDocumentApdV2ModelEnricher = new Apd2StartStopTimeValidatorCdaDocumentApdV2ModelEnricher();
cdaDocumentApdV2ModelEnrichercdaDocumentTypeValidator.appendValidator(apd2StartStopTimeValidatorcdaDocumentApdV2ModelEnricher);  		

Apd2AppointmentIdValidatorCdaDocumentPhmrModelEnricher apd2AppointmentIdValidatorcdaDocumentPhmrModelEnricher = new Apd2AppointmentIdValidatorCdaDocumentPhmrModelEnricher();
cdaDocumentApdV2ModelEnrichercdaDocumentTypeValidator.appendValidator(apd2AppointmentIdValidatorcdaDocumentPhmrModelEnricher);

Apd2CustodianIdValidatorCdaDocumentQrdModelEnricher apd2CustodianIdValidatorcdaDocumentQrdModelEnricher = new Apd2CustodianIdValidatorCdaDocumentQrdModelEnricher(organisationCodeValidation);
cdaDocumentApdV2ModelEnrichercdaDocumentTypeValidator.appendValidator(apd2CustodianIdValidatorcdaDocumentQrdModelEnricher);

Det som kendetegner en almindelig AtLeastOne validator er extension af klassen AbstractAtLeastOneValidatorImpl.

...

Dette er ikke en egentlig validator. "Valideringen" består af udpakning af input.

Man kan se, det er noget input - så en indirekte validering af, at input forståes forstås og regning forbedring/berigelse af det data, der arbejdes på. Denne " berigelse " sættes på det indkomne objekt (deraf ModelEnricher) og senere validatorer, kan arbejde herpåvidere med dette.

Starter

adskiller sig fra en ModelEnricher ved, at den ikke modtager det fælles objekt XDSDocument, men istedet en request type. Dette request pakkes ud i et eller flere XDSDocument objekter, og Starter kører så sine under-validatorer på hver af disse objekter.

Eksempel fra DROS

Følgende kode, består af 3 trin.

  1. Instansiering af validator til validering af iti-41 ProvideAndRegisterDocumentSet
  2. Oprettelse af ProvideAndRegisterDocumentSet kaldet
  3. Validering af kaldet
Code Block
ProvideAndRegisterDocumentSetStarter subject = Iti41ValidationFactory.createIti41Validator();

ProvideAndRegisterDocumentSet provideAndRegisterDocumentSetInput = provideAndRegisterDocumentSetCreator.createProvideAndRegisterDocumentSetApd();

ValidationResultSet validationOutput = subject.validate(provideAndRegisterDocumentSetInput);

Se iøvrigt praktisk anvendelse i bibliotekets egne unit test. F.eks. CdaHeaderValidatorTest der viser CDA dokument validering og  ProvideAndRegisterDocumentSetValidatorTest, der viser en række kald for iti-41.

...

Man kan på en ModelEnricher også sætte under-validatorer på, ligesom på en almindelig validator.

Et eksempel på sådan en ModelEnricher er CdaDocumentApdV2ModelEnricher. Den er default konfigureret på CdaDocumentTypeValidator (se ovenfor for en AtLeastOneValidator) og modtager et CDA dokument, som den forsøger at pakke ud til et aftaledokument. Lykkedes dette, kalder den sine under-validatorer som validerer aftale specikke regler.

Code Block
languagejava
titleIti41ValidationFactory - ModelEnricher eksempel
linenumberstrue
//validering, hvor CdaDocumentApdV2ModelEnricher forventes at pakke input ud og forstå at det er et aftale dokument.

CdaDocumentApdV2ModelEnricher cdaDocumentApdV2ModelEnricher = new CdaDocumentApdV2ModelEnricher();

Apd2StartStopTimeValidator apd2StartStopTimeValidator = new Apd2StartStopTimeValidator();
cdaDocumentApdV2ModelEnricher.appendValidator(apd2StartStopTimeValidator);

Apd2AppointmentIdValidator apd2AppointmentIdValidator = new Apd2AppointmentIdValidator();
cdaDocumentApdV2ModelEnricher.appendValidator(apd2AppointmentIdValidator);

Apd2CustodianIdValidator apd2CustodianIdValidator = new Apd2CustodianIdValidator(organisationCodeValidation);
cdaDocumentApdV2ModelEnricher.appendValidator(apd2CustodianIdValidator);

Det som kendetegner en ModelEnricher er extension af klassen AbstractModelEnricherImpl.

Starter

Denne minder om en ModelEnricher, men adskiller sig ved, at den ikke modtager det fælles objekt XDSDocument, som de andre validatorer arbejder med. Den modtager en request type, som pakkes ud i et eller flere XDSDocument objekter, og Starter kører så sine under-validatorer på hver af disse objekter.

Alle valideringer starter derfor med en Starter validering, og al anden validering bygges herpå. Se eksempelvis ProvideAndRegisterDocumentSetStarter for et fuldt eksempel.

Code Block
languagejava
titleIti41ValidationFactory - Starter eksempel
linenumberstrue
//validering, hvor det hele initiers med en Starter validering til et iti 41 kald

ProvideAndRegisterDocumentSetStarter provideAndRegisterDocumentSetStarter = new ProvideAndRegisterDocumentSetStarter(); 

Det som kendetegner en Starter er extension af klassen AbstractStarterImpl.

Den gode kombination

Principperne for oprettelse af valideringsregler og sammensætning af disse i struktur, kan skitseres ved:

  • Start med en Starter, som forstår input
  • Berig input efterhånden som behovet opstår
  • Valider kun data, som er relevant. Dvs. anvend træstrukturer
  • Tjek relevante overordnede dele er til stede i input (sådan at øvrige senere validatorer kan tillade sig at ignorere dette)
  • Er input "uforståligt" så returner ingen ting
  • Er input "forståligt" men forkert så returner fejl

Alle ITI kalds default valideringer, som er konfigureret i XdsValidation biblioteket, er sat op efter følgende struktur:

  • Den tilhørende starter vælges (Starter)
  • En struktur validator tilknyttes (Validator), som sikrer at et kald indeholder de komponenter, det skal (eksempel for ITI 41 documententry, assocation og selve dokumentet)
  • Alle andre relevante validatorer tilføjes. For ITI 41 drejer det sig om følgende træstruktur:
    • XDSDocumentContentModelEnricher (ModelEnricher), der pakker input ud som UTF8 bytes hvis muligt
      • XDSDocumentValidator (AtLeastOneValidator) og CdaDocumentHeaderModelEnricher, som forventer at kunne pakke input ud som et CDA dokument ved at finde en CDA header
        • CdaDocumentTypeValidator (AtLeastOneValidator) og CdaDocumentApdV2ModelEnricher, CdaDocumentPhmrModelEnricher samt CdaDocumentQrdModelEnricher, der forventer, at dokumentet er en af typerne APD, PHMR eller QRD
          • Felt specifikke validatorer (Validator) for hver af de 3 dokument typer
    • Felt specifikke validatorer (Validator) for documentEntry
    • Felt specifikke validatorer (Validator) for SubmissionSet
    • Sammenlignings validatorer per felt (Validator), der sikrer DocumentEntry og SubmissionSet indeholder samme værdier
    • Sammenlignings validatorer per felt (Validator), der sikrer DocumentEntry og dokumentets CDA header indeholder samme værdier

Hver ITI kald har sin kombination, da ikke alle elementer er til stede, i de forskellige kald. F.eks, er et ITI 41 kald det eneste, som har et faktisk dokument, der kan valideres.

En grafisk præsentation af denne konfiguration af default validering kan ses i Design og arkitektur dokumentet.

Hvordan ændrer man default valideringen

Hvis man ønsker, at ændre i den måde, default valideringen er sat op i XdsValidation biblioteket, enten ved at fjerne valideringsregler eller udvide med sine egne, kan det gøres ved at kopiere den default validering, man ønsker ændret og lave sine justeringer (fjerne eller tilføje regler). Alternativt, hvis man ønsker at lave "strengere" regler på udvalgte områder, kan man udføre default valideringen, og så yderligere have en validering, som alene består af egne valideringsregler (med relevante Starter og ModelEnricher).

Et konkret eksempel kan være ændring af en ITI 41 kaldets validering, sådan at startTime for aftaler bliver mere specifik (F.eks at tiden skal være i "fremtiden"). Dette kunne gøres som følger:

  • Udvikling af egen udvidede validering  i klassen Apd2StartStopTimeSpecifikValueValidator (en almindelig validator vil her være passende som skabelon)
  • Lave en kopi af klassen Iti41ValidationFactory som Iti41ValidationFactoryExtended
  • Tilføj egen validering (se eksemplet ovenfor i afsnit 2.1 for "fremtidigt eksempel med yderligere validering"
  • Der, hvor man normalt ville bruge Iti41ValidationFactory.createIti41Validator anvender man istedet Iti41ValidationFactoryExtended.createIti41Validator.

Har man brug for at kunne lave sin egen enricher, og tilhørende opbevaring til en validator senere i flowet kan man gøre følgende

  • Opret en klasse, som beskriver det objekt man gerne vil have enricheren til at enriche til
  • Opret en enricher i stil med f.eks. CdaDocumentPhmrModelEnricher
    • Dens enrich metode skal modtage XDSDocument som input
    • Den skal oprette et beriget objekt (punkt 1) og  tilføje det til XDSDocument som en "enrichment".

  • Lav de yderligere relevante validatorer, som validererer dette ny enriched object
  • Kombiner ekisterende  og nye enrichere og validatorer i en ValidationFactory som beskrevet i afsnittet tidligere.

    Code Block
    languagejava
    titleEksempel på anvendelse af eget format
    public static final EnrichmentKey<MyTestDocument> ENRICHMENT_MY_TEST_DOCUMENT = EnrichmentKey.create(MyTestDocument.class);
    
    public class MyTestDocument {
    	private String somefield1;
    	private String somefield2;
    }
    
    
    public class MyTestDocumentModelEnricher extends AbstractModelEnricherImpl<XDSDocument> implements Validator<XDSDocument> {
    	
    	@Override
    	protected ValidationResultSet enrich(XDSDocument input) {
    	
    		ValidationResultSet validationResultSet = new ValidationResultSet();
    		
    		MyTestDocument myTestClass = new MyTestDocument();
    	
    		// lav logik som tager relevant indhold fra XDSDocument og pakker det om til MyTestDocument
    		
    		// opstår der fejl kan de returneres i validationResultSet
    		
    		xdsDocument.setEnrichment(ENRICHMENT_MY_TEST_DOCUMENT, myTestClass);
    		
    		return validationResultSet;
    		
    	}
    }
    
    
    public class MyTestDocumentSomeField1Validator extends AbstractValidatorImpl<XDSDocument> {
    	
    	@Override
    	protected ValidationResultSet validateInternal(XDSDocument input) {
    
    		if (input == null || input.getEnrichment(ENRICHMENT_MY_TEST_DOCUMENT) == null) {
    			return null;
    		}
    
    		ValidationResultSet validationResultSet = new ValidationResultSet();
    		
    		// lav logik til validering af input.getEnrichment(ENRICHMENT_MY_TEST_DOCUMENT).getSomeField1();
    		// hvis fejl returneres de i validationResultSet;
    		
    		return validationResultSet;
    	}
    }

Eksempel fra DROS

For at gøre brug af xdsValidation skal følgende dependencies tilføjes til maven pom fil:

Code Block
languagexml
titleMaven pom fil
linenumberstrue
<dependency>
	<groupId>dk.nsp</groupId>
	<artifactId>validation-xds</artifactId>
</dependency> 


Hvis man ikke allerede anvender IPF Open eHealth Integration Platform skal følgende dependency tilføjes

Code Block
languagexml
titleMaven pom fil
linenumberstrue
<dependency>
	<groupId>org.openehealth.ipf.commons</groupId>
	<artifactId>ipf-commons-ihe-xds</artifactId>
	<version>${openehealth.version}</version>
 </dependency> 
<!-- openehealth.version bør være samme version som XDSValidation anvender -->


Følgende kode er taget fra DROS's validerings logik for ITI 41 kald.

Code Block
languagejava
titleIti41ValidationImpl - anvendels af XdsValidation
linenumberstrue
// Fra klassen Iti41ValidationImpl metode validateAndTransform
List<ErrorInfo> xdsValidationErrors = getXdsValidationErrors(provideAndRegisterDocumentSet, xdsValidatorFactory.buildIti41Validator(), xdsValidationLevel);

// Fra klassen RegistryItiValidationImpl
protected List<ErrorInfo> getXdsValidationErrors(ProvideAndRegisterDocumentSet request, ProvideAndRegisterDocumentSetStarter starter, XdsValidationLevel xdsValidationLevel) {
    return getXdsValidationErrors(() -> starter.validate(request), xdsValidationLevel);
}

private List<ErrorInfo> getXdsValidationErrors(Supplier<ValidationResultSet> validator, XdsValidationLevel xdsValidationLevel) {
     if(xdsValidationLevel == XdsValidationLevel.OFF) {
          return new ArrayList<>();
     }
     List<ErrorInfo> errors = new ArrayList<>();
     // Perform the validation
     ValidationResultSet resultSet = validator.get();
     // Construct the result
     if(resultSet.hasErrors()) {
          // Based on the validation level, either return a warning or an error.
          Severity severity = getSeverity(xdsValidationLevel);
          for(ValidationError ve : resultSet.getErrors()) {
               ErrorInfo errorInfo = new ErrorInfo(ErrorCode.REGISTRY_METADATA_ERROR, ve.getErrorMessage(), severity, "", "");
               errors.add(errorInfo);
          }
     }
     return errors;
}

//Klassen XdsValidatorFactory
public class XdsValidatorFactory {
    public ProvideAndRegisterDocumentSetStarter buildIti41Validator() {
        return Iti41ValidationFactory.createIti41Validator();
    }

    public RegisterDocumentSetStarter buildIti42Validator() {
        return Iti42ValidationFactory.createIti42Validator();
    }

    public RegisterDocumentSetStarter buildIti57Validator() {
        return Iti57ValidationFactory.createIti57Validator();
    }

    public RegisterDocumentSetStarter buildIti61Validator() {
        return Iti61ValidationFactory.createIti61Validator();
    }
}


Dvs ønsker man benytte default valideringen for ITI 41 kaldet gøres det ved at:

  1. Oprette en instans af ProvideAndRegisterDocumentSetStarter (linie 2)
  2. Kalde metoden validate på denne med ITI 41 requested (ProvideAndRegisterDocumentSet) (linie 6)
  3. Retur får man en liste over de fejl XdsValidation fandt (linie 15)

På samme måde kan man få valideret de øvrige kald, ved at vælge den rette Starter og sende requsted ind til den.

Code Block
languagejava
titleIti42ValidationImpl - anvendels af XdsValidation
linenumberstrue
// Fra klassen Iti42ValidationImpl metode validateAndTransform
List<ErrorInfo> xdsValidationErrors = getXdsValidationErrors(registerDocumentSet, xdsValidatorFactory.buildIti42Validator(), xdsValidationLevel);

// Fra klassen RegistryItiValidationImpl

protected List<ErrorInfo> getXdsValidationErrors(RegisterDocumentSet request, RegisterDocumentSetStarter starter, XdsValidationLevel xdsValidationLevel) {
    return getXdsValidationErrors(() -> starter.validate(request), xdsValidationLevel); //for getXdsValidationErrors se ovenfor
}
Code Block
languagejava
titleIti61ValidationImpl - anvendels af XdsValidation
linenumberstrue
// Fra klassen Iti57ValidationImpl metode validateAndTransform
List<ErrorInfo> xdsValidationErrors = getXdsValidationErrors(registerDocumentSet, xdsValidatorFactory.buildIti61Validator(), xdsValidationLevel);  

// Fra klassen RegistryItiValidationImpl
protected List<ErrorInfo> getXdsValidationErrors(RegisterDocumentSet request, RegisterDocumentSetStarter starter, XdsValidationLevel xdsValidationLevel) {
    return getXdsValidationErrors(() -> starter.validate(request), xdsValidationLevel); //for getXdsValidationErrors se ovenfor
}
Code Block
languagejava
titleIti57ValidationImpl - anvendels af XdsValidation
linenumberstrue
// Fra klassen Iti41ValidationImpl metode validateAndTransform
List<ErrorInfo> xdsValidationErrors = getXdsValidationErrors(registerDocumentSet, xdsValidatorFactory.buildIti57Validator(), xdsValidationLevel);

// Fra klassen RegistryItiValidationImpl
protected List<ErrorInfo> getXdsValidationErrors(RegisterDocumentSet request, RegisterDocumentSetStarter starter, XdsValidationLevel xdsValidationLevel) {
    return getXdsValidationErrors(() -> starter.validate(request), xdsValidationLevel); //for getXdsValidationErrors se ovenfor
}  


Se iøvrigt praktisk anvendelse i bibliotekets egne unit test. F.eks. CdaHeaderValidatorTest der viser CDA dokument validering og  ProvideAndRegisterDocumentSetValidatorTest, der viser en række kald for iti-41.

Understøttede valideringsregler

De implementerede valideringsregler er lavet med udgangspunkt i de danske standarder og IHE XDS specifikationen.

Disse regler/standarder refereres på følgende måde::

  • IHE Vol3 4.2.3.1.2 Creating Coded Attributes: Henviser til IHE XDS specifikationen volume 3, afsnit 4.2.3.1.2
  • DK_IHE_ClassCode_DE: Henviser til til Medcoms fælles liste over tilladet værdisæt faneblad ClassCode_DE
  • Metadata-v096 2.2.3 classCode: Henviser til den danske CDA profil afsnit 2.2.3
  • DK-APD-v2.0.1: 2.1.10.1 Appointment Date and Time: Henviser til Appointment Document (APD) til aftaler afsnit 2.1.10.1
  • DK-QRD-v1.3: 2.2.5 Custodian: Henviser til Questionnaire Response Document (QRD)  afsnit 2.2.5
  • PHMR-DK-v1.3 2.13.3 Custodian: Henviser til Personal Healthcare Monitoring Report (PHMR) afsnit 2.13.3

Begreber (entiteter/atributer mm) anvendt i valideringen stammer fra IHE frameworket (documentEntry og SubmissionSet) samt Medcoms Cda builder/parser (anvendes til at parse CDA header og de konkrete danske profileringer).

For nu er følgende valideringer implementeret. Beskrivelserne i tabelkolonnerne "Validering" stammer fra XdsValidationprojektets javadoc og skal vedligeholdes der.

Bemærk det er muligt sortere og filtrere i tabellerne med confluence indbyggede tabelhåndtering. 

(Anvend "mvn javadoc:javadoc" for at generere i target/site folderne for mvn modulerne validation-xds og validation-codes)

Default validering konfiguration

Man kan med fordel tage udgangspunkt i disse konfigurerede valideringer, ligesom DROS gør i ovenstående eksempler. Hvad de hver især dækker fremgår af de følgende afsnit.

Klasse
CdaDocumentValidatorFactory
Iti41ValidationFactory
Iti42ValidationFactory
Iti61ValidationFactory
Iti57ValidationFactory


De forskellige factories anvender en TerminologyDictionary. I TerminologyDictionary findes en række "LegalCodeChecker"s som anvendes af typevalideringerne (se afsnit nedenfor) til at validere gyldige koder med. Default opsætningen er specificeret i TerminologyDictionary og er følgende:

  • ClassCode: Default gyldigt codeSystem er OID "1.2.208.184.100.9" (DK_IHE_ClassCode_DE).
  • ConfidentialityCode: Default gyldigt codeSystem er OID "2.16.840.1.113883.5.25". Gyldig kode er "N". (DK_IHE_ConfidentialityCode_DE)
  • OrganisationCode: Default gyldige codeSystemer er "1.2.208.176.1.1" (SOR) og "1.2.208.176.1.4" (YDERNUMMER).
  • PatientIdCode: Default gyldigt codeSystem er "1.2.208.176.1.2" (CPR).

Ønskes validering af hele kodersæt, kan disse sendes med ind istedet for anvendelse af default valideringen. Benyt LegalCodeCheckerAsList til dette. Og ønkes en helt anden anden kodevalidering end mod en liste kan man lave sin egen implementation af LegalCodeChecker.

Validering af struktur

Dette er validering, som har med struktur at gøre. F.eks. udpakning af information og forventninger til del-elementer.

Afkrydningen i tabellens 5 sidste søjler indikerer, om en given validering er inkluderet i default valideringer, som er konfigureret i XdsValidation biblioteket.

KlasseValideringITI 41ITI 42ITI 61ITI 57Cda dokument
ProvideAndRegisterDocumentSetStarter
  • submissionSet pakkes ud
  • dokumenter pakkes ud
  • der er som minimum et dokument
x



RegisterDocumentSetStarter
  • submissionSet pakkes ud
  • dokumentEntries pakkes ud

xxx







XDSDocumentITI41StructureValidator
  • der findes et documentEntry
  • der findes et fysisk dokument
  • der findes et submissionSet
x



XDSDocumentITI42StructureValidator
  • der findes et documentEntry
  • der findes et submissionSet

x


XDSDocumentITI61StructureValidator
  • der findes et documentEntry
  • der findes et submissionSet


x

XDSDocumentITI57StructureValidator
  • der findes et submissionSet



x







XDSDocumentValidator
  • under-validatorne tjekker for dokument type. Default vil det være:
    • CdaDocumentHeaderModelEnricher
x



CdaDocumentValidator
  • under-validatorne tjekker for dokument type. Default vil det være:
    • CdaDocumentHeaderModelEnricher




x
CdaDocumentTypeValidator
  • under-validatorne tjekker for dokument type/ indholdsprofil. Default vil det være:
    • CdaDocumentApdV2ModelEnricher
    • CdaDocumentPhmrModelEnricher
    • CdaDocumentQrdModelEnricher
x


x







XDSDocumentContentModelEnricher
  • indhold kan læses som bytes (UTF8)
x



CdaDocumentHeaderModelEnricher
  • bytes kan parses som en CDA header
x


x
CdaDocumentApdV2ModelEnricherx


x
CdaDocumentPhmrModelEnricher
  • det er et PHMR dokument: CodeCodedValue har Codesystem "2.16.840.1.113883.6.1" og code "53576-5"
  • det er Cda Header Version 1: FormatCode er null (anvendt parser finder ikke formatCode for v1)
  • CDA dokumentet kan parses som et PHMR dokument
x


x
CdaDocumentQrdModelEnricher
  • det er et QRD dokument: CodeCodedValue har Codesystem "2.16.840.1.113883.6.1" og code "74465-6"
  • det er Cda Header Version 1: FormatCode er null (anvendt parser finder ikke formatCode for v1)
  • CDA dokumentet kan parses som et QRD dokument
x


x
CdaDocumentPhadModelEnricherx


x


Typevalideringer

Dette er hjælpevalideringer, som feltvalideringer gør brug af.

KlasseValidering

AbstractElementCompare

  • sammenligning af 2 lister (hver med nul, en eller flere objekter)
  • antal af objekter i listen er ens
  • de enkelte objekter er ens på de samme pladser i listen

CodedModelCompare

  • overholder validering i AbstractElementCompare hvor følgende opfylder "objekter er ens"
    • value er ens
    • codeSystem er ens
    • displayName er ens

DateTimeCompare

  • overholder validering i AbstractElementCompare hvor følgende opfylder "objekter er ens"
    • dateTime er ens

DateCompare

  • overholder validering i AbstractElementCompare hvor følgende opfylder "objekter er ens"
    • år, måned og dag i Calender er ens

StringCompare

  • overholder validering i AbstractElementCompare hvor følgende opfylder "objekter er ens"
    • de to strenge er ens



CodedValueValidation

  • regel: IHE Vol3 4.2.3.1.2 Creating Coded Attributes
  • codeSystem er udfyldt hvis krævet
  • codeSystem er gyldigt hvis krævet
  • code er udfyldt hvis krævet
  • displayName er udfyldt hvis krævet
  • yderligere kode validering som implementeret i legalCodeChecker (med default værdier i TerminologyDictionary)

StringValidation

  • overholder regler specificeret af anvender:
    • er udfyldt hvis påkrævet sat
    • længden på værdien er ikke  større end maksimum længde angivet
    • værdien er en af de tilladte værdier angivet

ClassCodeValidation

  • regel: IHE Vol3 4.2.3.1.2 Creating Coded Attributes
  • længden på code er ikke  større end 3 (DK_IHE_ClassCode_DE)
  • overholder validering i CodedValueValidation. Default gyldigt codeSystem angivet i TerminologyDictionary. Code, CodeSystem og DisplayName er udfyldt.
ConfidentialityCodeValidation
  • regel: IHE Vol3 4.2.3.1.2 Creating Coded Attributes
  • overholder validering i CodedValueValidation. Default gyldigt codeSystem angivet i TerminologyDictionary. Code og CodeSystem er udfyldt.
EventCodeValidation
  • regel IHE 4.2.3.1.2 Creating Coded Attributes
  • overholder validering i CodedValueValidation. Ingen default gyldig codeSystem.  Code, CodeSystem og DisplayName er udfyldt.
FormatCodeValidation
  • regel: IHE 4.2.3.1.2 Creating Coded Attributes
  • overholder validering i CodedValueValidation. Ingen default gyldig codeSystem. Code, CodeSystem og DisplayName er udfyldt.
HealthcareFacilityTypeCodeValidation
  • regel: IHE 4.2.3.1.2 Creating Coded Attributes
  • hvis udfyldt er værdien numerisk (DK_HealthcareFacilityType_DE)
  • overholder validering i CodedValueValidation. Ingen default gyldig codeSystem. Code, CodeSystem og DisplayName er udfyldt.
LanguageCodeValidation
  • overholder validering i StringValidation. Påkrævet og default tilladt værdi er "da-DK" (DK_IHE_LanguageCode_DE)
OrganisationCodeValidation
  • hvis codeSystem er Yder så er længden på code 6
  • hvis codeSystem er Yder er code numerisk
  • overholder validering i CodedValueValidation. Default gyldigt codeSystem angivet i TerminologyDictionary. Code og CodeSystem er udfyldt.
PatientIdCodeValidation
  • overholder validering i CodedValueValidation. Default gyldigt codeSystem angivet i TerminologyDictionary. Code og CodeSystem er udfyldt.
PracticeSettingCodeValidation
  • regel: IHE 4.2.3.1.2 Creating Coded Attributes
  • overholder validering i CodedValueValidation. Ingen default gyldig codeSystem. Code, CodeSystem og DisplayName er udfyldt.
TitleValidation
  • validering for StringValidation. Påkrævet og default maksimum længde er 128 (Metadata-v096 2.2.31 title)
TypeCodeValidation
  • regel: IHE 4.2.3.1.2 Creating Coded Attributes
  • validering i CodedValueValidation. Ingen default gyldig codeSystem. Code, CodeSystem og DisplayName er udfyldt.

Krydsvalideringer

Her sammenlignes to entiteter. Disse valideringer sikrer, at de samme felter i forskellige entiteter (documentEntry, submissionSet og Cda dokument) er ens. Hvis mindst en af entiterne kan indholde flere felter af den samme type, sammenlignes antallet af disse også.

Afkrydningen i tabellens 5 sidste søjler indikerer, hvilke default valideringer, den enkelte validator er inkludret i.

KlasseValidering mellem de 2 entiter nævnt i klassens navnITI 41ITI 42ITI 61ITI 57Cda dokument
CdaCrossDocumentEntryAuthorInstitutionValidator
  • der er lige mange authors (dvs en)
  • der er lige mange AuthorInstitutions på den enkelte author
  • overholder validering i CodedModelCompare
x



CdaCrossDocumentEntryAuthorPersonValidator
  • der er lige mange authors (dvs en)
  • overholder validering i StringCompare indholdende personens titel og navne
x



CdaCrossDocumentEntryConfidentialityCodeValidator
  • der er lige mange ConfidentialityCodes (dvs en)
  • overholder validering i CodedModelCompare
x



CdaCrossDocumentEntryCreationTimeValidator
  • overholder validering i DateTimeCompare
x



CdaCrossDocumentEntryEventCodeValidator
  • overholder validering i CodedModelCompare
x



CdaCrossDocumentEntryLanguageCodeValidator
  • overholder validering i StringCompare indeholdende languageCode værdierne
x



CdaCrossDocumentEntryLegalAuthenticatorValidator
  • overholder validering i StringCompare indeholdende legalAuthenticators titel og navne
x



CdaCrossDocumentEntryPatientIdValidator
  • overholder validering i CodedModelCompare
x



CdaCrossDocumentEntryServiceStartTimeValidator
  • overholder validering i DateTimeCompare
x



CdaCrossDocumentEntryServiceStopTimeValidator
  • overholder validering i DateTimeCompare
x



CdaCrossDocumentEntrySourcePatientIdValidator
  • overholder validering i CodedModelCompare
x



CdaCrossDocumentEntrySourcePatientInfoValidator
  • overholder validering i StringCompare indeholdende personens titel og navne
  • overholder validering i DateCompare med datoer, hvor datoer er fødselsdato
  • overholder validering i StringCompare med køn værdierne
x



CdaCrossDocumentEntryTitleValidator
  • overholder validering i StringCompare indeholdende titel værdierne
x



CdaCrossDocumentEntryTypeCodeValidator
  • overholder validering i CodedModelCompare
x



SubmissionSetCrossDocumentEntryAuthorInstitutionValidator
  • ! forudsætning for validering: submissionSet har authors
  • der er lige mange authors
  • der er lige mange AuthorInstitutions på den enkelte author
  • overholder validering i CodedModelCompare
xxxx
SubmissionSetCrossDocumentEntryAuthorPersonValidator
  • ! forudsætning for validering: submissionSet har authors
  • overholder validering i StringCompare indholdende personernes titel og navne
  • (indirekte test af at der er lige mange authors qua listen af titel og navne)
xxxx
SubmissionSetCrossDocumentEntryPatientIdValidator
  • value og codeSystem er ens
xxxx

Feltvalideringer

Hver validering beskæftiger sig med et specifikt felt i enten ITI kald og/eller CDA dokumentet.

Afkrydningen i tabellens 5 sidste søjler indikerer, hvilke default valideringer, den enkelte validator er inkludret i.

Søjlen "felt" kan anvendes til sortering, hvis man ønsker at se valideringen for et specifik felt på tværs af entitet.

KlasseFeltValideringITI 41ITI 42ITI 61ITI 57Cda dokument

CdaHeaderAuthorInstitutionValidator

AuthorInstitution
  • regel: Metadata-v096 2.2.1.1 authorInstitution
  • author er udfyldt 
  • authorInstitution er udfyldt
  • overholder validering i OrganisationCodeValidation
x


x

CdaHeaderAuthorPersonValidator

AuthorPerson
  • regel: Metadata-v096 2.2.1.2 authorPerson
  • ! forudsætning for validering: authorPerson er udfyldt
  • der er et FamilyName og mindst et givenName
x


x

CdaHeaderConfidentialityCodeValidator

ConfidentialityCode
  • regel: Metadata-v096 2.2.5 confidentialityCode
  • confidentialityCode er udfyldt
  • overholder validering i ConfidentialityCodeValidation
x


x

CdaHeaderEventCodeValidator

EventCode
  • regel: Metadata-v096 2.2.9 eventCodeList
  • ! forudsætning for validering: EventCodeList har elementer
  • EventCode er udfyldt
  • overholder validering i EventCodeValidation
x


x

CdaHeaderFormatCodeValidator

FormatCode
  • regel: Metadata-v096 2.2.10 formatCode
  • ! forudsætning for validering: FormatCode er udfyldt
    (krav om udfyldelse varierer per dokumenttype og håndteres default af CdaDocument*type*ModelEnricher)
  • overholder validering i FormatCodeValidation
x


x

CdaHeaderLanguageCodeValidator

LanguageCode
  • regel: Metadata-v096 2.2.15 languageCode
  • languageCode er udfyldt
  • overholder validering i LanguageCodeValidation
x


x

CdaHeaderPatientIdValidator

PatientId
  • regel: Metadata-v096 2.2.20 patientId
  • der er en Patient med et PatientId
  • overholder validering i PatientIdCodeValidation
x


x

CdaHeaderSourcePatientIdValidator

SourcePatientId
  • regel: Metadata-v096 2.2.28 sourcePatientId
  • der er en sourcePatient med et PatientId
  • overholder validering i PatientIdCodeValidation
x


x

CdaHeaderSourcePatientInfoValidator

SourcePatientInfo
  • regel: Metadata-v096 2.2.29 sourcePatientInfo
  • der er en patient
  • der er et familyName og mindst et givenName
  • der er en fødselsdag
  • der er et køn
x


x

CdaHeaderTitleValidator

Title
  • regel: Metadata-v096 2.2.31 title
  • title er udfyldt
  • overholder validering i TitleValidation
x


x

CdaHeaderTypeCodeValidator

TypeCode
  • regel: Metadata-v096 2.2.32 typeCode
  • TypeCode (CodeCodedValue) er udfyldt
  • overholder validering i TypeCodeValidation
x


x

DocumentEntryClassCodeValidator

ClassCode
  • regel: Metadata-v096 2.2.3 classCode
  • classCode er udfyldt
  • overholder validering i ClassCodeValidation
xxxx
DocumentEntryAuthorInstitutionValidatorAuthorInstitution
  • regel: Metadata-v096 2.2.1.1 authorInstitution
  • der er mindst en author
  • der er en authorInstitution 
  • overholder validering i OrganisationCodeValidation
xxxx
DocumentEntryAuthorPersonValidatorAuthorPerson
  • regel: Metadata-v096 2.2.1.2 authorPerson
  • ! forudsætning for validering: authorPerson er udfyldt
  • der er et familyName og et givenName
xxxx
DocumentEntryAvailabilityStatusValidatorAvailabilityStatus
  • regel: Metadata-v096 2.2.2 availabilityStatus
  • AvailabilityStatus er udfyldt
  • AvailabilityStatus indeholder værdien approved eller deprecated
xxxx
DocumentEntryClassCodeValidatorClassCode
  • regel: Metadata-v096 2.2.3 classCode
  • classCode er udfyldt
  • overholder validering i ClassCodeValidation
xxxx
DocumentEntryConfidentialityCodeValidatorConfidentialityCode
  • regel: Metadata-v096 2.2.5 confidentialityCode
  • der er mindst en confidentialityCode
  • overholder validering i ConfidentialityCodeValidation
xxxx
DocumentEntryCreationTimeValidatorCreationTime
  • regel: Metadata-v096 2.2.7 createTime
  • CreationTime er udfyldt
xxxx
DocumentEntryEntryUUIDValidatorEntryUUID
  • regel: Metadata-v096 2.2.8 entryUUID
  • EntryUUID er udfyldt
xxxx
DocumentEntryEventCodeValidatorEventCode
  • regel: Metadata-v096 2.2.9 eventCodeList
  • ! forudsætning for validering: EventCodeList har elementer
  • EventCode er udfyldt
  • overholder validering i EventCodeValidation
xxxx
DocumentEntryFormatCodeValidatorFormatCode
  • regel: Metadata-v096 2.2.10 formatCode
  • FormatCode er udfyldt
  • overholder validering i FormatCodeValidation
xxxx
DocumentEntryHashValidatorHash
  • regel: Metadata-v096 2.2.11 hash
  • ! forudsætning for validering: type er udfyldt
  • Hash er udfyldt for Stable
  • Hash er ikke udfyldt for onDemand

xxx
DocumentEntryHealthcareFacilityTypeCodeValidatorHealthcareFacilityTypeCode
  • regel: Metadata-v096 2.2.12 healthcareFacilityTypeCode
  • FealthcareFacilityTypeCode er udfyldt
  • overholder validering i HealthcareFacilityTypeCodeValidation
xxxx
DocumentEntryLanguageCodeValidatorLanguageCode
  • regel: Metadata-v096 2.2.15 languageCode
  • languageCode er udfyldt
  • overholder validering i LanguageCodeValidation
xxxx
DocumentEntryLegalAuthenticatorValidatorLegalAuthenticator
  • regel: Metadata-v096 2.2.16 legalAuthenticator
  • ! forudsætning for validering: legelAuthenticator er udfyldt
  • der er et familyName og et givenName 
xxxx
DocumentEntryMimeTypeValidatorMimeType
  • regel: Metadata-v096 2.2.18 mimeType
  • MimeType er udfyldt
xxxx
DocumentEntryPatientIdValidatorPatientId
  • regel: Metadata-v096 2.2.20 PatientId
  • der er en PatientId
  • overholder validering i PatientIdCodeValidation
xxxx
DocumentEntryPracticeSettingCodeValidatorPracticeSettingCode
  • regel: Metadata-v096 2.2.21 practiceSettingCode
  • ! forudsætning for validering: PracticeSettingCode er udfyldt
  • overholder validering i PracticeSettingCodeValidation
xxxx
DocumentEntryReferenceidListValidatorReferenceidList
  • regel: Metadata-v096 2.2.22 referenceIdList
  • ! forudsætning for validering: ReferenceIdList har elementer
  • Id er udfyldt
  • længden af Id overstiger ikke 256
xxxx
DocumentEntryRepositoryUniqueIdValidatorRepositoryUniqueId
  • regel: Metadata-v096 2.2.23 repositoryUniqueId
  • RepositoryUniqueId er udfyldt
xxxx
DocumentEntrySizeValidatorSize
  • regel: Metadata-v096 2.2.26 size
  • ! forudsætning for validering: type er udfyldt
  • Size er udfyldt for Stable
  • Size er ikke udfyldt for onDemand

xxx
DocumentEntrySourcePatientIdValidatorSourcePatientId
  • regel: Metadata-v096 2.2.28 sourcePatientId
  • der er en SourcePatientId
  • overholder validering i PatientIdCodeValidation
xxxx
DocumentEntrySourcePatientInfoValidatorSourcePatientInfo
  • regel: Metadata-v096 2.2.29 sourcePatientInfo
  • der er en SourcePatientInfo
  • der er et navn, herunder et efternavn og mindst et fornavn
  • der er en fødselsdag
  • der er et køn
xxxx
DocumentEntryTitleValidatorTitle
  • regel: Metadata-v096 2.2.31 title
  • title er udfyldt
  • overholder validering i TitleValidation
xxxx
DocumentEntryTypeCodeValidatorTypeCode
  • regel: Metadata-v096 2.2.32 typeCode
  • TypeCode er udfyldt
  • overholder validering i TypeCodeValidation
xxxx
DocumentEntryTypeValidatorType
  • regel: Metadata-v096 2.2.19 objectType
  • Type er udfyldt
  • Type har en forventet værdi (Default for ITI41/ITI-42 er stable og for ITI-61 er on-demand)
xxxx
DocumentEntryUniqueIdValidatorUniqueId
  • regel: Metadata-v096 2.2.33 uniqueId
  • UniqueId er udfyldt
xxxx
DocumentEntryURIValidatorURI
  • regel: Metadata-v096 2.2.35 URI
  • ! forudsætning for validering: URI er udfyldt
  • længden af URI overstiger ikke 256
xxxx
SubmissionSetAuthorInstitutionValidatorAuthorInstitution
  • regel: Metadata-v096 2.2.1.1 authorInstitution
  • ! forudsætning for validering: Author og AuthorInstitution er udfyldt
  • overholder validering i OrganisationCodeValidation
xxxx
SubmissionSetEntryUUIDValidatorEntryUUID
  • regel: Metadata-v096 2.2.8 entryUUID
  • EntryUUID er udfyldt
xxxx
SubmissionSetPatientIdValidatorPatientId
  • regel: Metadata-v096 2.2.28 sourcePatientId
  • der er en Patient
  • overholder validering i PatientIdCodeValidation
xxxx
SubmissionSetUniqueIdValidatorUniqueId
  • regel: Metadata-v096 2.2.33 uniqueId
  • UniqueId er udfyldt
xxxx








Apd2AppointmentIdValidatorAppointmentId
  • regel: DK-APD-v2.0.1: 5.1 Appointment content
  • der er et appointmentId (CONF-DK-APD:7493)
x


x
Apd2CustodianIdValidatorCustodian
  • regel: DK-APD-v2.0.1: 2.1.5 custodian
  • ! forudsætning for validering: custodian er udfyldt
  • overholder validering i OrganisationCodeValidation
x


x
Apd2StartStopTimeValidatorStartStopTime
  • regel: DK-APD-v2.0.1: 2.1.10.1 Appointment Date and Time
  • ServiceStartTime er udfyldt (CONF-DK-APD:592c)
x


x

PhmrCustodianIdValidator

Custodian

  • regel: PHMR-DK-v1.3 2.13.3 Custodian
  • ! forudsætning for validering: custodian er udfyldt
  • overholder validering i OrganisationCodeValidation

 

x




x

QrdCustodianIdValidatorCustodian
  • regel: DK-QRD-v1.3: 2.2.5 Custodian
  • ! forudsætning for validering: custodian er udfyldt
  • overholder validering i OrganisationCodeValidation
x


x


.