Erlaubt die Aussteuerung von Nachrichten anhand Regeln, die in einer Extension definiert sind

Edi Condition Distributor All Presentations

Übersicht

Die Channel Distribution EdiConditionDistributorAllPresentations erlaubt die Aussteuerung der Nachrichten anhand Regeln, die in einer Extension definiert sind.

Technische Beschreibung

Klassenpfad: org.b2bbp.channels.extension.EdiConditionDistributorAllPresentations

Einrichtung

Die Channel Distribution wird wie üblich in der Extension EXT_CHANNEL_DIST definiert.

Name: org.b2bbp.channels.extension.EdiConditionDistributorAllPresentations

Die Regeln werden in der Extension GENERIC_EDICONDITION_DISTRIBUTION definiert.

Beispiel:

# Positive Contrl. Format = CONTRL AND UCI positiv -> IN_B2B
"IN_B2B" <== $messagecontext.FORMAT.type == "CONTRL" and $edipath("UCI+4+0") == "7"; /* 7 steht für positive CONTRL */
# Monopolsparten. Empfänger ist 9900000000100
"IN_ISU_MONOPOL" <== $edipath("UNB+3+0") == "9900000000100";
# ALOCAT und UTILMD Nach ISU
"IN_ISU" <== $messagecontext.FORMAT.type == "ALOCAT";
"IN_ISU" <== $messagecontext.FORMAT.type == "UTILMD";

Erklärung der Syntax

Regeln

Eine Regel beschreibt, bei welcher Bedingung die Nachricht in einen Channel ausgesteuert werden soll. Die Regeln werden von oben nach unten ausgewertet. Trifft eine Regel zu, wird die Nachricht in den Channel ausgesteuert. Weitere Regeln werden nicht mehr ausgewertet.

Eine Regel hat folgendes Format:

"[Channel]" <== [Bedingung];

Am Ende der Regel steht Semikolon. Weitere Regeln müssen in neuen Zeilen eingetragen werden.

Channel

Als Key wird in der Regel ein Channel angegeben, in den die Nachricht geroutet werden soll: "IN_B2B" Um den aktuellen Channel beizubehalten und die Channel Distribution somit zu überspringen, ist es möglich als Key "$currentchannel" anzugeben.

Bedingungen, Operatoren, Kommentare

Eine Bedingung muss zu true (Wahr) oder false (Falsch) ausgewertet werden. Mehrere Bedingungen können mit Operatoren or (Oder), and (Und) verknüpft werden. Wenn mehrere Operatoren verwendet werden, sollte man die Bedingungen mit Klammern gruppieren, um die Reihenfolge der Auswertung klar zu definieren:

"IN_ISU_INVOIC_INHOUSE" <== $messagecontext.FORMAT.type == "INVOIC" and ( $messagecontext.FORMAT.senderCode == "9900000000000" or $messagecontext.FORMAT.senderCode == "9800000000000" );

Eine Bedingung kann mit dem Operator not (Nicht) negiert werden:

"IN_ERROR" <== not $messagecontext.FORMAT.type == "INVOIC";
"IN_ERROR" <== not ($messagecontext.FORMAT.senderCode == "9900000000000" or $messagecontext.FORMAT.senderCode == "9800000000000");

Die mit Operatoren verknüpften Bedingungen einer Regel werden nur bei Bedarf ausgewertet. Wenn zum Beispiel mehrere Bedingungen mit or verknüpft sind und schon die erste Bedingung true ergibt, wird die zweite Bedingung nicht mehr ausgewertet.

Kommentare können durch # am Anfang der Zeile erzeugt werden. Außerdem kann man Kommentare innerhalb der Regeln setzen, mit /* Kommentar */

Funktionen

Mit Funktionen können spezielle Bedingungen realisiert werden. Die Funktionen fangen mit einem Dollarzeichen an ($messagecontext, $edipath u.s.w.). Viele Funktionen geben eine Zeichenkette (String) zurück, die man mit einer anderen Zeichenkette vergleichen kann. Solche festen Zeichenketten müssen in Anführungszeichen genommen werden: “9900000000000”. Ein Anführungszeichen kann mit einem Backslash escaped werden: Strom-\"König\"

Zeichenketten-Operatoren

Um die Zeichenketten zu vergleichen, können folgende Operatoren benutzt werden:

OperatorBeschreibungBeispiele
== Prüft, ob die Zeichenketten exakt gleich sind.
$messagecontext.FORMAT.senderCode == "9900000000000"
Eine Zeichenkette (oder eine Zeichenketten-Funktion) kann mit null verglichen werden:
$messagecontext.HEADER == null
Die Variable `HEADER` existiert dabei im MessageContext, hat aber als Wert `null`.
like Erlaubt es, Wildcards * und ? zu nutzen: * steht für kein oder mehrere Zeichen ? steht für genau ein Zeichen
$currentchannel like "INBOUND*"
trifft auf alle Channels, die mit „INBOUND“ anfangen
$messagecontext.FORMAT.partnerCode like "9?00000000000"
trifft unter anderem auf "9900000000000" und "9800000000000" zu.
likeregexp Der Operator likeregexp erlaubt es, Reguläre Ausdrücke für den Vergleich zu nutzen
$edipath("UNB+5+0") likeregexp "REF[A-Z]+12[0-9]*"

Funktionstypen

FunktionBeschreibung
messagecontext Mit dieser Funktion kann man Variablen aus dem MessageContext laden. Die Variable muss existieren, sonst wird die ChannelDistribution mit einem Fehler abbrechen. Beispiel:
$messagecontext.B3P_BASE_SERVICE_ID == "MAIL_IN"
Auf diese Weise können auch komplexe Objekte aus dem MessageContext traversiert werden, z.B. das FORMAT-Objekt. Somit kann man auf die Format-Informationen der Nachricht zugreifen:
$messagecontext.FORMAT.type
Edifact-Format, wie "UTILMD"
$messagecontext.FORMAT.version
Edifact-Formatversion, wie "5.1f"
$messagecontext.FORMAT.senderCode
ILN des Absenders/Empfängers (je nach Richtung)
$messagecontext.FORMAT.partnerCode
ILN des Absenders/Empfängers (je nach Richtung)
$messagecontext.FORMAT.referenceId
UNB-Referenznummer
$messagecontext.FORMAT.presentation
Dokumentformat, wie „edi“ oder „xml“
$messagecontext.FORMAT.attributes.Category
oder Ähnliches, falls Category als zusätzliches Attribut in DIALECT definiert ist. Variablen mit Sonderzeichen können mit Anführungszeichen angegeben werden:
$messagecontext."START DATUM"
existsinmessagecontext Mit dieser Funktion kann man prüfen, ob eine Variable im MessageContext existiert. Die Funktion gibt true oder false zurück, sie ist somit eine volle Bedingung. Beispiel:
"NO_FORMAT" <== not $existsinmessagecontext("FORMAT");
Somit kann man ohne Fehler prüfen, ob eine optionale Variable einen bestimmten Wert hat:
"FROM_DIRK" <== $existsinmessagecontext("B3P_MAIL_FROM") and $messagecontext.B3P_MAIL_FROM == "dirk.kirk@enterprise.de";
edipath Mit $edipath können EdiPath-Ausdrücke mit der aktuellen Edifact ausgewertet werden. Falls mehr als ein Wert gefunden wurde, wird der erste zurückgegeben. Falls nichts gefunden wurde, wird null zurückgegeben. Beispiel:
$edipath("RFF[1+0=\"Z13\"]+1+1") == "13008"
(Prüfidentifikator ist 13008)
$edipath("RFF[1+0=\"Z01\"]+1+1") == null
(Die Edifact hat kein RFF+Z01)
edipathlist Mit $edipathlist und dem Operator isIn kann man nach einem Wert in allen EdiPath-Ergebnissen suchen:
"Z04" isIn $edipathlist("LOC+1+0")
(es gibt ein LOC+Z04). Mit dem Operator
==
kann man alle Ergebnisse mit einem Wert vergleichen:
"Z04" == $edipathlist("LOC+1+0")
(alle LOCs besitzen den Qualifier „Z04“). Dies impliziert, dass alle Nachrichten die kein LOC+1+0 Segment besitzen, automatisch die Bedingung erfüllen.
currentchannel Die Funktion $currentchannel hat als Wert das Resultat der vorherigen ChannelDistribution.
"IN_INVOIC_9900000000000" <== $currentchannel == "IN_INVOIC" and $messagecontext.FORMAT.senderCode == "9900000000000";

Hinweis zur Nachrichtentrennung

Wenn für ausgehende und eingehende Nachrichten getrennte Konfiguration benutzt werden soll, kann zusätzlich die Klasse EdiConditionDistributorAllPresentationsOutbound verwendet werden. Sie nutzt die Extension GENERIC_EDICONDITION_DISTRIBUTION_OUT. Die ChannelDistribution EdiConditionDistributor berücksichtigt nur die Edifacts, arbeitet aber sonst genau so wie die beschriebene EdiConditionDistributorAllPresentations.

View Me   Edit Me