Open DarthGizka opened 2 years ago
Das primäre Validierungsergebnis des HAPI-Validators ist ValidationResult
. Effektiv handelt es sich dabei aber nur um eine eingewickelte List<SingleValidationMessage>
, die über .getMessages()
auch extern zugänglich ist.
Die Nachbearbeitung des Validierungsergebnisses teilt sich in Zusatzprüfungen und Black-/Whitelisting.
Ein hypothetisches Modul für Zusatzprüfungen würde die Ressource in einer verarbeitbaren Darreichungsform ausgehändigt bekommen; das Ergebnis wäre eine Liste von Zusatzmeldungen (ggf. leer), von denen jede mit der Id der generierenden Prüfregel gekennzeichnet ist (e.g. Enum).
Ein hypothetisches Modul für Black-/Whitelisting würde die kombinierte Liste aus Validatorergebnis und Zusatzprüfungen vorgelegt bekommen; das Ergebnis der Tätigkeit wäre so etwas wie List<ErweiterteMeldung>
:
public class ErweiterteMeldung
{
public final SingleValidationMessage meldung;
private ResultSeverityEnum originalSeverity;
private Umstufungsregel umstufungsgrund; // Enum
private Pruefregel pruefregel; // Enum
public ErweiterteMeldung (SingleValidationMessage meldung)
{
this.meldung = Objects.requireNonNull(meldung);
}
public void umstufe_auf (ResultSeverityEnum neuer_schweregrad, Umfstufungsregel umstufungsgrund)
{
Objects.requireNonNull(neuer_schweregrad);
Objects.requireNonNull(umstufungsgrund);
if (originalSeverity == null)
originalSeverity = meldung.getSeverity();
this.umstufungsgrund = umstufungsgrund;
meldung.setSeverity(neuer_schweregrad);
}
// ...
}
Der Einfachheit halber könnte auch das Modul für die Zusatzprüfungen seine Meldungen ebenfalls in diesem Format ausgeben (weniger Reibung/Bürokratie).
Die Verarbeitungspipeline wäre dann
List<SingleValidationMessage>
List<ErweiterteMeldung>
List<ErweiterteMeldung>
Das Ergebnis der Pipeline kann dann entweder direkt angezeigt werden (ggf. mit Unterdrückung von Meldungen geringen Schweregrads) oder in ein OperationOutcome umgewandelt und als XML oder JSON ausgegeben.
Das Umsetzen von zusätzlichen, über die reine FHIR-Validierung hinausgehenden Prüfungen ist mittlerweile genauso unumgänglich geworden wie das Black- und Whitelisting. Ein hoher Akzeptanzgrad des Validators bei allen Beteiligten läßt sich in dieser Situation nur dann erreichen, wenn alle über die FHIR-Validierung hinausgehenden Zusatzfunktionen klar, übersichtlich und strukturiert dokumentiert und umgesetzt werden.
Zur Verknüpfung der Dokumentation einer Zusatzprüfung oder einer Black-/Whitelisting-Regel mit der entsprechenden Implementierung muß jede Regel einen eindeutigen symbolischen Namen erhalten (e.g.
UNBEKANNTE_ERWEITERUNG
), der auch als Bezeichner im Quelltext verwendbar ist. Damit könnte dann auch z.B. in Java - und nur dort! ;-) -einEnum
als zentrale Schaltstelle der Implementierung fungieren.Die Tätigkeit aller Zusatzregeln muß auch im Ergebnis eines Validierungsvorgangs eindeutig erkennbar sein. Derzeit bedeutet z.B. 'Whitelisting', daß irgendwelche Codestückchen einfach Meldungen komplett in die Tonne treten. Die Tätigkeit von Zusatzprüfungen und Blacklisting ist auch nicht wirklich nachvollziehbar.
Daher stelle ich hier das bei uns verwendete System als Vorschlag in den Raum. Es besteht aus drei einfachen Erweiterungen, die an ein
OperationOutcome
oder an einzelne der darin enthaltenen Meldungen angeheftet werden können.Ergo eine standardkonforme Erweiterung eines Standardformats, das insbesondere für externe Zwecke (Programmausgabe oder Antwort eines HTTP-APIs) geeignet ist. Programmintern wäre auch die Verwendung von POJO-Strukturen möglich, bis alle Zusatzregeln sich das Validierungsergebnis vorgeknöpft haben (und ggf. Meldungen modifiziert oder eigene Meldungen dazugepackt). Notwendig ist das aber nicht, sofern die R4-Modellform von OperationOutcome intern verwendet wird.
Nachfolgend kommt unsere interne Dokumentation zu den Erweiterungen, und im Anhang gibt es das entspechende Profilpaket(chen).
Erweiterungen der Struktur OperationOutcome für den Referenzvalidator
Um das Prüfergebnis maschinell verarbeitbar zur Verfügung stellen zu können, ist es notwendig, einige Erweiterungen für Struktur OperationOutcome zu definieren.
Diese Erweiterungen gliedern sich wie folgt:
RV_EX_OperationOutcome_Gesamtbewertung
Das Gesamtergebnis der Validierung wird direkt in der Struktur OperationOutcome als Erweiterungsfeld kodiert. Es gibt nur zwei mögliche Werte: 'akzeptiert' und 'fehlerhaft'.
Diese Erweiterung wird nur dann kodiert, wenn der Validator tatsächlich zu einem Ergebnis gekommen ist. Steigt der Validator vorher aus - z.B. aufgrund einer Exception - dann fehlt die Erweiterung. Stattdessen enthält das Feld
diagnostics
die Meldung der Exception undlocation
enthält den vollständigen Klassennamen;severity
istfatal
undcode
istprocessing
.RV_EX_OperationOutcome_Pruefregel
Das Validierungsergebnis kann außer Meldungen aus dem eigentlichen FHIR-Validierungsvorgang auch Meldungen enthalten, die aus zusätzlichen Prüfungen resultieren. Diese Meldungen werden mit dem symbolischen Namen der jeweiligen Zusatzprüfung gekennzeichnet, um eine direkte Zuordnung zur jeweiligen Prüfdefinition zu ermöglichen und um diese zusätzlichen Meldungen von denen des eigentlichen HAPI-Validators unterscheiden zu können.
RV_EX_OperationOutcome_Umstufung
Diese Erweiterung gibt den symbolischen Namen einer Regel zum Black- oder Whitelisting an, die den Schweregrad der betreffenden Meldung herauf- oder heruntergestuft hat.
Anmerkung: die als Beispiel angegebenen Umstufung entspricht dem Verhalten des Standard-HAPI-Validators bei Angabe des Schalters
-strictExtensions
.de.rz009.rv.zusatz-1.0.0.tar.gz