Versions Compared

Key

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

Table of Contents


Komponenter

Dette dokument dækker følgende komponenter på NSP:

  • Dokumentregistrerings- og oprettelsesservice

  • Type: Webservice

  • Filnavn: dros.war

  • Url: <serverurl>/dros

  • Servicecheckurl: <serverurl>/drs/status

  • Versionurl: <serverurl>/dros/health returnerer en json struktur med denne


Konfiguration

Servicekonfiguration

Grundlæggende konfiguration foregår ved redigering i filen dros.properties,  der placeres i følgende WildFly modul:

...

Property

Beskrivelse

dros.url.prefix

URL prefix der indsættes i wsdl'er og bruges af dks-servlet.

dros.app.nameAnvendes af dks-servlet

iti41.service.endpoint

Endpoint på ITI41-backend.
iti41.service.security.require.person

Angiver, om der skal anvendes personlige sikkerhedsbillet i.e UserIdCard eller det er nok med SystemIdCard (true/false)

Default: false

iti41.service.xds.validationlevel

Angiver hvordan requestet valideres inden der kaldes videre til det bagvedliggende registry. Skal have en af værdierne OFF, WARNING, LOG og REJECT. Se dokumentet 'Design og Arkitektur' for en beskrivelse af disse værdier.

iti42.service.endpointEndpoint på ITI42-backend.
iti42.service.security.require.person

Angiver, om der skal anvendes personlige sikkerhedsbillet i.e UserIdCard eller det er nok med SystemIdCard (true/false)

Default: false

iti42.service.xds.validationlevelAngiver hvordan requestet valideres inden der kaldes videre til det bagvedliggende registry. Skal have en af værdierne OFF, WARNING, LOG og REJECT. Se dokumentet 'Design og Arkitektur' for en beskrivelse af disse værdier.

iti57.service.endpoint

Endpoint på ITI57-backend.
iti57.service.security.require.person

Angiver, om der skal anvendes personlige sikkerhedsbillet i.e UserIdCard eller det er nok med SystemIdCard (true/false)

Default: false

iti57.service.xds.validationlevelAngiver hvordan requestet valideres inden der kaldes videre til det bagvedliggende registry. Skal have en af værdierne OFF, WARNING, LOG og REJECT. Se dokumentet 'Design og Arkitektur' for en beskrivelse af disse værdier.
iti61.service.endpointEndpoint på ITI61-backend.
iti61.service.security.require.person

Angiver, om der skal anvendes personlige sikkerhedsbillet i.e UserIdCard eller det er nok med SystemIdCard (true/false)

Default: false

iti61.service.xds.validationlevelAngiver hvordan requestet valideres inden der kaldes videre til det bagvedliggende registry. Skal have en af værdierne OFF, WARNING, LOG og REJECT. Se dokumentet 'Design og Arkitektur' for en beskrivelse af disse værdier.

dros.backend.failure.threshold

Tærskel for, hvor mange gang i træk et kald til en backend må fejle, før denne backend betragtes som 'død' af status-siden.

dros.backend.failure.interval.minutesAngiver antal minutter hvorefter fejlkald 'forældes'. Dermed er det kun fejlkald, der er nyere end dette, der medregnes, når det vurderes om backenden fejler. 
cprexists.validationlevel

Valideringsniveau for CPR validering

Eksempel: WARNING, REJECT, OFF

cprexists.url

URL for CPR exist service

Eksempel: http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-cprexists

cprexists.maxTotalConnections

Konfiguration af client pool til kald af CPRExists service

Default: 200

cprexists.defaultMaxConnectionsPerRoute

Konfiguration af client pool til kald af CPRExists service

Default: 20

handled.type.codes

Angiver en liste af, hvilke type codes DROS 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

Default: tom liste

log4j konfiguration

Log4j konfiguration findes i samme wildfly modul som servicekonfigurationen

...

DROS udstiller en overvågningsside, som findes i listen af komponenter i afsnit 2.

...

Fortolkning af HTML overvågningsside

DROS-overvågningssiden returnerer enten:

  • HTTP 200, hvis servicen i øjeblikket kører fint.
  • HTTP 203, hvis der er opstået en fejl der kræver indgriben.

...

  • HTTP 500, hvis der er opstået en fejl der kræver indgriben.

Overvågningstyper

Det overvåges for hver backend, om kaldene til backenden går galt. Det kan konfigureres, hvor mange kald i træk der må gå galt, før en backend betragtes som 'død'.

...

ITI41 backend : "0/50 fejl"
ITI42 backend : "0/50 fejl"
ITI57 backend : "0/50 fejl"
ITI61 backend : "0/50 fejl"
CprExistsServiceClient : "0/50 fejl"
Whitelisting Database : "ok"

Det fremgår for hver backend, om kaldene til den går godt eller ej.

...

ITI41 backend : "0/50 fejl"
ITI42 backend : "0/50 fejl"
ITI57 backend : "0/50 fejl"
ITI61 backend : "0/50 fejl"
CprExistsServiceClient : "55/50 fejl"
Whitelisting Database : "ok"

Hvis kaldene til cprexists backend ikke kan udføres, så returneres statuskode 203 (indenfor failure threshold, som kan sættes op som en konfigurationsparameter).

...

ITI41 backend : "0/50 fejl"
ITI42 backend : "0/50 fejl"
ITI57 backend : "55/50 fejl"
ITI61 backend : "0/50 fejl"
CprExistsServiceClient : "0/50 fejl"
Whitelisting Database : "ok"

Hvis kaldene til een af ITI backends ikke kan udføres, så returneres statuskode 500 (indenfor failure threshold, som kan sættes op som en konfigurationsparameter).

Det samme gælder, hvis der ikke kan oprettes forbindelse til databasen (ingen failure threshold).

Auditlogning

Hvert servicekald medfører en ny indgang i auditloggen, som er udfyldt som følger:

...

Hvis CPR validering kører i WARNING mode, så vil ugyldige (ifølge CPRExits service) CPR numre give anledning til en linje i auditloggen. Logninger af denne type ser således ud:

...

Valideringsfejlene logges under contexten '5313439413729618055.1497722748872510081.1633347017540', som er entryuuid på requestets SubmissionSet. Dette er valgt, fordi valideringslibrary'et pt. ikke giver mulighed for relatere de individuelle dokumenter til deres valideringsfejl.

...

Logning når fejl

Hvis servicesvaret indeholder fejl, logges de på følgende måde. Hvis et RequestId mangler, genereres et nyt RequestId.

Følgende er et eksempel på et ITI-42 kald med, fejl. 

Code Block
titleAuditlog for Registry Error
collapsetrue
{
  "time": "2022-12-13T07:28:59.135Z",
  "category": "dk.sds.nsp.audit.log.dros/provideandregisterdocumentsetb",
  "audit": {
    "timestamp": "2022-12-13T08:28:58.815+01:00",
    "components": [
      {
        "component": "DROS/ProvideAndRegisterDocumentSetB",
        "contexts": [
          {
            "context": "8808456705936797445.7367161746361332136.1670916538706",
            "information": [
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Source patient id i det leverede CDA dokument matcher ikke souce patient id i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Patient id i det leverede CDA dokument matcher ikke patient id i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Service stop time i det leverede CDA dokument matcher ikke service stop time i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Author institution i det leverede CDA dokument matcher ikke author institution i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Cda dokumentet har ikke lovlig type,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Creationtime i det leverede CDA dokument matcher ikke creationtime i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Title i det leverede CDA dokument matcher ikke title i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Confidentiality code i det leverede CDA dokument matcher ikke code i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Coded value i det leverede CDA dokument matcher ikke type code i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Source patient birth i det leverede CDA dokument matcher ikke source patient birth i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Service start time i det leverede CDA dokument matcher ikke service start time i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Author person i det leverede CDA dokument matcher ikke author institution i document entry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "Warning",
                "type": "RPI",
                "value": "ErrorInfo[errorCode=REGISTRY_METADATA_ERROR,codeContext=Author.Person skal være angivet i documententry,severity=WARNING,location=,customErrorCode=]"
              },
              {
                "key": "StatusCode",
                "type": "RPI",
                "value": "urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Success"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Source patient id i det leverede CDA dokument matcher ikke souce patient id i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Patient id i det leverede CDA dokument matcher ikke patient id i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Service stop time i det leverede CDA dokument matcher ikke service stop time i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Author institution i det leverede CDA dokument matcher ikke author institution i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Cda dokumentet har ikke lovlig type,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Creationtime i det leverede CDA dokument matcher ikke creationtime i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Title i det leverede CDA dokument matcher ikke title i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Confidentiality code i det leverede CDA dokument matcher ikke code i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Coded value i det leverede CDA dokument matcher ikke type code i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Source patient birth i det leverede CDA dokument matcher ikke source patient birth i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Service start time i det leverede CDA dokument matcher ikke service start time i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Author person i det leverede CDA dokument matcher ikke author institution i document entry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              },
              {
                "key": "ResponseError",
                "type": "RPI",
                "value": "RegistryError[value=<null>,codeContext=Author.Person skal være angivet i documententry,errorCode=XDSRegistryMetadataError,severity=urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Warning,location=]"
              }
            ]
          },
          {
            "context": "urn:uuid:dfae887b-d846-4f2d-88b0-fd11a603e03e",
            "information": [
              {
                "key": "DocumentId",
                "type": "RPI",
                "value": "5345652789622024422.1649135652318592037.1670916538701"
              },
              {
                "key": "DocumentType",
                "type": "RPI",
                "value": "39289-4"
              },
              {
                "key": "CitizenId",
                "type": "RPI",
                "value": "ABCDE"
              },
              {
                "key": "FormatCode",
                "type": "RPI",
                "value": "urn:ad:dk:medcom:appointmentsummary:full"
              },
              {
                "key": "SubmissionSetId",
                "type": "RPI",
                "value": "8808456705936797445.7367161746361332136.1670916538706"
              },
              {
                "key": "AuthorInstitutionAssigningAuthority",
                "type": "RPI",
                "value": "1.2.208.176.1.1"
              },
              {
                "key": "AuthorInstitutionId",
                "type": "RPI",
                "value": "12345679999"
              }
            ]
          }
        ]
      }
    ]
  },
  "access": {
    "code": 200,
    "duration": 289,
    "httpHeaders": {
      "Content-Type": "multipart/related; type=\"application/xop+xml\"; boundary=\"uuid:c16b15ce-c994-4ac7-8ed0-d949fa6099d5\"; start=\"<root.message@cxf.apache.org>\"; start-info=\"application/soap+xml\""
    },
    "httpHost": "localhost",
    "idCardAttributes": {
      "medcom:CareProviderID": "46837428",
      "medcom:CareProviderName": "Statens Serum Institut",
      "medcom:ITSystemName": "Test",
      "sosi:AuthenticationLevel": "3",
      "sosi:IDCardID": "91WKulz0p7X1tHDPo1MqAA==",
      "sosi:IDCardType": "system",
      "sosi:IDCardVersion": "1.0.1"
    },
    "method": "POST",
    "path": "/dros/iti41",
    "query": "",
    "port": 8060,
    "protocol": "http",
    "reqSize": 25133,
    "resSize": 4268,
    "soapHeaders": {
      "Issuer": "TEST2-NSP-STS",
      "MessageID": "AAABhQpjAVUdbZI6x+gtGFNPU0k=",
      "NameID": "SubjectDN={SERIALNUMBER=CVR:46837428-UID:27910135 + CN=Statens Serum Institut - Test VOCES, O=Statens Serum Institut // CVR:46837428, C=DK},IssuerDN={CN=TRUST2408 Systemtest XXXIV CA, O=TRUST2408, C=DK},CertSerial={1604144225}",
      "w3Action": "urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b",
      "w3MessageID": "urn:uuid:d8bf3c51-b16a-42af-b4ef-023dbc52051f",
      "w3To": "http://localhost:8060/dros/iti41"
    },
    "threadId": "default task-9",
    "time": "2022-12-13T08:28:58.815+01:00",
    "stats": {
      "handlerDuration": 28,
      "RequestContentDuration": 2,
      "ResponseContentDuration": 0,
      "SecurityProtocolRequestDuration": 22,
      "SecurityProtocolResponseDuration": 0,
      "bufferAllocated": false,
      "usedBuffers": 4,
      "activeBuffersInPool": 4,
      "idleBuffersInPool": 4
    }
  }
}

Whitelisting af anvendere

De enkelte anvendere skal whitelistes til at bruge DROS. Der findes en tabel whitelist til dette formål.

...

 

Det er

...

heri muligt at angive enten et CVR nummer eller oces3 UUID. Sidstnævnte whitelister et specifikt certifikat.

Organisationens CVR nummer

...

whitelistes ved følgende SQL:

...

INSERT INTO whitelist (whitelistkey, whitelisttype, note) VALUES ('46837428', 'cvr', 'Oprettet fra supportsag ASCP00155779');

Certifikatets UUID id whitelistes ved følgende SQL:

INSERT INTO whitelist (

cvr

whitelistkey, whitelisttype, note) VALUES ('

CVR

UI:

46837428

DK-

UID:27910135

O:G:8d3fa047-c77e-47e4-bdd2-e91488610ce6', 'cert',

 

'Oprettet fra supportsag ASCP00155779');

...

Note feltet kan f.eks. anvendes til at referere en supportsag eller lignende for sporingshensyn. Det er

...

ikke obligatorisk som de øvrige felter.