Seite auswählen

Schlagwort: Diplomarbeit

UUIDs im EMF-Modell verwenden

Die Referenzierung erfolgt in der XML/XMI-Repräsentation eines EMF-generierten Modells standardmäßig über XPath Ausdrücke (hm, stimmt das? wo hab ich das denn gelesen?). <packagedElement xsi:type=”KobrA2SUM.Structure:K2ComponentClass” name=”TravelBookingSystem”> <generalization general=”#//BookingSystem”/> <!– … –> </packagedElement> <packagedElement xsi:type=”KobrA2SUM.Structure:K2ComponentClass” name=”TravelBookingSystem”> <!– … –> </packagedElement> Hieraus ergibt sich der Nachteil, dass ein SUM-View-Mapping der Modellelemente nur zu Programmlaufzeit sichergestellt werden kann. Ändert man zum Beispiel den Namen der Komponente “BookingSystem” in der View “offline” und möchte dann die Änderung in das SUM importieren, ist die nicht mehr korrekt möglich, da kein passendes Mapping mehr erfolgen kann. Vor allem hinsichtlich einer kollaborativen Entwicklung ergeben sich Schwierigkeiten, die ohne künstliche IDs nicht zu umgehen sind. Aus diesem Grund gibt es die Möglichkeit UUIDs zu verwenden. Da diese bei EMF-generierten Modellen standardmäßig nicht vorgesehen sind, ist ein kleiner Eingriff des Programmierers in den erzeugten Code notwendig. Wie das funktioniert habe ich vor allem durch einen Artikel von Seweryn Niemiec erfahren: How To Enable UUID In EMF Generated Model […] Folgende Änderungen brachten mich zum Ziel: Die Klasse KobrA2SUMResourceFactoryImpl erweitert org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl Die Klasse KobrA2SUMResourceImpl erweitert org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl Außerdem wurde die Methode useUUIDs() der Klasse KobrA2SUMResourceImpl überschrieben: /* (non-Javadoc) * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#useUUIDs() */ @Override protected boolean useUUIDs() { return true; } Schließlich erhielt ich ein Modell, das UUIDs verwendet und auch über diese referenziert. <packagedElement xsi:type=”KobrA2SUM.Structure:K2ComponentClass” xmi:id=”_5F2l0CKuEd654_10FfizxA” name=”TravelBookingSystem”> <generalization xmi:id=”_5F96kCKuEd654_10FfizxA” general=”#_5H7CYSKuEd654_10FfizxA”/> <!– … –> </packagedElement> <packagedElement xsi:type=”KobrA2SUM.Structure:K2Class” xmi:id=”_5H7CYSKuEd654_10FfizxA” name=”BookingSystem”> <!– … –>...

Weiterlesen

SUM->SpecificationStructuralServiceView Transformation

Heute möchte ich meine vorgehensweise zur SUM->View Transformation anhand von Pseudocode erläutern. Die Java-Implementierung ist etwas komplexer, doch im Kern spiegelt der Pseudocode meine programmatische Umsetzung wieder. Noch ein paar Hintergrundinformationen, bevor es zur Sache geht: Im Prinzip geht es darum, ein KobrA2-Modell (SUM), für das ich ein auf MDT UML basiertes Metamodell erstellt habe, in ein UML-Modell (View) zu transformieren. Dabei sollen speziell für die sogenannte SpecificationStructuralServiceView der KobrA2-Methode nur die «subject»-Komponente mit ihren public Attributen und Methoden, alle «acquired» Komponenten samt public Attributen und Methoden, sowie alle Generalisierungen (rekursiv) der Komponenten mit public Attributen und Methoden aus dem SUM extrahiert werden. Bis jetzt gehe ich davon aus, dass ich zusätzlich noch die verwendeten “Types” transformieren muss, obwohl in der KobrA2-Methode eine eigene View für die verwendeten Types vorgesehen ist. Doch während ich eben darüber nachgedacht habe, kann es sein, dass es ausreicht auf die Elemente im SUM zu referenzieren, falls sie nicht für die Transformation vorgesehen sind. Ob und inwieweit dies möglich ist, muss ich allerdings noch untersuchen. Nun zum Eingemachten :) SUM->View Pseudocode Der Hauptteil ist eigentlich ganz simpel. Und auch die folgenden ausgelagerten Funktionen sollten eigentlich selbsterklärend sein … k2s = select subject in SUM s = addComponentClass(k2s) apply stereotype «subject» to s . k2aCCs = select acquired componentClasses in SUM for each k2cc in k2aCCs: cc = addComponentClass(k2cc) a = add association between s...

Weiterlesen

KobrA2 Metamodellierung

Endlich melde ich mich nach etwas längerer Pause mit einem neuen Artikel zurück. In der Zwischenzeit ist auch das eine oder andere geschehen, auch hinsichtlich meiner Diplomarbeit. Heute möchte ich mich dem Thema “Metamodellierung” widmen: Grundlage: Jan’s Diplomarbeit Grundlage dieses Teils meiner Arbeit war diesmal vor allem die Diplomarbeit von Jan Kadathukalam, der in den Abschnitten 3.1 und 3.3 die benötigten theoretischen Hintergrund erläutert. Aus seiner praktischen Arbeit habe ich das auf MDT UML2 basierte KobrA2 Metamodell verwendet und an meine Anforderungen angepasst. Diese Anpassungen sind in erster Linie das Umbenennen der Packages, das Ausgliedern der Elemente K2Model und K2Package sowie die Erweiterung des Package Structure (ehemals StructureClasses) um die voraussichtlich für meine Arbeit benötigten Elemente des KobrA2 Metamodells. Erweiterung des UML-Metamodells Die Aufgabenstellung meiner Diplomarbeit fordert die Erzeugung eines simplen Metamodells, so dass die in erster Linie geforderten Transformationen (SUM->View und View->SUM) realisiert werden können. Eine Erweiterung des UML-Metamodells liegt quasi auf der Hand. Da die Views selbst mit einer Lightweight Erweiterung der UML (durch Profile/Stereotypen) umgesetzt werden sollen, war mein erster Gedanke natürlich, auch das Metamodell des SUM über die Lightweight Extension zu realisieren, so dass das Quell- und Zielmodell der Transformationen im Prinzip das selbe Metamodell haben. Der Lehrstuhl allerdings propagiert die Erstellung eines eigenen KobrA2-Metamodells, so dass letztendlich nur eine Middle- oder Heavyweight Extension der UML in Frage kommt, wenn man die Vorteile der Metamodellierung...

Weiterlesen

Konzept zur Programmierung

In den letzten Tagen habe ich mir nach den bisher gewonnenen Erkenntnissen unter anderem ein grobes Konzept überlegt, wie eine Programmierung der Transformationen in Java aussehen könnte, das ich im Folgenden vorstellen möchte. Sehen wir uns zunächst den Inhalt des von mir modellierten Package “views” an: Zu Grunde liegt eine abstrakte Klasse Generation, deren Instanzen das Ergebnis aus von dem SUM ausgehenden Transformationen (-> ViewGenerations) repräsentieren. In den Attribute dieser Klasse werden zum einen die Repräsentation der .uml-Datei (umlFile) und zum anderen die Information, ob diese Datei verändert wurde, gespeichert (isModified). Diese Klasse wird wiederum von einer abstrakten Klasse View erweitert, die die Informationen zu der Darstellung der Daten, die in einer .umldi-Datei gespeichert werden, kapselt (umldiFile). Schließlich wird die eben genannte Klasse nochmals erweitert. Die erweiternden Klassen repräsentieren schließlich die tatsächlichen Sichten (z.B. SpecificationClassServiceView und SpecificationClassTypeView). Die eben vorgestellten Elemente werden in dem zweiten modellierten Package “transformation” verwendet, das etwas komplizierter aufgebaut ist: Ausgangselement dieses Package ist das generische Interface ViewGenerator. In Abhängigkeit des Parameters TGeneration, der die Klasse Generation erweitern muss, wird über die Methode generate() eine View aus dem SUM erzeugt. Als Parameter muss hierbei die Repräsentation der Zieldatei übergeben werden. Das Gegenstück zu dieser Methode, die die Transformation von SUM zu View repräsentiert, ist merge(). Hier wird die als Methodenparameter übergebene View wieder mit dem SUM zusammengeführt. Dieses Interface wird von einer abstrakten Klasse AbstractViewGenerator...

Weiterlesen

Artikel zu meiner Diplomarbeit

Wie ihr sehen könnt, veröffentliche ich in der letzten Zeit immer wieder Artikel zu meiner Diplomarbeit. Diese sind zunächst einmal mit einem Passwort geschützt, um die Inhalte nur einem kleinen Kreis zugänglich zu machen. Ein Grund dafür ist, dass diese Artikel Auszüge meiner Diplomarbeit enthalten können. Somit dient mir der Blog zur Zeit als Art DA-Tagebuch und Sketchbook. Ich halte Informationen fest, berichte über neue Erkenntnisse und den Fortschritt meiner praktischen Arbeit. Die Idee dahinter ist, nach dem praktischen Teil viele Informationen und eine gute Grundlage für die schriftliche Ausarbeitung zu haben. Nach Beendigung meiner DA werde ich alle (oder zumindest den Großteil) der DA-Artikel der öffentlichkeit zugänglich machen. Falls du das nicht abwarten kannst, dich meine DA interessiert und/oder der Meinung bist, auch zu dem kleinen Kreis der “Auserwählten” zu gehören, frag mich einfach nach dem Passwort...

Weiterlesen

org.eclipse.uml2 – Erste Schritte und Erfolge

Mir war einige Zeit unklar, wie ich beginnen soll, auf programmatischem Weg eine .uml-Datei mittels des UML2-Plugins von Eclipse zu erzeugen. Zunächst einmal ein paar Infos zu Eclipse-UML2: UML2 is an EMF-based implementation of the Unified Modeling Language (UMLTM) 2.x OMG metamodel for the Eclipse platform. The objectives of the UML2 component are to provide a useable implementation of the UML metamodel to support the development of modeling tools a common XMI schema to facilitate interchange of semantic models test cases as a means of validating the specification validation rules as a means of defining and enforcing levels of compliance For more details on UML2, see the Wiki. Quelle: http://www.eclipse.org/modeling/mdt/?project=uml2Erste Schritte – aber wie? Ein hilfreicher Artikel war Getting Started with UML2, der auf zwei Wegen erklärt, wie man eine .uml-Datei mit Elementen wie Package, Class, etc. … erstellt; namlich einmal per mitgeliefertem Editor, bei dem die UML-Elemente in einer Baumstruktur angezeigt werden – so wie man das auch aus vielen grafischen Modellierungseditoren kennt – und einmal per Java-Code. “Per Java-Code” war genau das was ich gesucht habe. Nachdem ich mir die Code-Schnipsel und Erklärungen angesehen hatte, stellte sich mir die Frage, wie ich das selbst nachbauen konnte. Ich erstellte in Eclipse also ein neues Java-Projekt und fügte einfach mal einen Code-Schnipsel in die main(String[] args)-Methode ein. Natürlich meckerte Eclipse sofort, da es ja Klassen wie z.B. “Model” nicht...

Weiterlesen

XML-Datei parsen und XPath-Selektion erfolgreich

Wie verwende ich XPath in einem Java-Programm? Diese Frage stellte ich zunächst Tante Gurgel und fand den IBM-Artikel, den ich im vorigen Post bereits erwähnt hatte. Nach der Anleitung des IBM-Artikels habe ich zunächst ein neues Java-Projekt in Eclipse erstellt und im Projekt-Ordner eine Datei books.xml abgelegt, die folgenden Inhalt hat: <?xml version=”1.0″ encoding=”UTF-8″?> <inventory>   <book year=”2000″>     <title>Snow Crash</title>     <author>Neal Stephenson</author>     <publisher>Spectra</publisher>     <isbn>0553380958</isbn>     <price>14.95</price>   </book>     <book year=”2005″>     <title>Burning Tower</title>     <author>Larry Niven</author>     <author>Jerry Pournelle</author>     <publisher>Pocket</publisher>   <isbn>0743416910</isbn>     <price>5.99</price>   </book>     <book year=”1995″>     <title>Zodiac</title>     <author>Neal Stephenson</author>     <publisher>Spectra</publisher>     <isbn>0553573862</isbn>     <price>7.50</price>   </book>     <!– more books… –>   </inventory> Anschließend übernahm ich den Code aus Listing 4 in eine neu erstellte java-Datei (FirstTest.java): package de.budisantoso.da.test;   import java.io.IOException;   import javax.xml.parsers.*; import javax.xml.xpath.*;   import org.w3c.dom.*; import org.xml.sax.SAXException;   /** * @author adi * */ public class FirstTest {     /**   * @param args   * @throws ParserConfigurationException   * @throws IOException   * @throws SAXException   */   public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {     DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();     domFactory.setNamespaceAware(true); // never forget this!     DocumentBuilder builder = domFactory.newDocumentBuilder();     Document doc = builder.parse(“books.xml”);       XPathFactory xpFactory = XPathFactory.newInstance();     XPath xpath = xpFactory.newXPath();       try {       XPathExpression expr = xpath.compile(“//book /title/text()”);       Object result = expr.evaluate(doc, XPathConstants.NODESET);       NodeList nodes = (NodeList) result;       for (int i = 0; i < nodes.getLength(); i++) {         System.out.println(nodes.item(i).getNodeValue());       }     } catch (XPathExpressionException e) {       // TODO Auto-generated catch block       e.printStackTrace();     }   }...

Weiterlesen

Model-Transformation mittels Java und XPath?

Meine Idee für die programmatische Transformation aus dem Single-Underlying-Model (SUM) in eine View (z.B. Structural Specification) ist eine Kombination aus Java und XPath. Für die Rücktransformation habe ich mir bis dato aber noch keine Gedanken gemacht. Unter der Annahme, dass das SUM im XMI-Format gespeichert ist, könnte ich über XPath die Teile des XML-Baums filtern, die ich für die Transformation benötige. Dies kann dann per Java-Code weiterverarbeitet werden und daraus ein neues Model erzeugt werden, das dann wiederum in eine XMI-Datei serialisiert wird. http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Getting_Started_with_UML2/article.html http://www.ibm.com/developerworks/library/x-javaxpathapi.html Ich werde diesen Ansatz testen, indem ich zunächst versuchen werde, aus einer XMI-Datei mit zwei Klassen eine zu selektieren und diese in die neue .uml-Datei zu schreiben. @Dietmar, Benjamin: Was haltet ihr...

Weiterlesen

Eclipse – Welches Package eignet sich für meine DA?

Heute habe ich mich dazu entschlossen für meine DA eine “neue” Eclipse-Installation zu verwenden. Auf der Downloadseite hatte ich dann die Qual der Wahl: Eclipse IDE for Java Developers Eclipse IDE for J2EE Developers Eclipse IDE for C/C++ Developers (kam natürlich nicht in Frage) Eclipse IDE for RCP/Plugin Developers Eclipse Modeling Tools (includes incubating components) Eclipse IDE for Java and Report Developers (schied ebenfalls spontan aus, da ich keine Report-Unterstützung benötige) Eclipse Classic 3.4.1   Für mich kamen schließlich die Eclipse IDE for RCP/Plugin Developers und die Eclipse Modeling Tools (includes incubating components) in die engere Auswahl. Zur Zeit läuft gerade der Download für die Eclipse Modeling Tools, die ich mir als erstes ansehen möchte. Ich denke für die ersten Schritte dürfte das die bessere Wahl sein. Fehlende Features könnte ich zu einem späteren Zeitpunkt auch...

Weiterlesen

CaseStudy für die DA – Szenario und Beschreibung

Für meine DA benötige ich eine Fallstudie, wozu mir ein fiktives, einfach strukturiertes Ticketing-System (aka Task-Tracking-System oder Help-Desk-System) dient, das ich hier beschreiben möchte: Szenario Ein Ticketing-System findet zum Beispiel im User-Support eines Software-Herstellers Anwendung. Grundsätzlich können zwei Benutzergruppen eines solchen Systems identifiziert werden. Auf der einen Seite die Benutzer der Software (= Kunden des Softwareunternehmens), die in diesem Szenario entweder Probleme bei der Bedienung oder Anforderungen bezüglich Customizing/Features haben. Auf der anderen Seite gibt es die Mitarbeiter des Softwareunternehmens, die sich um die Probleme und Anforderungen der Kunden kümmern. Beschreibung Auf der Kundenseite sieht die Interaktion mit dem System wie folgt aus: Ein Kunde erstellt eine Anfrage über eine nicht näher definierte Schnittstelle (eine solche Schnittstelle könnte zum Beispiel ein Mail-System oder eine Webapplikation sein) und erzeugt damit automatisch ein Ticket. Das System teilt dem Kunden dann über eine Nachricht (OutgoingMessage) seine Ticket-Nummer mit. Mit dieser Ticket-Nummer kann der Kunde dann zu einem späteren Zeitpunkt weitere Nachrichten (IncomingMessage) an das System schicken, die dann dem Ticket zugeordnet werden können. Auf der Seite des Softwareherstellers bedienen dann Mitarbeiter (=Benutzer) das System. Das System, das bei jeder Anfrage ein neues Ticket erzeugt, erzeugt zeitgleich eine initiale Aufgabe, die einem zuvor definierten Standard-Benutzer sowie dem erstellten Ticket zugeordnet wird. Diese initiale Aufgabe lautet in etwa “Anfrage bearbeiten”. Der Standard-Benutzer ist somit beauftragt, sich um die Anfrage zu kümmern. Anhand der Inhalts...

Weiterlesen
Wird geladen