Open-Source-Framework Smooks: Transformers

In Listing 2 steht der notwendige Java-Code, um die Transformierung mit Smooks durchzuführen. Smooks bekommt als Parameter die Konfiguration unseres Readers, und dann wird mit der Filter-Funktion die Transformierung durchgeführt. Als Ergebnis erhalten wir einen String, der den Aufbau einer XML-Struktur hat.

Listing 2: CSV-Datei einlesen
Smooks smooks = new Smooks("smooks-config.xml");
   StringWriter writer = new StringWriter();
   smooks.filter(new StreamSource(new InputStreamReader(
                 new ByteArrayInputStream(messageIn), "UTF-8")), 
                 new StreamResult(writer));

Wie sieht es aus, wenn man eine Auftragsdatei in EDIFACT-Format einlesen möchte? Die Datei hat zum Beispiel folgenden Aufbau:


ORD*1*88*100.00*Wed Dec 01 13:45:28 EST 2008

ART*1*1*456*Transformers Fanbook*60.00

ART*2*1*232*Transformers DVD*40.00

In der ersten Zeile sehen wir den Auftragskopf (ORD). Im Kopf sind zum Beispiel die Auftrags-Id, Kunden-Id, Betrag etc. enthalten. Zu jedem Auftrag gibt es n Artikelpositionen (ART) mit der Artikelbezeichnung, Menge, Preis etc. Auch bei EDIFACT transformiert Smooks dieses nach XML, um anschließend das XML auf Java-Objekte zu mappen. Wir benötigen also das Mapping von EDI nach XML und dann von XML nach Java. Das Mapping EDI nach XML ist in Listing 3 dargestellt. Über die delimiters werden die Segmente, Feldtrennzeichnen und Komponenten definiert. In unserem Beispiel haben wir keine Komponenten, aber wenn etwa der Kundenname in einem String „Markus^Demolsky“ in der Datei vorkommt und wir diesen Namen in die Bestandteile „Vorname“ und „Nachname“ aufgliedern möchten, können wir dies mit der Definition einer Komponente erreichen. Das Mapping der Segmente legt fest, wie der Ergebnis-XML-Code auszusehen hat (Listing 4). Um ein EDIFACT mit dem definierten Mapping einzulesen, definieren wir einen EDI-Reader:

Listing 3: EDI-TO-XML Mapping

Das erzeugte XML wird nun für die weitere Verarbeitung, nämlich das Mapping auf unsere Java-Objekte verwendet. Für das Arbeiten mit Java-Objekten benötigen wir die Java Cartridge, die es uns ermöglicht aus XML Objektinstanzen zu erstellen. Wie bereits zu Beginn angemerkt, arbeitet Smooks intern immer mit XML-Daten. Um aus dem eingelesenen EDIFACT Java-Objekte zu erstellen, müssen wir uns also auf den XML-Code in Listing 4 beziehen.

Listing 4: Ergebnis XML
10100.002008-12-01 19:45:28.0 CET
145660.00Transformers Fanbook123240.00Transformers DVD

An dieser Stelle ist es an der Zeit, den BeanContext von Smooks zu erwähnen, der für die Zwischenspeicherung von erstellten Beaninstanzen verwendet wird. Die Anweisung erzeugt beispielsweise eine Instanz der Order-Klasse und legt diese Instanz mit der beanId order ab. Das createOnElement legt fest, wann eine neue Instanz angelegt werden soll. Beim Einlesen unserer XML-Datei aus Listing 4 wird also genau eine Order-Instanz erstellt. Die Kopf- und Artikelpositionen sind in eigenen Klassen modelliert, welche mithilfe der wiring-Anweisung dem Order-Objekt zugeordnet werden können. Die Artikelpositionen werden in einer java.util.ArrayList unter der beanId orderItemList abgelegt.

Listing 5: XML-To-Java Mapping
EEE MMM dd HH:mm:ss z yyyy

Wenn wir nun die Datei durch Smooks laufen lassen, bekommen wir unseren fertigen Objektgraphen. Die oben angeführten Beispiele sollen ein Gefühl dafür vermitteln, wie die grundsätzliche Handhabung von Smooks und die Konfiguration funktioniert. Was ebenfalls sehr interessant ist, sind Java-To-Java-Transformierungen, bei denen Java-Objekte in Graphen transformiert werden können.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.