Dieser Showcase soll den lesenden Zugriff auf ein XML Dokument darstellen. Die darin enthaltenen Daten sollen als Objekte dem umgebenden System bereitgestellt werden. Das XML Dokument ist hierbei wie folgt strukturiert:

<?xml version="1.0" encoding="UTF-8"?>
<Bestellung>
<Stammdaten 
        kundennummer = "HZ-3428.2623.1243"
        anrede = "Herr"
        vorname = "Max"
        nachname = "Mustermann"
        strasse = "Road to Hell"
        hausnummer = "666"
        postleitzahl = "66666"
        ort = "Helsinki"
/>
<Bestellpositionen>
<Position 
        lfdNr = "1"
        artikelnummer = "12430520"
        artikelbezeichnung = "iBirne Notebook"
        einzelpreis = "950,00"
        menge = "1"
        gesamtpreis = "950,00"
/>
<Position 
        lfdNr = "2"
        artikelnummer = "23498522"
        artikelbezeichnung = "Friedhof der Kuscheltiere"
        einzelpreis = "12,95"
        menge = "4"
        gesamtpreis = "51,80"
/>
<Position 
        lfdNr = "3"
        artikelnummer = "56930366"
        artikelbezeichnung = "Michaels Scheuermilch"
        einzelpreis = ""
        menge = ""
        gesamtpreis = ""
/>
<Position 
        lfdNr = "4"
        artikelnummer = "28582956"
        artikelbezeichnung = 'Badewanne "Gaby"'
        menge = "0"
/>
<Position 
        lfdNr = "5"
        artikelnummer = "45636262"
        artikelbezeichnung = "Fliegende Untertasse"
        einzelpreis = "10000000,00"
        menge = "-1"
        gesamtpreis = ""
/>
<Position 
        lfdNr = "6"
        artikelnummer = "87295296"
        einzelpreis = "0,55"
        menge = "1"
        gesamtpreis = "0,55"
/>
</Bestellpositionen>

<Lieferadresse>
        <vorname>J.</vorname>
        <nachname>Su&#233;z</nachname>
        <strasse>Stairway to Heaven</strasse>
        <hausnummer>7</hausnummer>
        <postleitzahl>77777</postleitzahl>
        <ort>Rom</ort>
</Lieferadresse>

<Rechnungsadresse></Rechnungsadresse>

</Bestellung>

Um die Daten adäquat abzubilden, sind zunächst die benötigten Transportobjekte zu definieren: 

  • Customer.java

public class Customer {
        private String kundennummer;
        private String anrede;
        private String vorname;
        private String nachname;
        private String strasse;
        private String hausnummer;
        private String postleitzahl;
        private String ort;

// + getter und setter
}

  • Orderitem.java

public class Orderitem {
        private Long lfdNr;
        private String artikelnummer;
        private String artikelbezeichnung;
        private Double einzelpreis;
        private Long menge;
        private Double gesamtpreis;

// + getter und setter
}

  • Address.java

public class Address {
        private String vorname;
        private String nachname;
        private String strasse;
        private String hausnummer;
        private String postleitzahl;
        private String ort;

// + getter und setter 
}

  • BillingAddress.java

public class BillingAddress extends Address {}

  • ShippingAddress.java

public class ShippingAddress extends Address {}

Für die Erzeugung von Orderitems nutzen wir eine Factory-Klasse:

  • OrderitemFactory.java

public class OrderitemFactory {
        public Orderitem createNew() {
               return new Orderitem();
        }
}

Danach kann in einer separaten Textdatei (Showcase.odsl) die DSL-Operationen beschrieben werden:

Stammdaten:
Für jedes Element  'Stammdaten' 
       in Datei    ${dateiname}  
führe aus 
        ${customer}.Kundennummer = [Element].kundennummer; 
        ${customer}.Anrede       = [Element].anrede; 
        ${customer}.Vorname      = [Element].vorname; 
        ${customer}.Nachname     = [Element].nachname; 
        ${customer}.Strasse      = [Element].strasse; 
        ${customer}.Hausnummer   = [Element].hausnummer; 
        ${customer}.Postleitzahl = [Element].postleitzahl; 
        ${customer}.Ort          = [Element].ort; 

Bestellpositionen:
Für jedes Element  'Position' 
               bei dem lfdNr         ist nicht leer 
                   und artikelnummer ist nicht leer 
                   und einzelpreis   ist nicht leer 
                   und menge         größer als 0 
      in Element  'Bestellpositionen' 
      in Datei    ${dateiname} 
führe aus 
        ${bestellposition}                    = ${orderitem}.createNew(); 
        ${bestellposition}.LfdNr              = [Element].lfdNr; 
        ${bestellposition}.Artikelnummer      = [Element].artikelnummer; 
        ${bestellposition}.Artikelbezeichnung = [Element].artikelbezeichnung; 
        ${bestellposition}.Einzelpreis        = [Element].einzelpreis; 
        ${bestellposition}.Menge              = [Element].menge; 
        ${bestellposition}.Gesamtpreis        = [Element].gesamtpreis; 
        ${orderitems}.add( ${bestellposition} ); 

Rechnungsadresse:
Für jedes Element  bei dem Elementtyp in ( 'vorname', 
                                           'nachname', 
                                           'strasse', 
                                           'hausnummer', 
                                           'postleitzahl', 
                                           'ort' )
       in Element  'Rechnungsadresse' 
       in Datei    ${dateiname} 
führe aus 
        ${attributname}                   = [Element].Elementtyp;
        ${billingaddress}.${attributname} = [Element].textContent; 

Lieferadresse:
Für jedes Element  bei dem Elementtyp in ( 'vorname', 
                                           'nachname', 
                                           'strasse', 
                                           'hausnummer', 
                                           'postleitzahl', 
                                           'ort' )
       in Element  'Lieferadresse' 
       in Datei    ${dateiname} 
führe aus 
        ${attributname}                    = [Element].Elementtyp;
        ${shippingaddress}.${attributname} = [Element].textContent;          

Nun kann der Zugriff auf die XML Datei erfolgen.

String filename = ".\\XML Showcase.xml";

OperationDsl dsl = new OperationDsl();

XmlPlugin xml = new XmlPlugin();
FilePlugin file = new FilePlugin();

dsl.addPlugin(xml);
dsl.addPlugin(file);

Customer customer = new Customer();
List<Orderitem> orderitems = new LinkedList<Orderitem>();
BillingAddress billingAddress = new BillingAddress();
ShippingAddress shippingAddress = new ShippingAddress();

DslContext context = new DslContext();
context.addExternalParameter("dateiname", filename);
context.addExternalParameter("customer", customer);
context.addExternalParameter("orderitems", orderitems);
context.addExternalParameter("orderitem", new OrderitemFactory());
context.addExternalParameter("shippingaddress", shippingAddress);
context.addExternalParameter("billingaddress", billingAddress);

DslExpressions readOrder = dsl.parseFile("ShowCase.odsl", Locale.GERMAN);
readOrder.execute(context);

// Ab hier stehen die Daten in den Transportobjekten zur Verfügung

 

 

 

 

...