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:
Operator | Beschreibung | Beispiele |
== | 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 == nullDie 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
Funktion | Beschreibung |
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.typeEdifact-Format, wie "UTILMD" $messagecontext.FORMAT.versionEdifact-Formatversion, wie "5.1f" $messagecontext.FORMAT.senderCodeILN des Absenders/Empfängers (je nach Richtung) $messagecontext.FORMAT.partnerCodeILN des Absenders/Empfängers (je nach Richtung) $messagecontext.FORMAT.referenceIdUNB-Referenznummer $messagecontext.FORMAT.presentationDokumentformat, wie „edi“ oder „xml“ $messagecontext.FORMAT.attributes.Categoryoder Ä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
.