Diplomarbeit Fachhochschule Karlsruhe Karlsruhe University of Applied Sciences KOMPONENTENBASIERTE ABFRAGE UND VISUALISIERUNG RELATIONALER DATENBANKEN MIT DEN INTERNETTECHNOLOGIEN JAVA, JDBC UND XML Jürgen Baier Steinbeis Transferzentrum für industrielle Datenverarbeitung und Automation (STZ-IDA) Dauer: 01. März 1999 bis 31. August 1999 Referent: Prof. Klaus Gremminger Coreferent: Prof. Dr. Peter Henning Betreuer: Sascha Ehrenfried Mink Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Eidesstattliche Erklärung 2 Eidesstattliche Erklärung Hiermit erkläre ich, daß ich die vorliegende Diplomarbeit mit dem Titel "Komponentenbasierte Abfrage und Visualisierung relationaler Datenbanken mit den Internet-Technologien Java, JDBC und XML" selbständig und ausschließlich unter Verwendung der angegebenen Literatur verfaßt habe. Die Arbeit wurde in gleicher oder ähnlicher Form keiner anderen Prüfungsbehörde zum Erlangen eines akademischen Grades vorgelegt. ------------------------- ---------------------------------------- Datum Unterschrift Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Inhaltsverzeichnis 3 Inhaltsverzeichnis KOMPONENTENBASIERTE ABFRAGE UND VISUALISIERUNG RELATIONALER DATENBANKEN MIT DEN INTERNET-TECHNOLOGIEN JAVA, JDBC UND XML 1 EIDESSTATTLICHE ERKLÄRUNG _____________________________________ 2 INHALTSVERZEICHNIS _____________________________________________ 3 ZUSAMMENFASSUNG ______________________________________________ 7 ABBILDUNGSVERZEICHNIS _________________________________________ 8 VERZEICHNIS DER CODEBEISPIELE _________________________________ 10 TABELLENVERZEICHNIS ___________________________________________ 11 TEIL II: EINLEITUNG _______________________________________________ 12 1 Web-Informationssysteme__________________________________________________________ 12 2 2.1 2.2 2.3 Aufgabenbeschreibung ____________________________________________________________ Eingabeschnittstelle für die Formulierung von DB-Queries _______________________________ Umsetzung der Anfrageergebnisse nach XML (mit serverseitiger Java-Technologie) ___________ Visualisierung der Anfrageergebnisse und Konfigurierbarkeit der Ausgabeschnittstelle _________ 12 13 13 13 3.1 3.2 3.3 3.4 3.5 Gliederung der Diplomarbeit _______________________________________________________ Teil II: Grundlagen ______________________________________________________________ Teil III: Anforderungsanalyse und Systemspezifikation __________________________________ Teil IV: Design _________________________________________________________________ Teil V: Implementierung __________________________________________________________ Teil VI: Anhang_________________________________________________________________ 14 14 14 14 15 15 3 TEIL III:GRUNDLAGEN _____________________________________________ 16 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 XML – eXtensible Markup Language ________________________________________________ Einleitung _____________________________________________________________________ Wozu XML? ___________________________________________________________________ Dokumente ____________________________________________________________________ HTML, SGML und XML – Eine Einordnung __________________________________________ Struktur, Darstellung und Inhalt ____________________________________________________ XSL – Extensible Stylesheet Language_______________________________________________ XML und Java __________________________________________________________________ Dokumenttyp-Definition (DTD) ____________________________________________________ Parsen von XML-Dokumenten _____________________________________________________ Weitere Einsatzmöglichkeiten von XML ___________________________________________ Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences 16 16 17 19 22 24 27 30 30 32 35 Inhaltsverzeichnis 2 4 2.1 2.2 2.3 2.4 Komponententechnologien _________________________________________________________ Einleitung _____________________________________________________________________ Komponentenorientierte Softwareentwicklung _________________________________________ Komponenten, Frameworks, Bibliotheken – Eine Einordnung _____________________________ Komponenten-Frameworks und Komponenten-Bibliotheken ______________________________ 38 38 39 39 41 3.1 3.2 3.3 3.4 JavaBeans _______________________________________________________________________ Einführung in JavaBeans __________________________________________________________ Das JavaBeans Komponentenmodell_________________________________________________ Eigenschaften___________________________________________________________________ Entwicklung von JavaBeans _______________________________________________________ 43 43 44 45 47 4.1 4.2 4.3 4.4 4.5 RMI – Remote Method Invocation___________________________________________________ Verteilte Objekte ________________________________________________________________ Verteilte Anwendungen mit RMI ___________________________________________________ Programmieren mit RMI __________________________________________________________ Übergabe von Objekten ___________________________________________________________ Komponentenbasierte Entwicklung von RMI-Anwendungen ______________________________ 49 49 50 51 54 55 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 EJB - Enterprise JavaBeans ________________________________________________________ Überblick über Enterprise JavaBeans ________________________________________________ Vorteile von EJB ________________________________________________________________ Nachteile von EJB _______________________________________________________________ Rollen bei der EJB-Entwicklung ____________________________________________________ EJB Architektur _________________________________________________________________ Session und Entity-Beans _________________________________________________________ Dienste________________________________________________________________________ Überblick über Klassen und Schnittstellen der EJB-API__________________________________ Überblick über die Entwicklung von Enterprise JavaBeans _______________________________ Szenario eines EJB-Methodenaufrufs (bei zustandsbehafteten Session-Beans) ______________ 56 56 59 60 61 62 67 69 72 73 74 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 JDBC – Java Database Connectivity _________________________________________________ Was ist JDBC?__________________________________________________________________ JDBC/ODBC ___________________________________________________________________ Warum JDBC verwenden? ________________________________________________________ JDBC-Treibertypen ______________________________________________________________ Überblick über die wichtigsten Klassen und Schnittstellen der JDBC-API ___________________ Programmieren mit JDBC _________________________________________________________ Transaktionen und Stored Procedures ________________________________________________ Metadaten _____________________________________________________________________ 76 76 77 78 78 80 82 84 84 3 4 5 6 TEIL IV:ANFORDERUNGSANALYSE UND SYSTEMSPEZIFIKATION ________ 87 1 Analyse der Anforderungen ________________________________________________________ 87 2 2.1 2.2 2.3 2.4 Analyse der Webarchitekturen______________________________________________________ Systemanforderungen ____________________________________________________________ Java Server Pages (JSP) und EJBs (3- bzw. logische 4-Tier-Architektur) ____________________ Enterprise JavaBeans (3-Tier-Architektur) ____________________________________________ Java-Applikation (3-Tier-Architektur) _______________________________________________ 3.1 3.2 Analyse existierender Benutzeroberflächen ___________________________________________ 94 Web-basiert: Oracle WebDB_______________________________________________________ 94 Benutzerfreundlich: Microsoft Access _______________________________________________ 97 3 4 89 89 89 90 92 Use-Cases _______________________________________________________________________ 99 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Inhaltsverzeichnis 5 TEIL V: DESIGN __________________________________________________ 101 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 Grobentwurf____________________________________________________________________ Verteilungsdiagramm ___________________________________________________________ Grobstruktur der Anwendung _____________________________________________________ Graphisches User-Interface (GUI)__________________________________________________ XML als Übertragungsprotokoll ___________________________________________________ XML-Verarbeitung mit JavaBeans _________________________________________________ Applet oder Applikation? ________________________________________________________ Auswahl des JDBC-Treibers ______________________________________________________ Einbindung eines XSL-Prozessors__________________________________________________ 101 101 102 104 114 118 118 119 120 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Feinentwurf ____________________________________________________________________ Pakete und Komponenten ________________________________________________________ xqt.client _____________________________________________________________________ xqt.converter __________________________________________________________________ com.microstar.xml.AElfred _______________________________________________________ tdg.Perspective_________________________________________________________________ xqt.server _____________________________________________________________________ xqt.QueryBean_________________________________________________________________ 122 122 122 123 124 124 125 127 2 TEIL VI:IMPLEMENTIERUNG _______________________________________ 128 1 1.1 1.2 1.3 Verwendete Hard- und Software ___________________________________________________ Rechnerausstattung und Betriebssystem _____________________________________________ Entwicklungsumgebung _________________________________________________________ Applikationsserver______________________________________________________________ 128 128 128 128 2.1 2.2 2.3 Implementierungsdetails __________________________________________________________ xqt.XMLConverter _____________________________________________________________ xqt.server.XQTServer ___________________________________________________________ xqt.QueryBean_________________________________________________________________ 129 129 130 131 3.1 3.2 3.3 3.4 Probleme bei der Implementierung _________________________________________________ Verschiedene Java-Versionen _____________________________________________________ Installation der HTML-Seite auf dem OAS___________________________________________ Netscape Navigator 4.6 und Internet Explorer 5 _______________________________________ Probleme mit Oracle's JDeveloper 2.0_______________________________________________ 135 135 135 135 136 2 3 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Inhaltsverzeichnis 6 TEIL VII: ANHANG _______________________________________________ 137 1 1.1 1.2 1.3 1.4 Überblick über XML-Software_____________________________________________________ XML-Parser ___________________________________________________________________ XSL-Prozessoren _______________________________________________________________ XML-Browser _________________________________________________________________ Sonstige XML-Software _________________________________________________________ 137 137 138 138 138 2.1 2.2 2.3 2.4 2.5 Überblick über EJB-Produkte _____________________________________________________ Persistence PowerTier ___________________________________________________________ BEA WebLogic Application Server ________________________________________________ Oracle Application Server 4.0.7 (OAS)______________________________________________ EJBoss Version 0.7 _____________________________________________________________ EJBHome Version 0.5.1 _________________________________________________________ 140 140 140 141 141 141 2 3 Zuordnung SQL/Java-Datentypen __________________________________________________ 142 4 Literatur _______________________________________________________________________ 143 5 Glossar ________________________________________________________________________ 154 6 Index __________________________________________________________________________ 157 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Zusammenfassung 7 Zusammenfassung Deutsch Diese Diplomarbeit beschäftigt sich mit Web-Informationssystemen, insbesondere mit den Möglichkeiten der Abfrage und Visualisierung von relationalen Datenbanken über ein Netzwerk. In den Grundlagenkapiteln werden die für die Implementierung eines Query-Tools interessanten Technologien näher beschrieben. Im einzelnen geht es um XML, Komponententechnologien, JavaBeans, der Remote Method Invocation (RMI), der Java-Datenbank-Schnittstelle JDBC und um Enterprise JavaBeans (EJB). Ziel der Diplomarbeit ist die Implementierung eines Web-Informationssystems – eines QueryTools – und der Nachweis der Funktionsfähigkeit oben beschriebener Technologien – insbesondere der Datenübertragung mit XML. Der Prototyp des Query-Tools arbeitet mit XML als Datenaustauschformat und JDBC, um auf eine Oracle-Datenbank zuzugreifen. Das Kommunikationsprotokoll zwischen Client und Server ist RMI. Es werden auf Client- und Serverseite JavaBeans – jedoch keine Enterprise JavaBeans – eingesetzt. Zur Visualisierung der Ergebnisse der Datenbankanfragen wird ein Java-Applet mit einer integrierten JavaBean zur Darstellung von Charts verwendet. English The subject of this thesis is web information systems, in particular tools for querying and visualizing rational databases. In the theoretical part of the thesis technologies are described in detail that are relevant for the implementation of query tools. XML, component technologies, JavaBeans, Remote Method Invocation (RMI), the Java Database Connectivity (JDBC) and Enterprise JavaBeans (EJB) are covered. The aim of the thesis is twofold: Firstly to demonstrate the implementation of a web informations system or query tool. Secondly the proof of concept of the technologies described in the theoretical chapters, and in particular XML-technology. The prototype of the query tool works with XML as a data exchange format, and with JDBC to access an Oracle database. The communication protocol of the application is RMI. JavaBeans - not Enterprise JavaBeans - are used both on the client- and on the serverside of the application. A Java applet with an integrated JavaBean for viewing charts is used to visualize the results of database queries. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Abbildungsverzeichnis Abbildungsverzeichnis Abbildung III-1: Geschäftsprozesse mit EDI _____________________________________18 Abbildung III-2: Geschäftsprozesse mit EDI und XML _____________________________19 Abbildung III-3: Komponenten eines Dokuments _________________________________21 Abbildung III-4: HTML-Dokument als Text, Schachtelbild und Strukturbaum ____________21 Abbildung III-5: Einordung von SGML, XML und HTML____________________________23 Abbildung III-6: Struktur, Darstellung und Inhalt mit der XML ________________________24 Abbildung III-7: XSL und Untermengen_________________________________________27 Abbildung III-8: Überblick über das XSL Verarbeitungs-Modell (aus [Holman 99])________28 Abbildung III-9: Struktur, Darstellung und Inhalt mit der XML ________________________33 Abbildung III-10: Ablauf der XML-Verarbeitung___________________________________33 Abbildung III-11: Die zwei Teile der DOM Level 1-Spezifikation ______________________34 Abbildung III-12: Speichern und Laden von JavaBeans ____________________________36 Abbildung III-13: Softwarewartung ____________________________________________38 Abbildung III-14: Generische Komponentenbibliotheken ___________________________41 Abbildung III-15: Vergleich des Codumfanges ___________________________________42 Abbildung III-16: Reflexion und Introspektion ____________________________________45 Abbildung III-17: Client/Server-Anwendungen und RMI ____________________________50 Abbildung III-18: Funktionsweise von RMI – Stub und Skeleton______________________52 Abbildung III-19: Anwendung von RMI _________________________________________53 Abbildung III-20: Komponententechnologie und RMI ______________________________55 Abbildung III-21: Warum 3-stufige Architekturen verwenden? _______________________58 Abbildung III-22: Überblick über die EJB-Architektur ______________________________62 Abbildung III-23: UML-Klassendiagramm der EJB-Architektur _______________________62 Abbildung III-24: Aufbau eines EJB-Containers __________________________________64 Abbildung III-25: Detaillierter Aufbau eines EJB-Containers_________________________65 Abbildung III-26: Session-Beans und Entity-Beans________________________________67 Abbildung III-27: Verwendung von Entity-Beans__________________________________69 Abbildung III-28: EJBObject, EJBHome, EJBMetaData ____________________________72 Abbildung III-29: EnterpriseBean und Subklassen ________________________________73 Abbildung III-30: EJB-Methodenaufruf bei zustandsbehafteten Session-Beans__________75 Abbildung III-31: JDBC Typ 1-Treiber (JDBC-ODBC-Bridge) ________________________78 Abbildung III-32: JDBC Typ 2-Treiber (JDBC-native API-Bridge) _____________________79 Abbildung III-33: JDBC Typ 3-Treiber (Nativer Protokolltreiber) ______________________79 Abbildung III-34: JDBC Typ 4-Treiber (Netzwerktreiber)____________________________80 Abbildung III-35: JDBC-API__________________________________________________81 Abbildung III-36: Sequenzdiagramm einer SQL-Anfrage ___________________________84 Abbildung III-37: Metadaten einer Datenbank____________________________________85 Abbildung IV-1: Java Server Pages und Enterprise JavaBeans ______________________89 Abbildung IV-2: 3-Tier-Architektur mit Enterprise JavaBeans ________________________91 Abbildung IV-3: 3-Tier-Architektur mit Enterprise JavaBeans ________________________92 Abbildung IV-4: Oracle WebDB: Anzeige der Tabellen des Benutzers BAIER ___________94 Abbildung IV-5: Oracle WebDB: Formular für DB-Anfragen _________________________95 Abbildung IV-6: Oracle WebDB: Dialog "Tables and Views"_________________________96 Abbildung IV-7: Oracle WebDB: Dialog "Join Conditions" __________________________96 Abbildung IV-8: Microsoft Access: Anzeige aller Tabellen einer Datenbank_____________97 Abbildung IV-9: Microsoft Access: GUI zur Erstellung einer Abfrage __________________98 Abbildung IV-10: Use-Case-Diagramm _________________________________________99 Abbildung V-1: Systemarchitektur - Verteilungsdiagramm _________________________101 Abbildung V-2: Paket-/Komponentendiagramm der Anwendung ____________________103 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences 8 Abbildungsverzeichnis Abbildung V-3: Benutzeroberfläche des Query-Tools _____________________________105 Abbildung V-4: Report-Registerkarten des Query-Tools___________________________106 Abbildung V-5: Mapping der Spalten der Rückgabetabelle_________________________107 Abbildung V-6: Visualisierung der Ergebnisse mit der ChartBean ___________________107 Abbildung V-7: Screenshot des Login-Dialogs (Use-Case "Login") __________________109 Abbildung V-8: Aktivitätsdiagramm für Use-Case "Login"__________________________110 Abbildung V-9: Aktivitätsdiagramm für Use-Case "Generate Query" _________________111 Abbildung V-10: Tabellenbaum für den User "baier"______________________________112 Abbildung V-11: Spalten-Frame für die Tabelle COFFEES ________________________112 Abbildung V-12: Aktivitätsdiagramm für den Use-Case "Manage Query" ______________113 Abbildung V-13: Aktivitätsdiagramm für die " Chart"-Use-Cases ____________________114 Abbildung V-14: Struktur, Darstellung und Inhalt mit der XML ______________________116 Abbildung V-15: Klassendiagramm des Clients _________________________________122 Abbildung V-16: Klassendiagramm der XMLConverter-Komponente _________________123 Abbildung V-17: Klassendiagramm von AElfred _________________________________124 Abbildung V-18: Klassen-/Komponentendiagramm des Servers ____________________126 Abbildung V-19: Implementierung des Fassade-Patterns durch die QueryBean ________127 Abbildung VI-1: Konvertierung eines XML-Dokumentes in eine Swing-Tabelle _________129 Abbildung VI-2: Sequenzdiagramm des Serverstartes ____________________________131 Abbildung VI-3: Sequenzdiagramm des Datenbank-Logins ________________________132 Abbildung VII-1: Tengah EJB Deployment Wizard _______________________________140 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences 9 Verzeichnis der Codebeispiele Verzeichnis der Codebeispiele Codebeispiel III-1: Shakespeare-DTD__________________________________________25 Codebeispiel III-2: Struktur von Kochrezepten mit XML ____________________________29 Codebeispiel III-3: XSL-Pattern_______________________________________________29 Codebeispiel III-4: Anwendung eines Patterns ___________________________________29 Codebeispiel III-5: Transformation von XML in HTML _____________________________29 Codebeispiel III-6: DTD und äquivalente BNF ___________________________________31 Codebeispiel III-7: SAX-Beispieldokument ______________________________________34 Codebeispiel III-8: Parsen mit SAX ____________________________________________35 Codebeispiel III-9: GUI-DTD für Swing _________________________________________35 Codebeispiel III-10: XML-Dokument zur GUI-DTD ________________________________35 Codebeispiel III-11: Dynamisches Laden von Swing-Klassen _______________________36 Codebeispiel III-12: Ausschnitt aus der XMI-DTD_________________________________37 Codebeispiel III-13: Ausschnitt aus der UXF-DTD ________________________________37 Codebeispiel III-14: Anwendung der UXF-DTD __________________________________37 Codebeispiel III-15: Manifest-File _____________________________________________47 Codebeispiel III-16: XML-basierter Deployment-Descriptor _________________________66 Codebeispiel III-17: Methodendeklaration zur Primärschlüssel-Abfrage________________68 Codebeispiel III-18: Laden eines JDBC-Treibers _________________________________82 Codebeispiel III-19: Verbindungsaufbau zur Datenbank mit JDBC____________________82 Codebeispiel III-20: Erzeugung von Statement und ResultSet _______________________83 Codebeispiel III-21: Auslesen der Anfrageergebnisse _____________________________83 Codebeispiel III-22: Datenbankzugriff mit JDBC __________________________________83 Codebeispiel III-23: Metadaten-Abfrage mit JDBC ________________________________85 Codebeispiel V-1: Login-DTD _______________________________________________115 Codebeispiel V-2: SQL-Query-DTD __________________________________________115 Codebeispiel V-3: DTD-Schablone für Abfrageergebnisse _________________________115 Codebeispiel V-4: DTD-Beispiel für eine SQL-Query _____________________________118 Codebeispiel VI-1: Konstruktor von XML2TableConverter _________________________129 Codebeispiel VI-2: Callback-Methode endElement von XML2TableConverter__________130 Codebeispiel VI-3: Callbackmethode convertData von XML2TableConverter __________130 Codebeispiel VI-4: Starten des Servers _______________________________________131 Codebeispiel VI-5: Login in die Datenbank _____________________________________132 Codebeispiel VI-6: Datenbankzugriff und Generierung des XML-Dokumentes _________133 Codebeispiel VI-7: Übernahme des JDBC-ResultSets in das XML-Dokument__________133 Codebeispiel VI-8: Generierung einer DTD_____________________________________134 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences 10 Tabellenverzeichnis 11 Tabellenverzeichnis Tabelle III-1: Unterschiede zwischen CSS und XSL _______________________________26 Tabelle IV-1: Analyse der Anforderungen _______________________________________87 Tabelle IV-2: Systemanforderungen ___________________________________________89 Tabelle IV-3: Verfügbare EJB-Server __________________________________________91 Tabelle VII-1: Zuordnung SQL/Java-Datentypen ________________________________142 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil II: 1. Web-Informationssysteme Teil II: 12 Einleitung 1 Web-Informationssysteme Cyberspace is "A graphic representation of data abstracted from the banks of every computer in the human system. Unthinkable complexity. Lines of light ranged in the nonspace of the mind, clusters and constellations of data. Like city lights, receding." William Gibson Das Thema dieser Diplomarbeit lautet "Komponentenbasierte Abfrage und Visualisierung relationaler Datenbanken mit den Internettechnologien Java, JDBC und XML". Hintergrund dieses Themas ist ein Paradigmenwechsel, der sich bei der Softwareentwicklung für das Internet vollzogen hat. Der Trend geht dahin, plattformunabhängige Technologien zu verwenden, die – und das ist eine wesentliche Forderung – in weiten Bereichen skalierbar, portierbar und erweiterbar sind. Inzwischen wenden immer mehr Unternehmen Datenbank- und Internettechnologien intern und extern an. Beispiele hierfür sind Groupware-Systeme wie Lotus Notes, mit denen eine Kommunikationsinfrastruktur implementiert werden kann, deren Spektrum von elektronischen Schwarzen Brettern bis hin zum Dokumentenaustausch via E-Mail und zu Videokonferenzen geht. Der elektronische Handel (E-Commerce) wird immer beliebter und zwingt Firmen, derartige Systeme einzuführen, um wettbewerbsfähig zu bleiben. In einigen Bereichen (vor allem im Vertrieb von Software und von Büchern) ist eine völlige Umstrukturierung des Marktes möglich. Schon jetzt ist Software von kleineren Firmen nur noch über das Internet zu bekommen. Auch die Online-Bestellung von Büchern mit 24-Stunden Lieferservice ist oftmals bequemer, als zum Buchladen in die Stadt zu gehen. Aber das Thema sind Web-Informationssysteme im engeren Sinne. Wie auch immer mögliche Implementierungen aussehen, eines haben sie alle gemeinsam: Es sollen Daten, welche in einer Datenbank gespeichert sind, über ein Netzwerk gelesen und vor allem visualisiert werden können. Die heutige Datenvielfalt macht es jedoch schwierig, überhaupt etwas mit den Daten anzufangen. Deshalb liegt heute der Schwerpunkt von Web-Informationssystemen nicht im Umgang mit operativen Daten, sondern vielmehr in der post-operativen Datenanalyse und der benutzerspezifischen Aufarbeitung der gewünschten Daten (z.B. betriebswirtschaftliche Kennzahlen oder deren Visualisierung). 2 Aufgabenbeschreibung Ziel dieser Diplomarbeit ist die Implementierung des Prototyps eines Web-Informationssystems und der Nachweis der Funktionsfähigkeit; besonders im Hinblick auf die Verwendung von XML als Datenaustauschformat. Das zu implementierende Informationssystem ist ein einfaches, Javabasiertes Query-Tool, das es ermöglichen soll, über Internet oder Intranet eine relationale Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil II: 2. Aufgabenbeschreibung 13 Datenbank abzufragen. Aus den Ergebnissen der Anfrage soll ein XML-Dokument generiert und über JavaBeans visualisiert werden. Die folgenden Unterkapitel wurden direkt aus der Aufgabenstellung entnommen und sind als eine Art Lastenheft anzusehen. 2.1 Eingabeschnittstelle für die Formulierung von DBQueries Die Eingabeschnittstelle für die Formulierung der Datenbankanfragen ist ein Java-Applet. Die Erstellung von Datenbankanfragen soll auf zwei Arten erfolgen können: • manuelle Eingabe der SQL-Kommandos • automatische Generierung der SQL-Kommandos über eine intuitiv zu nutzende grafische Benutzeroberfläche Die resultierende SQL-Query soll dann XML-codiert und an den Server des Query-Tools geschickt werden. 2.2 Umsetzung der Anfrageergebnisse nach XML (mit serverseitiger Java-Technologie) Die Ergebnisse der Anfrage sollen nun XML-codiert werden. Dazu muß für jede Anfrage eine neue Dokumenttyp-Definition generiert werden (auf der Basis eines DTD-Templates), welche den prinzipiellen Aufbau des XML-Dokuments beschreibt. Dieses XML-Dokument muß wohlgeformt und gültig (siehe XML-Kapitel) sein, damit die spätere Weiterverarbeitung unproblematisch ist. Insbesondere sollte eine Validierung durch den clientseitigen Parser nicht nötig sein. 2.3 Visualisierung der Anfrageergebnisse und Konfigurierbarkeit der Ausgabeschnittstelle Das Anfrageergebnis wird – wie schon zuvor beschrieben – XML-codiert zurückgegeben. Das heißt, daß zur Auswertung des Ergebnisses ein XML-Parser benötigt wird. Da der Client des Query-Tools ein Java-Applet ist, das im Kontext eines Web-Browsers läuft, muß dieser Parser möglichst klein sein. Viele Parser (z.B. von Sun, IBM oder Oracle) sind viel zu groß, um in ein Applet integriert werden zu können. Deshalb bietet sich hier der freie, nicht-validierende XMLParser AElfred von Microstar an. In jedem Fall muß das zurückgegebene XML-Dokument geparst und die extrahierte Information von JavaBeans visualisiert werden. Es ist angedacht, zumindest zwei Beans zur Visualisierung anzubieten: eine Bean für die Ausgabe einer Tabelle und eine Bean zur Ausgabe eines Diagramms (z.B. Balken- oder Kuchendiagramm). Es existieren verschiedene kommerzielle JavaBeans, die gegen eine entsprechende Lizenzgebühr ins Applet integriert werden können. Eine solche JavaBean sollte vollständig vom Benutzer konfigurierbar sein, um individuelle Auswertungen der operativen Daten vornehmen zu können. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil II: 3. Gliederung der Diplomarbeit 3 Gliederung 14 der Diplomarbeit 3.1 Teil II: Grundlagen In Teil II dieser Diplomarbeit werden die Grundlagen für das zu implementierende Query-Tool beschrieben. Diese Grundlagenkapitel sind als allgemeine Einführung zu sehen und nicht als Analysephase der Diplomarbeit. In Kapitel 1 geht es um die Extensible Markup Language (XML), ihre Bedeutung und ihre Auswirkungen. Da XML ein zentrales Thema dieser Diplomarbeit ist, wird der praktischen Anwendung – generieren und parsen von XML-Dokumenten – ein Großteils des Kapitels eingeräumt. Kapitel 2 befaßt sich allgemein mit Komponententechnologien und versucht, das Paradigma der komponentenorientierten Softwarentwicklung näher zu erläutern. Außerdem wird hier noch eine Einordnung und ein Vergleich mit etablierten Methoden des Software-Engineerings vorgenommen. JavaBeans als populäre, Java-basierte Komponententechnologie wird im folgenden Kapitel besprochen. Dabei werden nach einigen wenigen Grundlagen praktische Aspekte bei der Entwicklung mit JavaBeans angesprochen. Das vierte Kapitel gibt eine Einführung in die Remote Method Invocation (RMI). Diese Javabasierte Kommunikationstechnologie ist die Grundlage für die Entwicklung von verteilten Anwendungen mit Java – insbesondere auch für die Entwicklung von Enterprise JavaBeans (EJBs). Um EJBs geht es in Kapitel 5. Enterprise JavaBeans ist eine recht junge Technologie, deren Spezifikation noch nicht vollständig abgeschlossen ist, die aber schon jetzt als wichtige Alternative zu herkömmlichen Server-Technologien betrachtet wird. Hier wird neben der üblichen Einführung in Theorie und Praxis auch ein knapper Überblick über verfügbare Tools und Applikationsserver gegeben. Als Abschluß des Grundlagenteils gibt das sechste Kapitel eine detaillierte Einführung in die Java Database Connectivity (JDBC). Diese viel verwendete und mittlerweile etablierte Technologie ermöglicht den bequemen Zugriff auf relationale Datenbanken aus einer Java-Anwendung heraus. 3.2 Teil III: Anforderungsanalyse und Systemspezifikation In diesem Teil wird nach einer knappen Zusammenfassung der Anforderungen eine Analyse der möglichen Systemarchitekturen für das Query-Toll vorgenommen. Hier werden auch die Grundlagenentscheidungen für die weitere Entwicklung des Tools getroffen und auf der Basis dieser Entscheidung die Use-Cases (Anwendungsfälle) ermittelt. 3.3 Teil IV: Design Im der Phase des Grobentwurfs werden die Use-Cases näher untersucht und – falls nötig – mit Zustands- oder Aktiviätsdiagrammen näher beschrieben. Außerdem werden verschiedene Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil II: 3. Gliederung der Diplomarbeit 15 Benuteroberflächen auf der Basis von existierenden Query-Tools (Seagate Crystal Reports und Oracle Databrowser) diskutiert und verschiedene Prototypen mit dem GUI-Bilder der Entwicklungsumgebung JDeveloper erstellt. Der Feinentwurf enthält verschiedene Klassen- und Komponentendiagramme, welche die Grundlage für die spätere Implementierung bilden. Dabei wird auch die Einbindung von externen JavaBeans besprochen. 3.4 Teil V: Implementierung Hier wird ein grober Überblick über die verwendeten Entwicklungstools gegeben. Außerdem werden Probleme mit den verschiedenen Java-Versionen und den Web-Browsern näher beschrieben. Eine Dokumentation mit Installationshinweisen und Screenshots bildet den Abschluß dieses Teils der Diplomarbeit. 3.5 Teil VI: Anhang Im Anhang sind Informationen über das Mapping von SQL-Datentypen zu Java-Datentypen zu finden. Außerdem wird die – direkt und indirekt – zitierte Literatur aufgeführt und näher beschrieben. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language Teil III: 16 Grundlagen 1 XML – eXtensible Markup Language Hypertext is not Technology but Literature. The design of tomorrow's literature determines what the human race will be able to keep track of and understand. These are not issues to be left to "technologists" Ted Nelson Ted Nelson schrieb als "hypertext guru" Computergeschichte. Er führte den Begriff Hypertext bereits 1960 ein; 1965 erschien seine erste Veröffentlichung. Nelson's Name ist eng verbunden mit dem "hypertext and interactive multimedia system" Xanadu, dessen Möglichkeiten weit über das hinausgehen (sollten), was wir heute als Internet kennen: Xanadu was meant to be a universal library, a worldwide hypertext publishing tool, a system to resolve copyright disputes, and a meritocratic forum for discussion and debate... Die Idee Nelson's war dabei, ein Computer-System zu entwickeln, das die verschlungenen und divergenten Pfade des menschlichen Denkens nachvollziehen kann. Damit ist gemeint, daß Information – repräsentiert als Text – inhärent nicht-linear ist. Linearer Text ist das, was wir heute mit Textverarbeitungssoftware schreiben – ausschließlich zum Ausdruck auf Papier gedacht. Von diesem Standpunkt aus gesehen ist HTML – und im übrigen auch XML – noch weit davon entfernt, nicht-lineare Information darzustellen. Viele weitere Informationen und Publikationen von Ted Nelson sind unter [Nelson 99] zu finden. Dieses Kapitel führt in das Thema XML (Extensible Markup Language) ein, erklärt die Unterschiede und Gemeinsamkeiten zwischen HTML, SGML und XML und beschreibt die Bedeutung dieser Meta-Auszeichnungssprache. Auch wenn ich gelegentlich geschichtliche Rückblicke eingeschoben habe, soll der Schwerpunkt dieser Einführung nicht auf der Vergangenheit, sondern in der Zukunft der multimedialen Dokumente liegen. 1.1 Einleitung Über XML wird in letzter Zeit viel diskutiert. Viele Firmen beschäftigen sich mit XML und sind dabei, XML-Tools zu entwickeln oder bereits vorhandene Tools auf XML umzustellen. Fast alle großen Datenbankhersteller bieten bereits die Möglichkeit, XML-Dokumente zu speichern oder XML-Dokumente aus Tabellen (relationale Datenbanken) oder aus persistenten Objekten (objektorientierte Datenbanken) zu generieren. Der Wirbel, der um XML gemacht wird, läßt fast vergessen, daß XML eigentlich auf alten Konzepten und Ideen basiert. XML ist eine Teilmenge der viel mächtigeren MetaAuszeichnungssprache SGML, die gerade im Verlagswesen breite Verwendung findet. Aufgrund Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 17 der zu großen Komplexität von SGML wurde eine "SGML-light"-Variante für das Internet entwickelt: XML. 1.2 Wozu XML? XML ist also eine für das Internet entwickelte Teilmenge von SGML, die vor allem zur Speicherung, Übertragung und Darstellung von Informationen dienen soll. Setzt sich XML auf breiter Ebene durch (das gilt als relativ sicher, da viele große Softwareentwickler wie Microsoft, Oracle und Sun ihre Unterstützung zugesichert haben), dann bietet XML ein enormes Potential. Basis für eCommerce Elecronic Commerce ist ein wichtiger Einsatzort für XML. Es geht beim elektronischen Handel nicht nur darum, dem Kunden bunte HTML-Seiten zu präsentieren, sondern auch darum, es dem Kunden einfach zu machen, die gewünschten Artikel zu finden und z.B. Preisvergleiche anzustellen. Die Möglichkeit von XML, Metadaten (Daten über Daten) bereitzustellen, ermöglicht es Kunden, genau die Informationen und Artikel zu finden, die sie suchen. Um mit HTML-basierten Suchmaschinen gut umgehen zu können und die gewünschten Informationen zu finden, bedarf es großer Geduld und einiger Erfahrung. Mit XML sollte es erheblich einfacher sein, gewünschte Informationen zu finden. Die Mitglieder der (englischsprachigen) XML-Mailinglist von Roger Costello haben ein Projekt initiiert, das als Referenzimplementierung und Musterbeispiel für eine XML-basierte eCommerceWebsite dient [Costello 99]. Diese Referenz-Website demonstriert eindrucksvoll die Möglichkeiten und Chancen, die XML dem Electronic Commerce bietet. Datenaustausch mit EDI und XML Electronic Data Interchange (EDI) besteht aus einer Sammlung von Nachrichtenformaten und einem Dictionary, um Daten zwischen Geschäftspartnern auszutauschen. Damit ermöglicht EDI die Automatisierung von Geschäftsprozessen und bietet damit ein enormes Einsparpotential für Firmen. Folgende Abbildung (nach [XML/EDI 99]) zeigt die Möglichkeiten, die EDI bietet: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 18 Web-Server E-Mail Web-Content + Catalogue Customers Application Database Customers HTML Order EDIFACT Order Accounting Database E-Mail EDIFACT Confirm EDIFACT Confirm Billing Notification EDI API EDIFACT Confirm Suppliers EDIFACT Order Order processing Application Database Abbildung III-1: Geschäftsprozesse mit EDI EDI konnte sich allerdings bislang nur bei großen Firmen durchsetzen, da die nötigen Implementierungs- und Betriebskosten als sehr hoch eingeschätzt werden [Buxmann 99]. XML soll nun als Grundlage der Beschreibung von EDI-Dokumenten dienen, um eine einfache und dabei flexible Möglichkeit der Weiterverarbeitung von Daten zu bieten. Mit der weiter wachsenden Bedeutung des Internet und damit von XML als universelle WebSprache könnte EDI einen neuen Anstoß geben. Einer der Vorteile, die XML bietet, ist der Zugriff auf kostengünstige, plattformunabhängige Software, der es auch kleinen Unternehmen möglich macht, von den Vorteilen des Internet und von EDI zu profitieren [Buxmann 99]. Folgende Abbildung zeigt die Kombination von XML und EDI, wie sie von der XML/EDI-Group [XML/EDI 99] beschrieben wird: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences 19 EDIFACT XML/EDI Intranet XML/EDI XML/EDI Web Browsers Communications Catalogues/Push XML/EDI Business Applications Content/Docs XML/EDI XML/EDI XML/EDI XML/EDI Teil III: 1. XML – eXtensible Markup Language Web Server Repository/Search Abbildung III-2: Geschäftsprozesse mit EDI und XML Diese Grafik macht vor allem deutlich, daß eine XML/EDI-Kombination die Basis für eine sowohl interne als auch externe Kommunikation bietet. So können auch Firmen ohne teure EDISpezialsoftware in den elektronischen Datenaustausch eingebunden werden. Plattform- und Medienunabhängiges elektronisches Publishing Online-Publishing ist oftmals eine schwierige Sache. Die zahlreich vorhandenen Textverarbeitungsprogramme mit ihren proprietären Formaten machen es schwierig, Dokumente ins Netz zu bringen, die wirklich auf jedem System angezeigt werden können. Aus diesem Grund wählt man für Online-Dokumente meist Formate wie Adobe's PDF oder Postscript, die auf nahezu allen Plattformen gelesen werden können. Leider ist auch hier nicht gewährleistet, daß jeder User die entsprechenden Dokumente lesen kann, obwohl beispielsweise der Acrobat Reader von Adobe (zum Lesen von PDF-Dokumenten) zur Basissoftware eines jeden Rechners gehört und auf den meisten Systemen vorinstalliert ist. Und Postscript ist ohnehin kein gutes Datenaustauschformat, da Postscript zunächst einmal ein Druckerformat zur Ausgabe von Dokumenten auf einem PostscriptDrucker ist XML ist hier ein Ausweg aus dem Dschungel der Textformate. Bei Textformaten wie HTML geht – gerade bei der Generierung aus Dokumenten eines bestimmten Textverarbeitungsprogrammes – fast immer Information verloren, während mit XML jede nur denkbare Information gespeichert werden kann. Hersteller von Textverarbeitungsprogrammen wie Microsoft haben bereits angekündigt, daß in zukünftigen Versionen ihrer Software Export- und Importmöglichkeiten für XML-Dokumente integriert sein sollen. 1.3 Dokumente Dieses Unterkapitel nimmt zwar stets Bezug auf XML, dient aber ganz allgemein dazu, erste Begriffe aus dem Bereich der Dokumentenverarbeitung einzuführen und zu erklären. Was versteht man nun unter einem Dokument? Ein (Online-) Dokument, wie es etwa in einem Web-Browser angezeigt wird, besteht aus verschiedenen Elementen – meist noch aus Text, zunehmend aber auch Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 20 aus multimedialen Elementen wie Sounds und Grafiken; sogar interaktive Filme sind möglich. Diese Beispiele zeigen, daß der Begriff des Dokumentes, wie er gewöhnlich gebraucht wird, zu einschränkend ist. Also läßt sich definieren: Ein Dokument besteht aus dem eigentlichen Inhalt, sowie aus Struktur- und Darstellungsinformationen. Inhalte sind nicht auf Text eingeschränkt und können multimedialer Art sein. Diese Definition macht eines klar: ein solches multimediales Dokument ist nicht als BildschirmPreview eines auszudruckenden Textes, sondern als interaktives Medium zu sehen. Aufbau von Dokumenten Prinzipiell lassen sich die Bestandteile eines Dokumentes in drei Gruppen einteilen: • Strukturelemente • Darstellungsinformationen • Inhalt Die Struktur eines Dokumentes wird durch Strukturelemente wiedergegeben. In XML sind solche Strukturelemente Tags, in die der eigentliche Inhalt eingefügt wird. Beispiel: <Überschrift_1> ... </Überschrift_1> Wie diese Strukturtags genau angeordnet sind und wie sie verschachtelt werden können, wird in der Dokumenttyp-Definition (DTD) eines XML-Dokumentes angegeben. Struktur Wie ist das Dokument aufgebaut? A B C B C C B C C C Darstellungsinformationen <Überschrift> <Standard> <Code> Fett Standard Wie werden die Strukturelemente tatsächlich dargestellt? Courier Inhalt Text texttexttexttextte xttextexttexttextt exttexttextxttextt exttexttexttextext texttexttexttextte xt Bilder Was ist der Inhalt des Dokumentes? - Text - Bilder - Multimedia Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 21 Abbildung III-3: Komponenten eines Dokuments Für die Darstellung des Dokumentes wird eine Stylesheet-Sprache (z.B. XSL oder CSS) verwendet, mit der die Bildschirmdarstellung erzeugt wird. Die XML benutzt für die Darstellung die Extensible Stylesheet Language (XSL), deren Spezifikation zur Zeit (Mitte 1999) leider noch nicht abgeschlossen ist. Strukturelemente Strukturelemente dienen dazu, den inneren Aufbau bzw. die logische Struktur des Dokumentes zu beschreiben. Die folgende Abbildung (entnommen aus dem iX-Artikel "Revolution der Experten" [Macherius 97]) zeigt die Struktur eines HTML-Dokumentes. Problematisch ist, daß HTML nicht nur Strukturelemente bietet, sondern auch Tags, die Darstellungsinformationen beinhalten, die also für das Layout zuständig sind. <html> <html> <head> <title> <head> HTML <title> INHALT INHALT </title> </head> <body> <table> <tr> <td> HEAD BODY TITLE TABLE PCDATA TR <body> <table> <tr> <td> INHALT INHALT </td> <td> INHALT TD TD PCDATA PCDATA <td> INHALT </td> </tr> </table> </body> </html> Abbildung III-4: HTML-Dokument als Text, Schachtelbild und Strukturbaum Darstellungselemente Diese Elemente geben konkret an, wie der Dokumenteninhalt auf dem Bildschirm ausgegeben werden soll, d.h. ob beispielsweise Text in Standardschrift oder kursiv ausgegeben werden soll. In HTML sind Layout und Struktur eines Dokumentes untrennbar miteinander verbunden. Es besteht in HTML allerdings auch die Möglichkeit, Cascading Style Sheets (CSS) zu verwenden, was zu einer größeren Flexibilität führt. Generic Markup Was bedeutet nun der Begriff Generic Markup? Markup bedeutet "Auszeichnung" und generic heißt übersetzt "artmäßig". Markup ist jede zusätzliche Information, die über den reinen Inhalt eines Dokumentes hinausgeht – also etwas über die Art der Textstelle aussagt. In diesem Sinne werden Schriftarten, Schriftgröße, aber auch erweiterte Features wie Fußnoten oder Inhaltsverzeichnisse als Markup bezeichnet. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 22 1.4 HTML, SGML und XML – Eine Einordnung HTML Die Sprache des Internet ist HTML. Fast alle Internet-Seiten verwenden diese Auszeichnungssprache, um Dokumente im Netz darzustellen. HTML ist 1989 aus der SGML (Standard Generalized Markup Language) entstanden und hat seitdem eine große Verbreitung gefunden. Offensichtlicher Vorteil von HTML ist die Einfachheit der Sprache, d.h. es ist relativ einfach, ein HTML-Dokument zu erstellen, sofern nicht ohnehin ein WYSIWYG-Editor verwendet wird. Leider hat HTML auch viele Nachteile. So gibt es nur eine beschränkte Anzahl von Elementtypen (z.B. <TITLE>, <HEAD> und <BODY> für die Strukturierung oder <EM> und <SUB> für Hervorhebungen, also für Darstellungsinformationen). Da diese wenigen Elementtypen nicht ausreichten, um komplexere Dokumente zu erstellen, wurde der HTML-Standard vor allem von den großen Browser-Firmen (Netscape und Microsoft) ständig erweitert und läuft nun Gefahr, in verschiedene Dialekte auseinander zu driften. Auf vielen Websites findet man Hinweise wie "Best viewed with XXX Version YYY". Der Internet-Surfer, der gerade nicht den richtigen Browser oder die richtige Version desselben hat, kann die Seite meist nur eingeschränkt lesen – obwohl die relevante Information ohnehin meist nur aus Text besteht. HTML basiert auf einer einzigen Dokumenttyp-Definition (DTD) der SGML. Das heißt, daß alle möglichen Web-Dokumente auf einer einzigen Struktur basieren (bzw. basieren sollten). Das Spektrum der Internet-Anwendungen reicht jedoch von einfachen Textdokumenten ohne Grafiken bis hin zu komplexen, grafischen Web-Seiten mit multimedialen Elementen und interaktivem Inhalt. So ist es kein Wunder, daß HTML in seiner einfachsten Form nur noch von wenigen WebSeiten verwendet wird. 1 Ursprünglich sollte HTML nur Informationen zur Struktur und zum Inhalt des Dokuments kodieren. Allerdings wurden schon recht schnell Stilelemente wie <EM> oder <SUB> für Hervorhebungen eingeführt. Um weitere HTML-Beschränkungen zu umgehen, führten Microsoft und Netscape noch eigene Skriptsprachen (JavaScript, VBScript (VB: Visual Basic)) ein, was nun endgültig dazu führte, daß Firmen mit eigener Web-Page mehrere Versionen ihrer Seite schreiben müssen, um auch wirklich jeden Browser in jeder Version zu unterstützen. Ein anderes Problem mit HTML ist die Implementierung von professionellen WebInformationssystemen, da eine Nutzung der mit HTML dargestellten Daten (die z.B. aus einer Datenbank generiert wurden) nicht möglich ist. Es bleibt nur das Cut & Paste in eine Anwendung (z.B. Microsoft Excel) und die aufwendige (größtenteils manuelle) Aufbereitung der Informationen. So ist es schwierig, Web-Informationssysteme zu entwickeln, die tatsächlich die Daten nicht nur darstellen, sondern auch analysieren, speichern und weiterverarbeiten können. Eine Lösung dieses Problems wäre die Benutzung von SGML (vgl. folgenden Abschnitt). SGML SGML ist eine umfangreiche, komplexe Meta-Auszeichnungssprache, mit der Dokumente aller Bereiche und Medien beschrieben werden können. SGML (auch bekannt als ISO-Norm 8879, nachzulesen unter [ISO 8879]) ist allerdings eine Sprache, zu deren Beherrschung man viel Zeit 1 Viele Seiten verwenden sogar spezielle Plug-Ins wie Macromedia Shockwave, die zwar beeindruckende Effekte (audiovisuell) erlauben, aber eben eigenständige, plattformabhängige Programme sind und von daher fürs Web eigentlich nicht geeignet sind. Man muß allerdings dazu sagen, daß die meisten relevanten PCPlattformen von Macromedia unterstützt werden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 23 investieren muß. Für das Internet ist SGML eindeutig zu kompliziert, komplizierten Aspekte von SGML kaum verwendet werden. zumal gerade die Die Komplexität von SGML war der Grund für die Entwicklung von XML. Das Ziel, eine mächtige Meta-Auszeichnungssprache für das Internet zu schaffen, ohne die Beschränkungen von HTML und ohne die Komplexität von SGML wurde gut erreicht: Die wesentlichen Bestandteile und Ideen von SGML (Trennung von Struktur, Layout und Inhalt) wurden beibehalten. Das Ergebnis war eine Sprache, deren formale Spezifikation auf 33 Seiten Platz findet – die SGMLSpezifkation benötigt 500 Seiten... [Macherius 97]. Nähere Informationen zu SGML findet man im iX-Artikel "Revolution der Experten" [Macherius 97] (daraus stammen auch die meisten Informationen dieses Abschnitts) und auf der SGML/XMLSeite [SGML/XML 99]. Einordnung von SGML, XML und HTML Die Unterschiede und Gemeinsamkeiten zwischen SGML, XML und HTML lassen sich einfach auf den Punkt bringen: HTML ist eine Anwendung von SGML, XML ist eine Teilmenge von SGML. Da SGML eine Metasprache ist, impliziert der Ausdruck Teilmenge, daß auch XML eine Metasprache ist. Zur besseren Übersicht des Sachverhalts dient folgende Grafik: SGML ist Teilmenge von ist Anwendung von (DTD) DSSL Teil der Funktionen von XSL XML ist (bald) Anwendung von (DTD) CSS HTML Abbildung III-5: Einordung von SGML, XML und HTML Für HTML existiert eine sogenannte Dokumenttyp-Definition (DTD), die in SGML geschrieben wurde und sämtliche HTML-Elemente (Tags) definiert - theoretisch zumindest. In der Praxis werden aufgrund proprietärer Erweiterungen der Hersteller der großen Web-Browser weitaus mehr Tags verwendet. Entwurfsziele von XML Es dürfen natürlich in keiner Arbeit zum Thema XML die Entwurfsziele fehlen. So auch nicht in dieser Diplomarbeit: 1. XML soll sich im Internet auf einfache Weise nutzen lassen. 2. XML soll ein breites Spektrum von Anwendungen unterstützen. 3. XML soll zu SGML kompatibel sein. 4. Es soll einfach sein, Programme zu schreiben, die XML-Dokumente verarbeiten. 5. Die Zahl optionaler Merkmale in XML soll minimal sein, idealerweise Null. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 24 6. XML-Dokumente sollten für Menschen lesbar und angemessen verständlich sein. 7. Der XML-Entwurf sollte zügig abgefaßt sein. 8. Der Entwurf von XML soll formal und präzise sein. 9. XML-Dokumente sollen leicht zu erstellen sein. 10. Knappheit von XML-Markup ist von minimaler Bedeutung. Diese deutsche Übersetzung stammt aus [BehmeMintert 98b] und ist in englischer Sprache unter [W3C 98a] zu finden. 1.5 Struktur, Darstellung und Inhalt Da XML eine Metasprache zur Beschreibung von Auszeichnungssprachen ist, läßt sie sich nicht "direkt" wie etwa HTML verwenden. Also muß man eigene Auszeichnungssprachen definieren, was nicht so schwierig ist, wie es sich anhört. Ein XML-Dokument besteht per Definition aus den Komponenten Struktur, Darstellung und Inhalt. Folgende Abbildung gibt einen Überblick: XML Struktur Dokumenttyp-Definition (DTD) .DTD Darstellung Extensible Stylesheet Language (XSL) .XSL Inhalt XML-Daten (XML-Instanz) .XML Abbildung III-6: Struktur, Darstellung und Inhalt mit der XML XML-Daten (oder XML-Instanzen) lassen sich nur formatiert anzeigen, wenn die entsprechenden Darstellungsinformationen gegeben sind. Sind XML-Daten und Informationen für die Darstellung vorhanden, wird das XML-Dokument wohlgeformt genannt. Eine DTD ist zur formatierten Ausgabe auf dem Bildschirm also nicht unbedingt erforderlich. Soll ein XML-Dokument auch gültig sein, muß allerdings die DTD vorhanden sein. XML-Parser, die eine DTD lesen und sie mit der tatsächlichen Struktur des Dokuments vergleichen, heißen validierende Parser; andernfalls werden sie nicht-validierend genannt.2 Die folgenden Abschnitte gehen etwas genauer auf die einzelnen Bestandteile eines XMLDokumentes ein. Hier werden auch konkrete Beispiele für DTDs, Stylesheets und XML-Daten aufgelisted. Struktur: Dokumenttyp-Definition (DTD) Die DTD dient dazu, eine bestimmte XML-Sprache zu definieren. Sie beschreibt also den strukturellen Aufbau und die logischen Elemente eines Dokumenttyps. Ein Dokumenttyp ist eine 2 Die HTML-Arbeitsgruppe des W3C ist zur Zeit (Mitte 1999) dabei, HTML als Satz von XML-DTDs neu zu definieren. Beispiele für DTD-Module sind Tabellen, Mathematik und Multimedia. Grund für den modularen Aufbau ist, die Komplexität der HTML-DTD überschaubar zu halten und es gleichzeitig HTMLAutoren zu ermöglichen, die einzelnen Module in ihre Dokumente einzubinden. Warum wird HTML überhaupt noch einmal neu in XML definiert? Diese Neu-Definition ist als langsamer Umstieg auf XML gedacht. HTML-AutorInnen müssen sich, wenn die entsprechenden DTDs einmal vorliegen, nicht mehr um XML als Sprache kümmern. Sie können einfach weiter in HTML ihre Websites schreiben – die zugrundeliegende XML bleibt also für Web-AutorInnen vollkommen transparent. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 25 Klasse von Dokumenten gleicher Struktur. Die DTD ist also nützlich und sinnvoll, wenn mehrere isomorphe (strukturgleiche) XML-Dokumente geschrieben werden müssen. So könnte einE ProfessorIn beispielsweise eine DTD für den Aufbau von Diplomarbeiten schreiben, die dann Studierende verwenden müssen. Eine solche DTD würde dann dazu führen, daß die Diplomarbeiten zwar die gleiche Struktur, aber nicht notwendigerweise das gleiche Aussehen haben, da die Formatierung mit einem Stylesheet (z.B. XSL) erfolgt. Folgende DTD stammt von einer populären XML-Website [Bosak 99] mit den Texten von Shakespeare: <!-- DTD for Shakespeare J. Bosak 1994.03.01, 1997.01.02 --> <!-- Revised for case sensitivity 1997.09.10 --> <!-- Revised for XML 1.0 conformity 1998.01.27 (thanks to Eve Maler) --> <!-- <!ENTITY amp "&#38;#38;"> --> <!ELEMENT PLAY (TITLE, FM, PERSONAE, SCNDESCR, PLAYSUBT, INDUCT?, PROLOGUE?, ACT+, EPILOGUE?)> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT FM (P+)> <!ELEMENT P (#PCDATA)> <!ELEMENT PERSONAE (TITLE, (PERSONA | PGROUP)+)> <!ELEMENT PGROUP (PERSONA+, GRPDESCR)> <!ELEMENT PERSONA (#PCDATA)> <!ELEMENT GRPDESCR (#PCDATA)> <!ELEMENT SCNDESCR (#PCDATA)> <!ELEMENT PLAYSUBT (#PCDATA)> <!ELEMENT INDUCT (TITLE, SUBTITLE*, (SCENE+|(SPEECH|STAGEDIR|SUBHEAD)+))> <!ELEMENT ACT (TITLE, SUBTITLE*, PROLOGUE?, SCENE+, ILOGUE?)> <!ELEMENT SCENE (TITLE, SUBTITLE*, (SPEECH | STAGEDIR | SUBHEAD)+)> <!ELEMENT PROLOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)> <!ELEMENT EPILOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)> <!ELEMENT SPEECH (SPEAKER+, (LINE | STAGEDIR | SUBHEAD)+)> <!ELEMENT SPEAKER (#PCDATA)> <!ELEMENT LINE (#PCDATA | STAGEDIR)*> <!ELEMENT STAGEDIR (#PCDATA)> <!ELEMENT SUBTITLE (#PCDATA)> <!ELEMENT SUBHEAD (#PCDATA)> Codebeispiel III-1: Shakespeare-DTD Komplexe DTDs wie die Shakespeare-DTD zu schreiben, erfordert also Programmierkenntnisse. Allerdings gibt es bereits jetzt im Internet eine Vielzahl von frei verfügbaren DTDs für die verschiedensten Zwecke. Die DTD ist also eine Grammatik, deren Produktionsregeln einen bestimmten Dokumenttyp definieren. Schreibt man ein wohlgeformtes XML-Dokument, d.h. insbesondere, daß alle geöffneten Tags auch wieder geschlossen werden müssen, dann benötigt man die DTD nicht unbedingt für die Ausgabe des Dokumentes, da die Strukturinformationen des Dokumentes ja implizit im XML-Dokument vorhanden sind. Aus diesem Grund unterscheidet man auch validierende und nicht-validierende XML-Parser. Die validierenden Parser lesen sowohl die XMLDaten als auch die DTD und prüfen, ob die XML-Instanz gültig ist. Nicht-validierende Parser sind Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 26 sinnvoll, wenn nur eine einzige Instanz eines Dokumenttyps geschrieben wurde, also keine strukturelle Übereinstimmung mit einer bestimmten DTD vorhanden sein muß. Darstellung: Extensible Stylesheet Language (XSL) Zur Darstellung von XML-Dokumenten soll die Extensible Stylesheet Language (XSL) verwendet werden. Wozu dient nun ein solches, z.B. in XSL verfaßtes Stylesheet? Mit einem Stylesheet ist es möglich, die Art der Darstellung auf dem Bildschirm genau zu spezifizieren. Der Vorteil eines Stylesheets ist, daß das Aussehen eines Dokumentes beliebig verändert werden kann, ohne seine Struktur zu ändern. Wird beispielsweise CSS (Cascading Style Sheet) zur Darstellung von HTMLDokumenten verwendet, dann kann man sein Dokument relativ frei gestalten, ohne dabei neue, darstellungspezifische HTML-Tags verwenden zu müssen. Dies führt – bei einer entsprechenden Verbreitung von Stylesheet-Prozessoren (z.B. durch Implementierung in einem Web-Browser) – zu einer weitgehenden Plattformunabhängigkeit. Für die Formatierung von SGML-Dokumenten ist die DSSSL (Document Style Semantics and Specification Language) zuständig. Die DSSSL basiert auf einem Lisp-Dialekt namens Scheme. Scheme ist somit eine deklarative Programmiersprache; ideal um Formatierungsangaben zu deklarieren, leider jedoch zu kompliziert, um sie Nicht-Fachleuten zumuten zu können. Aus diesem Grund wurde speziell für XML die Extensible Stylesheet Language (XSL) entwickelt, die allerdings auch alles andere als leicht verständlich ist. Wie auch immer, XSL ist also die Sprache, in der XML-Darstellungsinformationen deklariert werden. Leider ist der Entwurf von XSL noch nicht abgeschlossen, was auch in näherer Zukunft ein Problem für EntwicklerInnen bleiben wird. Wozu wurde überhaupt XSL entwickelt, wo doch schon seit längerem an CSS gearbeitet wird und CSS auch verwendet werden kann, um XML-Dokumente anzuzeigen? Hauptunterschied zwischen CSS und XSL ist die Möglichkeit von XSL, Dokumente in ein anderes Format zu transformieren. Mit XSLT (XSL Transformations) - einer Untermenge von XSL - können XML-Dokumente z.B. in HTML/CSS-Dokumente umgewandelt werden. Tatsächlich ist die Möglichkeit der Transformation zur Zeit der Hauptgrund für die Verwendung von XSL. Der Internet Explorer 5.0 z.B. verwendet XSL, um XML-Dokumente in HTML/CSSDokumente umzuwandeln und am Bildschirm anzuzeigen. Es wird also kein "echtes" XML dargestellt, sondern lediglich ein HTML-Dokument. Die Unterschiede zwischen CSS und XSL werden in folgender Tabelle (aus [W3C 97]) nochmals dargestellt: CSS XSL Verwendung mit HTML? ja nein Verwendung mit XML? ja ja Dokument-Transformation möglich? nein ja Syntax CSS XML Tabelle III-1: Unterschiede zwischen CSS und XSL Nähere Einzelheiten zu XSLT (Transformation) und XSL (Formatierungssemantik) sind im folgenden Unterkapitel zu finden. Inhalt: XML-Daten Der Inhalt eines Dokumentes kann sowohl textueller als auch multimedialer Art sein. Will man beispielsweise ein MPEG-Video in das Dokument einbauen, so muß dieses Video zuvor als Enitity deklariert werden: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 27 <!ENTITY mein_video SYSTEM "videos/video1.mpeg" NDATA MPEG> Eine solche Entity kann dann über &mein_video im Hauptteil des XML-Dokumentes angesprochen werden. Um obige Entity-Deklaration aber auch verwenden zu können, muß eine (möglichst externe) Notations-Deklaration geschrieben werden, damit z.B. ein Web-Browser zur Darstellung dieses Inhalts ein Plug-In laden kann: <!NOTATION MPEG SYSTEM "C:\winnt\system32\mplay32.exe"> Will man also Daten ins XML-Dokument einbinden, die nicht Bestandteil von XML sind, so muß man den Typ NDATA verwenden. NDATA zeigt an, daß es sich bei dem Datentyp der entsprechenden Entity nicht um XML-Daten handelt, sondern um ein beliebiges anderes Datenformat, das (zumeist extern) deklariert wird. In obigem Beispiel wird der Datentyp MPEG deklariert und näher beschrieben. 1.6 XSL – Extensible Stylesheet Language Die Extensible Stylesheet Language (XSL) war ursprünglich sowohl zur Formatierung von Objekten als auch zur Transformation von einer XML-Instanz (oder XML-Sprache) in eine andere XML-Instanz gedacht. Prinzipiell ist dies immer noch richtig, allerdings hat das W3C jetzt (April 1999) eine Aufteilung der XSL in zwei Untermengen beschlossen: • XSL für die Formatierung von Objekten • XSLT für die Transformation in eine andere XML-Sprache Außerdem wurde die XML Path Language (XPath) aus der XSL-Spezifikation herausgenommen. Dieser Teil der XSL ist jetzt in einer eigenen Spezifikation zu finden. XSL und XSLT Die Extensible Stylesheet Language besteht also aus Formatierungsspezifikation von XSL (Semantik der Transformationsspezifkation, die jetzt den Namen XSLT trägt: zwei Untermengen: Formatierung) und Der der XSL XSL Transformationsspezifikation (XSLT) XSL Formatierungsspezifikation Abbildung III-7: XSL und Untermengen XSLT dient dazu, einen XML-Strukturbaum in einen anderen XML-Strukturbaum umzuwandeln. Der entstehende neue Strukturbaum kann dabei völlig vom Original verschieden sein. Die Formatierungsspezifikation dient dazu, einen solchen Strukturbaum am Bildschirm darzustellen. Die Trennung von Transformation und Formatierung macht es möglich, eine XML-Sprache in eine andere mittels XSLT umzuwandeln und für die Darstellung eine andere Stylesheet-Sprache (z.B. CSS) zu verwenden. XSLT ist also (zumindest prinzipiell) unabhängig von der Formatierungsspezifikation. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 28 CSS und XSL Die Aufteilung der XSL-Spezifikation in zwei Teile macht es leichter möglich, CSS und XSL zusammen zu verwenden. So kann mit XSLT eine komplexere Transformation durchgeführt und mit CSS am Bildschirm formatiert dargestellt werden. XSL und XSLT sind jedoch zusammengenommen sehr viel mächtiger als eine CSS/XSLT-Kombination, da bei einer reinen XSL-Beschreibung ausschließlich die XML-Sprache verwendet werden muß. So hat sich eigentlich nicht viel geändert; es wurde lediglich eine Aufteilung einer umfangreichen Spezifkation in zwei (komplementäre) Untermengen vorgenommen. Transformationen mit XSLT Soll eine XML-Instanz in eine andere XML-Instanz transformiert werden, so wird eine XSL(T) Engine (XSL Prozessor) eingesetzt. Der genaue Transformationsvorgang ist in folgender Abbildung (aus [Holman 99]) gut dargestellt: Abbildung III-8: Überblick über das XSL Verarbeitungs-Modell (aus [Holman 99]) Das Transformationsmodell basiert auf sogenannten Templates. Die Verarbeitung eines Source Node Trees (der Baumdarstellung der Struktur des XML-Dokumentes) geschieht über den Vergleich dieses Baumes mit dem Stylesheet Node Tree. Der Source Node Tree wird also mit dem Template – dem Stylesheet Node Tree – verglichen und in einen Result Node Tree umgewandelt. Dieses Ergebnis ist wohlgemerkt kein XML-Dokument sondern lediglich eine Repräsentation des Ergebnisdokumentes. Der Result Node Tree muß nun – beispielsweise über CSS – für den Bildschirm (oder für den Drucker) formatiert werden. Hauptvorteil der Transformation ist, daß ein einziges XML-Dokument die Basis für mehrere verschiedene Dokumente sein kann. Es ist damit möglich, aus einem einfach strukturierten Dokument zusätzliche Informationen zu gewinnen. Man kann z.B. ein Inhaltsverzeichnis oder eine Tabelle mit allen Web-Links des Dokumentes automatisch erstellen. Gerade bei umfangreichen Web-Präsenzen mit täglicher Aktualisierung kann man durch die Automatisierung der Web-SeitenErstellung viel Zeit einsparen. XML-Dokumente mit XSL in HTML transformieren Die in diesem Abschnitt gezeigten Beispiele wurden aus dem XSL-Tutorial von Norman Walsh [WalshGrosso 99] entnommen. Empfehlenswert ist aus Microsoft's XSL-Tutorial [Microsoft 99]. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 29 XSL(T) ist ein sehr mächtiges Hilfsmittel zur Darstellung von XML-Dokumenten. Der folgende Text soll deshalb nur die prinzipielle Funktionsweise von XSL erläutern. Für weiterführende Informationen und komplette Beispiele sei auf [WalshGrosso 99] und [Microsoft 99] verwiesen. Es geht in folgendem Beispiel um die Transformation von Kochrezepten. Kochrezepte haben prinzipiell folgende Struktur: <recipe><name>...</name> <description>...</description> <note>...</note> <note status="credit"><name>Cookbook</name> source credit</note> <ingredient-list yields="..."> <ingredient quantity="..." units="...">...</ingredient> ... </ingredient-list> <preparation preptime="..."> <step>...</step> ... </preparation> </recipe> Codebeispiel III-2: Struktur von Kochrezepten mit XML Es können nun über sogenannte Patterns bestimmte Elemente kontextbezogen aus dem Dokument gefiltert werden: <element type="recipe"> <target-element type="name"/> </element> Codebeispiel III-3: XSL-Pattern Mit diesem Pattern werden nur Namenselemente erfaßt, die unmittelbar nach dem recipe-Element stehen: <?xml version="1.0"> <recipe servings="25"><name>Fried Vegetables</name> <description> ... </description> <note status="credit"><name>The Indian Cookbook</name> by Sumana Ray.</note> Codebeispiel III-4: Anwendung eines Patterns Durch Anwendung obigen Musters erhält man also nur Fried Vegetables, nicht aber The Indian Cookbook. Nun kann man das XML-Dokument z.B. in HTML transformieren: <rule> <element type="recipe"> <target-element type="name"/> </element> <H1 STYLE="color: red"><children/></H1> </rule> Codebeispiel III-5: Transformation von XML in HTML Mit diesem Code werden Rezeptnamen in roter Schrift und als Überschrift (<H1>) dargestellt. In ähnlicher Weise ist es auch möglich, XML-Dokumente z.B. in RTF- oder PDF-Dokumente zu transformieren. Bei komplexen Dokumenten ist dabei ein relativ hoher Programmieraufwand nötig. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 30 1.7 XML und Java Java software is portable code ... XML is portable data. Dave Brownell, Designer von Sun's Project X Dave Brownell hat es hier treffend dargestellt: Java und XML sind geradezu ideal aufeinander abgestimmt. Mit Java kann Code über das Internet als Applet in einem Web-Browser ausgeführt werden. Als universelles Datenübertragungsformat zur Darstellung von Text, Grafiken und Multimedia dient XML. Ein weiterer Grund für die Beliebtheit von Java im XML-Umfeld ist, daß sowohl XML als auch Java sämtliche Unicode-Zeichen erlauben. Es ist kaum möglich, XML-konforme Applikationen zu schreiben, wenn die verwendete Programmiersprache die Unicode-Zeichensätze nicht unterstützt. Von Vorteil ist dies besonders, wenn die XML-Applikation z.B. asiatische Zeichensätze verarbeiten muß – der Programmierer muß keinen speziellen Zusatzcode schreiben. Die Firma Sun Microsystems bietet einen in Java implementierten XML-Parser unter dem Namen "Project X" an. Das Ziel ist die vollständige Integration von XML in Java als Klassenbibliothek. Zur Zeit (August 1999) existieren allerdings noch keine Informationen, wann mit einer solchen Integration zu rechnen ist. 1.8 Dokumenttyp-Definition (DTD) Formale Strukturen zu isolieren, bedeutet zugleich, ihre Relevanz zu erkennen; relevant aber sind sie nur im Hinblick auf eine umfassende Hypothese, in welcher der Sinn des Kunstwerks bereits antizipiert wird. Umberto Eco Dies ist ein eher formales Unterkapitel, das zu einem guten Teil aus Definitionen und Beschreibungen der XML-Grammatik besteht, das jedoch viele wichtige und gerade im nächsten Kapitel zahlreich verwendete Begriffe näher erklärt. Grammatik Eine (natürliche oder formale) Sprache basiert auf einer Grammatik. Eine Grammatik besteht aus Regeln, die die Syntax einer Sprache beschreiben. Die Spezifikation, die die korrekte Konstruktion von Sätzen beschreibt, nennt man Syntax einer Sprache. Die Spezifikation der Bedeutung der Sätze nennt man Semantik. Die Grammatik einer formalen Sprache wie XML besteht aus folgenden Bestandteilen: • Einer Menge von Terminalsymbolen. Terminalsymbole sind bei einer Programmiersprache Zeichen oder Zeichenfolgen wie if, then oder ==. • Einer Menge von Nichtterminalsymbolen. Nichtterminalsymbole sind z.B. <Anweisung>, <Programm> oder <Klasse>. Zur Unterscheidung von Terminalsymbolen setzt man Nichtterminalsymbole meist in <spitze Klammern>. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 31 • Einer Menge von Grammatikregeln (Produktionssystem), welche die Syntax der Sprache festlegen oder die beschreiben, wie man aus bereits bestehenden Konstrukten neue Konstrukte gewinnen kann. • Ein Startsymbol oder Axiom, das stets ein Nichtterminalsymbol ist. In Programmiersprachen wie Java ist das Startsymbol meist <Programm>, in XML ist das Startsymbol der sogenannte <Prolog>. Man unterscheidet nun verschiedene Arten von Grammatiken: kontextfreie, kontextsensitive, lineare und reguläre Grammatiken. Für (imperative) Programmiersprachen verwendet man kontextfreie Grammatiken. Kontextfreie Grammatiken (oder Typ-2-Grammatiken in der ChomskyHierarchie) können z.B. in Backus-Naur-Form (BNF) oder in Form eines Syntaxbaumes dargestellt werden. Auch die XML-DTD ist eine solche Grammatik, die als Strukturbaum dargestellt werden kann. Eine Grammatik ist dann kontextfrei, wenn ein Nichtterminalsymbol vom entsprechenden Produktionssystem unabhängig vom benachbart stehenden Zeichen – also unabhängig vom Kontext – ersetzt wird. Ableitungen in solchen Grammatiken lassen sich stets als Ableitungsbäume darstellen. Eine Sprache, die durch eine kontextfreie Grammatik erzeugt wird, nennt man kontextfreie Sprache. DTD: Grammatik für XML Die XML-DTD ist eine Grammatik, die auch als BNF oder als Syntaxbaum darstellbar ist. Mit einer solchen DTD wird eine XML-Instanz erzeugt. Man kann beispielsweise eine DokumenttypDefinition für HTML schreiben, um in HTML gültige XML-Dokumente zu verfassen. In dieser Diplomarbeit werden SQL-Anfragen gegen eine relationale Datenbank gestellt. Die Anfrageergebnisse sollen XML-codiert an den Client weitergegeben werden. Dazu muß für jede Anfrage eine neue DTD generiert werden, um etwa die Spaltennamen zu integrieren. Da die zu generierenden DTDs prinzipiell ähnlich aufgebaut sind (sie unterscheiden sich lediglich in einigen Element- und Attributnamen), läßt sich eine Schablone verwenden, bei der nur die betreffenden Namen ausgetauscht werden. Näheres dazu ist im XML-Kapitel des Grobentwurfs zu finden. Es ist auch möglich (und sinnvoll), DTDs zu verschachteln. Denkbar ist beispielsweise eine BasisDTD, die – kontextbezogen – auf andere DTDs verweist. Anzumerken ist noch, daß XML-Dokumente prinzipiell nur ein Wurzelelement haben. Das macht es erheblich einfacher zu verifizieren, daß ein Dokument vollständig ist. In dieser Diplomarbeit wird davon ausgegangen, daß nur eine einzige Tabelle zurückgegeben wird. Es ist prinzipiell möglich, eine DTD in eine äquivalente BNF (Backus Naur Form) zu transformieren. Ein Beispiel: <!ELEMENT row (columnName)*> Diesen DTD-Ausschnitt kann man in BNF so schreiben: row ::= (columnName)* Codebeispiel III-6: DTD und äquivalente BNF Die Äquivalenz von DTD und BNF ist in der Praxis oft nützlich. So existieren zahlreiche Grammatiken in BNF, die sich leicht in eine XML-DTD transformieren lassen. Wohlgeformtheit Dem Begriff der Wohlgeformtheit begegnet man im XML-Bereich recht häufig. Unter einem wohlgeformten Dokument versteht man ganz allgemein ein Dokument, das sich fehlerfrei parsen läßt, d.h. das in sich schlüssig und fehlerfrei ist. Wichtig ist zu beachten, daß XML fordert, Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 32 geöffnete Tags auch wieder zu schließen. Bei HTML sind solche Fehler oft unproblematisch; bei XML verletzen sie die Wohlgeformtheitsregel. Gültigkeit Die Gültigkeit eines wohlgeformten XML-Dokumentes wird von einem validierenden Parser aufgrund einer bestimmten DTD nachgewiesen. Das heißt, der Parser vergleicht den strukturellen Aufbau des XML-Dokumentes mit einer vorgegebenen Dokumenttyp-Definition. Geprüft wird im einzelnen: • Sind alle verwendeten Tags in der DTD deklariert? • Stimmt die Struktur des XML-Dokumentes mit der DTD überein? Was bringt es nun, gültige XML-Dokumente zu haben? Zum Beispiel kann man die entsprechendende DTD als Vorlage für eine Reihe strukturgleicher Dokumente verwenden. Wichtig ist dies gerade, wenn XML als firmeninternes Datenaustauschformat verwendet werden soll. Die MitarbeiterInnen einer Firma können sich also darauf verlassen, daß ihre Dokumente zum Firmenstandard konform sind. 1.9 Parsen von XML-Dokumenten Dieses Unterkapitel beschreibt auf der Grundlage der Theorie des vorigen Unterkapitels die softwaretechnische Umsetzung. Es existieren zahlreiche – und meist freie – XML-Parser, und zwar sowohl von den großen Softwarefirmen (Sun, Microsoft, IBM, Oracle, ..) als auch von kleinen Anbietern oder unabhängigen Entwicklern (Microstar, James Clark, ..) Die XML-Parser von Sun, IBM und Oracle sind zwar am komfortabelsten, haben aber leider einen großen Nachteil: Sie sind meist sehr umfangreich – zu umfangreich für ein Java-Applet, das aus dem Web heruntergeladen werden muß. Im folgenden werden die zwei prinzipiellen Arten von XML-Schnittstellen beschrieben: DOM und SAX. DOM (Document Object Model) ist eine Spezifikation des W3C [W3C 1998b], die eine einheitliche, objektorientierte Schnittstelle auf ein XML-Dokument zur Verfügung stellt. SAX (Simple API for XML) ist eine ereignisbasierte API, welche von Mitgliedern der XML-DEV Mailingliste entwickelt wurde, um XML-Dokumente zu parsen, ohne einen aufwendigen Strukturbaum generieren zu müssen. XML-Verarbeitung Zur Verarbeitung von XML-Dokumenten (d.h. vor allem: zum Parsen) benötigt man eine API, welche als Schnittstelle zwischen Dokument und Verarbeitungssoftware fungiert. Prinzipiell unterscheidet man dabei zwei Arten von XML APIs: • baumbasierte APIs und • ereignisbasierte APIs Eine baumbasierte API generiert aus einem XML-Dokument eine Baumstruktur, deren Knoten von Objekten oder Komponenten (d.h. JavaBeans bei Verwendung von Java) repräsentiert werden. Die Anwendung kann dann die Dokumentstruktur analysieren und den Baum beliebig traversieren. Das W3C hat in seiner DOM-Spezifikation [W3C 98b] einen Standard für eine baumbasierte Schnittstelle zu XML entwickelt. Die Implementierungungen dieser Spezifikation sind typischerweise recht komfortabel, haben aber einen erheblich größeren Codeumfang als die entsprechenden SAX-Implementierungen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 33 Problematisch bei baumbasierten APIs ist außerdem eine gewisse Ineffizienz in bestimmten Fällen. Wenn das XML-Dokument sehr groß ist, sind die Kosten für die Generierung eines Strukturbaumes sehr hoch. Bei großen Dokumenten ist es oft am sinnvollsten, die Struktur direkt auf der Festspeicherplatte zu generieren und auch von dort wieder einzulesen. Bei einer reinen Strukturtransformation ist dies oftmals zu aufwendig. Ereignisbasierte APIs (z.B. SAX) erlauben die Registrierung einer Anwendung beim SAX-Parser, um Callback-Aufrufe (also Ereignisse) zu erhalten. Hier gibt es Standardmethoden, die bei einem Start- oder Endtag oder bei Auflösung externer Entitäten aufgerufen werden. Auf diese Weise kann natürlich auch ein Strukturbaum aufgebaut werden; meist ist dies jedoch nicht notwendig, da viele Anwendungen lediglich an Daten einzelner Elemente interessiert sind. DOM DOM ist ein Akronym für Document Object Model. Dieses Document Object Model ist eine API, das den Zugriff auf Struktur und Inhalt eines Dokumentes ermöglicht. DOM-basierte Parser compilieren das vorgegebene XML-Dokument in eine Baumstruktur, welche dann mit StandardAlgorithmen traversiert werden kann: XMLDokument DOM Compilierung in eine Baumstruktur Traversierung des Strukturbaumes durch die Applikation Abbildung III-9: Struktur, Darstellung und Inhalt mit der XML Man kann also zwei prinzipielle Verarbeitungsschritte unterscheiden: Schritt 1: Dokumentanalyse, optionale Gültigkeitsprüfung, Generierung eines Parse-Baumes Schritt 2: Verarbeitung des Parse-Baumes (Zugriff z.B. mit DOM-Interface) Abbildung III-10: Ablauf der XML-Verarbeitung Im ersten Schritt wird ein XML-Dokument analysiert. In diesem Schritt ist es möglich zu prüfen, ob das XML-Dokument gültig ist, d.h. ob das Dokument zu seiner DTD konform ist. Wenn das Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 34 Dokument zumindest wohlgeformt (d.h. syntaktisch korrekt) ist, dann wird ein Parse-Baum generiert, dessen Knoten den Tags des XML-Dokumentes entsprechen. Anschließend werden im zweiten Schritt die so gewonnen Informationen extrahiert und weiterverarbeitet (traversiert). Die DOM Level 1-Spezifikation [W3C 98b] beschreibt also eine plattform- und sprachenunabhängige Schnittstelle zum Zugriff auf XML-Dokumente. Der Hauptvorteil dieser Spezifikation ist tatsächlich die weitgehende Unabhängigkeit von proprietären APIs und Standards. Es ist so kein großes Problem, in einer Applikation den verwendeten XML-Parser auszutauschen, wenn beide Parser DOM unterstützen. Die Spezifikation gliedert sich in zwei Teile: "Core" und "HTML": DOM Level 1 HTML Core Abbildung III-11: Die zwei Teile der DOM Level 1-Spezifikation Der Core-Teil definiert eine minimale Funktionalität, um auf XML-Dokumente zugreifen zu können. Mit dem HTML-Kapitel werden HTML-spezifische Erweiterungen beschrieben, die zusätzlich zum Core implementiert werden müssen. Die Spezifikation von DOM Level 2 beschreibt auf der Grundlage der Level 1-Spezifikation etliche Erweiterungen. Zu diesen Erweiterungen gehören z.B. XML-Namensräume, Stylesheets und Ereignisse. Die Spezifikation ist unter [W3C 99c] zu finden. SAX SAX (Simple API for XML) ist eine ereignisbasierte API zur Verarbeitung von XMLDokumenten, die von den Mitgliedern der XML-DEV-Mailingliste entwickelt wurde. Hintergrund der Entwicklung dieser einfacheren API (im Vergleich zu DOM) ist, daß hier viel weniger Resourcen verbraucht werden als bei der DOM-API. Es ist so möglich, XML-Dokumente zu parsen, die erheblich größer sind als der verfügbare Arbeitsspeicher des Rechners. In vielen Anwendungen – insbesondere in dieser Diplomarbeit – werden lediglich bestimmte Elementnamen und die entsprechenden Informationen gesucht. Will man z.B. nur den Namen des Autors eines Dokumentes ermitteln, kann man mit der SAX-API einfach nach dem entsprechenden Tag suchen und muß nicht den gesamten Strukturbaum aufbauen. Ein Beispiel: <?xml version="1.0"> <example> <title> Testdocument </title> <body> Hi, everybody ! </body> </example> Codebeispiel III-7: SAX-Beispieldokument Mit der SAX-API könnte man folgende Ausgabe erzeugen: start document start element: example Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 35 start element: title char: Testdocument end element: title start element: body char: Hi, everybody ! end element: body end element: example end document Codebeispiel III-8: Parsen mit SAX Ein Beispiel für einen SAX-basierten Parser ist Microstar's AElfred [Microstar 99]. Auf dieser Website ist auch die SAX-Spezifikation zu finden. 1.10 Weitere Einsatzmöglichkeiten von XML Dynamisches Nachladen von Java-Klassen Java bietet die Möglichkeit, Klassen zur Laufzeit dynamisch nachzuladen. Diese Fähigkeit läßt sich vielfältig nutzen: man kann z.B. JDBC-Treiber oder JavaBeans dynamisch nachladen. In Verbindung mit XML bietet das dynamische Nachladen von Klassen ungeahnte Möglichkeiten. Eine Anwendung wäre beispielsweise eine benutzerdefinierte Oberfläche, die im XML-Format abgespeichert und wieder nachgeladen werden kann. Die dafür zuständige DTD könnte etwa so aussehen: <?xml version="1.0"?> <!DOCTYPE SWINGGUI [ <!ELEMENT SWINGGUI(JFRAME)+> <!ELEMENT JFRAME ( JLABEL | JTEXTFIELD | JBUTTON | ... )*> <!ATTLIST JFRAME LAYOUT ( Border | Flow | Gridbag) "Gridbag" TITLE CDATA "JFrame" > ... ]> Codebeispiel III-9: GUI-DTD für Swing Ein auf Swing basierendes GUI besteht also aus mindestens einem Frame (JFrame, um genau zu sein). Jedes Frame besteht wiederum aus beliebigen Kombinationen von Labeln, Textfeldern, Buttons und weiteren Elementen (die ich hier nicht mehr aufgeführt habe). Man kann nun eine GUI folgendermaßen in XML beschreiben: <SWINGGUI> <JFRAME TITLE="MyFrame"> <JBUTTON TITLE="Are you really sure"/> ... </JFRAME> </SWINGGUI> Codebeispiel III-10: XML-Dokument zur GUI-DTD Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 36 Ein solches XML-Dokument wird also von einer Java-Applikation geparst und gegebenenfalls validiert. Wird ein GUI-Element erkannt, kann der Tag-Name an eine Methode übergeben werden, welche die benötigte Swing-Klasse nachlädt und die Parameter entsprechend übergibt: myElement = (JButton)Class.forName(element.getTagName()).newInstance(); Codebeispiel III-11: Dynamisches Laden von Swing-Klassen Bei entsprechendem Programmieraufwand ist es also möglich, ganze GUIs im XML-Format abzuspeichern und wieder nachzuladen. Wünschenswert wäre natürlich die Integration in Entwicklungsumgebungen wie JDeveloper. Aber auch bei der Entwicklung von Tools, die vollständig vom Benutzer konfigurierbar sein sollen, ist XML als flexibles Beschreibungsformat eine große Hilfe. Eine interessante Anwendung dieser Idee wird im folgenden Abschnitt näher beschrieben. Speichern und Laden von JavaBeans In der Online-Zeitschrift JavaWorld [JavaWorld 99] wurde ein Verfahren beschrieben, mit dem man JavaBeans zur Laufzeit mit allen relevanten Eigenschaften (Properties) im XML-Format abspeichern und wieder nachladen kann (Serialisierung/Deserialisierung). Folgende Abbildung (aus [Johnson 99]) illustriert das Prinzip dieses Verfahrens: XMLBeanWriter Running JavaBean <JavaBean CLASS=Arabica> <Properties> <Property NAME="Roast">Dark</Property> ... <JavaBean CLASS=Arabica> <Properties> <Property NAME="Roast">Dark</Property> ... XMLBeanWriter Running JavaBean Abbildung III-12: Speichern und Laden von JavaBeans Der genaue Mechanismus (mit komplettem Sourcecode) wird in [Johnson 99] näher erklärt. XML und UML Es gibt Bestrebungen, die Unified Modeling Language (UML) als XML-DTD zu definieren und damit ein Austauschformat für UML-Modelle festzulegen. Die Vorteile eines StandardAustauschformates für UML liegen auf der Hand: • Unabhängigkeit vom verwendeten Case-Tool • Bequemer Informationsaustausch zwischen Entwicklern Der zweite Punkt ist besonders interessant für LeserInnen von OO-Mailinglisten. Hier wird regelmäßig versucht, mit ASCII-Text UML-Klassendiagramme zu "zeichnen", die sehr schlecht lesbar sind. Problematisch bei einem XML-Dokument zur Beschreibung von UML-Modellen ist natürlich die Formalisierung des Sachverhaltes – hier ist eine gute Tool-Unterstützung nötig. Es gibt im wesentlichen zwei verschiedene DTDs zur Beschreibung von UML: das UML Exchange Format (UXF), welches von der Keio University in Japan entwickelt wird [UXF 99] und das XMI (XML Metadata Interchange), welches von der OMG mit der Unterstützung verschiedener Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 1. XML – eXtensible Markup Language 37 Softwarefirmen (Oracle, IBM, Rational, ...) entwickelt wird [XMI 99]. Im folgenden ein Ausschnitt aus der (sehr umfangreichen) XMI-DTD, der Grundlage für die Beschreibung eines Use-Cases ist: <!ENTITY % extensionPoint 'extensionPoint' > <!ELEMENT extensionPoint (#PCDATA) > <!ENTITY % UseCaseProperties '%ClassifierProperties;, %extensionPoint;' > <!ENTITY % UseCaseAssociations '%ClassifierAssociations;' > <!-- gene moved extensionPoint to properties --> <!ENTITY % UseCaseCompositions '%ClassifierCompositions;, ViewElement*' > <!ELEMENT UseCase (%remoteContent; | (%UseCaseProperties;, %UseCaseAssociations;, %UseCaseCompositions;)) > <!ATTLIST UseCase %XMI.ElementAttributes; > Codebeispiel III-12: Ausschnitt aus der XMI-DTD Die XMI-DTD ist sehr komplex und umfangreich, während die UXF-DTD mit gerade mal einer Seite auskommt. Hier ein Ausschnitt aus der UXF-DTD: <!ELEMENT Class (TaggedValue?, (Attr |Operation |Generalization |Association |Dependency |Note)* )> <!ATTLIST Class NAME CDATA ABSTRACT (true|false) VISIBILITY (public|private) ACTIVE (true|false) #REQUIRED "false" #REQUIRED #IMPLIED> Codebeispiel III-13: Ausschnitt aus der UXF-DTD Damit können einfache UML-Modelle beschrieben werden: <Class NAME = "Triangle" VISIBILITY = "public"> <Generalization FROM = "Polygon"/> </Class> Codebeispiel III-14: Anwendung der UXF-DTD Dieses XML-Dokument ist leicht zu lesen: Der Klassenname Triangle ist eine Erweiterung der Polygon-Klasse mit einer public-Sichtbarkeit. Prinzipiell ist XMI das bessere Format für den Austausch komplexer Meta-Informationen (XMI basiert auf dem UML-Metamodell), während UXF für den einfachen Austausch von Diagrammen besser geeignet ist (UXF basiert auf den UML-Diagrammen und nicht auf dem UML-Metamodell). Anzumerken ist jedoch, daß es eher unwahrscheinlich ist, daß UXF sich durchsetzen wird, da XMI von der OMG spezifiziert wird und führende Hersteller von Case-Tools (Rational) XMI unterstützen. Für nähere Informationen sind die Papers, Dokumentationen und Spezifikationen auf den Websites [UXF 99] und [XMI 99] zu empfehlen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 2. Komponententechnologien 38 2 Komponententechnologien A component is a pre-written piece of software that exposes a set of functionality through a standard interface. aus Sun's JavaBeans Spezifikation 2.1 Einleitung Seit den Anfängen der Softwareentwicklung gab es immer wieder neue Entwicklungen und Paradigmenwechsel. Der Übergang von reinen Assemblersprachen zu Hochsprachen wie ALGOL68 bis hin zu den ersten objektorientierten Sprachen (Simula67, Smalltalk76) brachte Verbesserungen in der Lesbarkeit und Wartbarkeit von Software [Gmeiner 99]. Konzepte wie strukturierte und später objektorientierte Programmierung führten zum Software-Engineering als eigenständiger Disziplin innerhalb der Informatik. Man spricht davon, daß die Wartung von Software etwa 70 % der Entwicklungskosten verschlingt [Brügge 98]. Folgende Grafik (ebenfalls aus [Brügge 98]) offenbart interessante Hintergründe: Wartung: 35..40% Entwicklung Wartung: 40..60% Wartung: 70..80% Entwicklung 1970 1980 1990 Abbildung III-13: Softwarewartung Vor dem Hintergrund immer besserer und schnellerer Hardware, ständig verbesserten Entwicklungsumgebungen (IDEs), eleganteren Programmiersprachen und besser durchdachten Programmierkonzepten ist diese Tendenz erschreckend – aber verständlich. Von heutiger Software wird viel erwartet: • einfache Bedienbarkeit • ansprechendes User-Interface (z.B. Grafik) • hohe Funktionalität • Konfigurierbarkeit durch den Benutzer • ... Diese Punkte führen zu einer höheren Komplexität von Software, obwohl viele grundlegende Algorithmen seit den Zeiten der ersten Implementierungen von Algorithmen unverändert geblieben sind. Die folgenden Unterkapitel sollen nun ein neues Paradigma näher erläutern, das mittlerweile als "Buzzword" jede neue Software ziert: die komponentenorientierte Softwareentwicklung. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 2. Komponententechnologien 39 2.2 Komponentenorientierte Softwareentwicklung Heutige Software wird zunehmend komplexer. Ein Grund dafür ist die zunehmende Integration von Anwendungen in Netzwerkstrukturen wie dem Internet. Ein anderer Grund ist der steigende Bedarf an benutzerfreundlichen Anwendungen, welche mit Wizards und Agenten versuchen, die Benutzung einfacher zu machen. Durch das Internet ist auch die Integration von Techniken zur Internationalisierung von Software wichtig geworden. So können auch kleine Tools schnell zu großen, monolithischen Anwendungen werden, die als Ganzes kaum noch überschaubar sind. Natürlich werden Anwendungen objektorientiert entwickelt, was sicherlich zu einer Produktivitätssteigerung und zu besserem, verständlicherem Programmcode führt. Die objektorientierte Softwareentwicklung ist dennoch an ihre Grenzen gestoßen. Die Wiederverwendung von Klassen hat sich zu einem großen Teil als Illusion herausgestellt. Heutzutage gibt es kaum Programme, die auch nur annähernd fehlerfrei sind. Auffällig ist, daß gerade große, komplexe Softwarepakete enorme Probleme verursachen. Es existieren in diesen Softwarepaketen Fehler, welche schon etliche Jahre bekannt sind und mit deren Behebung die EntwicklerInnen sich offenbar recht schwer tun. Dafür könnte es folgende Gründe geben: • der Fehler hängt von vielen einzelnen Punkten ab, die für sich unproblematisch sind, als Ganzes jedoch zu einem solchen Bug führen • die Behebung des Fehlers ist nur möglich, wenn dabei andere – weitgehend fehlerfreie – Programmteile geändert und evt. dadurch instabil werden. Derartige Probleme treten typischerweise bei komplexen Softwaresystemen auf, die im Laufe der Jahre gewachsen sind und deren "Komponenten" so sehr ineinander verzahnt sind, daß auch kleinste Änderungen Auswirkungen auf die Stabilität des Gesamtsystems haben (können). Aus diesen Gründen wird in letzter Zeit die komponentenorientierte Softwareentwicklung als neues Paradigma diskutiert. Komponententechnologien wie JavaBeans oder ActiveX sind dabei nur ein Hilfsmittel, um das eigentliche Ziel zu erreichen: Entwicklung von großen, komplexen Systemen aus einfachen, wiederverwendbaren Bausteinen. Eine Komponente im objektorientierten Sinne kann aus einer einzelnen Klasse oder einem umfangreichen Klassenpaket mit vielleicht mehreren hundert Klassen bestehen. Eines haben derartige Komponenten jedoch stets gemeinsam: Sie fungieren als black-box mit einer wohldefinierten Benutzerschnittstelle. Das Paradigma der komponentenorientierten Entwicklung von Software löst wohlgemerkt keineswegs die Objektorientierung ab. Komponententechnologien sind vielmehr ein höheres Konzept, das auf objektorientierten Methoden aufbaut (oder aufbauen sollte). Also kein Paradigmenwechsel, sondern lediglich eine Weiterentwicklung bestehender Konzepte. 2.3 Komponenten, Frameworks, Bibliotheken – Eine Einordnung Diskussion des Komponentenbegriffs In vielen Artikeln und Büchern wird versucht, Komponententechnologien genau zu definieren und einzuordnen. Offensichtlich besteht hier noch erheblicher Erklärungsbedarf, zumal sich hier die Experten oftmals gegenseitig widersprechen. Komponenten müssen weder objektorientiert noch strukturiert entwickelt worden sein, sie müssen auch nicht in binärer Form vorliegen. Sie müssen lediglich gut durchdachte, Bug-freie (darüber läßt Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 2. Komponententechnologien 40 sich streiten, aber ich bin der Ansicht, daß auf Komponenten, die nicht im Quellcode vorliegen, hundertprozentiger Verlaß sein muß) und über wohldefinierte Schnittstellen ansprechbare "Black Boxes" sein. Was heißt nun "Black Box"? Es heißt nicht "in binärer Form vorliegend" oder "nie mehr veränderbar", sondern vor allem verläßlich in dem Sinne, daß man auf die Funktionalität vertrauen kann und die interne Funktionsweise einer Komponente nicht verstehen muß, um sinnvoll damit arbeiten zu können. Ein wichtiger Punkt ist das Konzept der Kapselung. Kapselung von Komponenten ist wichtig, um die Unabhängigkeit einer Komponente vom Kontext zu unterstreichen. Der Zugriff auf Komponenten sollte stets über die (gut dokumentierten) Schnittstellen stattfinden und kontextunabhänig sein. Komponenten können durchaus im Sourcecode vorliegen. In diesem Fall lassen sie sich individuellen Erfordernissen anpassen. Es gibt jedoch zahlreiche Autoren, welche die binäre Ausführbarkeit als wichtigsten Punkt der Komponentendefinition ansehen. Argumentiert wird zumeist, daß bei eventuellen Sourcecodemodifikationen der vielleicht wichtigste Punkt der Kompoentenorientierung – der Black-Box-Gedanke – in Frage gestellt wird. Einordnung von Komponenten, Bibliotheken und Frameworks An dieser Stelle soll der Versuch einer Einordnung gemacht werden: Der Unterschied zwischen Komponenten, Klassenbibliotheken und Frameworks ist oftmals schwer durchschaubar. Aus [GoF 96] stammt folgende Definition: Eine Klassenbibliothek besteht aus einer Menge von verwandten und wiederverwendbaren Klassen, die entworfen wurden, um nützliche und allgemeine Funktionaliät zur Verfügung zu stellen. Stichwort hierbei ist die Wiederverwendung von Programmcode. Man denkt dabei nicht an ein Plug & Play von Klassen, sondern lediglich an eine Nutzung von bereits entwickelten Klassen. Bibliotheken sind also einfach Sammlungen von nützlichen Klassen, welche die Programmierung einfacher machen, da man nicht jedesmal das Rad neu erfinden muß. Frameworks dagegen implizieren eine bestimmte Struktur (bzw. Architektur) der Anwendung, die auf dem entsprechenden Framework aufbaut. Ein Framework ist also eine Art Grundgerüst für eine Anwendung. Die Gang of Four [GoF 96] meint hierzu: Ein Framework besteht aus einer Menge von zusammenarbeitenden Klassen, die einen wiederverwendbaren Entwurf für eine bestimmte Klasse von Software darstellen". Bei Frameworks geht es also nicht primär um die Wiederverwendung von Programmcode, sondern um die Wiederverwendung von Entwürfen und Architekturen. An dieser Stelle soll einmal der Versuch der Definition einer Komponente gemacht werden: Eine Komponente ist Software, die eine in sich geschlossene Funktionalität bietet und diese Funktionalität über wohldefinierte Schnittstellen nach außen hin anbietet. Dabei ist die eigentliche Funktionsweise der Komponente idealerweise irrelevant, in jedem Falle aber für den Entwickler vollkommen transparent. Eine Komponente sollte jedoch in einem gewissen Rahmen benutzerspezifisch konfigurierbar sein. Inwiefern aktuelle Komponententechnologien derartige akademische Definitionen implementieren sei einmal dahingestellt, aber zum Abschluß möchte ich noch einen Punkt erwähnen, der mir sehr wichtig erscheint: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 2. Komponententechnologien 41 Komponenten sollten unabhängig von der verwendeten Programmiersprache und Entwicklungsplattform sein. Bei Microsoft's Komponententechnologien (z.B. ActiveX) war dies wohl nicht der grundlegende Ansatz, aber bei Sun's (Enterprise) JavaBeans kann man durchaus von einer Unabhängigkeit von Programmiersprache und Entwicklungsplattform sprechen. Programmiersprachenunabhängigkeit wegen der Möglichkeit der CORBA-Einbindung bei Enterprise JavaBeans und wegen der Möglichkeit der Verwendung von JavaBeans in ActiveXUmgebungen. Plattformunabhängigkeit wegen der Verwendung von plattformunabhängigem Bytecode. Utopie ist zur Zeit leider noch die absolute Transparenz nicht nur von Funktionsweise, sondern auch von Programmiersprache und Implementierungsplattform. Fraglich ist dabei auch, ob die Softwarefirmen ein solches Modell überhaupt anstreben, da die Bindung der Kunden an eine bestimmte Komponententechnologie sicherliche eine erfolgversprechende Strategie darstellt. 2.4 Komponenten-Frameworks und KomponentenBibliotheken Schon jetzt existieren umfangreiche Komponentenbibliotheken und -frameworks. Einige dieser Bibliotheken sind in kommerzielle Entwicklungsumgebungen integriert (JBuilder, VisualCafe); viele Bibliotheken können aber auch gekauft und aus dem Internet heruntergeladen werden. Es ist abzusehen, daß in Zukunft ein Komponentenmarkt entstehen wird, der den Entwicklungsaufwand stark reduzieren wird. Generische Komponentenbibliothek Anwendung A Anwendung B Abbildung III-14: Generische Komponentenbibliotheken Es ist bei der Verwendung derartiger Bibliotheken wichtig, die entsprechenden Komponenten nach Aktualisierungen, Performanceverbesserungen, etc. auch in der Bibliothek selbst zu aktualisieren. Im Laufe der Zeit ist es so möglich, firmenspezifische Bibliotheken zu generieren, die es ermöglichen, schneller und effizienter Software zu entwickeln. Klassen-Frameworks vs. Komponenten-Frameworks Der Hauptunterschied zwischen Komponenten-Frameworks und Klassen-Frameworks ist die stärkere Beschränkung der Freiheit des Softwareentwicklers bei Verwendung von KomponentenFrameworks. Bei derartigen Frameworks müßte genauer spezifiziert werden, welche Komponenten sinnvoll in Verbindung mit anderen Komponenten eingesetzt werden können. Klassen-Bibliotheken vs. Komponenten-Bibliotheken Bei Komponenten-Bibliotheken sieht es ähnlich wie bei Komponenten-Frameworks aus: Komponenten schränken die Freiheit des Entwicklers stärker ein als bei der reinen objektorientierten Entwicklung mit Klassenbibliotheken. Probleme können bei der Integration von Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 2. Komponententechnologien 42 Komponenten verschiedener Hersteller auftreten. Insbesondere kann es passieren, daß eine bestimmte Grundfunktionalität gleich von mehreren Komponenten implementiert wird, was zu einem größeren Codeumfang führt (vgl. den folgenden Abschnitt). Granularität von Komponenten Bei der Entwicklung von Komponenten stellt sich die Frage nach deren Granularität. Ist es z.B. sinnvoll, Komponenten einzusetzen, welche aus mehr als 50 Klassen bestehen und evt. sogar aus verschiedenen Sub-Komponenten zusammengesetzt wurden? Problematisch bei der Integration von mehreren Mammut-Komponenten ist, daß oftmals gewisse Basisfunktionalitäten in mehreren Komponenten vorhanden sind, d.h. daß der Codeumfang einer komponentenbasierten Anwendung in vielen Fällen größer ist als bei der Verwendung gewöhnlicher objektorientierter Klassenbibliotheken: Codeumfang Makro-Komponenten Komponenten Klassen Abbildung III-15: Vergleich des Codumfanges Es ist anzunehmen, daß sich firmenspezifisch gewisse Standards zur Komponentengranularität entwickeln werden. Sinnvoll ist natürlich auch eine genaue Prüfung der Komponentenfunktionalität bei "fremden" Komponenten, um etwaige Funktionsüberschneidungen zu ermitteln und gegebenfalls andere Komponenten einzukaufen (oder selbst zu entwickeln). Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 3. JavaBeans 43 3 JavaBeans JavaBeans sind wohldefinierte Komponenten, die aus Java-Klassen bestehen, beliebig wiederverwendet und in neue Anwendungen integriert werden können. Mit der JavaBeansSpezifikation [Sun 99a] in die Programmiersprache, hat Sun Microsystems eine wichtige Lücke in der Java-Programmiersprache geschlossen. 3.1 Einführung in JavaBeans Wie funktioniert's? JavaBeans sind eine oder mehrere Java-Klassen, die als eine Einheit – als Komponente – zu sehen sind. Was unterscheidet nun JavaBeans von einem gewöhnlichen Klassenpaket? Wird ein gewöhnliches Java-Programm geschrieben, ist die Wieder- bzw. Weiterverwendung problematisch. Es ist meist unklar, wie die Applikation angesprochen werden kann, wie die Schnittstellen definiert sind und ganz allgemein, ob die Applikation überhaupt weiterverwendet werden kann. JavaBeans wurden entwickelt, um genau diese Fragen beantworten zu können, ohne den Quellcode der Anwendung (direkt) analysieren zu müssen. Die Spezifikation von JavaBeans definiert genau, wie sich eine Bean verhalten soll. Es gibt also eine Anzahl Regeln und Richtlinien, die von einer JavaBean befolgt werden müssen. Das heißt also, daß eine JavaBean-Komponente bestimmte Methoden zur Verfügung stellen muß, die der Kommunikation innerhalb des Komponenten-Frameworks dienen und die es möglich machen, an der Komponentenstruktur zu partizipieren. An dieser Stelle soll allerdings ausdrücklich erwähnt werden, daß die Unterschiede zwischen einer JavaBeans-Komponente und einer gut durchdachten, sauber programmierten Java-Klasse nicht besonders groß sind. So ist es prinzipiell einfach, Klassen oder Klassenpakete in JavaBeans umzuwandeln, falls dies sinnvoll ist. Elemente des JavaBeans Komponentenmodells Das JavaBeans-Komponentenmodell besteht aus zwei Elementen: • den Komponenten selbst und • den Behältern Die JavaBeans-Komponenten sind Java-Klassen, die bestimmten Konventionen genügen müssen, um von einem Behälter als Bean erkannt zu werden. Behälter sind – zum Teil sehr komplexe – Tools, die es ermöglichen, verschiedene Beans zu einer einzigen Anwendung (bzw. Komponente) zu verknüpfen. Beispiel hierfür ist die Entwicklung eines graphischen User-Interfaces (GUIs) aus bestimmten Komponenten wie Frames oder Buttons. Visuelle Präsentation Die visuelle Präsentation von Komponenten ist eine der wichtigsten Funktionen einer Komponenteninfrastruktur. Es muß möglich sein, Komponenten in einem Container visuell zu modellieren (natürlich gibt es auch Komponenten ohne grafische Repräsentation, z.B. Netzwerkkomponenten). Java bietet die Möglichkeit der visuellen Modellierung über die Java Foundation Classes (JFC) und die darin enthaltenen Pakete AWT oder Swing. So kann man Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 3. JavaBeans 44 beispielsweise Component (oder JComponent bei Swing) als Grundlage für eigene grafische JavaBeans verwenden. Unterstützung visueller Programmierung Visuelle Programmierung bedeutet, daß sich Anwendungen (Komponenten) rein visuell mittels Drag & Drop zusammenbasteln lassen. Ein Beispiel hierfür ist das Entwicklungstool JBuilder, mit dem sich komplexe (grafische) Anwendungen erstellen lassen. Der Entwickler wählt einfach Komponenten aus einer Toolbox aus und plaziert sie in einen Container. Eventuell werden dann noch die Komponenten an eigene Anforderungen angepaßt (z.B. Ändern der Größe oder der Schriftart). Die notwendigen Sourcecodeänderungen werden vom Entwicklungstool automatisch vorgenommen. 3.2 Das JavaBeans Komponentenmodell Das JavaBeans Komponentenmodell besteht nicht nur aus Spezifikationen, nach denen die Elemente (Komponenten und Behälter) entwickelt werden müssen, sondern auch aus Diensten, die zur Verfügung gestellt werden. Die Bestandteile des Komponentenmodells werden im folgenden beschrieben. Eigenschaften Eigenschaften (Properties) kann man als Untermenge des Zustands einer Komponente verstehen. Über Eigenschaftsänderungen läßt sich somit das Verhalten einer Bean ändern. Eigenschaften können bei einer Bean für den Datenbankzugriff etwa username und password sein. Bei graphischen Beans (z.B. Buttons) sind die Eigenschaft font oder lookAndFeel (Windows, Motif, ...) denkbar. Reflexion und Introspektion Introspektion (Introspection) ist ein Begriff aus dem Lateinischen und bedeutet soviel wie Selbstbeobachtung. Selbstbeobachtung – dieser Begriff impliziert eine vorhandene Infrastruktur, d.h. die Komponente muß bestimmte Methoden bieten, um interessierten Anwendungen die Erkennung ihrer Funktionalität zu erleichtern. Die Spezifikation eines Komponentenmodells muß die Zugriffsmechanismen, über die auf eine Komponente zugegriffen werden kann, definieren. Diese Zugriffsmechanismen sind normalerweise öffentliche Methoden, die bestimmten Namenskonventionen (getXXX, setXXX) genügen. Es ist aber auch möglich, die Komponentenschnittellen explizit in einer speziellen BeanInfo-Klasse anzugeben. Die Spezifikation legt also die Schnittstellen einer Komponente nach außen fest, um es einem (visuellen) Tool einfach zu machen, mittels Introspektion die innere Struktur einer Komponente zu analysieren. Damit ein Stück Software als JavaBeans-Komponente bezeichnet werden kann, muß sie also Introspektion unterstützen. Der Introspektionsmechanismus baut auf der Reflexion auf: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 3. JavaBeans 45 Introspektion Mechanismus zur Ermittlung von Eigenschaften, Ereignissen und Zugriffsmethoden Reflexion Mechanismus zur Ermittlung Klassen, Konstruktoren und Datenfeldern Abbildung III-16: Reflexion und Introspektion Mit Reflexion (Reflection) bezeichnet man die Möglichkeit, eine Klasse zur Laufzeit zu untersuchen und Informationen über die Daten, den Konstruktor und andere Methoden zu erhalten. Die Reflexion wird von der Introspektion benutzt, um Informationen über die speziellen Eigenschaften und deren Zugriffsmethoden zu bekommen. Die Klasse Class aus dem java.lang.*Paket bietet aus diesem Grund etliche Methoden, um die Reflexion zu unterstützen. Mit forName(String className) – einer vielverwendeten Methode – kann man ein Class-Objekt der in className spezifizierten Klasse erhalten. Ähnliche Methoden gibt es, um Constructor- oder Field-Objekte zu einer bestimmten Klasse zu ermitteln. Ereignisse Wenn sich der Ist-Zustand einer Komponente ändert, wird von der Komponente eine Ereignismeldung generiert. Andere Komponenten, die sich für ein solches Ereignis interessieren, können sich bei der Komponente registrieren und werden dann benachrichtigt. Genauso wird beim AWT-Ereignismodell von Java 1.1 und höher vorgegangen: die jeweiligen Komponenten (hier: Buttons und sonstige grafische Komponenten) registrieren sich bei einem Listener, um über bestimmte Ereignisse (Mausklicks, etc) benachrichtigt zu werden. Persistenz Jede Instanz einer JavaBean-Komponente ist zustandsbehaftet. Das heißt, sie befindet sich zu jedem beliebigen Zeitpunkt in einem definierten Zustand. Es ist nun gelegentlich wünschenswert, diesen aktuellen Zustand abzuspeichern und wiederherstellen zu können. Java bietet zum Glück einen Mechanismus, der das bequeme Abspeichern (Serialisieren) und Wiederherstellen (Deserialisieren) eines Bean-Zustandes erlaubt. Damit der Zustand eines Objektes abgespeichert werden kann, muß die entsprechende Java-Klasse die Schnittstelle Serializable implementieren. Diese Schnittstelle deklariert zwei Methoden: readObject und writeObject. Mit writeObject ist die Serialisierung des Objekts möglich; mit readObjekt kann man ein Objekt wieder herstellen (Deserialisierung). Bei der Serialisierung wird der Objektzustand in einen Stream geschrieben (der üblicherweise mit einem File assoziiert ist) und vice versa. Die (De-)Serialisierung ist ein wichtiger und integraler Bestandteil der Java-Programmiersprache, ohne den beispielsweise keine Objekte mittels RMI über ein Netzwerk übertragen werden könnten. 3.3 Eigenschaften Durch Eigenschaften (Properties) wird der innere Zustand einer Bean beschrieben. Eigenschaften sind Attribute einer Bean, die Auswirkungen auf das Erscheinungsbild und das Verhalten haben. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 3. JavaBeans 46 Diese Attribute können Standardtypen wie int oder boolean sein, können aber auch Klassen- und Schnittstellen-Typen haben. Eigenschaften visueller Beans (Buttons oder Anzeigebeans) bestehen oft zu einem großen Teil aus diskreten Attributen, die das äußere Erscheinungsbild festlegen. So kann eine grafische Komponente z.B. ein (boolesches) Attribut Orientierung haben, das festlegt, ob die Bean horizontal oder vertikal am Bildschirm dargestellt wird. Die Zugriffsmethoden dienen also zwei Zwecken: • Introspektion zur Designzeit • Eigenschaftsänderungen zur Laufzeit Es müssen nun bestimmte Schnittstellen existieren, die den Zugriff auf diese Attribute erlauben. Diese Schnittstellen sind öffentliche Zugriffsmethoden, die das Lesen oder Schreiben eines Attributwertes ermöglichen. Es gibt bestimmte Namenskonventionen für Zugriffsmethoden. So müssen Schreibmethoden mit set und Lesemethoden mit get beginnen. Methoden zur Manipulation des Attributs der Eigenschaft Orientierung würden somit getOrientation und setOrientation heißen. Man unterscheidet folgende Arten von Eigenschaften: • einwertige Eigenschaften • indizierte Eigenschaften • gebunde Eigenschaften • Eigenschaften mit Constraints Indizierte Eigenschaften enthalten mehrere Attribute gleichen Typs, die über einen ganzzahligen Index ausgewählt werden können. Ein Beispiel hierfür wären Koordinatenangaben bei einer Bean zur Darstellung dreidimensionaler Grafiken. Die Zugriffsmethoden sind dann public float getCoordinate(int index, float position) public float[] getCoordinate() public void setCoordinate(int index, float value) public void setCoordinate(float[] values). Codebeispiel III-15: JavaBean-Zugriffsmethoden Gebunde Eigenschaften sind Eigenschaften, die registrierte Beobachter (Listener) bei einer Änderung ihrer Attributwerte benachrichtigen. Diese Eigenschaften sind hilfreich, wenn etwa mehrere Beans in ein gemeinsames Frame integriert werden und bestimmte Bean-Eigenschaften (z.B. die Größe oder das Layout der Darstellung) auch die Umgebung und damit andere Beans beeinflussen. So können z.B. bei einer Größenänderung einer Bean auch die Größe des Containerfensters und die Position der anderen Beans angepaßt werden. Eigenschaften mit Constraints kann man als Erweiterung der gebundenen Eigenschaften verstehen. Wird versucht, eine solche Eigenschaft zu ändern, wird der entsprechende Listener benachrichtigt. Im Unterschied zu gebundenen Eigenschaften kann der Beobachter ein Veto einlegen, wenn die Eigenschaftsänderung nicht erwünscht ist. Nützlich ist diese Funktionalität bei der Einbindung externer Beans, die möglicherweise Eigenschaften besitzen, die unverändert bleiben sollen (z.B. ist bei internationalisierten Beans eine Umschaltung der Sprache sinnlos, wenn die Umgebung aus Beans besteht, die keine solche Funktionalität zur Verfügung stellen). Es ist nicht immer möglich, auf nicht-triviale Eigenschaften mit einem Bean-Tool zuzugreifen. Die BeanBox von Sun beispielsweise erlaubt keinen Zugriff auf indizierte Eigenschaften. In einem solchen Fall ist es möglich, spezielle Klassen zur Eigenschaftsänderung (Customizer) zu schreiben. Nähere Informationen zu Customizer-Klassen sind im Unterkapitel "Entwicklung von JavaBeans" (übernächstes Kapitel) zu finden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 3. JavaBeans 47 3.4 Entwicklung von JavaBeans Die Entwicklung von Beans unterscheidet sich nicht wesentlich von der Entwicklung von anderer objektorientierter Software. Es ist z.B. auch problemlos möglich, eine Klassenstruktur mit einer bestimmten Funktionaliät zu einer JavaBeans-Komponente zu machen. Was zunächst erstaunt ist, daß eine JavaBeans-Komponente keine bestimmte Klasse erweitert und auch keine spezielle BeanSchnittstelle implementiert. Tatsächlich ist es gerade deswegen so einfach, JavaBeans – auch aus bereits bestehenden Klassen – zu entwickeln. Die Unterschiede von Beans zu Klassenpaketen sind eher gering: • Die Klassen einer JavaBean sind in einem JAR-Archiv zusammengefaßt. • Dieses JAR-Archiv enthält ein Manifest-File, in der das Bean beschrieben wird. • Eine Bean muß Introspektion unterstützen. Das geschieht am einfachsten über die Verwendung der Namenskonventionenen. • Eine Bean-Klasse muß einen parameterlosen Konstruktor enthalten. • Eine Bean-Klasse hat keine öffentlichen Variablen (auf Variablen, die als BeanEigenschaften gelten, wird mit öffentlichen Methoden zugegriffen) Das war's auch schon. Zu den einzelnen Punkten: JAR-Archiv JAR ist sowohl ein Akronym für Java Archive als auch ein Wortspiel (Jar = Krug oder Topf). Ein solches Archiv kann mehrere Dateien enthalten und kann (muß aber nicht) komprimiert sein. Für die Komprimierung werden die Standard-Algorithmen für ZIP-Dateien verwendet. Die meisten Entwicklungstools (so auch JDeveloper) bieten die Möglichkeit, über einen Deployment-Wizard mehrere Klassen in einem solchen Archiv zusammenzufassen. Üblicherweise sind in einem solchen Archiv nicht nur die CLASS-Dateien und das Manifest-File sondern auch noch die JAVA-Dateien (also der Sourcecode) und verschiedene .html-Dateien zur Dokumentation der Bean. Bei bestimmten Multimedia-Anwendungen enthält das JAR-Archiv auch noch Grafiken, Sound- und Video-Dateien. Manifest-File Dieses File wird zumeist automatisch vom Entwicklungstool generiert. Falls nicht, kann man es leicht selbst schreiben. Bei einer Bean, die aus der Klasse TestBean besteht und im Verzeichnis test liegt, sieht das Manifest-File so aus: Name: test/TestBean.class JavaBean: True Name: test/TestBeanInfo.class Codebeispiel III-16: Manifest-File Das Manifest-File dient eigentlich nur dazu, Tools einen kurzen Überblick über die Dateien – oder vielmehr über die Beans - des Archivs zu geben. In obigem Beispiel ist die Klasse TestBeanInfo also keine JavaBean (aber wohl ein integraler Bestandteil der Bean). Interessant ist noch, daß die Dateien in einem JAR-Archiv auch eine digitale Signatur haben können. Damit kann verifiziert werden, daß die Dateien von einer bestimmten Firma oder Organisation stammen und vor allem, daß sie nicht geändert wurden. Die Einträge im Manifest-File enthalten dann unter anderem noch Informationen über den benutzten Algorithmus. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 3. JavaBeans 48 Unterstützung von Introspektion Es gibt mehrere Methoden, die Introspektion zu unterstützen. Am sinnvollsten und am einfachsten ist es, sich einfach an die Namenskonventionen zu halten. Oftmals wird auch eine BeanInfoKlasse geschrieben, welche Auskunft über die entsprechende JavaBean gibt. Vorteil ist hier, daß man sich bei der Bean-Entwicklung nicht an die Namenskonventionen halten muß. Parameterloser Konstruktor Beans müssen einen parameterlosen Konstruktor haben. Der Grund dafür ist offensichtlich: bei graphischen Beans klickt man sich seine Komponenten mittels Drag & Drop zusammen. Plaziert man nun eine neue Bean auf der graphischen Oberfläche, um die Bean zu instanziieren, dann sind die entsprechenden Eigenschaften der Bean noch nicht bekannt. Das Tool zur Bean-Entwicklung muß die Bean also parameterlos instanziieren und später die Möglichkeit bieten, die Eigenschaften der Bean zu ändern. Keine öffentlichen Variablen In einer JavaBean-Komponente ändert man die Eigenschaften über die öffentlichen Zugriffsmethoden, die bestimmten Namenskonventionen genügen müssen. Im übrigen ist es auch sonst (d.h. wenn keine Komponenten programmiert werden) sinnvoll, auf öffentliche Variablen zu verzichten und stattdessen Methoden zur Manipulation anzubieten. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 4. RMI – Remote Method Invocation 4 RMI 49 – Remote Method Invocation Remote Method Invocation provides a way to build wormholes to join the object galaxies contained in different Virtual Machines. Gerald A. de Jong, JavaWorld Magazine In der heutigen Welt objektorientierter Systeme werden Modelle benötigt, die eine verteilte ObjektObjekt-Kommunikation erlauben. Bei der Verwendung von Low-Level-Konzepten wie der SocketProgrammierung wird das objektorientierte Paradigma einer objektorientierten Programmiersprache wie Java durchbrochen. Wenn bei der Softwareentwicklung auf derartige Konzepte zurückgegriffen wird, dann kann eine einfache Anwendung schnell zu kompliziertem und schwer lesbaren Code führen, der der Anwendung nicht angemessen ist. Aus diesem Grund exisitieren Modelle wie RMI oder CORBA, welche eine transparente Objekt-ObjektKommunikation ermöglichen – im Falle von CORBA sogar über Programmiersprachengrenzen hinweg. 4.1 Verteilte Objekte If the meaning of the destination is isomorphic with the meaning of the source which originated the act, then communication can be said to have taken place. Melvin L. De Fleur, Sandra Ball-Rokeac (Theories of Mass Communication) RMI ist ein Akronym für Remote Method Invocation, also für einen entfernten Methodenaufruf. Mit RMI ist es möglich, mit einem Objekt, das in einer Virtuellen Maschine (VM) läuft, Methoden eines Objekts einer anderen VM aufzurufen. Im Gegensatz zu CORBA müssen bei RMI sowohl Client als auch Server in Java implementiert werden. Für die Entwicklung von reinen Java-Anwendungen ist RMI besser geeignet als CORBA, da zum einen keine Schnittstellendefinitionen in einer anderen Programmiersprache (IDL) geschrieben werden müssen und zum anderen ist RMI bei vergleichbarem Funktionsumfang leichter zu handhaben. Wichtigstes Designziel bei RMI war, den Verteilungsaspekt möglichst transparent zu halten, also dafür zu sorgen, daß sich ein entferntes Objekt genauso verhält wie ein lokales Objekt und ebenso angesprochen werden kann. Für den Entwickler ist der Hauptunterschied zwischen lokalen und entfernten Methodenaufrufen die Geschwindigkeit. Entfernte Aufrufe können – je nach Netzbelastung – sehr viel länger dauern als lokale Aufrufe. Verteilte Anwendungen müssen auch sehr sorgfältig geplant werden, da schnell komplexe, unüberschaubare Klassen entstehen können, die dem objektorientieren Paradigma widersprechen. Eine strenge Trennung von lokalen und entfernten Objekten ist also notwendig. Dies geschieht am sinnvollsten durch eine Adapterklasse als Schnittstelle zwischen entferntem und lokalem Objekt. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 4. RMI – Remote Method Invocation 50 Client Java Virtual Machine Server Java Virtual Machine Local Objekt RMI Local Objekt Local Objekt Remote Objekt RMI RMI Registry Abbildung III-17: Client/Server-Anwendungen und RMI Übliches Einsatzszenario für RMI ist eine Client/Server-Verbindung. Der Server instanziert ein Remote Object und sorgt dafür, daß der Zugriff auf die Objektreferenzen über das Netz möglich ist. Eine Client-Applikation benutzt nun die Objektreferenzen, um Methoden der entfernten Objekte aufzurufen. Objekte, die an einer solchen lokationstransparenten Objekt-Objekt-Kommunikation teilhaben, werden in der Literatur zumeist als Verteilte Objekte bezeichnet. 4.2 Verteilte Anwendungen mit RMI Welche Aufgaben übernimmt nun RMI in einer verteilten Anwendung? RMI bietet eine Infrastruktur, die primär dazu dient, entfernte Objekte zu registrieren (RMI Registry), die ObjektObjekt-Kommunikation transparent zu halten (RMI Protokoll) und einen Mechanismus für die Übertragung von Objekten zur Verfügung zu stellen (Objektserialisierung). Im folgenden werden diese drei Aufgaben von RMI näher betrachtet. Registrierung Eine verteilte Anwendung besteht (per Definition) aus einer Client- und einer Serverkomponente. Die Serverkomponente ruft nun die Registrierung auf und registriert die entsprechenden Remote Objects. Prinzipiell wird dabei einem Remote Object (also einer Instanz) der (Klassen-)Name zugeordnet und in der Registrierung eingetragen. Um eine Methode eines Remote Object aufrufen zu können, muß sich ein Client zunächst eine Objektreferenz auf das gewünschte Objekt beschaffen; danach ist ein Methodenaufruf möglich. Protokoll Das RMI-Protokoll basiert auf der Java-Objektserialisierung und dem HTTP-Protokoll. Dabei wird die Objektserialisierung benutzt, um die Daten für den Methodenaufruf vorzubereiten (Marshaling, Unmarshaling). Bei entfernten Methodenaufrufen versucht die Transportschicht des RMIProtokolls zuerst, die Methodenaufrufe über Sockets abzusetzen. Falls es Probleme mit einer Firewall gibt, wird Tunneling mit HTTP (entweder HTTP-to-Port oder HTTP-to-CGI) verwendet. Man hat auch die Möglichkeit, eine RMI-over-IIOP-Implementierung zu verwenden. Dabei wird CORBA's IIOP zur Übertragung verwendet, während der Entwickler mit der RMI-API programmieren kann. Nähere Informationen zum RMI-Protokoll sind unter [Sun 99b] und auf der RMI-FAQ zu finden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 4. RMI – Remote Method Invocation 51 Objektserialisierung Es ist mit RMI möglich, den Bytecode der Klasse des Remote Objects dynamisch aus dem Netz zu laden. Damit ist es möglich, bequem den Typ eines Objekts zu übergeben, der auf der Clientseite unbekannt ist. 4.3 Programmieren mit RMI Die Entwicklung von verteilten Java-Programmen mit RMI ist eigentlich nicht schwierig. Allerdings muß bei der Entwicklung der Anwendung der Verteilungsaspekt genau geplant werden; etwa welches Entwurfsmuster als Grundlage dient. Es ist im allgemeinen nicht sinnvoll, eine Anwendung für eine Virtuelle Maschine zu programmieren und später RMI-Schnittstellen zu implementieren. Im folgenden werden deshalb – neben der Beschreibung der wichtigsten Klassen und Schnittstellen der RMI-API – auch Designaspekte berücksichtigt. RMI-API Die RMI-API besteht aus insgesamt vier Paketen: • java.rmi.* • java.rmi.server.* • java.rmi.registry.* • java.rmi.dgc.* Den Kern von RMI bildet das Paket java.rmi. Es besteht aus einer Schnittstelle (Remote), zwei Klassen (RMISecurityManager und Naming) und 16 Exceptions. Das java.rmi.registry-Paket besteht aus nur 2 Schnittstellen (Registry und RegistryHandler) und einer Klasse (LocateRegistry) mit denen typische Registrierungs-Aufgaben wie Kreieren einer Registry oder Registrieren bei einer vorhandenen Registry durchgeführt werden können. Das java.rmi.dgc-Paket wird normalerweise nicht vom Entwickler benötigt. Es dient zur verteilten Garbage Collection. Das rmi.server-Paket enthält Klassen wie RemoteObject und RemoteStub, wird also für die Erweiterung von lokalen Methodenaufrufen um verteilte Aspekte verwendet. Funktionsweise von RMI – Stubs und Skeletons Sollen nun die Methoden eines lokalen Objekts z.B. über ein Netzwerk anderen Objekten zur Verfügung gestellt werden, so muß die Schnittstelle Remote um die entsprechenden Methoden erweitert werden (jede Methode muß eine java.rmi.RemoteException werfen). Ein Objekt, das diese Schnittstelle implementiert, gilt als Remote Object. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 4. RMI – Remote Method Invocation 52 Client Server Java Virtual Machine Client Objekt Java Virtual Machine Stub (Proxy) RMI Skeleton Server Objekt Abbildung III-18: Funktionsweise von RMI – Stub und Skeleton Trotz der gewünschten Lokationstransparenz der Objekte behandelt RMI lokale Objekte anders als entfernte Objekte. Es wird z.B. keine Kopie des Serverobjekts zum Client geschickt, sondern lediglich ein lokaler Stellvertreter (Proxy oder Stub) für das entfernte Objekt. Dieser Stub implementiert – ebenso wie das Remote Object – die Remote-Schnittstelle bzw. eine Erweiterung davon. Eine Client-Anwendung, die entfernte Methoden aufrufen will, ruft also die entsprechenden Methoden des Stubs auf, der sich um die Weiterleitung an das Remote Object kümmert. Ein solcher Stub hat also folgende Aufgaben: • Annahme eines Methodenaufrufs als Stellvertreter des Remote Objects • Serialisierung der zu übergebenden Argumente und Senden zum Server • Deserialisierung der Antworten Das Skeleton auf der Serverseite hat dementsprechend die Aufgaben • Annahme eines Methodenaufrufs • Deserialisierung der Argumente • Serialisierung der Antwort und Zurücksenden an den Client Stub und Skeleton werden von rmic (einem RMI Compiler) aus der Implementierung des Remote Interfaces generiert. Anwendung von RMI Folgende Abbildung zeigt, wie das RMI-Paket in Standard-Anwendungen verwendet wird. Hier wird das Adapter-Designmuster verwendet, mit dem die Methoden des Remote Objects von einem speziellen Adapter "umwickelt" werden. Vorteil bei diesem Design ist, daß Serverklassen wie lokale Klassen entwickelt werden können. Der Verteilungsaspekt kommt erst mit dem Adapter hinzu. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 4. RMI – Remote Method Invocation 53 java.lang. Object java.rmi. Naming java.lang. SecurityManager <<interface>> java.rmi.Remote java.rmi. RMISecurityManager <<interface>> MyRemoteInterface Der RemoteAdapter (auch: RemoteWrapper) adaptiert die entsprechenden Methoden und hält so den Verteilungsaspekt vor der RemoteImplemention vollkommen transparent java.rmi.server UnicastRemoteObject RemoteAdapter adapts RemoteImplementation Abbildung III-19: Anwendung von RMI Um hier keine Verwirrung zu stiften: in vielen Büchern zu RMI wird kein Adapter-Muster verwendet. In solchen Fällen sind RemoteAdapter und RemoteImplementation aus obiger Abbildung identisch, d.h. die RemoteImplementation wird nicht als lokale Klasse entwickelt, sondern speziell für die Anwendung als entferntes Objekt. Ein solches Design führt zu verschiedenen Problemen, die z.B. in [JavaWorld 99] diskutiert werden. Installation von RMI-Anwendungen Die Konzepte von RMI sind relativ simpel. Dennoch kann es bei der Installation von RMIAnwendungen Probleme geben. Es folgt ein kurzer Überblick über die einzelnen Schritte bei der Entwicklung und Installierung von RMI-Programmen. 1. Schreiben eines Remote Interfaces. 2. Schreiben eines RemoteAdapters, der das RemoteInterface implementiert und die eigentliche Implementierung (RemoteImplementation) adaptiert. 3. Schreiben der Serveranwendung, also der RemoteImplementation. Diese Implementierung bietet die eigentlich Funktionalität des Programms. Sie sollte als lokales Objekt entwickelt werden, da der RemoteAdapter als Remote Object fungiert. 4. Schreiben des Clientprogramms. 5. Compilierung der Klassen. 6. Generierung von Stub und Skeleton mit dem rmic-Tool aus der Klasse RemoteAdapter. 7. Die CLASS-Files in die entsprechenden Verzeichnisse auf den Client- und auf den Serverrechner kopieren. 8. Starten der RMI Registry auf dem Server mit dem Kommando start rmiregistry (Windows NT). Die Registry kann übrigens auch direkt aus der Serveranwendung heraus gestartet werden. 9. Starten der Serveranwendung, die dann den RemoteAdapter bzw. das RemoteInterface bei der RMI Registry registriert. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 4. RMI – Remote Method Invocation 54 10. Starten der Clientanwendung. Nun kann der Client die entfernten Methoden des Servers aufrufen. Natürlich ist es auch möglich, Anwendungen zu schreiben, bei denen Client und Server ihre Rollen tauschen können, d.h. einmal Dienste eines Servers anzufordern und auch selbst Dienste anzubieten. Die Entwicklung ist dann etwas aufwendiger, da z.B. sowohl auf Client- als auch auf Serverseite eine RMI Registry gestartet werden muß und auch Stubs und Skeletons für jede Seite doppelt generiert werden müssen. 4.4 Übergabe von Objekten Mit RMI ist es möglich, nicht nur elementare Datentypen zu übergeben, sondern auch Objekte, welche auf der Clientseite nicht bekannt sind. Dazu wird das zu übergebende Objekt serialisiert und über das Netzwerk verschickt. Nach der Deserialisierung steht das Verhalten und der Typ eines Objekts vollständig zur Verfügung. Die Möglichkeit, unbekannte Klassen (Objekte) während der Laufzeit zu laden, wird dynamisches Laden von Klassen oder dynamic class loading genannt. Wichtigster Vorteil ist, daß bei der Übertragung an eine andere Virtuelle Maschine weder Typ noch Verhalten des entsprechenden Objekts geändert werden. Übergabe von Objekten Bei den zu übergebenden Objekten wird zwischen • primitiven Datentypen (int, lang, ..) • serialisierbaren und • entfernten Objekten unterschieden. Primitive Datentypen sind problemlos als Argumente für RMI-Aufrufe verwendbar. Entfernte Objekte werden als Referenz übergeben. Die Referenz auf ein entferntes Objekt ist dabei ein clientseitiger Stellvertreter (Proxy) für das entfernte Objekt. Lokale Objekte können nur übergeben werden, wenn sie serialisierbar sind (also wenn sie die Serializable-Schnittstelle implementieren). Übergabe "by-reference" Diese Übergabevariante ist bei RMI Standard. Remote Objects werden hier prinzipiell als Referenz übergeben. Wie schon weiter oben beschrieben ist die Referenz auf ein Remote Object der clientseitige Stub, also das entsprechende lokale Stellvertreter-Objekt. Der Unterschied zur Argumentübergabe "by-value" ist, daß bei Änderungen des Objektzustandes auch der Zustand des referenzierten Objektes geändert wird. Zu beachten ist, daß nur auf Methoden zugegriffen werden kann, die auch im Remote Interface deklariert sind. Enthält das Remote Object also noch weitere Methoden (z.B. Implementierungen von lokalen Schnittstellen), dann sind diese Methoden für den Client nicht verfügbar. Übergabe "by-value" Lokale Objekte werden normalerweise "by-value" übergeben. Das heißt, daß eine reine Wertübergabe stattfindet: das zu übergebende Objekt wird kopiert und ist vollkommen unabhängig vom Original-Objekt. Die Kopie eines solchen lokalen Objekts wird durch die Objektserialisierung erstellt. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 4. RMI – Remote Method Invocation 55 4.5 Komponentenbasierte Entwicklung von RMI-Anwendungen In diesem Unterkapitel wird kurz darauf eingegangen, wie die Konzepte der Komponententechnologie auch bei Client/Server-Anwendungen verwendet werden können. Hier soll ausdrücklich nicht von Enterprise JavaBeans (EJB) die Rede sein, sondern vom JavaBeans Komponentenmodell. Client-Komponenten Am einfachsten ist die Verwendung der Komponententechnologie auf der Clientseite. Hier ist meist ein GUI vorhanden, das beispielsweise Abfrageergebnisse visualisiert. Der Client kann problemlos als JavaBean entwickelt werden. Als Bean Properties kommen z.B. der Hostname des Servers oder Username und Paßwort in Frage. Eine solche Client-Bean kann somit problemlos an den Server angepaßt werden, z.B. bei einer Neuinstallation des Servers auf einem neuen Rechner. Client Server Java Virtual Machine ClientBean Java Virtual Machine RMI ServerBean (DB-Zugriff) JDBC DB Abbildung III-20: Komponententechnologie und RMI Ansonsten benutzt das clientseitige GUI selbst wieder JavaBeans, um graphische Komponenten darzustellen. Auch eine konfigurierbare Ausgabeschnittstelle z.B. zur Visualisierung der Ergebnisse von entfernten Methodenaufrufen läßt sich so gut integrieren. Server-Komponenten Auf der Serverseite ist es schwieriger, JavaBeans zu entwickeln. Vorstellbar ist hier z.B. eine Bean zur Datenbankabfrage, bei der die Properties dann eben die IP-Adresse der Datenbank und Username und Paßwort sind. Sun Microsystems bietet mit Enterprise JavaBeans (EJB) eine Spezifikation für Serverkomponenten an. Dieses Modell beinhaltet typische Serverfunktionalitäten wie Transaktionen und Sicherheit (wird im folgenden Kapitel näher besprochen). Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 5 EJB 56 - Enterprise JavaBeans Professionelle serverseitige Anwendungen müssen skalierbar, flexibel und hochperformant sein. Sie sollen auf verschiedenen Plattformen – nach Möglichkeit ohne Quellcodeänderungen – lauffähig sein und auch hochgradig heterogene Umgebungen unterstützen. Die Enterprise JavaBeans (EJB) Spezifikation von Sun Microsystems definiert eine Komponentenarchitektur, die speziell für Webserver entwickelt wurde und hervorragend für derartige Anwendungen geeignet ist. Enterprise JavaBeans sind eine Kompoenentenarchitektur, die eine verteilte Objektarchitektur nutzt und für n-stufige (n-Tier) Applikationen verwendet werden kann. Noch eine Anmerkung: Dieses Kapitel wurde nach dem Erscheinen von [Monson-Haefel 99] nochmals leicht überarbeitet. Es wurde aus Gründen der besseren Lesbarkeit darauf verzichtet, bei jeder vorgenommenen Änderung auf dieses Buch zu verweisen. 5.1 Überblick über Enterprise JavaBeans Einführung in Enterprise JavaBeans Enterprise JavaBeans ist eine relativ junge Technologie, die eine Abstraktion für Component Transaction Monitors (CTMs) bietet [Monson-Haefel 99]. Der Begriff CTM wurde Anfang 1999 von Anne Thomas (Patricia Seybold Group) geprägt, um die Integration von verteilten Objektdiensten wie CORBA's ORB (Object Request Broker) in herkömmliche Transaktionsmonitore zu beschreiben. Ein EJB-Server ist also ein CTM, der zu der EJBSpezifikation konform ist. EJB bietet damit die Möglichkeit, serverseitige Anwendungen zu schreiben und sich dabei ausschließlich auf die Geschäftslogik konzentrieren zu können. Als EntwicklerIn kann man mit EJB auf komplexe CTM-Dienste wie Transaktionsmanagement, Sicherheit, Persistenz und Nebenläufigkeit auf einer hohen Abstraktionsebene zugreifen, was die Entwicklung stark vereinfacht. Definitionen Die beiden folgenden Definitionen von Enterprise JavaBeans stammen aus [Monson-Haefel 99]. Sun Microsystems hat Enterprise JavaBeans wie folgt definiert: The Enterprise JavaBeans architecture is component architecture for the development and deployment of object-oriented distributed enterprise-level applications. Applications written using the Enterprise JavaBeans architecture are scalable, transactional, and multi-user secure. These applications may be written once and deployed on any server platform that supports the Enterprise JavaBeans specification. Diese ausführliche Definition wurde von Richard Monson-Haefel etwas verkürzt: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 57 Enterprise JavaBeans is a standard server-side component model for component transaction monitors (CTMs). Wie schon in der Einführung beschrieben, sind CTMs eine neue Bezeichnung für Transaktionsmonitore, die mit verteilten Objekttechnologien arbeiten. Nähere Informationen zu CTMs sind in [Monson-Haefel 99] zu finden. Unterschiede zwischen JavaBeans und Enterprise JavaBeans JavaBeans ist die Spezifikation des Komponenentenmodell für Java. Auch Enterprise JavaBeans (EJB) ist eine Spezifikation für ein Komponentenmodell, das sich jedoch in einigen Punkten vom JavaBeans-Modell unterscheidet. Ziel von JavaBeans war, für Java eine Komponentenarchitektur zur Verfügung zu stellen, mit der gerade die visuelle Entwicklung von Beans möglich sein sollte. Diese Technologie steht somit in Konkurrenz zu Microsoft's ActiveX-Komponentenmodell. Die EJB-Architektur hingegen wurde nicht für visuelle Entwicklung von Komponenten entwickelt. Das Ziel war vielmehr, eine Architektur zu schaffen, in die verteilte Java-Komponenten portierbar eingefügt werden können. Vor der Diskussion der Unterschiede zwischen beiden Komponentenarchitekturen sind zunächst die Gemeinsamkeiten zu betrachten. JavaBeans und EJBs spezifizieren Modelle für Komponenten. Komponenten unterscheiden sich von normalen Klassen (aus denen sie ja bestehen) hauptsächlich dadurch, daß sie externe Schnittstellen haben (Properties oder Eigenschaften), über die sie sich in anderen Umgebungen anpassen können. Damit ein Container (z.B. eine Entwicklungsumgebung) eine Bean oder eine Enterprise Bean analysieren kann, müssen bestimmte Punkte, z.B. Namenskonventionen bei der Entwicklung berücksichtigt werden. Eine wichtige Gemeinsamkeit ist beiden Modellen, daß während der Entwicklung mehrere Komponenten miteinander bequem verkettet werden können. Populär ist dies gerade bei graphischen JavaBeans-Komponenten, mit denen schnell GUIs "zusammengeklickt" werden können. Allerdings müssen JavaBeans keineswegs immer einen graphischen Aspekt haben. Enterprise JavaBeans sind dagegen nicht-visuelle Komponenten, die für den serverseitigen Einsatz entwickelt wurden und die als Remote Objects von Clients aufgerufen werden. Der DeploymentDescriptor der Enterprise Beans dient dem gleichen Zweck wie die Properties der JavaBeans: einer definierten Umgebung (Container) die Möglichkeit zu geben, die Eigenschaften zu ermitteln und die Komponente gegebenfalls anzupassen. Der erwähnte Deployment-Descriptor (Deployment ist der EJB-Ausdruck für die Installation auf einem Server) der Enterprise Beans enthält Informationen zu speziellen, für den Server-Einsatz wichtigen Eigenschaften, z.B. zum Transaktionsverhalten, zur Sicherheit oder zur Persistenz. EJBServer verfügen meist über Administrationstools, die es erlauben, die Eigenschaften einer Enterprise Bean zu lesen und sie in einem Container zu installieren. Es ist wichtig, sich vor Augen zu halten, daß sowohl JavaBeans also auch EJB Spezifikationen für Komponentenmodelle sind, die jedoch unterschiedliche Ziele verfolgen. JavaBeans können sowohl auf Client- als auch auf Serverseite eingesetzt werden. Und zwar für visuelle und nicht-visuelle Anwendungen. Will man allerdings Serveranwendungen mit JavaBeans schreiben, muß man sich um Low-Level-Details wie Transaktionsverwaltung selbst kümmern – und das kann aufwendig werden. Kommunikation mit anderen Komponentenmodellen Die eigentliche Stärke von JavaBeans liegt darin, daß die Kommunikation mit anderen Komponentenmodellen wie CORBA oder Microsoft's DCOM (mehr oder weniger) problemlos möglich ist. Anwendungen, die diese alternativen Komponentenmodelle verwenden, sind somit in der Lage, mit JavaBeans-Komponenten zu kommunizieren oder sogar (über Standardinterfaces) Beans zu verwenden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 58 Besonders interessant ist hier natürlich die Interaktion von Enterprise Beans auf der Serverseite mit den clientseitigen JavaBeans. Das könnte in Zukunft dazu führen, daß auch komplexe, mehrstufige Anwendungen entwickelt werden können, ohne Sourcecode zu programmieren. Migration von Legacy-Anwendungen zu Java-basierten Systemen Für viele Firmen, die noch alte Hard- und Software verwenden, sind Enterprise JavaBeans eine Möglichkeit, Schritt für Schritt die alten Systeme abzulösen und auf eine moderne Client/ServerArchitektur und Java umzusteigen. Dazu wird um einzelne Module des bestehenden Systems eine EJB-Schicht programmiert, die die Kommunikation mit modernerer Komponentensoftware erlaubt. So kann die alte Software mit neuen Tools bearbeitet und in eine heterogene Rechnerstruktur integriert werden. Das ist keine leichte Aufgabe, ist aber bei entsprechender Sorgfalt gut möglich. Im Laufe der Zeit können dann einzelne alte Softwareteile durch "echte" JavaBeans-Komponenten abgelöst werden. Dies ist für das System vollkommen transparent und ermöglicht den Umstieg auf Java-basierte Technologien ohne Unterbrechungen und Störungen des Geschäftsablaufs. 3-stufige Architekturen Enterprise JavaBeans werden zumeist in 3-stufigen Architekturen als Middle-Tier verwendet. Der Grund für die Verwendung von 3-stufigen Architekturen ist die heutige Vielfalt an Client- und Serversystemen. Für die Kommunikation zwischen Client-Systemen wie HTML, Java Applets, CORBA/COM oder PDAs und Server-Systemen wie relationalen und objektorientierten Datenbanken, Filesystemen und Legacy-Anwendungen ist eine Zwischenstufe notwendig: der Applikationsserver. Folgende Abbildung stellt diesen Sachverhalt nochmals dar (nach [Javaworld 99]): WITHOUT AN APPLICATION SERVER Client Backend HTML CICS, 3270, other legacy apps Java CORBA COM Special Devices PDAs, Web phones, Kiosks, Smart Cards, SetTop Boxes,... ? WITH AN APPLICATION SERVER Client Middle Tier HTML Application Server - Java - CORBA COM - Special Devices - DB Files PDAs, Web phones, Kiosks, Smart Cards, SetTop Boxes,... - Web: HTTP, CGI/Servlets, JSP Componentes: CORBA, EJB/RMI, DCOM Data Access: JDBC Transaction Management: XA, JTS/JTA Security: SSL, .. Directory/Naming: JNDI Fault Tolerance Load Balancing Resource Pooling Auditing, Logging Monitoring ... Backend CICS, 3270, other legacy apps DB Files Abbildung III-21: Warum 3-stufige Architekturen verwenden? Aus heutiger Sicht führt an einem Middle-Tier kein Weg mehr vorbei. Die Integration zahlreicher verschiedener heterogener Systeme mit modernen EJB-Anwendungen oder alten Legacy-Systemen ist kaum möglich ohne eine 3-stufige Architektur. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 59 5.2 Vorteile von EJB An dieser Stelle sollen die Vorteile bei der Verwendung der EJB-Technologie einmal zusammengefaßt werden. Im wesentlichen handelt es sich bei diesen Vorteilen um Skalierbarkeit, Resourcenmanagement, Portabilität, Integration von Komponententechnologien, Sicherheit und verteilte Transaktionen. Skalierbarkeit Im Unterschied zu den schlecht skalierbaren CGI-Anwendungen lassen EJBs kaum noch Wünsche offen. Als AnwendungsentwicklerIn muß man sich hier kaum Gedanken über Möglichkeiten der Skalierbarkeit3 machen, da die relevante Funktionalität vom EJB-Server implementiert werden muß. Resourcenmanagement Das Resourcenmanagement bleibt für den Anwendungsentwickler wegen der Verlagerung der Problematik in den EJB-Server transparent. So werden Enterprise JavaBeans nach Bedarf instanziert und auch wieder zerstört. Portabilität Gut geschriebene EJBs laufen nahezu ohne Codeänderungen auf allen Webservern, welche die EJB-Spezifikation korrekt implementieren. Bei einem Wechsel des EJB-Servers dürften eigentlich lediglich Änderungen am Deployment-Descriptor notwendig werden – und bei modernen EJBServern ist die Generierung eines Deployment-Descriptors in Form von Wizards oder anderen Installationstools bequem möglich. Komponententechnologie Die EJB-Komponententechnologie macht es möglich, sehr komplexe Anwendungen portabel zu entwickeln. Bei einem Einsatz von clientseitiger Komponententechnologie (JavaBeans) ist die gesamte verteilte Anwendung komponentenbasiert, was zu schnelleren Entwicklungszyklen führt. Insbesondere können einzelne EJB-Komponenten ohne allzu großen Aufwand und vor allem ohne Änderungen der Systemarchitektur hinzugefügt, geändert oder entfernt werden (Plug & Play von Komponenten). Die wohldefinierten Schnittstellen machen also Änderungen möglich, ohne sich mit dem Quellcode befassen zu müssen. Mit dem EJB-Komponentenmodell ist auch die Kommunikation mit anderen Komponentenmodellen (CORBA, DCOM/ActiveX) möglich. Dies führt zu einer großen Flexibilität bei der Integration heterogener Systeme. Besondere Vorteile bietet die EJBKomponententechnologie bei clientseitiger Verwendung von JavaBeans, da hier eine Komponenten-Komponenten-Interaktion ohne Paradigmenbrüche realisiert werden kann. 3 Wenn man im Serverbereich von Skalierbarkeit spricht, dann bezieht man sich zumeist darauf, • wie viele Clients das System parallel benutzen können. • wie viele Objekte (hier: Beans) in einer bestimmten Zeit instanziert werden können. • wie viele Transaktionen pro Sekunde möglich sind. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 60 Ausfallsicherheit Bei serverseitigen Anwendungen ist eine möglichst große Ausfallsicherheit wichtig. Mit Enterprise Beans kann man redundante Komponenten in die Systemarchitektur einplanen. Damit ist es möglich beim Ausfall von einzelnen Komponenten auf die redundanten Komponenten auszuweichen (mehrere Redundanzebenen). Unterstützung verteilter Transaktionen Die EJB-Spezifikation delegiert schwierige Probleme an die Hersteller von EJB-Servern. Als AnwendungsentwicklerIn kann man so auf komplexe Features wie verteilte Transaktionen oder ein erweitertes Sicherheitsmodell zugreifen. Es ist so z.B. möglich, in einer Session-Bean eine Methode einer anderen Session-Bean aufzurufen, die im selben Transaktionskontext ausgeführt wird, ohne daß man sich um Details kümmern muß. 5.3 Nachteile von EJB Einige lesenswerte Artikel zum Thema sind auf den Websites [Microsoft 98], [ObjectWatch 98a], [ObjectWatch 98b], [Chappell 98] und [Cleeland 99] zu finden. Diese Artikel vergleichen zumeist MTS mit Enterprise JavaBeans. Hohe Komplexität Ein wesentlicher Nachteil von Enterprise JavaBeans ist die hohe Komplexität. Im Vergleich zum DCOM-basierten MTS (Microsoft Transaction Server) ist die EJB-Spezifikation – gerade im Bereich der Transaktionen - sehr viel komplexer – allerdings auch flexibler. Man kann diesen Nachteil allerdings relativieren: Eine größere Flexibilität impliziert normalerweise eine höhere Komplexität und ist im allgemeinen eher wünschenswert. Fixierung auf die Java-Programmiersprache Ein anderes Problem ist die Fixierung auf eine Programmiersprache (Java) und ein Übertragungsprotokoll (RMI oder RMI-over-IIOP). Hier bietet z.B. der MTS eine größere Flexibilität, da Anwendungen in mehren Programmiersprachen (z.B. C++ und Visual Basic) geschrieben werden können. Keine Referenzimplementierung Da keine Referenzimplementierung existiert, besteht die Gefahr, daß Sun's EJB-Spezifikation von Herstellern aufgeweicht und/oder erweitert wird. Die Administration von EJB-Anwendungen unterscheidet sich von Hersteller zu Hersteller zum Teil gravierend. Spezifikation wird von Sun geschrieben Leider wird die EJB-Spezifkation nicht von der OMG (Object Management Group) geschrieben oder erweitert, sondern ausschließlich von Sun Microsystems. Natürlich arbeiten auch andere Hersteller zusammen mit Sun an der Spezifikation, aber Sun entscheidet am Ende alleine über die Spezifikation. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 61 5.4 Rollen bei der EJB-Entwicklung Sun Microsystems hat in der EJB-Spezifikation verschiedene Rollen bei der Entwicklung, Installation und Administration von Enterprise JavaBeans definiert [Sun 99c]. In der Praxis sind jedoch Überschneidungen möglich. So sind z.B. EJB Provider und Application Assembler normalerweise eine Person bzw. ein Team. Auch werden die Aufgaben des Deployers zumeist vom System Administrator übernommen. Im folgenden werden die englischen Begriffe aus der Spezifikation unübersetzt übernommen. Die Bezeichnungen in Klammern stammen aus dem EJB-Guide von Nova [Nova 99] und beschreiben die jeweilige Rolle meistens besser. EJB Provider (EJB Developer) Mit diesem Begriff meint Sun einen Entwickler von Enterprise JavaBeans. Typischerweise muß man sich als EJB-Entwickler nicht mit Low-Level-Details wie Transaktionen oder Sicherheit befassen, weil diese Bereiche laut EJB-Spezifikation vom Container Provider übernommen werden. Application Assembler (Application Developer) Ein Application Assembler schreibt keine neuen Enterprise Beans sondern kombiniert verschiedene Beans (unter Umständen von verschiedenen EJB Providers) und paßt sie an die spezifischen Anforderungen an. Das Ergebnis ist zumeist ein JAR-File, welches die angepaßten und aufeinander abgestimmten EJBs enthält. Zu den Aufgaben des Application Assemblers gehört auch das Schreiben eines Deployment-Descriptors oder die Integration von EJBs in eine bestehende Infrastruktur (z.B. Java Server Pages). Deployer (EJB Deployer) Der Deployer ist zuständig für die Installation (Deployment) von Enterprise JavaBeans in einem firmenspezifischen EJB-Container. Dazu werden die EJBs als JAR-File direkt vom Application Assembler oder EJB Provider übernommen und in die entsprechenden Verzeichnisse installiert. Gegebenenfalls muß noch eine Anpassung an das entsprechende Betriebssystem und eine Optimierung vorgenommen werden. Zu den Aufgaben des Deployers gehört auch die Übertragung von Sicherheitsrechten an bestimmte Benutzergruppen. Server/Container Provider (Server/Container Vendor) Der Server/Container Provider ist üblicherweise ein Hersteller von Betriebssystemen, Datenbanken oder Applikationsservern und entsprechend ein Experte für Transaktionen und Sicherheit. Ein solcher Provider stellt Tools zur Verfügung, mit denen EJBs installiert und angepaßt werden können. In welchem Umfang weitere Tools existieren, bleibt dem Provider überlassen. Er muß jedoch einen EJB-Container zur Verfügung stellen, der die jeweilige EJB-Spezifikation umsetzt. System Administrator Der System Administrator ist für die Überwachung und Optimierung von installierten EJBs zuständig. Normalerweise werden dafür spezielle Tools vom Server/Container Provider zur Verfügung gestellt. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 62 5.5 EJB Architektur Überblick Enterprise JavaBeans werden meistens in 3-stufigen Architekturen als Middle-Tier verwendet. Folgende Abbildung zeigt den prinzipiellen Aufbau einer solchen Architektur: EJB Server EJB Container Client Sicht des Clients DB EJB EJB EJB Dienste Transaction, Naming, Persistence Abbildung III-22: Überblick über die EJB-Architektur Wie man sieht enthält der EJB Server (mindestens) einen Container, in dessen Kontext sich die Enterprise Beans befinden. Wie diese Beans von einem Client angesprochen werden können, wird in den folgenden Unterkapiteln beschrieben. Folgendes UML-Klassendiagramm beschreibt die Beziehungen zwischen einem EJB-Server und einem EJB-Container: EJBServer 1 enthält 0..* EJBContainer 1 verwaltet 0..* EnterpriseBean EntityBean SessionBean Abbildung III-23: UML-Klassendiagramm der EJB-Architektur In diesem Diagramm wird nicht zwischen einer zustandslosen und einer zustandsbehafteten Session-Bean unterschieden. Der Unterschied zwischen beiden Beantypen ist, daß bei einer Zustandsbehaftung der Kontext der Sitzung abgespeichert werden muß. In einer konkreten Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 63 Implementierung muß beispielsweise bei einer SessionBean noch eine Zustandsklasse dazukommen, die den Kontext der Sitzung verwaltet. Aber das soll nicht das Thema dieser Diplomarbeit sein. EJB Server Der EJB Server ist eine Middleware (etwa ein Applikationsserver), die eine Infrastruktur zur Ausführung von EJBs zur Verfügung stellt. In Sun's EJB Spezifikation heißt es lediglich, daß Hersteller von EJB Servern Session- und/oder Entity-Container gemäß der Spezifikation [Sun 99c] implementieren müssen. Es wird zwar erwähnt, daß eine zukünftige EJB Spezifikation die Schnittstellen zwischen EJB-Server und -Container möglicherweise näher spezifizieren wird, tatsächlich jedoch gibt es zur Zeit keine Hinweise darauf, wie solche standardisierten Schnittstellen aussehen sollen. Entsprechend gibt es verschiedene Ansätze für die Architektur von EJB-Servern. Der Oracle-Applikationsserver etwa bietet neben den üblichen Features (z.B. Cartridges für HTTPRequests) auch eine Cartridge für Enterprise JavaBeans an. Der PowerTier-Server von Persistence ist ein reiner EJB-Server, d.h. es werden nur EJBs unterstützt. Ein EJB Server muß einen oder mehrere EJB Container zur Verfügung stellen, in denen die Enterprise Beans installiert werden können. EJB Container Ein EJB Container muß die installierten Enterprise Beans verwalten. Dazu muß er folgende Funktionalitäten bieten: • Registrierung der EJB • Verwaltung des EJB-Lebenszyklus • Persistenz für Entity-Beans • Transaktionsmanagement (Koordinierung verteilter Transaktionen) • Bereitstellung eines Remote Interfaces Die EJB-Spezifikation läßt Herstellern viele Freiheiten bei der Implementierung von EJBServern/Containern. Wichtig ist nur, daß ein EJB-Container stets im Kontext eines Servers läuft. Ob der Server ein reiner EJB-Server ist oder noch weitere Standards unterstützt ist dabei nicht relevant. Folgende Abbildung zeigt den internen Aufbau eines Containers für Enterprise Beans: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans Sicht des Clients 64 EJB Server EJB Container Methoden Remote Interface Client create() find() remove() Home Interface Deployment Descriptors Enterprise Bean Environment Dienste Bean Identifier Transaction Naming Persistence Abbildung III-24: Aufbau eines EJB-Containers Wie aus obiger Abbildung ersichtlich, dient der EJB-Container als Schnittstelle zwischen dem Client und der Enterprise JavaBean. Der Container generiert das Home-Interface automatisch, wenn der EJB-Server gestartet wird. Diese Schnittstelle dient nicht dem Aufruf von AnwendungsMethoden sondern um EJB-Instanzen zu kreieren, aufzufinden und zu entfernen. Die ObjektSchnittstelle dient zum Zugriff auf die eigentliche Anwendungslogik (Business Objects). Remote Interface Das Remote Interface erweitert das EJBObject-Interface und bietet eine Auflistung aller Methoden der betreffenden Enterprise Bean. Das Remote Interface wiederum wird vom ClientStub implementiert (diese Implementierung wird mit dem rmic-Tool automatisch generiert). Der Client verwendet dann diese Implementierung, um auf die Business-Methoden der Enterprise Bean zuzugreifen. Das heißt also, daß der Client keinen direkten Zugriff auf eine Instanz einer EJB hat. Es muß stets das Remote Interface (bzw. dessen Implementierung) verwendet werden. Folgende Abbildung macht den Sachverhalt klarer: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 65 EJB Server EJB Container Client EJB Home Stub Deployment Descriptor RMI/CORBA EJB-Home create() find() remove() EJB Remote Stub Enterprise Bean Environment RMI/CORBA EJB-Object BusinessMethods Dienste Transaction Naming Persistence Abbildung III-25: Detaillierter Aufbau eines EJB-Containers Auch die serverseitige Implementierung des Remote Interfaces (das sogenannte Skeleton) wird automatisch vom rmic-Tool (oder einem entsprechenden Tool des Container-Herstellers) generiert.4 Home Interface Diese Schnittstelle dient zum Kreieren, Auffinden und Entfernen von EJB-Klassen. Die Implementierung dieser Schnittstelle wird EJB-Home genannt. Ist ein Client daran interessiert, die Dienste einer EJB in Anspruch zu nehmen, muß die create-Methode der EJB-Home-Klasse aufgerufen werden. Diese Methode instanziert das EJB-Object (die Implementierung des Remote Interfaces) und die Bean-Klasse. Die Referenz auf die Bean-Klasse wird dann an das EJB-Object 4 Es gibt für den Container-Hersteller verschiedene Strategien, Stubs und Skeletons zu generieren (aus [Monson-Haefel 99]): • Das Skeleton ist eine Implementierung des Remote Interfaces. Es hat eine Referenz auf die Enterprise JavaBean-Klasse. • Das Skeleton implementiert das Remote Interface, erweitert jedoch zusätzlich die EJB-Klasse (d.h. es ist keine explizite Referenz auf das Bean vorhanden). • Das Skeleton implementiert das Remote Interface und die javax.ejb.EnterpriseBean-Schnittstelle. Das heißt, daß die eigentliche Bean-Klasse nicht mehr im Modell enthalten ist. Hier hat das Skeleton also sowohl eine proprietäre Implementierung des Remote Interfaces als auch eine Implementierung der Bean-Methoden. Die meisten Hersteller verwenden die erste Strategie. Wichtig ist jedoch, sich klarzumachen, daß das EJBObject zwar stets vorhanden ist, daß die eigentliche Implementierung aber herstellerspezifisch ist und automatisch generiert wird. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 66 weitergegeben. Anschließend wird die ejbCreate-Methode der Bean aufgerufen (bei Entity-Beans wird ein neuer Datensatz in die Datenbank eingefügt und bei Session-Beans wird eine Initialisierung durchgeführt). Deployment-Descriptor Jede Enterprise Bean hat eine Vielzahl von Eigenschaften. Session-Beans können z.B. zustandslos oder zustandsbehaftet sein und einen bestimmten Timeout festlegen. Diese Informationen sind nicht in der Bean selbst enthalten, sondern in einem sogenannten Deployment-Descriptor. Ein Deploment Descriptor wird zusammen mit der entsprechenden Bean in ein JAR-File gepackt und im Server installiert. In ihm sind Konfigurationsinformationen vorhanden, die von der Enterprise Bean benötigt werden.5 Mit dem Deployment-Descriptor ist es möglich, wichtige Informationen über die Bean zu erhalten und mit bestimmten Methoden auch zu manipulieren. Idealerweise verfügt der Applikationsserver über ein geeignetes Tool, mit dem sich leicht bestimmte Eigenschaften – z.B. der Timeout einer Sitzung – ändern lassen. Dazu sind lediglich Kenntnisse über Server-Administration nötig – es muß kein Sourcecode geändert werden. Der Deployment-Descriptor ist ein XML-Dokument, das zu der Dokumenttyp-Definition (DTD) in der EJB-Spezifikation [Sun 99c] konform ist. Üblicherweise bieten die Hersteller von EJBServern/Containern Tools zur Erstellung des Deployment-Descriptors an. Möglich ist jedoch auch die manuelle Erstellung. Um die Gültigkeit (im XML-Sinne) eines Deployment-Descriptors zu verifizieren, plant Sun Microsystems, ein spezielles Tool zur Verfügung zu stellen. Zur Zeit (August 1999) ist jedoch noch kein Veröffentlichungstermin bekannt. Folgender Codeausschnitt zeigt, wie ein konkreter Deployment-Descriptor aussehen könnte: <!DOCTYPE ejb-jar PUBLIC “-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.2//EN” “http://java.sun.com/j2ee/dtds/ejb-jar_1_2.dtd”> <ejb-jar> <description></description> <enterprise-beans> <session> <description></description> <ejb-name>EmployeeService</ejb-name> <home>com.wombat.empl.EmployeeServiceHome</home> <remote>com.wombat.empl.EmployeeService</remote> <ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Bean</transaction-type> ... </session> ... </ejb-jar> Codebeispiel III-17: XML-basierter Deployment-Descriptor Dieser Deployment-Descriptor ist ein kurzer Ausschnitt aus dem kompletten Beispiel, das in der Spezifikation [Sun 99c] abgedruckt ist. In der Spezifikation kann man auch die gut kommentierte DTD finden. 5 In der Version 1.0 der EJB-Spezifikation war ein Deployment-Descriptor noch eine serialisierte Instanz von javax.ejb.deployment.DeploymentDescriptor. Das javax.ejb.deployment-Paket wurde in der Version 1.1 der Spezifikation durch einen XML-basierten Deployment-Descriptor ersetzt. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 67 5.6 Session und Entity-Beans An enterprise Bean that implements a business task is a session Bean, and an enterprise Bean that implements a business entity is an entity bean. Monica Pawlan Überblick Für komplexe Server-Anwendungen existieren zwei verschiedene Modelle: 1) Die Serverkomponente ist eine Anwendung, die Requests des Clients bearbeitet 2) Eine Serverkomponente repräsentiert eine Entität in einer Datenbank Das erste Modell ist ein eher klassischer Client/Server-Ansatz. Der Client nimmt Dienste (z.B. Datenbankanfragen) des Servers in Anspruch. Eine Komponente des Servers (z.B. eine EJB) repräsentiert eine (transiente) Sitzung. In einer solchen Sitzung können z.B. Datenbankanfragen gestellt oder Metainformationen über die Datenbank abgerufen werden. Diese Datenbankzugriffe werden also im Kontext einer Sitzung durchgeführt. Bei einem client- oder serverseitigen Crash gehen die Daten verloren. EJB Server EJB Container Client A Client B Session Bean (Zustandslos) Session Bean (Instanz 1) Entity Bean (Instanz 1) Relation Tupel 1 Tupel 2 ... Tupel n Entity Bean (Instanz 2) Entity Bean (Instanz n) Client C JDBC RMI Session Bean (Instanz 2) Abbildung III-26: Session-Beans und Entity-Beans Das zweite Modell wird heutzutage primär bei objektorientierten Datenbanken verwendet. Ein Serverobjekt ist eine Repräsentation von Daten in einer Datenbank. Beispielsweise könnte ein Adreßbuch durch die EJB Addressbook repräsentiert werden. Addressbook ist eine Relation in einer relationalen Datenbank; jeder Adreßbucheintrag ist ein Tupel dieser Relation. Die Enterprise Bean bietet nun Methoden zur Manipulation der Daten an. Sinnvoll ist z.B. eine Funktion zum Einfügen neuer Adressen oder zur Änderung bestehender Adressen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 68 Session-Beans Session-Beans dienen zur Workflow-Modellierung, implementieren also die sogenannte Business Logic. Man unterscheidet zustandsbehaftete und zustandslose Session-Beans. Zustandsbehaftetete Session-Beans Ist eine Session-Bean zustandsbehaftet, muß für jede Sitzung eine neue Instanz kreiert werden. Eine Instanz dieser Bean wird auf die Anfrage eines Clients instanziert und existiert nur für die Dauer der Sitzung. Zustandsbehaftete (Stateful) Session-Beans sind normalerweise nicht persistent; der Zustand wird lediglich im Hauptspeicher des Servers festgehalten. Falls der Server (oder der Container) abstürzt, ist der Zustand verloren. Zustandslose Session-Beans Eine Instanz einer zustandslosen Session-Bean kann gleichzeitig mehrere Anfragen (Methodenaufrufe) verschiedener Clients entgegennehmen und bearbeiten. Zustandslose SessionBeans nehmen Client-Anfragen entgegen und führen sie aus. Es ist vollkommen irrelevant, ob die Bean zwischen zwei Anfragen (z.B. aus Speichergründen) vom Container entfernt und wiederhergestellt wurde, oder ob sie sich dauerhaft im Speicher befindet. Es können also keine Sitzungsinformationen auf Klassen- oder Instanzenebene gespeichert und wiederhergestellt werden. Die Zustandslosigkeit der Beans impliziert auch, daß bei der Instanziierung über die create-Methode der Home Schnittstelle keine Parameterübergabe stattfinden darf. Entity-Beans Entity-Beans sind zustandsbehaftet und persistent, d.h. der Zustand der Sitzung wird dauerhaft abgespeichert und kann – z.B. nach einem Neustart des Servers – wieder hergestellt werden. Eine Entity-Bean wird normalerweise als Tupel einer Relation (bzw. als Objekt in einem OODBMS) abgespeichert und hat demzufolge einen eindeutigen Primärschlüssel bzw. eine eindeutige ObjektID. Die Schnittstelle javax.ejb.EntityContext deklariert folgende Methoden, um den Primärschlüssel zu setzen bzw. abzufragen: public abstract Object getPrimaryKey(); public abstract void setPrimaryKey(Object primaryKey); Codebeispiel III-18: Methodendeklaration zur Primärschlüssel-Abfrage Es ist wichtig, sich klarzumachen, daß Entity-Beans nicht einfach Session-Beans sind, deren Zustand dauerhaft abgespeichert wird, sondern ein anderes Modellierungskonzept beinhalten. Entity-Beans bieten eine objektorientierte Sicht auf relationale Datenbanken und halten den eigentlichen Datenbankzugriff (über JDBC) für den Entwickler transparent. Folgende Abbildung soll dieses Konzept verdeutlichen: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 69 Direkter Zugriff auf eine Entity Bean EJB Server EJB Container Client Entity Bean (Instanz 1) JDBC Client startet eine Sitzung Entity Bean (Instanz 2) Session Bean (Instanz 1) Die Session Bean benutzt Entity Beans, um auf die Daten zuzugreifen Relation Tupel 1 Tupel 2 ... Tupel n Datenmanipulation mit JDBC Abbildung III-27: Verwendung von Entity-Beans Entity-Beans werden eingesetzt, wenn bei der Entwicklung eine Trennung von Geschäftslogik und JDBC-Code angestrebt wird. Session-Beans werden von einem Client instanziert und benutzen Entity-Beans, um auf die Datenbank zuzugreifen. Natürlich kann der Client auch direkt auf EntityBeans zugreifen. EJB-Anwendungen werden allerdings zumeist so modelliert, daß Clients ausschließlich über Session-Beans zugriff auf Entity-Beans haben. 5.7 Dienste Persistenz Entity-Beans dienen zur persistenten Speicherung von Informationen in Datenbanken. Sie repräsentieren keine Geschäftsprozesse sondern Entitäten. Man unterscheidet bei der Persistenz von Entity-Beans beanverwaltete und containerverwaltete Persistenz. Normalerweise wird man sich aus Effizienz- und Zeitgründen für die containerverwaltete Persistenz entscheiden, sofern diese Option vom Container-Hersteller angeboten wird. Beanverwaltet (bean-managed) Bei beanverwalteter Persistenz muß der Entwickler selbst Maßnahmen zur persistenten Speicherung der Bean in der Datenbank ergreifen. Normalerweise geschieht dies mit der Datenbank-API JDBC. Beanverwaltete Persistenz muß verwendet werden, wenn der Container keine containerverwaltete Persistenz anbietet. Werden EJBs zum Zugriff auf LegacyAnwendungen verwendet, ist zumeist eine manuelle Programmierung der Persistenz nötig, da nur wenige Container-Hersteller den Zugriff auf diese Systeme implementieren. Containerverwaltet (container-managed) Die containerverwaltete Persistenz spart viel Arbeit bei der Entwicklung, weil keine Sicherungsmechanismen von Hand programmiert werden müssen. Ein Beispiel für einen EJB- Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 70 Containerhersteller, der containerverwaltete Persistenz verwendet, ist PowerTier von Persistence. PowerTier implementiert ein Konzept, das unter dem Namen Object-to-relational persistence bekannt ist [Monson-Haefel 99]. Dabei wird einer Entity-Bean ein Tupel einer relationalen Datenbank zugeordnet. Die Variablen der Bean entsprechen dann den Attributen oder Spalten der Tabelle. Ein anderes (und eleganteres) Konzept ist die Object database persistence, also die Speicherung von Entity-Beans als Objekte in einer objektorientierten Datenbank. Nebenläufigkeit Nebenläufigkeit wird nur von Entity-Beans unterstützt. Bei Session-Beans ist dies nicht notwendig, da • zustandsbehaftete Session-Beans ohnehin nur von einem bestimmten Client instanziert und freigegeben werden und • zustandslose Session-Beans keine Zustandsvariablen haben, auf die mehrere Clients zugreifen könnten. Da bei Entity-Beans ein nebenläufiger Zugriff mehrerer Clients möglich ist, sind Mechanismen zur Konsistenzsicherung notwendig. Deshalb sind Entity-Beans laut Spezifikation [Sun 99c] wiedereintrittsinvariant. Wiedereintrittsinvarianz von Entity-Beans Normalerweise sind Entity-Beans wiedereintrittsinvariant. Das heißt, daß innerhalb eines Transaktionskontextes nur eine Client-Anfrage bearbeitet wird. Wenn eine Entity-Bean ein Request eines Clients bearbeitet und ein weiterer Client-Request im selben Transaktionskontext eintrifft, wirft der EJB-Container eine java.rmi.RemoteException. Nähere Informationen zur Wiedereintrittsinvarianz sind in der EJB-Spezifikation [Sun 99c] zu finden. Transaktionen Das EJB-Transaktionsmodell JTS ist eine Implementierung Transaktionsmodells OTS (Object Transaction Service). des CORBA/OMG- Einführung Transaktionen sind prinzipiell als atomare Einheit zu sehen. Es können mehrere Operationen im Kontext einer Transaktion ausgeführt werden. Diese Operationen werden im Rahmen einer Transaktion entweder alle vollständig und fehlerfrei ausgeführt und entsprechend mit einem commit-Befehl bestätigt oder bei Problemen mit dem rollback-Befehl rückgängig gemacht. Eine gute Transaktionsverwaltung ist sehr aufwendig, besonders bei Operationen auf großen Datenbanken mit einem nebenläufigen Zugriff mehrerer Clients. Je nach verwendeter Sperrgranularität werden einzelne Tupel oder ganze Relationen für die Dauer der Transaktion gesperrt, um Inkonsistenzen zu verhindern. Schwierig ist bei solchen Transaktionskonzepten besonders der Mittelweg zwischen Sicherheit und Performanz. Transaktionsverhalten Das Transaktionsverhalten von Enterprise JavaBeans läßt sich über das Transaktions-Attribut des Deployment-Descriptors einstellen. Es sind 6 Werte möglich: • TX_NOT_SUPPORTED • TX_SUPPORTS • TX_REQUIRED Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans • TX_REQUIRES_NEW • TX_MANDATORY • TX_BEAN_MANAGED 71 Mit diesen Integerkonstanten kann einE EntwicklerIn nun für jede Methode in der EJB eine bestimmte Transaktionsvariante festlegen. TX_NOT_SUPPORTED bedeutet natürlich, daß diese Methode nicht im Kontext einer Transaktion laufen sollte. Mit TX_SUPPORTS wird angezeigt, daß für die entsprechende Methode kein Transaktionkontext benötigt wird, daß der laufende Thread sich aber in einem Transaktionskontext befinden kann. Wird TX_REQUIRED verwendet, dann muß eine Transaktion laufen. Wenn der gerade aktuelle Thread im Kontext einer Transaktion läuft, dann kann er in die Methode eintreten. Besitzt er keine laufende Transaktion, startet er eine Transaktion. Ist für die auszuführende Methode TX_REQUIRES_NEW festgelegt, so muß der aktive Thread eine neue Transaktion starten, auch wenn bereits eine vorhanden ist. Mit TX_MANDATORY wird eine weitere Restriktion angezeigt: der aktive Thread muß bereits im Besitz einer Transaktion sein wenn die Methode aufgerufen wird, da ansonsten eine Ausnahme geworfen wird. TX_BEAN_MANAGED formuliert keine neuen Restriktionen, sondern sagt lediglich aus, daß der Container sich nicht um die Transaktionsverwaltung für diese Methode kümmern soll, da die Bean sich selbst darum kümmert. Eine Methode, die diese Transaktionsvariante für sich festlegt, muß selbst eine neue Transaktion kreieren und zerstören, wenn sie aufgerufen wird. Java Transaction Service: JTS Der Java Transaction Service (JTS) ist eigentlich kein eigener Transaktionsservice. Er ist lediglich eine Schnittstelle zur Transaktionsverwaltung des EJB-Containers. Es soll hier nicht näher auf Implementierungsdetails eingegangen werden, aber es ist klar, daß die Schnittstelle (javax.jts.UserTransaction) unter anderem die Methoden begin, commit und rollback bereitstellt. Bestandteil des Pakets sind auch einige spezielle Ausnahmen, die beim Aufruf dieser Methoden abgefangen werden müssen. Verteilte Objekte Die bekanntestens Dienste für verteilte Objekte sind CORBA, RMI und DCOM. Die Enterprise JavaBeans-Spezifikation verwendet der Einfachheit wegen Java's RMI (Remote Method Invocation). Nähere Informationen zu RMI sind im RMI-Kapitel dieser Diplomarbeit zu finden. Namensdienst Als Namensdienst (z.B. zum Auffinden von EJBs) dient das Java Naming and Directory Interface (JNDI). Dieser Dienst wird im Unterkapitel "Szenario eines EJB-Methodenaufrufes" näher beschrieben. Sicherheit Bei EJBs müssen die Sicherheitsrichtlinien nicht im Sourcecode deklariert werden. Die Sicherheitsrichtlinien werden vielmehr über entsprechende Tools der Container-Hersteller deklariert. Dabei können laut Spezifikation verschiedenen Benutzergruppen Sicherheitsrollen, die den Zugriff auf bestimmte Methoden regeln, zugeordnet werden. Im O'Reilly-Buch "Enterprise JavaBeans" [Monson-Haefel 99] werden drei Arten von Sicherheit unterschieden: • Authentifizierung (Validierung der Benutzeridentität) Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 72 • Zugriffskontrolle (Sicherheitsrichtlinien, um den Zugriff bestimmter Benutzer zu bestimmten Methoden einzuschränken) • Sichere Kommunikation (Sicherung des Kommunikationskanals zwischen Client und Server, z.B. durch Verschlüsselung) In der Version 1.0 der EJB-Spezifikation [Sun 99c] ist nur die Zugriffskontrolle durch die oben beschriebenen Sicherheitsrollen geregelt. Allerdings bieten viele EJB-Server auch eine sichere Kommunikation mit SSL (Secure Socket Layer) an. Authentifizierung wird in der EJB-Spezifikation nicht näher beschrieben, ist allerdings indirekt über JNDI (Java Naming and Directory Service) möglich. 5.8 Überblick über Klassen und Schnittstellen der EJB-API Dieses Unterkapitel bezieht sich auf die Version 1.1 der EJB-Spezifikation [Sun 99c]. Einer der Hauptunterschiede zwischen den Versionen 1.0 und 1.1 ist das Wegfallen des javax.ejb.deployment-Paketes durch einen XML-basierten Deployment-Descriptor. Überblick über die EJB-API Das API der Enterprise JavaBeans besteht aus dem Paket javax.ejb Das Paket javax.ejb.deployment wurde aus der Spezifikation entfernt, da mit der Version 1.1 ein XMLbasierter Deployment-Descriptor verwendet wird. Das Paket javax.ejb besteht aus der Schnittelle EnterpriseBean und deren Subschnittstellen (EntityBean, SessionBean), den entsprechenden Kontext-Schnittstellen (EntityContext, SessionContext), den Interfaces EJBObject und EJBHome sowie mehreren Exceptions. Dabei ist vor allem anzumerken, daß die EJBObject-Schnittstelle ein Subinterface von java.rmi.Remote ist, was die enge Verknüpfung von Enterprise JavaBeans (EJB) mit der Remote Method Invocation (RMI) deutlich macht. <<interface>> java.rmi.Remote <<interface>> java.ejb.EJBHome <<interface>> java.ejb.EJBObject <<interface>> MyHomeInterface <<interface>> MyRemoteInterface HomeImplementation <<interface>> java.ejb.EJBMetaData Remote Interface und Home Interface müssen vom Entwickler geschrieben werden. Die Implementierung wird von Tools generiert. RemoteImplementation Abbildung III-28: EJBObject, EJBHome, EJBMetaData Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 73 Bei der Entwicklung von Enterprise Beans müssen nun das Home Interface und das Remote Interface geschrieben werden. Die Implementierung dieser Schnittstellen wird automatisch von einem Tool generiert. Es ist wichtig sich klarzumachen, daß die Schnittstelle MyRemoteInterface aus obiger Abbildung zwar vom Container implementiert wird, daß aber diese Implementierung lediglich die korrespondierenden Business-Methoden der Enterprise Bean aufruft. Die folgende Abbildung zeigt die beiden verschiedenen Arten von Enterprise Beans: Entity-Beans und Session-Beans. Jede dieser EJBs hat einen spezifischen Kontext, der durch die Schnittstellen EntityContext und SessionContext, beides Subschnittstellen von EJBContext, repräsentiert wird: <<interface>> java.io.Serializable Implementierung durch den Container Implementierung durch den Container <<interface>> java.ejb.EnterpriseBean SessionContext hasContext <<interface>> java.ejb.SessionBean <<interface>> java.ejb.EntityBean MySessionBean MyEntityBean <<interface>> java.ejb.SessionContext <<interface>> java.ejb.EJBContext EntityContext hasContext <<interface>> java.ejb.EntityContext Abbildung III-29: EnterpriseBean und Subklassen Mit den Schnittstellen EJBContext und den Subinterfaces SessionContext und EntityContext kann auf den Kontext, den der EJB-Container der Instanz der Enterprise Bean zur Verfügung stellt, bequem zugegriffen werden. Eine typische Methode, die in EJBContext definiert ist, ist getEJBHome (Referenz auf die Implementierung des Home Interfaces). SessionContext fügt lediglich die Methode getEJBObject hinzu, um eine Referenz auf das EJBObject zu erhalten, welches mit der Instanz der Enterprise Bean assoziiert ist. Auch EntityContext enthält eine getEJBObject-Methode, definiert aber zusätzlich noch getPrimaryKey, da eine Entity-Bean Daten einer Datenbank repräsentiert. 5.9 Überblick über die Entwicklung von Enterprise JavaBeans Dieser Abschnitt soll lediglich einen knappen Überblick über die Programmierung von EJBs geben; Die Entwicklung läuft nun so ab: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 74 • Programmierung einer Enterprise Bean mit den Standard-Methoden (d.h. den Methoden die aus der Schnittstelle SessionBean oder EntityBean implementiert werden müssen) und der eigentlichen Geschäftslogik. • Programmierung des Home Interfaces als Subschnittstelle von EJBHome, mit dem die entsprechenden Beans instanziert und zerstört werden können. • Programmierung des Remote Interfaces, in dem alle Methoden, welche ein Client aufrufen kann, definiert sind. Die Implementierung dieser Schnittstelle wird vom Container übernommen. • Compilierung der Klassen. • Schreiben des XML-basierten Deployment-Descriptors (wird in der Regel von einem Tool des Server-Herstellers übernommen). • Generierung eines JAR-Files, das die oben beschriebenen Files enthält. • Installation des generierten JAR-Files im EJB-Server (Deployment). Die genaue Vorgehensweise ist abhängig vom EJB-Server. Das war der serverseitige Teil der Entwicklung. Nun muß ein Client programmiert werden, der die Business-Methoden der Enterprise Bean aufruft. 5.10 Szenario eines EJB-Methodenaufrufs (bei zustandsbehafteten Session-Beans) Enterprise JavaBeans werden auf unterschiedliche Art und Weise instanziert und angesprochen. Zustandslose Session-Beans beispielsweise, werden nicht vom Client instanziert sondern vom EJBContainer. Entity-Beans wiederum verhalten sich völlig anders wie beide Arten von Session-Beans. In der EJB-Spezifikation [Sun 99c] und in Monson-Haefel's EJB-Buch [Monson-Haefel 99] sind deshalb zahlreiche Zustands- und Sequenzdiagramme abgebildet, welche die unterschiedliche Behandlung der verschiedenen Enterprise Beans deutlich machen. An dieser Stelle soll nur einmal das Szenario eines Methodenaufrufs bei einer zustandsbehafteten Session-Bean vorgestellt werden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 5. EJB - Enterprise JavaBeans 75 Folgendes Kollaborationsdiagramm gibt einen Überblick über einen typischen Methodenaufruf bei zustandsbehafteten Session-Beans: Factory Pattern EJB Container Client concreteProducer concreteProduct 1. create() :MyClient :HomeImplementation 3. Class. newInstance() 8. remove() 4. setSessionContext() :MyEnterpriseBean 9. remove() 2. Class. newInstance() 6. aBusinessMethod() 5. ejbCreate() :RemoteImplementation 7. aBusinessMethod() 10. ejbRemove() subject proxy Proxy Pattern Abbildung III-30: EJB-Methodenaufruf bei zustandsbehafteten Session-Beans Man kann hier recht deutlich erkennen, daß ein Großteil der EJB-Komplexität vor dem Client verborgen wird. Für den Aufruf einer EJB-Methode sind lediglich zwei Methodenaufrufe nötig; ein Methodenaufruf zur Instanzierung und einer zum Aufruf der gewünschten Business-Methode. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 76 6 JDBC – Java Database Connectivity Errors using inadequate data are much less than those using no data at all. Charles Babbage In dieser Diplomarbeit geht es unter anderem um die Abfrage relationaler Datenbanken. Da das zu implementierende Query-Tool datenbankunabhängig sein soll, muß ein offener Standard verwendet werden, der von möglichst vielen Datenbankherstellern unterstützt wird. JDBC (Java Database Connectivity) ist ein solcher Standard, der problemlosen Zugriff auf die populärsten relationalen Datenbanken ermöglicht. Die breite Akzeptanz von JDBC seitens der Industrie hat dazu geführt, daß nahezu jeder wichtige Datenbankhersteller JDBCTreiber in seine Produktpalette aufgenommen hat. In den folgenden Unterkapiteln soll die grundlegende Funktionsweise dieser Technologie – auch anhand von Code-Beispielen – erklärt werden. 6.1 Was ist JDBC? JDBC ist ein datenbankunabhängiger Standard für den Zugriff auf relationale Datenbanksysteme aus einem Java-Programm heraus. Das Akronym JDBC steht für Java Database Connectivity und ist ein Paket aus Klassen und Schnittstellen, die der Programmierer in Java-Programmen verwenden kann. Dieses Application Programming Interface (API) ist der de-facto Standard für den Datenbankzugriff unter Java und wird von den meisten Datenbankherstellern unterstützt. Embedded SQL (ESQL) Embedded SQL (ESQL) ist ein internationaler Standard (ISO SQL-92), der die Einbettung von SQL-Anweisungen in (imperative) Programmiersprachen regelt. Erfaßte Programmiersprachen sind C, C++, COBOL, FORTRAN, PL/1, Pascal, MUMPS und Ada. Für Java existiert eine ESQLImplementierung namens SQLJ, die 1997 von Oracle, Tandem und IBM vorgestellt wurde. SQLJ SQLJ ist eine offene ESQL-Implementierung für Java. Mit SQLJ können SQL-Anweisungen in Java-Programme eingebettet werden. Der entsprechende Java-Quellcode wird von einem Compiler (bei Oracle sinngemäß sqlj genannt) vorübersetzt und in überprüfte, statische JDBC-Anweisungen umgewandelt. Warum sollte man SQLJ überhaupt verwenden? Nun, wenn in einem Java-Programm sehr komplizierte und/oder umfangreiche SQL-Anweisungen verarbeitet werden, entsteht schnell ein kaum noch überschaubarer Code, in dem sich auch nach der x-ten Überprüfung noch Fehler Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 77 verstecken. Die eingebetteten SQL-Anweisungen sind viel einfacher zu lesen und werden vor allem beim Compilieren auf Plausibilität überprüft. SQLJ und JDBC ergänzen sich geradezu ideal: SQLJ ist für statische SQL-Anweisungen gedacht, die bereits zum Übersetzungszeitpunkt bekannt sind und JDBC ist für dynamisches SQL besser geeignet. Natürlich gibt es auch Probleme: • Die Zieldatenbank muß zum Übersetzungszeitpunkt bekannt und verfügbar sein. • Üblicherweise sind (trotz gegenteiliger Versprechungen) die SQLJ-Präcompiler an eine bestimmte Datenbank gebunden; d.h. daß das SQLJ-Programm für jeden Datenbankserver neu compiliert werden muß • SQLJ unterstützt keine datenbankunabhängigen Metadaten Da SQLJ noch eine relativ junge Technologie ist, bleibt abzuwarten, in welchem Umfang sich ein wirklich offener Standard entwickelt. 6.2 JDBC/ODBC JDBC ist ein portables Call Level Interface (CLI), das ähnlich wie ODBC aufgebaut ist. ODBC (Version 3.0) ist ein prozedurales CLI für den Zugriff auf relationale Datenbanken. Trotz seiner Microsoft-Herkunft hat sich ODBC zu einem weitgehend offenen Standard entwickelt und auch außerhalb der Windows-Welt weite Verbreitung gefunden. Wozu sollte man also JDBC verwenden? Das hat verschiedene Gründe, die hier im folgenden kurz aufgeführt werden. Die Spezifikation wird von Microsoft geschrieben und ständig erweitert. Das ist der vielleicht wichtigste Nachteil von ODBC: der ODBC-Standard wird vollkommen von Microsoft kontrolliert. Wie in der Vergangenheit schon mehrfach geschehen, ist es möglich, daß Microsoft aus dem weitgehend offenen ODBC mit SQL3-Unterstützung eine proprietäre Erweiterung von OLE macht. Möglich ist auch ein vollständiger Ersatz des prozeduralen ODBC durch das objektbasierte OLE/DB. Bei Microsoft als Firma ist – wie die Erfahrung zeigt – ein gesundes Mißtrauen angebracht, gerade was proprietäre Erweiterungen betrifft. ODBC ist prozedural ODBC ist ein prozedurales API, was bei der Entwicklung von objektorientierter Software problematisch ist; es werden z.B. Zeiger auf Strukturen statt Referenzen auf Objekte zur Verfügung gestellt. Das bedeutet, daß es nicht möglich ist, die Vorteile des objektorientierten Paradigmas voll auszuschöpfen. ODBC erfordert nativen Code in der Anwendung Damit ist ein Java-Programm nicht mehr plattformunabhängig und kann z.B. nicht mehr in Form eines Applets aus dem Web geladen werden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 78 6.3 Warum JDBC verwenden? Der Hauptgrund für die Verwendung von JDBC ist sicherlich der vom DBMS unabhängige Zugriff auf relationale Datenbanken. Die Datenbank, auf die zugegriffen wird, ist also beliebig austauschbar, zumindest wenn sie Standard-SQL verwendet. Ein JDBC-Treiber muß zumindest ANSI SQL92 Entry Level-Funktionalität bieten, sozusagen als kleinster gemeinsamer Nenner. 6.4 JDBC-Treibertypen Um die JDBC Schnittstellen zu implementieren, ist ein JDBC-Treiber nötig. Es gibt vier verschiedene Treibertypen: Typ 1: JDBC-ODBC-Bridge Dieser Treiber ist eine JDBC-ODBC-Bridge, die es ermöglicht, über JDBC auf beliebige ODBCDatenbanken zuzugreifen. Vorteilhaft ist hier natürlich der bequeme Zugriff auf die weit verbreiteten ODBC-Datenbanken. Java-Applikation JDBC API CLIENT JDBC-Treibermanager JDBC Treiber API JDBC-ODBCBridge ODBCTreiber ODBC DATABASE DBMS Abbildung III-31: JDBC Typ 1-Treiber (JDBC-ODBC-Bridge) Die Funktion dieser Bridge ist die Umsetzung von JDBC-Aufrufen in ODBC-Aufrufe. Da dieser Treibertyp aus einem in Java geschriebenen JDBC-Teil und einem ODBC-Teil – zumeist in C implementiert – besteht, ist er plattformabhängig. Problematisch ist auch, daß der entsprechende ODBC-Treiber auf jedem Client-System installiert und konfiguriert werden muß. Das führt auch dazu, daß solche Typ 1-Treiber auch nicht von JavaApplets in einem Browser zu gebrauchen sind, da Applets keinen nativen Code laden können. Von daher kann dieser Treibertyp für eine portable Anwendung nur eine Übergangslösung darstellen. Typ 2: JDBC-native API-Bridge Ein Typ 2-Treiber (ebenfalls eine Bridge) besteht aus einem datenbankabhängigen Treiber und einer JDBC-Schicht. Der Treiber konvertiert – wie auch schon bei der JDBC-ODBC-Bridge – Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 79 JDBC-Aufrufe in Aufrufe für die API der Datenbank (z.B. Oracle, Informix, ...). Auch hier wird nativer, clientseitiger Code benötigt, der von Applets nicht geladen werden kann. Java-Applikation JDBC API JDBC-Treibermanager JDBC Treiber API CLIENT JDBC-Treiber für DBMS A (Java) Treiber für DBMS A (nativ) Protokoll der Datenbank DBMS DATABASE Abbildung III-32: JDBC Typ 2-Treiber (JDBC-native API-Bridge) Typ 3: Nativer Protokolltreiber (100% Java) Dieser Treibertyp ist in 100% Java implementiert und verwendet zum Datenbankzugriff das Netzwerkprotokoll der Datenbank. Der Treiber besteht aus einem JDBC-Client und einem JDBCServer, wobei JDBC-Aufrufe in ein natives (datenbankabhängiges) Netzwerkprotokoll konvertiert werden und zur Datenbank übertragen werden. Java-Applet/Applikation JDBC API CLIENT JDBC-Treibermanager JDBC Treiber API Nativer Protokolltreiber Protokoll der Datenbank DATABASE DBMS A Abbildung III-33: JDBC Typ 3-Treiber (Nativer Protokolltreiber) Hauptvorteil dieses Treibers ist, daß keine zusätzliche Client-Software vorhanden sein muß. Die Datenbank muß allerdings auf demselben Rechner wie der Webserver (von dem das Applet geladen wurde) liegen. Ein Typ 3-Treiber ist eine gute Lösung für ein Intranet, um über JavaApplets direkt auf eine Datenbank zuzugreifen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 80 Typ 4: Netzwerktreiber (100% Java) Auch dieser Treiber besteht zu 100% aus Java und ist komplett in den Client integriert. Hier wird die Verbindung zum Server über Java's Standard-Protokolle aufgebaut. Die MiddlewareKomponente übersetzt die Befehle in das Netzwerkprotokoll der Datenbank. Java-Applet/Applikation JDBC API JDBC-Treibermanager CLIENT JDBC Treiber API Netzwerktreiber RMI Middleware SERVER Netzwerkprotokoll der DB DATABASE DBMS A DBMS B DBMS C Abbildung III-34: JDBC Typ 4-Treiber (Netzwerktreiber) Der Unterschied zum Typ 3-Treiber ist, daß hier nicht direkt auf die Datenbank zugegriffen werden kann, sondern eine Middleware benötigt wird (3-Tier-Architektur). Die Datenbank muß sich dabei nicht auf dem Middleware-Rechner befinden. 6.5 Überblick über die wichtigsten Klassen und Schnittstellen der JDBC-API Die wichtigsten Schnittstellen und Klassen sind DriverManager, Connection, Statement und ResultSet. Interessant sind auch zwei Unterklassen von Statement: PreparedStatement und CallableStatement. Für die Abfrage von Metadaten ist die Schnittstelle ResultSetMetaData wichtig. Alle genannten Schnittstellen sind dem Namensraum java.sql.* zugeordnet. Die Klasse XXXDriver repräsentiert einen datenbankspezifischen Treiber, ist also kein Bestandteil der JDBCAPI. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity Es müssen natürlich auch noch die StatementUnterklassen vom XXXDriver implementiert werden 81 <<interface>> DatabaseMetaData <<interface>> Driver XXXDriver load Driver <<interface>> ResultSet executeQuery getMoreResults <<interface>> Statement DriverManager createStatement getConnection executeQuery getXXX <<interface>> PreparedStatement prepareStatement <<interface>> Connection setXXX prepareCall Data types: Date, Time, DateStamp, ... <<interface>> CallableStatement Abbildung III-35: JDBC-API In den folgenden Abschnitten wird die Funktion der abgebildeten Klassen und Schnittstellen näher erklärt. DriverManager Mit dem DriverManager werden Treiber-Klassen geladen und Datenbankverbindungen aufgebaut. Driver Die Driver-Schnittstelle muß von jedem JDBC-Treiber implementiert werden und deklariert entsprechende Standard-Methoden. XXXDriver Datenbankspezifischer Treiber, welcher die eigentliche Funktionalität implementiert. Ein solcher JDBC-Treiber (z.B. OracleDriver) wird für eine bestimmte Datenbank geschrieben und implementiert zumindest die Schnittstellen Driver, ResultSetMetaData und DatabaseMetaData vollständig. Es müssen auch die Interfaces ResultSet, Statement, PreparedStatement, CallableStatement und Connection implementiert werden – allerdings nicht unbedingt vollständig, da hier einige optionale Methoden deklariert sind. Für Informationen zu TreiberDetails ist [Sun 99e] empfehlenswert. In diesem Dokument für Treiber-EntwicklerInnen sind die zu implementierenden Schnittstellen und Methoden sehr ausführlich beschrieben. Connection Die Connection-Schnittstelle repräsentiert eine Verbindung zu einer bestimmten Datenbank. Statement Ein Statement-Interface dient dazu, statische SQL-Befehle auszuführen. Voraussetzung ist das Vorhandensein einer Datenbank-Verbindung (repräsentiert durch Connection). PreparedStatement Das PreparedStatement wird zur Ausführung von vorübersetzten SQL-Befehlen verwendet. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 82 CallableStatement Mit dem CallableStatement können Stored Procedures der Datenbank ausgeführt werden. ResultSet Das ResultSet repräsentiert die Ergebnismenge eines SQL-Befehls (Statement). Das ResultSet ist Tupel-basiert, speichert also Ergebniszeilen ab. ResultSetMetaData Über ResultSetMetaData kann auf Datenbank-Metadaten zugegriffen werden. 6.6 Programmieren mit JDBC Die Programmierung von kleineren JDBC-Anwendungen ist relativ unkompliziert. Allerdings existieren eine Vielzahl von komplexen, erweiterten Features, die für kleinere Anwendungen nicht benötigt werden, mit denen man sich aber bei größeren Datenbank-Anwendungen vertraut machen sollte. Im folgenden wird lediglich beschrieben, wie eine Verbindung zu einer Datenbank aufgebaut wird und wie SQL-Kommandos gegen die Datenbank geschickt werden. Laden des Treibers Da Java in der Lage ist, zur Laufzeit dynamisch Klassen nachzuladen, ist das Laden des Treibers einfach, zumindest wenn man einen solchen besitzt und auch im richtigen Verzeichnis installiert hat. Um den Thin-Treiber (Typ 4) von Oracle zu laden ist folgender Code nötig: Class.forName("jdbc:oracle:thin"); Die Syntax ist dabei stets jdbc:<subprotocol>:<subname>. Gewöhnlich wird der zu benutzende Klassenname in der Dokumentation des Herstellers erwähnt. Normalerweise wird nach dem Laden des Treibers die Klasse Driver instanziert, die sich mit DriverManager.registerDriver(driver) beim Treibermanager registriert. In Einzelfällen muß die Registrierung von Hand vorgenommen werden: DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Codebeispiel III-19: Laden eines JDBC-Treibers Jetzt ist es möglich, eine Verbindung zum DBMS aufzubauen.6 Verbindungsaufbau zur Datenbank Der zweite Schritt ist der Aufbau der Verbindung zur Datenbank (bzw. zur entsprechenden Middleware). Dazu muß man den URL (uniform resource locator) des betreffenden Rechners wissen. Nun kann die Verbindung aufgebaut werden. url="jdbc:oracle:thin:@d1sun137:5521:soll" Connection conn=DriverManager.getConnection(url, login, password); Codebeispiel III-20: Verbindungsaufbau zur Datenbank mit JDBC 6 Es ist möglich, mehrere (Typ 3-)Treiber für verschiedene Datenbanken parallel beim Treibermanager zu registrieren und damit verschiedene Datenbanken zu verwalten. Benutzt man eine Middleware, so muß nur ein JDBC-Treiber geladen werden. Die Middleware ist dann in der Lage, verschiedene Datenbanken gleichzeitig anzusprechen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 83 Wenn einer der registrierten Treiber den URL kennt, baut dieser Treiber die Verbindung zum DBMS auf. Anfragen gegen die Datenbank Über die nun bestehende Verbindung zur Datenbank können Anfragen gegen die Datenbank gestellt werden. Dazu wird ein Statement-Objekt erzeugt, das die entsprechende SQL-Anfrage enthält. Anschließend muß die gewünschte Anfrage ausgeführt werden. Das Ergebnis wird von JDBC über ein ResultSet-Objekt zurückgegeben. Auf dieses ResultSet (hier: rs) kann nun mit rs.getXXX zugegriffen werden (kann nahezu jeder Java-Datentyp sein). Zum jeweils nächsten Datensatz kann mit rs.next gesprungen werden. Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select name, price from coffee"); Codebeispiel III-21: Erzeugung von Statement und ResultSet Das Auslesen der Anfrageergebnisse kann also z.B. so erfolgen: while(rs.next()) { String name = rs.getString("Bezeichnung"); float price = rs.getFloat("Preis für 1 kg"); System.out.println(name, " ", price); } Codebeispiel III-22: Auslesen der Anfrageergebnisse Es muß also das ResultSet Tupel für Tupel durchgegangen und der entsprechende Attributwert ausgelesen werden. Die Methode next bewegt den sogenannten Cursor in die nächste Zeile. Normalerweise werden die offenen Verbindungen danach geschlossen: rs.close(); conn.close(); Codebeispiel III-23: Datenbankzugriff mit JDBC Abschließend ist noch zu sagen, daß die SQL-Datentypen nicht immer mit den Java-Datentypen übereinstimmen. Im Anhang habe ich deshalb eine Tabelle beigefügt, die die Zuordnung der entsprechenden Datentypen zeigt.7 Seit der Version 2.0 des JDBC API ist es möglich, den Cursor rückwärts oder zu bestimmten Positionen im ResultSet zu bewegen, und zwar sowohl relativ als auch absolut. Sequenzdiagramm einer typischen Anfrage gegen die Datenbank Dieses Sequenzdiagramm zeigt den zeitlichen Ablauf des weiter oben beschriebenen Programms. Die durchgezogenen Pfeile symbolisieren dabei Funktionsaufrufe (die leeren Klammern sind nur Kosmetik, hier werden natürlich diverse Parameter übergeben), die gestrichelten Pfeile sind Rückgabewerte. 7 Nach der Initialisierung befindet sich der Cursor über der ersten Zeile; d.h., daß mit dem ersten next-Aufruf zum ersten Tupel der Rückgabemenge gesprungen wird. Ist das letzte Tupel erreicht, gibt next den Wert false zurück. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity :Client :DriverManager 84 conn:Connection stmt:Statement rs:ResultSet registerDriver() getConnection() conn createStatement() stmt executeQuery() rs *next() *getString() name *getFloat() price close() close() Abbildung III-36: Sequenzdiagramm einer SQL-Anfrage 6.7 Transaktionen und Stored Procedures JDBC Transaktionen Nach dem Verbindungsaufbau zur Datenbank ist der Transaktionsstatus automatisch im autocommit-Modus. Das heißt, daß nach der Ausführung eines Statements automatisch die Änderungen durch ein commit festgeschrieben werden. Um innerhalb einer Transaktion mehrere Statements auszuführen, muß also das autocommit abgeschalten und von Hand ein commit/rollback durchgeführt werden. Stored Procedures Mit JDBC können natürlich auch gespeicherte Prozeduren aufgerufen werden. Problematisch ist natürlich, daß diese stored procedures oft datenbankspezifisch sind und deshalb im Rahmen dieser Diplomarbeit nicht verwendet werden. 6.8 Metadaten Es kann schwierig sein, im Rahmen eines datenbankunabhängigen Web-Informationssystems Informationen über die Datenbank selbst zu erhalten. Es existiert kein SQL-Standard, um z.B. den Namen einer Tabelle zu ermitteln. Die Informationen über die Relationen und deren Attribute sind meist in speziellen Tabellen abgespeichert, deren Namen sich von DBMS zu DBMS zum Teil stark unterscheiden. Die folgende Abbildung bezieht sich auf die Oracle-Datenbank. Die Daten auf der Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 85 linken Seite sind die Tabellen eines bestimmten Benutzers, die Metadaten auf der rechten Seite verwendet Oracle, um z.B. Benutzerdaten zu verwalten. DATEN METADATEN (User: baier) COFFEES USER COF_NAME SUP_ID PRICE SALES TOTAL ---------------------------------... USER# NAME TYPE PASSWORD ... ---------------------------------0 sys 1 skdajfiuasd 1 public 0 isnull=true ... 15 baier 1 jfskfjsklkd CHARTDATA ALL_CATALOG PRODUCT_NAME TURNOVER_JANUARY ... ---------------------------------... OWNER TABLE_NAME TABLE_TYPE ---------------------------------baier coffees table baier testtable table ... sys table_privileges view ... Abbildung III-37: Metadaten einer Datenbank Zum Glück bietet JDBC die Möglichkeit, derartige Metadaten einfach und bequem zu erhalten. Es existiert ein Interface DatabaseMetaData, welches 133 (!) Methoden deklariert. Der JDBCTreiberhersteller muß also eine Klasse schreiben, die alle diese Methoden implementiert. Ist diese Klasse vorhanden, so läßt sich einfach ein Objekt dieser Klasse instanzieren und die gewünschte Methode aufrufen: String url = "jdbc:oracle:thin:@d1sun137:5521:soll"; Connection conn = DriverManager.getConnection (url, login, password); DatebaseMetaData metadata = conn.getMetaData(); String version = metadata.getDatabaseProductVersion(); Codebeispiel III-24: Metadaten-Abfrage mit JDBC Das ist natürlich nicht immer so einfach wie hier. Die Methode getTables gibt zum Beispiel die Namen von sämtlichen gespeicherten Tabellen aus; das heißt, daß diese Daten mit dem zuvor bereits besprochenen ResultSet Zeile für Zeile ausgelesen werden müssen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil III: 6. JDBC – Java Database Connectivity 86 Interessant sind auch die Methoden der Schnittstelle ResultSetMetaData. Diese Schnittstelle ermöglicht es, auf ResultSet-spezifische Ergebnisse zuzugreifen. Beispiele für Methoden dieser Klasse sind: • getColumnCount (wie viele Rückgabespalten gibt es) • getColumnName(n) (wie ist der Name der n-ten Spalte) • getTables(...) (Zugriff auf Tabellen, z.B. eines bestimmten Benutzers) Problematisch ist leider, daß man sich nicht immer darauf verlassen kann, daß auch wirklich alle Methoden vom Treiber implementiert sind. Im Zweifelsfall sollte man sich die TreiberDokumentation genau ansehen und auf zu spezielle Methoden verzichten. Auf Sun's JDBCWebsite findet man nähere Informationen darüber, welche Methoden unbedingt und welche nur optional vom Treiber zu implementieren sind. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 1. Analyse der Anforderungen 87 Anforderungsanalyse und Systemspezifikation Teil IV: 1 Analyse der Anforderungen Hier folgt nun nochmals eine kurze Liste mit den Anforderungen, die vom Prototypen des QueryTools zu implementieren sind. # Requirement-Bezeichnung A1 Eingabeschnittstelle für die Formulierung von Datenbank-Queries (Client) A2 Umsetzung der Eingabe in XML und Transport zum Server (Client) A3 Auswertung der XML-Queries und Ausführung über JDBC (Server) A4 Umsetzung der Anfrageergebnisse nach XML mit serverseitiger Java-Technologie und Transport zum Client (Server) A5 Visualisierung sowohl textueller als auch grafischer Information auf der Basis des übermittelten XML-Dokumentes mit JavaBeans (Client) A6 Konfigurierbarkeit der Ausgabeschnittstelle (Client) Tabelle IV-1: Analyse der Anforderungen A1: Eingabeschnittstelle (Client) Die Eingabeschnittstelle für die Datenbank-Queries soll leicht und intuitiv zu bedienen sein. Wenn sich ein Benutzer bei der Datenbank angemeldet hat, dann sollte das Query-Tool Informationen über die vorhandenen Tabellen des Benutzers am Bildschirm darstellen (dazu werden JDBCMetadaten verwendet). Aus diesen Tabellen kann eine Tabelle ausgewählt werden, worauf die entsprechenden Spaltennamen angezeigt werden. Es können nun die verschiedenen Spalten angeklickt werden (z.B. mit Checkboxes), worauf die eigentliche Datenbankanfrage startet. A2: Umsetzung der Eingabe in XML und Transport zum Server (Client) Die Eingabe des Benutzers wird nun nach XML umgesetzt und als Argument übergeben. A3: Auswertung der Argumente und Ausführung der Queries (Server) Die Anfragen, welche über die Eingabeschnittstelle (A1) eingegeben und über A2 an den Server übergeben werden, sollen nun auch ausgeführt werden. Dazu wird natürlich JDBC verwendet. A4: Umsetzung der Anfrageergebnisse in XML (Server) In einer relationalen Datenbank werden die Ergebnisse als Tabellen zurückgegeben. Aus einem solchen Ergebnis soll nun ein gültiges XML-Dokument generiert werden, damit die Daten von entsprechenden XML-fähigen Komponenten eingelesen werden können. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 1. Analyse der Anforderungen 88 A5: Visualisierung der Abfrageergebnisse (Client) Die Abfrageergebnisse sollen nun nicht nur als XML-Dokument auf dem Bildschirm erscheinen, sondern mittels JavaBeans angezeigt werden. Denkbar ist beispielsweise eine Bean, welche das XML-Dokument als Tabelle anzeigt. Weitaus interessanter ist es natürlich, ein solches XMLDokument grafisch darzustellen, z.B. als Balken- oder Tortendiagramm, oder sogar mit einer anwendungsdefinierten Grafik. A6: Konfigurierbarkeit der Ausgabeschnittstelle (Client) In A5 wurde bereits die Visualisierung der Abfrageergebnisse mit JavaBeans beschrieben. Die Beans sollten nun den Bedürfnissen des Benutzers angepaßt werden (können). Das JavaBeans Komponentenmodell bietet hierfür spezielle Mechanismen (vgl. das Kapitel über JavaBeans), die eine individuelle Konfiguration ermöglichen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 2. Analyse der Webarchitekturen 2 Analyse 89 der Webarchitekturen Dieses Kapitel rekapituliert die Ergebnisse der Untersuchungen verschiedener Architekturen (EJB, JSP, Servlets, ..) und versucht Vor- und Nachteile aufzuzeigen. Es geht dabei nicht um eine prinzipielle Bewertung der einzelnen Architekturen sondern lediglich um die Eignung für den Prototypen des Query-Tools. 2.1 Systemanforderungen In Teil II dieser Diplomarbeit wurden verschiedene Architekturen für ein Web-Informationssystem vorgestellt und beschrieben. Web-Informationssysteme entstehen jedoch nicht "auf der grünen Wiese", sondern müssen sich in bestehende Strukturen einfügen. In der folgenden Tabelle werden die Systemanforderungen kurz aufgezählt. # Komponente Systemanforderung SA1 Entwicklungsplattform Windows NT 4.0 (Service Pack 3) SA2 Entwicklungsumgebung JDeveloper 2.0 mit Java 1.1.7 SA3 Applikationsserver Oracle Application Server (OAS) 4.0.7 SA4 Datenbank Oracle 7.3.4 Tabelle IV-2: Systemanforderungen Diese Anforderungen führen natürlich zu bestimmten Beschränkungen. So ist z.B. der OAS in der Version 4.0.7 nicht vollständig EJB-konform. 2.2 Java Server Pages (JSP) und EJBs (3- bzw. logische 4-Tier-Architektur) Java Server Pages (JSP) sind eine Spezifikation von Sun (eine Erweiterung der Servlet-API), die als Antwort zu Microsoft's Active Server Pages (ASP) gedacht ist. JSP funktionieren wie ASP: auf einem Server sind verschiedene HTML-Seiten (auch XML ist möglich) abgelegt, deren relevanter Inhalt dynamisch aus Datenbank-Anfragen generiert wird. Bei komplexerer Business Logic ist eine Einbindung von Enterprise JavaBeans möglich. Die über JSP generierte HTML-Seite wird über das Netz übertragen und in einem Browser angezeigt. EJB Server JSP Server JSP Directory WebBrowser HTTP EJB Container RMI JDBC EJB EJB DB EJB Abbildung IV-1: Java Server Pages und Enterprise JavaBeans Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 2. Analyse der Webarchitekturen 90 Dieser Ansatz ist leider für ein Query-Tool, wie es in dieser Arbeit beschrieben wird, nur eingeschränkt geeignet. Erstens kann man hier nicht von einer Komponentenarchitektur sprechen (EJBs auf Serverseite sind möglich, aber keine clientseitigen JavaBeans). Zweitens ist die Verwendung von XML problematisch, da auch der bislang einzige XML-fähige Browser (Internet Explorer 5.0) gewisse Einschränkungen hat (z.B. bei Verwendung von XSL). Und drittens läßt sich die Ausgabeschnittstelle nicht konfigurieren (XML-Files werden angezeigt; die Daten können jedoch nicht benutzerdefiniert visualisiert werden, z.B. als Diagramm). Vorteilhaft ist jedoch die Möglichkeit der Einbindung von Enterprise JavaBeans. So kann man die Java Server Pages quasi als Frontend für die Enterprise Beans verwenden, was gerade dann praktisch ist, wenn zwar umfangreiche und komplexe Business Logic vorhanden ist, die Abfrageergebnisse jedoch nur in einem Web-Browser in Form von HTML/XML-Dokumenten angezeigt werden sollen. Vorteile • einfache Handhabung, schnelle Ergebnisse • optimale Lösung bei einer reinen XML-Ausgabe im Web-Browser • JSP als elegantes Frontend zu Enterprise JavaBeans • Client/Server-Kommunikation über HTTP • kein Java-Code (Ladezeiten) auf der Clientseite Nachteile • Für ein Query-Tool nur eingeschränkt geeignet • Clientseitige Konfigurierbarkeit ist nicht möglich • Keine direkte Auswertung der Daten (also externe Analysetools notwendig) • Erhöhung der Komplexität • Keine durchgängige Komponentenarchitektur • Anzeige von XML im Web-Browser nur eingeschränkt möglich • bei Verwendung von HTML Weiterverarbeitung der Informationen problematisch Fazit Für das Query-Tool dieser Diplomarbeit sind JSP nicht besonders geeignet. Die Verwendung von JSP als EJB-Frontend ist zwar eine sehr praktische Lösung für viele Anwendungen, aber die Aufbereitung der XML-Daten muß dann von externen Applikationen vorgenommen werden. Außerdem liegt der Sinn eines Query-Tools ja gerade darin, bequem Datenbankanfragen "zusammenzuklicken" und das Ergebnis der Anfrage individuell und problembezogen ausgewertet zu bekommen. 2.3 Enterprise JavaBeans (3-Tier-Architektur) Dies ist eine typische 3-Tier-Architektur mit den Enterprise Beans als Middletier. Der Client kann dabei entweder eine Java-Applikation oder ein Java-Applet sein. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 2. Analyse der Webarchitekturen 91 EJB Server EJB Container RMI Client JDBC DB EJB EJB EJB Abbildung IV-2: 3-Tier-Architektur mit Enterprise JavaBeans Will man Enterprise JavaBeans einsetzen, benötigt man einen EJB-Server, in dessen Container die Beans installiert werden. Viele EJB-Server sind Erweiterungen bestehender Applikationsserver. Ein Beispiel hierfür ist Oracle's Applikationsserver. Dieser Server bietet zahlreiche Möglichkeiten, serverseitige Anwendungen zu entwickeln und auszuführen. Das hat natürlich seinen Preis – die Lizenzgebühren sind hier sehr hoch. Alternativ gibt es freie EJB-Server (EJBHome, XS), die zum Teil sogar im Sourcecode vorliegen (ejboss). Stabilität und Zuverlässigkeit lassen hier allerdings zu wünschen übrig. Folgende Tabelle gibt einen Überblick über einen Teil der verfügbaren EJBServer: Hersteller Name kostenlos erhältlich Sourcecode verfügbar reiner EJBServer (nur EJBs möglich) Stabilität und Zuverlässi gkeit Unterstützung Javader EJB Version Spezifikation (1.0) Oracle OAS 4.0.7 nein nein nein hoch teilweise 1.1.6 Persistence PowerTier 5 nein nein ja hoch vollständig 2 BEA WebLogic Server 4.0 nein nein nein hoch vollständig 2 Iona EJBHome 0.5.1 ja nein ja mittel vollständig 2 ejboss.org ejboss 0.5 ja nein ja mittel vollständig 2 Tabelle IV-3: Verfügbare EJB-Server Die prinzipiellen Unterschiede dieser EJB-Server liegen in der Unterstützung der EJBSpezifikation, der Java-Version und dem Preis. Preislich gibt es zwar große Unterschiede zwischen den kommerziellen Servern, aber eines trifft auf alle kommerziellen EJB-Server zu: sie sind nicht billig. Die kostenlosen EJB-Server sind oft relativ stabil und bieten eine erstaunlich vollständige Unterstützung der Spezifikation. Leider sind alle freien Server noch in einem relativ frühen Entwicklungsstadium, d.h. es kann problematisch sein, diese Server als Basis für ein kommerzielles Produkt zu nehmen. In den beiden folgenden Abschnitten werden nur die konzeptuellen Nachteile bei der Verwendung von Enterprise Beans aufgezählt, d.h. Stabilität und Spezifikationsunterstützung soll hier kein KOKriterium sein. Vorteile der EJB-Architektur • Komponentenbasierte Softwareentwicklung • Plattform- und serverunabhängige Komponentenarchitektur • Hohe Skalierbarkeit • Technologievorsprung (Enterprise Beans als Schlagwort) Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 2. Analyse der Webarchitekturen 92 Nachteile der EJB-Architektur • Theorie und Praxis der Portierbarkeit auf andere Server und Plattformen • Hohe Lizenzkosten für EJB-Server bzw. ungenügende Stabilität der freien Server • Die Vorteile der EJB-Architektur (z.B. Transaktionen) werden bei einem einfachen QueryTool nicht ausgenutzt • Paradigmen und Entwurfsmuster für EJBs sind noch nicht gut verstanden • Designfehler führen zu einer hohen Serverbelastung Fazit Für die vorliegende Diplomarbeit sind Enterprise Beans ein interessanter Ansatz. Es stellt sich allerdings die Frage, ob die Komplexität bei der Bean-Entwicklung und insbesondere die Lizenzkosten für die EJB-Server für ein einfaches Query-Tool angemessen sind. Andererseits sind Komponentenarchitekturen heutzutage ein modernes Schlagwort und ein vollständig komponentenorientiertes Modell (EJBs und JavaBeans) läßt sich besser vermarkten, da man so einen Technologievorsprung für sich in Anspruch nehmen kann. Eine Weiterentwicklung des Prototyps läßt sich mit EJBs einfacher gestalten und ein (weitgehend) unproblematischer Wechsel zu einem anderen (günstigeren, stabileren, ...) Applikationsserver erlaubt eine Integration des Query-Tools in bestehende Web-Infrastrukturen. Eine Firma, die ohnehin Lizenzkosten für einen Applikationsserver zahlt, kann die EJBs bequem einbinden und profitiert dann von den Vorteilen der EJB-Architektur. 2.4 Java-Applikation (3-Tier-Architektur) Diese Lösung unterscheidet sich deutlich von den anderen Lösungen in diesem Kapitel. Der Hauptunterschied ist, daß hier auf der Serverseite kein Applikationsserver verwendet wird. Größter Vorteil ist natürlich die Einsparung der Lizengebühren für einen Server. Der Client kann sowohl als Java-Applet oder als Java-Applikation entwickelt werden. Client RMI JDBC ServerApplikation DB Abbildung IV-3: 3-Tier-Architektur mit Enterprise JavaBeans Auf der Serverseite steht eine sehr komplexe Anwendung, die schwieriger zu warten ist als z.B. eine Lösung mit Enterprise JavaBeans. Sollen Änderungen und Erweiterungen vorgenommen werden, ist dies mit einem relativ großen Aufwand verbunden. Die Architektur dieses Systems hat einen weiteren Schwachpunkt: für das Internet ist sie weniger geeignet. Neben allgemeinen Sicherheitsbedenken im Internet ist auch eine reine Intranetlösung unter Umständen problematisch. Wenn sehr viele Datenbankanfragen gestellt werden, leidet die Performanz erheblich. Bei EJBs kümmert sich der Server um eine möglichst hohe Leistung; z.B. entscheidet er, wieviele Instanzen einer zustandslosen Session-Bean nötig sind, um die aktuelle Zahl der Client-Anfragen zu bearbeiten. Die Server-Applikation müßte für realistische Anwendungen (z.B. in einem Firmennetzwerk mit zahlreichen Datenbankanfragen) im Hinblick auf eine möglichst gute Skalierbarkeit entwickelt werden. Hilfreich sind dabei sicherlich die Multithreading-Fähigkeiten von Java. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 2. Analyse der Webarchitekturen 93 Vorteile • Keine Kosten für einen Webserver • Unproblematische Installation Nachteile • höhere Komplexität • geringere Performanz • schlechte Skalierbarkeit Fazit Diese Architektur erscheint für den Prototypen des Query-Tools am besten geeignet. Es muß jedoch angemerkt werden, daß in einer prototypischen Implementierung Sicherheits- und Skalierbarkeitsaspekte in den Hintergrund treten. Bei einer professionellen Weiterentwicklung des Prototypen ist die Einbettung in eine Architektur mit integrierter Skalierbarkeit (z.B. Enterprise JavaBeans) ratsam. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 3. Analyse existierender Benutzeroberflächen 94 3 Analyse existierender Benutzeroberflächen In diesem Kapitel werden die Benutzeroberflächen von drei kommerziellen Programmen mit Query & Report-Funktionalität untersucht. Anzumerken ist, daß diese Softwarepakete einen sehr großen Funktionsumfang bieten und die Query & Report-Funktionalität oft nur ein zusätzliches Feature darstellt. Es geht in dieser Analyse jedoch lediglich um die Visualisierung von Tabellen und Views, um die Generierung von Datenbankanfragen und um die Weiterverarbeitung der Anfrageergebnisse. Diese Untersuchung findet vor dem Hintergrund einer Realisierung mit den Swing-Klassen von Java statt, mit denen sich beliebige professionelle GUIs problemlos programmieren (oder visuell zusammensetzen) lassen. 3.1 Web-basiert: Oracle WebDB WebDB ist ein Tool für die Administration von Oracle-Datenbanken über das Internet. Die Oberfläche ist dementsprechend HTML-basiert und bietet so ein einheitliches Look & Feel. Auf Java-Applets wurde verzichtet. Zur Bedienung von WebDB muß lediglich eine Web-Adresse eingegeben werden. Nach der Benutzername/Paßwort-Verifikation ist eine bequeme Administration und/oder Benutzung der entsprechenden Datenbank möglich. Folgende Abbildung zeigt sämtliche Tabellen des Users BAIER. Abbildung IV-4: Oracle WebDB: Anzeige der Tabellen des Benutzers BAIER Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 3. Analyse existierender Benutzeroberflächen 95 Die Toolbar am unteren Rand der HTML-Seite bietet neben Funktionen zur Administration einer Oracle-Datenbank auch die Möglichkeit, Reports und Charts zu erstellen. Für schnelle Datenbankanfragen gibt es ein spezielles Formular: Abbildung IV-5: Oracle WebDB: Formular für DB-Anfragen WebDB bietet auch umfangreiche Query- und Reportfunktionen an. Bei der Erstellung eines Reports hat man die Möglichkeit, entweder einen Report-Wizard zu verwenden oder manuell die entsprechenden SQL-Befehle einzugeben. Dabei fallen zwei Punkte auf: zum einen hat man sehr weitreichende Möglichkeiten der Gestaltung von Reports – gerade im Hinblick auf die Datenbankanfrage – und zum anderen ist die Bedienung relativ umständlich, d.h. sie ist wenig intuitiv und verlangt einige Einarbeitungszeit. Der Report-Wizard ermöglicht eine relativ bequeme Erstellung eines eigenen Reports. Dabei werden im ersten Schritt die Tabellen und Sichten des betreffenden Benutzers angezeigt, aus denen eine Auswahl getroffen werden kann: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 3. Analyse existierender Benutzeroberflächen 96 Abbildung IV-6: Oracle WebDB: Dialog "Tables and Views" Wurde mehr als eine Tabelle ausgewählt, so müssen im folgenden Dialogschritt die JOINBedingungen angegeben werden: Abbildung IV-7: Oracle WebDB: Dialog "Join Conditions" Anschließend kann man aus einer Liste die gewünschten Spalten auswählen. Die ausgewählten Spalten können nun einzeln mit Bedingungen (NOT NULL, >= 1000, ...) versehen werden. Danach werden nochmals sämtliche Spalten angezeigt. Hier ist eine Angabe der Formatierung des Reports für jede Spalte möglich (z.B. Ausrichtung links oder rechts). Es folgt ein Dialog, in dem nähere Daten zum gewünschten Layout eingegeben werden können, z.B. die Farbe einer Spalte oder das Ausgabeformat (HTML, ASCII, Excel). Unangenehm fällt hier auf, daß die Erstellung von Queries und Reports nicht gerade benutzerfreundlich gelöst wurde. Unerfahrene BenutzerInnen könnten hier vermutlich keinen Report "auf die Schnelle" entwickeln. Man muß dazu allerdings auch erwähnen, daß WebDB primär als Adminstrationstool und nicht als Query-und-Report-Tool gedacht ist. Interessant ist, daß die erstellten Reports in lediglich drei Formaten ausgegeben werden können: HTML, ASCII und Microsoft Excel. HTML eignet sich nur zur formatierten Darstellung auf dem Bildschirm, kann also nicht direkt weiterverarbeitet werden. Lediglich die Wahl von Microsoft Excel bietet die Möglichkeit einer sinnvollen Weiterverarbeitung der Daten, z.B. zur Erstellung von Charts oder zum Speichern in einer lokalen Datenbank. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 3. Analyse existierender Benutzeroberflächen 97 3.2 Benutzerfreundlich: Microsoft Access MS Access ist als Bestandteil von Microsoft's Office-Paket eine weitverbreitete Datenbank für den (semi)-professionellen Einsatz. Gerade deshalb ist eine Untersuchung des GUI interessant, da hier ausdrücklich BenutzerInnen angesprochen werden sollen, welche die Datenbank lediglich zur Speicherung von wenigen, kleinen Tabellen (CD-Sammlung, Verwaltung von Kundendaten bei Kleinfirmen, ..) verwenden. Die folgende Abbildung zeigt die Beispieldatenbank NORDWIND in einem eigenen Fenster: Abbildung IV-8: Microsoft Access: Anzeige aller Tabellen einer Datenbank Dieses Frame verwendet Registerkarten, um unterschiedliche Sichten auf die Datenbank zu bieten. Es gibt je eine Registerkarte für Tabellen, Abfragen, Formulare, Berichte, Makros und Module. Die Tabellen-Registerkarte zeigt eine Liste mit den verfügbaren Tabellen der Datenbank. Ein Doppelklick auf eine Tabelle führt das SQL-Kommando SELECT * FROM ... aus. Es können an dieser Stelle auch neue Tabellen kreiert und bestehende Tabellen geändert werden. Das Erstellen von Abfragen geschieht entweder über die manuelle Eingabe von SQL-Befehlen oder über einen speziellen Dialog: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 3. Analyse existierender Benutzeroberflächen 98 Abbildung IV-9: Microsoft Access: GUI zur Erstellung einer Abfrage In der oberen Hälfte des Fensters sind die ausgewählten Tabellen zu sehen. Join-Bedingungen (in der Abbildung: Bestelldetails.Artikel-Nr = Artikel.Artikel-Nr) sind übersichtlich dargestellt. In der unteren Fensterhälfte können über Drag-Listen die Attribute der angezeigten Tabellen einzeln angewählt werden. Der SQL-Befehl ORDER BY ist in der Zeile "Sortierung" ins GUI integriert. Zusätzliche Kriterien bzw. einschränkende Bedingungen können separat angegeben werden. Den SQL-Code wird automatisch generiert und kann nachträglich manuell bearbeitet werden. Die Datenbankanfragen können nun in Berichte oder Formulare "eingebaut" werden. Hier existieren zahlreiche Vorlagen und Beispiele, so daß die Erstellung professioneller Berichte kein Problem darstellt. Als Fazit läßt sich sagen, daß auch unerfahrene BenutzerInnen mit MS Access schnell Datenbankanfragen zusammenstellen können. SQL-Erfahrung ist dabei nicht nötig – die Codegenerierung läuft völlig transparent im Hintergrund ab. Für komplexere Datenbankanfragen kann SQL-Code direkt eingegeben werden. Leider wird hier keine weitere Unterstützung geboten, d.h. der SQL-Code wird unformatiert und schwer lesbar in einem separaten Textfenster angezeigt. Bei einer manuellen Änderung des SQL-Codes hat die GUI Probleme, die Änderungen zu übernehmen. Die Anfrageergebnisse können in andere Datenbanken exportiert oder in HTML-Tabellen umgewandelt werden. Eine weitergehende Nutzung der Daten ist nur über die Verwendung der Tabellenkalkulation MS Excel möglich (natürlich bietet auch dieses Produkt Exportmöglichkeiten). Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 4. Use-Cases 99 4 Use-Cases Grundlage für die Erstellung dieser Use-Cases (Anwendungsfälle) sind die gestellten Anforderungen, die im vorigen Kapitel näher beschrieben wurden. Generate Query <<include>> Input/Edit Query Login <<extend>> Manage Query User Input Query und Edit Query wurden zusammengefaßt, da in der derzeitigen Implementierung eine Unterscheidung nicht relevant ist. <<extend>> Manage Query enthält Funktionen wie Load Query, Save Query, Execute Query. Configure Chart Create Chart <<include>> Map to Chart Abbildung IV-10: Use-Case-Diagramm Die Anwendungsfälle sind also "Generate Query", "Input/Edit Query", "Login", "Manage Query", "Configure Chart", "Create Chart" und "Map to Chart". Diese Use-Cases lassen sich grob in zwei Gruppen unterteilen: Query-Anwendungsfälle und Report-Anwendungsfälle. Zu "Report" zählen die "XXX Chart"-Anwendungsfälle, die übrigen Use-Cases können unter "Query" eingeordnet werden. Login (Query) Es wird hierbei lediglich ein Dialogfenster angezeigt, in das Username, Paßwort, Datenbank-URL, JDBC-Treibername und Server-URL eingegeben werden können. Anzumerken ist hier noch, daß die Daten zum Einloggen in die Datenbank nicht auf dem (zustandslosen) Server gespeichert werden, sondern vielmehr bei jeder Datenbank-Anfrage mit übergeben werden. Input/Edit Query (Query) Hier soll einE BenutzerIn die gewünschte Anfrage rein textuell eingeben können. Bei entsprechender Übung kann man so sicherlich schneller SQL-Anfragen zusammenstellen als mit den (mehr oder weniger) umständlichen Mausklicks des Anwendungsfalles "Generate Query". Das Textfeld, in dem die generierte Query angezeigt wird ist editierbar, d.h. es ist möglich, auch automatisch generierte oder geladene Queries zu editieren. Aus diesen Eingaben wird dann eine SQL-Anfrage generiert und XML-codiert. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil IV: 4. Use-Cases 100 Generate Query (Query) Dieser Anwendungsfall ist kein durchgehender Dialog. Vielmehr ist hier eine bequeme Generierung von SQL-Anfragen mit wenigen Mausklicks möglich. Nach dem Login werden hier sämtliche Tabellen angezeigt, auf die der Benutzer Zugriff hat. Die Tabellen werden als Blätter eines Baumes (ähnlich der Anzeige der Verzeichnisstruktur im Windows-Explorer) angezeigt. Wird ein Tabellenname angeklickt, wird eine entsprechende Anfrage gegen die Datenbank geschickt und das Ergebnis – die Spaltennamen der entsprechenden Tabelle – in einem eigenen Fenster angezeigt. Durch Anklicken der Checkboxes neben den Spaltennamen kann nun eine SQL-Anfrage zusammengestellt werden. Diese SQL-Anfrage kann auch von Hand editiert werden (vgl. den Anwendungsfall "Input/Edit Query"). Manage Query (Query) Dieser Anwendungsfall enthält die "Sub-Anwendungsfälle" Load, Save, Execute Query. Ist eine Query vorhanden (z.B. aufgrund einer Benutzereingabe), dann kann sie gespeichert und wieder geladen werden. Das Ausführen einer Abfrage setzt ebenfalls das Vorhandensein einer Query voraus. Map to Chart (Report) Dieser Use-Case fordert das Vorhandensein von gültigen Ergebnissen einer Datenbankanfrage. Liegt ein solches Ergebnis vor, so können die relevanten XML-Tags einzelnen Parametern der Chart-Bean zugewiesen werden. So kann man sich bequem seine eigenen Charts aus den vorhandenen Daten zusammenstellen und sich dann jeweils das Ergebnis anzeigen lassen. Create Chart (Report) Mit diesem Anwendungsfall ist die Visualisierung der Anfrageergebnisse auf der Clientseite gemeint. Erforderlich ist ein vorheriges Mapping der XML-Tags auf die Parameter der Chart-Bean (siehe Anwendungsfall "Map to Chart"). Configure Chart (Report) Dieser Anwendungsfall erweitert den "Create Chart"-Anwendungsfall um eine Konfigurationskomponente. Es ist nun möglich, den Chart besser den eigenen Wünschen anzupassen, z.B. Änderung des Chart-Layouts, der verwendeten Farben und vielen Punkten mehr. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf Teil V: 101 Design 1 Grobentwurf Der Grobentwurf beschreibt die allgemeine Architektur des implementierten Query-Tools. Diese Systemarchitektur wird in Form von Verteilungs-, Komponenten- und Paketdiagrammen in der UML-Notation beschrieben. Die Use-Cases des Design-Teils werden hier detailliert mit UMLAktivitätsdiagrammen beschrieben. Anschließend wird die Verwendung von XML als Übertragungsprotokoll diskutiert, wobei verschiedene DTDs und DTD-Schablonen vorgestellt werden. Mit JavaBeans zur XML-Verarbeitung befaßt sich das folgende Kapitel. Abschließend wird noch analysiert, ob clientseitig ein Java-Applet oder eine Java-Applikation verwendet werden soll. 1.1 Verteilungsdiagramm Das folgende Verteilungsdiagramm gibt Auskunft über die physiche Verteilung der einzelnen Komponenten des Systems. Wie man sieht, handelt es sich um eine logische 3-Tier Architektur. Logisch in dem Sinne, daß die Datenbank durchaus auch auf dem Server-Rechner laufen kann und die Client-Anwendung über ein Netzwerk mit der restlichen Applikation kommuniziert. Datenbankserver Oracle 7.3.4 Datenbank DB Client com.microstar.xml. AElfred JDBC Server XMLConverter com.microstar.xml. AElfred QueryBean RMI XQTClient RMI xqt.server XMLBarChart XMLConverter ... RMI Abbildung V-1: Systemarchitektur - Verteilungsdiagramm8 8 Das Verteilungsdiagramm – wie auch alle folgenden UML-Diagramme – verwendet zur Paketbeschreibung die Java-Notation. So sind Pakete hierarchisch angeordnet; Paketnamen werden klein geschrieben. Die Namen von Klassen oder Komponenten werden groß geschrieben. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 102 Wie man sieht, ist dieses Verteilungsdiagramm eine vereinfachte Darstellung des Sachverhalts. Auf der Clientseite wurde z.B. nicht berücksichtigt, daß das Applet im Kontext eines Web-Browsers läuft und zunächst über HTTP vom Server geladen werden muß. RMI statt CORBA Der vielleicht wichtigste Punkt in obigem Verteilungsdiagramm ist die Verwendung von Java's RMI (Remote Method Invocation). Das bedeutet insbesondere, daß auf CORBA/IIOP als Kommunikationsbasis verzichtet wird. Es gibt zwei Gründe für diese Entscheidung: • Mit RMI läßt sich unter Java erheblich einfacher programmieren als mit CORBA, da keine Schnittstellendefinitionen in CORBA's IDL geschrieben werden müssen • Es besteht keine Notwendigkeit für CORBA, da das Web-Informationssystem eine klassische Client/Server-Architektur ist und beide Seiten in Java implementiert werden. Bleibt anzumerken, daß in einer kommerziellen Implementierung die Verwendung von CORBA sinnvoller ist, da dann eine bessere Anbindung an andere Komponentenarchitekturen möglich ist. Verwendung des Fassade-Patterns für den Datenbankzugriff Der Datenbankzugriff mit der Java-Datenbank-API JDBC ist schwierig und fehleranfällig. JDBC besteht aus einer Vielzahl von Klassen und Schnittstellen, der JDBC-Code ist relativ schwierig zu lesen und das Exception-Handling ist aufwendig. Deshalb ist es sinnvoll, diese Komplexität in einer speziellen Fassade-Klasse zu verbergen, die als Schnittstelle zwischen der eigentlichen Anwendung und dem JDBC-Paket verwendet wird. So ist es möglich, auf einer relativ hohen Abstraktionsebene auf die Datenbank zuzugreifen, ohne sich um Low-Level-Details wie SQLBefehle oder Ausnahmebehandlung kümmern zu müssen. Anzumerken ist hier allerdings, daß die hier implementierte Komponente (QueryBean) erstens nicht den Zugriff auf alle (nicht einmal auf besonders viele) Funktionen bietet und zweitens natürlich primär für die Diplomarbeit geschrieben wurde, d.h. durchaus auch Funktionen beinhaltet, die in einem anderen Kontext wenig Sinn ergeben. Ein interessanter Aspekt bei meiner Implementierung ist allerdings, daß die Ergebnisse der Datenbankanfrage als gültiges XMLDokument zurückgeliefert werden. XML Parser Die gesamte Kommunikation innerhalb des Query-Tools soll in XML erfolgen. Somit wird sowohl auf Client- als auch auf Serverseite ein XML-Parser benötigt, der zumindest auf der Clientseite nur aus wenigen Klassen besteht. Der einzige Parser, der diese Anforderung erfüllt (die Parser von Sun, IBM oder Oracle sind gewaltige Pakete, deren Größe (und damit deren Download-Zeit) in keinem Verhältnis zum Nutzen steht) ist der freie, nicht-validierende XML-Parser AElfred von Microstar [Microstar 99]. Da AElfred auf Callback-Basis arbeitet, muß eine eigene Klasse geschrieben werden, welche die erforderlichen Callback-Methoden implementiert. Hier bietet sich natürlich eine Realisierung in Form einer JavaBean an, die beliebig erweitert werden kann und den Zugriff zum eigentlichen Parser transparent hält (nähere Infos dazu im Feinentwurf-Kapitel). 1.2 Grobstruktur der Anwendung Die Grobstruktur der gesamten Anwendung ist in obigem Verteilungsdiagramm schon recht genau beschrieben. In diesem Unterkapitel werden die Komponenten bzw. Pakete genauer beschrieben. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 103 Zunächst jedoch noch ein Komponentendiagramm, das die Abhängigkeiten zwischen den Komponenten aufzeigen soll. Anzumerken ist bei folgendem Diagramm noch, daß Komponenten der Standard-API sowie der Java Foundation Classes (JFC) – insbesondere das Swing-Paket – nicht dargestellt werden, da diese Abhängigkeiten vom Compiler selbstständig erkannt und von daher auch mit Case-Tools nicht modelliert werden. Client com.microstar.xml. AElfred xqt.converter. XMLConverter Server xqt.client xqt.server tdg.Perspective QueryBean (Chart-Bean von Three D Graphics) xqt.converter. XMLConverter com.microstar.xml. AElfred Abbildung V-2: Paket-/Komponentendiagramm der Anwendung In den folgenden Abschnitten werden die Pakete und Komponenten kurz beschrieben (mehr Informationen sind im Implementierungskapitel zu finden). com.microstar.xml. AElfred AElfred ist ein frei verfügbarer SAX-Parser der Firma Microstar [Microstar 99]. Dieser Parser ist relativ klein (4 Klassen und eine Schnittstelle mit gerade mal 23k Codeumfang als JAR-File) und aufgrund der ereignisbasierten API problemlos einzubinden. Wegen des geringen Codeumfangs ist AElfred besonders für die Einbindung in Java-Applets geeignet. Da der (DOM-basierte) XML-Parser von Sun vermutlich in einer der nächsten Java-Versionen in die Klassenbibliothek integriert wird, ist es möglich, AElfred später auszutauschen und stattdessen auf den Sun-Parser zuzugreifen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 104 xqt.converter.XMLConverter Der XMLConverter ist die Schnittstelle der Client-Anwendung zu Microstar's XML-Parser AElfred. Die Realisierung dieses Konverters als JavaBean erlaubt eine unproblematische Verwendung von AElfred in anderen Anwendungen. Das ganze Konverter-Paket besteht aus einer abstrakten und mehren nicht-abstrakten Klassen, welche das Entwurfsmuster "Erbauer" implementieren. Eine Erweiterung des Paketes ist durch das Schreiben konkreter Konverter-Klassen möglich. xqt.client Dieses Paket besteht aus zwei Klassen: XQTClient und XQTFrame. XQTClient wurde als JavaApplet entwickelt und hat einen relativ geringen Codeumfang. Der gesamte GUI-Code wurde in die Klasse XQTFrame verlagert, um durch die Trennung von Anwendung und GUI-Code eine bessere Austauschbarkeit der Klassen zu erreichen. Denkbar wäre beispielsweise, den Client nicht als Applet sonderen als Applikation zu entwickeln. Hier müßte dann nur noch die Klasse XQTClient ausgetauscht werden. tdg.Perspective Diese kommerzielle Chart-Bean von Three D Graphics [Three D Graphics 99] ist im Lieferumfang von Oracle's JDeveloper 2.0 enthalten und kann als JavaBean in eigene Programme eingebunden werden. Perspective for Java ist eine sehr mächtige Komponente, welche die Einbindung von 3DCharts, Kuchen- oder Balkendiagrammen ermöglicht. Sämtliche Eigenschaften (Farbe, Aussehen, ..) können über Bean-Properties manipuliert werden. Erweiterte Features wie verschiedene Rotationswinkel bei 3D-Charts zeigen die Leistungsfähigkeit dieser Bean. Leider führt diese große Leistungsfähigkeit auch zu Problemen: der Codeumfang der ClientAnwendung steigt um ein Vielfaches an (das gesamte Perspective-Klassenpaket ist unkomprimiert 824k groß – die gesamte restliche Anwendung ist 199k groß). Bei einer Weiterentwicklung des Query-Tools ist zu überlegen, ob diese Chart-Bean wirklich so ausgenutzt werden kann, daß dieser Code-Overhead zu vertreten ist. Ansonsten hat man die Möglichkeit, entweder auf eine andere Chart-Bean umzusteigen oder sich von Three D Graphics eine individuelle Bean mit dem gewünschten Funktionsumfang zusammenstellen zu lassen. xqt.server In diesem Java-Paket sind die serverseitigen Klassen und Schnittstellen des Query-Tools zusammengefaßt. Kern des Serverpaketes ist die Klasse XQTServer, mit deren main-Methode der Server gestartet wird. Ansonsten enthält das Paket noch einen Adapter für die einzubindende QueryBean (vgl. den folgenden Abschnitt) und ein RemoteInterface, um den Zugriff über RMI zu ermöglichen. xqt.QueryBean Diese Bean enthält alle Methoden, die benötigt werden, um über JDBC auf eine relationale Datenbank zuzugreifen. Das Ergebnis einer Datenbankanfrage wird in Form eines gültigen XMLDokumentes zurückgegeben. 1.3 Graphisches User-Interface (GUI) Die Schnittstelle zum Benutzer besteht aus einem Java-Programm, welches sowohl als Applet als auch als Applikation verwendet werden kann. Es bietet eine graphische Oberfläche, die mit dem Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 105 Swing-Paket entwickelt wurde. Die Aufteilung des Clients in XQTClient und XQTFrame dient der Übersichtlichkeit, da der – recht umfangreiche – Code zur Generierung der graphischen Benutzerschnittstelle vom eigentlichen Programm entkoppelt und entsprechend einfacher zu warten ist. Aufbau der GUI Die im Analyseteil beschriebenen Benutzeroberflächen haben alle ihre Vor- und Nachteile. Sinnvoll ist in jedem Fall die Verwendung von Registerkarten, wie sie etwa MS Access verwendet. Allerdings ist eine einfache Trennung von Query- und Report-Funktionalität etwas übersichtlicher. Seagate's Crystal Report z.B. hat nur die Registerkarten "Query" und "Report". Als grundlegendes Look & Feel für das Query-Tool dieser Diplomarbeit dienen die SwingKlassen, die ab dem JDK 1.1.7 vollständig in die Sprache integriert sind. Folgende Abbildung zeigt den prinzipiellen Aufbau der Benutzeroberfläche: Abbildung V-3: Benutzeroberfläche des Query-Tools Neben einer Menüleiste mit Standard-Funktionen und einer ebensolchen Toolbar fällt die strikte Trennung der Anwendung in einen Query- und in einen Reportteil mittels Registerkarten auf. Die Query-Oberfläche ist somit relativ übersichtlich und einfach zu bedienen. Der Baum im linken oberen Teil der Oberfläche zeigt die Tabellen und Sichten des entsprechenden Benutzers an. Durch einfaches Anklicken wird im rechten oberen Teil ein sogenanntes internes Frame generiert, das die Spaltennamen der Tabelle anzeigt. Zur Generierung des SELECT-Teils der Datenbankanfrage können nun einzelne Spalten ausgewählt werden. Der im unteren Frame angezeigte SQL-Code kann nun – falls erforderlich – noch nacheditiert werden oder gleich mit dem EXECUTE-Button an die Datenbank geschickt werden. Nach einer erfolgreichen Ausführung der Anfrage sollen die zurückgegebenen (XML-codierten) Daten weiterverarbeitet werden. Dies geschieht über die Optionen der "Report"-Registerkarte. In Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 106 folgender Abbildung sieht man drei weitere Registerkarten: Table, Perspective Chart und XML Source: Abbildung V-4: Report-Registerkarten des Query-Tools Im Frame der Table-Karte erscheint stets die Rückgabetabelle, die clientseitig aus dem XML-Code generiert wird. Die Registerkarte "XML Source" zeigt den reinen XML-Code in einem Textfenster, der z.B. mittels Cut & Paste in andere Programme übernommen werden (und übrigens auch editiert werden) kann. "Perspective Chart" ist die Registerkarte des Chart-Beans von Three D Graphics [Three D Graphics 99]. Diese Chart-Bean bietet umfangreiche Möglichkeiten der Gestaltung von Charts, die dann auch als Grafik abgespeichert werden können. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 107 Abbildung V-5: Mapping der Spalten der Rückgabetabelle Zuvor müssen jedoch die Spalten der Rückgabetabelle auf die entsprechenden Parameter der ChartBean übertragen werden. Nach dem Mapping der Spalten auf die Bean-Schnittstelle kann man sich den Chart anzeigen lassen: Abbildung V-6: Visualisierung der Ergebnisse mit der ChartBean Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 108 Ganz allgemein läßt sich also die Funktionalität der Client-Komponente des Query-Tools in zwei Teile aufspalten: • Query und • Report Das Report-Frame bietet mindestens zwei Registerkarten: zur Darstellung des Ergebnisses in Form einer Tabelle und als XML-Quelltext. Sollen JavaBeans eingebunden werden, so ist dies problemlos möglich – zumindest wenn schon eine brauchbare visuelle Schnittstelle zur Bean zur Verfügung steht. Menüs Die Menüstruktur ist relativ einfach gehalten. Im "File"-Menü werden Funktionen zum Laden und Speichern von Queries angeboten. Das Menü "Basic Functions" enthält sämtliche relevanten Funktionen zum Einloggen in die Datenbank, zum Testen der Verbindung zum Server und zum Ausführen von Queries. Im "Tools"-Menü steht derzeit nur die Umschaltung zwischen verschiedenen Look & Feel-Standards (Windows, Motif, Java) zur Verfügung. Anmerkungen zu den Aktivitätsdiagrammen der Use-Cases Aktivitätsdiagramme sind eine UML-Notation zur Beschreibung von nebenläufigen Zuständen und Aktivitäten (Aktivitäten sind Zustände mit einer internen Aktion). In allen folgenden Aktivitätsdiagrammen ist eine Aktivität "GUI" spezifiziert. Damit ist stets das ganze grafische User-Interface gemeint. Es wurde darauf verzichtet, diesem GUI spezielle Zustände zuzuordnen, um den Überblick einfacher zu machen. Dennoch sind die "GUI"Aktivitäten der folgenden Diagramme nicht äquivalent, sondern unterscheiden sich z.B. darin, daß einzelne Menüpunkte "ausgegraut" - also nicht anwählbar - sind. Die Transitionen der GUIAktiviät sind stets Kommandos, wobei nicht zwischen der Anwahl eines Menüpunktes und sonstigen GUI-Aktionen (Anklicken eines Buttons, Drag&Drop, ...) unterschieden wird. Ebenfalls aus Gründen der Übersichtlichkeit wurden nicht alle zu einem bestimmten Zeitpunkt anwählbaren Menüpunkte modelliert. Klar ist jedoch, daß beispielsweise der Menüpunkt "Quit" zu jedem beliebigen Zeitpunkt angewählt werden kann. Die rechteckigen Kästen geben den jeweiligen Objektzustand an. Diese Angabe des Objektzustandes ist nicht unbedingt nötig und dient nur dazu, den semantischen Gehalt der Diagramme zu erhöhen. Use-Case "Login" (Dialog) Dieser Anwendungsfall besteht aus einem einfachen Dialog. Wird Login angeklickt, so erscheint ein Dialogfenster, in das der Benutzer seinen Benutzernamen, sein Paßwort, den URL der Datenbank, den Namen des JDBC-Treibers und den URL des Servers. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 109 Abbildung V-7: Screenshot des Login-Dialogs (Use-Case "Login") Für die Felder "Database-URL", "Name of the JDBC Driver" und "Server-URL" wurden Vorschlagslisten (Combo Boxes) verwenet. Zu diskutieren ist allerdings noch, ob diese erweiterten Dialogpunkte nicht für den "normalen" Anwender transparent gehalten (sprich: weggelassen) werden sollten. Beim Abschluß dieses Dialogs mit OK werden automatisch Benutzername und Paßwort verifiziert und es wird eine Anfrage gegen die Datenbank gestellt, um die dem Benutzer zugeordneten Tabellen zu ermitteln: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 110 start Initialize System [ok] GUI [command:login] [notOk] Verify Login [ok] [ok] Login [verified] [notOk] Query Tables [ok] [ok] Tables [available] Abbildung V-8: Aktivitätsdiagramm für Use-Case "Login" Wie man sieht, überschneidet sich dieser Anwendungsfall mit dem Use-Case "Generate Query". Dennoch erschien mir die Unterscheidung zwischen einer Benutzernamen/Paßwort-Verifikation und dem zugehörigen Login und der ersten Datenbankanfrage sinnvoll. Use-Case "Input/Edit Query" Dieser Anwendungsfall ermöglicht eine manuelle Eingabe einer Datenbankabfrage in einem Textfeld. Es ist auch möglich, eine generierte Query (siehe Anwendungsfall "Generate Query") zu editieren. Use-Case "Generate Query" "Generate Query" steht in einer include-Beziehung zu "Input/Edit Query". Wenn über das Anklicken der Tabellen und Spalten eine Query generiert wird, wird automatisch das Textfeld von "Input/Edit Query" geändert. Man beachte, daß zur Zeit noch keine Analyse der Query im Textfeld stattfindet, d.h. daß manuelle Änderungen im Textfeld von diesem Anwendungsfall nicht erkannt werden und somit z.B. keine Spalten-Deselektionen stattfinden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 111 Login [verified] Aktivität des Use Cases "Login". Die Use Cases "Login" und "Generate Query" überlappen sich etwas. [loginVerified] Query Tables [notOk] [ok] [ok] Initialize System Create Table-Tree Tables [available] GUI [createdColumnFrame] [command:select column] [command:select table] Query [generated] Update Query-Field Query Columns [ok] Create Column-Frame Column-Frame [created] Abbildung V-9: Aktivitätsdiagramm für Use-Case "Generate Query" Bevor eine Query-Generierung möglich ist, muß der Benutzer in die Datenbank eingelogged sein [loginVerified]. Nach dem Login wird automatisch eine Anfrage gegen die Datenbank gestellt, um alle Tabellen eines Benutzers anzuzeigen. Wenn auf diese Anfrage keine geeignete Ergebnismenge zurückgeliefert wurde, dann muß sich der Benutzer erneut einloggen (siehe Use-Case "Login"). Wenn die Tabellen korrekt zurückgeliefert wurden, wird ein Tabellenbaum mit der DatenbankURL als Wurzelelement kreiert: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 112 Abbildung V-10: Tabellenbaum für den User "baier" Wird nun ein Blatt dieses Baumes (also eine Tabelle) angeklickt, so wird automatisch eine neue Datenbankanfrage gestartet, welche die Spalten der ausgewählten Tabelle in einem internen Frame anzeigt: Abbildung V-11: Spalten-Frame für die Tabelle COFFEES Es können nun einzelne Spaltennamen angeklickt werden, um so die Query zu generieren. Sobald eine Spalte angeklickt wurde, existiert eine ausführbare Query. Wird nun über einen Menüpunkt oder einen Button Execute Query angeklickt, so wird diese Anfrage gegen die Datenbank geschickt (vgl. Use-Case "Manage Query"). Zur Zeit lassen sich SQL-Queries nur eingeschränkt generieren. Es ist lediglich möglich, die Spalten bestimmter Tabellen auszuwählen. Wünschenswert ist z.B. die Auswahl von mehreren Tabellen und deren automatische Verknüpfung über SQL-Joins. Manage Query "Manage Query" enthält im wesentlichen drei untergeordnete Anwendungsfälle: • Load Query • Save Query • Execute Query In folgendem Aktiviätsdiagramm wird der Zustand Query [generated] eingeführt. Man beachte, daß dieser Zustand auch in den Use-Cases "Input/Edit Query" und "Generate Query" vorkommt. Der Zustand der Query ist in allen Aktivitätsdiagrammen äquivalent und ist prinzipiell als Voraussetzung für die Ausführung des Befehls "execute" zu sehen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 113 Der Zustand Query [generated] kann natürlich auch über andere Aktivitäten als "Load Query" erreicht werden (vgl. z.B. Use Case "Input/Edit Query") [command: load] Load Query [ok] [ok] Query [generated] GUI [command: save] Save Query [command: execute] Execute Query [ok] [ok] Query [saved] Results [available] Abbildung V-12: Aktivitätsdiagramm für den Use-Case "Manage Query" Diese Anwendungsfälle können über das "File"-Menü (und über die Toolbar) ausgewählt werden. "Load Query" führt zum Öffnen einer Filedialog-Box, die eine bequeme Auswahl einer Query ermöglicht. Mit "Save Query" wird die aktuelle Query (die im Textfenster des "Input/Edit Query"Anwendungsfalles angzeigt wird) gespeichert. Durch Anwahl von "Execute Query" schließlich wird die aktuelle Query gegen die Datenbank geschickt. Die Kommandos "Execute Query" und "Save Query" sind nur anwählbar, wenn auch tatsächlich eine Query im Textfenster angezeigt wird (also der Zustand "Query [generated]" zutrifft). Map to Chart, Create Chart, Configure Chart "Map to Chart", "Create Chart" und "Configure Chart" beziehen sich auf das Mapping, das Zeichnen und die Konfiguration des Perspective-Beans von Three D Graphics [ThreeDGraphics 99]. Folgendes Aktivitätsdiagramm beschreibt die Aktivitäten, die mit diesen Use-Cases zusammenhängen: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 114 [resultsAvailable] Create Table-Frame Create Map-Frame GUI [command: mapResults] Create Chart Create Config.-Frame Abbildung V-13: Aktivitätsdiagramm für die " Chart"-Use-Cases Man beachte, daß hier (wie auch bei allen anderen Anwendungsfällen) ein kreiertes Frame solange gültig bleibt, bis es (z.B. hier durch Änderung der Chart-Parameter) überschrieben wird. Die Aktivitäten "Create Table-Frame" und "Create Map-Frame" werden unmittelbar nach dem Vorhandensein der Anfrage-Resultate ausgeführt, da die Anzeige der Ergebnisse in Form einer Tabelle und in Form von "Plain XML" ohne großen Aufwand durchführbar ist und in der Regel vom Benutzer gewünscht wird. Übrigens werden die XML-codierten Ergebnisse, die im entsprechenden Textfenster angezeigt werden, auch genau hier gespeichert. D.h., daß eine Weiterverarbeitung (z.B. Mapping auf die Chart-Bean) stets auf der Basis der XML-Ergebnisse dieses Textfensters erfolgt. 1.4 XML als Übertragungsprotokoll XML ist die Kommunikationsbasis des Query-Tools. Wichtig ist deshalb, vor einer Implementierung die zugrundeliegenden DTDs genau zu überprüfen. Insbesondere die Aufwand/Nutzen-Relation ist wichtig, da die Übertragung von einfachen Parametern oder gar reinem Text keiner aufwendigen DTD bedarf. Ein XML-Dokument wird dabei in einem StringBuffer-Objekt gespeichert und über RMI übertragen. Im folgenden werden die verwendeten Dokumenttyp-Definitionen (DTDs) kurz beschrieben. Login Hier wird eine einfache, geschachtelte DTD verwendet, welche die Möglichkeit bietet, den Benutzernamen (userName), das Paßwort (password), den Datenbank-URL (databaseURL) und den JDBC-Treibernamen (driverName) zu übertragen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 115 <!ELEMENT login (userName, password, databaseURL, driverName, serverURL)> <!ELEMENT userName (#PCDATA)> <!ELEMENT password (#PCDATA)> <!ELEMENT databaseURL (#PCDATA)> <!ELEMENT driverName (#PCDATA)> <!ELEMENT serverURL (#PCDATA)> Codebeispiel V-1: Login-DTD Diese Login-DTD hat durchaus Mängel: So ist z.B. vorstellbar, daß die Datenbank-URL und der JDBC-Treibername im Applet hart-codiert sind und nicht geändert werden können. In einer professionellen Anwendung wäre es ohnehin wünschenswert, lediglich Vorschlagslisten mit konkreten, firmenspezifischen Datenbanknamen (z.B. "Customer Database" oder "Accounting Database") anzubieten und die Auflösung dieser Namen auf die Serverseite zu verlagern. Der Serverteil der Anwendung kann dann den entsprechenden JDBC-Datenbanktreiber dynamisch laden und die Datenbankanfrage ausführen. SQL-Query Mit der SQL-DTD wird ein SQL-Befehl XML-codiert und zum Server übertragen.: <!ELEMENT query (querystring)> <!ELEMENT querystring(#PCDATA)> Codebeispiel V-2: SQL-Query-DTD Diese DTD wurde bewußt einfach gehalten, um auch komplexe SQL-Befehle zu ermöglichen. Eine für ein professionelles Produkt sinnvollere DTD wäre eine komplette Beschreibung der SQLGrammatik. Der Aufwand zum Schreiben einer solchen DTD ist allerdings sehr hoch; zumal die Generierung bzw. Auswertung der entsprechenden Query relativ aufwendig zu implementieren wäre. Für den Prototyp des Query-Tools habe ich mich deshalb entschieden, lediglich einen String für die gesamte Anfrage zu verwenden. Anfrageergebnisse Für jede Datenbankanfrage wird eine neue DTD generiert. Die DTDs folgen alle folgendem Schema: <!ELEMENT database (records)*> <!ATTLIST database URL CDATA #REQUIRED> <!ELEMENT table (row)*> <!ATTLIST table QUERY CDATA #REQUIRED> <!ELEMENT row (columnName)*> <!ATTLIST row key ID #REQUIRED foreignKeys IDREFS #IMPLIED> <!ELEMENT columnNameXXX (#PCDATA)> <!ATTLIST columnNameXXX TYPE CDATA #FIXED [Datentyp, z.B. VARCHAR2] NAME CDATA #FIXED [Üblicherweise identisch mit dem columnName] ISNULL (true|false) #IMPLIED > [hier folgen die weiteren Spaltennamen mit ihren Attributlisten] <!ELEMENT column (#PCDATA)> Codebeispiel V-3: DTD-Schablone für Abfrageergebnisse Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 116 Diese einfache DTD-Schablone genügt als Austauschformat für zweistellige relationale Strukturen. Derartige Strukturen lassen sich als Syntaxbaum wie folgt darstellen (etwas vereinfacht): DATA BASE TABLE ROW ROW COLUMN PC DATA COLUMN PC DATA COLUMN COLUMN PC DATA PC DATA COLUMN PC DATA COLUMN PC DATA Abbildung V-14: Struktur, Darstellung und Inhalt mit der XML Wie man sieht, wird als Wurzelelement der Name der Datenbank verwendet. Dieses Element hat lediglich ein Attribut: den URL der Datenbank. Wegen den zu erwartenden Sonderzeichen ist der Typ des Attributs CDATA, also Character Data – im Gegensatz zu PCDATA (Parsable Character Data). Der Hauptunterschied zwischen CDATA und PCDATA ist, daß bei CDATA der Text wörtlich übernommen wird und nicht wie bei PCDATA die Entity-Referenzen ersetzt werden. CDATA wird z.B. von Büchern über XML verwendet, bei denen XML-Tags im Text selbst vorkommen und nicht ersetzt werden sollen, da sie ja nur Beispiele sind. Zurückgegeben wird stets eine Tabelle, deren einziges Attribut die SQL-Anfrage selbst ist (SELECT ... FROM ... WHERE ...). Eine Tabelle kann aus einem oder mehreren Datensätzen (Tupeln oder Zeilen) bestehen. Ein Tupel ist eindeutig identifizierbar durch einen Primärschlüssel (key), der unbedingt erforderlich (#REQUIRED) ist. Fremdschlüssel (foreignKeys) sind Primärschlüssel anderer Relationen und haben deshalb eine ID, welche auf diese anderen Relationen eindeutig verweist. Die Spalten oder Attribute jedes Tupels sind vom Typ PCDATA. Das Attribut ISNULL hat keinen Default-Wert. Es ist aber unbedingt erforderlich, aus der Auswahl (true, false) einen Wert zu nehmen (#IMPLIED). Der folgende Codeausschnitt zeigt ein Beispiel für den generierten XML-Code aus der Datenbankanfrage SELECT * FROM COFFEES: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf <?xml version="1.0" encoding="UTF-8"?> <-- generated by XQT --> <!DOCTYPE database [ <!ELEMENT database (table)> <!ATTLIST database URL CDATA #REQUIRED> <!ELEMENT table (row)*> <!ATTLIST table QUERY CDATA #REQUIRED> <!ELEMENT row (COF_NAME, SUP_ID, PRICE, SALES, TOTAL)> <!ELEMENT COF_NAME (#PCDATA)> <!ATTLIST COF_NAME TYPE CDATA #FIXED "VARCHAR2" NAME CDATA #FIXED "COF_NAME" ISNULL (true|false) #IMPLIED > <!ELEMENT SUP_ID (#PCDATA)> <!ATTLIST SUP_ID TYPE CDATA #FIXED "NUMBER" NAME CDATA #FIXED "SUP_ID" ISNULL (true|false) #IMPLIED > <!ELEMENT PRICE (#PCDATA)> <!ATTLIST PRICE TYPE CDATA #FIXED "NUMBER" NAME CDATA #FIXED "PRICE" ISNULL (true|false) #IMPLIED > <!ELEMENT SALES (#PCDATA)> <!ATTLIST SALES TYPE CDATA #FIXED "NUMBER" NAME CDATA #FIXED "SALES" ISNULL (true|false) #IMPLIED > <!ELEMENT TOTAL (#PCDATA)> <!ATTLIST TOTAL TYPE CDATA #FIXED "NUMBER" NAME CDATA #FIXED "TOTAL" ISNULL (true|false) #IMPLIED > ]> <database URL="jdbc:oracle:thin:@192.168.1.153:1526:ORCL"> <table QUERY="select * from coffees"> <row> <COF_NAME> Espresso </COF_NAME> <SUP_ID> 123 </SUP_ID> <PRICE> 456 </PRICE> <SALES> 789 </SALES> <TOTAL> 12 </TOTAL> </row> <row> <COF_NAME> Brasilian </COF_NAME> <SUP_ID> 123 </SUP_ID> <PRICE> 456 </PRICE> <SALES> 789 </SALES> Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences 117 Teil V: 1. Grobentwurf 118 <TOTAL> 12 </TOTAL> </row> </table> </database> Codebeispiel V-4: DTD-Beispiel für eine SQL-Query Wie man sieht, wurde hier eine sogenannte interne DTD generiert, die ins XML-Dokument selbst eingefügt wurde. Zur Zeit ist allerdings noch kein Algorithmus implementiert, der Fremdschlüssel als solche erkennt und behandelt. 1.5 XML-Verarbeitung mit JavaBeans Ursprünglich war geplant, eine Funktionalität zum dynamischen Nachladen von JavaBeans zur Verfügung zu stellen. Die Idee dabei ist, daß nicht jeder Benutzer alle verfügbaren Beans benötigt und daß diese je nach Bedarf vom Server heruntergeladen werden können. Der Server müßte also Methoden anbieten, mit denen die verfügbaren Beans ermittelt und ggf. heruntergeladen werden können. Die verfügbaren Beans können dann – am besten in Form von Icons – im Client-GUI angezeigt und bei Mausklick dynamisch nachgeladen werden. Das typische Szenario beim Nachladen von Beans wäre dann: • Anfrage des Clients an den Server, welche Beans verfügbar sind • Antwort des Servers und Anzeige als Icons im Client-GUI • Anforderung einer Bean durch den Benutzer • Automatische Installation der Bean im Client • Konfiguration der Bean durch den Benutzer Das Problem ist, daß für jede Bean eine eigene GUI-Schnittstelle erforderlich ist, um die entsprechenden Funktionen anwählen zu können. Dies könnte am einfachsten realisiert werden, indem das GUI der Report-Registerkarte von einer (dynamisch geladenen) Java-Klasse generiert wird. Eine andere Möglichkeit wäre, die GUI-Daten der Bean in Form eines XML-Dokumentes zu übergeben. Dieses XML-Dokument müßte dann gesondert ausgewertet werden, um das GUI der Report-Registerkarte neu zu zeichnen. Die Möglichkeit des Nachladens von JavaBeans wurde in den Prototypen des Query-Tools aus Zeitgründen nicht integriert. Bei einer Weiterentwicklung des Tools ist jedoch eine frühzeitige Architekturänderung notwendig, um dieses Feature zu integrieren. 1.6 Applet oder Applikation? Eine zentrale Frage für die Entwicklung der Anwendung ist, ob clientseitig ein Applet (im Kontext eines Webbrowsers ausführbar) oder eine Applikation (von einer lokal installierten Virtuellen Maschine ausführbar) verwendet werden soll. Das – inzwischen prototypisch fertiggestellte – Query-Tool wurde clientseitig als Java-Applet, das im Kontext eines Web-Browser ausgeführt wird, entwickelt. An dieser Stelle soll nun untersucht Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 119 werden, welche Vor- und welche Nachteile ein Java-Applet im Gegensatz zu einer JavaApplikation hat. Mobilität Zu den Vorteilen der Realisierung als Applet gehört die größere Mobilität. Es ist z.B. möglich, auf fremden Rechnern mit Web-Zugang das Applet auszuführen und die erhaltenen Daten zu analysieren. Problematisch ist natürlich, daß ein Java-Applet auf die Virtuelle Maschine des Browsers angewiesen ist. So benötigt man für verschiedene Web-Browser auch in der aktuellsten Version spezielle Plug-Ins, die jedoch nicht auf jedem Rechner installiert sind. Das schränkt natürlich gerade den Entwickler ein: man ist gezwungen, mit älteren Java-Versionen zu arbeiten, bis die neueren Java-Versionen in die Browser integriert sind. Und auch hier ist mit Problemen zu rechnen, da einige Browser nicht die vollständige Spezifikation umsetzen. So ist beispielsweise der Internet Explorer 5.0 im Auslieferungszustand nicht RMI-fähig. Sicherungsaufwand Java-Applets haben ein gut durchdachtes Sicherheits-Konzept, das den Benutzer vor schädlichen Applets schützen sollen. Diese Einschränkungen sind aber im vorliegenden Fall problematisch. Das Speichern und Laden von Datenbankanfragen als Text-Files auf der Festspeicherplatte sollte schon möglich sein, um den Nutzen nicht einzuschränken. Die Sicherheitsrichtlinien können aber auch aufgeweicht werden. Möglich ist z.B. eine AppletZertifizierung, um etwa Queries abspeichern und laden zu können. Allerdings ist es eben etwas aufwendiger, Applets zu zertifizieren und neue Sicherheitsrichtlinien zu entwickeln, als eine Applikation zu schreiben, die ohnehin keine Einschränkungen hat. Administration und Aktualität Gerade im rasanten Web-Umfeld, in dem neue Versionen bestehender Applikationen oft im Halbjahreszyklus erscheinen, ist eine ständige Pflege und Erweiterung der Software notwendig. Dies läßt sich am ehesten bei der Verwendung von Java-Applikationen erreichen. Schreibt man eine neue Version eines Query & Report-Tools, dann kann z.B. auf neuere Java-Bibliotheken und –Klassen zurückgreifen, ohne sich über inkompatible Web-Browser Sorgen machen zu müssen. Falls das Query-Tool eine neuere Java-VM zur Ausführung benötigt, dann wird diese neue JavaVersion eben gleich mitinstalliert. Bei Java-Applets sieht es etwas anders aus. Hier gibt es zahlreiche Probleme mit den bekannten Web-Browsern (Navigator, Explorer, Opera). Teilweise ist die aktuelle Java-Spezifikation nur unvollständig oder fehlerhaft unterstützt und manchmal wird nicht einmal ein Plug-In angeboten, das neuere Java-Applets ausführen kann. Der Entwickler kann hier also nicht die aktuellsten Bibliotheken verwenden, sondern muß sich bezüglich der Java-Version an die Vorgaben der Kunden halten, auf deren Web-Browsern das Applet ja ausgeführt werden soll. Allerdings ist die Administration von Applets einfacher, wenn der Kunde nicht auf bestimmte Browser bzw. Browserversionen festgelegt ist. Dann kann man beispielsweise dem Kunden nahelegen, auf eine neuere Browserversion umzusteigen, um mit der neuen Version des QueryTools arbeiten zu können. 1.7 Auswahl des JDBC-Treibers Da diese Diplomarbeit zwar datenbankunabhängig sein soll, aber der Prototyp der Implementierung mit einer Oracle-Datenbank arbeitet, folgt nun ein kurzer Abschnitt über die JDBC-Treiber von Oracle. Oracle bietet drei verschiedene Treiber an: einen Typ 4-Treiber, der komplett in Java Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 120 implementiert und z.B. für Applets gedacht ist (Thin Driver), einen OCI-basierten Treiber, der für den Einsatz in einer Middleware gedacht ist und einen serverseitigen JDBC-Treiber, der für den Einsatz in Oracle 8i gedacht ist. Thin Driver Wie schon erwähnt, ist dies ein Typ 4-Treiber, der aus 100% Java besteht und für Anwendungen gedacht ist, die aus dem Netz geladen werden. Dieser Treiber ist etwas langsamer als Oracle's Fat Driver (was auch nicht verwundert, da ein Teil dieses Treibers in C implementiert wurde). Fat Driver Der Fat Driver ist ein Typ 2-Treiber, der für den Einsatz in einer Middleware gedacht ist. Er basiert auf dem Oracle Call Interface (OCI), das in C geschrieben und deshalb nicht portabel ist. Auf das OCI ist dann natürlich noch eine JDBC-Schicht gelegt, um JDBC-Aufrufe verarbeiten zu können. Serverside Driver Dieser Treiber ist für die Version 8i der Oracle-Datenbank gedacht. Es ist möglich, innerhalb dieser Datenbank Java-Anwendungen laufen zu lassen. Das heißt, das Java-Programm läuft im selben Prozeß und benutzt den gleichen Adreßraum wie die Datenbank. Hier muß natürlich keine Verbindung mehr zur Datenbank aufgebaut werden. Im Rahmen dieser Diplomarbeit wird allerdings Oracle 7 verwendet, weshalb diese Möglichkeit nicht mehr angesprochen wird. Welcher Oracle-Treiber soll verwendet werden? Das hängt davon ab, ob die Anwendung zu 100% aus Java bestehen soll, welche Systemarchitektur verwendet wird und welche Oracle-Version installiert ist. Im Query-Tool der Diplomarbeit wird kein clientseitiger Treiber zum Direktzugriff auf eine Datenbank verwendet. So können sowohl der Typ 2- als auch der Typ 4-Treiber verwendet werden. Um allerdings eine reine Java-Anwendung zu entwickeln, wird in der Diplomarbeit der Typ 4-Treiber (Thin Driver) benutzt. 1.8 Einbindung eines XSL-Prozessors Die formatierte Anzeige der Query-Ergebnisse anhand eines XSL-Stylesheets ist eine der wichtigsten Funktionen, die noch implementiert werden müssen. Allerdings könnte es Probleme mit dem Programmumfang geben, wenn noch ein XSL-Prozessor – z.B. als JavaBean eingebunden wird. Hier bietet sich natürlich der Lotus XSL-Prozessor [alphaWorks 99] von IBM an. Dieser Prozessor kann auf drei Arten verwendet werden: als JavaBean, als Java-Applet oder als Kommandozeilen-Programm. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 1. Grobentwurf 121 Eine Option ist dabei natürlich, fremde Anzeigeprogramme (z.B. Internet Explorer) zur Formatierung und Darstellung der XML-Daten mittels XSL zu verwenden. Zur Zeit werden die XML-Dokumente, welche die Anfrageergebnisse enthalten, mit dem XMLConverter in ein spezielles Swing-Tabellenmodell konvertiert. Hier wäre eine Darstellung in HTML/XML sinnvoller, da so eine weitere Verarbeitung besser möglich ist. Es könnte z.B. zu jeder Datenbankanfrage nicht nur das XML-Ergebnisdokument sondern auch ein individuelles Stylesheet zurückgeliefert werden, mit dem sich die XML-Daten als HTML/XML-Tabelle anzeigen lassen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 2. Feinentwurf 122 2 Feinentwurf In diesem Kapitel werden die Klassendiagramme der Client- und Serverkomponenten entwickelt.Mit Sequenzdiagrammen werden interessante Client/Server-Interaktionen näher beschrieben. 2.1 Pakete und Komponenten Einen Überblick über die Pakete und Komponenten des Query-Tools geben Verteilungsdiagramm und das Paket/Komponentendiagramm des Grobentwurf-Kapitels. In folgenden Unterkapiteln werden die Klassendiagramme zu den einzelnen Paketen Komponenten entwickelt. Weitere Codedetails und Sequenzdiagramme sind Implementierungsteil zu finden. das den und im 2.2 xqt.client Klassendiagramm Der Kern der clientseitigen Software ist das Applet XQTClient. Diese Klasse dient zur Verknüpfung der einzelnen Komponenten und zum Verbindungsaufbau zum Server. Die Komponente XMLConverter verwendet den freien XML-Parser AElfred und dient dazu, die XML-Dokumente so zu verarbeiten, daß z.B. die Perspective-ChartBean die Daten auswerten kann. com.microstar.xml. AElfred (XML-Parser from Microstar) xqt.converter. XMLConverter (Schnittstelle zwischen AElfred und XQTClient) javax.swing.JApplet javax.swing.JFrame xqt.client. XQTClient xqt.client. XQTFrame tdg.Perspective (Chart-Bean von Three D Graphics) Abbildung V-15: Klassendiagramm des Clients Das Paket xqt.client besteht also aus zwei Klassen und den eingebundenen JavaBeans. Die Klasse XQTClient wurde als Java-Applet realisiert und dient hauptsächlich zur Initialisierung der Anwendung. XQTFrame wurde zu einem großen Teil mit dem GUI-Builder von Oracle's JDeveloper-Entwicklungsumgebung generiert. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 2. Feinentwurf 123 2.3 xqt.converter Diese JavaBeans-Komponente besteht aus einer abstrakten Klasse und vier nicht-abstrakten Klassen. Das dem Klassenmodel zugrunde liegende Entwurfsmuster (Builder oder Erbauer) stammt aus [GoF 96]. Der XMLReader fungiert dabei als Direktor: er registriert sich selbst beim AElfredParser als XmlHandler (er implementiert die Schnittstelle XmlHandler). Der XMLReader enthält mehrere Callback-Methoden, die von AElfred aufgerufen werden (so z.B. startDocument). Diese Callback-Methoden rufen ihrerseits wiederum den gewünschten XMLConverter auf, der dann das XML-Dokument in das von der entsprechenden Anwendung gewünschte Format konvertiert. Nähere Informationen über die Funktionsweise dieser Komponente sind im folgenden Unterkapitel zu finden. com.microstar.xml. AElfred (XML-Parser from Microstar) registers director Builder Pattern XMLReader builder product concreteBuilder XML2TableConverter produces javax.swing.table. TableModel XMLConverter {abstract} XML2TreeConverter produces javax.swing.tree. TreeModel XML2LoginConverter produces StringBuffer (enthält die Login-Daten) Abbildung V-16: Klassendiagramm der XMLConverter-Komponente Diese Komponente unterstützt zur Zeit lediglich den XML-Parser AElfred. Zwar ist es theoretisch leicht möglich, beliebige (SAX-)Parser einzubinden, aber die Methodenaufrufe und Rückgabewerte unterscheiden sich oftmals (wenn auch nur minimal). Idealerweise könnte man die Komponente an die populärsten Parser anpassen, so daß der Anwender nur noch den gewünschten Parser als BeanProperty einstellen muß. Die Produkte, die von den konkreten Konverterklassen produziert werden, sind Objekte der JavaKlassenbibliothek. XML2TableConverter produziert ein Modell, das Swing zur Generierung einer Tabelle verwendet. Mit dem XML2TreeConverter wird analog ein Modell zur Generierung eines Verzeichnisbaumes produziert. Der XML2LoginConverter liest aus einem entsprechenden XMLDokument lediglich die benötigten Werte aus (z.B. Username oder Paßwort), die dann als StringParameter an die passende Methode übergeben werden. An diesem Beispiel läßt sich das im Grundlagenteil diskutierte Problem bei der komponentenorientierten Softwareentwicklung gut erklären. Diese Komponente wird sowohl auf Client- als auch auf Serverseite verwendet. Der Server benötigt jedoch nur von den konkreten Erbauern nur die XML2LoginConverter-Klasse (die wiederum vom Client nicht benötigt wird). Also entsteht ein gewisser Code-Overhead, der sich hier zwar nicht so stark bemerkbar macht, aber Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 2. Feinentwurf 124 bei einer Erweiterung der Konverter-Komponente um allgemeinere Erbauer-Klassen zu berücksichtigen ist. Sinnvoll wäre dann eine Trennung in Client-Konverter und Server-Konverter. 2.4 com.microstar.xml.AElfred AElfred wurde speziell für die Einbindung in Java-Applets entwickelt und besteht aus lediglich 4 Klassen und einer Schnittstelle. Im folgenden Klassendiagramm sind die AElfred -Klassen grau unterlegt. Die Klasse XMLReader ist von mir implementierte Schnittstelle zu AElfred. Sie implementiert den XmlHandler und registriert sich beim XmlParser, um Callback-Aufrufe zu erhalten. <interface> XmlHandler implements HandlerBase SAXDriver XMLReader registers XmlException XmlParser Exception Abbildung V-17: Klassendiagramm von AElfred Der Microstar-Parser basiert auf der ereignisbasierten SAX-API [SAX 98] der XML-DEVMailingliste. Das Prinzip ist relativ einfach: Eine Konverter-Klasse der Anwendung registriert sich beim Parser und ruft dessen parse-Methode mit dem entsprechenden XML-Dokument als Argument auf. Die Konverter-Klasse muß nun bestimmte Callback-Methoden zur Verfügung stellen, die dann vom XML-Parser aufgerufen werden. Hauptvorteil bei der Verwendung der SAX-API ist der geringe Codeumfang und der sparsame Umgang mit Resourcen (z.B. wird nicht der ganze – und evt. sehr umfangreiche – Strukturbaum aufgebaut). 2.5 tdg.Perspective Die Chart-Bean Perspective for Java von Three D Graphics [ThreeDGraphics 99] besteht aus 5 Klassen und 5 Schnittstellen. Dabei hält die Klasse Perspective die anderen Klassen und Schnittstellen weitgehend transparent; man muß sich also nur die Methoden und Variablen dieser Klasse näher ansehen. Perspective bietet umfangreiche Bean-Eigenschaften, die vom Query-Tool zur Zeit nur zum Teil direkt über ein GUI-Elements geändert werden können. Auf eine detaillierte Darstellung des Perspective-Beans in Form eines Klassendiagramms soll hier verzichtet werden. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 2. Feinentwurf 125 Bislang wurde nur ein kleiner Teil der Funktionen des Chart-Beans ausgenutzt. Es ist z.B. möglich, noch zahlreiche andere Charts (nicht nur 3D) und Parameter einzustellen, so daß eine wirklich nutzbringende Nachbearbeitung der operativen Daten möglich ist. Auch das Speichern der Chart-Grafiken in verschiedenen Grafikformaten (GIF, JPEG, ..) wurde bislang nicht realisiert. Ebenso sollte es möglich sein, Grafiken nach der Bearbeitung auszudrucken oder gleich per E-Mail zu verschicken. 2.6 xqt.server Überblick Nach den prinzipiellen Architekturentscheidungen waren im Laufe des Projekts beim Serverpaket kaum noch wesentliche Änderungen nötig. Hauptgrund dafür war die Verwendung des FacadePatterns [GoF 96] in der Serverkomponente QueryBean. Diese Komponente erwartet XMLcodierte SQL-Befehle, welche zu einer einfachen XML-DTD konform sind. So muß nur noch diese DTD decodiert und (ohne eine weitere Prüfung) die entsprechende SQL-Anfrage gegen die Datenbank gestellt werden. Falls ein Fehler auftritt, wird der Fehler wieder XML-codiert und als Anfrageergebnis zum Client zurückgesandt. Klassendiagramm Das Server-Paket besteht aus lediglich zwei Klassen und einer Schnittstelle: der Klasse XQTServer, welche den RMI-Server startet und die Registrierung vornimmt, der Klasse QueryAdapter, und der Schnittstelle QueryRemote, die für entfernte Methodenaufrufe zuständig ist. Integraler Bestandteil der Serverapplikation ist die QueryBean, welche den Datenbankzugriff transparent hält und aus (in XML-Form vorliegenden) SQL-Anweisungen XML-Dokumente generiert. Der QueryAdapter dient als Schnittstelle zur Bean (er adaptiert die QueryBean), wobei das Entwurfsmuster Adapter (aus [GoF 96]) verwendet wurde. Sinn dieses Entwurfsmusters ist die Anpassung der QueryBean-Schnittstelle an die vom Client erwartete Schnittstelle. Im QueryAdapter werden also alle für den Client relevanten Methodenaufrufe an die QueryBean weitergeleitet. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 2. Feinentwurf 126 <<interface>> java.rmi.Remote java.rmi.server UnicastRemoteObject <<interface>> QueryRemote QueryAdapter adapts AElfred QueryBean 0..1 adapter (XML-Parser from Microstar) 0..1 XMLConverter adaptee Adapter Pattern XQTServer (Schnittstelle zwischen AElfred und XQTClient) Abbildung V-18: Klassen-/Komponentendiagramm des Servers In diesem Diagramm wurde darauf verzichtet, Details zum Datenbankzugriff (also die Verbindung zur JDBC-API) einzuzeichnen. Diese Feinheiten der QueryBean-Komponente werden im nächsten Unterkapitel detaillierter behandelt. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil V: 2. Feinentwurf 127 2.7 xqt.QueryBean Die QueryBean-Komponente besteht aus lediglich einer Klasse, die zugleich als JDBC-Fassade fungiert. Jeglicher Zugriff auf die Datenbank via JDBC läuft ausschließlich über diese Klasse ab. Dabei wird kein komplettes Wrapping der JDBC-API, sondern lediglich eine Auswahl von JDBCKlassen und –Funktionen geboten. JDBC - Subsystem ResultSet ResultSetMetaData QueryBean Statement ResultSet Abbildung V-19: Implementierung des Fassade-Patterns durch die QueryBean Der zugrundeliegende Fassade-Pattern ist in [GoF 96] gut beschrieben. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 1. Verwendete Hard- und Software Teil VI: 128 Implementierung Software is like Entropy: it's hard to grasp, weighs nothing and obeys the Second Law of Thermodynamics, i.e. it always increases. Norman Augustine 1 Verwendete Hard- und Software 1.1 Rechnerausstattung und Betriebssystem Zur Entwicklung wurde ein Pentium II-Rechner mit 333 MHz Taktfrequenz, einem Arbeitsspeicher von 128 MB RAM und einer 4-Gigabyte-Festspeicherplatte verwendet. Als Betriebssystem stand Windows NT 4.0 mit dem Service Pack 3 zur Verfügung. 1.2 Entwicklungsumgebung Zur Programmierung des Query-Tools wurde Oracle's JDeveloper 2.0 verwendet. Der JDeveloper verwendet lizensierte Technologie von Borland und ist somit in Aufbau und Funktionsweise weitgehend mit dem JBuilder identisch. Oracle bietet zusätzlich Wizards für die bequeme Erstellung von Web-Anwendungen. So existieren mächtige Werkzeuge, mit denen sich problemlos Enterprise JavaBeans, Servlets oder CORBA-Anwendungen erstellen lassen. Interessant ist auch die vollständige Integration von SQLJ. Bei der Verwendung von SQLJ-Anweisungen innerhalb eines Java-Programms muß so auf kein externes Tool zurückgegriffen werden. JDeveloper 2.0 bietet die Wahl zwischen zwei Java-Versionen: Java 1.1.7 und 1.2. Da es leider noch immer Probleme bei der Ausführung von Java 1.2-Applets in den großen Web-Browsern gibt, wurde das Query-Tool komplett in Java 1.1.7 entwickelt. Als Web-Browser wurden Netscape Navigator 4.6 und Internet Explorer 5.0 verwendet. Für die korrekte Ausführung von Java-Applets war die Installation des Plug-Ins von Sun erforderlich (siehe Kapitel "Probleme bei der Implementierung"). 1.3 Applikationsserver Als Applikationsserver wurde der Oracle Application Server (OAS) 4.0.7, als Datenbank die Oracle Datenbank 7.3.4 verwendet. Die Installation verlief ohne Probleme; bei der Benutzung traten keine Fehler auf. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 2. Implementierungsdetails 129 2 Implementierungsdetails In diesem Kapitel werden die Abläufe verschiedener Operationen (Einloggen, Ausführung einer Abfrage) anhand von Codebeispielen und Sequenzdiagrammen dargestellt. Die Codebeispiele wurden ohne Exception-Handling abgedruckt, um die Übersichtlichkeit zu verbessern. 2.1 xqt.XMLConverter Konvertierung eines XML-Dokumentes in eine Swing-Tabelle Die vorliegende Implementierung arbeitet nach folgendem Schema: Server DB XML-Dokument Java-Objekt (TableModel) Swing-Tabelle Abbildung VI-1: Konvertierung eines XML-Dokumentes in eine Swing-Tabelle Problematisch (und noch weiter zu analysieren) ist die Verarbeitung von Entitäten, die nicht aus Text bestehen (z.B. Grafiken). Es müßte eine Routine eingefügt werden, die entsprechende NichtText-Entitäten erkennt und separat abspeichert. Folgender Codausschnitt stammt aus der Klasse XML2TableConverter und zeigt die wichtigsten Variablen und die Konstruktor-Methode: DefaultTableModel model; Vector columnVector; Vector dataVector; boolean columnNamesSet = false; boolean rowElement = false; boolean columnElement = false; public XML2TableConverter() { model = new DefaultTableModel(); // neues Swing-TableModel columnVector = new Vector(); // zur Speicherung der Spaltennamen dataVector = new Vector(); // zur Speicherung der Attributwerte } Codebeispiel VI-1: Konstruktor von XML2TableConverter Bei der Initialisierung wird also ein neues Swing-DefaultTableModel erstellt. Die Elementnamen der Rückgabespalten (also die XML-Tags) werden in einem Vektor (columnVector) gespeichert und am Ende des ersten Row-Tags (</row>) ins DefaultTableModel übernommen. Am Ende jedes Row-Tags wird der Vektor für die Attributwerte (dataVector) mit addRow(dataVector) dem DefaultTableModel hinzugefügt. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 2. Implementierungsdetails 130 public void endElement(String element) { if (element.equals("row")) { rowElement=false; if (columnNamesSet==false) { model.setColumnIdentifiers(columnVector); columnNamesSet=true; } model.addRow(dataVector); dataVector = new Vector(); } columnElement = false; } Codebeispiel VI-2: Callback-Methode endElement von XML2TableConverter Die folgende Callback-Methode wird beim Parsen von Daten (also den Werten zwischen Start und Ende eines Tags) aufgerufen: public void convertData(String name) { if (name.equals("")) return; if (columnElement==true) dataVector.addElement(name); } Codebeispiel VI-3: Callbackmethode convertData von XML2TableConverter Diese Daten werden dann in den dataVector übernommen und nach dem Durchlauf aller Spalten in der oben beschriebenen Methode endElement in das DefaultTableModel übernommen. Da die Swing-API komplett nach dem MFC (Model-View-Controller)-Entwurfsmuster aufgebaut ist, ist es einfach, derartige XML-Dokumente z.B. in ein anderes Swing-Modell zu konvertieren. Die Klasse XML2TreeConverter, die für die Darstellung von Tabellen in Form eines SwingBaumes zuständig ist, unterscheidet sich nur minimal von XML2TableConverter. 2.2 xqt.server.XQTServer Starten des Servers Bevor ein Client Datenbankanfragen stellen kann, muß der Server gestartet werden. Folgendes Sequenzdiagramm illustriert den Ablauf: Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 2. Implementierungsdetails :XQTServer :LocateRegistry 131 localRegistry :Registry adaptee :QueryBean adapter :QueryAdapter createRegistry(Registry.REGISTRY_PORT) localRegistry rebind("QueryRemote", adapter) Abbildung VI-2: Sequenzdiagramm des Serverstartes Zum Starten des Servers muß die main-Methode von XQTServer ausgeführt werden. Zuerst wird der SecurityManager gesetzt, anschließend wird versucht, eine lokale Registry zu kreieren. Danach werden die QueryBean und die Adapterklasse QueryAdapter instanziert. Ist die Anwendung komplett initialisiert, muß die Registry auf den neuesten Stand gebracht werden. if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } // Setzen des SecurityManagers Registry localRegistry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT); // kreieren // einer lokalen Registry adaptee = (QueryBean) Beans.instantiate( getClass().getClassLoader(), QueryBean.class.getName()); adapter = new QueryAdapter(adaptee); localRegistry.rebind("QueryRemote", adapter); // updaten der Registry Codebeispiel VI-4: Starten des Servers Ab jetzt kann der Server Client-Anfragen bearbeiten. 2.3 xqt.QueryBean Einloggen in die Datenbank Folgendes Sequenzdiagramm beschreibt den Ablauf des Einloggens in die Datenbank. Grundlage ist der Anwendungsfall "Login". Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 2. Implementierungsdetails :XQTClient 132 :LocateRegistry remoteRegistry:Registry db:QueryRemote getRegistry(...) remoteRegistry lookup("QueryRemote") db login() Abbildung VI-3: Sequenzdiagramm des Datenbank-Logins Falls die QueryBean feststellt, daß die Daten (Username, Paßwort, Datenbank-URL, Name des JDBC-Treibers) nicht korrekt sind, wird ein XML-Dokument mit der entsprechenden Fehlermeldung zurückgegeben. Wenn die Daten korrekt waren, dann werden die entsprechenden Variablen im Client gültig gesetzt. Für jede weitere Anfrage gegen die Datenbank werden dann diese Login-Daten verwendet. Nach dem Einloggen bleibt die Verbindung nicht aufgebaut. Die Login-Daten müssen bei jeder Datenbankanfrage wieder mit übergeben werden. Der Use-Case "Login" dient also primär zur Verifikation der Login-Daten. Beim Login werden zwei Methoden aufgerufen: • connect2Server • login Die Methode connect2Server versucht zunächst, die Registry auf dem entsprechenden ServerHost zu finden. Anschließend wird die Remote-Schnittstelle QueryRemote angefordert. Registry remoteRegistry = LocateRegistry.getRegistry(serverName); // finden // der Registry QueryRemote db; // Remote-Schnittstelle db = (QueryRemote)remoteRegistry.lookup("QueryRemote"); db.login(buffer); // Übergabe der Login-Daten an den Server Codebeispiel VI-5: Login in die Datenbank Falls hier keine Ausnahme auftritt, geht XQTClient davon aus, daß die im Remote-Interface definierten Methoden gültig und ausführbar sind. Die login-Methode selbst übergibt nur die LoginDaten an den Server. Die Variable buffer enthält dabei das XML-Dokument mit den Login-Daten. Anschließend wird automatisch die infoTables-Methode aufgerufen, die eine Anfrage gegen die Datenbank stellt, um sämtliche dem jeweiligen Benutzer zugeordneten Tabellen und Sichten zu ermitteln. Der Ablauf einer solchen Datenbankanfrage wird im folgenden Abschnitt beschrieben. Datenbankzugriff Mit der Methode connect2DB wird die Verbindung zur Datenbank aufgebaut. Hier wird zuerst der JDBC-Treiber geladen. Die Registrierung beim Treibermanager ist beim JDBC-Treiber nicht notwendig. Die Methode executeQuery (in der dritten Zeile) wird zur Ausführung von SQLKommandos verwendet. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 2. Implementierungsdetails 133 Class.forName(driverName); // Laden des Treibers stmt = conn.createStatement(); rs = stmt.executeQuery(query); meta = rs.getMetaData(); dbmeta = conn.getMetaData(); int columnCount = meta.getColumnCount(); buffer.append(generateDTD(columnCount)); // Rückgabewert mit DTD füllen buffer.append("<database URL=\""+dbmeta.getURL()+"\">"+"\n"); buffer.append(" <table QUERY=\""+query+"\">"+"\n"); Codebeispiel VI-6: Datenbankzugriff und Generierung des XML-Dokumentes Interessant sind dabei die untersten drei Zeilen. Hier wird der StringBuffer (für den Rückgabewert) gefüllt. Dabei wird zuerst die generateDTD-Methode aufgerufen, die eine eigene DokumenttypDefinition für die Datenbankanfrage generiert (vgl. folgenden Abschnitt). In einer while-Schleife werden anschließend die Ergebnisse der Anfrage in den StringBuffer übernommen: while (rs.next()) { buffer.append(" <row>"+"\n"); for (int i = 1; i <= columnCount; i++) { obj = rs.getObject(i); buffer.append(" <"+meta.getColumnName(i)); if (rs.wasNull()) { buffer.append(" ISNULL=\"true\">"); } else { buffer.append("> "); buffer.append(obj.toString()); } buffer.append(" </"+meta.getColumnName(i)+">"+"\n"); } buffer.append(" </row>"+"\n"); } buffer.append(" </table>"+"\n"); buffer.append("</database>"); Codebeispiel VI-7: Übernahme des JDBC-ResultSets in das XML-Dokument Falls ein Fehler auftritt, so wird der StringBuffer gelöscht und mit einem XML-Dokument, das die Fehlerbeschreibung enthält, gefüllt. Generierung einer Dokumenttyp-Definition (DTD) Die Generierung einer DTD für die Ergebnisse von Datenbankanfragen ist aufwendig. Folgender Codausschnitt zeigt, daß die Methode generateDTD nur für einen eingeschränkten Anwendungsbereich geeignet ist. So sind z.B. die XML-Version und die Codierung bereits festgelegt. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 2. Implementierungsdetails 134 buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+"\n"); buffer.append("<-- generated by XQT -->"+"\n"); buffer.append("<!DOCTYPE database ["+"\n"); buffer.append(" <!ELEMENT database (table)>"+"\n"); buffer.append(" <!ATTLIST database URL CDATA #REQUIRED>"+"\n"); buffer.append(" <!ELEMENT table (row)*>"+"\n"); buffer.append(" <!ATTLIST table QUERY CDATA #REQUIRED>"+"\n"); buffer.append("<!ELEMENT row ("); obj = meta.getColumnName(1); buffer.append(obj.toString()); for (int i=2; i<=columnCount; i++) { obj = meta.getColumnName(i); buffer.append(", "+obj.toString()); } buffer.append(")>"+"\n"); for (int i=1; i<=columnCount; i++) { buffer.append(" <!ELEMENT "+meta.getColumnName(i) +"(#PCDATA)>"+"\n"); buffer.append(" <!ATTLIST "+meta.getColumnName(i)+"\n"); buffer.append(" TYPE CDATA #FIXED\"" +meta.getColumnTypeName(i)+"\""+"\n"); buffer.append(" NAME CDATA #FIXED \"" +meta.getColumnName(i)+"\""+"\n"); buffer.append(" ISNULL (true|false) #IMPLIED"+"\n"); buffer.append(" >"+"\n"); } buffer.append("]>"+"\n\n"); Codebeispiel VI-8: Generierung einer DTD Wie man sieht, wird keine Fremdschlüssel-Auflösung vorgenommen. Diese Funktionalität wurde aus Zeitgründen weggelassen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 3. Probleme bei der Implementierung 3 Probleme 135 bei der Implementierung In diesem Kapitel werden einige unvorhergesehene Probleme mit Sun's Remote Method Invocation (RMI) und der Installation des Query-Tools in Form eines JAR-Files beschrieben. Der Serverteil der Anwendung konnte problemlos installiert und gestartet werden. Lediglich der Clientteil (also das Java-Applet) verursachte Probleme, die zum Teil auf fehlerhafte oder unvollständige RMIUnterstützung der Web-Browser zurückzuführen waren (dem konnte mit dem Java Plug-In Abhilfe geleistet werden). Probleme gab es auch mit der Entwicklungsumgebung JDeveloper, die wichtige CLASS-Dateien beim Deployment nicht ins JAR-File gepackt hat. 3.1 Verschiedene Java-Versionen Zu Beginn der Implementierungsphase wurde Borland's JBuilder 2.0 verwendet. Diese Entwicklungsumgebung unterstützt Java 1.1.6. Problematisch dabei war, daß die Swing-Klassen zu diesem Zeitpunkt noch dem Namensraum com.sun.java.* zugewiesen waren. Die Swing-Klassen sind ab Java 1.1.7 dem Namensraum javax.swing.* zugeordnet. Um nicht gleich zu Beginn der Implementierung mit inkompatiblen Namensräumen arbeiten zu müssen, wurde beschlossen, auf Oracle's JDeveloper 2.0 umzusteigen.9 Der JDeveloper lizensiert Technologie von Borland, sieht dem Borland-Produkt JBuilder also recht ähnlich. Die Oracle-Version bietet neben besseren Möglichkeiten der Datenbankanbindung auch die Entwicklung in Java 1.1.7 und Java 1.2. Auf die Implementierung in Java 1.2 wurde verzichtet, da verschiedene Probleme bei den aktuellen VM-Implementierungen (und Plug-Ins) für die Web-Browser bekannt sind. 3.2 Installation der HTML-Seite auf dem OAS Es hat sich herausgestellt, daß das Laden der HTML-Seite mit dem clientseitigen Applet von der lokalen Festplatte nicht möglich ist. Aus diesem Grund wurden die Dateien im Oracle Application Server (OAS) installiert. Dieser Teil der Installation verlief problemlos. 3.3 Netscape Navigator 4.6 und Internet Explorer 5 Plug-In für Java 1.1 Da die Version 4.6 des Navigators nur Java 1.1.5 unterstützt, muß ein spezielles Java Plug-In installiert werden. Dieses Plug-In kann von Sun's Java-Website (http://java.sun.com) 9 Es ist natürlich möglich, andere Java-Versionen (z.B. eben 1.1.7) in den JBuilder zu integrieren. Problematisch ist es allerdings, den integrierten GUI-Builder auf den neuen Namensraum "umzurüsten". Von daher ist es sicher sinnvoller, auf eine Entwicklungsumgebung umzusteigen, welche die gewünschte JavaVersion bietet. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VI: 3. Probleme bei der Implementierung 136 heruntergeladen und problemlos installiert werden. Allerdings ist zusätzlich eine Änderung im HTML-Code der entsprechenden Web-Seite nötig. Diese Änderung kann manuell durchgeführt werden, ist allerdings relativ kompliziert. Deshalb findet man auf derselben Website noch einen HTML-Converter (htmlconv10-win32.exe), der vor dem Start des Applets das Plug-In startet. Der Internet Explorer 5 unterstützt prinzipiell kein RMI, weshalb auch hier das Java Plug-In nötig ist. Will man dieses Plug-In nicht verwenden (aus entsprechenden Newsgroups geht hervor, daß bei der Verwendung des Plug-Ins Probleme bei der Verwendung von JavaScript auftreten können) muß man ein spezielles RMI-Paket installieren. Dieses Paket (rmi.zip) zu finden ist relativ schwierig; die genaue Adresse ist ftp://ftp.microsoft.com/developr/ MSDN/UnSup-ed/rmi.zip. 3.4 Probleme mit Oracle's JDeveloper 2.0 Es hat sich herausgestellt, daß das Deployment-Tool des JDeveloper nicht ganz korrekt arbeitet. Unter Umständen muß das Deployment-Profile von Hand nachgebessert werden. Im einzelnen mußte hinzugefügt werden: • Das JBCL-Paket von Borland (bei der Verwendung des GUI-Builders). Hier sollte man aber die nicht benötigten Dateien aus dem ZIP-File entfernen. • Das Stub-File des QueryAdapters • Das Remote-Interface QueryRemote • Verschiedene Inner Classes von XQTFrame • Das JAR-File des Microstar-Parsers AElfred • Das JAR-File des ChartBeans Perspective Insgesamt gesehen keine unlösbaren Probleme, auch wenn es etwas seltsam ist, daß die Installation eines JAR-Files bei einer professionellen Entwicklungsumgebung von Oracle nicht unproblematischer ist. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 1. Überblick über XML-Software Teil VII: 137 Anhang 1 Überblick über XML-Software Die Seite http://www.stud.ifi.uio.no/~lmariusg/linker/XMLtools.html bietet eine hervorragende Übersicht über frei verfügbare XML-Software. Die Seite wird regelmäßig auf den neuesten Stand gebracht und kann als vollständige Übersicht bezeichnet werden. Eine weiter wichtige XML-Seite mit zahlreichen Tools ist die AlphaWorks-Seite von IBM: http://www.alphaworks.ibm.com/tech/xmitoolkit. Die im folgenden angegebenen Links wurden am 30. August 1999 aktualisiert und sind größtenteils auf oben genannten Websites zu finden. 1.1 XML-Parser Es existieren zahlreiche XML-Parser und andere XML-Tools zum Programmieren oder Editieren. Die XML-Parser unterstützen eine breite Palette von Programmiersprachen (C, C++, Delphi, Java, Python, ...) und können – zumeist im Sourcecode – kostenfrei aus dem Web heruntergeladen werden. AElfred Version 1.2a In Java implementierter, SAX-basierter XML-Parser von Microstar. Zu finden unter [Microstar 99]. Dieser Parser ist aufgrund des geringen Codeumfangs (56k) vor allem zur Verwendung in Java-Applets geeignet. expat Version 1.1 Expat ist ein nicht-validierender XML-Parser von James Clark. Der Parser ist in C geschrieben; die Java-Version heißt XP. Zu finden auf http://www.jclark.com/xml/expat.html. Microsoft's XML-Parser Dieser Parser wurde als COM-Komponente realisiert. Zu finden auf Microsoft's Website: http://msdn.microsoft.com/downloads/tools/xmlparser/xmlparser.asp. Auch als Java-Version – und hier sogar im Sourcecode – erhältlich. Project X Technology Release 2 Der XML-Parser von Sun liegt hier im "Technology Release 2" unter dem Codenamen Java Project X vor. Es ist anzunehmen, daß dieses Klassenpaket in zukünftigen Java-Versionen fester Bestandteil der API wird. Der Project X-Parser ist vollständig in Java implementiert und liegt im Quellcode vor. Der DOM-basierte Parser ist optional validierend oder nicht-validierend. Online erhältlich unter http://developer.java.sun.com/developer/earlyAccess/xml/. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 1. Überblick über XML-Software 138 XML Parser Component for Delphi Version 2.0 Die Firma ICOM Datenverarbeitungs GmbH bietet Komponenten zur XML-Verarbeitung für Delphi4 zum Download an. Der Quellcode dieser Komponenten ist allerdings kostenpflichtig. Online erhältlich unter http://www.icom-dv.de/xml/. XP Version 0.5 Java-Version von expat. Zu finden unter http://www.jclark.com/xml/xp/. 1.2 XSL-Prozessoren Alle hier vorgestellten Prozessoren können als Java-Servlet eingesetzt werden. Damit ist die serverseitige Konvertierung von XML in HTML kein Problem mehr. LotusXSL Dieser DOM-basierte XSL-Prozessor ist auf IBM's AlphaWorks-Seite unter http://www.alphaworks.ibm.com/formula/LotusXSL zu finden. Schön ist, daß auch eine ServletImplementierung erhältlich ist. XT XT ist der SAX-basierte XSL-Prozessor von James Clark. Auch hier ist ein Servlet-Wrapper zur Verwendung von XT als Java-Servlet vorhanden. Zu finden auf http://www.jclark.com/xml/xt.html. 1.3 XML-Browser Microsoft Internet Explorer 5.0 Bester verfügbarer XML-Browser. Ein XML-Dokument kann entweder als Parse-Baum oder HTML-Dokument angezeigt werden. Für die Transformation in HTML wird CSS und XSLT verwendet. Online erhältlich unter http://www.microsoft.com/windows/ie/default.htm. Mozilla (Netscape Navigator Version 5) – Milestone 9 Mozilla ist zwar online erhältlich (http://www.mozilla.org/projects/seamonkey/release-notes/), allerdings ist diese Version noch nicht einmal eine Alpha-Release. Schade ist auch, daß trotz der erheblichen Verspätung zum Microsoft-Browser keine neuere Technologie (XSL) angewandt wird, sondern lediglich XML-Dokumente mit CSS in HTML umgewandelt werden. 1.4 Sonstige XML-Software Clip! Version 1.52 Clip! ist ein schöner XML-Editor der Firma Techno2000, der inzwischen in der Version 1.52 erhältlich ist. Die kalifornische Firma bietet auch XML-Consulting zu Themen wie DTD-Design Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 1. Überblick über XML-Software 139 an. Finden kann man den XML-Parser unter http://www.t2000-usa.com/product/clip_index.html. Es ist möglich, eine 30-Tage-Demoversion herunterzuladen. Im Gegensatz zu vielen anderen XML-Editoren ist dies kein aufgerüsteter HTML-Editor sondern ein professioneller XML-Editor mit Funktionen zur Validierung eines XML-Dokumentes oder zur Generierung einer DTD aus einem wohlgeformten XML-Dokument. Programmiert wurde Clip! in Java. DB2XML Sehr schönes Query-Tool von Volker Turau, mit dem Datenbankabfragen mit anschließender XML-Generierung möglich sind. Die DB2XML-Website ist http://www.informatik.fhwiesbaden.de/~turau/DB2XML/. Dieses Tool arbeitet ähnlich wie der Prototyp meiner Diplomarbeit und ist ebenfalls in Java geschrieben. Schwerpunkt ist allerdings die Transformation von Anfrageergebnissen in XML; eine Report-Funktionalität ist nicht vorhanden. RTF2XML Version 0.6 Dieser freie (GNU-Lizenz) RTF-Konvertierer ist in der Version 0.6 erhältlich. Man benötigt allerdings noch die OmniMark-Programmiersprache (http://www.omnimark.com/) dazu. Die Entwicklungsumgebung OmniMark Home and School ist in einer Vollversion kostenlos erhältlich. Ausprobiert habe ich RTF2XML allerdings nicht. Erhältlich auf der Seite http://www.xmeta.com/omlette/. XMI Toolkit Mit diesem Toolkit sind Konvertierungen zwischen den Case-Tools von Rational Rose und XMI möglich. Online erhältlich unter http://www.alphaworks.ibm.com/tech/xmitoolkit. XML Notepad Version Beta 1.5 Microsoft's XML-Editor ist noch im Beta-Stadium, läuft aber schon recht stabil. Es ist möglich, XML-Dokumente in Baumansicht zu editieren. In Verbindung mit dem Internet Explorer 5.0 ist eine Validierung möglich. Zu finden unter http://msdn.microsoft.com/xml/notepad/intro.asp. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 2. Überblick über EJB-Produkte 2 Überblick 140 über EJB-Produkte 2.1 Persistence PowerTier Dieses Tool ist eine Kombination aus Applikationsserver und EJB-Entwicklungstool. Der Kern von PowerTier ist das Mapping eines Objektmodells in Relationen einer Datenbank. Man kreiert also einige Klassen, definiert die Beziehungen (1..*, 0..1, ...) und klickt auf "Generate Code". PowerTier generiert den gesamten Code in einem Schritt und konfiguriert gleichzeitig den Deskriptor und entsprechende Umgebungsvariablen. Damit ist der Zugriff auf die Datenbank vollkommen transparent. Relationen werden wie Objekte angesprochen; die Attribute der Relation sind aus der Sicht des Entwicklers einfach Variablen und Tupel der Relation sind Instanzen der entsprechenden Klasse. Das Konzept der PowerTier-Software ist sinnvoll, wenn schnelle Lösungen präsentiert werden sollen. Der Entwicklungsaufwand ist gering und die Entwicklungszeit ist niedrig. Probleme macht allerdings die feste Abbildung der Datenbanktabellen in Enterprise JavaBeans – nicht sehr flexibel. Persistence-Website: http://www.persistence.com/. 2.2 BEA WebLogic Application Server Dieser Applikationsserver ist einer der wenigen Server, die schon jetzt eine vollständige Unterstützung der EJB-Spezifikation 1.0 (einschließlich Entity-Beans) bieten. WebLogic liefert sogar einen komfortablen Deployment Wizard für Enterprise JavaBeans mit: Abbildung VII-1: Tengah EJB Deployment Wizard Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 2. Überblick über EJB-Produkte 141 Leider bieteten die mitgelieferten Tools keine Unterstützung für die Entwicklung von Enterprise JavaBeans. Auf der BEA-Website (http://www.beasys.com/) sind nicht nur zahlreiche Papers zu finden, man kann den Webserver sogar in einer 30-Tage-Version herunterladen. 2.3 Oracle Application Server 4.0.7 (OAS) Der OAS ist ein weitverbreiteter, stabiler und erprobter Applikationsserver für EnterpriseAnwendungen. In der Version 4.0.7 gibt es allerdings nur eine eingeschränkte Unterstützung von Enterprise JavaBeans. So werden beispielsweise keine Entity-Beans unterstützt und auch die Installation von EJB-Komponenten gestaltet sich schwierig. Ein Deployment Wizard wie ihn etwa BEA Weblogic anbietet, wäre hier eine wichtige Unterstützung für den Entwickler. OracleWebsite: http://www.oracle.com/. 2.4 EJBoss Version 0.7 Der EJBoss-Server ist ein interessantes Open-Source-Projekt. Scheint allerdings noch in einem relativ frühen Entwicklungsstadium zu sein, ist also für professionelle Projekte (noch) kaum zu gebrauchen. Zu finden auf http://www.ejboss.org. 2.5 EJBHome Version 0.5.1 Freier EJB-Server mit schöner Dokumentation und gut lesbarem Tutorial. Erhältlich unter http://ejbhome.iona.com. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 3. Zuordnung SQL/Java-Datentypen 3 Zuordnung 142 SQL/Java-Datentypen Die folgende Tabelle wurde aus [OrfHar 98] entnommen. SQL Datatype Java Datatype Notes char String varchar String Typically, up to 32K characters. longvarchar String Multimegabytes. Can be retrieved using Java streams. numeric java.math.BigDecimal Fixed point. Used for currency. decimal java.math.BigDecimal Fixed point. Requires absolute precision. Can be used for currency. bit boolean tinyint byte 8-bit values. smallint short 16-bit values. integer int 32-bit values. bigint long 64-bit values. real float 7 digits of mantissa precision. double double 15 digits of mantissa precision. float double 15 digits of mantissa precision. binary byte[] varbinary byte[] Typically, up to 32 Kbytes. longvarbinary byte[] Multimegabytes. Can be retrieved using Java streams. date java.sql.Date Uses ISO "yyyy-mm-dd" time java.sql.Time Uses ISO "hh-mm-ss" timestamp java.sql.Timestamp Provides nanosecond precision. Tabelle VII-1: Zuordnung SQL/Java-Datentypen Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 143 4 Literatur "In der Wissenschaft lese man vorzugsweise die neuesten Werke, in der Literatur die ältesten." Edward George Bulwer-Lytton Anmerkung zu den Literaturangaben: "Online erhältlich" bedeutet stets, daß die entsprechende Literatur kostenlos heruntergeladen werden kann. Ist eine HTML-Adresse ohne diesen Zusatz angegeben, dann ist sie lediglich als Referenz auf die Homepage bzw. die Firma der Autorin oder des Autoren zu verstehen. [alphaWorks 99] Lotus XSL Prozessor v0.17.4 IBM alphaWorks 1999 Online erhältlich: http://www.alphaworks.ibm.com/tech/LotusXSL Dieser XSL-Prozessor unterstützt den Working Draft des W3C vom 24. April 1999 [W3C 99a]. Die empfehlenswerte alphaWorks-Seite von IBM gibt EntwicklerInnen die Möglichkeit, aktuelle IBM-Technologien einzusetzen, die IBM gerade aktuell erforscht. [Appleton 97] Patterns and Software: Essential Concepts and Terminology Brad Appleton Online erhältlich: http://enteract.com/~bradapp/docs/patterns-intro.html [Behme 98a] Mauerwerk en détail (Fortschritte im XML-Umfeld: Metadaten) Henning Behme iX-Artikel in Ausgabe 1/98 Online erhältlich: http://www.heise.de/ix/raven/Web/xml/papers.html [Behme 98b] Daten verpflichten (XSL: die Stil-Sprache für XML) Henning Behme iX-Artikel in Ausgabe 5/98 Online erhältlich: http://www.heise.de/ix/raven/Web/xml/papers.html [Behme 98c] Faulheit siegt (HTML-Seiten aus Datenbeständen über XML generieren) Henning Behme iX-Artikel in Ausgabe 11/98 Online erhältlich: http://www.heise.de/ix/raven/Web/xml/papers.html Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 144 [Behme 99a] Ein Titel ist ein Titel (Namensräume in der Extensible Markup Language) Henning Behme iX-Artikel in Ausgabe 5/99 Online erhältlich: http://www.heise.de/ix/raven/Web/xml/papers.html [BehmeMintert 98a] Klammern gehört zum Handwerk (DSSSL: XML-Dokumente fürs Web formatieren) Henning Behme, Stefan Mintert iX-Artikel in Ausgabe 3/98 Online erhältlich: http://www.heise.de/ix/raven/Web/xml/papers.html [BehmeMintert 98b] XML in der Praxis Stefan Mintert, Henning Behme Addison-Wesley 1998, http://www.mintert.com/xml [BerRauSih 97] Using UML for Modeling a Distributed Java Application Klaus Bergner, Andreas Rausch, Marc Sihling Technische Universität München 1997 Online erhältlich: http://www4.informatik.tu-muenchen.de [Bosak 97] XML, Java and the Future of the Web Jon Bosak Seybold Publications, O'Reilly & Associates, Inc. 1997 Online erhältlich: http://www.xml.com/xml/pub/w3j/s3.bosak.html [Bosak 99] The Shakespeare XML demo John Bosak Online erhältlich: http://www.hypermedic.com/style/shakespeare/index.htm Hier kann man Shakespeare's Werke in XML herunterladen. Auch die Bibel und der Koran sind erhältlich. [Bray 98] An Introduction to XML Processing with Lark and Laval Tim Bray Textuality 1998, Online erhältlich: http://www.textuality.com/Lark/ Von dieser Seite lassen sich auch die entsprechenden Tools herunterladen. [Brügge 98] Componend-based Software Development Bernd Brügge, Technische Universität München Online erhältlich: http://wwwbruegge.in.tum.de/teaching/lectures/cbse98/schedule.html Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 145 [Buschmann 98] Pattern-orientierte Sofware-Architektur Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal Addison-Wesley 1998, http://www.addison-wesley.de [Buxmann 99] Peter Buxmann XML – Die Extensible Markup Language Johann Wolfgang Goethe-Universität Frankfurt, Lehrstuhl für Betriebswirtschaftslehre 1999 Booklet aus mehreren Artikeln des Competence Centers XML. Online erhältlich: http://xml.cnec.org Eine der besten Veröffentlichungen zum Thema XML – und noch dazu kostenlos erhältlich. [Chappell 98] MTS vs. EJB David Chappel Online erhältlich: http://www.chappellassoc.com/art5.htm [Clark 98] XML Resource Center James Clark 1998, http://www.jclark.com/xml/ Kein Artikel oder Paper, sondern verschiedene freie und sehr populäre XML-Tools zum herunterladen. [Cleeland 99] A Response to David Chappell's "MTS versus EJB" [Chappell 98] Chris Cleeland Online erhältlich: http://siesta.cs.wustl.edu/~cleeland/ejbmts-response.html [Costello 99] Cellphone Project Roger Costello et al Mitwirkende: http://www.geocities.com/ResearchTriangle/Facility/5136/contributors.html Referenzimplementierung: http://128.191.16.34:8080/supplier/cprus/login.htm Herausragende E-Commerce-Implementierung auf XML-Basis. Professionell und sehr aufwendig gestaltet. Verwendet sehr ausgiebig JavaScript und XML (z.B. Drag'n Drop von Produkten in einen Warenkorb mit automatischer Berechnung des Gesamtpreises). [Cover 99] The SGML/XML Web Site Robin Cover, 1999 Online erhältlich: http://www.oasis-open.org/cover/ Referenz-Seite mit allen wichtigen Informationen, Spezifikationen, Links und Beispielen zu SGML und XML. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 146 [Englander 97] Developing Java Beans Robert Englander O'Reilly & Associates, Inc., 1997, http://www.oreilly.com [Flanagan 97] Java in a Nutshell, 2nd edition David Flanagan O'Reilly & Associates, Inc., 1997, http://www.oreilly.com Unentbehrliches Java-Handbuch aus der O'Reilly Nutshell-Edition. [Flanagan 98] Java Examples in a Nutshell David Flanagan O'Reilly & Associates, Inc., 1997, http://www.oreilly.com Bestes erhältliches Java-Programmierhandbuch mit Programmbeispielen. Gute Ergänzung zu [Flanagan 97]. vielen (auf Anhieb lauffähigen) [Gmeiner 99] Objektorientierte Softwareentwicklung, Skriptum Lothar Gmeiner, FH Karlsruhe, 1999 FH Karlsruhe, Fachbereich Informatik: http://www.fh-karlsruhe.de/fbi/html/Welcome.html [GoF 96] Entwurfsmuster Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (Gang of Four) Addison-Wesley 1996, http://www.addison-wesley.de Auch Jahre nach der Erstveröffentlichung ist das Entwurfsmusterbuch der Gang of Four (GoF) das beste Buch zum Thema Software-Engineering überhaupt. [Gremminger 98a] Datenbanken, Skriptum Klaus Gremminger, FH Karlsruhe, 1999 FH Karlsruhe, Fachbereich Informatik: http://www.fh-karlsruhe.de/fbi/html/Welcome.html [Gremminger 98b] Verteilte Informationssysteme, Skriptum Klaus Gremminger, FH Karlsruhe, 1999 FH Karlsruhe, Fachbereich Informatik: http://www.fh-karlsruhe.de/fbi/html/Welcome.html [Hobbs 97] Datenbanken programmieren mit JDBC Ashton Hobbs SAMS Publishing 1997, http://www.mut.com Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 147 [Holman 99] What's the Big Deal with XSL? G. Ken Holman Crane Softwrights Ltd. 1999 Online erhältlich: http://www.xml.com/1999/04/holman/gkh-19990418.xml [ICOM 99] XML Parser Component for Delphi ICOM Datenverarbeitungs GmbH, 1998, http://www.icom-dv.de/xml/ Delphi/C++ Komponenten zum Parsen von XML-Dokumenten. [Idris 99] XML and Java Tutorial Part 1,2,3 Nazmul Idris The Bean Factory 1999, http://developerlife.com/ibmvssunparsercomparison/sunVsIbm.html [ISO 8879] ISO (International Organization for Standardization). ISO 8879:1986(E). Standard Generalized Markup Language (SGML). First edition - 1986-10-15. [Javaworld 99] The state of Java Middleware, Part 2: Enterprise JavaBeans Javaworld 1999, http://www.javaworld.com Online erhältlich: http://www.javaworld.com/javaworld/jw-04-1999/jw-04-middleware.html Bestes Online-Magazin zum Thema Java-Entwicklung. Die Artikel sind prinzipiell aus der Entwicklersicht geschrieben, d.h. sie enthalten getestete Codebeispiele oder andere Programmierhinweise. [JEDI 99] Projekt JEDI (Java Extraktion und Dissemination von Information) GMD – German National Research Center for Information Technology http://www.darmstadt.gmd.de/oasys/projects/jedi/jedid.html [Johnson 99] XML JavaBeans Part 1,2,3 Mark Johnson JavaWorld 7/1999, http://www.javaworld.com Online unter: http://www.javaworld.com/javaworld/jw-07-1999/jw-07-beans.html [Klute 98] JDBC in der Praxis Rainer Klute Addison-Wesley 1998, http://www.addison-wesley.com Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 148 [Koh 99] Sun vs. IBM XML Parser : A performance comparison Sun Koh The Bean Factory 1999, http://developerlife.com/ibmvssunparsercomparison/sunVsIbm.html [KolBusRos 96] Discrete Mathematical Structures, 3rd edition Bernard Kolman, Robert C. Busby, Sharon Ross Prentice Hall 1996 [Larman 98] Applying UML and Patterns Craig Larman Prentice Hall 1998 [Light 97] Presenting XML Richard Light Sams.net Publishing 1997, http://www.samspublishing.com [Macherius 97] Revolution der Experten Ingo Macherius iX-Artikel in Ausgabe 6/97 Online erhältlich: http://www.heise.de/ix/raven/Web/xml/papers.html [Microsoft 98] Comparing Microsoft Transaction Server to Enterprise JavaBeans Microsoft Corporation 1998 Online erhätlich: http://outlook.microsoft.com/com/wpaper/mts-ejb.asp [Microsoft 99] Getting Started with XSL Microsoft Corporation 1999 Online erhältlich: http://msdn.microsoft.com/xml/XSLGuide/xsl-overview.asp Sehr gute XSL-Einführung, die besonderen Wert auf schnelle Ergebnisse bei der Transformation von XML in HTML legt. Schon das erste Beispiel zeigt, wie man mit XML-Daten HTML-Tabellen erstellt und auffüllt. [Microstar 99] AElfred 1999, Microstar Online erhältlich (Doku und Software): http://www.microstar.com/aelfred.html Frei verfügbarer, SAX-basierter XML-Parser. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 149 [Mintert] siehe [BehmeMintert] [Monson-Haefel 99] Enterprise JavaBeans Richard Monson-Haefel O'Reilly 1999, http://www.oreilly.com Bislang einziges in Deutschland erhältliches Buch über Enterprise JavaBeans (das leider erst nach weitgehender Fertigstellung meiner Diplomarbeit erschienen ist). Neben zahlreichen (getesteten) Codebeispielen und einer umfassenden Einführung gibt es viele Abbildungen (z.B. Sequenz- und Zustandsdiagramme). Insgesamt gesehen ein sehr gutes Buch zum Thema, das sich vor allem mit komplexen Beispielen und Anwendungen aus der Praxis befaßt. [MowMal 97] CORBA Design Patterns Thomas J. Mowbray, Raphael C. Malveau Wiley Computer Publishing 1997, http://www.wiley.com/compbooks [Müller 99] Objektorientierte Prozeßmodelle Gunter Müller-Ettrich Addison-Wesley, 1998 http://www.addison-wesley.de [ObjectWatch 98a] CORBA vs. EJB vs. MDCA: The Battle For The Middle Tier ObjectWatch Newsletter Number 12 Online erhältlich: http://www.objectwatch.com/issue12.htm [ObjectWatch 98b] In The Fishbowl: Scalability in EJB and MTS ObjectWatch Newsletter Number 18 Online erhältlich: http://www.objectwatch.com/issue18.htm [OrfHar 98] Client/Server Programming with Java and CORBA, 2nd edition Robert Orfali, Dan Harkey Wiley Computer Publishing, 1998, http://www.wiley.com/compbooks [SAX 98] SAX 1.0: The Simple API for XML David Megginson und andere Online erhältlich: http://www.megginson.com/SAX SAX ist eine ereignisbasierte API, die von den Mitgliedern der XML-DEV Mailingliste entwickelt wurde. Die API selbst ist Public Domain; es existieren verschiedene freie Implementierungen (z.B. Microstar's AElfred -Parser [Microstar 99]). Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 150 [SouGar 99] Formal Modeling of the Enterprise Java Beans(tm) Component Integration Framework Joao Pedro Sousa, David Garlan Carnegie Mellon University (Pittsburgh), Online erhältlich: http://pecan.srv.cs.cmu.edu/afs/cs/project/able/www/able/papers_bib.html [Sun 99a] JavaBeans Specification 1.01 Sun Microsystems, 1999 Online erhältlich: http://java.sun.com/beans/docs/spec.html [Sun 99b] Remote Method Invocation Specification RMI Whitepapers RMI Examples RMI Specification Sun Microsystems, 1999 Online erhältlich: http://java.sun.com/products/jdk/1.1/docs/guide/rmi/index.html [Sun 99c] Enterprise JavaBeans Specification 1.1, Public Draft 3 Sun Microsystems, 1999 Online erhältlich: http://java.sun.com/products/ejb/docs.html [Sun 99d] JDBC 2.0 Core API Specification JDBC 2.0 Standard Extension Specification Sun Microsystems, 1999 Online erhältlich: http://java.sun.com/products/jdbc/download.html [Sun 99e] JDBC Data Access API - For Driver Writers Sun Microsystems, 1999 Online erhältlich: http://java.sun.com/products/jdbc/driverdevs.html [Thomas 98a] Enterprise JavaBeans Technology – Server Component Model for the Java Platform Anne Thomas Patricia Seybold Group 1998, http://www.psgroup.com Online erhältlich: http://java.sun.com/ejb [Thomas 98b] Container-Managed Persistence – EJB Persistence Mechanisms Anne Thomas Patricia Seybold Group 1998, http://www.psgroup.com Online erhältlich: http://www.persistence.com Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 151 [Thomas 98c] Selecting Enterprise JavaBeans Technology Anne Thomas Patricia Seybold Group 1998, http://www.psgroup.com Online erhältlich: http://www.weblogic.com [ThreeDGraphics 99] Three D Graphics Web: http://www.threedgraphics.com/ Hersteller des Chart-Beans "Perspective", das in der Diplomarbeit verwendet wurde. [Tichy 99] Entwurfsmuster, Foliensammlung Walter Tichy Universität Karlsruhe (TU) 1999, http://www.uni-karlsruhe.de Online erhältlich: http://wwwipd.ira.uka.de/~tichy/ Sehr schöne Foliensammlung zur Vorlesung. Mit vielen Anwendungsbeispielen. [TichyUngerGramberg 98] Informatik 1, Skriptum Walter Tichy, Barbara Unger, Oliver Gramberg Universität Karlsruhe, http://www.uni-karlsruhe.de Skriptum online unter http://wwwipd.ira.uka.de/~info1/ Skriptum zur Softwareentwicklung mit Java, Einführung in objektorientierte Softwareentwicklung, Einführung ins Java-Swing/AWT-Paket und im Theorieteil unter anderem Grammatiken, Rekursion und Datenstrukturen. [UXF 99] UML Exchange Format & Pattern Markup Language Keio University, Yokohama Online erhältlich: http://www.yy.cs.keio.ac.jp/~suzuki/project/uxf/ Regelmäßig aktualisierte UXF-Website mit allen wichtigen Dokumenten und Spezifikationen zum Thema. [WalshGrosso 99] XSL Tutorial Norman Walsh, Paul Grosso XML Conference in Seattle, 24. März 1998 Online erhältlich: http://www.nwalsh.com/docs/tutorials/xml98/index.html Hervorragendes XSL-Tutorial mit vollständigen XML- und XSL-Dokumenten, zahlreichen Beispielen und Erklärungen. Beste XSL-Einführung, die mir bekannt ist. [WillMoran 97] Java Database Programming: Servlets & JDBC Alan R. Williamson, Ceri L. Moran Prentice Hall, 1997 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 152 [Wired 95] The Curse of Xanadu Gary Wolf Wired Magazine 1997, http://www.wired.com/wired/archive/people/ted_nelson/ [W3C 97] Web Style Sheets World Wide Web Consortium (W3C), http://www.w3.org W3C 1997 (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University) Online erhältlich: http://www.w3.org/Style/ Viele Links zu XSL, DSSL und CSS. [W3C 98a] XML 1.0 Recommendation World Wide Web Consortium (W3C), http://www.w3.org W3C 1998 (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University) Online erhältlich: http://www.w3.org/TR/1998/REC-xml-19980210 (englisch) http://www.mintert.com/xml/trans/REC-xml-19980210-de.html (deutsche Übersetzung) [W3C 98b] Document Object Model (DOM) Level 1 Specification World Wide Web Consortium (W3C), http://www.w3.org W3C 1998 (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University) Online erhältlich: http://www.w3.org/TR/REC-DOM-Level-1/ [W3C 99a] Extensible Stylesheet Language (XSL) Specification World Wide Web Consortium (W3C), http://www.w3.org W3C 1998 (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University) Online erhältlich: http://www.w3.org/TR/WD-xsl/ [W3C 99b] XSL Transformations (XSLT) Version 1.0 World Wide Web Consortium (W3C), http://www.w3.org W3C 1998 (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University) Online erhältlich: http://www.w3.org/TR/WD-xslt Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 4. Literatur 153 [W3C 99c] Document Object Model (DOM) Level 2 Specification World Wide Web Consortium (W3C), http://www.w3.org W3C 1998 (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University) Online erhältlich: http://www.w3.org/TR/WD-DOM-Level-2/ [XMI 99] DSTC's Meta-Object Facility Publications Online erhältlich: http://www.dstc.edu.au/Research/Projects/MOF/Publications.html Informationen zum XMI-Format (XML-Based Metadata Interchange). [XML/EDI 99] Guidelines for using XML for Electronic Data Interchange XML/EDI-Group http://www.geocities.com/WallStreet/Floor/5815/guide.htm Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 5. Glossar 154 5 Glossar Hier sind einige ausgewählte Middleware-Begriffe zusammengestellt. Ich habe mich hier auf die englischsprachigen Bezeichnungen beschränkt. Application Server Ein Applikationsserver (z.B. Oracle Application Server) ist eine Serversoftware, die eine Infrastruktur zur Installation von Server-Komponenten (z.B. Enterprise JavaBeans oder HTMLSeiten) bietet und entsprechende Dienste über ein Netzwerk zur Verfügung stellt. Bean-managed Persistence Eine EJB verwaltet ihren Zustand selbst (im Unterschied zu Container-managed persistence). Component Transaction Manager (CTM) Komponentenbasierter Transaktions-Manager, der verteilte Transaktionen koordiniert. Container-managed Persistence Die Zustandsverwaltung einer EJB wird vom EJB-Container bzw. vom EJB-Server übernommen. CORBA OMG-Standard für verteilte Objektdienste. Akronym für Common Object Request Broker Architecture. CTM Component Transaction Manager DCOM Microsoft's Modell für verteilte Objektdienste. Akronym für Distributed Component Object Model. DTD Dokumenttyp-Definition. EJB Enterprise JavaBeans. Enterprise JavaBeans Sun's Standard für Serverkomponenten. Entity-Bean Eine EJB, die Daten einer Datenbank repräsentiert (vgl. Session-Bean). Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 5. Glossar 155 IIOP CORBA-Protokoll zur Kommunikation verschiedener ORBs. Akronym für Internet Inter-ORB Protocol. Java Naming and Directory Interface (JNDI) Java-API zum Zugriff auf verteilte Dienste. JDBC Java-API zum Datenbankzugriff. Akronym für Java Database Connection. JNDI Java Naming and Directory Interface. JVM Java Virtual Machine. Middleware Serversoftware, die für die Kommunikation zwischen Client- und Serverapplikationen inklusive Datenbankzugriff zuständig ist. Beispiele: EJB, CORBA, RMI. OMG Organisation, die Standards für objektorientierte Anwendungen entwickelt. Akronym für Object Management Group. Persistence Erhalten eines bestimmten Zustandes über längere Zeit. Üblicherweise wird für das Speichern eines Zustandes eine Datenbank benutzt. RMI Java-Protokoll für einen entfernten Methodenaufruf. Akronym für Remote Method Invocation. RMI over IIOP Verwendung des CORBA-Protokolls IIOP von einer RMI-Schnittstelle aus. Session-Bean Eine EJB, die normalerweise Geschäftsprozesse implementiert und Sitzungen mit Clients verwaltet. Skeleton Serverkomponente, die entfernte Methodenaufrufe entgegennimmt. SQLJ Standard für die Einbettung von SQL-Befehlen in ein Java-Programm Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 5. Glossar 156 Stub Clientseitiges Gegenstück zum Skeleteon. Dient als Schnittstelle zwischen Client-Software und dem serverseitigen Skeleton. XML Extensible Markup Language. XSL Extensible Stylesheet Language. Stylesheet-Sprache für XML. XSLT Untermenge von XSL zur Transformation von Strukturbäumen. Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 6. Index 157 6 Index 3 3-stufige Architekturen ................................................. 57 A Application Assembler.................................................. 59 B EJB Server.....................................................................61 EJB-API ........................................................................69 EJB-Transaktionsmodell ...............................................67 Electronic Data Interchange ..........................................17 Embedded SQL .............................................................73 Entity-Beans ..................................................................66 Entwicklung von Beans.................................................46 Entwurfsziele.................................................................23 ereignisbasierte API ......................................................31 ESQL.............................................................................73 Extensible Stylesheet Language ..............................25, 26 F baumbasierte API.......................................................... 32 beanverwalteter Persistenz............................................ 67 Beziehungen zwischen einem EJB-Server und einem EJBContainer.................................................................. 60 C Call Level Interface....................................................... 74 Cascading Style Sheet................................................... 25 CLI................................................................................ 74 Component Transaction Monitors................................. 55 containerverwaltete Persistenz ...................................... 67 CSS ............................................................................... 25 CTM.............................................................................. 55 D Definitionen von Enterprise JavaBeans ........................ 55 Deployment Descriptor ................................................. 64 Document Object M...................................................... 31 Document Object Model............................................... 32 Document Style Semantics and Specification Language25 Dokument ..................................................................... 19 Dokumenttyp-Definition............................................... 30 DOM....................................................................... 31, 32 DSSSL .......................................................................... 25 DTD ........................................................................ 24, 30 dynamic class loading ................................................... 52 dynamisches Laden von Klassen .................................. 52 E EDI................................................................................ 17 Eigenschaften................................................................ 45 Eigenschaften mit Constraints ...................................... 46 einwertige Eigenschaften .............................................. 46 EJB Container ............................................................... 61 EJB Provider................................................................. 59 Framework ....................................................................40 G gebunde Eigenschaften..................................................46 Gebunde Eigenschaften .................................................46 Generic Markup.............................................................21 Grammatik.....................................................................30 Gültigkeit.......................................................................31 H Home Interface ..............................................................63 HTML............................................................................21 Hypertext.......................................................................16 I indizierte Eigenschaften ................................................46 Indizierte Eigenschaften ................................................46 Installation von RMI-Anwendungen .............................52 Introspektion..................................................................44 J JAR................................................................................47 Java Database Connectivity...........................................73 JavaBeans ......................................................................43 JDBC .............................................................................73 JDBC-API .....................................................................77 JDBC-Treibertypen .......................................................75 K Klassenbibliothek ..........................................................40 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences Teil VII: 6. Index 158 Komponente.................................................................. 40 Komponenten................................................................ 39 Komponentenbibliotheken ............................................ 41 Komponenten-Bibliotheken .......................................... 41 Komponenten-Frameworks........................................... 41 M Manifest-File................................................................. 47 Metasprache .................................................................. 23 Migration von Legacy-Anwendungen zu Java-basierten Systemen .................................................................. 57 N Nachteile von EJB ........................................................ 59 Nelson........................................................................... 16 O Stylesheet Node Tree.....................................................28 System Administrator....................................................60 T Templates ......................................................................28 Transaktionen und Stored Procedures ...........................80 Transaktionsverhalten von Enterprise JavaBeans..........68 Transformation ..............................................................26 U UML..............................................................................35 UML Exchange Format .................................................36 Unified Modeling Language..........................................35 Unterschiede zwischen JavaBeans und Enterprise JavaBeans .................................................................56 UXF...............................................................................36 V ODBC ........................................................................... 74 Verarbeitung von XML-Dokumenten ...........................31 visuelle Präsentation von Komponenten........................43 Visuelle Programmierung..............................................44 P Programmieren mit JDBC............................................. 78 Programmierung von EJBs ........................................... 71 Properties ...................................................................... 45 W Wartung von Software...................................................38 Wiedereintrittsinvarianz von Entity-Beans....................67 Wohlgeformtheit ...........................................................31 R Reflection...................................................................... 45 Reflexion....................................................................... 44 Remote Method Invocation........................................... 48 Result Node Tree .......................................................... 28 RMI............................................................................... 48 RMI Registry ................................................................ 49 RMI-API ....................................................................... 50 Rollen bei der EJB-Entwicklung................................... 59 S SAX ........................................................................ 31, 33 Server/Container Provider............................................. 60 Session-Beans ............................................................... 65 SGML ........................................................................... 22 Simple API for XML .............................................. 31, 33 Source Node Trees........................................................ 28 SQLJ ............................................................................. 73 Strukturelemente ........................................................... 21 Stylesheet ...................................................................... 25 X Xanadu ..........................................................................16 XMI...............................................................................36 XML..............................................................................16 XML Metadata Interchange...........................................36 XML-Instanz .................................................................26 XML-Parser...................................................................31 XML-Strukturbaum.......................................................27 XSL .........................................................................25, 26 XSLT.............................................................................26 Z Zustandsbehaftetete Session-Beans ...............................65 Zustandslose Session-Beans ..........................................65 Fachhochschule Karlsruhe – Karlsruhe University of Applied Sciences