Transcript
Page 1: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Lehrstuhl für Informatik 7Rechnernetze und Kommunikationssysteme

Mirko Hansen

Regelbasierte syntaktische Veränderung vonausführbaren UML2-Aktivitätsdiagrammen aufSensorknoten am Beispiel von SunSPOTs

Studienarbeit im Fach Informatik

28. Oktober 2010

Please cite as:Mirko Hansen, “Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknotenam Beispiel von SunSPOTs,” Studienarbeit, University of Erlangen, Dept. of Computer Science, October 2010.

Friedrich-Alexander-Universität Erlangen-NürnbergDepartment Informatik

Rechnernetze und Kommunikationssysteme

Martensstr. 3 · 91058 Erlangen · Germany

www7.informatik.uni-erlangen.de

Page 2: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Regelbasierte syntaktische Veränderung vonausführbaren UML2-Aktivitätsdiagrammen

auf Sensorknoten am Beispiel von SunSPOTs

Studienarbeit im Fach Informatik

vorgelegt von

Mirko Hansen

geb. am 3. Februar 1983in Köln

angefertigt am

Lehrstuhl für Informatik 7Rechnernetze und Kommunikationssysteme

Department InformatikFriedrich-Alexander-Universität Erlangen-Nürnberg

Betreuer: Gerhard Fuchs

Betreuender Hochschullehrer: Prof. Dr.-Ing. Reinhard German

Beginn der Arbeit: 1. Februar 2010

Abgabe der Arbeit: 28. Oktober 2010

Page 3: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Erklärung

Ich versichere, dass ich die Arbeit ohne fremde Hilfe und ohne Benutzung anderer

als der angegebenen Quellen angefertigt habe und dass die Arbeit in gleicher oder

ähnlicher Form noch keiner anderen Prüfungsbehörde vorgelegen hat und von dieser

als Teil einer Prüfungsleistung angenommen wurde.

Alle Ausführungen, die wörtlich oder sinngemäß übernommen wurden, sind als

solche gekennzeichnet.

Declaration

I declare that the work is entirely my own and was produced with no assistance

from third parties.

I certify that the work has not been submitted in the same or any similar form for

assessment to any other examining body and all references, direct and indirect, are

indicated as such and have been cited accordingly.

(Mirko Hansen)

Erlangen, 28. Oktober 2010

Page 4: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Abstract

Programming of sensor nodes is a recent research topic on which the chair is

specialized with the ACOOWEE project. They develop a framework that allows

controlling Sun SPOTs (sensor nodes developed by Sun Microsystems) with UML2

activity diagrams. Previously those diagrams had to be created with the UML2 tool

Papyrus, then converted by XML transformation (XSLT) into an own RDF based

format of the framework and at last imported and executed. With that solution

there was no possibility at any time to modify the diagram at runtime within the

framework.

This thesis introduces exactly this possibility. UML2 activity diagrams can be modified

with a ruleset, developed for this purpose. Though the modifications are limited

to syntactical modifications. Due to the functionality of the ruleset it is possible to

describe complex selection and replacement scenarios.

By the use of generalization you are able to create universal UML2 activity diagrams

that can get specialized by each sensor node itself. Furthermore you are able to

readept diagrams to recent changes to environmental properties and correct minor

mistakes without having to modify and convert the whole diagram again. With a

simple programming interface, the developer can use the new feature everywhere

within the framework in an easy and uncomplicated way.

iii

Page 5: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Kurzfassung

Programmierung von Sensorknoten ist ein aktuelles Forschungsthema, mit dem

sich, im Zuge des ACOOWEE-Projekts, auch der Lehrstuhl beschäftigt. Dort wird ein

Framework entwickelt, welches die Steuerung von Sun SPOTs (Sensorknoten der

Firma Sun Microsystems) per UML2-Aktivitätsdiagrammen erlaubt. Bisher wurden

diese Diagramme mit Hilfe des UML2-Tools Papyrus entworfen, anschließend durch

XML-Transformation (XSLT) in ein RDF-basiertes, eigenes Format des Frameworks

konvertiert und schließlich eingelesen und ausgeführt. Bei diesem Ablauf bestand zu

keiner Zeit die Möglichkeit Änderungen an einem Diagramm zur Laufzeit innerhalb

des Frameworks durchzuführen.

Mit dieser Arbeit wurde eben diese Möglichkeit geschaffen. UML2-Aktivitätsdiagram-

me lassen sich, mit einer eigens zu diesem Zweck entwickelten Regelsprache, verän-

dern. Diese Veränderungen sind jedoch auf syntaktische Änderungen beschränkt.

Durch die Funktionsvielfalt der Regelsprache ist es allerdings möglich sogar sehr

komplexe Auswahl- und Ersetzungsszenarien zu behandeln.

Durch Generalisierung lassen sich universelle UML2-Aktivitätsdiagramme erstellen,

welche von jedem Sensorknoten spezialisiert werden können. Außerdem können

Veränderungen an der Umgebung angepasst, sowie kleinere Fehler korrigiert werden,

ohne dabei das komplette Diagramm verändern und neu konvertieren zu müssen.

Durch eine einfache Schnittstelle steht dem Programmierer die Neuerung an jeder

Stelle des Frameworks, ohne größeren Programmieraufwand, zur Verfügung.

iv

Page 6: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Inhaltsverzeichnis

Abstract iii

Kurzfassung iv

1 Einleitung 1

2 Ziel 3

2.1 Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.1 Regelbasiert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1.2 Syntaktische Veränderung . . . . . . . . . . . . . . . . . . . . . . 4

2.2 Arbeiten auf dem Gebiet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.3 Ansatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3 Ausgangssituation 9

3.1 Sun SPOTs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.1.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.1.2 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.2 Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.2.1 UML2 Aktivitätsdiagramme . . . . . . . . . . . . . . . . . . . . . 11

3.2.2 Extensible Stylesheet Language Transformation (Extensible

Stylesheet Language Translations (XSLTs)) . . . . . . . . . . . . 13

3.2.3 Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4 Umsetzung 17

4.1 Veränderung/Optimierung durch Extensible Markup Language (XML)-

Konverter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4.2 Regelbasierte Veränderungen im Framework . . . . . . . . . . . . . . . 19

4.2.1 Besucher-Entwurfsmuster . . . . . . . . . . . . . . . . . . . . . . 19

4.2.2 Regelsprache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

v

Page 7: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Inhaltsverzeichnis vi

4.2.2.1 Auswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

4.2.2.2 Modifikation . . . . . . . . . . . . . . . . . . . . . . . . . 23

4.2.3 Regelparser/-grammatik . . . . . . . . . . . . . . . . . . . . . . . 25

4.2.4 Regelbaum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.2.5 Ablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.2.6 Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.3 Veränderung/Optimierung durch Besucher . . . . . . . . . . . . . . . . 40

5 Beispiele & Anwendungen 41

5.1 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

5.2 Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

6 Zusammenfassung 49

Abbildungsverzeichnis 52

Tabellenverzeichnis 53

Literaturverzeichnis 54

Page 8: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Kapitel 1

Einleitung

Programmierung von Sensorknoten ist ein weitläufiges und aktuelles Thema in

der Forschung. Das ACOOWEE-Projekt [1] untersucht die Möglichkeit, UML2-

Aktivitätsdiagramme (UADs) auf Sensorknoten, speziell Sun SPOTs, ausführen

zu lassen. Zu diesem Zweck wurde ein Framework geschaffen, welches diese Funk-

tionalität bietet. Dabei wird ein UML2-Aktivitätsdiagramm (UAD) mit Hilfe eines

Modellierungstools entworfen, im XML Metadata Interchange (XMI)-Format ab-

gespeichert, durch Transformationsregeln in ein anderes XML-basiertes Format

gebracht und kann anschließend verwendet und interpretiert werden.

Das entwickelte Framework ist durchaus auch für größere Mengen an Sensorkno-

ten verwendbar, jedoch eröffnet sich mit zunehmender Menge an Sensorknoten in

einem, womöglich heterogenen, Sensornetz ein Problem: Es befindet sich beispiels-

weise ein kleiner Fehler in dem UAD. Um diesen beheben zu können, muss das UAD

im Modellierungstool verändert werden, anschließend erneut transformiert und an

alle Sensorknoten verteilt werden. Wenn nun noch verschiedene Varianten dieses

UADs verteilt wurden, wird diese Arbeit schnell sehr mühselig und zeitraubend.

Ein Weg, den Aufwand für dieses Problem zu minimieren, wird mit dieser Arbeit

geschaffen: Es sollen gezielt UADs zur Laufzeit verändert werden können, wobei die

Veränderungen durch Regeln ausgedrückt werden.

Da es sich bei Sensorknoten um Geräte mit stark begrenzten Systemressourcen

handelt, darf in diesem Zuge auch der Speicherverbrauch, sofern möglich, optimiert

werden.

Die Arbeit ist wie folgt aufgebaut: In Kapitel 2 wird das Ziel der Arbeit genauer

beleuchtet. Kapitel 3 beschäftigt sich mit dem Framework und der Umgebung vorher,

1

Page 9: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

1 Einleitung 2

Kapitel 4 mit dem Entwurf, der Umsetzung und Implementierung der Erweiterung.

Wie die Neuerung zu verwenden ist beschreibt Kapitel 5. Abschließend liefert Ka-

pitel 6 eine Zusammenfassung dieser Arbeit, sowie einen Ausblick auf mögliche

weitere Entwicklungen.

Page 10: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Kapitel 2

Ziel

Das Ziel meiner Arbeit ist es, das bestehende Framework so zu erweitern, dass sich

UADs zur Laufzeit anhand von Regeln syntaktisch verändern lassen.

2.1 Definition

Essenziell ist natürlich die Frage, was genau unter „Regelbasierte syntaktische Ver-

änderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am

Beispiel von SunSPOTs“ zu verstehen ist, sowie unter den einzelnen Bestandteilen

des Themas.

Ein ausführbares UML2-Aktivitätsdiagramm ist eine Erweiterung des von der

OMG [2] spezifizierten UML2-Aktivitätsdiagramms, welches den Ablauf eines Ver-

haltens festlegt. Dies ist durch die grafische Darstellung von Aktionen, welche durch

Kontroll- und Datenflüsse verkettet sind, möglich. Unterstützt werden dabei auch

Entscheidungen und Parallelität. Aufgrund der grafischen Repräsentation und der

nicht notwendigen Kenntnis einer traditionellen Programmiersprache, ist das Be-

schreiben eines Verhaltens einfacher erlernbar.

In einer anderen Arbeit [3] wird beschrieben, wie UML2-Aktivitätsdiagramme aus-

geführt werden können. Von der OMG wurde eine entsprechende Spezifikation [4]

entwickelt. Ein solcher Interpreter, zur Ausführung von UADs, wurde im Zuge der

Entwicklung des Frameworks von Damm [5] implementiert, und stellt die Basis

eben dieses dar.

Ein Sensorknoten [6] ist ein kleines Gerät, welches lediglich zum Messen von Daten

3

Page 11: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

2.1 Definition 4

(z.B. Temperatur mit Hilfe eines Temperatursensors), Aufbereiten/Verarbeiten von

diesen (z.B. Durchschnittstemperatur über 10 Sekunden berechnen), und Kommuni-

kation untereinander, vorgesehen ist. Dieses minimalistische Prinzip erlaubt es, mit

wenig Energieverbrauch und geringen Kosten ganze Netze, sogenannte Sensornetze,

aufzubauen. Diese Sensorknoten können mit Hilfe von traditionellen Programmier-

sprachen (wie im Beispiel der Sun SPOTs: Java) programmiert werden. Es können

daher richtige Anwendungen, welche auf die Funktionalität und Systemresourcen

der Geräte zugeschnitten sind, entwickelt werden.

Am Lehrstuhl werden Sun SPOTs eingesetzt, welche in Abschnitt 3.1 noch beschrie-

ben werden. Daher setzt sich diese Arbeit ausschließlich mit der Anwendung auf

diesen Sensorknoten auseinander.

2.1.1 Regelbasiert

Das Ziel dieser Arbeit ist es, UADs gezielt zu verändern. Dies kann auf statischem

Weg erfolgen, also die möglichen Änderungen werden fest in den Programmcode

des Frameworks übernommen und compiliert. Damit entfällt jedoch die Möglichkeit,

Veränderungen zur Laufzeit anpassen zu können, oder sie ist durch die Unflexibilität

des Codes sehr eingeschränkt.

Die bessere Wahl sind dynamische Änderungen, die zur Laufzeit ausgewertet werden

können. Diese Lösung hätte eine hohe Flexibilität, da sie nahezu unabhängig vom

Programmcode des Frameworks ist, und es bietet sich eine große Bandbreite an

verschiedenen Möglichkeiten von Veränderungen.

Das Stichwort regelbasiert spezifiziert hier genauer, wie diese dynamischen Verände-

rungen ausgedrückt und definiert werden sollen. Diese sollen mit Hilfe von Regeln,

die im weitesten Sinne nichts Anderes sind, als logische mathematische Folgerungen

in der Form WENN ... DANN ..., festgelegt werden. Jede Regel besteht aus einer

Prämisse, also einer Bedingung, und einer Konklusion, einem Folgeschluss. Mit Hilfe

dieser Regeln kann zur Laufzeit genau festgelegt werden was verändert wird, und

wie es verändert wird.

2.1.2 Syntaktische Veränderung

Unter der Syntax versteht man die Korrektheit eines Programms (oder hier: UAD)

in Bezug auf die Grammatik, ohne dabei die Bedeutung, also die Semantik, zu be-

Page 12: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

2.1 Definition 5

trachten. Ein Programm ist dann syntaktisch korrekt, wenn es vom Parser akzeptiert

wird. [7]

Im Falle dieser Arbeit ist diese Abgrenzung jedoch nicht so einfach zu treffen.

Zu beachten ist, dass im gesamten Verarbeitungsprozess eines UADs mehrere Ab-

straktionsschichten, wie in Tabelle 2.1 zu sehen, durchlaufen werden. Die Verar-

beitung beginnt mit einer einfachen Textdatei, welche durch verschiedene Schritte

innerhalb des Frameworks zu einer internen, objektorientierten Repräsentation

eines UADs (entspricht der Schicht 3 in Tabelle 2.1) für den Interpreter im Speicher

ausgewertet wird.

Das Ziel dieser Arbeit ist es, syntaktische Änderungen gezielt durchzuführen. Es

soll dabei die Semantik, also die Bedeutung, wie zum Beispiel in Schicht 4 die

Funktionsweise des beschriebenen Verhaltens des UADs, erhalten bleiben. Dabei

wird ausschließlich in Schicht 3 gearbeitet. Der Graph an sich bleibt mit allen seinen

Knoten und Kanten erhalten wie er ist. Lediglich Eigenschaften dieser Elemente

werden verändert.

Wichtig ist, dass durch die Veränderungen der Syntax in tieferen Schichten, Verän-

derungen der Semantik in höheren Schichten herbeigeführt werden können. Die

Einschränkung auf syntaktische Veränderungen ist also das primäre Ziel, ein Neben-

effekt, also die Veränderung der Semantik in höheren Abstraktionsebenen, ist also

nicht auszuschließen und teilweise sogar erwünscht. So lassen sich beispielsweise

über die Veränderung von Eigenschaften der ausgehenden Kanten eines Entschei-

dungsknoten auf Schicht 3 andere Entscheidungen, und somit andere Abläufe

erzeugen.

2.2 Arbeiten auf dem Gebiet

Obwohl es sich bei dem Themengebiet Unified Modeling Language (UML) um

ein Thema der intensiven Forschung und Weiterentwicklung handelt, wurde zum

Zeitpunkt der Erstellung dieser Arbeit keine weitere Arbeit oder Veröffentlichung ge-

funden, die sich mit dem Thema der Veränderung von UML2-Aktivitätsdiagrammen

beschäftigt. Eine Spezialisierung auf die Verwendung in Sensorknoten wurde bei

der Recherche generell vermieden, da diese Problemstellung doch sehr speziell, und

ein Sucherfolg um einiges unwahrscheinlicher wäre. Selbst eine Generalisierung

des Problems zur Suche bis hin zur regelbasierten Veränderung von (gerichteten)

Page 13: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

2.2 Arbeiten auf dem Gebiet 6

Tabelle 2.1: Abstraktionsschichten eines UADs

Schicht Elemente Beschreibung

4 UML2-Aktivitätsdiagramm

Aktionen, Kontroll-& Objektflüsse

Beschreibung eines Verhaltens.

3 GerichteterGraph

Knoten & Kanten Der gerichtete Graph beschreibt,zusammen mit den Eigenschaf-ten der Knoten und Kanten,ein UML2-Aktivitätsdiagramm. Einsyntaktisch veränderter gerichteterGraph beschreibt weiterhin ein gül-tiges UML2-Aktivitätsdiagramm.Auf dieser Schicht arbeitet das Fra-mework.

2 XML-Baum Knoten & Attribute Der XML-Baum wird nach demParsen in eine höhere Abstrakti-onsschicht konvertiert, welche dieinterne Klassenstruktur repräsen-tiert. Ein syntaktisch veränderterXML-Baum beschreibt weiterhineinen gültigen gerichteten Gra-phen.

1 Textdatei Bytes Die Textdatei wird von einem XML-Parser zerteilt und in Baumformbeschrieben. Eine syntaktisch ver-änderte Textdatei ist weiterhin ei-ne valide XML-Datei.

Page 14: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

2.2 Arbeiten auf dem Gebiet 7

Graphen blieb erfolglos. Zur Suche herangezogen wurden wissenschaftliche Such-

maschinen wie Google Scholar1 und CiteULike2. Gesucht wurde sowohl auf Deutsch

als auch auf Englisch.

2.3 Ansatz

Zunächst stellen sich mit dem Thema und mit Blick auf das bestehende Framework

einige Fragen, insbesondere „Was soll verändert werden?“, „Wie soll etwas verändert

werden?“ und „Wie soll dies ausgedrückt werden?“. Die Frage, wann genau eine

Veränderung stattfinden soll, wird vorerst zurückgestellt, da diese zum jetzigen

Zeitpunkt nicht relevant ist. Zu Testzwecken wird die Veränderung vorerst nur

einmalig am Anfang, wenn ein UAD eingelesen und im Speicher abgelegt wird,

durchgeführt, kann und soll dann aber im Zuge der späteren Entwicklung auch an

anderen Orten des Frameworks platziert und ausgelöst werden.

Nun aber zu den wichtigen Fragen:

„Was soll verändert werden?“ Nach der Definition von Abschnitt 2.1.2 soll der

Graph auf Abstraktionsschicht 3, also alle Knoten und Kanten in ihren Verknüpfung-

en, unverändert bleiben. Es dürfen lediglich die Attribute und Eigenschaften der

einzelnen Elemente verändert werden. Als Beispiele hierfür zu nennen sind die

Bedingungen von Kanten an Entscheidungsknoten, ein Name einer aufzurufenden

Aktivität oder die Zuweisung einer Adresse eines anderen Sun SPOTs zur entfernten

Ausführung einer Aktivität.

„Wie soll etwas verändert werden?“ Bei der Art der Veränderung gilt, genau

wie bei der vorherigen Frage, dass der Graph selber in seiner Form nicht verändert

werden darf. Es werden zwei mögliche Veränderungsarten festgelegt: komplettes

und partielles Ersetzen von Eigenschaften. Beispiele hierfür wären das Ersetzen von

verwendeten Variablen, sowie das Festlegen von kompletten Eigenschaften.

„Wie soll dies ausgedrückt werden?“ Um eine solche Veränderung ausdrücken

zu können, muss eine eigene Sprache eingeführt werden, mit welcher genau spe-

zifiziert werden kann, was verändert werden soll und wie. Diese Sprache sollte in

1http://scholar.google.de/2http://www.citeulike.org/

Page 15: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

2.3 Ansatz 8

soweit flexibel sein, dass man mit den vorhandenen Mitteln jede mögliche Verände-

rung, welche auf die beiden oberen Fragen zutrifft, ausdrücken und durchführen

kann. Außerdem ist eine (einfache) Erweiterungsmöglichkeit wünschenswert, falls

in einer Weiterentwicklung eine größere Funktionalität gewünscht wird.

Page 16: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Kapitel 3

Ausgangssituation

Als Basis für diese Studienarbeit dient das Framework, welches im Zuge des

ACOOWEE-Projekts aus diversen Diplom- und Studienarbeiten, sowie eigenen Ent-

wicklungen des Lehrstuhls entstand. Dieses ist primär für die am Lehrstuhl verwen-

deten Sun SPOT Sensorknoten entwickelt worden. In diesem Abschnitt werden die

Sensorknoten und das Framework genauer in Augenschein genommen.

3.1 Sun SPOTs

Als Hardwarebasis werden sogenannte Sun SPOTs eingesetzt. Dabei handelt es sich

um Sensorknoten der Firma Sun Microsystems1, die von Haus aus diverse Sensoren

und Aktoren anbieten und sich auch mit kleinen, am Lehrstuhl entwickelten Robo-

tern verbinden lassen. Im Folgenden die wichtigsten technischen Merkmale [8] der

Sun SPOTs.

3.1.1 Hardware

Prozessor:

• 180 MHz 32 bit ARM920T Prozessor

• 512 KB RAM

• 4 MB Flash-Speicher

• 2.4 GHz IEEE 802.15.4 Funkkommunikation mit integrierter Antenne

• AT91 Zeitgeber

1http://www.sun.com

9

Page 17: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

3.1 Sun SPOTs 10

Abbildung 3.1: Sun SPOTs neben einer AA-Batterie

• USB Schnittstelle

Sensoren/Aktoren:

• 2G/6G Drei-Achsen-Beschleunigungssensor

• Temperatursensor

• Lichtsensor

• 8 dreifarbige LEDs

• 6 analoge Eingänge

• 2 Tastschalter

• 5 Mehrzweck-I/O-Pins und 4 Hochstrom-Ausgangs-Pins

Batterie:

• 3.7V Lithium-Ionen-Akku mit 750 mAh

• 30 uA im Tiefschlaf-Modus

• Automatische Energieverwaltung durch die Software

Page 18: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

3.1 Sun SPOTs 11

3.1.2 Software

Auf den Sun SPOTs läuft eine spezielle Version der Java Micro Edition (Java ME)

mit dem Namen Squawk [9]. Diese Java VM unterstützt die beiden Standards CLDC

1.1 und MIDP 1.0.

3.2 Framework

Das im Zuge des ACOOWEE-Projekts entwickelte Framework bietet die Möglichkeit

die Funktionen eines Sensorknotens (Sensoren, Aktoren, Funkkommunikation) mit

Hilfe von UADs zu nutzen. Dabei wird mit eben diesen ein „Programm“ in Form

einer UML-Aktivität beschrieben. Entworfen werden können solche Aktivitäten mit

dem UML-Modellierungstool Papyrus [10]. Theoretisch sollte das auch mit anderen

Tools möglich sein, es wurde jedoch bisher nur mit Papyrus (erfolgreich) getestet.

Die von Papyrus gespeicherten XMI-Dateien müssen in eine für das Framework

brauchbare Form konvertiert werden. Anschließend kann der Interpreter des Frame-

works diese vom Parser einlesen, in abstrakter Form im Speicher ablegen, und auf

Befehl ausführen lassen. Die wichtigsten Punkte dieses Vorgehens für diese Arbeit

werden im Folgenden etwas detaillierter beschrieben.

3.2.1 UML2 Aktivitätsdiagramme

Das Framework wird mit Hilfe von UML2 Aktivitätsdiagrammen gesteuert. Dies

bietet sich an, da ein UAD einen Arbeitsfluss beschreibt und somit eine interaktive

Steuerung ermöglicht. Es werden dabei Aktivitäten, Kontrollflüsse und Objektflüsse

als grundlegende Elemente verwendet, um einen Arbeitsfluss festzulegen. Es besteht

zusätzlich die Möglichkeit Entscheidungen sowie Parallelität zu modellieren, was

somit die Beschreibung nahezu jedes Szenarios auf einfache Weise erlaubt.

Da die Elemente eines UADs für diese Arbeit essenziell sind, werden diese nochmal

kurz erläutert. Eine detailliertere Übersicht und Beschreibung findet man in der

dazugehörigen Spezifikation der OMG [2] oder weiterer Literatur [11] zum Thema

UML2.

Die Grundelemente eines UADs sind in Abbildung 3.2 dargestellt:

Startknoten Beginn des Ablaufs in einer Aktivität.

Endknoten Ende einer Aktivität für alle Kontrollflüsse.

Page 19: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

3.2 Framework 12

Startknoten

Endknoten Ablaufende

Aktion

Abbildung 3.2: Die Grundelemente eines UML2-Aktivitätsdiagramms.

[Bedingung1]

[Bedingung2]

Entscheidung Zusammenführung

Abbildung 3.3: Entscheidungen in einem UAD.

Ablaufende Ende eines einzelnen Kontrollflusses.

Aktion Aufruf einer Aktivität.

Desweiteren verfügt eine Aktivität über die Möglichkeit Entscheidungen zu treffen,

wie in Abbildung 3.3 dargestellt:

Entscheidung An diesem Punkt wird festgestellt in welchem ausgehenden Kontroll-

fluss fortgefahren wird.

Zusammenführung Vereint die einzelnen Kontrollflüsse einer (oder mehrerer)

Entscheidung(en).

Parallelität kann mit den in Abbildung 3.4 verwendeten Elementen beschrieben

werden:

Teilung An diesem Punkt wird der einzelne Kontrollfluss in mehrere, parallele

Kontrollflüsse aufgeteilt.

Page 20: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

3.2 Framework 13

Teilung Synchronisation

Abbildung 3.4: Parallelität in einem UAD.

Abbildung 3.5: Objektflüsse in einem UAD.

Synchronisation Synchronisation und Vereinigung von parallelen Kontrollflüssen

zu einem einzelnen Kontrollfluss.

Um die Bewegung von Objekten zu beschreiben, gibt es in Abbildung 3.5 eine

Erweiterung: Aktionen, die Objekte generieren, besitzen einen Output-Pin, welcher

das Objekt unter dem festgelegten Namen zur Verfügung stellt. Der Objektfluss zeigt

in eine andere Aktion, welche einen Input-Pin besitzt. Durch den Objektfluss wird

das Objekt vom Output-Pin zum Input-Pin der Zielaktion transportiert und unter

dem festgelegten Namen des Input-Pins zur Verfügung gestellt.

3.2.2 Extensible Stylesheet Language Transformation (XSLTs)

Das Framework arbeitet, anders als das UML-Entwicklungstool Papyrus, mit einem

proprietären, Resource Description Framework (RDF)-basierten Format. Daher kann

es die UML-Dateien, die von Papyrus abgelegt werden, und ein komplettes UAD

enthalten, nicht direkt verwenden, obwohl beide in einem XML-basierten Format

vorliegen. Letztere Eigenschaft hat jedoch einen großen Vorteil im Bezug auf die

Konvertierung zwischen beiden Dateiformaten. Mit Hilfe der XSLT lassen sich im

XML-Format diverse Konvertierungsregeln festlegen, um Dateien von einem in ein

anderes XML-basiertes Format zu übersetzen.

Diese Methode wird hier angewendet, und verwandelt die von Papyrus abgelegte

UML-Datei in eine UAD-Datei des Frameworks, welche dann in dem von Damm [5]

Page 21: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

3.2 Framework 14

definierten, RDF-basierten Format vorliegt. Die Konvertierung selber führt das Open-

Source-Tool xsltproc [12] durch, welches die XSLT-Regeln, sowie die UML-Datei, als

Kommandozeilenparameter übergeben bekommt, und diese dann, den XSLT-Regeln

entsprechend, umwandelt.

Die Semantik, also der grundlegende Aufbau des UADs, bleibt mit der Konvertierung

erhalten. Die meisten unnötigen Daten werden verworfen und die wichtigen Daten in

das gewünschte Format gewandelt. Das Tool arbeitet nur in der Abstraktionsschicht

2 (siehe Tabelle 2.1), sieht die Dateien selbst nur als einen XML-Baum, welcher

durch die XSLT-Regeln in eine andere Form gebracht wird. Es findet in diesem Tool

zu keiner Zeit eine Verarbeitung in einer höheren Abstraktionsschicht statt.

3.2.3 Core

Das konvertierte UAD durchläuft im Framework drei wichtige Schritte: Zuerst wird

die UAD-Datei eingelesen und vom Parser zerteilt. Das Ergebnis wird in abstrakter

Form im Speicher des Sun SPOTs abgelegt und anschließend, auf Befehl, von dem

internen Interpreter ausgeführt.

Parser Da es sich bei den konvertieren UADs um XML-Dateien in einem RDF-

basierten Format handelt, ist das Parsen dieser Dateien einfach. Es gibt bereits fertig

implementierte XML-Parser für Java, welche unter offenen Lizenzen stehen und

frei nutzbar sind. Der Klassenbibliothek der eingeschränkten Java ME, welche auf

den Sun SPOTs läuft, fehlen leider die Java-eigenen XML-Parser aus den Paketen

javax.xml.*. Daher verwendet das Framework die Bibliothek KXML [13].

Der Parser geht dabei alle Tags in der Reihenfolge, wie sie in der UAD-Datei auf-

gelistet sind, nach dem Prinzip der Tiefensuche durch. Dabei wird der komplette

Baum, der in der UAD-Datei im RDF-Format abgelegt ist, in abstrakter Form, linear

im Speicher abgelegt.

Speicherstruktur Der vom XML-Parser ausgelesene „Baum“ wird durch die im

Framework verwendete lineare Speicherstruktur wieder zu einem gerichteten Gra-

phen gewandelt. Dabei wird ein UAD selbst, sowie jeder Knoten- und Kantentyp

durch eine eigene Klasse repräsentiert, welche von der abstrakten Klasse Node

bzw. Edge abgeleitet ist. Eine Übersicht der korrespondierenden Java-Klassen ist in

Tabelle 3.1 aufgelistet.

Page 22: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

3.2 Framework 15

Tabelle 3.1: Java-Klassen zur Repräsentation von Knoten und Kanten in einem UAD

Knoten-/Kantentyp korrespond. Java-Klasse

Startknoten InitialNode

Endknoten FinalNode

Ablaufende FlowFinalNode

Aktion (elementar) RootActionNode

Aktion (UML-Aktivität) UMLActionNode

Entscheidung DecisionNode

Zusammenführung MergeNode

Teilung ForkNode

Synchronisation JoinNode

Parametereingang ActivityParameterInNode

Parameterausgang ActivityParameterOutNode

Kontrollfluss Edge

Objektfluss ObjectFlow

Die komplette Speicherrepräsentation eines UADs erhält das Framework durch die

Rückgabe einer Referenz auf ein Activity-Objekt vom Parser. Dieses bietet dem

Framework Methoden zum Zugriff auf jeden Knoten und jede Kante des UADs über

die eindeutige ID des jeweiligen Objekts. Außerdem können die Eigenschaften einer

Aktivität, wie zum Beispiel der Name, festgelegt werden. Im Folgenden eine Liste,

der für diese Arbeit wichtigsten verfügbaren Methoden der Klasse Activity:

• addNode()

• addStartNode()

• addActivityParameterInNode()

• addActivityParameterOutNode()

• addEndNode()

• getStartNodes()

• getNode()

• setName()

Page 23: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

3.2 Framework 16

• getName()

• setOption()

• getOption()

Dies ermöglicht allen Bereichen des Frameworks auf jedes Element eines UADs

zuzugreifen und dieses zu verändern. Beispielsweise lässt sich mit Hilfe der Methode

getStartNodes() eine Liste der Startknoten eines UADs auslesen, von welchen

aus, mit Hilfe von weiteren Methoden, sich der komplette Graph des UADs verfolgen

lässt. Zu erwähnen ist jedoch, dass der Graph nicht komplett mit Objektreferenzen

auf Kanten und Knoten miteinander verbunden ist, wie es durch etwas „Nacharbeit“

durchaus möglich wäre, sondern es besitzen lediglich Knoten eine Referenz auf die

angrenzenden Kanten. Umgekehrt ist ein Zwischenschritt über die eindeutige ID des

angrenzenden Knotens, und die getNode()-Methode des zugehörigen Activity-

Objekts nötig. Dies erschwert eine semantische Modifikation, da jede Verknüpfung

sowohl in den Objekten selber (die Referenzen innerhalb der Knoten auf die an-

grenzenden Kanten), als auch in den Hashtables der Aktivität, zum Auflösen der

eindeutigen ID in ein Objekt, verändert werden müsste.

Da es bei dieser Arbeit jedoch um die syntaktische Veränderung von UADs geht, und

die Verbindungen zwischen den Knoten nicht modifiziert werden, wird die oben

beschriebene Lösung beibehalten.

Interpreter Nachdem das komplette UAD geparst und im Speicher, in Form einer

Instanz der Klasse Activity, abgelegt und verfügbar ist, kann dieses bei Bedarf

interpretiert werden. Der Interpreter geht dabei so vor, dass er sich mit Hilfe der

Methode getStartNodes() alle Startknoten zurückgeben lässt, und an diesen die

parallele (sofern es mehrere sind) Ausführung beginnt. Es wird dabei pro Startkno-

ten ein eigener Programmfaden (Thread) gestartet. Dabei wird den Knoten und

Kanten von jedem Startknoten aus so lange logisch gefolgt, bis alle Programmfä-

den einen Endknoten erreicht haben. Die auf dem Weg betretenen Knoten werden

sinngemäß interpretiert und ausgeführt.

Page 24: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Kapitel 4

Umsetzung

4.1 Veränderung/Optimierung durch XML-Konverter

Wie in Abschnitt 3.2.2 beschrieben, müssen mit Papyrus erstellte UADs zuerst mit

Hilfe von XSLT-Regeln in ein RDF-basiertes Dateiformat des Frameworks umgewan-

delt werden.

Alle Objekte des UAD erhalten ursprünglich im UML-Dateiformat eine eindeutige,

aus genau 23 Buchstaben und Zahlen bestehende, kryptische Identifikation. Diese

ist nötig, um Verbindungen zwischen Knoten und Kanten zu beschreiben. Mit der

Konvertierung durch die XSLT-Regeln werden die langen Identifikationen 1:1 über-

nommen, welches in keiner Weise dem minimalistischen Prinzip entspricht, und

daher mehr Speicher als nötig verbraucht.

Eine Verbesserung der XSLT-Regeln erlaubt es, diese eindeutige Identifikation auf ein

Minimum zu reduzieren. Letztendlich werden Knoten mit n1, n2, n3, ... und Kanten

mit e1, e2, e3, ... benannt. Das Präfix n für Knoten bzw. e für Kanten ist notwendig,

da mit dieser Umsetzung der XSLT-Regeln ansonsten eine eindeutige Benennung

aller Elemente nicht möglich ist. Trotzdem ist eine Verkürzung der Anzahl der für

den Namen eines Elements verwendeten Zeichen von im Schnitt 87% bei größeren,

und bis zu maximal 91% bei kleineren UADs möglich.

Diese Einsparung ergibt sich konkret aus folgender Berechnung: Bei einer klei-

nen Anzahl an Elementen, es wird von maximal 9 Knoten und 9 Knoten ausge-

gangen, besteht die Identifikation eines Elements lediglich aus jeweils 2 Zeichen

(n1,n2,n3,...,n9 und e1,e2,e3,...,e9). Damit lässt sich die prozentuale Einsparung

an Zeichen durch den Quotient Eingespar te ZeichenZeichen vorher

berechnen. Konkret ergibt sich

17

Page 25: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.1 Veränderung/Optimierung durch XML-Konverter 18

dabei, mit der Zeichenlänge von 23 zur Identifikation vor der Änderung, folgender

Wert: 23−223= 21

23≈ 91,3%. Für eine größere Anzahl an Elementen in einem UAD

wurde eine Menge von 99 Elementen angenommen. Dabei haben nur die Identifika-

tion 9 Kanten und 9 Knoten die Länge 2, alle anderen Identifikationen haben die

Länge 3. Die Berechnung erfolgt analog zu der Berechnung für die kleine Anzahl an

Elementen.

Listing 4.1: XSLT: Generieren der Identifikation der Knoten

1 <xsl:attribute name="rdf:about">2 <xsl:value -of select="concat('n',position ())" />3 </xsl:attribute >

Im Beispiel von Listing 4.1 wird die Identifikation der Knoten mit n und der Posi-

tion innerhalb der Datei festgelegt. Anschließend müssen noch alle Verbindungen,

die durch Kanten gegeben sind, angepasst werden. Hierbei ruft die entsprechende

Regel das Template fetchnodeid, wie in Listing 4.2, mit der alten Identifikation

als Parameter auf.

Listing 4.2: XSLT: Auflösen der alten Identifikation in die neue Bezeichnung

1 <xsl:call -template name="fetchnodeid">2 <xsl:with -param name="nodeid" select="@source" />3 </xsl:call -template >

Das Template fetchnodeid aus Listing 4.3 iteriert nun durch alle Knoten

innerhalb der Datei und gibt die Identifikation des Knotens (die ja laut Listing 4.1

aus n und der Position innerhalb der Datei besteht) zurück, dessen ehemalige

Identifikation mit dem übergebenen Parameter übereinstimmt.

Listing 4.3: XSLT: Template zum Auflösen der alten Identifikation in die neueBezeichnung

1 <!--find and resolve compact node id -->2 <xsl:template name="fetchnodeid">3 <xsl:param name="nodeid" />4 <xsl:for -each select="//node">5 <xsl:if test="@*[name()='xmi:id ']=$nodeid">6 <xsl:value -of select="concat('n',position ())" />7 </xsl:if >8 </xsl:for -each >9 </xsl:template >

Mit Hilfe dieser kleinen Verbesserung ist es möglich, die Dateigröße der aus der

Konvertierung resultierenden UAD-Datei geringfügig zu senken. Da der Speicher

auf Sensorknoten im Allgemeinen knapp bemessen ist, und auch die Rechenzeit

Page 26: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.1 Veränderung/Optimierung durch XML-Konverter 19

sehr beschränkt ist, ist diese Optimierung ein Schritt, wenn auch nur ein kleiner, zur

effizienteren Nutzung der Systemresourcen.

4.2 Regelbasierte Veränderungen im Framework

Bevor die neuen Funktionen in das bestehende Framework eingebaut werden

können, mussten zuerst einige wichtige Anpassungen vorgenommen werden. So

ist zu beachten, dass die grundsätzlichen Regeln des objektorientierten Program-

mierens eingehalten wurden und werden, um Schwierigkeiten bei Erweiterungen

des Codes, wie sie im Zuge dieser Arbeit notwendig wurden, zu vermeiden. Da-

bei ist zu erwähnen, dass unbedingt abstrakte Klassen, welche im gesamten Pro-

grammablauf nicht instanziiert werden können, mit dem Schlüsselwort abstract

gekennzeichnet werden sollten. Konkret trifft das bei dem Framework auf die

Klassen Node, JoinableNode, ActionNode, ActivityParameterNode und

DecisionableNode zu. Diese Klassen wurden also korrekterweise als abstrakt

gekennzeichnet. Als Ergebnis wurde damit die Arbeit im folgenden Punkt sehr

erleichtert, da ansonsten für die Einführung des Besucher-Entwurfsmusters in Ab-

schnitt 4.2.1 eine Menge an Methoden eingeführt werden müsste, die niemals

aufgerufen werden würde, da diese (abstrakten) Klassen niemals in einem UAD

auftauchen, und somit auch niemals instanziiert werden würden.

4.2.1 Besucher-Entwurfsmuster

Für die Abarbeitung einzelner Schritte im Folgenden wird das Besucher-Entwurfs-

muster [14] für alle Klassen, die ein UAD beschreiben, eingeführt. Zu diesem Zweck

wurde die Schnittstelle VisitInterface aus Listing 4.4 angelegt, welches für alle

Klassen eines UADs eine Implementierung der Methode

accept(AbstractVisitor v) fordert.

Listing 4.4: VisitInterface.java

1 public interface VisitInterface {2 public abstract void accept(AbstractVisitor v);3 }

Die Implementierung der Methode in den einzelnen Klassen ist immer gleich:

Es wird die visit-Methode des im Parameter v übergebenen Objekts aufgerufen.

Diese Methoden unterscheiden sich innerhalb des AbstractVisitor durch die

Page 27: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 20

Signatur. Abhängig von dem aufrufenden Objekt wird die passende visit-Methode

gewählt und ausgeführt.

Der auf den ersten Blick einfachere Weg wäre, jedem zu verarbeitenden Objekt eines

UADs eine eigene Methode für jeden möglichen Verarbeitungsschritt hinzuzufügen.

Allerdings müssten zu diesem Zweck viele (unnötige) get- und set-Methoden im-

plementiert werden, um auf die lokalen Variablen der jeweiligen Objekte zugreifen

zu können. Außerdem ist die Funktionsweise im Endeffekt dezentral untergebracht,

welches sich negativ auf die Übersichtlichkeit und die Verständlichkeit des Codes

auswirkt, und damit die Fehleranfälligkeit erhöht.

Daher hat die Implementierung des Besucher-Entwurfmusters einen großen Vorteil

gegenüber anderen Lösungen: Jeder Schritt der Verarbeitung kann als eigene Kind-

klasse des AbstractVisitor implementiert werden. Es ergibt sich eine sinnvolle

Abgrenzung des Codes der einzelnen Schritte voneinander, und dieser ist zentral, in

seiner eigenen Klasse, untergebracht.

Dazu kommt, dass jede Besucherklasse ihre eigenen (privaten) Variablen führen

kann, die für den Schritt nötig sind, ohne dabei Zugriff an andere Teile des Pro-

gramms bieten zu müssen. Die Daten werden zentral in dem Objekt des Besuchers

abgelegt und nicht verstreut in den einzelnen Klassen des UADs.

4.2.2 Regelsprache

Zur Beschreibung von Veränderungen eines UAD wird eine Regelsprache mit gewis-

sen Anforderungen entwickelt:

• kompakt, um so wenig (unnötigen) Speicherplatz zu belegen wie möglich

• verständlich, um Veränderungen in der Regelsprache einfach ausdrücken zu

können

• logisch, sinnvolle Aufteilung der Bereiche einer Regelsprache

Zur Auswahl steht ein XML-basiertes und ein eigenes Format:

Die Vorteile des XML-basierten Formats unterliegen jedoch den Nachteilen: So ist

zwar ein Standard durch die Wahl des Formats, und damit eine bessere Kompatibili-

tät durch Editoren, Konverter und andere (Hilfs-)Programme, gegeben. jedoch hat

XML den gewaltigen Nachteil einen sehr großen Overhead zu haben. Für die An-

wendung in einem Sensorknoten mit geringen Systemresourcen ist dies ungeeignet,

Page 28: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 21

Tabelle 4.1: Auswahlgründe für die Regelsprache

XML Eigene Sprache

Pro

• standardisiert

• Parser bereits vorhan-den

• kompakt (minima-ler Overhead)

• Syntax aus der natür-lichen Sprache abge-leitet

Contra

• Overhead

• Syntax sehr umständ-lich

• kein Parser vorhan-den

und fällt im Anforderungspunkt „kompakt“ durch.

Die Wahl fällt also auf eine eigene Regelsprache. Diese wird so entworfen, dass

sie alle Anforderungen erfüllt. Dafür muss allerdings ein eigener Parser entwickelt

werden. Das ist mit Hilfe eines Parsergenerators kein größeres Problem. Mehr dazu

in den folgenden Abschnitten.

Als Grundlage ist die textbasierte Regelsprache eine leichte Anlehnung an die

Update-Klausel von SQL [15], eine bewährte, standardisierte Sprache zur Abfrage

und Modifikation von Daten in einer Datenbank. Sie ist mengenbasiert und besteht

aus zwei Bereichen: Der Auswahl einer Menge von Knoten und/oder Kanten, und

der Modifikation der ausgewählten Menge. Diese logisch sinnvolle Teilung wird hier

übernommen.

Dadurch, dass es sich weitestgehend um Befehle des englischen Wortschatzes han-

delt, kann man mit Hilfe der natürlichen Sprache intuitiv einfache Regeln der

Regelsprache verstehen und auch schreiben. Der Overhead ist im Gegensatz zu

einem XML-basierten Format deutlich geringer, da sehr wenige überflüssige Zeichen,

also Zeichen, die nicht zwingend zur Erhaltung der Semantik der Regel notwendig

sind, vorhanden sind.

Eine Zusammenfassung ist in Tabelle 4.1 zu finden.

Page 29: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 22

4.2.2.1 Auswahl

Der erste Teil einer Regel ist die Beschreibung einer Menge an Knoten und Kanten

des UAD, die im Anschluss vom zweiten Teil, modifiziert werden sollen. Hierbei

sind vielerlei Arten der Auswahl von Kanten und Knoten möglich. Daher zuerst eine

kurze Übersicht, wie sich die Auswahlregeln beschreiben lassen:

Syntax:

find

[edge edge_selection of] node node_selection | *

[contains variable variable_selection ]

[and ...]

Das Schlüsselwort find leitet die Auswahl der Knoten und Kanten innerhalb der

Regel ein. Daher muss eine Regel immer mit find beginnen.

Der Teil [edge edge_selection of] ist nur nötig, sofern angrenzende Kanten, an die

im Folgenden ausgewählten Knoten, selektiert werden sollen. Die Ergebnismenge

enthält dann jedoch ausschließlich Kanten, nicht mehr die im Folgenden gewählten

Knoten.

edge_selection ist eine durch Komma getrennte Liste an Eigenschaften, von denen

mindestens eine auf die auszuwählenden Kanten zutreffen muss. Dabei wird der

Kantentyp aus Sicht des gewählten Knotens mit Hilfe der Schlüsselworte in (einge-

hende Kante), out (ausgehende Kante) oder * (alle Kanten) bestimmt. Gezieltere

Auswahl kann durch Angabe von Eigenschaften getroffen werden. Diese werden in

einer mit eckigen Klammern umschlossenen, von Komma getrennten Liste hinter

dem Kantentyp festgelegt. (Beispiel: in[guard="<20"] Es werden alle eingehen-

den Kanten ausgewählt, welche die Eigenschaft guard="<20" besitzen.) Eine Liste

an möglichen Eigenschaften ist in Tabelle 4.2 zu finden.

node_selection setzt sich so ähnlich zusammen wie die Auswahl der Kanten. Hier

kann der Knotentyp anhand der internen Bezeichnung ausgewählt werden. Eigen-

schaften lassen sich ebenfalls, mit einer in eckigen Klammern angehängten, durch

Komma getrennten Liste, zum Auswählen festlegen. (Beispiel: ForkNode[@in="1"]

Es werden alle Knoten vom Typ ForkNode ausgewählt, welche genau eine Eingangs-

kante haben.) Eine Liste der internen Bezeichnungen der einzelnen Knotentypen,

sowie deren Eigenschaften sind in Tabelle 4.2 zu finden.

Page 30: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 23

Eine Besonderheit bietet sich noch bei der Auswahl der Knoten: Es kann berück-

sichtigt werden, mit welchen Knoten der auszuwählende Knoten verbunden ist. So

kann man nur Knoten auswählen, die vor/nach/inmitten einer Reihung bestimmter

Knoten(typen) mit bestimmten Eigenschaften liegen. Dazu lässt sich eine ganze

Kette an Knotentypen, verbunden mit einem ->, festlegen, die dem auszuwählenden

Knoten vorausgehen und/oder folgen. Der auszuwählende Knoten ist dabei mit

einem @ zu kennzeichnen.

(Beispiel: ForkNode[@in="1"] -> @ActionNode -> JoinNode[@out="1"]

Es werden alle Knoten vom Typ ActionNode ausgewählt, die als Vorgänger einen

Knoten vom Typ ForkNode besitzen, welcher genau eine Eingangskante hat, und

einen Nachfolgeknoten vom Typ JoinNode, welcher genau eine Ausgangskante

besitzt.)

Mit Hilfe von [contains variable variable_selection ] lassen sich die bereits

ausgewählten Knoten und Kanten nach dem Vorkommen einer (oder mehrerer)

Variablen durchsuchen. Sofern mindestens eine Eigenschaft eines Knotens oder einer

Kante eine der in variable_selection festgelegten Variablen enthält, wird diese(r)

ausgewählt. Variablen werden mit einem führenden $ identifiziert. Sollen mehrere

Variablen in variable_selection aufgeführt werden, so müssen die Variablen mit Kom-

ma getrennt aufgelistet werden.

Das Ergebnis der Auswahl ist eine Menge an Knoten und/oder Kanten, die die

genannten Bedingungen erfüllen.

4.2.2.2 Modifikation

Der zweite Teil einer Regel ist mindestens eine Aktion, die auf die im ersten Teil

ausgewählte Menge angewendet wird um diese zu modifizieren.

Syntax:

action

set property property_assignment

| replace variable variable_assignment

Das Schlüsselwort action leitet eine Modifikation aller im vorherigen Teil aus-

gewählter Knoten und Kanten innerhalb der Regel ein. Es können auch mehrere

Modifikationen auf dieselbe Auswahlmenge angewendet werden, dafür wird der

Page 31: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 24

Tabelle 4.2: Eigenschaften von Knoten und Kanten in einem UAD

Eigenschaft Beschreibung

Startknoten (InitialNode)

id Eindeutige (interne) ID-Nummer@out Anzahl der ausgehenden Kanten

Endknoten (FinalNode)Ablaufende (FlowFinalNode)

id Eindeutige (interne) ID-Nummer@in Anzahl der eingehenden Kanten

Aktion (elementar) (RootActionNode)Aktion (UML-Aktivität) (UMLActionNode)

id Eindeutige (interne) ID-Nummername Name der aufzurufenden Aktionallocated Zuweisung der Aktion an einen anderen Sensor-

knoten@in Anzahl der eingehenden Kanten@out Anzahl der ausgehenden Kanten

Entscheidung (DecisionNode)

id Eindeutige (interne) ID-Nummer@else 0 = keine Else-Kante, 1 = Else-Kante vorhanden@in Anzahl der eingehenden Kanten@out Anzahl der ausgehenden Kanten

Zusammenführung (MergeNode)Teilung (ForkNode)

Synchronisation (JoinNode)

id Eindeutige (interne) ID-Nummer@in Anzahl der eingehenden Kanten@out Anzahl der ausgehenden Kanten

Parametereingang (ActivityParameterInNode)Parameterausgang (ActivityParameterOutNode)

id Eindeutige (interne) ID-Nummername Name des Parameters@out Anzahl der ausgehenden Kanten

Kontrollfluss/Objektfluss

type ControlFlow für Kontrollfluss, ObjectFlowfür Objektfluss

from ID-Nummer des Quellknotensto ID-Nummer des Zielknotensguard Bedingung bei einer Entscheidunginputname Name des Objekts am Quellknoten (nur Objekt-

fluss!)outputname Name des Objekts am Zielknoten (nur Objekt-

fluss!)

Page 32: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 25

abgeschlossenen action-Anweisung eine weitere action-Anweisung angehängt.

Nach dem Schlüsselwort action muss die Art der Modifikation festgelegt werden.

Derzeit sind lediglich zwei Arten der Modifikation implementiert. Weitere Arten

können aber nachträglich durch Erweiterung der Grammatik um entsprechende

Schlüsselworte, sowie Einführung der dazugehörigen Abstract Syntax Tree (AST)-

Klassen, hinzugefügt werden.

Die Aktion set property weist den Knoten und Kanten der Auswahlmenge eine

Eigenschaft zu. Welche(r) Knoten/Kante welche Eigenschaften besitzt und welche

verändert werden können, ist in Tabelle 4.2 abzulesen. Wichtig: Alle Eigenschaften

mit einem führenden @ sind abgeleitete Eigenschaften. Diese ergeben sich aus den

Zuständen des Objekts und können logischerweise nicht verändert werden!

Mit replace variable lässt sich eine Variable durch einen vorgegebenen Wert

ersetzen. Dabei können sowohl Bedingungen hinter Entscheidungsknoten verändert

werden, als auch der Name einer Aktivität oder sogar Parameternamen. replace

variable durchsucht alle Eigenschaften eines Knotens/einer Kante und ersetzt

dort auftretende Variablen durch den zugeordneten Wert.

4.2.3 Regelparser/-grammatik

Um Veränderungsregeln, die in der in Abschnitt 4.2.2 festgelegten Regelsprache

verfasst wurden, erfolgreich einlesen, zerteilen und sinngemäß interpretieren zu

können, ist eine zur Regelsprache passende Grammatik und der dazugehörige Parser

notwendig. Mit Hilfe eines Parsergenerators kann der Parser aus einer entsprechend

beschriebenen Grammatik erstellt werden. Da es sich bei dem Sourcecode des Frame-

works um Java-Code handelt, wurde ein Parsergenerator aus der Java-Community

gewählt, dessen generierter Code zur Laufzeit ohne weitere Bibliotheken auskommt.

Die Wahl fiel auf JavaCC [16], obwohl einige kleinere Änderungen am Sourcecode

nötig waren, um die Kompatibilität mit der auf den Sun SPOTs laufenden Java-

Version zu gewährleisten. Folgende Änderungen mussten an JavaCC durchgeführt

werden:

• Die JavaVM der Sun SPOTs bietet keine Methode System.getProperty()

mit der Signatur String, String. Stattdessen wird nur die Methode mit der

Signatur String angeboten. Da der zweite String lediglich einen Standard-

wert festlegt, der zurückgegeben wird, sofern die angeforderte Eigenschaft

Page 33: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 26

Parser(Java-Code)

JavaCC

Schritt 3:Erweiterung der

JavaCC-Grammatik um Javacode für AST

Schritt 2:Umsetzen der Regeln in eine

JavaCC-Grammatik

Schritt 1:Theoretischer

Entwurf(Backus-Naur-Form)

Framework

Abbildung 4.1: Die notwendigen Schritte zur Entwicklung eines Parsers mit Hilfe vonJavaCC. Der von JavaCC erstellte Parser ist direkt in die Erweiterung des Frameworkseingebettet.

nicht vorhanden ist, lässt sich das gleiche Verhalten durch eine zusätzliche

if-Abfrage ersetzen.

• Die Schnittstelle java.io.Serializable befindet sich nicht in der Klas-

senbibliothek der JavaVM auf den Sun SPOTs. Die Implementierung dieser

Schnittstelle in der erzeugten Klasse Token kann hier jedoch ohne Probleme

entfernt werden.

• Als interne Liste wird die Klasse ArrayList verwendet. Diese Klasse ist

ebenfalls nicht in der Klassenbibliothek zu finden. Der Sourcecode wurde

hier so verändert, dass stattdessen die Klasse Vector verwendet wird. Hier-

bei waren einige weitere Änderungen nötig, da die Klasse Vector andere

Methodennamen verwendet, als die Klasse ArrayList. Beispielsweise die

Methode clear() zum Leeren der ArrayList, entspricht der Methode

removeAllElements() bei der Klasse Vector.

Der erste Schritt zum Parser nach Abbildung 4.1 ist die vollständige Spezifizie-

rung einer Grammatik, die die Regelsprache beschreibt. Konkret ergibt sich aus den

in Abschnitt 4.2.2 festgelegten Eigenschaften der Regelsprache folgende Grammatik

in einer (modifizierten) Backus-Naur-Form (Schritt 1):

rule -> find ( action )+ ";"

find -> "find" find_chainfind_chain -> find_expression ( "and" find_chain )?find_expression -> ( "*" | edge_selection? node_selection ) variable_selection?edge_selection -> "edge" edge_filter "of"edge_filter -> ( "*" | "in" | "out" ) select_properties?select_properties -> "[" select_property ( "," select_property )* "]"select_property -> PROPERTY "=" STRINGnode_selection -> "node" ( node_filter_chain1 | node_filter )node_filter_chain1 -> node_filter "->" node_filter_chain1 | node_filter_chain2node_filter_chain2 -> "@" node_filter node_filter_chain3?node_filter_chain3 -> "->" node_filter node_filter_chain3?node_filter -> ( "*" | NODE_NAME ) select_properties?

Page 34: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 27

variable_selection -> "contains" "variable" variable_filter_listvariable_filter_list -> VARIABLE ( "," variable_filter_list )?

action -> "action" ( action_set_property | action_replace_variable )action_set_property -> "set" "property" property_assignmentaction_replace_variable -> "replace" "variable" variable_assignmentproperty_assignment -> PROPERTY "=" STRINGvariable_assignment -> VARIABLE "=" STRING

Es handelt sich dabei erstmal um den theoretischen Entwurf dieser Grammatik. Für

die weitere Verwendung muss diese in eine andere Form gebracht werden.

Alle Werte in Anführungszeichen, sowie groß geschriebene Platzhalter, sind Termi-

nalsymbole. Alle klein geschriebenen Platzhalter sind Nichtterminale, welche mit

Hilfe von weiteren Regeln zu Terminalen aufgelöst werden können. Als Startsymbol

der Grammatik gilt das Nichtterminal rule.

Zur Beschreibung von Wiederholungen, Alternativen oder optionalen Ausdrücken,

werden, wie in der Theoretischen Informatik üblich, reguläre Ausdrücke [7] ver-

wendet. So werden mit | Alternativen abgegrenzt und die folgenden Quantoren

hinter einem Ausdruck verwendet, um mit * keine oder beliebig viele, mit + min-

destens eine, und mit ? eine oder keine, die Anzahl der möglichen Reihungen des

vorausgehenden Ausdrucks festzulegen.

Diese Produktionen der festgelegten Grammatik aus dem theoretischen Ansatz

lassen sich nun entsprechend des zweiten Schritts aus Abbildung 4.1, in einer Java-

ähnlichen Syntax von JavaCC schreiben, damit JavaCC daraus einen entsprechen-

den Parser erstellen kann. Aus der Produktion find_expression -> ( �*�|

edge_selection? node_selection ) variable_selection? wird

beispielsweise in der Syntax von JavaCC:

Listing 4.5: Schritt 2 nach Abbildung 4.1: Grammatik in JavaCC-Syntax

1 void findExpression () :2 {3 }4 {5 (6 <C_WILDCARD >7 |8 (9 edgeSelection ()

10 )?11 nodeSelection ()12 )13 (14 variableSelection ()15 )?16 }

Page 35: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 28

Terminale werden vorher explizit als TOKEN definiert und können mit der Verwen-

dung des festgelegten Namens in spitzen Klammern eingesetzt werden. So wird in

diesem Beispiel vorher das Terminal „*“ als <C_WILDCARD> definiert und kann mit

eben diesem Ausdruck verwendet werden.

Jede Produktion wird außerdem zu einer eigenen Java-Methode. Die Syntax ähnelt

der Definition einer solchen. Jedes verwendete Nichtterminal wird zu einem Me-

thodenaufruf mit nachgestelltem (). Einzig die Zeichen der Regulären Ausdrücke

bleiben wie und wo sie sind.

Hier ist es auch möglich Java-Code bei dem Zutreffen einer Regel auszuführen.

Dieser wird wie ein Java-Block, mit geschweiften Klammern von dem Code der

Grammatik separiert, an die entsprechende Stelle geschrieben. Dies ist notwendig

(siehe Schritt 3 in Abbildung 4.1) um den im nächsten Abschnitt beschriebenen

Regelbaum aufbauen zu können. Außerdem ist es möglich einer Regel einen Rück-

gabewert zuzuweisen. Dieser kann mit einer direkten Variablenzuweisung bei der

Definition einer Regel aufgefangen und verwendet werden. Ein Beispiel hierzu ist

der endgültige, allerdings leicht vereinfachte Ausschnitt aus der Grammatik für die

Produktion find_expression:

Listing 4.6: Schritt 3 nach Abbildung 4.1: Grammatik in JavaCC-Syntax mit Java-Code zum Erstellen des AST

1 /* Rückgabewert vom Typ ASTAbstractFilterNode */2 ASTAbstractFilterNode findExpression () :3 {4 /* Variablendeklarationen in Java */5 ASTAbstractFilterNode filter;6 ASTAbstractChainedFilterNode edgeFilter;7 ASTAbstractChainedFilterNode varFilter;8 }9 {

10 (11 <C_WILDCARD >12 {13 /* etwas Java -Code */14 }15 |16 (17 /* Zuweisen des Rückgabewertes von edgeSelection */18 edgeFilter=edgeSelection ()19 )?20

21 /* Zuweisen des Rückgabewertes von nodeSelection */22 filter=nodeSelection ()23

24 {25 /* Java -Code zum Umsortieren der Kantenauswahl */26 if(edgeFilter != null) {27 /* weiterer Java -Code (siehe Beispiel) */

Page 36: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 29

28 }29 }30 )31

32 (33 /* Zuweisen des Rückgabewertes v. variableSelection */34 varFilter=variableSelection ()35 {36 /* anderer Java -Code */37 }38 )?39

40 {41 /* Rückgabe des Wertes der Java -Variable filter */42 return filter;43 }44 }

4.2.4 Regelbaum

Die Grammatik und der mit Hilfe von JavaCC erzeugte Java-Code hat die Funktion

eine Eingabe entsprechend der Vorgabe der Grammatik zu zerteilen und einen AST

zu erzeugen. Intern erzeugt der Parser zuerst während des Parsens einen weiteren

Baum, wie in Abbildung 4.2 zu sehen (Dort wird die Eingabe find edge * of

node DecisionNode->@* action replace variable $var="wert"; ver-

arbeitet). Aus diesem internen Strukturbaum wird, mit Hilfe der eigenen Codestücke

innerhalb der JavaCC-Grammatik, der AST erzeugt. Der AST ist ein abstrakter Teil-

baum des internen Strukturbaums des Parsers, und ist damit eine objektorientierte

Repräsentation der Eingabe in Baumform. Es werden dort alle Schlüsselwörter,

welche zur Erhaltung der Bedeutung der Eingabe erforderlich sind, durch Objekte

repräsentiert und entsprechend miteinander verknüpft. Mit jeder Transformation in

die nächste Abstraktionsebene (Eingabe -> interner Strukturbaum -> AST) bleibt

die Bedeutung erhalten, jedoch wird dieser intern anders und größtenteils kompak-

ter repräsentiert.

Bei der Transformation vom internen Strukturbaum (Abbildung 4.2) zum AST (Ab-

bildung 4.3) ist es teilweise nötig die Reihenfolge einzelner Knoten zu vertauschen.

Dies ist deswegen erforderlich, weil die Grammatik zugunsten der Verständlichkeit

der Filterregeln, einen etwas anderen Aufbau des entstehenden internen Struktur-

baums hat als der AST. Mit Hilfe des Java-Codes innerhalb der Grammatik ist diese

Umsortierung möglich. Ein Beispiel hierfür ist der Java-Code aus Listing 4.6 zum

Umsortieren einer Kantenauswahl:

Page 37: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 30

Listing 4.7: Beispiel: Java-Code zum Umsortieren einer Kantenauswahl (ein Aus-schnitt aus Listing 4.6)

1 /* Java -Code zum Umsortieren der Kantenauswahl */2 if(edgeFilter != null) {3 /* sofern eine Kantenauswahl vorhanden */4 ASTAbstractChainedFilterNode filter2;5 if(edgeFilter instanceof ASTFilterPropertiesNode) {6 filter2 = (ASTAbstractChainedFilterNode)edgeFilter.↘

→getChildFilterNode ();7 } else {8 filter2 = edgeFilter;9 }

10

11 /* umsortieren */12 filter2.setChildFilterNode(filter);13 filter = edgeFilter;14 }

Das Ergebnis ist, dass der linke Ast von find_expression in Abbildung 4.2 vor

den rechten Ast gezogen wird, und im AST in Abbildung 4.3 genau so zu finden ist.

Eine Übersicht aller Klassen, welche in einem AST verwendet werden können,

und deren Beziehungen zueinander, ist in Abbildung 4.4 zu sehen.

AbstractVisitor Alle Klassen des AST implementieren die Schnittstelle

AbstractVisitor, welche in Abschnitt 4.2.1 eingeführt wurde. Dies ist essenziell,

da jeder Knoten des AST zum Anwenden der einzelnen Regeln auf diese Weise

besucht wird, und somit seinen Teil der Funktionalität an der gesamten Regel

anwenden kann.

ASTRuleSet Eine Eingabe kann aus mehr als einer Regel bestehen. Die Klasse

ASTRuleSet sammelt eine Menge an Regeln, welche durch Objektinstanzen der

Klasse ASTRule repräsentiert werden, und führt diese sequenziell aus.

Von der Klasse ASTRuleSet ist stets nur eine Objektinstanz vorhanden. Sie ist die

Wurzel des AST und wird von der Regel ruleset der Grammatik zurückgegeben,

welche auch gleichzeitig das Startsymbol der Grammatik ist.

ASTRule Jede Regel wird durch ein eigenes Objekt der Klasse ASTRule repräsen-

tiert und wird von der Regel rule der Grammatik zurückgegeben.

ASTAbstractActionNode Kindklassen der abstrakten Klasse

ASTAbstractActionNode sind für die Aktionen zuständig, die eine Filterregel auf

Page 38: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 31

KW_F

IND

findKW_E

DGE

edgeC_W

ILDCARD

*KW_O

Fof

KW_N

ODE

nodeS_D

ESCRIPTOR

DecisionN

odeC_S

INGLE

_ARROW

->C_M

ARKER

@C_W

ILDCARD

*KW_A

CTION

actionKW_R

EPLA

CE

replaceKW_V

ARIABLE

variableS_V

ARIABLE

$varC_E

QUAL

=C_S

EMICOLO

N;

node_filter

node_filter_chain2

node_filternode_filter_chain1

node_filter_chain1edge_filter

node_selectionedge_selection

find_expressionvariable_assignm

ent

S_S

TRING

"Wert"

action_replace_variablefind_chain

findaction

rule

Abbildung 4.2: Ein Beispiel für einen internen Strukturbaum des Parsers. Blau sindalle Nichtterminale, rule ist das Startsymbol, Grau sind alle Terminalen und Schwarzam unteren Rand die dazugehörige Eingabe.

Page 39: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 32

ASTRule

ASTFilterEdgesOfNodeNode

ASTFilterNodeSelectorNodeASTFilterNodeSelectorNode

ASTFilterBaseNode

ASTActionReplaceVariable

1

2

3

5

9

6

7

4

810

Abbildung 4.3: Der AST zum Strukturbaum von Abbildung 4.2 mit der Aufrufrei-henfolge der einzelnen Knoten. Der farblich markierte Teil ist in Abbildung 4.6 imDetail dargestellt.

die Menge an Knoten und Kanten, welche von der Regel nach Abschnitt 4.2.2.1 aus-

gewählt wurden, anwendet. Dabei gibt es, wie in Abschnitt 4.2.2.2 aufgeführt, die

Aktion set property, welche durch die Klasse ASTActionSetProperty implemen-

tiert, sowie die Aktion replace variable, welche durch die Klasse

ASTActionReplaceVariable implementiert wird.

ASTAbstractFilterNode Kindklassen sind für die, wie in Abschnitt 4.2.2.1 erwähn-

te, Auswahl an Knoten und Kanten zuständig. Es besteht dabei die Möglichkeit,

nachdem alle Objekte einer Aktivität besucht wurden, eine Ergebnismenge der auf

die Auswahlkriterien zutreffenden Knoten und Kanten in Form einer Enumeration

zu erhalten.

ASTFilterBaseNode Dies ist die einzige direkte Kindklasse des

ASTAbstractFilterNode. Sie ist immer ein Blatt eines AST und liefert die Grund-

menge an Knoten und Kanten, welche durch die Angabe des Schlüsselwortes node

(nur Knoten) oder der Wildcard * (sowohl Knoten als auch Kanten) bestimmt wird.

ASTAbstractChainedFilterNode Abgeleitet von der ASTAbstractFilterNode

ist diese abstrakte Klasse eine Erweiterung, um innere Knoten in einem AST beschrei-

Page 40: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 33

+visit()

«interface»AbstractV

isitor

ASTAbstractA

ctionNode

+evaluate()

+addR

esult()+clearR

esult()+em

ptyResult()

ASTAbstractF

ilterNode

+getC

hildFilterN

ode()+setC

hildFilterN

ode()+evaluate()

ASTAbstractC

hainedFilterN

ode

+visit()

+addA

ssignment()

ASTActio

nReplaceV

ariab

le

+visit()

+addP

roperty()

ASTActio

nSetP

roperty

+visit()

ASTFilterB

aseNode

+visit()

+evaluate()

ASTFilterM

ergeNode

+visit()

+addV

ariable()

ASTFilterC

ontain

sVariab

leNode

+visit()

ASTFilterE

dgesO

fNodeNode

+visit()

+setN

odeType()

+setLeftF

ilterNode()

+setR

ightFilterN

ode()+evaluate()

ASTFilterN

odeSelecto

rNode

+visit()

+addP

roperty()

ASTFilterP

ropertiesN

ode

+visit()

+evaluate()

+addA

ction()

ASTRule

+visit()

+addR

ule()

ASTRuleSet

Abbildung 4.4: Verwendete Klassen zur Repräsentation eines AST und deren Bezie-hungen

Page 41: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 34

ben zu können. Sie besitzt zu diesem Zweck Methoden, um den untergeordneten

Teilbaum des AST festlegen oder auslesen zu können. Alle folgenden Filterklassen

sind Kindklassen dieser abstrakten Klasse.

ASTFilterMergeNode Das Schlüsselwort and verknüpft die Ergebnismengen zwei-

er Auswahlregeln. Es werden jeweils beide Teilbäume des AST, und somit bei-

de Auswahlregeln, ausgewertet und die Vereinigungsmenge gebildet. Duplikate

sind damit ausgeschlossen. Ein Teilbaum kann allerdings auch mit einem weiteren

ASTFilterMergeNode beginnen, was der Fall ist bei mehr als einer Verwendung

von and.

ASTFilterContainsVariableNode Die Schlüsselwörter contains variable, gefolgt

von einer Liste von Variablen, können die Menge an Knoten und/oder Kanten

dezimieren. Jedes Element der Menge wird nach dem Vorkommen mindestens

einer der angegebenen Variablen untersucht. Es werden nur die Elemente in die

Ergebnismenge übernommen, die diese Variable(n) enthalten.

ASTFilterEdgesOfNodeNode Die Schlüsselwörter edge ... of beschreiben eine

Transformation der Menge an Knoten in eine Ergebnismenge an Kanten. Mit Hilfe

der Schlüsselwörter in, out oder der Wildcard *, bei der hier mit ... abgekürzten

Kantenauswahl, wird festgelegt, welche Kanten der Knoten in die Ergebnismenge

übernommen werden. Auch hier wird wieder die Vereinigungsmenge aller nach den

Kantenauswahlregeln selektierten Kanten gebildet, damit es zu keiner Duplikatbil-

dung kommt.

ASTFilterPropertiesNode Diese Klasse ist für die Prüfung und Filterung der Eigen-

schaften bei der Knoten- und/oder Kantenauswahl zuständig. Eingeleitet durch die

Schlüsselzeichen [...] werden alle Vergleichsbedingungen als kommagetrennte Liste

innerhalb der eckigen Klammern aufgelistet. Es werden nur Knoten und Kanten in

die Ergebnismenge übernommen, für die alle aufgelisteten Eigenschaften existieren

und die festgelegten Bedingungen erfüllt sind.

ASTFilterNodeSelectorNode Die Regeln sehen vor, Knoten auch durch ganze Ket-

ten an Knoten spezifizieren und selektieren zu können. Dies bedarf bei dieser Klasse

Page 42: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 35

ModifikationSelektion Menge anKnoten & Kanten

Abbildung 4.5: Aufteilung eines AST und Mengenbewegung

zusätzlicher Arbeit. Zentraler Ausgangspunkt ist der letztendlich auszuwählende

Knoten. Markiert wird dieser in einer Auswahlregel mit dem @, sofern die Regel

eine Auswahlkette verwendet. Die Klasse besitzt zu diesem Zweck zwei Referenzen

auf Teilbäume, die die Auswahlkette jeweils „vor“ und „nach“ dem aktuellen Knoten

repräsentieren.

Für jeden Knoten wird hier zuerst eine Menge aller Vorgänger erstellt, diese an

den „linken“ Nachbarn in der Auswahlkette übergeben und das Ergebnis betrach-

tet. Sofern es einen „linken“ Nachbarn gibt und die Ergebnismenge nicht leer ist,

oder kein „linker“ Nachbar existiert, wird der gleiche Vorgang mit dem „rechten“

Nachbarn und allen Nachfolgern des aktuellen Knotens durchgeführt. Ist auch diese

Ergebnismenge nicht leer, oder existiert kein „rechter“ Nachbar, so wird der Knoten

in die Ergebnismenge übernommen.

4.2.5 Ablauf

Nachdem der Parser seine Arbeit beendet hat bleibt der in Abschnitt 4.2.4 beschrie-

bene AST übrig, welcher die eigentliche Aufgabe zur Veränderung eines UADs nach

den in der Eingabe vorgegebenen Regeln ausführt. Dieser ist, wie in Abbildung 4.5

zu sehen, in zwei Teile aufgeteilt: Die Selektion und die Modifikation. Bei beiden

Teilen handelt es sich um einen Teilbaum, genauer gesagt um (mindestens) einen

vollständigen Ast des AST.

Selektion Die Selektion ist genau ein vollständiger Ast des AST. Es gibt pro Regel

genau eine Menge an Knoten und Kanten die ausgewählt werden kann. Diese Menge

wird in dem Ast des AST, der für die Auswahl zuständig ist, bestimmt. Dazu wird der

erste Teil der Regel aus Abschnitt 4.2.2.1 verwendet, welcher mit dem Schlüsselwort

find eingeleitet wird. Dieser beschreibt genau welche Knoten und Kanten in die

Page 43: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 36

Auswahlmenge fließen und wird durch den Teilbaum im AST repräsentiert. Es findet

also auch intern, in der abstrakten Form, genau die gleiche Abgrenzung zwischen

Selektion und Modifikation statt, wie bei der Regelsprache selbst.

In Abbildung 4.6 ist in einer schematischen Darstellung dargestellt, wie die

Auswahl der Menge an Knoten und Kanten mit Hilfe des AST erstellt wird. Jeder

Knoten des AST besitzt eine Ergebnismenge, welche im Zuge der Auswertung gefüllt

wird, und hat zudem Zugriff auf die Ergebnismenge aller direkten Kindknoten,

sofern es sich bei dem Knoten nicht um einen Blattknoten handelt.

Der AST ist so aufgebaut, dass die Auswertung Top-down nach dem Prinzip der

Tiefensuche erfolgen muss, damit die einzelnen Knoten in der korrekten Reihenfolge

durchlaufen werden und sich die endgültige Ergebnismenge am Wurzelknoten

des AST befindet. Um diese zu erstellen wird rekursiv vom Wurzelknoten aus die

Befüllung der Ergebnismenge des Kindknotens angefordert. Dies geschieht, wie in

Abbildung 4.6 dargestellt, über die Methode evaluate() und wird, um auch eine

Eingangsmenge zum Verarbeiten vorzufinden, durch einen rekursiven Aufruf bis zu

den Blattknoten durchgeführt. Ist die Ausführung der Methode beendet, so steht

dem Vorgängerknoten die Ergebnismenge bereit, und dieser kann alle Elemente,

die sich in der Ergebnismenge befinden, über die Methode accept()/visit()

besuchen, und damit der Regel entsprechend die eigene Ergebnismenge befüllen.

Nachdem der gesamte Ast der Selektion besucht und verarbeitet wurde, kann der

Wurzelknoten die Menge an Knoten und Kanten aus der Ergebnismenge des ersten

Knotens extrahieren und bei Bedarf an die Äste für die Modifikation weitergeben.

Modifikation Alle weiteren Äste des AST sind Äste, die zur Modifikation der aus

der Selektion erhaltenen Menge dient. Jeder AST besitzt mindestens einen Modifi-

kationsast. Wie bei der Selektion wird die Modifikation bei einer Regel ebenfalls mit

einem Schlüsselwort eingeleitet. Dies ist action und kann in einer Regel mehrfach

verwendet werden. Dadurch werden, abhängig von der Anzahl der verwendeten

action-Schlüsselwörter, mehrere Äste im AST zur Modifikation erzeugt und diese

werden nacheinander, in der bei der Regel verwendeten Reihenfolge, auf die Ergeb-

nismenge der Selektion durchlaufen.

Ein Modifikationsast im AST besteht (derzeit) nur aus einem einzigen Blattknoten.

Dieser implementiert, wie in der Klassenübersicht in Abbildung 4.4 dargestellt,

Page 44: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 37

ASTKnoten

ASTKnoten(Blatt)

visit()

visit()

evaluate()

evaluate()

Ergebnismenge

Ergebnismenge

Abbildung 4.6: Ablauf der Selektion in einem AST, der rot markierte Ausschnitt ausAbbildung 4.3. Der Aufruf erfolgt rekursiv bis zum Blattknoten des AST, welcherdas Rekursionsende ist.

Page 45: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 38

Filterregel

Parser

ASTUADvorher

UADnachher

ActivityManager

Abbildung 4.7: Überblick des Ablaufs bei der Anwendung einer Filterregel auf einUAD.

die Methoden der Schnittstelle AbstractVisitor. Die Elemente der übergebe-

nen Menge werden dort nacheinander von dem entsprechenden Knoten über die

visit()-Methode besucht und modifiziert.

4.2.6 Schnittstelle

Eine konkrete Anwendung der neuen Erweiterung des Frameworks wurde für diese

Arbeit nicht definiert, daher ist eine offene Schnittstelle implementiert, um auf

die Erweiterung zur Veränderung von UADs an nahezu jeder Stelle des Frame-

works zugreifen zu können. Die Schnittstelle ist in Form einer eigenen Klasse

namens ActivityManager im Paket de.fau.i7.acoowee.core.uml.rules

ausgeführt.

Eine Instanz von ActivityManager kann mit einem bereits geparsten UAD,

durch Übergabe eines Activity-Objekts, oder aber durch ein noch zu parsendes

UAD, durch Übergabe eines Reader-Objekts, welches eine UAD-Datei liefert, erzeugt

werden. Im letzteren Fall wird dieses zuerst geparst und das daraus resultierende

Activity-Objekt intern abgelegt. Nun bietet der ActivityManager diverse Me-

thoden an, um dieses intern referenzierte Activitiy-Objekt zu modfizieren oder

darauf zuzugreifen:

Page 46: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 39

• public ActivityManager(Reader r)

Konstruktor: Erzeugt ein Activity-Objekt aus einer UAD-Datei und legt die

Referenz auf dieses intern ab. (Parsen der UAD-Datei)

• public ActivityManager(Activity activity)

Konstruktor: Legt die Referenz auf das Activity-Objekt intern ab.

• public Activity getActivity()

Erhalten der in diesem ActivityManager abgelegten Referenz auf das

Activity-Objekt.

• public void exportActivity(Writer w)

Zurückschreiben des Speicherabbildes eines UADs in eine UAD-Datei. (Die

Funktionsweise wird in Abschnitt 4.3 erklärt)

• public void renameActivity(String name)

Umbenennen eines UADs, und somit auch umbenennen des Activity-Objekts.

• public void modifyActivity(String s)

Veränderung eines UADs mit Hilfe der in dem String s aufgelisteten Regeln.

• public void modifyActivity(Reader r)

Veränderung eines UADs mit Hilfe der, in der zu Reader r gehörenden Datei,

aufgelisteten Regeln.

• public ActivityManager cloneActivity()

Eine Kopie der aktuellen Instanz von ActivityManager erzeugen mit allen

seinen Inhalten.

• public ActivityManager cloneActivity(String name)

Eine Kopie der aktuellen Instanz von ActivityManager erzeugen mit allen

seinen Inhalten, und anschließend den Namen name zuweisen.

Die Möglichkeit ein UAD zu verändern ist also mit Hilfe der Schnittstelle auf die

einfachste Weise reduziert worden und hat gleichzeitig den Vorteil eine Application

Programming Interface (API) nach „außen“ hin anzubieten, die immer die gleiche

Zugriffsmöglichkeit bietet, auch wenn sich intern die Programmteile der neuen

Erweiterung verändern. Eine Übersicht zum internen Ablauf ist in Abbildung 4.7

zu finden: Der ActivityManager bekommt ein UAD, und Filterregeln, welche auf

Page 47: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

4.2 Regelbasierte Veränderungen im Framework 40

das UAD angewendet werden sollen, übergeben. Intern kümmert sich dieser darum,

dass die Filterregeln geparst und auf das UAD angewendet werden. Anschließend

kann das veränderte UAD ausgegeben werden.

4.3 Veränderung/Optimierung durch Besucher

Eine weitere Möglichkeit der Optimierung eines UADs ist das Entfernen von un-

nötigen bzw. unerreichbaren Abschnitten innerhalb des Diagramms. So können

sich zum Beispiel Knoten und Kanten in einer Aktivität befinden, die jedoch keine

Verbindung zu einem Startknoten besitzen. Diese Knoten und Kanten können nie-

mals vom Interpreter erreicht werden. Es ist daher auch vollkommen unnötig diese

Knoten und Kanten in der entsprechenden UAD-Datei aufzubewahren. Dieser Fall

tritt derzeit jedoch nur durch Unaufmerksamkeit des Erstellers des UADs auf. In

einer Weiterentwicklung des Filter-Frameworks ist auch eine Aktion geplant, die

semantische Veränderungen an einem UAD durchführen kann: Also Knoten oder

Kanten ersetzen oder löschen. Dies kann auch zu dem genannten Effekt führen.

Zu diesem Zweck wurde ein weiterer Besucher, der UADExportVisitor, geschaf-

fen, der eine (veränderte) Aktivität wieder in XML-Form ausgeben kann. Um dabei

auch wirklich nur die Knoten und Kanten zu verarbeiten und auszugeben, die durch

den Interpreter erreichbar sind, verhält sich der Benutzer genau wie der Interpreter:

Er läuft von allen Startknoten aus alle möglichen Verbindungen ab und sammelt

dabei eine Liste an Knoten und Kanten, die er auf dem Weg erreichen konnte. Diese

Liste an Knoten und Kanten wird letztendlich ausgegeben. Damit werden keine

Knoten und Kanten mehr in der UAD-Datei abgelegt, die nicht vom Interpreter er-

reichbar sind. Es verkleinert sich die UAD-Datei also, sofern das UAD unerreichbare

Teile enthielt, auf die tatsächlich notwendige Größe.

Page 48: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Kapitel 5

Beispiele & Anwendungen

5.1 Beispiele

Beispiel 1: Einfaches Auswählen und Ersetzen von Aktivitätsnamen

In dem in Abbildung 5.1 abgebildeten Beispiel, welches auf dem vom Lehrstuhl

üblicherweise verwendeten UAD NetTemp [17] basiert, soll der Name aller Aufrufe

der Aktivität SpotTemp in NeuTemp geändert werden. Die betroffenen Elemente

sind in Abbildung 5.1 rot markiert.

Um das gewünschte Ziel zu erreichen ist folgende Regel erforderlich:

find node UMLActionNode[name=�SpotTemp�]

action set property name=�NeuTemp�;

Die Auswahl der nötigen Knoten erfolgt alleine durch die Spezifikation des Kno-

tentyps (UMLActionNode) und dessen Eigenschaften ([name=�SpotTemp�]).

Die selektierten Knoten werden daraufhin mit Hilfe des Befehls set property

name=�NeuTemp� wie gewünscht modifiziert.

Beispiel 2: Suchen und Ersetzen von Variablen

In Abbildung 5.2 dargestellt, wurden diesmal zwei Variablen in dem UAD eingesetzt,

$actname und $temp, welche zur Laufzeit durch einen Aktivitätsnamen und eine

Entscheidungstemperatur ersetzt werden sollen.

Um das gewünschte Ziel zu erreichen ist folgende Regel notwendig:

find * contains variable $actname, $temp

action replace variable $actname=�SpotTemp�

41

Page 49: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

5.1 Beispiele 42

find node UMLActionNode[name="SpotTemp"]action set property name="NeuTemp";

Abbildung 5.1: Beispiel 1: Einfaches Auswählen und Ersetzen von Aktivitätsnamen

Page 50: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

5.1 Beispiele 43

[result>=$temp]

find * contains variable $actname, $tempaction replace variable $actname="SpotTemp"action replace variable $temp="30.0";

Abbildung 5.2: Beispiel 2: Suchen und Ersetzen von Variablen

Page 51: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

5.1 Beispiele 44

find node DecisionNode->@*->FinalNodeaction set property name="Dummy";

Abbildung 5.3: Beispiel 3: Definition von Auswahlketten

action replace variable $temp=�30.0�;

Die Auswahl wird durch das Auftreten der gesuchten Variablen getroffen. Es wird

nach beiden Variablen gesucht und diese anschließend durch die vorgegebenen

Werte ersetzt.

Beispiel 3: Definition von Auswahlketten

Bei dieser Regel sollen, wie in Abbildung 5.3 zu sehen, zwei Aufrufe einer Aktivität

ausgewählt und verändert werden. Wie diese verändert werden, ist in diesem

Beispiel nicht relevant: Es wird exemplarisch der Name der aufzurufenden Aktivität

verändert.

Page 52: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

5.1 Beispiele 45

Es gibt verschiedene Möglichkeiten diese Knoten auszuwählen. Hier wird die Eigen-

schaft ausgenutzt, dass sich diese beiden Knoten direkt vor einem Endknoten und

hinter einem Entscheidungsknoten befinden. Anhand dieser Bedingungen werden

die beiden Knoten ausgewählt. Dazu wird folgende Regel verwendet:

find node DecisionNode->@*->FinalNode

action set property name=�Dummy�;

Durch die Auswahlkette DecisionNode->@*->FinalNode werden alle Knoten

ausgewählt die zwischen einem Entscheidungsknoten und einem Endknoten sind.

Dies ist auch mit jeder anderen Kombination möglich. Es können auch längere

Ketten spezifiziert werden und zudem noch Eigenschaften der einzelnen Knoten als

Auswahlbedingung hinzugefügt werden.

Beispiel 4: Kanten auswählen und verändern

Zuletzt soll die rot markierte Kante in Abbildung 5.4 ausgewählt und verändert

werden. Dabei soll der Parametername am Eingang des Zielknotens von val4 zu

val5 geändert werden.

Bei diesem Beispiel wird die Möglichkeit der Kettenauswahl von Knoten aus Beispiel

3 verwendet. Zuerst werden alle Aktivitäten aus Beispiel 1 selektiert, mit Hilfe der

Kantenauswahl wird aus allen ausgehenden Kanten dieser Knoten die gewünschte

Kante ausgewählt. Folgende Regel führt die Auswahl durch:

find edge out[outputname=�val4�] of node ForkNode->@*

action set property outputname=�val5�;

Alle hier aufgeführten Beispiele dienen lediglich zur Demonstration einzelner Funk-

tionen. Es ist auch möglich diese Funktionen sinnvoll miteinander zu kombinieren.

5.2 Anwendungen

Für die Erweiterung des Frameworks um die Funktion der Modifikation von Ak-

tivitäten gibt es zahlreiche praktische Anwendungsmöglichkeiten. Durch die in

Abschnitt 4.2.6 festgelegte Schnittstelle ist die Erweiterung an jeder Stelle des

Page 53: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

5.2 Anwendungen 46

find edge out[outputname="val4"] of node ForkNode->@*action set property outputname="val5";

Abbildung 5.4: Beispiel 4: Kanten auswählen und verändern

Page 54: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

5.2 Anwendungen 47

Frameworks einsetzbar.

Derzeit wird die Modifikation nach dem eigentlichen Lade- und Parsevorgang eines

UADs ausgeführt. Dies ist eine von vielen Möglichkeiten, die lediglich zur Demons-

tration und zu Testzwecken implementiert wurde. Interessant ist vor allem zuerst

die Frage zu welchen Zwecken in der Praxis Modifikationen an UADs durchgeführt

werden können und sollen. Die beiden gewichtigsten Verwendungszwecke sind die

Möglichkeit der Generalisierung und anfallende Veränderungen der Umgebung.

Generalisierung bedeutet im Blick auf die UADs die Herstellung von universellen

UADs, welche an die Umgebungsbedingungen angepasst werden. Diese universellen

UADs sind in einer Form, in der sie von dem Interpreter des Frameworks nicht

ausgeführt werden können, da sie Variablen enthalten. Ein Beispiel hierfür ist in

Abbildung 5.2 (Beispiel 2 in Abschnitt 5.1) aufgeführt. Diese Variablen werden vor

dem Starten des Interpreters mit Hilfe der Regeln modifiziert, sodass die Variablen

durch sinnvolle Werte ersetzt werden. Die ersetzenden Werte sind jedoch abhängig

von den in dem jeweiligen Sensorknoten gespeicherten Ersetzungsregel(n) und

damit den Umgebungsbedingungen. Variablen können an allen möglichen Stellen

in einem UAD eingesetzt werden: Bedingungen für Entscheidungen (oder Teile

davon), Namen von aufzurufenden Aktivitäten, Namen von Objektflüssen oder

Adressen zur entfernten Ausführung von Aktivitäten. Jeder Sensorknoten kann diese

Variablen also individuell ersetzen und damit das UAD entsprechend an die eigenen

Bedürfnisse und Umgebungsbedingungen anpassen.

Veränderungen der Umgebung können sich auf verschiedenste Art und Weise

ergeben: Ein Sensorknoten in der Nachbarschaft ist ausgefallen, dieser ist jedoch

für die Ausführung wichtig, da auf ihm Aktivitäten entfernt ausgeführt werden. Der

ausgefallene Sensorknoten wird durch einen neuen Knoten ersetzt, welches jedoch

die Anpassung der Adressen zur entfernten Ausführung der Aktivität auf diesem

Knoten notwendig macht. Ein weiteres Szenario ist, gerade in der Entwicklungszeit

des Frameworks, die Änderung des Namens einer (Root-)Aktivität - womöglich nur

auf einzelnen Sensorknoten. Ohne die Möglichkeit, den Namen einer auszuführen-

den Aktivität noch zur Laufzeit in einem UAD ersetzen zu können, müsste für jeden

Sensorknoten mit der veränderten Aktivität das UAD manuell angepasst, konvertiert

und übertragen werden. Die Ersetzungsregeln erlauben diese Veränderung zur Lauf-

Page 55: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

5.2 Anwendungen 48

zeit, ohne das UAD manuell anpassen zu müssen.

Kleine Fehler treten immer wieder in Programmen auf. Dies kann bei größeren

Mengen an Sensorknoten, mit womöglich noch (leicht) unterschiedlichen Varianten

des verwendeten UADs, zu hohem Aufwand in der Fehlerbehebung führen. Bisher

war es notwendig, das UAD im Modellierungstool zu korrigieren, anschließend er-

neut zu transformieren und auf die Sensorknoten zu verteilen. Einfacher ist es, den

Fehler mit Hilfe von Filterregeln zu beheben, indem das fehlerhafte UAD modifiziert

und damit korrigiert wird. Durch geschicktes Wählen der Filterregel(n) ist es oftmals

sogar möglich den gleichen Fehler in veränderten Varianten des UADs zu finden und

zu beheben.

Desweiteren können UADs nicht nur nach dem Laden und Parsen modifiziert

werden, sondern auch bei bestimmten Ereignissen. So lassen sich Ersetzungsregeln

auf ein UAD anwenden, welches gerade per Funk an den lokalen Knoten übertragen

wurde. Dank der Erweiterung des Frameworks im Zuge der Studienarbeit von

Büttner [18] wird auch die permanente Speicherung eines solchen modifizierten

UADs möglich. Ebenso kann auch ein UAD vor dem Weiterversenden an einen

anderen Knoten modifiziert werden.

Als Erweiterung ist auch noch vorgesehen, die Modifikation durch eine Root-Aktivität

auszulösen. Dies würde die Veränderung eines beliebigen UADs sowohl lokal, als

auch auf einem entfernten Sensorknoten, durch ein UAD selbst erlauben. Leider ist

eine Umsetzung zum aktuellen Zeitpunkt nicht möglich, da das Framework (noch)

keine Übergabe von statischen Parametern, also die Übergabe eines Dateinamens

oder womöglich sogar ganzer Regeln, für eine Aktivität erlaubt und spezifiziert.

Page 56: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Kapitel 6

Zusammenfassung

Vor dieser Studienarbeit gab es in dem Framework des Lehrstuhls keinerlei Möglich-

keit ein UAD zur Laufzeit zu verändern. Wollte man kleine Änderungen durchführen,

so musste dies über die UML-Modellierungssoftware geschehen, das UAD anschlie-

ßend transformiert und auf den Sensorknoten überspielt werden.

Mit dieser Arbeit wurde die Möglichkeit eingeführt, Eigenschaften einzelner Ele-

mente eines UADs zur Laufzeit anhand von Regeln zu verändern. Zu diesem Zweck

wurde eine eigene Regelsprache definiert, mit welcher sich alle möglichen Änderun-

gen ausdrücken lassen. Die Regelsprache ist dabei in zwei Teile geteilt: Die Auswahl

von Elementen und anschließend die Veränderung der ausgewählten Elemente. Als

Auswahlmöglichkeit lassen sich sowohl Eigenschaften von Knoten und Kanten, das

Vorkommen von Variablen, als auch deren Vorgänger oder Nachfolger spezifizieren.

Als Veränderung ist das Festlegen von Eigenschaften oder das Ersetzen von Variablen

möglich.

Durch die Möglichkeit des Ersetzens von Variablen ist eine Generalisierung von UADs

möglich, welche von dem einzelnen Sensorknoten entsprechend angepasst werden.

Dabei werden Variablen eingesetzt, welche von den Sensorknoten individuell ersetzt

werden. Es lässt sich damit auch schnell auf mögliche Veränderungen, sowohl der

physikalischen, als auch der programmtechnischen Umgebung reagieren. Außerdem

lassen sich kleinere Fehler einfach und mit geringerem Aufwand korrigieren.

Zum schnellen Zugriff auf die neuen Funktionen im Framework wurde eine ein-

fach zu bedienende Schnittstelle geschaffen, die dem Programmierer erlaubt eine

Veränderung jedes beliebigen UADs an jede Stelle des Frameworks, ohne großen

Aufwand, einzufügen.

49

Page 57: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

6 Zusammenfassung 50

Zusätzlich wurden zwei Maßnahmen ergriffen um die Dateigröße von UADs (ge-

ringfügig) zu verkleinern: Die Transformation eines UADs wurde angepasst, sodass

die transformierten Dateien, je nach Größe des UADs, um einige Byte kleiner sind.

Außerdem werden, sofern der Ersteller eines UADs Elemente eingebaut hat, welche

niemals erreichbar sind, diese bei einer Veränderung entfernt.

Im Ausblick auf mögliche Erweiterungen, wurde die Regelsprache so entworfen, dass

neue Funktionen mit einfachen Schritten eingefügt werden können. Außerdem wä-

ren kleinere semantische Änderungen, wie zum Beispiel das Entfernen oder Ersetzen

von Knoten, als zusätzliche Funktion, denkbar. Es bieten sich auch zahlreiche Ereig-

nisse im Framework an, bei denen eine Veränderung angestoßen werden könnte.

Dies eröffnet dem Entwickler ganz neue Möglichkeiten, da sich beispielsweise UADs

vor dem Versenden an andere Sun SPOTs innerhalb des Sensornetzes verändern

lassen, und damit eine gewisse selbstständige Anpassung der UADs möglich wird.

Page 58: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Abkürzungsverzeichnis

API Application Programming Interface

AST Abstract Syntax Tree

RDF Resource Description Framework

UAD UML2-Aktivitätsdiagramm

UADs UML2-Aktivitätsdiagramme

UML Unified Modeling Language

XMI XML Metadata Interchange

XML Extensible Markup Language

XSLT Extensible Stylesheet Language Translation

51

Page 59: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Abbildungsverzeichnis

3.1 Sun SPOTs neben einer AA-Batterie . . . . . . . . . . . . . . . . . . . . . 10

3.2 Die Grundelemente eines UML2-Aktivitätsdiagramms. . . . . . . . . . 12

3.3 Entscheidungen in einem UAD. . . . . . . . . . . . . . . . . . . . . . . . . 12

3.4 Parallelität in einem UAD. . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.5 Objektflüsse in einem UAD. . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4.1 Die notwendigen Schritte zur Entwicklung eines Parsers mit Hilfe von

JavaCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

4.2 Ein Beispiel für einen internen Strukturbaum des Parsers. . . . . . . . 31

4.3 Der AST zum Strukturbaum von Abbildung 4.2. . . . . . . . . . . . . . 32

4.4 Verwendete Klassen zur Repräsentation eines AST. . . . . . . . . . . . 33

4.5 Aufteilung eines AST und Mengenbewegung . . . . . . . . . . . . . . . 35

4.6 Ablauf der Selektion in einem AST. . . . . . . . . . . . . . . . . . . . . . 37

4.7 Ablauf bei der Anwendung einer Filterregel auf ein UAD. . . . . . . . 38

5.1 Beispiel 1: Einfaches Auswählen und Ersetzen von Aktivitätsnamen . 42

5.2 Beispiel 2: Suchen und Ersetzen von Variablen . . . . . . . . . . . . . . 43

5.3 Beispiel 3: Definition von Auswahlketten . . . . . . . . . . . . . . . . . . 44

5.4 Beispiel 4: Kanten auswählen und verändern . . . . . . . . . . . . . . . 46

52

Page 60: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Tabellenverzeichnis

2.1 Abstraktionsschichten eines UADs . . . . . . . . . . . . . . . . . . . . . . 6

3.1 Java-Klassen zur Repräsentation von Knoten und Kanten in einem UAD 15

4.1 Auswahlgründe für die Regelsprache . . . . . . . . . . . . . . . . . . . . 21

4.2 Eigenschaften von Knoten und Kanten in einem UAD . . . . . . . . . . 24

53

Page 61: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Literaturverzeichnis

[1] G. Fuchs and R. German, “Uml2 activity diagram based programming of wire-

less sensor networks,” in SESENA ’10: Proceedings of the 2010 ICSE Workshop

on Software Engineering for Sensor Network Applications. New York, USA-NY:

ACM, 2010, pp. 8–13.

[2] OMG Object Management Group, “OMG Unified Modeling Language (OMG

UML), Superstructure, V2.1.2,” OMG Available Specification without Change

Bars formal/2007-11-02, 2007.

[3] M. L. Crane and J. Dingel, “Towards a uml virtual machine: implementing an

interpreter for uml 2 actions and activities,” in CASCON ’08: Proceedings of

the 2008 conference of the center for advanced studies on collaborative research.

New York, USA-NY: ACM, 2008, pp. 96–110.

[4] OMG Object Management Group, “Semantics of a Foundational Subset for

Executable UML Models (FUML), FTF - Beta 2,” OMG Available Specification

without Change Bars ptc/2009-10-05, Oct. 2009.

[5] C. Damm, “Implementierung und Bewertung eines RDF-basierten Frameworks

zur Interpretierung und Ausführung von UML2-Aktivitätsdiagrammen auf

Sensorknoten,” Diplomarbeit, University of Erlangen-Nuremberg, Computer

Science, Chair for Computer Networks and Communication Systems; Germany,

Sep. 2008.

[6] I. F. Akyildiz, W. Su, Y. Sankarasubramaniam, and E. Cayirci, “A Survey on

Sensor Networks,” IEEE Communications Magazine, vol. 40, no. 8, pp. 102–116,

August 2002.

[7] U. Hedtstück, Einführung in die Theoretische Informatik. Oldenbourg Wis-

sensch.Vlg, 2007.

54

Page 62: Regelbasierte syntaktische Veränderung von ausführbaren ... · Regelbasierte syntaktische Veränderung von ausführbaren UML2-Aktivitätsdiagrammen auf Sensorknoten am Beispiel

Literaturverzeichnis 55

[8] S. Microsystems, “Sunspotworld - general faq,” http://www.sunspotworld.

com/docs/general-faq.html [web: 2010/10/22].

[9] ——, “The squawk virtual machine,” http://labs.oracle.com/projects/squawk/

squawk-rjvm.html [web: 2010/10/22].

[10] S. Gérard, “Papyrus UML,” http://www.papyrusuml.org/ [web: 2010/10/22].

[11] B. Oestereich, Die UML 2.0 Kurzreferenz für die Praxis, 4th ed. Munich, DE-BY:

Oldenbourg Wissenschaftsverlag GmbH, 2005.

[12] D. Veillard, “The xsltproc tool,” http://www.xmlsoft.org/XSLT/xsltproc2.html

[web: 2010/10/22].

[13] S. Haustein, “kXML,” http://kxml.sourceforge.net/ [web: 2010/10/22].

[14] E. Gamma, R. Helm, R. Johnson, and J. M. Vlissides, Design Patterns: Elements

of Reusable Object-Oriented Software. Addison-Wesley Professional, 1994.

[15] F. Müllmerstadt and G. Kuhlmann, SQL: Der Schlüssel zu relationalen Daten-

banken. rororo Verlag, 1999.

[16] “Java compiler compiler (javacc) - the java parser generator,” http://javacc.

dev.java.net/ [web: 2010/10/22].

[17] G. Fuchs, C. Damm, and R. German, “Poster: Programming Wireless Sensor

Networks using UML2 Activity Diagrams,” in The Fifth International Conference

on Intelligent Sensors, Sensor Networks and Information Processing (ISSNIP

2009), PhD/ECR Forum, Melbourne, AU-VIC, Dec. 2009.

[18] L. Büttner, “Erweiterung eines auf UML2-Aktivitätsdiagrammen beruhenden

Programmier-Frameworks für drahtlose Sensornetze um dynamische, profilba-

sierte Reprogrammierung,” Studienarbeit, Lehrstuhl Informatik 7 (Rechnernet-

ze und Kommunikationssysteme), Universität Erlangen-Nürnberg, Erlangen,

DE-BY, (in Arbeit).


Recommended