Rechnen mit dem Delivery Server - Was geht "out of the box"? Was ist individuell zu implementieren?
"Der Delivery Server kann ja nicht mal rechnen!", "Wenn ich jetzt Division oder Modulo einsetzen könnte, dann ...", sind Sätze, die ich immer mal wieder zu hören bekomme. An vielen Stellen ist es möglich, allein mit den zur Verfügung stehenden Boardmitteln, das Problem zu lösen ohne auf individuelle Entwicklungen (z.B eigene Inline-Funktionen) zurückzugreifen, an anderen Stellen ebend nicht.
Für das Addieren oder Subtrahieren von Ganzzahlen stehen im Delivery Server drei verschiedene Methoden (increase, decrease, sumParam) zur Verfügung, um Attributwerte zu verändern.
Das nachfolgende Codebeispiel zeigt für jede Methode die Berechnungen für "Plus" bzw. "Minus".
<dynament> <ootb> <baseVar> <rde-dm:attribute attribute="request:baseVar" mode="write" op="set" value="20" tag="notag"/> <rde-dm:attribute attribute="request:baseVar" mode="read" tag="notag"/> </baseVar> <increase_plus> <rde-dm:attribute attribute="request:baseVar" mode="write" op="increase" value="10" tag="notag"/> <rde-dm:attribute attribute="request:baseVar" mode="read" tag="notag"/> </increase_plus> <increase_minus> <rde-dm:attribute attribute="request:baseVar" mode="write" op="increase" value="-10" tag="notag"/> <rde-dm:attribute attribute="request:baseVar" mode="read" tag="notag"/> </increase_minus> <decrease_minus> <rde-dm:attribute attribute="request:baseVar" mode="write" op="decrease" value="10" tag="notag"/> <rde-dm:attribute attribute="request:baseVar" mode="read" tag="notag"/> </decrease_minus> <decrease_plus> <rde-dm:attribute attribute="request:baseVar" mode="write" op="decrease" value="-10" tag="notag"/> <rde-dm:attribute attribute="request:baseVar" mode="read" tag="notag"/> </decrease_plus> <sumparams_plus> <rde-dm:attribute attribute="request:multiVarPlus" mode="write" op="add" value="[#request:baseVar#]" tag="notag"/> <rde-dm:attribute attribute="request:multiVarPlus" mode="write" op="add" value="10" tag="notag"/> <rde-dm:attribute attribute="request:sumMultiVarPlus" mode="read" default="[#request:multiVarPlus#].sumParams()" tag="notag"/> </sumparams_plus> <sumparams_minus> <rde-dm:attribute attribute="request:multiVarMinus" mode="write" op="add" value="[#request:baseVar#]" tag="notag"/> <rde-dm:attribute attribute="request:multiVarMinus" mode="write" op="add" value="-10" tag="notag"/> <rde-dm:attribute attribute="request:sumMultiVarMinus" mode="read" default="[#request:multiVarMinus#].sumParams()" tag="notag"/> </sumparams_minus> </ootb> </dynament>
Das prozessierte Ergebnis:
<dynament xmlns:fo=...> <ootb> <baseVar>20</baseVar> <increase_plus>30</increase_plus> <increase_minus>20</increase_minus> <decrease_minus>10</decrease_minus> <decrease_plus>20</decrease_plus> <sumparams_plus>30</sumparams_plus> <sumparams_minus>10</sumparams_minus> </ootb> </dynament>
Für das Multiplizieren, Dividieren oder die Modulo-Berechnung von Ganzzahlen sind mir keine Methoden bekannt. Benötigt man diese Operationen nur für die Ausgabe/Darstellung (z.B. Berechung der Mehrwertsteuer), kann dies mit Boardmitteln des XSLT-Prozessors (XML/XSL-Transformation, PSX-Module) gelöst werden.
<xsl:value-of select="number(number(18) * number(2))" /> <xsl:value-of select="number(number(18.4) div number(2.0))" /> <xsl:value-of select="number(number(18) mod number(2))" />
Sollen Fließkommazahlen verarbeitet werden und/oder die mathematische Operationen: Multiplikation, Division oder Modulo Verwendung finden, sind individuelle Erweiterungen (z.B. Inline-Funktionen) notwendig.
Die nachfolgenden Quelltexte und Beispiele sollen den prinzipiellen Weg aufzeigen und sind je nach Anwendungsfall bzw. Einsatzgebiet anzupassen.
package org.owug.otwsm.inlinefunction; public class Calculator{ public String plus(String value, String a, String b){ double d1 = Double.parseDouble(a); double d2 = Double.parseDouble(b); return Double.toString(d1 + d2); } public String minus(String value, String a, String b){ double d1 = Double.parseDouble(a); double d2 = Double.parseDouble(b); return Double.toString(d1 - d2); } public String multi(String value, String a, String b){ double d1 = Double.parseDouble(a); double d2 = Double.parseDouble(b); return Double.toString(d1 * d2); } public String division(String value, String a, String b){ double d1 = Double.parseDouble(a); double d2 = Double.parseDouble(b); if(d2 == 0){ return "Division durch 0 nicht erlaubt!"; } return Double.toString(d1 / d2); } public String modulo(String value, String a, String b){ double d1 = Double.parseDouble(a); double d2 = Double.parseDouble(b); return Double.toString(d1 % d2); } }
Anmerkungen: Ein Ableitung von den Basis-Inlinefunktionen ist für die neu erstellte Klasse nicht mehr zwingend erforderlich. Die "erlaubten" Parameter für Inline-Funktionen sind String und Integer, wobei der erste Parameter vom Typ String sein muss. Ich habe mich für die 3-Parameter-Variante entschieden, um beim Aufruf der Inline-Funktion beide Werte zur Berechnung übergeben zu können. Der ursprüngliche Attributwert wird nicht beachtet.
Die Einrichtung über die Hot Deployment Konfiguration ist schnell getan.
Sobald dies eingerichtet ist, können die neuen selbstgeschriebenen Erweiterungen, zur Durchführung von Berechnungen mit dem Delivery Server, eingesetzt werden.
<dynament> <inlinefunction> <plus> <rde-dm:attribute attribute="request:sumDouble" mode="read" default="[##].plus('8.2','1.8')" tag="notag"/> </plus> <minus> <rde-dm:attribute attribute="request:diffDouble" mode="read" default="[##].minus('12.4','1.4')" tag="notag"/> </minus> <multiplication> <rde-dm:attribute attribute="request:multiDouble" mode="read" default="[##].multi('2.6','5.1')" tag="notag"/> </multiplication> <division> <div0><rde-dm:attribute attribute="request:divDouble" mode="read" default="[##].division('10.0','0')" tag="notag"/></div0> <div><rde-dm:attribute attribute="request:divDouble" mode="read" default="[##].division('21','3')" tag="notag"/></div> </division> <modulo> <rde-dm:attribute attribute="request:modDouble" mode="read" default="[##].modulo('18','2')" tag="notag"/> </modulo> </inlinefunction> </dynament>
Das prozessierte Ergebnis:
<dynament xmlns:fo=...> <inlinefunction> <plus>10.0</plus> <minus>11.0</minus> <multiplication>13.26</multiplication> <division> <div0>Division durch 0 nicht erlaubt!</div0> <div>7.0</div> </division> <modulo>0.0</modulo> </inlinefunction> </dynament>
Mit dem Delivery Server können viele Anwendungsfälle zum Erhöhen bzw. Senken von Attributwerten (z.B. Zählschleifen) "out of the box" gelöst werden. Nur bei der Realisierung spezielle Anforderungen (z.B. Berechnung und Speicherung von Fließkommazahlen) ist die Entwicklung und der Einsatz individueller Inline-Funktionen notwendig, soweit dies nicht in anderen integrierten Systemen (z.B. Abfrage von Datenbanken oder Webservices) erledigt werden kann.
Holm Gehre ist seit Mitte 2017 Senior Softwareentwickler und Projektleiter bei CHEFS CULINAR und betreut dort mit seinem Team die Opentext-Plattform. Seit dem Jahr 2001 und bis Mitte des Jahres 2017 betreute und entwickelte er Opentext- (vormals RedDot-) basierte Webseiten nationaler und internationaler Kunden auf Basis von Management und Delivery Server.