Generator für die Abbildungsvorschrift von Datenstrukturen

Vorwort:

Was wir bisher zu dem Thema veröffentlicht haben finden Sie hier:

Teil 1 - Teil 2 - Teil 3 - Teil 4 -  Teil 5  - Teil 6 - Teil 7 - Teil 8   zu Model Driven Transformation for Streaming Applications

In diesem Blog-Beitrag beschäftigen wir uns mit der Generierung der Datentransformations-Regeln aus dem Innovator-Modell.

Die Challenge/Vision:

Die Herausforderung ist, die Datentransformations-Regeln so zu gestalten, dass der Stream Processor ohne Anpassung, sprich, allein anhand einer Abbildungsvorschrift unterschiedlichste Datentransformationen durchführen kann. Wichtig ist hierbei, dass das Innovator-Modell alle Informationen der Transformation beinhaltet und so eine vollständige Abbildungsvorschrift aus dem Innovator-Modell generiert und im Stream Processor verwendet werden kann.

Unsere Lösung:

Voraussetzung für die Lösung ist, dass die Transformation typfrei erfolgt. Andernfalls müssten dem Processor die Schemas der Quell- und Zielstrukturen im Detail mitgegeben und dort ausgewertet werden.

Folgende Informationen benötigt der Stream Processor:

  • Name des Quell Topics, aus dem die Quelldatenstrukturen gelesen werden
  • Name des Ziel Topics, in das die transformierten Datenstrukturen geschrieben werden
  • Abbildungsvorschrift, wie jedes Attribut der Quelldaten in die Attribute der Zieldaten umgesetzt werden.

Für diesen Zweck haben wir einen Generator entwickelt, der diese Informationen aus dem Innovator-Modell ermittelt, und in Form einer JSON Konfiguratonsdatei dem Stream Processor als Input dient.

Name des Quell Topics und Name des Ziel Topics definieren:

Im Innovator Modell wird eine Datentransformation in einem Diagramm modelliert (siehe [Blog 3).

Die Wurzel der Quelldatenstruktur wird über eine spezielle Beziehung mit der Wurzel der Zieldatenstruktur verbunden. Damit sind Quelle und Ziel eindeutig im Diagramm identifizierbar. Als Topic Name der Quellstruktur wird der Klassenname der Quelle verwendet. Analog dazu wird als Name des Ziel Topics der Name der Zielklasse verwendet. Diese Daten werden in der Konfigurationsdatei hinterlegt.

Datentransformations-Regeln generieren:

Die Transformation von Attributen der Quellstruktur zu Attributen der Zielstruktur wird im Innovator durch Beziehungen zwischen den Attributen modelliert. Dabei kann es passieren, dass ein Quellattribut auf mehrere Zielattribute abgebildet wird. Es können aber auch mehrere Quellattribute in das gleiche Zielattribut überführt werden. Dabei wird in einem Spezifikationstext an der Beziehung die Verknüpfungsregel definiert.

Der Generator durchwandert rekursiv Attribut für Attribut der Quellklassenstruktur und deren assoziierten Klassen und prüft, ob eine Abbildungsbeziehung vorhanden ist. Ist dies der Fall, wird die Datentransformations-Regel in die Liste der Datentransformations-Regeln übernommen.

Damit ergibt sich die Struktur einer Datentransformations-Regel, welche nachfolgende als Java Klasse dargestellt wird:

Teil_9_Generator_Codes_1Die Attribute werden eindeutig über ihren XPath anhand der Klassenassoziationen als String gespeichert. Die Ziele sind als Liste abgebildet, um alle oben beschriebenen Transformationen abzubilden.

Der conversionString enthält die Verknüpfungsregel, falls keine 1-zu-1 Zuordnung besteht oder sogar Typtransformationen nötig sind.

Somit ergibt sich für die vollständige Struktur der Konfigurationsdatei:

Teil_9_Generator_Codes_2 Die vom Generator gefüllte Konfiguratonsdatei wird dem Stream Processor in Form eines JSON Objekts als Aufrufparameter übergeben.

Beispiel einer Abbildungsvorschrift:

Teil 9  - Code3

Fazit:

Mit diesen generierten Informationen kann ein Stream Processor nun beliebige modellierte Transformationen durchführen. Von Vorteil ist, dass diese Abbildungsvorschriften wiederverwendet und zentral gepflegt werden können. Dies hat zudem den Scharm, dass an unterschiedlichen Datentransformationen gleichzeitig in verteilten Entwicklungsteams gearbeitet werden kann.

MID Blog Newsletter abonnieren

Mehr lesen

Popup Image
stagNames-> |||
counterPost-> [1, 2, 3]
Zurück zum Blog