Code Generierung mit XSLT

Werbung
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
Herunterladen