Dette dokument dækker følgende komponenter på NSP:
NSP XDS Registry
Type: Webservice
Filnavn: nxrg.war
Url: <serverurl>/nxrg
Servicecheckurl: <serverurl>/nxrg/status
For felt migrerings servicen, se "NXRG - driftvejledning til felt migrering".
Grundlæggende konfiguration foregår ved redigering i filen nxrg.properties, der placeres i følgende WildFly modul:
/pack/wildfly/modules/sds/nxrg/configuration/main/
Moduldefinitionen er at finde i sourcekoden til nxrg under:
/compose/configuration/module.xml
I filen skal følgende properties være definerede:
Property | Beskrivelse |
---|---|
datasource.jndi.name | JNDI navnet på den datasource der giver adgang til NXRG databasen. |
liquibase.changelog.file | Angiver den changelog fil som liquibase skal anvende. Property er ikke krævet. Hvis der skal afvikles integrationstest mod det miljø der installeres skal denne sættes til liquibase-changelog-test.xml. Denne kan også sættes via en environmentvariabel i formen liquibase_changelog_file. |
nxrg.allowed.mimetype | Tilladt MimeType på DocumentEntries i requests til ITI-42, ITI-57 og ITI-61. |
iti18.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. |
iti18.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. |
iti42.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. |
iti42.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. |
iti57.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. |
iti57.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. |
iti61.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. |
iti61.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. |
iti18.request.max.documents.leafclass | Angiver, hvor mange dokumenter en iti 18 søgning må hente. Overskrides antal gives en warning og status er partial success. |
iti18.request.max.documents.objectref | Angiver, hvor mange dokumentreferencer en iti 18 søgning må hente. Overskrides antal gives en warning og status er partial success. |
handled.type.codes | Angiver en liste af, hvilke type codes NXRG håndterer. Er listen tom (property findes, men ingen værdi efter =) accepteres alle type codes. Eksempel på liste: 39289-4,39290-2,53576-5,52460-3,81215-6 |
iti57.cpr.validation.enabled | Angiver, om der ved ITI-57 kald (opdateringskald) skal laves validering på at patientid matcher det tidligere patientid |
Properties relateret til NAS integration: | |
nxrg.httpclient.pooling.totalconnections | Totale antal HttpClients forbindelser der kan åbnes |
nxrg.httpclient.pooling.maxconnections.pr.route | Antal HttpClients forbindelser der kan åbnes pr. rute |
nas.notification.job.max.duration | Den tilladte varighed af jobbet. Angives som duration i ISO-8601 formattet; dog bør kun sekunder angives. Default er PT15S |
nas.notification.job.batch.size | Antallet af adviseringer der sendes til NAS af gangen per SOAP request. Default er 10000. |
nas.notification.job.nas.bundle.size | Antallet af adviseringer der hentes fra tabellen af gangen. Default er 50. |
nas.sts.endpoint | Endpointet, hvor NAS-integrationen skal trække et idkort på baggrund af sts.keystore |
nas.sts.keystore | Keystore der indeholder funktionscertifikatet |
nas.sts.keystore.password | Password til at åbne keystore |
nas.endpoint | Endpointet hvor NAS skal kaldes |
nas.idcard.subject.name | Subject name på idkortet |
nas.idcard.subject.id | Subject Id på idkortet |
nas.idcard.system.name | Systemnavn på idkortet |
Log4j konfiguration findes i samme wildfly modul som servicekonfigurationen
Se yderligere opsætning i installationsvejledningen.
NXRG udstiller en overvågningsside, som findes i listen af komponenter i afsnit 2.
NXRG-overvågningssiden returnerer enten:
Det overvåges om der kan opnås forbindelse til databasen.
TODO
TODO
NXRG laver audit log ved hvert kald af de udbudte ITI-services. I det følgende gennemgåes formaterne for hver service.
Alle logninger ender i en dedikeret logfil audit.log.
Loglinjen er formatteret som json og alle logninger har følgende indgange:
*Komponent: NXRG/<operation>, hvor <operation> er navnet på det ITI kald som laves. F.eks. ITI-57.
For hver skrives følgende informationer
Komponent | Kontekst*1 | Felt | Type | Indhold |
---|---|---|---|---|
NXRG/ITI-42 | submissionset uniqueId | CitizenId | SensitivePersonalInformation | PatientId |
SubmissionSetInformation | RegularPersonalInformation | Identifikation (uniqueId) af det submissionset, der indeholder informationen i iti-42 kaldet. | ||
DoucmentEntryInformation | RegularPersonalInformation | En liste af entryUUid'er og uniqueId'er, der oprettes. Hvis en documentEntry i kaldet giver anledning til replace på en anden documentEntry, så angives dette uuid i egenskaben replacesEntryUuid. | ||
Status | NonPersonalInformation | Status på kaldet. F.eks. OK, ERROR og WARNING | ||
Errors | RegularPersonalInformation | Hvis kaldet resulterer i fejl, angives disse her | ||
NXRG/ITI-61 | Se for ITI42 - indhold er ens | |||
NXRG/ITI-57 | updatedObjectUuid | writeUpdateOperationName | NonPersonalInformation | Typen af opdatering |
updatedObjectUuid | RegularPersonalInformation | UUID der er opdateret. | ||
Status | NonPersonalInformation | Status på kaldet. F.eks. OK, ERROR og WARNING | ||
Errors | RegularPersonalInformation | Hvis kaldet resulterer i fejl, angives disse her | ||
NXRG/ITI-18 | tilfældigt uuid | queryType | NonPersonalInformation | Identifikation typen af query. |
returnType | NonPersonalInformation | Definerer, hvilken type af objekter, der returneres fra servicen | ||
numberOfResults | NonPersonalInformation | Antallet af documententries i svaret | ||
DoucmentEntryInformation | RegularPersonalInformation | En liste af entryUUid'er og uniqueId'er, der er hentet. | ||
Status | NonPersonalInformation | Status på kaldet. F.eks. OK, ERROR og WARNING | ||
Errors | RegularPersonalInformation | Hvis kaldet resulterer i fejl, angives disse her |
*1) Er nøglen null tildeles et tilfældigt uuid
Succesfuldt kald til service iti-42 giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:41:34.053Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-42", "audit": { "timestamp": "2021-12-01T06:41:33.552+01:00", "components": [ { "component": "NXRG/ITI-42", "contexts": [ { "context": "5829933881450595335.691505562960183089.1638337293227", "information": [ { "key": "CitizenId", "type": "SPI", "value": "0101" }, { "key": "SubmissionSetInformation", "type": "RPI", "value": "{\"uniqueId\":\"5829933881450595335.691505562960183089.1638337293227\"}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:ef04ddc0-b086-436f-a7db-37d4bbef8af6\", \"uniqueId\":\"4654430528298460003.324281175136550912.1638337293167\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 360, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti42", "query": "", "port": 8060, "protocol": "http", "reqSize": 8528, "resSize": 919, "soapHeaders": { "w3Action": "urn:ihe:iti:2007:RegisterDocumentSet-b", "w3MessageID": "urn:uuid:5d2b8ccb-3a7f-4b0b-becc-4330999c1021", "w3To": "http://localhost:8060/nxrg/iti42" }, "threadId": "default task-1", "time": "2021-12-01T06:41:33.544+01:00", "stats": { "handlerDuration": 121, "RequestContentDuration": 19, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 5, "SecurityProtocolResponseDuration": 0, "bufferAllocated": true, "usedBuffers": 2, "activeBuffersInPool": 2, "idleBuffersInPool": 0 } } } |
Succesfuldt kald til service iti-61 giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:44:20.01Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-61", "audit": { "timestamp": "2021-12-01T06:44:19.821+01:00", "components": [ { "component": "NXRG/ITI-61", "contexts": [ { "context": "6943690717325663174.4847763071154435223.1638337459544", "information": [ { "key": "CitizenId", "type": "SPI", "value": "0101" }, { "key": "SubmissionSetInformation", "type": "RPI", "value": "{\"uniqueId\":\"6943690717325663174.4847763071154435223.1638337459544\"}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:92ee0d66-a9e0-4931-a90d-d5d708fa80c5\", \"uniqueId\":\"6284022344789100604.4104933276600124364.1638337459491\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 165, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti61", "query": "", "port": 8060, "protocol": "http", "reqSize": 8211, "resSize": 922, "soapHeaders": { "w3Action": "urn:ihe:iti:2010:RegisterOnDemandDocumentEntry", "w3MessageID": "urn:uuid:af796d78-361d-457e-89ba-df01bca340d0", "w3To": "http://localhost:8060/nxrg/iti61" }, "threadId": "default task-1", "time": "2021-12-01T06:44:19.82+01:00", "stats": { "handlerDuration": 18, "RequestContentDuration": 1, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 2, "activeBuffersInPool": 2, "idleBuffersInPool": 0 } } } |
Succesfuldt kald til service iti-57 for at slette markere et dokument, giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:46:05.636Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-57", "audit": { "timestamp": "2021-12-01T06:46:05.406+01:00", "components": [ { "component": "NXRG/ITI-57", "contexts": [ { "context": "urn:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edb", "information": [ { "key": "CitizenId", "type": "SPI", "value": "0102" }, { "key": "updatedObjectUuid", "type": "RPI", "value": "urn:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edb" }, { "key": "writeUpdateOperationName", "type": "NPI", "value": "UpdateDocumentEntryAvailabilityStatus" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 205, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti57", "query": "", "port": 8060, "protocol": "http", "reqSize": 3524, "resSize": 915, "soapHeaders": { "w3Action": "urn:ihe:iti:2010:UpdateDocumentSet", "w3MessageID": "urn:uuid:8cd0fb3a-cc48-4706-8b6f-025d7dd891fd", "w3To": "http://localhost:8060/nxrg/iti57" }, "threadId": "default task-1", "time": "2021-12-01T06:46:05.405+01:00", "stats": { "handlerDuration": 4, "RequestContentDuration": 0, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 1, "activeBuffersInPool": 1, "idleBuffersInPool": 1 } } } |
Succesfuldt kald til service iti-18 giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:48:42.821Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-18", "audit": { "timestamp": "2021-12-01T06:48:42.772+01:00", "components": [ { "component": "NXRG/ITI-18", "contexts": [ { "context": "urn:uuid:36358982-bfa1-4ad9-ba86-9b5ea33196c2", "information": [ { "key": "CitizenId", "type": "SPI", "value": "22222222" }, { "key": "queryType", "type": "NPI", "value": "urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d" }, { "key": "returnType", "type": "NPI", "value": "LeafClass" }, { "key": "numberOfResults", "type": "NPI", "value": "2" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:268cd839-11e2-4121-8fea-3f184e5f3efa\", \"uniqueId\":\"5766156196412876102.2822196146951899395.1638337675198\", \"replacesEntryUuid\":null}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:ccff6d0e-c2bd-4b9d-81d6-874726e9bba4\", \"uniqueId\":\"7402593388400441251.2665840693284483189.1638337722275\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 31, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti18", "query": "", "port": 8060, "protocol": "http", "reqSize": 2123, "resSize": 11289, "soapHeaders": { "w3Action": "urn:ihe:iti:2007:RegistryStoredQuery", "w3MessageID": "urn:uuid:accc136e-1ca4-4a04-bfe1-4caef4e31328", "w3To": "http://localhost:8060/nxrg/iti18" }, "threadId": "default task-1", "time": "2021-12-01T06:48:42.772+01:00", "stats": { "handlerDuration": 13, "RequestContentDuration": 0, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 1, "activeBuffersInPool": 1, "idleBuffersInPool": 1 } } } |
Succesfuldt kald til service iti-18 giver anledning til en logningslinje på følgende format. Her ses at der er returneret 2 dokumenter, samt et er sorteret fra pga. manglende hash værdi (der er en fejl, hvor "location" er det frasorterede documententry (entryuuid)
{ "time":"2022-04-27T08:50:38.171Z", "category":"dk.sds.nsp.audit.log.nxrg/iti-18", "audit":{ "timestamp":"2022-04-27T10:50:37.985+02:00", "components":[ { "component":"NXRG/ITI-18", "contexts":[ { "context":"urn:uuid:4c50a699-c757-4d72-bce0-ef0e4284d5ff", "information":[ { "key":"CitizenId", "type":"SPI", "value":"27272727" }, { "key":"queryType", "type":"NPI", "value":"urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d" }, { "key":"returnType", "type":"NPI", "value":"LeafClass" }, { "key":"numberOfResults", "type":"NPI", "value":"2" }, { "key":"DoucmentEntryInformation", "type":"RPI", "value":"{\"entryUUid\":\"urn:uuid:b263be94-8ae8-428c-a08e-07e815e9c4f3\", \"uniqueId\":\"8232413550820834039.3966522250150692715.1651049436633\", \"replacesEntryUuid\":null}" }, { "key":"DoucmentEntryInformation", "type":"RPI", "value":"{\"entryUUid\":\"urn:uuid:3632b062-c449-4d80-9f17-92ffe033985b\", \"uniqueId\":\"8463246857834336090.1917624010876404532.1651049437586\", \"replacesEntryUuid\":null}" }, { "key":"DoucmentEntryInformation", "type":"RPI", "value":"{\"entryUUid\":\"urn:uuid:2f9ec238-55a6-48ad-baae-ca3f02783892\", \"uniqueId\":\"7463408028766553712.8751492382280798024.1651049437729\", \"replacesEntryUuid\":null}" }, { "key":"Status", "type":"NPI", "value":"WARNING" }, { "key":"Errors", "type":"RPI", "value":"{\"errorCode\":\"XDSRegistryMetadataError\", \"errorMessage\":null, \"codeContext\":\"XDSRegistryMetadataError Slot contains incorrect amount of values. Slot = hash, allowed = [ 1- 1], Was = 0\", \"location\":\"Entryuuid: urn:uuid:2f9ec238-55a6-48ad-baae-ca3f02783892\", \"severity\":\"urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Error\"}" } ] } ] } ] }, "access":{ "code":200, "duration":164, "httpHeaders":{ "Content-Type":"application/soap+xml; charset=UTF-8" }, "httpHost":"localhost", "method":"POST", "path":"/nxrg/iti18", "query":"", "port":8060, "protocol":"http", "reqSize":2123, "resSize":11645, "soapHeaders":{ "w3Action":"urn:ihe:iti:2007:RegistryStoredQuery", "w3MessageID":"urn:uuid:b8abf188-a545-4388-ab2d-01593c51e7ff", "w3To":"http://localhost:8060/nxrg/iti18" }, "threadId":"default task-1", "time":"2022-04-27T10:50:37.985+02:00", "stats":{ "handlerDuration":5, "RequestContentDuration":0, "ResponseContentDuration":0, "SecurityProtocolRequestDuration":0, "SecurityProtocolResponseDuration":0, "bufferAllocated":false, "usedBuffers":1, "activeBuffersInPool":1, "idleBuffersInPool":1 } } } |
Følgende er et eksempel på et ITI-42 kald med, fejl. Konkret mangler CPR numret i kaldet.
{ "time": "2021-12-01T05:50:00.92Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-42", "audit": { "timestamp": "2021-12-01T06:50:00.894+01:00", "components": [ { "component": "NXRG/ITI-42", "contexts": [ { "context": "5912107379890312866.8220644980724288715.1638337800700", "information": [ { "key": "CitizenId", "type": "SPI", "value": "" }, { "key": "SubmissionSetInformation", "type": "RPI", "value": "{\"uniqueId\":\"5912107379890312866.8220644980724288715.1638337800700\"}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:5ea9015e-75f7-4cc5-85ff-079b56f36499\", \"uniqueId\":\"6660232118599018558.1142303413219772882.1638337800625\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "ERROR" }, { "key": "Errors", "type": "RPI", "value": "{\"errorCode\":\"XDSRegistryMetadataError\", \"errorMessage\":null, \"codeContext\":\"External identifier value is missing: urn:uuid:6b5aea1a-874d-4603-a4bc-96a0a7b3844 (patientId)\", \"location\":null, \"severity\":\"urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Error\"}" } ] } ] } ] }, "access": { "code": 200, "duration": 17, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti42", "query": "", "port": 8060, "protocol": "http", "reqSize": 8518, "resSize": 1221, "soapHeaders": { "w3Action": "urn:ihe:iti:2007:RegisterDocumentSet-b", "w3MessageID": "urn:uuid:215c930a-73c0-4a6f-84fe-0c24e3725ba7", "w3To": "http://localhost:8060/nxrg/iti42" }, "threadId": "default task-1", "time": "2021-12-01T06:50:00.894+01:00", "stats": { "handlerDuration": 4, "RequestContentDuration": 0, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 2, "activeBuffersInPool": 2, "idleBuffersInPool": 0 } } } |
NXRG kan advisere via NAS, når der sendes et ny dokument eller et dokumentregistreres via ITI-41, ITI-61 og ITI-57 snitfladerne (ikke opdatering af availability status med ITI-57).
Konfiguration af selve NAS integrationen kan ses ovenfor i beskrivelse af property filen.
Derudover skal der sættes notifikations kriterier op, som matches mod det enkelte dokument, og afgør om der skal sendes, en notifikation, hvilken topic der skal anvendes, og hvilken notifikationstype der skal bruges.
Pt kan kun notifikationstype "simple" anvendes. (En tilføjelse af flere typer, kræver ændringer i NXRG komponenten selv.)
Man kan indsætte notifikationskriterier ved at udføre følgende sql mod databasen:
|
Eksemplet her, vil for dokumenter med formatcodename = urn:ad:dk:medcom:apd-v2.0.1:full oprette en notifikation med det angivne topic og type. Værdien * indikerer at alle værdier matcher.
Baggrundsjobbet har til formål at sende alle ikke-afsendte NAS-adviseringer, der er oprettet på baggrund af dokument registrering eller opdatering. Adviseringer lagres i tabellen "unsent_notifications".
Baggrundsjobbet startes med et HTTP GET kald til
Jobbets seneste status kan aflæses på komponentens statusside med et HTTP kald til:
Jobbet konfigureres med parametrene beskrevet i afsnittet ovenfor.
Detaljer om de enkelte kørsler (antal rækker behandlet mm.) skrives direkte til komponentens log-fil. Jobbet sender altså notifikationer først.
Er der konfigureret notifikationstyper ukendte for NXRG forbliver de i unsent_notifications tabellen og vil fremgå af log filen efter kørsel.
Den oprindelige data migrering fra openText registry er ikke længere aktuel, og indholdet der indeholder migreringstool - og relaterede tools til verification etc - er flyttet til "Yderligere dokumentation - Migration"
NXRG har en selvstændig service, der kan migrere eksisterende metadata til søgbare felter. Denne service har sin egen driftvejledning som findes her: "NXRG - driftvejledning til felt migrering".