Generative Softwareentwicklung in der Praxis Olaf Kaus, „Java User Group“, Hannover 6.Oktober 2003 Überblick • Generator Werkzeug („GVizard“) • • • • Problemstellung Ergebnis „Kibs-Live“ Lösungsweg „GVizard“-Live • Model Driven Architecture (MDA) • Konzepte • MDA-Werkzeuge • Funktionsweise von „AndroMDA“ • MDA-Live (Beispiel-Anwendung) Olaf Kaus, OOT, 6.Oktober 2003 2 Problemstellung • „KIBS“-Anwendung • Web-Anwendung • JSP/Servlet • Struts, Tomcat, TopLink, MS-Access/Oracle • Verwaltung von Bauteilen in Kernkraftwerken • Problem • Dialoge für n-„Einbauteile“ • Dialoge haben gleiches Verhalten und ähnliche Datenstrukturen. • Anlegen, Suchen, Bearbeiten, Hilfeseite, Druckseite, Excel-Export) Olaf Kaus, OOT, 6.Oktober 2003 3 Ergebnis Ein Blick auf KIBS! Olaf Kaus, OOT, 6.Oktober 2003 4 Lösungsweg: Analyse • Erstellen von verschiedenen Datei-Typen • Java, JSP, HTML, XML • Einsatz von Datei-Schablonen (Templates) • Platzhalter in Datei Hallo Herr ${empfänger}… • Templates müssen Logik enthalten Hallo {if empfänger.geschlecht==mänlich:}Herr{?}Frau… Olaf Kaus, OOT, 6.Oktober 2003 5 Lösungsweg: Template-Engine • „Jakarta“ OpenSource Template-Engine „Velocity“ • Javabasiertes Framework für die Erzeugung jegliche Art von Textdateien • Einsatz in verschiedenen anderen OpenSource-Projekten • Web-Architekturen • UML-Werzeuge • Datenbank-Mapping • Einfache Handhabung 1. Erstellen des Templates 2. Anreichern mit dynamischen Daten 3. Generieren der Ausgabedatei Olaf Kaus, OOT, 6.Oktober 2003 6 Velocity Template-Syntax Platzhalter ${variablenname} Schleifen #foreach( $row in $variablenname) ${row} #end Bedingungen #if( $variablenname==true) mach was #end Olaf Kaus, OOT, 6.Oktober 2003 7 Velocity Beispiel <HTML> <BODY> Hello $user! <table> #foreach( $skill in $customer.skills() ) #if ( $skill.hasJava() ) <tr> <td> $skill.getLevel() </td> </tr> #end #end </table> </BODY> </HTML> Olaf Kaus, OOT, 6.Oktober 2003 8 Velocity-Context // Initialisiern Velocity.init(); // Context aufbauen und füllen VelocityContext context = new VelocityContext(); context.put( “user", new String(“Olaf Kaus") ); context.put( “customer", new Customer() ); // Template einlesen Template template = null; template = Velocity.getTemplate(“skilltemplate.vm"); // Template und Context zusammenführen StringWriter sw = new StringWriter(); template.merge( context, sw ); Olaf Kaus, OOT, 6.Oktober 2003 9 Problem: Verbindung von eigenen und generierten Texten • Erzeugte Datei kann nur als Ausgangsdokument verwendet werden. • Bei jedem neuen Generieren wird das Textdokument vollständig ersetzt. • Lösungen: • Include-Mechanismen • OO-Techniken / Design-Patterns • Geschützte Bereiche („Protected Regions“) Olaf Kaus, OOT, 6.Oktober 2003 10 Lösung: Include-Mechanismen • JSP • … <jsp:include page="../includes/genfooter.jsp" /> … XML <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE generic SYSTEM ".\generic-generator.dtd" [ <!ENTITY EditBOAction SYSTEM "GenBOAction.xml"> ]> <generic version="0.2"> &EditBOAction; </generic> Olaf Kaus, OOT, 6.Oktober 2003 11 Lösung: OO-Techniken / Design-Patterns Quelle: ProgrammGeneration von M. Völter Olaf Kaus, OOT, 6.Oktober 2003 12 Lösung: Protected Regions private Customer customer = new Customer(); public boolean isValid(){ // PROTECTED REGION ID(12..3ValidateData) START // Implementierung der geschützten isValid-Methode // PROTECTED REGION END } // PROTECTED REGION ID(12..3EigeneMethoden) START // --> Raum für eigene Methoden <-public void setWert(String wert){ } // PROTECTED REGION END Olaf Kaus, OOT, 6.Oktober 2003 13 Eingabe der dynamischen Daten • Entwicklung eines GUI • Deklarative Beschreibung der Oberfläche • Eingabemöglichkeiten • • • • Textfelder Auswahllisten (ComboBox) Selektionen (CheckBox) Tabelleneingabe Olaf Kaus, OOT, 6.Oktober 2003 14 Beispiel-Deklaration <textfield name="mytext" label="Textfeld:" value="Vorbelegter Text"/> <filebox name="myfile" label="Dateiname:" basepath="c:\" value=""/> <checkbox name="mycheckbox" label="CheckBox" value="false"/> <combobox name="mycomboTest" label="ComboBox:"> <entry value="Eintrag 1"/> <entry value="Eintrag 2" selection="true"/> </combobox> <!-- Tabellen-Definition --> <table name="mytable" label="Table-Test" visiblerows="5"> <column label="Dateiname" typ="FileBox" value="C:\"/> <column label="Name" typ="TextField" value="Eintrag"/> <column label="Datentypen" typ="ComboBox"> <entry value="Zeile 1"/> <entry value="Zeile 2"/> </column> <column label="Selektiert" typ="CheckBox" value="true"/> </table> Olaf Kaus, OOT, 6.Oktober 2003 15 „GVizard“ Das alles zusammen ergibt: GVizard! Olaf Kaus, OOT, 6.Oktober 2003 16 MDA (Model Driven Architecture) • MDA ist ein relativ neuer Standard der „Object Management Group“ (OMG) • OMG Gründung in 1989 • Offenes Konsortium aus ca. 800 Firmen • OMG erstellt herstellerneutrale Spezifikationen zur Verbesserung der Interoperabilität und Protabilität von Softwaresystemen. Bekannte Ergebnisse sind: • CORBA, IDL • UML, XMI, MOF • MDA, das neue „Flagschiff“ Olaf Kaus, OOT, 6.Oktober 2003 17 Ziele von MDA • Entwicklungsgeschwindigkeit erhöhen: Automation durch Formalisierung (Vergleich zu Produktionsstrassen im Automobilbau) • Softwarequalität • Wiederverwendbarkeit • Wartbarkeit durch Trennung von Verantwortlichkeiten (Separation of Concerns) • Handhabbarkeit von Technologiewandel Olaf Kaus, OOT, 6.Oktober 2003 18 Ansatz von MDA PIM Platform Independent Model via UML-Profil Fachliche Spezifikation .NET-Model J2EE-Model XML-Model .NET-Code J2EE-Code XML-Code PSM Platform Specific Models via UML-Profil Implementierung Regelbasierte Transformationen (Templates) sind i.d.R. Toolgestützt Olaf Kaus, OOT, 6.Oktober 2003 19 PIM – PSM - Code public public public public interface Account extends EJBObject{.. interface AccountHome extends EJBHome{.. abstract class AccountBean implements EntityBean{.. class AccountKey implements java.io.Serializable{.. Quelle: b+m Informatik AG Olaf Kaus, OOT, 6.Oktober 2003 20 MDA Begriffe (1) • Modell • Repräsentation von Struktur, Funktion oder Verhalten eines Systems • MDA-Modelle sind formal • Modelliert mittels UML • Plattform • • • • Abstraktionsgrad ist nicht festgelegt Linux, Windows, .NET, J2EE, Swing, JSP, EJB, XML, … Anwendungsarchitektur Plattformen können aufeinander aufbauen Olaf Kaus, OOT, 6.Oktober 2003 21 MDA Begriffe (2) • PIM, PSM • PIM = Abstrahiert von technologischen Details. • • • Konzepte (Klassen, Abläufe, etc.) der Anwendungsdomäne werden beschrieben PSM = Modell (im MDA-Sinne), das die Konzepte (z.B. Schnittstellen) einer Plattform verwendet, um ein System zu beschreiben. Programmiersprache, Betriebssystem, Middleware, Applikationsserver, Datenbank, usw. Konzepte sind stabiler als Technologien Formale Modelle besitzen Potential für automatisiere Transformation • UML-Profile • UML ist der Rahmen einer Sprachfamilie • Erweiterungsmechanismen: • Stereotypen • Tagged Values • Modellierungsregeln (Constrains) Olaf Kaus, OOT, 6.Oktober 2003 22 MDA Entwicklungsprozess Template 4: Code erzeugen 1: Templates entwerfen Architekt Generator XM I Code 6: Übersetzen und verpacken 2: Modellieren Fachdesigner Build-Skript Komponenten, DB-Skripten, etc. UML 3: Modell attributieren 5: Businesslogik einfügen 7: Deployen und testen Entwickler Quelle: AndroMDA, M. Bohlen Olaf Kaus, OOT, 6.Oktober 2003 23 MDA Werkzeuge • Kommerzielle • ArcStyler (Interactive Objects) • OptimalJ (Compuware) • … (Middelgen Studie) • OpenSource • AndroMDA • b+m Generator • … • Unterschiede • Eingabeformat (XMI), ohne/mit PSM, Template-Sprache (JPyton, Velocity) Olaf Kaus, OOT, 6.Oktober 2003 24 AndroMDA • Codegenerierungsframwork nach MDA • Einsatz von diversen OpenSource-Frameworks • MDR (XMI-Modelle einlesen mit NetBeans Metadata Repository) • Velocity als Template-Engine • Ant als Build/Deploy-Tool • Steckbare Cartridges unterstützen konkrete Technologien • • • • • Java = allgemein benötigte Objekte EJB Hibernate = O/R-Mapping Struts = MVC Web-Framework weitere in Arbeit Olaf Kaus, OOT, 6.Oktober 2003 25 AndroMDA Cartridges • Cartridge-Meta-Informationen • XML-Beschreibung • Realisierte Aspekte • Stereotypen • Ausgabekanäle für generierten • Code Namenskonventionen für generierte Dateien <cartridge name="struts"> <property name="work"value="struts" /> <stereotype <stereotype <stereotype <stereotype <outlet <outlet <outlet <outlet name="WebAction" /> name="WebAppConfig" /> name="WebForm" /> name="WebPage" /> name="forms" /> name="actions" /> name="pages" /> name="config" /> <template stereotype="WebForm" sheet="templates/StrutsForm.vsl" outputPattern="{0}/{1}.java" outlet="forms" overWrite="true" /> <template … Olaf Kaus, OOT, 6.Oktober 2003 26 AndroMDA Entwicklungsablauf Olaf Kaus, OOT, 6.Oktober 2003 27 Zusammenfassung • Es wird nichts generiert, was nicht vorher in Form einer Referenzimplementierung verifiziert wurde. (Qualität/Lesbarkeit, Performance) • • • • Ersatz von „Copy-And-Paste“-Programmierung 60% bis 80% des Sourcecodes kann generiert werden Leistungsteigerung um ca. 30% UML-Modell (Dokumentation) bleibt bis zum Schluss des Projektes konsistent. • ZIEL: „Executable UML“ Olaf Kaus, OOT, 6.Oktober 2003 28 ENDE Fragen Olaf Kaus, OOT, 6.Oktober 2003 29 LINKS • • • • • • • • GVizard ab 13.10.2003: www.oo-modeller.de ProgrammGeneration: www.voelter.de AndroMDA: www.andromda.org b+m Generator: www.architectureware.de MDA Werkzeuge: www.omg.org/mda/committed-products.html Middlegen Study: www.middleware-company.com Object Management Group: www.omg.org Velocity: jakarta.apache.org/velocity Olaf Kaus, OOT, 6.Oktober 2003 30