DAV-ABDA / eRezept-Referenzvalidator

eRezept-Referenzvalidator auf Basis des HAPI-FHIR-Validators
Apache License 2.0
20 stars 8 forks source link

Votum gegen Map<ResultSeverityEnum, List<SingleValidationMessage>> #26

Closed DarthGizka closed 1 year ago

DarthGizka commented 2 years ago

Momentan geben die öffentlich aufrufbaren Funktionen des Referenzvalidators als Ergebnis (Map<ResultSeverityEnum, List<SingleValidationMessage>>) zurück.

Dieser Datentyp ist als Austauschformat denkbar ungeeignet. Wenn man z.B. die einzelnen Meldungen verarbeiten möchte, dann muß man erst mit flatMap() die Gruppierung rückgängig machen. Das ist aber gar nicht korrekt möglich - die ursprüngliche Reihenfolge der Meldungen ist unwiderruflich zerstört, und damit geht uns ein wichtiges Diagnosehilfsmittel verloren.

Eine einfache flache Liste (List<SingleValidationMessage>) wäre da wesentlich besser. Diese wäre auch auf einfachste Weise in in OperationOutcome umwandelbar, was die Standard-Ergebnisform für alle FHIR-Validatoren (außer unserem) ist.

public IBaseOperationOutcome OperationOutcome_fuer_Validatorergebnis (List<SingleValidationMessage> meldungen)
{
    ValidationResult validationResult = new ValidationResult(fhirContext, meldungen);

    return validationResult.toOperationOutcome(); 
}

public String Text_fuer_OperationOutcome (IBaseOperationOutcome operationOutcome, boolean json, boolean pretty)
{
    IParser parser = json
        ? fhirContext.newJsonParser()
        : fhirContext.newXmlParser();

    parser.setPrettyPrint(pretty);

    return parser.encodeResourceToString(operationOutcome);
}

Als OperationOutcome wäre die Ausgabe des Validators - auch die der Kommandozeilenversion - leicht maschinell verarbeitbar. Bei der jetzigen Freitextausgabe geht das nicht so leicht.

Um mit dem OperationOutcome weiterzuarbeiten, muß es erst von seiner 'opaquen', versionsunabhängigen Form in die R4-Modellform überführt werden. Dann kann man zum Beispiel das Gesamturteil des Validators in einer dafür geschaffenen Extension ablegen:

    /** post-process the validation result (destructively, i.e. modifying the passed outcome structure) */
    public static void nachbearbeite_Validierungsergebnis (IBaseOperationOutcome operationOutcome)
    {
        OperationOutcome oo_r4 = (OperationOutcome) operationOutcome;
        String bewertung = enthaelt_Fehler(oo_r4) ? ERGEBNIS_FEHLERHAFT : ERGEBNIS_AKZEPTIERT;

        oo_r4.addExtension(RV_EX_Gesamtbewertung, new StringType(bewertung));
     }

    public static boolean enthaelt_Fehler (OperationOutcome operationOutcome)
    {
        for (OperationOutcome.OperationOutcomeIssueComponent issue : operationOutcome.getIssue())
        {
            switch (issue.getSeverity())
            {
                case ERROR:
                case FATAL: return true;
            }
        }

        return false;
    }
ABDA-FHIR commented 1 year ago

Im Release 1.0.1 wurden die Funktionaufrufe erweitert (OperationOutCome (ValidationMessageList, Boolean))

Map<ResultSeverityEnum, List> errors = validator.validateFile(...) Map<ResultSeverityEnum, List> errors = validator.validateString(...) add: List errors = validator.validateFile2ValidationMessageList(...); List errors = validator.validateString2ValidationMessageList(...); boolean errors = validator.validateFile2Boolean(...); boolean errors = validator.validateString2Boolean(...);