Free your work. Wir wollen Ihnen die Freiheit geben, sich auf Ihr Geschäft zu konzentrieren.



Ähnliche Dokumente
Model Driven Architecture Best Practices

Model Driven Development im Überblick

Vortrag von: Ilias Agorakis & Robert Roginer

Free your work. Free your work. Wir wollen Ihnen die Freiheit geben, sich auf Ihr Geschäft zu konzentrieren.

Große Übung Praktische Informatik 1

Code-Erzeugung aus UML-Klassendiagrammen

WhiteStarUML Tutorial

Java: Vererbung. Teil 3: super()

Model Driven Architecture (MDA)

ActiveCharts. Verknüpfung von Modellen und Code bei der modellgetriebenen Softwareentwicklung mit UML 2.0

Copyright 2014 Delta Software Technology GmbH. All Rights reserved.

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Java Einführung Abstrakte Klassen und Interfaces

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Einführung in Generatives Programmieren. Bastian Molkenthin

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Model Driven Architecture Praxisbeispiel

Einführung in modellgetriebene Softwareentwicklung. 24. Oktober 2012

Model Driven Architecture

Einführung in die Java- Programmierung

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Erfolg ist programmierbar.

Kompetenz. rund um. Ihren. Entwicklungsprozess. Über uns. Technische Software. Modellbasierter Test. Prüfplätze. Automatisierung.

Software Engineering Klassendiagramme Einführung

Software Entwicklung II (SS12)

SEA. Modellgetriebene Softwareentwicklung in der BA

Generatives Programmieren

Lösungsvorschlag für Übungsblatt 6 Software Engineering 1 (WS 2012/13)

Objektorientierte Programmierung

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Einführung in die Programmierung

Definition von domänenspezifischen Sprachen mit Xtext: Einführung. 19. November 2014

Erfolg ist programmierbar.

Inhalt. Motivation Techniken des MDE. Fallbeispiele

Viele gute Stellen sind frei. Besetzen Sie eine.

Ein hierarchischer, modellgetriebener Ansatz zur Codegenerierung. R. Gitzel, M. Schwind

Was ist EMF? Wie wird EMF eingesetzt? Was ist ecore? Das Generatormodell Fazit

Model-Driven Development in Scrum-Projekten

Einführung in Eclipse und Java

Konzeption und Realisierung eines logikbasierten Anfragewerkzeugs für UML-Modelle

Client-Server-Beziehungen

Programmieren ohne Programmierer Das GeneSEZ Generator Framework. Gerrit Beine

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Software Engineering Klassendiagramme Assoziationen

Model Driven SOA Modellgetriebene Entwicklung von SOA Anwendungen. OOP München,

Referenzarchitekturen und MDA 1

Dr. Hanno Schauer Mons-Tabor-Gymnasium Montabaur. UML-Klassendiagramme als Werkzeug im Unterricht

WIRTSCHAFTSINFORMATIK

Test-Driven Design: Ein einfaches Beispiel

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Metamodellbasierte Codegenerierung in Java

Die MID ModellierungsMethodik M³ ein Baukasten für Produktlinien. Andreas Ditze, MDD & PL 2009, Leipzig,

Vorlesung "Software-Engineering"

Ein Erfahrungsbericht beim Einsatz von generierenden Ansätzen im Vergleich zu generischen Lösungen

Programmieren in Java

Modellgetriebene Softwareentwicklung

Software Engineering II

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Praktische Übung 'JUnit-Test'

Individuelle Erweiterung des generierten Codes. 16. Januar 2013

Softwaretechnik (Allgemeine Informatik) Überblick

Systemdenken und Gestaltungsmethodik System-Modellierung

Innovator 11 classix. Java Reverse Engineering. HowTo. Ralph Schönleber.

Einführung in die Programmierung für Wirtschaftsinformatik

IBM Software Demos Rational Software Delivery Platform - Änderungen an Design und Architektur einer Anwendung

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Innere Klassen in Java

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Objektbasierte Entwicklung

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Java Einführung Collections

Modellgetriebene Entwicklungsprozesse in der Praxis - eine Bestandsaufnahme. Tillmann Schall, anaptecs GmbH

Innovator 11 classix. Enterprise JavaBeans (EJB) für JBuilder. Connect. Alexander Borschet.

Ein subjektiver Vergleich zwischen SSIS und Kettle mit Ausblick auf die Generierung von BI-Lösungen

SEW Übung EMFText. 1 Aufgabe. 2 Domänenbeschreibung. 3 Installation von Eclipse/EMFText. 4 Schritt-für-Schritt Anleitung. 4.

SWE5 Übungen zu Software-Engineering

Javakurs zu Informatik I. Henning Heitkötter

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

INNOVATOR im Entwicklungsprozess

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Codegenerierung am Beispiel des PIMAR-Projekts PhoneBook. 14. Januar 2015

4. AuD Tafelübung T-C3

Prinzipien Objektorientierter Programmierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Modellbasierte Softwareentwicklung

Programmierkurs Java

Übung: Verwendung von Java-Threads

Typumwandlungen bei Referenztypen

Grundkonstrukte der Objektorientierung in Java, C# und C++

Objektorientierte Programmierung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Es war einmal... "StudyING: Welten bewegen - Welten gestalten"

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

A Domain Specific Language for Project Execution Models

Softwareentwicklungsprozess im Praktikum. 23. April 2015

Probeklausur Softwareengineering SS 15

Transkript:

Free your work.

Free your work. Wir wollen Ihnen die Freiheit geben, sich auf Ihr Geschäft zu konzentrieren.

Design und Implementierung von Codegeneratoren Am Beispiel der MDA-Suite XCoder Dipl.-Inf. Constantin Szallies

Warum MDA? Softwareentwicklung automatisieren! Zwei orthogonale Ansätze kombinieren: Codegenerierung: Berücksichtigung von Cross cutting concerns z. B. Getter/Setter Beschreibung auf einer höheren Abstraktionsebene! Reuse / Frameworks / Vererbung 4

Softwareentwicklung mit der MDA Generierter Quellcode Modellierung Generator Binärcode Individueller Code = nicht automatisierte Bearbeitung Compiler 5

Konsequentes Forward Engineering Modellierung Generierung Ergänzen des individuellen Codes Modell und Code jederzeit synchron! Ermöglicht die Erstellung eines Modells auf höherer Abstraktionsebene! Roundtrip Engineering bedeutet: Modell und Code äquivalent 6

Die XCoder-Suite Wiederverwendbare Komponenten und anpassbare Standard-Generatoren Open Source: http://sourceforge.net/projects/xcoder In Projekten von Liantis verwendet und weiterentwickelt, wenn Standard-Lösungen ungeeignet Das komplette Framework ist vollständig modelliert und generiert sich selbst: MDA 2 Leichtgewichtig, schnell und einfach zu erweitern 7

XCoder-Architektur (hier: für C++) Modell-Transformation Instanz UML-Metamodell- C++-Metamodell- Instanz XMI-Export XMI-Reader Generate Model.xml C++ Sources C++ Sources C++ Quellen 8

Platform Independent Model (PIM) <<entity>> Rechnung summe : Money +rechnungen 1 0..* +kunde <<entity>> Kunde name : String getsaldo() : Money <<primitive>> Money <<primitive>> String <<enumeration>> KundenArt PRIVAT GESCHAEFTLICH 9

Platform Specific Model (PSM) Durch Transformation des PIM erzeugt <<EJBLocalInterface>> Rechnung <<EJBLocalMethod>> getkunde() : test.kunde <<EJBLocalMethod>> setkunde(p : test.kunde) : void KundenArt PRIVAT : int = 0 GESCHAEFTLICH : int = 1 <<EJBLocalInterface>> Kunde <<EJBLocalMethod>> getsaldo() : java.math.bigdecimal <<EJBLocalMethod>> getrechnungenint() : java.util.collection <<EJBLocalMethod>> addtorechnungen(p : test.rechnung) : void <<EJBLocalMethod>> removefromrechnungen(p : test.rechnung) : void <<EJBLocalMethod>> getrechnungen() : java.util.collection <<EJBEntityLocalHomeInterface>> RechnungHome <<EJBEntityLocalHomeInterface>> KundeHome <<EJBCreateMethod>> create() : test.rechnung <<EJBFinderMethod>> findbyprimarykey(pk : java.lang.object) : test.rechnung <<EJBCreateMethod>> create() : test.kunde <<EJBFinderMethod>> findbyprimarykey(pk : java.lang.object) : test.kunde <<EJBEntity>> KundeBean <<EJBEntity>> RechnungBean <<EJBCreateMethod>> ejbpostcreate() : void ejbremove() : void ejbload() : void ejbstore() : void ejbpas sivate() : void ejbactivate() : void unsetentitycontext() : void <<EJBCreateMethod>> ejbcreate() : java.lang.object <<EJBRemoteMethod>> getsumme() : java.math.bigdecimal <<EJBRemoteMethod>> setsumme(someobject : java.math.bigdecimal) : void setentitycontext(someobject : javax.ejb.entitycontext) : void <<EJBRemoteMethod>> getentitycontext() : javax.ejb.entitycontext <<EJBRemoteMethod>> getejbhome() : test.rechnunghome <<EJBRemoteMethod>> getkunde() : test.kunde <<EJBRemoteMethod>> setkunde(p : test.kunde) : void <<EJBCreateMethod>> ejbcreate() : java.lang.object <<EJBCreateMethod>> ejbpostcreate() : void <<EJBRemoteMethod>> getsaldo() : java.math.bigdecimal ejbremove() : void ejbload() : void ejbstore() : void ejbpassivate() : void ejbactivate() : void <<EJBRemoteMethod>> getname() : java.lang.string <<EJBRemoteMethod>> setname(someobject : java.lang.string) : void setentitycontext(someobject : javax.ejb.entitycontext) : void <<EJBRemoteMethod>> getentitycontext() : javax.ejb.entitycontext unsetentitycontext() : void <<EJBRemoteMethod>> getejbhome() : test.kundehome <<EJBRemoteMethod>> getrechnungenint() : java.util.collection <<EJBRemoteMethod>> setrechnungenint(p : java.util.collection) : void <<EJBRemoteMethod>> addtorechnungen(p : test.rechnung) : void <<EJBRemoteMethod>> removefromrechnungen(p : test.rechnung) : void <<EJBRemoteMethod>> getrechnungen() : java.util.collection 10

UML-Metamodell Eine Instanz des Metamodells ist das im UML-Werkzeug erstellte Modell Einlesen des Modells im XMI-Format +type Classifier 0..1 +owner 1 1 +associations AssociationEnd +participant 0..n +connections 0..n +attributes 0..n Attribute +ass ociation 1 Association 11

Java-Metamodell Metamodell der Programmiersprache Java +importedpackages Package 0..n +implementingclasses 0..n +implement edinterfaces 0..n +extendedclasses 0..n +superclass 0..1 Classifier 0..n +import edclasses isinterface : Boolean = False visibility : ClassVisibility = PUBLIC isabstract : Boolean = False isfinal : Boolean = False isstatic : Boolean = False finalizable : Boolean = False documentation : String usequalifiednamesonly : Boolean = False iscustomclass : Boolean = True filenameextension : String = "java" userimportsenabled : Boolean = True skipgeneration : Boolean 0..n 0..1 +innerclasses +outerclass <<enumeration>> ClassVisibility PUBLIC PRIVATE PROTECTED PACKAGE 1 +attributes 0..n Attribute +parentclass 1 0..n +parentclass +operations Operatio n 12

Das Java-Metamodell verwenden // Create java model Model javamodel = new Model(); // create class Classifier javaclassifier = new Classifier(); javamodel.addclasswithqualifiedname(javaclassifier, "example.kunde"); // add attribute Attribute someattribute = new Attribute(); someattribute.setname("myattribute"); someattribute.settype(type.gettype("int")); javaclassifier.addtoattributes(someattribute); 13

Abstraktes Dateisystem // Create file system TransactionFileSystem filesystem = new TransactionFileSystem(); // Create java model Model javamodel = new Model(); // create java classes... // Generate java class javamodel.generate(filesystem); Kapselung des Dateisystems filesystem.commit(); Transaktionsschutz für Dateiänderungen 14

Das EJB-Metamodell als Erweiterung des Java-Metamodells 0..1 Classifier (f rom jav a) <<abstract>> MappedClassifier (f rom java) <<abstract>> BeanClassifier +parentclass <<abstract>> Bean CompoundPrimaryKey 0..1 +e ntitybe an +compoundprimarykey 1 EntityBean +primarykeyattributes 0..n Attribute (f rom core) 0..n +operations Op eration (f rom jav a) XCoder Template AllAttributesCPKConstructor CPKHashCodeOperation CPKToStringOperation CPKEqualsOperation generatebody() generatebody() generatebody() generatebody() 15

Template für tostring -Methode public void generatebody(com.liantis.io.printer printer) { // @BEGINPROTECT _3C8E2EF60260 java.util.vector keys = ((CompoundPrimaryKey)this.getParentClass()). getentitybean().getprimarykeyattributes(); Umwandlung mittels Präprozessor } Attribute firstattribute = (Attribute)keys.elementAt(0); [ return "(" + [[firstattribute.getname()]] + ] for(int i=1,j=keys.size();i<j;i++) { Attribute anattribute = (Attribute)keys.elementAt(i); [ ", " + [[anattribute.getname()]] + ] } [ ")"; ] // @ENDPROTECT 16

Vorteile durch Metamodellierung Die Struktur des zu erzeugenden Codes liegt vollständig vor Kennt alle Typen, die er verwendet Classifier Weiß, ob alle geerbten, abstrakten Methoden überschrieben werden Weiß, ob java.sql.date unqualifiziert verwendet werden kann Berechnet Details für seine Templates 17

Modelltransformation Aus einer Metamodell-Instanz eine zweite Metamodell-Instanz erzeugen Eine oder mehrere Iterationen über das Eingabe- Modell bauen das Ausgabe-Modell auf Am Ende: Model to Text -Transformation UML- MetamodelL-Instanz OOP- MetamodelL-Instanz 18

Modellierung einer Transformation BOInterface I nterf ac ecl assifi er (from core) +umlinterface 1 1 +javainterface $map() mapattributes() mapoperations() maproles() mapinheritancerelations() maprealizerelations() Cl assi fi er (from java) +umlclassifier ClassCla 1 ssi fier (from core) 1 +umlclassifi er +javaclassifier 0..1 0..1 +javaenumeration BusinessObject map() mapattributes() mapoperations() maproles() mapinheritancerelations() maprealizerelations() Enumeration $map() mapattributes() mapoperations() maproles() generateclassinitializer() mapinheritancerelations() maprealizerelations() <<abstract>> MappedClassifier $m apping : Cl assifi ermapping $m ap () $setma pp ing() pre MapFeatures() ma pattributes() ma poperati ons() ma pro les() mapvisibility() ma pinheritancerel ations() maprealizerelations() mapdependencyrelations() po stma pfea tu res() ma pbasicel em ents() Exception Exception +umlexcepti on 1 (from commonbehavi... 1 +javaexception $map() mapattributes() mapoperations() maproles() mapinheritancerelations() maprealizerelations() 19

Implementierung einer Transformation public static Enumeration map(classclassifier aclass) { // @BEGINPROTECT _3C73A384029F Enumeration e = new Enumeration(); e.setumlclassifier(aclass); e.setid(aclass.getid()); String name = new StringTransformer().transform(aClass.getName()); e.setname(name); e.setisfinal(true); e.setuserimportsenabled(false); } // add attributes as enumeration constants java.util.vector attribs = aclass.getattributes(); for (int i = 0; i < attribs.size(); i++) { Attribute at = attribs.elementat(i); Attribute javaattribute = new Attribute(); e.addtoattributes(javaattribute);... if(at.hastype()) new TransformationError(at,"no attribute types allowed here");... } return e; // @ENDPROTECT 20

21 Standardkomponenten UML-Metamodell (OMG-Standard) Java-Metamodell EJB-Metamodell C++-Metamodell SQL-Metamodell C#-Metamodell UML Java-Transformation UML EJB-Transformation UML C++-Transformation UML SQL-Transformation UML C#-Transformation Transaktionsgesicherte Generierung unter Erhalt von manuell geschriebenem Code

Beispielprojekt Abrechnungssystem für Telekommunikationsunternehmen und Energieversorger Produktiv seit 1998 Bestehende C++-Architektur Modellierung mit Rational Rose Generierung mit XCoder/C++ Koexistenz von manuell erstelltem und generiertem Code Schrittweise Migration zu vollständiger Generierung Aufwand für XCoder/C++-Anpassung: 20 PT 22

Was bedeutet... für Sie? Schnelle Einführung durch leichtgewichtigen Ansatz Leistungsfähige Lösungen durch Metamodelle und Modelltransformation Flexible und einfache Erweiterung durch modellierten Generator 23

Liantis: Kompetenz im Bereich MDA 1997 1998-1999 1999 1999-2001 2001 -... 2002-2003 2004 24 1. Einsatz v. MDA-Standardwerkzeugen 2. Entwicklung v. MDA-Individuallösungen Modellgetriebene Entwicklung seit 1997 COBOL/Java: Versicherungsbranche COBOL: Finanzdienstleistungsbranche Java/EDIFACT: Standardisierungsorg. C++: Immobilienwirtschaft Java/C++/C#/J2EE: SE-Werkzeuge C++: Telekommunikation J2EE: Energiewirtschaft J2EE: Bank

Geschäftsfelder Liantis Beratung und Training Software-Entwicklung Liantis berät und trainiert zu folgenden Themen: Objektorientierte Software-Entwicklung, insb. UML Software-Architekturen, insb. MDA, EJB, CORBA XML Generierungsverfahren Anforderungsanalyse Vorgehensmodelle Projektmanagement 25

Geschäftsfelder Liantis Beratung und Training Software-Entwicklung Liantis verfügt über langjähriges Know-how in der Entwicklung komplexer Informationssysteme. Wir unterstützen Unternehmen bei der Realisierung ihrer Software- Entwicklungsprojekte. Dabei werden modernste Softwaretechnologie und Entwicklungswerkzeuge eingesetzt. 26

Free your work.

Free your work. Durch: Constantin Szallies constantin.szallies@liantis.com Liantis GmbH & Co. KG St.-Anton-Straße 69-71 47798 Krefeld Fon: 0 21 51 / 931 86-60 Fax: 0 21 51 / 931 86-61 info@liantis.com www.liantis.com

Free your work. Wir wollen Ihnen die Freiheit geben, sich auf Ihr Geschäft zu konzentrieren.