Code Generierung mit XSLT Sabine Winkler [email protected] Thomas Bayer [email protected] Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de 1 Quelle: http://www.taylorrentalstaug.com/contractor.htm 2 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 1 Inhalt • Einführung • Code generieren mit XSLT • Technische Generatoren – Erzeugen eines Graphical User Interfaces – Validator Generator • Fachliche Generatoren – Prozessabbildung – Wertgrenzenbeispiel 3 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Vorteile von Code Generatoren • Reduzieren der Entwicklungszeit • Eindämmen von Fehlerquellen • Einfache Anpassung • Bequeme Handhabung ! ! ! ! ! ! ! 4 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 2 Code Generatoren Einteilung • einmalige Generierung • mehrmalige Generierung • Generatoren mit graphischem Interface • dynamische Generatoren Anwendbarkeit • Zusammenfassen von ähnlichen Aufgaben • Abstraktionen • Technisch – EJB, Persistenz, Proxys,... • Auch für Fachlichkeit ! 5 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Einmalige Generierung • Quellcode wird zu Beginn erzeugt • Ergebnis wird manuell geändert • z.B. Wizzards für – Java Klassen, – EJB, JMS 6 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 3 Mehrmalige Generierung • Generierter Code wird nicht verändert • Handgeschriebener Code verwendet generierten Code • z.B. CORBA IDL Definition IDL Compiler Client .java Server .java Stub-Quellen Java Compiler Client-seitiger Bytecode Java-Interface + ManagementDateien Skeleton-Quellen Server-seitiger Bytecode Java Compiler 7 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Generatoren mit graphischem Interface • Oft Bestandteil von IDE‘s z.B. GUI Editoren • Arbeit mit Platzhaltern, Roundtrip ... 8 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 4 Dynamische Generatoren Beispiel Server Pages: import...; public class _0002fSimpleJsp_0002ejspSimpleJsp_jsp_0 extends HttpJspBase { <%@page language=“java“%> <html> <head> <title>Simple JSP </title> </head> <body> <h1>Hello World !</h1> It's <%= new java.util.Date()%> </body> </html> //.... public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //... ServletConfig config = null; JspWriter out = null; // ... out = pageContext.getOut(); out.write("<html>\r\n<head>\r\n<title>Simple JSP</title>\r\n</head>\r\n<body>\r\n <h1>Hello World</h1>\r\n It's "); out.print( new java.util.Date() ); out.print("</body>\r\n</html>\r\n"); // end // ... Java-Compiler } } 9 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Code generieren mit XSLT • Einführung • Code generieren mit XSLT • Technische Generatoren – Erzeugen eines Graphical User Interfaces – Validator Generator • Fachliche Generatoren – Prozessabbildung – Wertgrenzenbeispiel 10 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 5 XSLT Prozessor csv.xsl html.xsl txt.xsl news.html docbook.xsl news.txt news.xml XSLT Prozessor news.cvs docbook.xml 11 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Erzeugen einer Klasse Quelle: <?xml version="1.0" encoding="UTF-8"?> <Foo> <classname>Bar</classname> <message>Hossale</message> </Foo> Stylesheet: <xsl:template match="/Foo"> public class <xsl:value-of select="classname"/> ... } { </xsl:template> Erzeugter Code: public class Bar { } 12 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 6 Erzeugen von Attributen Stylesheet: <xsl:template match="/Foo"> public class <xsl:value-of select="classname"/> { <xsl:apply-templates/> } </xsl:template> <xsl:template match="*"> String <xsl:value-of select="name()"/> = "<xsl:value-of select="."/>"; </xsl:template> Erzeugter Code: public class Bar { String class-name = "Bar"; String message = "Hossale"; } 13 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Erzeugen von Methoden Stylesheet: <xsl:template match="/Foo"> public class <xsl:value-of select="classname"/> { <xsl:apply-templates/> } </xsl:template> <xsl:template match="*"> public String get<xsl:value-of select="name()"/>() { return "<xsl:value-of select="."/>"; } </xsl:template> Erzeugter Code: public class Foo { public String getclassname() { return "Bar"; } public String getmessage() { return "Hossale"; } } 14 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 7 Regel-basierte Erzeugung Stylesheet: <xsl:template match="/foo"> public class <xsl:value-of select="foo/class-name"/> { <xsl:apply-templates/> } </xsl:template> SEP <xsl:template match=“fenster"> ... </xsl:template> <xsl:template match=“*[@type=‘text‘]"> ... </xsl:template> <xsl:template match=“*[@id]"> ... </xsl:template> not .// 15 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Dynamische Generierung 16 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 8 Dynamische Generierung • Während der Laufzeit aus XSLT Code erzeugen – JAXP Transformer • • • • Compilieren Laden ( Problem: Cachen von Klassen) Instanziieren Aufrufen quelle.xml quelle2X.xsl x:X sun.tools.javac.Main DynamicClassLoader X.java X.class 17 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Dynamischer ClassLoader public class DynamicClassLoader extends ClassLoader { public Class loadClass(String name) throws ClassNotFoundException { if ( name.startsWith("java")) return findSystemClass(name); byte bytes[] = loadClassBytes(new File( FileUtil.getTempDir() + "/" + FileUtil.getFileNameFromClassName(name))); return defineClass( name, bytes, 0, bytes.length); } private byte[] loadClassBytes(File file) { ... } } 18 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 9 Code Generator in Cocoon 2 Cocoon Code: ProgramGenerator programGenerator = (ProgramGenerator)this.manager.lookup(ProgramGenerator.ROLE); Object obj = programGenerator.load( this.manager, "apus/person.form", "swal", "java", resolver); Stylesheet: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:swal="http://oio.de/swal" version="1.0"> <xsl:template match="swal:form"> ... </xsl:template> ... </xsl:stylesheet> 19 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Erzeugen einer GUI • Einführung • Code generieren mit XSLT • Technische Generatoren – Erzeugen eines Graphical User Interfaces – Validator Generator • Fachliche Generatoren – Prozessabbildung – Wertgrenzenbeispiel EJB JDO DB 20 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 10 Architektur of2java.xsl Java Compiler XSLT Prozessor fensterX.class fensterX.java oberflaeche.xml Java Compiler fensterY.java fensterY.class 21 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Quelle: oberflaeche.xml <?xml version="1.0" encoding="ISO-8859-1"?> <oberflaeche> <fenster id="MeinFenster" titel="Mein Fenster"> <register id="register" titel="register1"> <container id="login" titel="Login"> <text id="text1">Bitte melden Sie sich an.</text> <feld id="Name" typ="text" titel="Name:" laenge="20"/> <feld id="Passwd" typ="text" titel="Passwort:" laenge="10"/> <knopf id="ok1" titel="OK"/> <knopf id="abbrechen1" titel="Abbrechen"/> </container> <container id="daten" titel="Personendaten"> <feld id="vorname" typ="text" default="Joe" titel="Vorname" laenge="20"/> <feld id="nachname" typ="text“ default="Bach" titel="Nachname" laenge="20"/> <feld id="userId" typ="text" default="4711" titel="User-ID:"/> <auswahlbox id="Land" titel="Land:"> <auswahl>Deutschland</auswahl> <auswahl>Frankreich</auswahl> <auswahl>Schweiz</auswahl> </auswahlbox> <falschesElement/> <knopf id="ok2" titel="OK"/> <knopf id="abbrechen2" titel="Abbrechen"/> </container> </register> </fenster> </oberflaeche> 22 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 11 Generierte GUI in Swing 23 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH HTML bzw. JSP Ausgabe 24 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 12 Klassennamen ermitteln <xsl:template match="fenster"> <xsl:document href="{@id}Impl.java"> import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class <xsl:value-of select="@id"/>Impl extends JFrame { // Alle Instanzvariablen definieren <xsl:apply-templates mode="instancevariables"/> // Konstruktor <xsl:value-of select="@id"/>Impl() { // Allgemeines Layout super.setTitle("<xsl:value-of select="@titel"/>"); setSize(400, 400); // Auf closing event reagieren addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);}}); // Root-Panel anlegen JPanel <xsl:value-of select="@id"/> = new JPanel(); <xsl:value-of select="@id"/>.setLayout(new GridLayout(0,1)); public class <xsl:value-of select="@id"/>Impl extends JFrame // Aufbau des Fensters <xsl:apply-templates/> // Top-Level-Elemente in den Root_Panel hängen <xsl:for-each select="*"> <xsl:value-of select="../@id"/>.add(<xsl:value-of select="@id"/>); </xsl:for-each> // Root-Panel in den ContentPane haengen getContentPane().add(<xsl:value-of select="@id"/>, "Center"); } } </xsl:document> </xsl:template> 25 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Zu den Elementen <xsl:template match="fenster"> <xsl:document href="{@id}Impl.java"> import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class <xsl:value-of select="@id"/>Impl extends JFrame { // Alle Instanzvariablen definieren <xsl:apply-templates mode="instancevariables"/> // Konstruktor <xsl:value-of select="@id"/>Impl() { // Allgemeines Layout super.setTitle("<xsl:value-of select="@titel"/>"); setSize(400, 400); // Auf closing event reagieren addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);}}); // Root-Panel anlegen JPanel <xsl:value-of select="@id"/> = new JPanel(); <xsl:value-of select="@id"/>.setLayout(new GridLayout(0,1)); <xsl:apply-templates/> // Aufbau des Fensters <xsl:apply-templates/> // Top-Level-Elemente in den Root_Panel hängen <xsl:for-each select="*"> <xsl:value-of select="../@id"/>.add(<xsl:value-of select="@id"/>); </xsl:for-each> // Root-Panel in den ContentPane haengen getContentPane().add(<xsl:value-of select="@id"/>, "Center"); } } </xsl:document> </xsl:template> 26 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 13 Code für Register erzeugen <xsl:template match="register"> <xsl:value-of select="@id"/> = new JTabbedPane (); <xsl:apply-templates/> // Hinzufuegen der einzelnen Unterelemente des Registers <xsl:for-each select="*"> <xsl:value-of select="../@id"/>.addTab( "<xsl:value-of select="@titel"/>", <xsl:value-of select="@id"/>); </xsl:for-each> // Register in das uebergeordnete Panel haengen <xsl:value-of select="../@id"/>.add(<xsl:value-of select="@id"/>); </xsl:template> 27 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Erzeugter Konstruktor Code ... register = new JTabbedPane (); // Anmelden der Elemente im Registerfeld login = new JPanel() ; login.setLayout(new GridLayout(0, 1)); login.setBorder(LineBorder.createBlackLineBorder()); ... // Anmelden der Elemente im Registerfeld daten = new JPanel() ; daten.setLayout(new GridLayout(0, 1)); daten.setBorder(LineBorder.createBlackLineBorder()); ... // Hinzufuegen der einzelnen Unterelemente des Registers register.addTab("Login", login); register.addTab("Personendaten", daten); // Register in das uebergeordnete Panel haengen MeinFenster.add(register); ... 28 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 14 Validator Generator • Einführung • Code generieren mit XSLT • Technische Generatoren – Erzeugen eines Graphical User Interfaces – Validator Generator • Fachliche Generatoren – Prozessabbildung – Wertgrenzenbeispiel 29 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Validieren von Benutzereingaben 30 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 15 Konfiguration <?xml version="1.0" encoding="ISO-8859-1"?> <Validators> <Or name="Alter"> <NumberRange> <param name="min" value='"0"'/> <param name="max" value='"99"'/> </NumberRange> <Empty/> </Or> </Validators> 31 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Validator Framework Validators getValidator(String); getValidatorNames(); Client Validierer isValid( String) EmtpyValidierer isValid( String) StringRangeValidierer isValid( String) OrValidierer isValid( String) 32 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 16 Validator Objekt „Alter“ OrValidierer NumberRangeValidierer Validator[] validators; BigDecimal untereGrenze; (0) BigDecimal obereGrenze; (99) isValid( String str) isValid( String str) EmptyValidierer isValid( String str) 33 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Erzeugte Validator Fabrik package de.oio.jax.validation; import java.util.*; import de.oio.util.validation.*; public class Validators { private static Hashtable validatorsMap = new Hashtable(); static { validatorsMap.put( "Alter", new OrValidator( new Validator[] { new NumberRangeValidator("0", "99"), new EmptyValidator()} )); } public static Validator getValidator(String validatorName) { return (Validator) validatorsMap.get(validatorName); } public static Set getValidatorNames() { return validatorsMap.keySet(); } } 34 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 17 • Einführung • Code generieren mit XSLT • Technische Generatoren – Erzeugen eines Graphical User Interfaces – Validator Generator • Fachliche Generatoren – Prozessabbildung – Wertgrenzenbeispiel 35 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Fachliche Generatoren • Prozesse – Folge logisch zusammenhängender Aktivitäten zur Erstellung einer Leistung oder Veränderung eines Objektes (Transformation) • Workflow – Bezeichnung für arbeitsteilige Prozesse zur Abwicklung von Geschäftsvorfällen • Entscheidungstabellen – zur Darstellung einfacher und komplexer Entscheidungsfolgen • Businessregeln • Textbausteingeneratoren 36 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 18 Ereignis Prozess Ketten EPK Ereignis X Aktion A Aktion B Aktion C Ereignis X Aktion D Aktion E Ereignis Y 37 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH XML Repräsentation <processes> <process> <event/> <action/> <action/> <action/> </process> ... <processes> BestellungVerarbeiten BestellungEmpfangen HoleLagerbestand SendeBestandsmeldung VerbucheBestellungImERP 38 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 19 Verweis auf Java Klassen <processes> <process dest="de.oio.jax.process.demo.BestellungVerarbeitenProcess"> <event src="de.oio.jax.process.demo.BestellungEmpfangenEvent"/> <action src="de.oio.jax.process.demo.HoleLagerbestandAction"/> <action src="de.oio.jax.process.demo.SendeBestandsmeldungAction"/> <action src="de.oio.jax.process.demo.VerbucheBestellungImERPAction"/> </process> ... <processes> Event generierter Code Anwendungs Code BestellungEmpfangenEvent Framework Code BestellungVerarbeitetEvent Stylesheet Auszug: public void init() { ProcessManager manager = ProcessManager.getInstance(); manager.register( this, <xsl:value-of select="event/@src"/>.class ); } 39 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Code mit Framework verbinden public class <xsl:call-template name="get-class-name"> <xsl:with-param name="class-name" select="@dest"/> </xsl:call-template> extends de.oio.jax.process.Process { ... ... } Java Code generierter Code stylesheet.xsl Abstrakte Basisklasse Anwendungs Code Framework Code generierte konkrete Subklasse quelle.xml 40 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 20 Erzeugung mehrerer Klassen <processes> <process dest="de.oio.jax.process.demo.BestellungVerarbeitenProcess"> <event/> <action/> ... </process> <process dest="de.oio.jax.process.demo.BestellungVerarbeitenProcess"> <event/> <action/> ... </process> Process <processes> generierter Code Anwendungs Code processes2java.xsl BestellungVerarbeitenProcess BestellungVerbuchenProcess Framework Code processess.xml 41 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Xalan Erweiterung <redirect:write> <xsl:template match="process"> <!-- Pfad für die neu anzulegende Datei ermitteln --> <xsl:variable name="path"> <xsl:call-template name="get-path"> <xsl:with-param name="class-name" select="@dest"/> </xsl:call-template> </xsl:variable> <redirect:write file="../../src/{$path}.java"> package <xsl:call-template name="get-package-name"> <xsl:with-param name="class-name" select="@dest"/> </xsl:call-template>; import java.util.Hashtable; ... public class <xsl:call-template name="get-class-name"> <xsl:with-param name="class-name" select="@dest"/> </xsl:call-template> extends de.oio.jax.process.Process { ... } </redirect:write> </xsl:template> 42 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 21 Nützliche Helfer de.oio.jax.process.demo.BestellungVerarbeitenProcess Template: get-path => de/oio/jax/process/demo/BestellungVerarbeitenProcess Template: get-package-name => de.oio.jax.process.demo Template: get-class-name => BestellungVerarbeitenProcess Beispiel: <xsl:call-template name="get-path"> <xsl:with-param name="class-name" select="@dest"/> </xsl:call-template> 43 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Prozess Framework Process ProcessManager static ProcessManager processManage Hashtable eventMap init() fire( Event event) static ProcessManager getInstance() register( Process process, Class eventClass) fire( Event event) ProcessX generierter Code Action Event Anwendungs Code Framework Code Hashtable data perform( Hashtable data) ActionX ActionY EventX EventY 44 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 22 Registrierung Ist generiert und dem Framework unbekannt! Problem: Alle Prozesse müssen beim ProcessManager registriert werden, damit der Sie später bei entsprechenden Events benachrichtigen kann. 45 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Lösung mit Reflection 1.) Suche nach *Process.class 2.) Laden und Instanz erzeugen 46 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 23 Lösung mit Generator public class ProcessInitializer { public static void init() { (new de.oio.jax.process.demo.BestellungVerarbeitenProcess()).init(); (new de.oio.jax.process.demo.BestellungVerbuchenProcess()).init(); } } processes2initializer.xsl ProcessInitializer processess.xml processes2java.xsl BestellungVerarbeitenProcess BestellungVerbuchenProcess 47 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Registrierung beim ProcessManager 48 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 24 Feuern von Events 49 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Client Code ProcessInitializer.init(); Hashtable data = new Hashtable(); data.put( data.put( data.put( data.put( "Nr", "20020505-001"); "Ware", "Lutscher"); "Menge", new Long(10)); "MailAddrCustomer", "[email protected]"); BestellungEmpfangenEvent bestellungEmpfangenEvent = new BestellungEmpfangenEvent(); bestellungEmpfangenEvent.setData( data); ProcessManager.getInstance().fire( bestellungEmpfangenEvent); 50 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 25 Gesamte Anwendung Client processes2initializer.xsl ProcessInitializer processess.xml processes2java.xsl Process ProcessManager Event BestellungVerarbeitenProcess generierter Code Anwendungs Code Framework Code SendDebugAction Action GenerateEvent BestellungEmpfangenEvent BestellungVerarbeitetEvent HoleLagerbestandAction 51 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Fazit • • • • Stylesheet kann mehrere Klassen erzeugen „Java“ Code vom Generator ins Framework verschieben Reflection durch Generator ersetzen Auf eine Quelle können mehrere Stylesheets angewandt werden 52 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 26 • Einführung • Code generieren mit XSLT • Technische Generatoren – Erzeugen eines Graphical User Interfaces – Validator Generator • Fachliche Generatoren – Prozessabbildung – Wertgrenzenbeispiel 53 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Wertgrenzenbeispiel einfach nur XML Wert bis EUR 400 x x bis EUR 1000 bis * x x x x Art Investition/Kosten Investition Kosten Investition Kosten Investition Kosten Genehmigung durch Keine Abteilungsleiter x x x x x x Chef x Bedingung <vorfall> <bedingung> <wertgrenze wert=“1000“/> <art typ=“I“/> </bedingung> <genehmigung> <instanz> <rolle>Abteilungsleiter</rolle> </instanz> </genehmigung> </vorfall> Wertgrenze Art Instanz Rolle Person 54 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 27 Code aus UML Diagrammen • Generierung von Klassen ist einfach UML Tool XMI XSLT Prozessor Java Code 55 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Fazit • Ausgereifte Technologien – – – – Objektorientierung Java Design Pattern XML und XSLT • Alles ist heute einsetzbar! 56 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 28 Quellen • • • • Tobias Kieninger, Thomas Bayer, „Codegenerierung mit XML“, Java Spektrum 1/2002, S. 52 ff http://www.oio.de/codegenerator/ Erich Gamma et al., „Design Patterns Elements of Reusable Object-Oriented Software“ XPath, http://www.w3.org/TR/xpath XSLT, http://www.w3.org/Style/XSL/ XSLT Entwurfsmuster • • Struts XSLT Code Generator, http://xsltgenerator.sourceforge.net/ http://www.uiml.org • • – http://www.xslt-patterns.com 57 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH The End Vielen Dank für Ihre Aufmerksamkeit ! Thomas Bayer [email protected] Sabine Winkler [email protected] 58 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 29 Dynamische Anwendungen • Reflection API von Java • Erzeugter Code kann zur Laufzeit geladen werden – Problem: Erneutes Laden der gleichen Klasse => Eigener Classloader • Beispiel mit Class.forName() • sitemap von Cocoon 59 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Beispiel (5) <xsl:template match="fenster"> <xsl:document href="{@id}Impl.java"> import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class <xsl:value-of select="@id"/>Impl extends JFrame { // Alle Instanzvariablen definieren <xsl:apply-templates mode="instancevariables"/> // Konstruktor <xsl:value-of select="@id"/>Impl() { // Allgemeines Layout super.setTitle("<xsl:value-of select="@titel"/>"); setSize(400, 400); // Auf closing event reagieren addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);}}); // Root-Panel anlegen JPanel <xsl:value-of select="@id"/> = new JPanel(); <xsl:value-of select="@id"/>.setLayout(new GridLayout(0,1)); Auswählen der XML-Elemente und Hinzufügen als Top-Level-Elemente: <xsl:for-each select="*"> // Aufbau des Fensters <xsl:apply-templates/> // Top-Level-Elemente in den Root_Panel hängen <xsl:for-each select="*"> <xsl:value-of select="../@id"/>.add(<xsl:value-of select="@id"/>); </xsl:for-each> // Root-Panel in den ContentPane haengen getContentPane().add(<xsl:value-of select="@id"/>, "Center"); } } </xsl:document> </xsl:template> 60 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 30 Ausgabe 1 ... // Register private JTabbedPane register; // container private JPanel login; // container private JPanel daten; ... 61 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Erzeugte Code von JBuilder GUI Editor 62 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 31 Klassendiagramm CORBA interface HelloOperations org.omg.CORBA.portable.Streamable HelloHolder +value:helloApp.Hello +HelloHolder +HelloHolder +_read:void +_write:void +_type:org.omg.CORBA.TypeCode -_id:String -__typeCode:org.omg.CORBA.TypeCo org.omg.CORBA.Object org.omg.CORBA.portable.IDLEntity interface Hello org.omg.CORBA.portable.ObjectImpl HelloStub -__ids:String[] +_HelloStub +_HelloStub +sayHello:String +_ids:String[] -readObject:void -writeObject:void HelloHelper +sayHello:String +insert:void +extract:helloApp.Hello +type:org.omg.CORBA.TypeCode +id:String +read:helloApp.Hello +write:void +narrow:helloApp.Hello org.omg.CORBA.portable.ObjectImpl org.omg.CORBA.portable.InvokeHandle HelloImplBase -_methods:java.util.Hashtable -__ids:String[] +_HelloImplBase +_invoke:org.omg.CORBA.portable.Ou +_ids:String[] 63 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Listing 5 <!-- Buttons --> <xsl:template match="knopf"> // Untergeordnetes Panel und Button anlegen JPanel pan_<xsl:value-of select="@id"/> = new JPanel(); pan_<xsl:value-of select="@id"/>.setLayout(new FlowLayout(FlowLayout.LEFT)); <xsl:value-of select="@id"/> = new JButton("<xsl:value-of select="@titel"/>"); // Button, Panel und container anhaengen. pan_<xsl:value-of select="@id"/>.add(<xsl:value-of select="@id"/>); <xsl:value-of select="../@id"/>.add(pan_<xsl:value-of select="@id"/>); </xsl:template> 64 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 32 Hello World - In ‘n‘ Out <?xml version="1.0" encoding="UTF-8"?> <greetings> <hello-message>Hello</hello-message> <name>Tobias</name> </greetings> XS L T public class Greetings{ public static void main(String[] args){ String name = "Tobias"; System.out.print("Hello "); System.out.println(name); } } 65 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Ergebnis package de.oio.xmldb.test; import junit.framework.TestCase; public class TestExecuteXUpdate extends TestCase { public TestExecuteXUpdate(String name) { super(name); } /** * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); } /** * @see TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); } public void testMain() {} public void testReadFileFromDisk() {} } 66 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 33 Hello World - XSLT <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0“ xmlns:xsl=“....."> <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="greetings"> public class Greetings{ public static void main(String[] args){ String name = "<xsl:value-of select="name"/>"; <xsl:apply-templates select="hello-message"/> } } </xsl:template> <xsl:template match="hello-message"> System.out.print("<xsl:value-of select="."/> "); System.out.println(name); </xsl:template> </xsl:stylesheet> 67 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Listing 3 <xsl:template match="register" mode="instancevariables"> // Register private JTabbedPane <xsl:value-of select="@id"/>; <xsl:apply-templates mode="instancevariables"/> </xsl:template> <xsl:template match="container" mode="instancevariables"> // container private JPanel <xsl:value-of select="@id"/>; <xsl:apply-templates mode="instancevariables" /> </xsl:template> 68 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 34 Beispiel (3) <xsl:template match="fenster"> <xsl:document href="{@id}Impl.java"> import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class <xsl:value-of select="@id"/>Impl extends JFrame { // Alle Instanzvariablen definieren <xsl:apply-templates mode="instancevariables"/> Einfügen eines Konstruktors: // Konstruktor <xsl:value-of select="@id"/>Impl() { // Allgemeines Layout super.setTitle("<xsl:value-of select="@titel"/>"); setSize(400, 400); // Auf closing event reagieren addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);}}); // Root-Panel anlegen JPanel <xsl:value-of select="@id"/> = new JPanel(); <xsl:value-of select="@id"/>.setLayout(new GridLayout(0,1)); <xsl:value-of select="@id"/> // Aufbau des Fensters <xsl:apply-templates/> // Top-Level-Elemente in den Root_Panel hängen <xsl:for-each select="*"> <xsl:value-of select="../@id"/>.add(<xsl:value-of select="@id"/>); </xsl:for-each> // Root-Panel in den ContentPane haengen getContentPane().add(<xsl:value-of select="@id"/>, "Center"); } } </xsl:document> </xsl:template> 69 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH Definition der Instanzvariablen <xsl:template match="fenster"> <xsl:document href="{@id}Impl.java"> import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class <xsl:value-of select="@id"/>Impl extends JFrame { // Alle Instanzvariablen definieren <xsl:apply-templates mode="instancevariables"/> // Konstruktor <xsl:value-of select="@id"/>Impl() { // Allgemeines Layout super.setTitle("<xsl:value-of select="@titel"/>"); setSize(400, 400); // Auf closing event reagieren addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);}}); // Root-Panel anlegen JPanel <xsl:value-of select="@id"/> = new JPanel(); <xsl:value-of select="@id"/>.setLayout(new GridLayout(0,1)); <xsl:apply-templates mode="instancevariables"/> // Aufbau des Fensters <xsl:apply-templates/> // Top-Level-Elemente in den Root_Panel hängen <xsl:for-each select="*"> <xsl:value-of select="../@id"/>.add(<xsl:value-of select="@id"/>); </xsl:for-each> // Root-Panel in den ContentPane haengen getContentPane().add(<xsl:value-of select="@id"/>, "Center"); } } </xsl:document> </xsl:template> 70 Code Generierung mit XSLT © 2000-2002 Orientation in Objects GmbH 35