Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 1 CodeGen2 Template- und Modellbasierte Codegenerierung für Fujaba.

Slides:



Advertisements
Ähnliche Präsentationen
Object Relational Mapping
Advertisements

Object Relational Mapping (ORM). Objektmodell - Datenbankmodell.
Persistente Domänenmodelle mit JPA 2.0 und Bean Validation
M a r c – o l i v e r p a h l Informatik I – Kapitel 7 Klassen und höhere Datentypen Zusammenfassung des Kapitel 7 Küchlin, Weber, Einführung in die Informatik,
der Universität Oldenburg
der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
Klassen - Verkettete Liste -
Software Engineering 2 Übung – Konstruktion interaktiver (CASE) Tools SS 2007 Leif Geiger, Carsten Reckord, Software Engineering.
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Kurt Rosenberg. C# für.NET oder.NET für C# is(C# == C++ && Java)? true : false ; reines C# Ausblick Überblick.
Kapselung , toString , equals , Java API
Zusammenfassung des Kapitels 8
Verteilte Software - Java - Prozedurale Programmierung 1
Design by Contract with JML - Teil 2
Dipl. Inf. (FH) Paul Mizel Compilerbau.NET Compiler / Codegeneratoren / Skriptsprachen.
Java: Dynamische Datentypen
Listen Richard Göbel.
FH-Hof Servlets Richard Göbel. FH-Hof Konzept Servlets werden auf der Server-Seite durch ein Formular aufgerufen werten die Eingaben aus einem Formular.
FH-Hof SQLJ Richard Göbel. FH-Hof SQLJ - Idee Erweiterung von Java um SQL Die Verwendung von SQL-Anweisungen innerhalb einer Programmiersprache wird vereinfacht.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
M a r c – o l i v e r p a h l Die ObjektOrientierte Mühle Das Beispiel soll noch einmal das Konzept der Objektorientiertheit erläutern. Dabei werden außerdem.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard.
Dynamische Webseiten Java servlets.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
Die Methode public Knoten einfuegenVor (Datenelement dNeu, Datenelement dVergleich) public Knoten einfuegenVor(Datenelement dNeu, Datenelement dVergleich){
4. Design Gliederung: Einführung Anforderungsdefinition Analyse Design
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
Reverse Engineering K2 1 Ziele Heute Nachlese Volltextsuche Dokumentation in Quelltext einbetten JavaDoc Vorbereitung für Compileransatz.
F açade P attern By Nicolas Lanquetin. Façade Pattern Structural Pattern Bietet ein gemeinsames Interface, anstatt vieler Interfaces eines Subsystems.
Modulare Programmierung
04 - Actions Actions Actions 2 Motivation In verschiedenen Swing-Komponenten werden ausgelöste Aktionen durch ActionListener behandelt. Häufig werden.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Einführung in die Programmierung Datensammlung
Prof. K. Gremminger Folie 1 Vorlesung Datenbanksysteme SS 2002 Cursor-Konzept u Zugriff auf Mengen von Ergebnistupeln u In SQLJ Iteratoren u Vergleichbar.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sitzung 3: Klassen, Objekte, Arrays und Kontrollstrukturen
XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki Transformation von XML-Dokumenten.
Java Performance Tuning Performance Tuning is similar to playing a strategy game but happily you usually get paid for it.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Kap 4-1OHO Kap. 4.2 Das Orbix CORBA-System Kurzer überblick zu der CORBA-Implementierung Orbix •Unser Fahrplan: •IDL Verwendungsbeispiel •Zoom-In: CORBA.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Exception Handling in Java
Präsentation Velocity. Velocity Allgemein Templets Zusammenhang Templets Java Kontext $ UI $link.
Equals, Hashcode und CompareTo Micha Kessler
Dynamische Datentypen
Making people work together! Folie 1 NEXPLORE AG Stefan von Niederhäusern Einfache Anwendung der SuisseID durch das Software Development KIT
Variablenkonzept Klassisch, in Java Basistyp
Design Patterns Ein Muster (pattern) ist eine Idee, die sich in einem praktischen Kontext als nützlich erwiesen hat und dies auch in anderen sein wird.
Purga - Scriptengine Ein Einblick.
External Labels – The rules For all external labels the following rules apply (external labels are all labels which are not inside of a shape) - all labels.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
2002 XML 10.1XML I (Parsing) 17.1XML II (XLST,XPATH) (keinPraktikum) 24.1XML III FOP 31.1Cocoon2, XSP 7.2Struts, Turbine, Velocity 14.2Testat / Evaluation.
EPROG Tutorium #3 Philipp Effenberger
Launch ON Global.vi System ID object name classname Services to suscribe Observer Control Ref vi-path Service name Step 1 : Objects register to the Global.vi´s,
Mittwoch Informatik II, 1. Teil
Beispielanwendung von Java Threads
Programmiervorkurs WS 2014/15 Methoden
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Generative Softwareentwicklung in der Praxis Olaf Kaus, „Java User Group“, Hannover 6.Oktober 2003.
Ein Textadventure AIP Aufgabe Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
Dr. Wolfram Amme, Generisches Programmieren, Informatik II, FSU Jena, SS Generisches Programmieren.
Aufgaben zu Rückgabewerten
Löschen im Suchbaum.
 Präsentation transkript:

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 1 CodeGen2 Template- und Modellbasierte Codegenerierung für Fujaba

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 2 Beispiel: Einfaches Story Pattern

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 3 OOGenToken Bisher sah das so aus… /** * Describe generateOOCode method here. * methodName a String value incr No description provided param No description provided an LinkedList[OOStatement] value */ public Object generateCode (FElement incr, String methodName, Object param[]) { String sourceObjectName; String sourceObjectType; String sourceRoleName; String targetObjectName; String targetObjectType; String targetRoleName; String className; boolean targetOptional; boolean targetSet; boolean forEach; boolean sourceQualifierKey; boolean targetQualifierKey; String range; // parse param try { sourceObjectName = (String) param[0]; sourceObjectType = (String) param[1]; sourceRoleName = (String) param[2]; targetObjectName = (String) param[3]; targetObjectType = (String) param[4]; targetRoleName = (String) param[5]; className = (String) param[6]; targetOptional = ((Boolean) param[7]).booleanValue(); targetSet = ((Boolean) param[8]).booleanValue(); forEach = ((Boolean) param[9]).booleanValue(); sourceQualifierKey = ((Boolean) param[10]).booleanValue(); targetQualifierKey = ((Boolean) param[11]).booleanValue(); range = (String) param[12]; } catch (Exception exception) { throw new IllegalArgumentException ("param=" + Arrays.asList (param)); } if (log.isDebugEnabled()) { log.debug (this + ".linkSearchToManyTop(" + "sourceObjectName=" + sourceObjectName + ",sourceObjectType=" + sourceObjectType + ",sourceRoleName=" + sourceRoleName + ",targetObjectName=" + targetObjectName + ",targetObjectType=" + targetObjectType + ",targetRoleName=" + targetRoleName + ",className=" + className + ",targetOptional=" + targetOptional + ",targetSet=" + targetSet + ",forEach=" + forEach + ",sourceQualifierKey=" + sourceQualifierKey + ",targetQualifierKey=" + targetQualifierKey + ",range=" + range); } LinkedList statements = new LinkedList(); OOExpression conditionExpr = null; OOExpression notFujabaSuccess = null; OOCallMethodExpr iteratorMethodExpr = null; OOFWIteratorHasNextExpr hasNextExpr = null; OOCallMethodExpr hasInMethodExpr = null; OOStatement.add (statements, OO.lineComment ("bind " + targetObjectName + ": " + targetObjectType)); String uniqueName = CGU.upFirstChar (sourceObjectName) + CGU.upFirstChar (sourceRoleName) + CGU.upFirstChar (targetObjectName); OOVariable iterName = OO.variable (uniqueName.toString(), OOVariableType.iFujabaIter); iteratorMethodExpr = OO.call (sourceObjectName, OO.method (sourceRoleName, OOMethodType.ITERATOR_OF_METHOD)); if (sourceQualifierKey) { iteratorMethodExpr.addToParameter (OO.identifier (range)); } OOStatement.add (statements, OO.varDecl ("FWIterator", iterName, iteratorMethodExpr)); if (targetOptional) { OOStatement.add (statements, new OODoStatement()); } else { hasNextExpr = OO.iterHasNext (iterName, sourceObjectName, OO.type (sourceRoleName), true); if (!forEach) { notFujabaSuccess = OO.not (OO.identifier (OOVariableType.iFujabaSuccess)); conditionExpr = OO.infixOp (notFujabaSuccess, OOInfixOp.AND_OP, hasNextExpr); } else { conditionExpr = hasNextExpr; } OOStatement.add (statements, OO.whileStat (conditionExpr)); } OOStatement.add (statements, OO.startBlock()); OOStatement.add (statements, new OOTryStatement()); OOStatement.add (statements, OO.startBlock()); if (targetOptional) { OOStatement.add (statements, OO.varDecl (targetObjectType, targetObjectName, OOIdentifierExpr.NULL_IDENTIFIER)); OOStatement.add (statements, OO.ifStat (OO.iterHasNext (iterName, sourceObjectName))); OOStatement.add (statements, OO.startBlock()); } if (targetObjectType.equals (className)) { OOStatement.add (statements, OO.varDecl (targetObjectType, targetObjectName, OO.typeCast (targetObjectType, OO.iterGet (iterName)))); OOStatement.add (statements, OO.exprStat (OO.iterGotoNext (iterName))); OOStatement.add (statements, OO.emptyLine()); } else { OOStatement.add (statements, OO.varDecl (OO.type ("Object"), OO.variable (OOVariableType.iFujabaTmpObject), OO.iterGet (iterName))); if (targetOptional) { OOStatement.add (statements, OO.ifStat (new OOObjectOfTypeExpr (OOVariableType.iFujabaTmpObject, targetObjectType))); OOStatement.add (statements, OO.startBlock()); OOStatement.add (statements, OO.assignStat (targetObjectName, OO.typeCast (targetObjectType, OOVariableType.iFujabaTmpObject))); OOStatement.add (statements, OO.endBlock()); OOStatement.add (statements, new OOElseStatement()); OOStatement.add (statements, OO.startBlock()); OOStatement.add (statements, OO.ensure (OO.not (OO.iterHasNext (iterName, sourceObjectName)))); OOStatement.add (statements, OO.endBlock()); } else { OOStatement.add (statements, OO.ensure (new OOObjectOfTypeExpr (OOVariableType.iFujabaTmpObject, targetObjectType))); OOStatement.add (statements, OO.varDecl (targetObjectType, targetObjectName, OO.typeCast (targetObjectType, OOVariableType.iFujabaTmpObject))); OOStatement.add (statements, OO.emptyLine()); } if (targetOptional) { OOStatement.add (statements, OO.endBlock()); OOStatement.add (statements, OO.emptyLine()); } if (targetQualifierKey && !sourceQualifierKey) { OOStatement.add (statements, OO.lineComment ("check Reverse-Qualified-Link '" + targetRoleName + "' between " + targetObjectName + " and " + sourceObjectName)); hasInMethodExpr = OO.call (targetObjectName, OO.method (targetRoleName, OOMethodType.HAS_IN_METHOD)); hasInMethodExpr.addToParameter (OO.identifier (range)); hasInMethodExpr.addToParameter (OO.identifier (sourceObjectName)); if (targetOptional) { conditionExpr = OO.infixOp (OO.isNullExpr (targetObjectName), OOInfixOp.OR_OP, hasInMethodExpr); } else { conditionExpr = hasInMethodExpr; } OOStatement.add (statements, OO.ensure (conditionExpr)); OOStatement.add (statements, OO.emptyLine()); } return statements; } OOStatement.add (statements, OO.varDecl (OO.type ("Object"), OO.variable (OOVariableType.iFujabaTmpObject), … if (targetOptional) { OOStatement.add (statements, OO.ifStat (new OOObjectOfTypeExpr (OOVariableType.iFujabaTmpObject, … OOStatement.add (statements, OO.startBlock()); OOStatement.add (statements, OO.assignStat (targetObjectName, OO.typeCast (targetObjectType, … OOStatement.add (statements, OO.endBlock()); OOStatement.add (statements, new OOElseStatement()); OOStatement.add (statements, OO.startBlock()); OOStatement.add (statements, OO.ensure (OO.not (OO.iterHasNext (iterName, sourceObjectName)))); OOStatement.add (statements, OO.endBlock()); } else { OOStatement.add (statements, OO.ensure (new OOObjectOfTypeExpr (OOVariableType.iFujabaTmpObject, … OOStatement.add (statements, OO.varDecl (targetObjectType, targetObjectName, OO.typeCast (targetObjectType, … OOStatement.add (statements, OO.emptyLine()); }

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 4 Resultat tmp = iterator.next () ; JavaSDM.ensure ( tmp instanceof B ) ; child = (B) tmp ;

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 5 Template Code #set( $tmp = "${iter}.next ()" ) #if ( $optional ) if ( $tmpName instanceof $type ) { $name = ($type) $tmp ; } #else JavaSDM.ensure ( $tmp instanceof $type ) ; $name = ($type) $tmp ; #end #parse( "storyPattern/link/import.vm" ) #set( $iter = "fujaba__Iter$utility.upFirstChar($sourceName)To$utility.upFirstChar($tar getName)" ) // iterate to-many link #if ( $targetSet ) $collectionName = new FHashSet () ; #else fujaba__Success = false ; #end $iter = ${sourceName}.iteratorOf$targetRoleName ($!range) ; while ( #if(!$forEach && !$targetSet)!(fujaba__Success) && #end${iter}.hasNext () ) { try { #set( $source = "#if(!$typeCast)($targetType)#end ${iter}.next ()" ) #set( $toMany = true ) #parse( "storyPattern/object/import.vm" ) $tmpName = $source ; #if ( $typeCast ) // ensure correct type and really bound #if ( $optional && !$toMany ) if ( $tmpName instanceof $type ) { $name = ($type) $tmpName ; } #else JavaSDM.ensure ( $tmpName instanceof $type ) ; $name = ($type) $tmpName ; #end #elseif ( !$optional ) #parse( "storyPattern/object/bound.vm" ) #end $children #if ( $targetSet ) ${collectionName}.add ($targetName); #else fujaba__Success = true ; #end } catch ( JavaSDMException fujaba__InternalException ) { } #if ( $targetOptional ) if (!fujaba_Success) { fujaba_Success = true ; $targetName = null ; } #end …und jetzt so!

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 6 Konzept In Fujaba spezifiziert (endlich Bootstrapping!) Velocity templates

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 7 Konzept

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 8 Beispiel

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 9 Tokens

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 10 Tokens

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 11 CodeWriting Velocity Templates Handler für Tokens – Chain of responsibility Erweiterbar – Einzelne Templates ersetzen – Templatesatz austauschen (z.B. Sprachen) – Tokens einführen (neue Sprachelemente) – Handler ersetzen (Templates wrappen etc.)

Christian, Leif, Carsten, AlbertCodeGen2 – Template- und Modellbasierte Codegenerierung 12 Fazit CodeGen2 Vorteile – Keine Sprachabhängigkeit im Metamodell – Bootstrapping – Neue Sprachen leicht einzuführen – Viel weniger Code / Templates Nachteile – Noch nicht ganz fertig – Evtl. eingeschränkte Wartbarkeit bei Kopien von Templates