Bei der operation.dsl handelt es sich um eine domänenspezifische Sprache (DSL : Domain Specific Language). Ziel der operations.dsl ist es
- den Zugriff auf Schnittstellen zu kapseln
- eine Trennung zwischen fachlichem und technischem Code zu ermöglichen
- die Gesamtkomplexität so zu verringern
- die Wartbarkeit der Schnittstellen zu verbessern
- die Lesbarkeit und Verständlichkeit des Schnittstellencodes zu verbessern
- die Entwicklungsgeschwindigkeit zu erhöhen
Die operation.dsl setzt auf eine externe DSL unter Einbeziehung eines entsprechenden ausführbaren Models. D.h. die operation.dsl nutzt eine externe und von der Implementierungssprache unabhängige Möglichkeit zur Definition der fachlichen Operationen, welche zur Ausführungszeit in ein Model überführt und dieses Model ausgeführt wird.
foreach Cell C
in Sheet 'Sheet 1'
in File '.\TestExcelsheet.xlsx'
execute
${resultList}.add( [Cell].getStringCellValue() );
Dabei unterstützt die operation.dsl derzeit zwei Sprachen (Englisch und Deutsch), um die intuitive Lesbarkeit und Verständlichkeit (für den Fachbereich oder Kunden) zu erhöhen.
Für jede Zelle C
in Blatt 'Sheet 1'
in Datei '.\TestExcelsheet.xlsx'
führe aus
${resultList}.add( [Zelle].Text );
Der Plugin-Mechanismus der operation.dsl ermöglicht ferner einen Kontextwechsel der DSL. So kann bereits mit der Basisimplementierung wahlweise der Excel-, XML- oder Datei-Kontext genutzt werden (vgl. Beispielcode).
foreach Line with linenumber equals 2
in File '.\CSV Testfile 1.2.1.csv'
execute
[Line].split('\t');
[Line].mapping( 'first', 'second', 'third', 'fourth', 'fifth' );${valueObjectWithCorrespondingAttributes}.* = [Line].*;
Für jede Zeile bei der text ähnlich '.* - Line 4.*'
in Datei '.\Testfile 1.txt'
führe aus
${resultList}.add( [Zeile] );
Die operation.dsl bietet darüber hinaus eine i18n-Unterstützung, mittels derer konfigurativ die Namen und Attributnamen der DSL-Objekte des jeweiligen Kontext zur besseren Lesbarkeit mit sprachspezifischen Aliasnamen versehen werden können.
EN | Line.linenumber |
= | DE | Zeile.Zeilennummer |
In Kombination mit der mitgelieferten Expression Language können fachliche Bedingungen lesbar und verständlich auf einem fachlichen Niveau definiert werden.
foreach Element 'firstlevel' with name equals 'second one'
and firstAttribute like '.ir.*'
in XML ${xmlstring}
execute
[Element].firstAttribute = 'first';
[Element].secondAttribute = 10;
[Element].thirdAttribute = false;
${resultDto} = [Element];
Für jedes Element 'firstlevel'
in jedem Element
in Datei '.\somefile.xml'führe aus
${resultDto}.* = [Element].*;
Die enthaltene Expression Language bietet eine Vielzahl an verschiedenen Operationen und kann auch für sich - also ohne das oben dargestellte Schleifenkonstrukt - genutzt werden.
Beschreibung | Operation | Beschreibung | Operation | |||
Gleichheit | EN | 1 equals ${A}.a.b.c |
Ungleicheit | EN | 1 not equals ${A}.a.b.c |
|
DE | 1 gleich ${A}.a.b.c |
DE | 1 nicht gleich ${A}.a.b.c |
|||
Ähnlichkeit | EN | "HablaHabla" like ".*bla.*" |
keine Ähnlichkeit | EN | "HablaHabla" not like ".*urz.*" |
|
DE | "HablaHabla" ähnlich ".*bla.*" |
DE | "HablaHabla" nicht ähnlich ".*urz.*" |
|||
Kleiner | EN | 1 less than 2 |
Größer | EN | 2 greater than 1 |
|
DE | 1 kleiner als 2 |
DE | 2 größer als 1 |
|||
Leer | EN | " " is empty |
nicht Leer | EN | " xyz " is not empty |
|
DE | " " ist leer |
DE | " xyz " ist nicht leer |
|||
in Aufzählung enthalten | EN | 1 in ( 1, 2, 3, 4, 5 ) |
nicht in Aufzählung enthalten | EN | 6 not in ( 1, 2, 3, 4, 5 ) |
|
DE | 1 in ( 1, 2, 3, 4, 5 ) |
DE | 6 nicht in ( 1, 2, 3, 4, 5 ) |
|||
Und | EN | Ausdruck1 and Ausdruck2 |
Oder | EN | Ausdruck1 or Ausdruck2 |
|
DE | Ausdruck1 und Ausdruck2 |
DE | Ausdruck1 oder Ausdruck2 |
|||
Attribut-Selektionen | EN |
|
automatisches Attribut-Mapping (via Name) | ${leftparameter}.* = ${rightparameter}.*; |
||
DE |
|
|||||
Wildcards bei Collections und Maps | ${collectionOfSomething}.*.somethingsAttribute |
null save |
|
(ergibt null / keine NullPointerException) |
||
explizite Typkonvertierungen | ${someObject}.integerAttribute = <java.lang.Integer> "1234"; |
implizite Standard Typkonvertierungen | ${someObject}.integerAttribute = "1234"; |
|||
explizite Typkonvertierung String zu Datum | ${parameter}.dateAttribute = <java.util.Date 'dd.MM.yyyy'> "01.06.2005"; |
implizite Typkonvertierung String zu Datum | ${parameter}.dateAttribute = <'dd.MM.yyyy'> "01.06.2005"; |