Lektion 13: Gebrauch von CORBA/IIOP Zugriff auf Domino-Objekte mit Java. ● Kodierung von CORBA befähigten Java-Applets. ● Domino-Implementierung. ● 1 Leitlinien dieser Lektion Während dieser Lektion führt der Kursleiter das CORBA-Applet vom Server vor – dies gibt dem Kurs eine realistischen Eindruck der Arbeit von CORBA. Teilnehmer schließen dann die Übung ab, indem sie wegen der Bequemlichkeit und der Einfachheit des Umgangs mit den Ressourcen die Vorschau im Web-Browser nutzen. Deshalb brauchen die Teilnehmer nicht den Server zu benutzen, um die Übungen abzuschließen. Sie müssen aber unter den Benutzervorgaben im Register Allgemein “CORBA-SERVER (DIIOP) bei Vorschau im Web-Browser starten” aktiviert haben. Die Teilnehmer brauchen Zugriff auf das Java Developer’s Kit 1.1.8 für den Abschluss der Übungen. Diese Lektion enthält die folgenden Übungen: ! ! Übung 13.1: Erweiterung des CorbaCatalogue-Applet. Fortgeschrittene Übung 13.2: Erstellen des CorbaHello-Applet. R5 Courseware-Anwendungs-Referenzen Auf die folgenden Dokumente wird sich in der Lektion bezogen: ! ! ! ! Dokument 13.1 Corba Catalogue Applet. Dokument 13.2 Corba Catalogue (Completed), dies ist die Lösung für Übung 13.1. Dokument 13.3 CorbaHello Applet, die Lösung für die fortgeschrittene Übung 13.2. Dokument 13.4 CorbaCatalog Applet Demonstration, dieses Applet läuft auf dem Server. Modul C: Fortgeschrittene Programmierung 256 Lektion 13: Einsatz von CORBA Diese Lektion erweitert den Java-Code, den wir in der vorherigen Lektion untersuchten. Weiterhin erläutert sie das Schreiben von Applets, die Zugriff auf das Domino Object Model via CORBA nehmen. Lernziele Nach dem Abschluss dieses Lektions sollten Sie: ! ! Vertrauter mit Java und der Art seiner Interaktion mit Domino sein. Wissen, wie Sie einem Applet ermöglichen, das in eine Maske, Seite oder Dokument importiert oder eingebettet ist, CORBA zu nutzen. Weitere Referenzen Das Java-Handbuch des Programmierers ist jetzt in der Domino-Designer-Hilfe-Datenbank zur Dokumentation der Java-Klassen integriert. Die gesonderte Datenbank ist auch erhältlich unter www.notes.net/notesua.nsf. Sie enthält eine vollständige Liste der lotus.domino-JavaKlassen mit unterstützender Dokumentation und Beispielen. Domino R5 and Corba, von John E. Martin, sorgen für eine gute Erklärung der Interaktion von Domino und CORBA. Dieser Artikel ist erhältlich unter www.lotus.com Zeitschätzung Für die Bearbeitung dieser Lektion sind ungefähr 60 Minuten vorgesehen. Modul C: Fortgeschrittene Programmierung 257 Java und Domino-Objekte Alle Java-Programme nutzen die Domino-JavaKlassen, um Code zu erstellen der Domino-Objekte instantiiert. ● lotus.domino.* ist ein Java-Paket, das JavaProgrammierern Zugriff auf das Domino Object Model gibt. ● Das Paket umfasst nicht die Front-end-Klassen - da ein Java-Programm nicht an Front-end-Objekte wie Masken-Events (ungleich LotusScript) angehängt werden kann. ● Dieses Paket wird in Java-Applets, -Anwendungen 26 und -Agenten genutzt. ● Später in der Lektion werfen wir einen genaueren Blick auf die lotus.domino-Klassen. Die Folie soll verdeutlichen, wo sie in das Java und Domino-Modell hineinpassen. Heben Sie die folgenden Punkte hervor: ! Dies ist ähnlich dem, wie LotusScript und OLE auf das Domino Object Model zugreifen. Beispielsweise nutzt LotusScript, das in BASIC geschrieben ist, die LotusScript-Klassen für den Zugriff auf Domino-Objekte. ! Der Domino-Kern ist in C++ geschrieben – keine andere Programmiersprache kann direkt mit dem Domino Object Model kommunizieren. Alle Programmiersprachen außer C++ müssen über ein API in C++ umgewandelt werden, bevor Sie auf ein DominoObjekt zugreifen können. Der Domino-Server mit dem passenden API (entsprechend ein Adapter) schließt diese Umwandlung ab. Beispielsweise wird LotusScript (BASIC-Code) in C++ vom LotusScript-Adapter umgewandelt; Java-Agenten werden vom Server-Java-API umgewandelt (auf das sich auch als JVM oder Java-Adapter bezogen wird); OLE-Befehle werden auch bearbeitet. Dasselbe gilt für CORBA-Objekt-Anforderungen. Der Unterschied zu CORBA liegt darin, dass es tatsächlich eine Schnittstelle (die IDL) zwischen der Sprache, in der die Anforderung codiert ist (gewöhnlich Java - wie in einem Java Applet), und der DominoKern-Sprache (C++) gibt. ! ! Modul C: Fortgeschrittene Programmierung 258 Über Java und Domino Ein Java-Programm muss zur Instantiierung und für den Zugriff auf Domino-Objekte die lotus.domino-Klassen importieren, was wir später in dieser Lektion genauer behandeln. Ein Java-Programm, dass das lotus.domino.*-Paket importiert, kann Instanzen von DominoObjekten erstellen. Beispielsweise kann es Instanzen der aktuellen Datenbank erstellen und anschließend eine Instanz des ersten Dokuments in dieser Datenbank. Jedoch können diese Java-Anweisungen nicht direkt mit dem Domino-Kern kommunizieren. Effektiv macht der Java-Code nur eine Anforderung zur Instantiierung des Domino-Objekts. Ein Java-Programm kann selbst keine Domino-Objekte bekommen, da es in Java geschrieben ist, während Domino-Objekt-Klassen in C++ geschrieben sind. Java kann nicht ohne eine erste Umwandlung mit C++ kommunizieren. Wie Java-Code auf Domino-Objekte zugreift Deshalb muss für jedes Java-Programm, um ein Domino-Objekt zu bekommen, die Anweisung des Java-Programms von einem anderen Programm interpretiert werden. Gewöhnlich ist es ein API, das Java in C++ umwandeln kann. In Domino gibt es jetzt zwei verschiedene Wege, auf denen dies für Java-Programme geschieht: ! Java-Code, der auf lokale Domino-Daten zugreift, wird in C++ umgewandelt, und auch von der entsprechenden Domino-Java-API zurückgewandelt. Die Umwandlung wird entweder von der Local-API (Client-JVM) oder der Server-API (Server-JVM) ausgeführt und hängt vom Typ des Programmes ab und wo und wie es läuft. ! Java-Code, der auf entfernte Domino-Daten zugreift, tut dies via CORBA. CORBA wandelt die Java-Befehle in IDL, sendet das IDL an den Server, und wandelt dann das IDL (entsprechend kein Java mehr) zu C++ und auch umgekehrt. Modul C: Fortgeschrittene Programmierung 259 Java mit entfernten Domino-Objekten Ein Java-Programm, dass lotus.domino.*-Pakete importiert, kann Domino-Objekte instantiieren. Aber dies bedeutet nicht, dass das Programm zum Domino-Kern “spricht” . ● Domino-Objekte sind C++-Klassen - eine Methode zur Anpassung anderer Sprachen an C++ ist für die Kommunikation notwendig. ● Java-Applets greifen auf entfernte Domino-Objekte via CORBA mit der IDL-Schnittstelle zu. CORBA wandelt die Java-“Anfrage” in IDL, sendet die IDL zum Domino-Server und wandelt Sie dann in C++. 2 ● Nutzen Sie das Diagramm in den Teilnehmernotizen, um zu erklären wie Java mit Domino zusammenarbeitet. Heben Sie die folgenden Punkte hervor:: ! ! ! ! Die mittlere Ebene (IDL) macht CORBA so vielseitig. Ist die Anfrage erst einmal in IDL gewandelt, unbeachtet der Sprache, in der die Anfrage erfolgt (es muss nicht Java sein), spielt es keine Rolle mehr für den Server, der die Aufgabe des Austauschs der Anfrage auf der Grundlage von IDL vornimmt. CORBA arbeitet grundsätzlich so: Auf dem Client wandelt CORBA Java zu IDL. Das IDL wird an den Server mit dem IIOP-Protokoll für TCP/IP gesandt. Auf dem Server wandelt CORBA das IDL zu C++, dass dann mit dem Domino-Kern direkt zusammenarbeiten kann. Beachten Sie, wie sich dies von der Art und Weise wie Java-Agenten und Applets auf dem Client mit dem Domino Object Model zusammenarbeiten unterscheidet. CORBA spielt dabei keine Rolle. Der Server nutzt ein separates Port, um auf CORBA-Anforderungen zu achten und zu antworten. Modul C: Fortgeschrittene Programmierung 260 Domino-Prozess-Architektur Das folgende Diagram erklärt, wie Java-Applets mit entfernten Domino-Objekten via CORBA zusammenarbeiten. Browser Domino Server (entfernt) HTTP Server HTTP Port Applet Client ORB (wandelt Java zu IDL) Sendet IDL via IIOP zum Server Port Domino Object Server CORBA Adapter IIOP Port LS Adapter Java Adapter OLE Adapter Domino Object Model = Domino CORE (C++) Java und die JVM Wie Sie aus dem obigen Diagramm ersehen können, nutzen Java-Applets, die aus der Ferne auf das Domino Object Model zugreifen, nicht das JVM. Stattdesse wird der Java-Code des Applet tatsächlich in IDL gewandelt und dies wird an den Server zur Umwandlung in C++ gesendet. Java-Anwendungen, die entfernt auf Domino-Daten zugreifen, nutzen auch CORBA-Klassen. Die JVM wird immer noch für den Zugriff auf lokale Domino-Daten genutzt. Die folgenden Java-Programme greifen auf Domino-Daten mit der JVM zu: ! ! ! Java-Applets, die auf dem Notes-Client laufen. Die AppletBase-ClassDatei umfaßt Java-Code, der dynamisch bestimmt, wo das Applet läuft und macht CORBA ferne Aufrufe, wenn das Applet in einem Browser läuft. Wenn nicht ruft es die Lokale API (die Client-JVM). Java-Anwendungen, die auf einer Maschine mit installiertem Notes-Client oder Domino-Server laufen. Es sei denn eine Anwendung macht entfernte Aufrufe via CORBA , dann muss die Domino-JVM installiert sein, um auf Domino-Daten lokal zuzugreifen. Java-Agenten nutzen immer die JVM für den Zugriff auf Domino-Daten – entweder auf dem Server oder auf dem Notes-Client. Agenten benutzen kein CORBA. Modul C: Fortgeschrittene Programmierung 261 Die Java-Klassen von Domino ● Java-Klassen-Namen für Domino-Objekte stimmen mit den Namenskonventionen von Java überein. – Weshalb sie sich leicht von den entsprechenden LotusScript-Klassen-Namen unterscheiden. ● Die Namen sind immer noch den LotusScript-Namen sehr ähnlich: – Entfernen Sie das Wort “Notes” vom Namensanfang der LotusScript-Klasse und Sie haben den Java-Namen. – Beispielsweise wird NotesDocument zu Document. ● Strenge Anwendung des Containment Model - jedes Objekt muß ein Super-Objekt haben mit Ausnahme von Session. 2 Hervorzuhebende Punkte ! Java-Klassen-Namen = entfernen Sie das Wort “Notes” vom LotusScript-Namen. Der vollständige Name lautet lotus.domino.ClassName – doch ist erst einmal das lotus.domino.*-Paket importiert, so gibt keine Notwendigkeit mehr, lotus.domino im Namen aufzuführen. ! Java-Klassen-Namen beginnen immer mit einem Großbuchstaben. ! Im Gegensatz müssen sich LotusScript-Programmierer an das strenge Containment-Model in Java halten. Beispielsweise, um Zugriff auf eine Ansicht zu nehmen, muss ein Session-, dann ein Database- und schließlich ein View-Objekt erstellt werden. Auf das View-Objekt wird über das Database-Objekt (entsprechend. View v = db.getView()) zugegriffen, auf das über das Session-Objekt (entsprechend Database db = session.getDatabase(server, dbname)) zugegriffen wird. ! Auf Session muss nicht über ein anderes Objekt zugegriffen werden, da es das oberste Domino-Objekt ist. Sie brauchen ein Session-Objekt, bevor sie auf irgend etwas anderes Zugriff nehmen können. Über das lotus.notes.*-Paket Dies ist das R4.6 Domino-Java-Paket – es arbeitet immer noch für R4.6-Programme, doch es wird nicht aktualisiert, um die R5-Klassen zu enthalten. Modul C: Fortgeschrittene Programmierung 262 Über die lotus.domino-Klassen Die folgende Tabelle listet die lotus.domino-Klassen, die für öffentl. Nutzung verfügbar sind: Java-Class-Datei Domino-Objekt, auf das zugegriffen wird lotus.domino.ACL stellt eine Sammlung aller Einträge in die Zugriffskontrolliste einer Datenbank dar. lotus.domino.ACLEntry stellt einen einzelnen Zugriffskontrolliste dar. lotus.domino.Agent stell die Attribute eines Agenten dar. lotus.domino.AgentContext stellt den Kontext des aktuellen Agenten dar, wenn das Programm als Agent läuft. lotus.domino.Database stellt eine Notes-Datenbank dar. lotus.domino.DateRange stellt einen Bereich von Datum und Zeit dar. lotus.domino.DateTime stellt in Notes Datum oder Zeit dar. lotus.domino.DbDirectory stellt die Datenbank-Datei auf einem Server oder einer lokalen Maschine dar. lotus.domino.Document stellt ein Dokument in einer Datenbank dar. lotus.domino.DocumentCollection stellt eine Sammlung von Dokumenten dar. lotus.domino.EmbeddedObject stellt eingebettete Objekte, Links und Dateianhänge dar. lotus.domino.Form stellt die Maske einer Datenbank dar. lotus.domino.International stellt die internationalen Voreinstellungen des Betriebssystems dar. lotus.domino.Item repräsentiert ein Item in einem Dokument. lotus.domino.Log stellt Aktionen oder Fehler bei der Ausführung eines Scipts dar. lotus.domino.Name stellt den Namen eines Bentuzers oder Servers dar. Lotus.domino.NewsLetter repräsentiert eine Zusammenfassung, die Inhalte und Links zu anderen Dokumenten enthält. Lotus.domino.Registration stellt die Erstellung oder Administratin einer IDDatei dar. Lotus.domino.RichTextItem stellt ein Rich-Text-Item dar. Lotus.domino.Session stellt den Kontext des aktuellen Programm dar. Diese Klasse ist die Grundlage der NotesDatenbank-Objekte. Lotus.domino.View stellt eine Ansicht oder einen Order in einer Datenbank dar. Lotus.domino.ViewColumn stellt eine Säule in einer Ansicht dar. Modul C: Fortgeschrittene Programmierung Eintrag in eine 263 Die Java-Klassen von Domino... METHODEN: ● Methoden von Java sind mit denen von LotusScript identisch. Sie beginnen nur mit Kleinbuchstaben. EIGENSCHAFTEN: ● In Java sind Eigenschaften auch Methoden, so müssen die LotusScript-Eigenschaften in entsprechende Methoden gewandelt werden: – Boolsche Eigenschaften haben zwei gleichwertige Methoden, eine zum Setzen beginnt mit dem Wort “set” und die andere zum Lesen mit “is”. – Andere Eigenschaften wandeln sich zur “get”-Methode 2 in Java. Heben Sie die folgenden Punkte hervor: ! Die Namen der Java-Methoden sind identisch mit den Namen der LotusScriptMethoden jeder Klasse. Sie werden nur mit Hilfe der Java-Namenskonventionen formatiert. So wird die GetFirstDatabase-Methode als getFirstDatabase-Methode in Java geschrieben. ! Eigenschaften sind komplexer, weil Java keine “Eigenschaften” besitzt. Daher müssen Java- Methoden geschrieben werden, die die gleiche Funktionalität erfüllen. ! Boolean Read-only Eigenschaften sind grundsätzlich das selbe wie LotusScript Eigenschaften mit der Ausnahme, dass sie mit Kleinbuchstaben “is” beginnen. Bespielsweise wird die NotesSession.IsOnServer-Eigenschaft zur Session.isOnServer() in Java. ! Boolean-Eigenschaften, die nicht read-only sind, besitzen zwei Methoden in Java. Eine Methode erlaubt das Auslesen der Eigenschaft. Diese Methode ist dieselbe wie die readonly- Methode (entsprechend beginnt sie mit dem Wort “is”). Eine neue Methode wird auch erstellt, die die Veränderung der Eigenschaft erlaubt und diese beginnt gewöhnlich mit dem Wort “set”. Beispielsweise wird die NotesDocument.SaveMessageOnSendEigenschaft von LotusScript zu Document.isSaveMessageOnSend() zum Lesen und zu Document.setSaveMessageOnSend() zur Veränderung. ! Non-Boolean-Eigenschaften werden zu “get”-Methoden gewandelt. Beispielsweise wird die NotesDocument.NoteID-Eigenschaft zur Document.getNotesID()-Methode in Java. Modul C: Fortgeschrittene Programmierung 264 Java-Klassen-Eigenschaften und Methoden Java-Klassen haben alle dieselben Eigenschaften und Methoden wie die LotusScript-Klassen, jedoch sind sie aufgrund der Konventionen in Java-Programmen ein wenig verschieden codiert. Die Ähnlichkeiten und Unterschiede werden hier mit einigen der Eigenschaften und Methoden des NotesDocument-Objekts illustriert. Java-Methoden Der einzige Unterschied zwischen Java- und LotusScript-Methoden liegt darin, dass die Entsprechung in Java mit einem Kleinbuchstaben beginnt: LotusScript-Methoden für Notes-Dokumente Entsprechende Java-Methode für Dokumente GetItemValue(itemName$) getItemValue(String name) HasItem(itemName$) hasItem(String name) ReplaceItemValue(itemName$, value) replaceItemValue(String name, Object value) Java-Methoden für LotusScript-Eigenschaften Die Umwandlung von LotusScript-Eigenschaften nach Java war komplexer, weil Java nicht über ein äquivalentes Konzept verfügt. Deshalb müssen Methoden geschrieben werden, die dieselben Funktionen erfüllen wie die Eigenschaften. LotusScript- Eigenschaft für NotesDokumente Entsprechende Java-Methode für Dokumente Authors getAuthors() EncryptOnSend To read use: isEncryptOnSend() To set use: setEncryptOnSend(Boolean flag) IsResponse isResponse() SaveMessageOnSend To read use: isSaveMessageOnSend() To set use: setSaveMessageOnSend(Boolean flag) NoteID Modul C: Fortgeschrittene Programmierung getNotesID() 265 Beispiel Domino-Java-Klassen ● lotus.domino.Session – getDatabase ● lotus.domino.Database – getView ● lotus.domino.View – getFirstDocument() – getNextDocument(Object document) 5 Vorführung Nutzen Sie diese Vorführung, um einige der gebräuchlichsten Java-Klassen anzuschauen und um die Ähnlichkeiten mit den LotusScript-Klassen zu wiederholen. 1. Öffnen Sie die Dokumentation GetDatabase in der Designer Hilfe (Bereich LotusScript, Session-Klasse). Dieses Dokument ist mit dem Dokument 13.0 Using CORBA in der R5Courseware-Anwendung verknüpft. 2. Nutzen Sie dieses Dokument zur Illustrationen der Ähnlichkeiten zwischen den LotusScript-Klassen (wie in der Notes-Hilfe beschrieben) und den JavaKlassen – die in den Teilnehmernotizen dokumentiert sind. 3. Sie können auf Wunsch das selbe für die GetView und GetDocumentMethoden zeigen. Modul C: Fortgeschrittene Programmierung 266 Über getDatabase() Diese Methode ist in lotus.domino.Session definiert. Sie erstellt ein lotus.domino.DatabaseObjekt, dass die Datenbank auf dem von Ihnen spezifizierten Server findet (spezifizieren Sie null, um eine lokale Datenbank anzuzeigen) und öffnet. Syntax: sessionName.getDatabase(String server, String db); Beispiel: Database db = s.getDatabase(null, "R5Courseware"); Das Databank-Objekt hat Zugriff auf dieselben Eigenschaften und Methoden wie das LotusScript NotesDatabase-Objekt. Um auf die Eigenschaften der Objekte zuzugreifen und deren Methoden aufzurufen, beziehen Sie sich auf den Namen der Methode in der Java-Klassen-Dokumentation und wenden die Standardreferenz von Java an. Syntax: databaseObjectName.methodName(); Dies ist weiter unten für die getView()-Methode illustriert. Über getView() Diese Methode ist in lotus.domino.Database definiert. Sie erstellt ein lotus.domino.ViewObjekt, dass eine durch eine Zeichenkette spezifizierte Ansicht darstellt. Syntax: databaseName.getView(String); Beispiel: db.getView(“ViewName”); Das Ansichts-Objekt hat Zugriff auf dieselben Eigenschaften und Methoden wie das LotusScript NotesView-Objekt. Über getFirstDocument() Diese Methode ist definiert in lotus.domino.View. Sie erstellt ein lotus.domino.DocumentObjekt, dass das erste Dokument einer Ansicht darstellt. Syntax: viewName.getFirstDocument(); Beispiel: Document doc = view.getFirstDocument(); Das Dokument-Objekt hat Zugriff auf dieselben Eigenschaften und Methoden wie das LotusScript NotesDokument-Objekt. getNextDocument(doc), getLastDocument(doc) werden mit der selben Syntax aufgerufen. Wenn Sie erst einmal das lotus.domino.*-Paket in Ihr Java-Programm importiert haben, dann ist die “lotus.domino”-Referenz, die sonst vor dem DominoKlassennamen steht, unnötig und kann weggelassen werden. Die einzige Ausnahme für die Session-Class besteht dort, wo das Programm andere Typen des Session-Objekts einfügt. In diesem Fall müssen Sie zwischen ihnen unterscheiden, indem Sie den vollständigen Klassennamen benutzen. Modul C: Fortgeschrittene Programmierung 267 Handhabung von Domino-Exceptions ● ● Java handhabt Exceptions wie folgt: – Trifft Java auf eine Exception, so erstellt es ein Exception-Objekt zur Beschreibung. – Das Exception-Objekt wird an das Laufzeit-System weitergegeben, was für das Finden des Codes zur Handhabung der Exception verantwortlich ist. Es wird throw an exception genannt. – Das Runtime-System findet den passenden Exception-Handler. Dies wird catch an Excepttion genannt. Domino-Exceptions werden in der gleichen Weise behandelt. 6 Nutzen Sie diese Möglichkeit zur Erklärung der in Java vorhandenen Techniken zur Handhabung von Exceptions. Behandeln Sie die folgenden Punkte: ! Domino-Exception-Handler erkennen grundsätzlich die Ursache von Exceptions, geben die Nummer an die Konsole oder Log-Datei weiter und halten das Programm von der weiteren Ausführung ab. ! Um die Fehlermeldung als auch die Nummer im Exception-Bericht zu erfassen, nutzen Sie die NotesException text public-Variable. ! Eine vollständige Liste der Fehler, die in der NotesError-Klasse definiert sind, ist in der Java-Classes-Dokumentation der Designer-Hilfe enthalten – beziehen Sie sich auf das Link in der Zusammenfassung der Lektion. Modul C: Fortgeschrittene Programmierung 268 Catching Exceptions in Java Die try-Anweisung enthält eine Bedingung zum Catching , die zur Verarbeitung der Exceptions genutzt wird, die bei der Ausführung des Code in der Anweisung vorkommen. Die Anweisung hat folgende Syntax: try { //functional code which might throw exceptions goes here; } catch(ThrowableObjectName e) { //exception-handling code goes here; } Das Exception-Objekt besitzt Methoden, die aufgerufen werden können, um mehr Informationen über die Exception zur Verfügung zu stellen. So druckt die printStackTrace()Methode den Pfad, den das Programm zur Laufzeit nahm, um den Exception-Handler zu finden. Catching von Domino-Exceptions Beim Catching von Domino-Exceptions lautet der ThrowableObjectName im Catch-Block “NotesException”. Die NotesException-Class enthält die folgenden öffentlichen Variablen: ! int NotesException.id: dies enthält den Fehler-Code; ! String NotesException.text: enthält die Fehlermeldungen. Das folgende Beispiel eines Catch-Codes druckt Fehlernummer und Meldung der Exception, die beim Zugriff auf die ID und Texteigenschaften des thrown-Objekts, als “e” benannt, angetroffen wurde. Dieser Code zeigt, wie einzelne Exceptions mit der NotesError-Klasse herausgenommen werden können: try { //functional code goes here; } catch(NotesException e) { if (e.id == NotesError.NOTES_ERR_SEND_FAILED) System.out.println("Mail send was unsuccessful"); else { System.out.println(e.id + " " + e.text); e.printStackTrace();; } } Die NotesException Java-Class definiert Methoden zur Handhabe von DominoExceptions. Die NotesError Java-Class definiert mögliche Fehler als Konstanten, um Exception-Handler wie zuvor gezeigt auf bestimmte Fehler zu testen. Schlagen Sie bei den Links in der Zusammenfassung der Lektion nach, die auf die Designer-Hilfe mit einer vollständige Liste der in der NotesError-Class enthaltenen Fehler verweisen. Modul C: Fortgeschrittene Programmierung 269 Codierung von CORBA-Applets ● Importieren Sie das lotus.domino.*-Paket in die Applet-Source-Datei: import lotus.domino.*; ● Erweitern Sie die AppletBase-Class und übergehen Sie die notesAppletXXXX()-Methoden: public class myApplet extends AppletBase { public void notesAppletInit() ● Nutzen Sie die getSession()-Methode zur Instantiierung und Initialisierung von CORBA im Applet: Sessions = this.getSession(); 6 Hervorzuhebende Punkte ! ! ! Applets, die lotus.domino-Klassen verwenden, werden erstellt durch die Erweiterung der lotus.domino.AppletBase-Class anstatt durch die java.applet.Applet-Class. Sessions müssen in einer try{ }-Anweisung eingegeben werden, da es bei ihnen zu Exceptions kommen kann. Es ist nicht möglich, CORBA-Applets durch die Vorschau im IE zu testen. Zum richtigen Test der Funktionalität des Objekts mit dem Applet müssen Sie darauf über den Server zugreifen. Vorführung... 4. Starten Sie Ihren Domino-Server und Laden Sie den IE – Sie werden später auf die R5Course.nsf-Datenbank über den IE zugreifen. 5. Führen Sie das Corba Catalogue-Applet ein und erklären Sie , was es leistet. Wir werden dieses Applet zur Demonstration des Schreibens eines CORBAbefähigten Applets in dieser Lektion nutzen. 6. Im Internet Explorer öffnen Sie das Dokument 13.4 CorbaCatalog Applet Demonstation, und zeigen wie das Applet arbeitet. Das Applet braucht einen Moment zum Laden, da es das lotus.domino-Paket lädt – Sie sollten dies in der Statusleiste des IE sehen. Öffnen Sie die Java-Konsole und kehren Sie zurück in den IE. 7. Erklären Sie, anstatt nur die Bilder zu zeigen, dass deren URLs in der AppletClass-Datei festgelegt sind und dieses Applet die Details der Bild-Dateien von der ObjectsByLektion-Ansicht in der R5Courseware-Datenbank liest. Modul C: Fortgeschrittene Programmierung 270 Einführung der AppletBase-Class Applets, die auf Domino-Daten zugreifen, müssen AppletBase erweitern und nutzen notesAppletInit(), notesAppletStart(), und notesAppletStop() als Eingabepunkte ihres funktionellen Codes. Die öffentlichen Methoden der AppletBase-Class sind folgende: public class AppletBase DominoAppletBase { extends Applet implements public Session getSession() throws NotesException; public Session getSession(String user, String pwd) throws NotesException; public final void init(); public void notesAppletInit(); public final void start(); public void notesAppletStart(); public final void stop(); public void notesAppletStop(); public final void destroy(); public void notesAppletDestroy(); public Boolean isNotesLocal(); } CORBA-befähigtes Catalogue-Applet Im Rest dieser Lektion werden wir ein Applet ähnlich dem Catalogue-Applet der vorherigen Lektion nutzen. Dieses Applet wurde so verändert, dass es auf Domino-Daten via CORBA zugreifen kann. In der CORBA-Version des Catalogue-Applet werden die angezeigten Bilder aus einer Domino-Ansicht gespeist. Modul C: Fortgeschrittene Programmierung 271 Über das CORBA-Applet NUTZEN SIE FOLGENDE METHODEN FÜR DEN ZUGRIFF AUF DAS SESSION-OBJEKT: ● Nutzen Sie notesAppletInit(): wenn eine Session rechtzeitig etabliert und kontinuierlich gebraucht wird. ● Nutzen Sie notesAppletStart(): wenn der Start eines Applet durch den Benutzer den Zugriff auf eine Session bedingt. ● Nutzen Sie eine eventHandler()-Methode, wenn eine Session nur beim Vorkommen eines besonderen Events notwendig ist. 6 Im CorbaCatalogue-Applet wird die dritte Methode für den Zugriff auf den Domino-Server genutzt. Erklären Sie kurz, wann die anderen Methoden zum Einsatz kommen. Vermerken Sie, dass auf eine Session, die in einer Methode erstellt wurde, in einer darauf folgenden Methode zugegriffen werden kann, wenn der Gültigkeitbereich korrekt festgelegt oder klar weitergegeben wurde. Vorführung… 8. Betrachten Sie den Java-Code (der in den Teilnehmernotizen dargestellt ist) und heben Sie die wichtigsten Stellen des Code hervor. Diese werden später noch genauer in der Vorführung betrachtet. 9. Beachten Sie im besonderen, dass sich dieses Applet vom Catalogue-Applet der Lektion 12 unterscheidet. Es erweitert die lotus.domino.AppletBase-Class und nicht die java.applet.Applet-Class. Dies ist der Grund, warum die Standard Applet-Methoden eher als notesAppletInit() benannt werden anstatt einfach als init(),doch sind die Methoden dieselben. Modul C: Fortgeschrittene Programmierung 272 Das Corba Catalogue-Applet Das Vorführ-Applet dieser Lektion baut auf dem Catalogue-Applet von Lektion 12 auf und erweitert seine Funktionalität. Es nutzt CORBA für den Zugriff auf das Domino Object Model. Die Class-Datei definiert die folgenden Methoden und Variablen: class CorbaCat extends AppletBase implements 1 public 2 ActionListener { 3 Image baseImage; 4 Image prodImage; 5 int n=0; 6 Button nextProduct; 7 View v; 8 public void notesAppletInit() { 9 setSize(250,250); 10 baseImage = getImage(getCodeBase(),"product1.jpg"); 11 //Create the Button and add it to the applet 12 nextProduct = new Button("Next Product"); 13 nextProduct.addActionListener(this); 14 add(nextProduct); 15 validate(); 16 } 17 public void paint(Graphics g) { 18 g.drawImage(baseImage, 75, 45, this); 19 validate(); 20 System.out.println("The paint method has executed"); 21 } 22 public void notesAppletStart() { 23 try { functional code to get View object goes 24 here} 25 } 26 public void actionPerformed (ActionEvent ae) { 27 try { functional code to get image goes here} 28 repaint(); 29 } 30 public void update(Graphics g){ 31 g.drawImage(prodImage, 75, 45, this); 32 validate(); 33 System.out.println("The update method was executed"); }} Zeilenweise Erklärung des Code: 1-5 6 7-15 16-20 21-23 24-27 28-33 Klassen- und Variablendeklarationen. Die Variable View wird hier deklariert, so ihr Gültigkeitsbereich den Zugriff durch Methoden erlaubt. Die notesAppletInit()-Methode speichert das Anfangsbild in einem Bild-Objekt und erstellt eine Schaltfläche, die dem Layout hinzugefügt wird. Die paint()-Methode zeigt das Anfangs-Bild im Applet. Die notesAppletStart()-Methode etabliert eine beständige Session und findet die Ansicht ObjectsByLektion, die genutzt wird, um durch die Produkt-Dokumente zu springen. Die actionPerformed()-Method enthält den funktionellen Code des Applet. Klickt der Benutzer auf die Schaltfläche NextProduct, dann greift diese Methode auf das nächste Produktbild einer Domino-Ansicht zu, handhabt Fehler und zeichnet das Applet neu. Die update()-Methode wird vom repaint()-Aufruf in actionPerformed() zum Neuzeichnen aufgerufen. Modul C: Fortgeschrittene Programmierung 273 Zugriff auf eine Domino-Ansicht ● Der funktionelle Code in der notesAppletStart() -Methode bewirkt folgendes: – Bekommt eine Sitzung mit dem Server. – Instantiiert ein Database-Objekt. – Nutzt das Database-Objekt, um die ObjectsByLesson-Ansicht zu lokalisieren. Auf das View-Objekt, v, kann mit jeder Methode in der CorbaCat1.class zugegriffen werden. ● Der Try {}-Block enthält die notwendigen Catch-Anweisungen. ● 7 Heben Sie den folgenden Punkt hervor:: ! Die notesAppletStart()-Methode wird automatisch vom Browser aufgerufen, nachdem die notesAppletInit()-Methode die Ausführung beendet. Vorführung… 10. Erklären Sie, dass bei Erstellung der Session in der notesAppletStart()-Methode die Session nur einmal erstellt wird und in der actionPerformed()-Methode immer wenn notwendig nutzbar ist. 11. Wenn einmal auf die Session zugegriffen ist, dann sind der Zugriff auf die Datenbank und die Ansicht fast identisch mit dem in LotusScript. 12. Erklären Sie, dass die Catch-Anweisung die Fehlermeldung und Nummer für jede Notes-Exception anzeigt, die auf der Java-Konsole vorkommt. Mit stacktrace() wird die Methode verfolgt, die ausgeführt wurde als der Fehler auftrat. 13. Öffnen Sie die ObjectsByLektion-Ansicht, um zu zeigen von wo die Katalogbilder gewonnen werden. Modul C: Fortgeschrittene Programmierung 274 Das Corba Catalogue-Applet … Der Try {} Anweisungsblock der notesAppletStart()-Methode lautet wie folgt: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 try { Session s = this.getSession(); System.out.println("Session is on platform"+s.getPlatform()); Database db = s.getDatabase(null,"R5Course"); v = db.getView("ObjectsByLektion"); System.out.println("View name is: "+v.getName()); } catch(NotesException ne) { System.out.println(ne.id + “ “ + ne.text); ne.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } Zeilenweise Erklärung des Code:: Anfang des try-Anweisungsblocks Instantiierung der Session-Class and Zurückgabe der aktuellen Session (die von der AppletBase-Class-Datei etabliert wurde). Die folgende Debugging-Nachricht greift auf eine Methode der Session-Class zu, um zu bestätigen, dass auf sie im Applet Zugriff möglich ist. 4 Instantiierung der Database-Class und Zuweisung der R5Course-Datenbank auf dem Server. 5-6 Festlegen des view-Objekts, genannt v, auf die ObjectsByLektion-Ansicht in der R5Course-Datenbank. Die Debugging –Nachricht greift auf die getName()-Methode der View-Class zu, um zu bestätigen, dass auf dieses Objekt im Applet zugegriffen werden kann. 8-11 Diese Catch-Anweisung wird aktiviert, falls eine Exception in Notes während der Ausführung der try-Anweisung erfolgt. Die Debugging –Nachricht gibt die Nummer des Fehlers und die Fehlermeldung wieder. Der printStackTrace()-Aufruf zeigt eine Liste der Klassen, die ausgeführt wurden, als der Fehler vorkam. 12- Diese Catch-Anweisung wird aktiviert, falls es zu einer anderen als einer Notes14 Exception während der Ausführung der try-Anweisung kommt. Es druckt einfach eine Stack-Spur. 1 2-3 Modul C: Fortgeschrittene Programmierung 275 Zugriff auf Objekte in einer Ansicht ● Der funktionelle Code in der actionPerformed() Methode macht das folgende: – Erstellt einen Java-Vector, der zum Suchen eines View-Objekts von zwei Schlüsselwerten, der Kategorie (“CatalogueImages”) und dem Namen der Bilder (z.B.: “product1.jpg”), genutzt werden kann. – Findet das Dokument, indem er den Vektor als den Schlüssel zum Aufruf der getDocumentByKey()Methode nutzt. – Erstellt eine Domino-URL, die genutzt wird, um die Bilder von der Dokument-URL zu bekommen. 7 Vorführung… 14. Die getDocumentByKey()-Methode nutzt ein Java-Vector-Objekt zum Speichern der “Schlüssel”, dass die richtigen Dokumente anhand der Werte für die ersten beiden Säulen in dieser Ansicht erkennt. 15. Erklären Sie den URL-Umwandlungs-Code wie folgt. Die getURL()Methode gibt die Domino-URL des DOKUMENTS zurück, dass die Bilddatei als Anhang enthält. Wir brauchen tatsächlich die URL für den Anhang, um durch die Veränderung der URL des Dokuments den $FILE -Tag am Ende anzuhängen. 16. Erklären Sie, dass in Domino die Handhabung von Bildern schwieriger ist als die von Text, da Bilder keine Domino-Objekte sind. Die Teilnehmer werden eine TextArea-Komponente dieses Applets in der Übung programmieren. Modul C: Fortgeschrittene Programmierung 276 Das Corba Catalogue-Applet… Der Try {}-Anweisungsblock der actionPerformed()-Methode ist folgend wiedergegeben: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 try { //Create a vector to store document "key": java.util.Vector vr=new java.util.Vector(); vr.addElement("CatalogueImages"); n = n+1; vr.addElement("product" + n +".jpg"); Document doc = v.getDocumentByKey(vr); //Convert the current Document's URL into a Domino URL: URL docUrl = new URL(doc.getURL()); String conversionString = new String(docUrl.toString()); int x=conversionString.indexOf("?"); conversionString = conversionString.substring(0,x)+"/$FILE/"; docUrl= new URL(conversionString); System.out.println(docUrl); //Get the image for product1. prodImage = getImage(docUrl,"product"+ n +".jpg"); } catch(NotesException ne) { System.out.println(ne.id + “ “ + ne.text); ne.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } repaint(); } Zeilenweise Erklärung des Code: 1 2-7 8-9 10-14 15-16 17-24 25-26 Anfang des Blocks der try-Anweisung Dieser Code findet das Dokument mit dem Titel “productn.jpg” in der ObjectsByLektion-Ansicht. Die zwei Schlüsselwerte werden in dem Java Vector, benannt vr, gespeichert. Dieser Code bekommt die URL des Dokuments, dass das Produktbild als Anhang enthält. Java kann die anghängte Datei nicht von der URL des Dokuments öffnen. Deshalb muss die URL in eine Domino-URL umgewandelt werden, so dass die angehängte Datei geöffnet werden kann. Die Debugging Nachricht zeigt die umgewandelte URL. Dieser Code bekommt die Bilddatei mit der URL des Dokuments und den Dateinamen mit einem getImage()-Aufruf. getImage() ist eine Methode der java.applet.Applet-Klasse. Notes- und Java-Exception-Handling-Code – wie für die notesAppletStart()Methode. repaint() ruft die update()-Methode auf, die das neue Bild in das Applet zeichnet. Modul C: Fortgeschrittene Programmierung 277