Microsoft Visio + oAW = Microsoft DSL Tools?

In der nächsten Version der Visio-EMF-Brücke wird es neben dem Export von Modellen auch ein Adapter für openArchitectureWare geben. In diesem Beitrag wollen wir bereits vorab den als oAW-Komponente implementierten Adapter anhand eines Anwendungsfalls vorstellen. Dabei soll aus einem Visio-UML-Klassendiagramm mit Hilfe von XPand entsprechender Java-Code generiert werden.

Die Ausgangssituation in unserem Beispiel ist ein leeres oAW-Projekt und ein Visio-UML-Klassendiagramm, was mit dem Visio-UML-Stencil von Pavel Hruby erstellt worden ist. Die folgende Abbildung zeigt dieses Modell im Eclipse mit einem oAW-Projekt.

UML-Klassendiagramm in Visio

UML-Klassendiagramm in Visio

Zum Schreiben des XPand-Templates empfiehlt es sich zunächst, das Modell und das dazugehörige Stencils mit der Visio-EMF-Brücke zu importieren. Dadurch kann dem Template das Metamodell vorher schon bekannt gemacht werden, was bspw. bei der Navigation durch das Modell hilfreich ist. Die folgenden zwei Abbildungen zeigen das importierte Stencil und Visio-Modell als EMF-Metamodell bzw. EMF-Modell. Das EPackage „VisioModel“ stellt ein generisches Metamodell für beliebige Visio-Modelle dar. Dies ermöglicht den Zugriff auf beliebige Visio-Modelle unabhängig von ihren Stencil-Elementen. Das dazugehörige Sub-EPackage spezialisiert das generische EPackage, indem es entsprechende Stencil-Elemente hinzufügt. Dadurch können bspw. nur Stencil-spezifische Elemente abgefragt werden.

Visio-UML-Stencil als EMF-Metamodell

Visio-UML-Stencil als EMF-Metamodell

Visio-UML-Klassendiagramm als EMF-Modell

Visio-UML-Klassendiagramm als EMF-Modell

Nachdem die Struktur des EMF-Metamodells bekannt ist, kann das XPand-Template definiert werden. Einstiegspunkt des Templates (siehe Zeile 3) ist eine Visio-Zeichenfläche auf der sich ein UML-Modell befindet. Für jede UML-Klasse auf einer Zeichenfläche wird der Template-Block „Class“ (siehe Zeile 10) aufgerufen. In diesem Template-Block wird für jede UML-Klasse eine Datei mit entsprechender Java-Klasse erzeugt. Für jedes Attribut der UML-Klasse wird eine Variable mit Getter- und Setter-Methoden angelegt (siehe Zeile 13-28). Die UML-Attribute befinden sich in einem Shape mit dem Namen „Sheet.9“, welches sich in dem UML-Klassen-Shape befindet (siehe Zeile 13-14).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
«IMPORT metamodel»
 
«DEFINE main FOR VisioModel::Visio_Page»
  «EXPAND Class FOREACH this.visio_containedShapes»
«ENDDEFINE»
 
«DEFINE Class FOR VisioModel::Visio_SimpleShape»
«ENDDEFINE»
 
«DEFINE Class FOR VisioModel::UML_2_2_Symbols_Visio_2007_::Class»
  «FILE this.visio_text + ".java"»
    public class «this.visio_text» {
    «FOREACH this.visio_containedShapes.select(e|
             e.visio_masterShapeName.matches("Sheet.9")) AS attribute»
       «LET attribute.visio_text.split(":").last() AS type»
       «LET attribute.visio_text.split(":").first() AS name»
       private «type» «name»;
 
       public «type» get«name.toFirstUpper()»() {
         return «name»;
       }
 
       public void set«name.toFirstUpper()»(«type» «name») {
         this.«name»=«name»;
       }
       «ENDLET»
       «ENDLET»
     «ENDFOREACH»
    }
  «ENDFILE»
«ENDDEFINE»

Das Template kann jetzt im Workflow eingebunden und ausgeführt werden. Der folgende Ausschnitt zeigt die Verwendung der Visio-EMF-Komponente im Workflow. Die Komponente wird über die Klasse org.infai.visio.emf.bridge.oaw.VisioModelReader eingebunden. Als Eingabe-Parameter werden die Visio-Modell-Datei und die dazugehörige Stencil-Datei übergeben. Ausgabe-Parameter sind modelSlot und metamodelSlot. Diese beiden Slots können im weiteren Verlauf des Workflows verwendet werden (bspw. in der XPand-Komponente, die das oben gezeigte Template ausführt).

<component class="org.infai.visio.emf.bridge.oaw.VisioModelReader">
  <visioModelFile value="${visioModelFile}"/>
  <visioStencilFile value="${visioStencilFile}"/>
  <modelOutputSlot value="modelSlot"/>
  <metamodelOutputSlot value="metamodelSlot"/>
</component>

Als Ergebnis der Transformation entstehen die nachfolgenden Java-Klassen. Im Weiteren wäre die Generierung von Assoziationen möglich, wobei dies in diesem Beispiel wegelassen wurde, um das Beispiel so einfach wie möglich zu gestalten.

public class Book {
 
  private String title;
  private int pages;
 
  public String getTitle() {
    return title;
  }
 
  public void setTitle(String title) {
    this.title = title;
  }
 
  public int getPages() {
    return pages;
  }
 
  public void setPages(int pages) {
    this.pages = pages;
  }
}
 
public class Library {
 
  private String name;
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
}
 
public class Writer {
 
  private String name;
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
}

Durch die Integration von Microsoft Visio und oAW mit Hilfe der Visio-EMF-Brücke und dem dazugehörigen oAW-Adapter wird eine sehr praktische und mächtige Lösung geschaffen, die die Modellierung mit Visio und die anschließende Modellverarbeitung mit oAW ermöglicht. In Bezug auf die Überschrift könnte man (provokant) behaupten, dass man dadurch die Funktionalität der Microsoft DSL Tools nachbildet. In Sachen Modellierung sind Visio und die DSL Tools gleichwertige Konkurrenten. Was die Modellverarbeitung betrifft ist oAW klar im Vorteil gegenüber den DSL Tools. So bieten die DSL Tools mit ihrer T4-Engine lediglich die Möglichkeit zur Modell-zu-Text-Transformation. Hingegen bietet oAW u.a. zusätzlich die Möglichkeit zur Modell-zu-Modell-Transformation. Man könnte also auch das „=“-Zeichen durch ein „≥“-Zeichen austauschen.

Dieser Beitrag wurde unter Allgemeines abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">