und Transaktionsisolation unter Java - Technische Informatik

16.05.2005 - Broker (ORB), sich gegenüber dem Transaktionsmanager zu identifizieren. ...... [15] The Linux Home Page at Linux Online. http://www.linux.org/.
3MB Größe 6 Downloads 248 Ansichten
Fakult¨ at f¨ ur Informations- und Kognitionswissenschaften Wilhelm-Schickard-Institut f¨ ur Informatik

Anwendungs- und Transaktionsisolation unter Java Diplomarbeit Betreut von Prof. Dr.-Ing. Wilhelm G. Spruth

— Vorgelegt von Jens M¨ uller (Matrikelnummer 2200565)

16. Mai 2005

Zusammenfassung Der Schwerpunkt der Java 2 Platform, Enterprise Edition liegt im Bereich serverseitiger Gesch¨ aftsanwendungen. Transaktionsverarbeitung ist eine der wichtigsten Schl¨ usseltechnologien im Umfeld von Gesch¨aftsanwendungen. Die Verbreitung objekt- und komponentenorientierter Entwicklungskonzepte f¨ uhrte zur Entwicklung von objektorientierten Transaktionsmonitoren. Mit Einf¨ uhrung der Java 2 Platform, Enterprise Edition und der serverseitigen Komponententechnologie Enterprise JavaBeans, entstanden auch auf Java basierende Transaktionsverarbeitungssysteme. Im Lauf der Zeit wandelte sich die Java Plattform von einer einfachen virtuellen Maschine zu einer betriebssystem¨ahnlichen Laufzeitumgebung. Im Zuge dieser Entwicklung wurde es insbesondere im Bereich der Transaktionsverarbeitung notwendig, Transaktionen innerhalb derselben virtuellen Maschine parallel zu verarbeiten, um einen akzeptablen Durchsatz zu erzielen. Auf der anderen Seite wurde auch der Wunsch laut, herk¨ ommliche Anwendungen parallel ausf¨ uhren zu k¨onnen. Java wurde jedoch nicht als virtuelles Betriebssystem konzipiert und es fehlt die bei Betriebssystemen u ¨bliche Abstraktion des Prozesses und in Folge dessen die damit verbundenen Mechanismen, wie z.B. Isolation und Ressourcenmanagement. Dennoch wurden Techniken entwickelt, die zumindest die Isolation garantieren sollten. Diese sind jedoch unzureichend und stellen keine zufriedenstellende L¨osung dar. In vielen Szenarien mag die dadurch gebotene Isolation f¨ ur die parallele Ausf¨ uhrung von Anwendungen und Transaktionen zwar ausreichend sein. Gerade aber bei der Transaktionsverarbeitung ist die Einhaltung der ACID-Eigenschaften und damit der Isolation einer der wichtigsten Aspekte. Soll das Transaktionsverarbeitungssystem absolute Transaktionssicherheit bieten, so ist daher derzeit vom Einsatz der EJB-Technologie abzuraten. Diese Arbeit beschreibt die Defizite von Java in verschiedenen Bereichen, die in Zusammenhang mit der parallelen Ausf¨ uhrung von Anwendungen und Transaktionen relevant sind. Anschließend werden die analysierten Probleme praktisch nachvollzogen und diskutiert. Abschließend werden L¨osungsans¨atze aufgezeigt und die derzeitigen Bem¨ uhungen einer offiziellen und umfassenden L¨osung vorgestellt.

Eidesstattliche Erkl¨ arung Ich erkl¨ are hiermit an Eides statt, dass ich die vorliegende Arbeit selbst¨andig verfasst, keine anderen als die angegebenen Quellen benutzt und sowohl w¨ortliche, als auch sinngem¨ aß entlehnte Stellen als solche kenntlich gemacht habe. Die Arbeit hat in gleicher oder ¨ ahnlicher Form noch keiner anderen Pr¨ ufungsbeh¨orde vorgelegen.

T¨ ubingen, den 16. Mai 2005

(Jens M¨ uller)

I

Danksagung Ich danke meiner lieben Mutter und meinem leider viel zu fr¨ uh verstorbenen Vater daf¨ ur, dass sie mir dieses Studium erm¨oglicht haben. Herrn Professor Spruth danke ich herzlichst f¨ ur die Betreuung dieser Arbeit und den Freiraum, den er mir dabei gegeben hat. Die vielen Gespr¨ache, die wir teilweise bis sp¨ at in den Abend hinein gef¨ uhrt haben, werde ich in bester Erinnerung behalten.

II

Inhaltsverzeichnis 1 Einleitung 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Aufbau der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1 1 2

2 Transaktionsverarbeitung 2.1 Transaktionen . . . . . . . . . . . . . . . . 2.2 ACID-Eigenschaften . . . . . . . . . . . . 2.3 Transaktionsverarbeitungssysteme . . . . 2.4 Enterprise JavaBeans . . . . . . . . . . . . 2.5 Transaktionen und Enterprise JavaBeans . 2.6 Parallele Transaktionsverarbeitung . . . .

. . . . . .

. . . . . .

. . . . . .

3 3 3 4 5 6 9

3 Isolation unter Java 3.1 Das Sicherheitskonzept von Java . . . . . . . . . . . . . . . . . . 3.2 Defizite im Bereich der Isolation . . . . . . . . . . . . . . . . . . 3.2.1 Mathematischer Exkurs: Bin¨are Relation, transitive H¨ ulle 3.2.2 Class Loader . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3 Klassennamensr¨aume . . . . . . . . . . . . . . . . . . . . 3.2.4 Sichere und unsichere statische Felder . . . . . . . . . . . 3.2.5 Multitasking unter Verwendung eines Class Loaders . . . 3.2.6 Multitasking unter Verwendung mehrerer Class Loader . . 3.2.7 Probleme bei der Verwendung mehrerer Class Loader . . 3.2.8 Weitere Isolationsdefizite . . . . . . . . . . . . . . . . . . 3.3 Defizite im Bereich der Interprozesskommunikation . . . . . . . . 3.4 Defizite im Bereich des Ressourcenmanagements . . . . . . . . . 3.5 Defizite im Bereich der Beendigung von Prozessen . . . . . . . . 3.6 Konsequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

11 11 13 13 14 14 15 15 16 16 17 18 18 19 20

¨ 4 Praktische Uberpr¨ ufung der Probleme 4.1 Vorgehensweise . . . . . . . . . . . . . . . . . . . . . 4.2 Statische Felder . . . . . . . . . . . . . . . . . . . . . 4.3 Statische Felder von Systemklassen . . . . . . . . . . 4.4 Synchronisierte Klassenmethoden von Systemklassen 4.5 Internalisierte Strings . . . . . . . . . . . . . . . . . 4.6 Finalisierung und Ereignisverarbeitung . . . . . . . . 4.6.1 Finalisierung . . . . . . . . . . . . . . . . . . 4.6.2 Ereignisverarbeitung . . . . . . . . . . . . . . 4.7 Plattformabh¨ angiger Code . . . . . . . . . . . . . . . 4.8 Denial-of-Service-Angriffe . . . . . . . . . . . . . . . 4.8.1 Testumgebung . . . . . . . . . . . . . . . . . 4.8.2 Entity und Session Beans . . . . . . . . . . . 4.8.3 Der Denial-of-Service-Testclient . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

21 21 21 22 24 26 28 29 30 32 35 36 36 38

III

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . . . . . . . . .

. . . . . .

. . . . . . . . . . . . .

. . . . . .

. . . . . . . . . . . . .

. . . . . .

. . . . . . . . . . . . .

. . . . . .

. . . . . . . . . . . . .

. . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

4.9

4.8.4 Denial-of-Service-Angriff 1 . . . . . . . . . . . . . . 4.8.5 Denial-of-Service-Angriff 2 . . . . . . . . . . . . . . 4.8.6 Denial-of-Service-Angriff 3 . . . . . . . . . . . . . . Bewertung der Ergebnisse . . . . . . . . . . . . . . . . . . 4.9.1 Isolation bei herk¨ommlichen Java-Anwendungen . 4.9.2 Isolation bei EJB-Anwendungen . . . . . . . . . . 4.9.3 Isolation bei Transaktionen einer EJB-Anwendung 4.9.4 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

39 40 41 42 42 42 43 43

5 L¨ osungsans¨ atze 5.1 Isolation durch Class Loader . . . . . . . . . . . . . . . 5.1.1 Echidna . . . . . . . . . . . . . . . . . . . . . . . 5.1.2 Der Ansatz von Balfanz und Gong . . . . . . . . 5.1.3 J-Kernel . . . . . . . . . . . . . . . . . . . . . . . 5.2 Isolation durch Bytecode-Transformation . . . . . . . . 5.2.1 Der Safe Shared Class Loader . . . . . . . . . . . 5.2.2 Der Ansatz von Czajkowski (1. Implementierung) 5.3 Isolation durch Modifikation der Virtual Machine . . . . 5.3.1 Der Ansatz von Czajkowski (2. Implementierung) 5.3.2 K0 (GVM) . . . . . . . . . . . . . . . . . . . . . 5.3.3 Alta . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.4 KaffeOS . . . . . . . . . . . . . . . . . . . . . . . 5.3.5 Luna . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Isolation durch Betriebssystemprozesse . . . . . . . . . . 5.4.1 Persistent Reusable Java Virtual Machine . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

45 45 45 46 46 48 48 50 51 51 51 52 52 55 56 56

6 Application Isolation API 6.1 Isolates . . . . . . . . . . . . . 6.2 JanosVM . . . . . . . . . . . . 6.3 SAP VM Container . . . . . . . 6.4 Multi-Tasking Virtual Machine

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

59 59 62 62 66

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

7 Zusammenfassung

71

A Quellcode A.1 Die Denial-of-Service-Unternehmensanwendung A.1.1 Der Deployment Descriptor . . . . . . . A.1.2 Enterprise Bean: Account . . . . . . . . A.1.3 Enterprise Bean: Transfer . . . . . . . . A.1.4 Enterprise Bean: Test . . . . . . . . . . A.2 Der Denial-of-Service-Testclient . . . . . . . . . A.2.1 ThesisEJBClient.java . . . . . . . . . . A.2.2 PaintPanel.java . . . . . . . . . . . . . . A.2.3 ReadOnlyDefaultTableModel.java . . . A.2.4 TableDate.java . . . . . . . . . . . . . . A.2.5 UpdateGUIRunnable.java . . . . . . . .

. . . . . . . . . . .

73 73 73 74 77 79 82 82 93 93 94 94

B DVD zur Diplomarbeit B.1 Inhalt der DVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95 95

IV

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

Abbildungsverzeichnis 2.1 2.2 2.3

Die Bestandteile eines J2EE-Applikationsservers . . . . . . . . . . . Das Transaktionsverarbeitungssystem in Enterprise JavaBeans . . . JTA und JTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.1 3.2 3.3 3.4

Das Sicherheitskonzept von Java . . . . . . . . . . . . . . . . . Multitasking unter Verwendung eines Class Loaders . . . . . . Multitasking unter Verwendung mehrerer Class Loader . . . . . Asynchrones Verhalten des Speicherverbrauchs eines Prozesses

. . . .

. . . .

. . . .

12 15 16 19

4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8

Ereignisverarbeitung unter Java . . . . . . . . . . . . . . . . . . Java-Anwendung mit Swing-GUI . . . . . . . . . . . . . . . . . Folgen einer Endlosschleife in einer Ereignisbehandlungsroutine Der Denial-of-Service-Testclient . . . . . . . . . . . . . . . . . . Der Denial-of-Service-Testclient in Betrieb . . . . . . . . . . . . Ein mittelschwerer Denial-of-Service-Angriff . . . . . . . . . . . Ein schwerer Denial-of-Service-Angriff . . . . . . . . . . . . . . Ein kurzer aber schwerer Denial-of-Service-Angriff . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

31 32 32 36 38 39 40 41

5.1 5.2 5.3 5.4 5.5

Der Prozessmanager von Echidna . . . . Multitasking unter Verwendung des Safe Kernel- und Benutzermodus in KaffeOS Heapstruktur in KaffeOS . . . . . . . . Das Typsystem von Luna . . . . . . . .

. . . . .

. . . . .

. . . . .

46 49 53 54 55

6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9

Aggregates/Isolates/Threads . . . . . . . . . . . . . . . . . . . . Bisheriges Problem beim Absturz einer Virtual Machine . . . . . Auslagerung des Benutzerkontexts . . . . . . . . . . . . . . . . . Erzeugung und Kopie einer Shared Closure . . . . . . . . . . . . Versionierung und Einblendung einer Shared Closure . . . . . . . Trennung von Virtual Machine und Prozess . . . . . . . . . . . . Trennung von Virtual Machine und Benutzerkontext . . . . . . . Ausf¨ uhrung plattformabh¨angigen Codes bisher und bei der MVM Drei Benutzer f¨ uhren Isolates in der MVM aus . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

60 63 64 64 65 65 66 67 69

B.1 Das Literaturverzeichnis auf DVD . . . . . . . . . . . . . . . . . . .

96

V

. . . . . . . . . . . . . Shared Class Loaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6 7 8

VI

Tabellenverzeichnis 4.1 4.2

Klassen mit statischen Zugriffsmethoden (wiederverwendbar) . . . . Klassen mit statischen Zugriffsmethoden (nicht wiederverwendbar) .

VII

22 23

VIII

Listings 4.1 TestThread.java . . . . . . . . . . . . . . . 4.2 Session Bean (Auszug) . . . . . . . . . . . 4.3 StringInternThread.java . . . . . . . . . . 4.4 StringInternThread.java (main-Methode) 4.5 StringInternThread.java (main-Methode) 4.6 ClassWithFinalizer.java . . . . . . . . . . 4.7 ClassWithFinalizer.java (main-Methode) . 4.8 Frame.java . . . . . . . . . . . . . . . . . 4.9 NativeCall.java . . . . . . . . . . . . . . . 4.10 NativeCall.h . . . . . . . . . . . . . . . . . 4.11 NativeCall.cpp . . . . . . . . . . . . . . . A.1 ejb-jar.xml . . . . . . . . . . . . . . . . . . A.2 Account.java . . . . . . . . . . . . . . . . A.3 AccountBean.java . . . . . . . . . . . . . . A.4 AccountHome.java . . . . . . . . . . . . . A.5 AccountKey.java . . . . . . . . . . . . . . A.6 AccountLocal.java . . . . . . . . . . . . . A.7 AccountLocalHome.java . . . . . . . . . . A.8 Transfer.java . . . . . . . . . . . . . . . . A.9 TransferBean.java . . . . . . . . . . . . . . A.10 TransferHome.java . . . . . . . . . . . . . A.11 Test.java . . . . . . . . . . . . . . . . . . . A.12 TestBean.java . . . . . . . . . . . . . . . . A.13 TestHome.java . . . . . . . . . . . . . . . A.14 Garbage.java . . . . . . . . . . . . . . . . A.15 ThesisEJBClient.java . . . . . . . . . . . . A.16 PaintPanel.java . . . . . . . . . . . . . . . A.17 ReadOnlyDefaultTableModel.java . . . . . A.18 TableDate.java . . . . . . . . . . . . . . . A.19 UpdateGUIRunnable.java . . . . . . . . .

IX

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25 26 27 27 28 29 30 31 33 33 34 73 74 75 76 76 76 77 77 78 79 79 80 81 81 82 93 93 94 94

Kapitel 1

Einleitung 1.1

Motivation

Java ist eine objektorientierte Programmiersprache, die von der Firma Sun entwickelt wurde. Als Java im Januar 1996 offiziell das Licht der Welt erblickte, h¨atte sicherlich niemand f¨ ur m¨ oglich gehalten, welcher Siegeszug der Sprache bevorstehen sollte. In den darauf folgenden Jahren wurde die Weiterentwicklung schnell vorangetrieben. Bestand die Klassenbibliothek in den Anf¨angen aus noch rund 200 Klassen, so stieg der Umfang bis heute auf mehr als das Zehnfache an. Der große Vorteil von Java ist die Portabilit¨ at. Java-Anwendungen k¨onnen ohne Modifikation auf unterschiedlichen Plattformen ausgef¨ uhrt werden. Um dies zu erreichen, wird bei der Kompilierung ein Zwischencode erzeugt, der so genannte Bytecode. Er unterscheidet sich von Maschinencode durch seine Plattformunabh¨angigkeit. Der Bytecode wird innerhalb einer speziellen Laufzeitumgebung ausgef¨ uhrt, der Java Plattform, deren zentraler Bestandteil die Java Virtual Machine (JVM, im Folgenden auch Virtual Machine) ist. Diese wiederum ist an jedes Betriebssystem angepasst. Aufgrund der zunehmenden Komplexit¨at wurde Java seit dem Erscheinen der Version 1.2 in drei Editionen unterteilt: In die Java 2 Platform, Micro Edition (J2ME), die Java 2 Platform, Standard Edition (J2SE) und die Java 2 Platform, Enterprise Edition (J2EE) [3]. Der Schwerpunkt der Java 2 Platform, Enterprise Edition liegt im Bereich serverseitiger Gesch¨ aftsanwendungen. Transaktionsverarbeitung ist eine der wichtigsten Schl¨ usseltechnologien im Umfeld von Gesch¨ aftsanwendungen. Durch Transaktionen wird ein sicherer Zugriff konkurrierender Anwendungen auf gemeinsame Daten erm¨oglicht. Die Geschichte der Transaktionsverarbeitung reicht bis in die 60er Jahre des letzten Jahrhunderts zur¨ uck, als die ersten Flugplatzreservierungssysteme entstanden. Das wichtigste Transaktionsverarbeitungssystem ist das Customer Information Control System (CICS) [1] von IBM, das 1968 eingef¨ uhrt wurde. Heutzutage werden mehr als 30 Milliarden Transaktionen mit einem Umsatz von einer Billion Dollar pro Tag von CICS verarbeitet. Hochleistungstransaktionssysteme, wie etwa ein Sysplex Cluster unter z/OS [2], k¨ onnen mehr als 15 000 Transaktionen pro Sekunde verarbeiten. Die Verbreitung objekt- und komponentenorientierter Entwicklungskonzepte f¨ uhrte zur Entwicklung von objektorientierten Transaktionsmonitoren. Mit Einf¨ uhrung der Java 2 Platform, Enterprise Edition und der serverseitigen Komponententechnologie Enterprise JavaBeans (EJB) [4], entstanden auch auf Java basierende Transaktionsverarbeitungssysteme. 1

Durch die Verbreitung von Java angefangen beim Einsatz in mobilen Ger¨aten wie Mobiltelefonen und Personal Digital Assistants bis hin zu Applikationsservern und Transaktionsverarbeitungssystemen wandelte sich die Java Plattform von einer einfachen virtuellen Maschine zu einer betriebssystem¨ahnlichen Laufzeitumgebung. Im Zuge dieser Entwicklung wurde es insbesondere im Bereich der Transaktionsverarbeitung notwendig, Transaktionen innerhalb derselben virtuellen Maschine parallel zu verarbeiten, um einen akzeptablen Durchsatz zu erzielen. Auf der anderen Seite wurde auch der Wunsch laut, herk¨ommliche Anwendungen innerhalb derselben Virtual Machine parallel ausf¨ uhren zu k¨onnen. Java wurde jedoch nicht als virtuelles Betriebssystem konzipiert und es fehlt die bei Betriebssystemen u ¨bliche Abstraktion des Prozesses und in Folge dessen die damit verbundenen Mechanismen, wie z.B. Isolation und Ressourcenmanagement. Dennoch wurden Techniken entwickelt, die zumindest die Isolation garantieren sollten. Diese sind jedoch unzureichend und stellen keine zufriedenstellende L¨osung dar. In vielen Szenarien mag die dadurch gebotene Isolation f¨ ur die parallele Ausf¨ uhrung von Anwendungen und Transaktionen zwar ausreichend sein. Gerade aber bei der Transaktionsverarbeitung ist die Einhaltung der ACID-Eigenschaften und damit der Isolation einer der wichtigsten Aspekte. Diese Arbeit beschreibt die Defizite von Java in verschiedenen Bereichen, die in Zusammenhang mit der parallelen Ausf¨ uhrung von Anwendungen und Transaktionen relevant sind. Anschließend werden die analysierten Probleme praktisch nachvollzogen und diskutiert. Abschließend werden L¨osungsans¨atze aufgezeigt und die derzeitigen Bem¨ uhungen einer offiziellen und umfassenden L¨osung vorgestellt.

1.2

Aufbau der Arbeit

Diese Arbeit ist in sieben Kapitel untergliedert. Kapitel 2 erl¨ autert die Begriffe Transaktion und Transaktionsverarbeitung und stellt kurz die Komponententechnologie Enterprise JavaBeans vor. Kapitel 3 besch¨ aftigt sich mit dem Sicherheitskonzept von Java und den in Bezug auf Multitasking problematischen Bereichen. ¨ Kapitel 4 dokumentiert die praktische Uberpr¨ ufung der in Kapitel 3 aufgezeigten Probleme und diskutiert diese in verschiedenen Kontexten. Kapitel 5 verschafft einen Forschungs¨ uberblick der Thematik und ordnet die L¨osungsans¨ atze in vier verschiedene Bereiche ein. Kapitel 6 stellt die derzeitigen Bem¨ uhungen hinsichtlich einer offiziellen L¨osung vor. Kapitel 7 fasst die Ergebnisse der Arbeit zusammen. Im Anhang befindet sich der Quellcode der im Rahmen dieser Arbeit erstellten Software und eine Auflistung des Inhalts der beiliegenden DVD.

2

Kapitel 2

Transaktionsverarbeitung 2.1

Transaktionen

Jim Gray und Andreas Reuter definieren den Begriff ,,Transaktion” in ihrem Standardwerk ,,Transaction Processing: Concepts and Techniques” [GR93] folgendermaßen: A transaction is a collection of operations on the physical and abstract application state. ¨ Das klassische Beispiel f¨ ur eine Transaktion ist die Uberweisung eines Geldbetrags von einem Konto auf ein anderes. Dieser Vorgang besteht aus mehreren Schrit¨ ten. Es ist leicht einzusehen, dass bei einer Uberweisung alle Schritte durchgef¨ uhrt werden m¨ ussen, damit der Zustand der Konten konsistent bleibt. Außerdem m¨ ussen konkurrierende Zugriffe auf die Konten isoliert durchgef¨ uhrt werden, so dass sie sich nicht gegenseitig beeinflussen. Diese und weitere Beobachtungen f¨ uhren zu vier notwendigen Eigenschaften von Transaktionen, den so genannten ACID-Eigenschaften.

2.2

ACID-Eigenschaften

• Atomicity (Unteilbarkeit): Die Zustands¨ anderungen einer Transaktion sind atomar: Entweder werden alle durchgef¨ uhrt oder keine, beispielsweise Datenbank¨anderungen. • Consistency (Konsistenzerhaltung): Eine Transaktion ist eine korrekte Zustandstransformation. Alle durchgef¨ uhrten Schritte verletzen keine der Integrit¨atsbedingungen, die mit dem Zustand assoziiert sind. Dies erfordert, dass es sich bei einer Transaktion um ein korrektes Programm handelt. • Isolation (Abschirmung): Auch wenn Transaktionen gleichzeitig ablaufen, wurden aus der Sicht jeder Transaktion andere Transaktionen ausschließlich entweder davor oder danach ausgef¨ uhrt. • Durability (Dauerhaftigkeit): Sobald eine Transaktion erfolgreich endet (COMMIT), u ¨berdauern ihre Zustands¨ anderungen Fehler. 3

2.3

Transaktionsverarbeitungssysteme

Ein Transaktionsverarbeitungssystem stellt Werkzeuge zur Verf¨ ugung, um die Programmierung, Ausf¨ uhrung und Administration von Anwendungen zu erleichtern oder zu automatisieren. Es handelt sich dabei um ein sehr komplexes System, bestehend aus Anwendungen, Ressourcenmanagern (z.B. Datenbankmanagementsystemen), Netzwerksteuerung, Entwicklungswerkzeugen und dem Transaktionsmonitor, einer Reihe von Diensten, die den eingehenden Transaktionsfluss verwalten und koordinieren. Die wichtigsten davon sind: • Transactional RPC: Transactional RPC erm¨oglicht die Ausf¨ uhrung transaktionaler Remote Procedure Calls. • Transaktionsmanager: Der Transaktionsmanager u ¨berwacht und koordiniert die Aktivit¨aten aller Transaktionsteilnehmer, steuert die Ausf¨ uhrung von Transaktionen gem¨aß des 2-Phasen-Sperrprotokolls und behebt Fehler bei Misserfolg. • Log Manager: ¨ Der Log Manager protokolliert die Anderungen von Transaktionen, so dass eine konsistente Version aller Objekte im Falle eines Fehlers rekonstruiert werden kann. • Lock Manager: Der Lock Manager stellt einen allgemeinen Mechanismus bereit, um gleichzeitigen Zugriff auf Objekte zu regeln. Dies hilft Ressourcenmanagern f¨ ur Transaktionsisolation zu sorgen. Beispiele f¨ ur Transaktionsmonitore sind CICS von IBM, Tuxedo [9] von BEA und der COM+ [10] Transaktionsmonitor von Microsoft. Der Nachfolger von COM+/DCOM, das .NET Framework, enth¨alt keinen eigenen Transaktionsmonitor, sondern greift auf die Transaktionsinfrastruktur von COM+ zur¨ uck. Der J2EE-Applikationsserver WebSphere [11] von IBM beinhaltet einen rein objektorientierten Transaktionsmonitor, einen Object Transaction Monitor (OTM), der nur f¨ ur Enterprise Beans und Servlets ausgelegt ist. Dies gilt nicht f¨ ur WebSphere unter z/OS. Im Allgemeinen gibt es an jedem Standort oder Cluster eines Computernetzwerks ein eigenes Transaktionsverarbeitungssystem. Die Transaktionsmonitore dieser Systeme kooperieren miteinander, um dem Benutzer eine verteilte Ausf¨ uhrungsumgebung zur Verf¨ ugung zu stellen.

4

2.4

Enterprise JavaBeans

Enterprise JavaBeans ist eine serverseitige Komponententechnologie f¨ ur die Entwicklung von verteilten Gesch¨ aftsanwendungen auf der Basis von Java, die unter Leitung der Firma Sun entstand. Sie ist Teil der J2EE-Architektur. Enterprise JavaBeans bietet weitgehend automatisierte Transaktions-, Persistenz-, Verteilungs- und Sicherheitsfunktionen. Die Implementierung dieser notwendigen Funktionen sollen Entwicklern von EJB-Anwendungen abgenommen werden, damit diese sich auf die Gesch¨ aftslogik konzentrieren k¨ onnen. In einer Pressemitteilung [SM97] von Sun vom 2. April 1997 wird die EJB-Technologie erstmals offiziell erw¨ ahnt: Sun Microsystems, Inc., today launched a comprehensive Java Platform for the Enterprise, including a significant new technology initiative, Enterprise JavaBeans which uses Java to break through the complexity of building end-to-end business solutions. With Enterprise JavaBeans, developers can design and re-use small program elements to build powerful corporate applications. These ”componentized” applications can run manufacturing, financial, inventory management, and data processing on any system or platform that is Java-enabled. [...] Enterprise JavaBeans will simplify development, deployment and maintenance of high-performance enterprise applications and provide the infrastructure to shield developers from system level complexity. [...] After initial review with industry partners is completed, the draft specification for Enterprise JavaBeans will be available in summer 1997. The final specification and implementation will be available by the end of the year. Die erste EJB-Spezifikation wurde schließlich im M¨arz 1998 fertig gestellt. Im Dezember 1999 erschien die u ¨berarbeitete Version 1.1. Wichtige Verbesserungen wurden im August 2001 mit Version 2.0 der Spezifikation eingef¨ uhrt. Die aktuelle Version 2.1 [SM03a] erschien im November 2003. Der zweite Entwurf der kommenden Version 3.0 [SM05] ist seit Februar 2005 verf¨ ugbar. Enterprise Beans sind gem¨aß der EJB-Spezifikation in Java geschriebene serverseitige Softwarekomponenten. Sie werden innerhalb einer speziellen Laufzeitumgebung ausgef¨ uhrt, dem EJB-Container. Dieser stellt insbesondere die oben beschriebenen Funktionen zur Verf¨ ugung. Der EJB-Container selbst ist wiederum in einem Applikationsserver (siehe Abbildung 2.1) enthalten, der den Vorgaben der Java 2 Platform, Enterprise Edition entspricht. Der Applikationsserver kann weitere Container beinhalten, beispielsweise einen Web-Container f¨ ur Java Server Pages (JSP) [5] und Servlets [6]. Externe Clients, wie z.B. Applets, Anwendungen oder CORBA-Clients [7] k¨onnen per RMIIIOP [8] auf Enterprise Beans zugreifen. Innerhalb des Servers k¨onnen Servlets aber auch Enterprise Beans selbst als Clients fungieren. Es gibt drei verschiedene Typen von Enterprise Beans: Entity, Session und MessageDriven Beans. Entity Beans sind Komponenten, die eine objektorientierte Sicht auf persistent gespeicherte Entit¨ aten, also eindeutig identifizierbare und u ¨ber Attribute beschreibbare Informationseinheiten, repr¨asentieren. Diese Entit¨aten sind beispielsweise in einer Datenbank gespeichert. Handelt es sich in diesem Fall um eine relationale Datenbank, so korrespondieren Entity Beans jeweils mit genau einer Zeile der entsprechenden Datenbanktabelle. Entity Beans modellieren Gesch¨aftskonzepte, beispielsweise ein Konto.

5

Abbildung 2.1: Die Bestandteile eines J2EE-Applikationsservers Session Beans sind Komponenten, die auf dem Server ablaufende Gesch¨aftslogik ¨ implementieren. Sie modellieren Gesch¨aftsprozesse, wie z.B. eine Uberweisung. Message-Driven Beans entsprechen Session Beans, nur werden sie durch den Empfang einer Nachricht ausgel¨ ost. Sie wurden erst mit Version 2.0 der Spezifikation eingef¨ uhrt.

2.5

Transaktionen und Enterprise JavaBeans

Enterprise JavaBeans vereinfacht die Verwaltung von Transaktionen, da der EJBContainer die meisten Aufgaben bei der Ausf¨ uhrung von Transaktionen u ¨bernimmt. Sie werden daher auch Container-gesteuerte Transaktionen genannt. Transaktionssteuerung durch den EJB-Container wird auch als deklarative (implizite) Transaktionssteuerung bezeichnet, da Transaktionsattribute im Deployment Descriptor deklariert werden. Der Ablauf von Transaktionen kann aber auch explizit in der Bean-Klasse gesteuert werden. Man spricht dann von Bean-gesteuerten Transaktionen. Enterprise JavaBeans unterst¨ utzt neben lokalen Transaktionen, bei denen nur auf eine Datenbank zugegriffen wird, auch Transaktionen in verteilten Umgebungen mit mehreren Datenbanken. Das Transaktionsverarbeitungssystem in Enterprise JavaBeans (siehe Abbildung 2.2) setzt sich aus folgenden Bestandteilen zusammen: • Transaktionsmanager: Der Transaktionsmanager wurde bereits in Abschnitt 2.3 beschrieben. Die Schnittstelle zu Transaktionsmanagern ist in Enterprise JavaBeans die Java Transaktion API (JTA) ([SM02], [12]).

6

Abbildung 2.2: Das Transaktionsverarbeitungssystem in Enterprise JavaBeans • EJB-Container: Der EJB-Container u ¨bernimmt in Zusammenarbeit mit dem Transaktionsmanager Verwaltungsaufgaben (z.B. Aufzeichnung des Transaktionskontexts). Container-gesteuerte Transaktionen werden vom EJB-Container gestartet. EJB-Container und Transaktionsmanager arbeiten bei der Ausf¨ uhrung von Transaktionen eng zusammen. • Ressourcenmanager: Ressourcenmanager erm¨ oglichen den Zugriff auf transaktionsgesicherte Daten (z.B. den Zugriff auf relationale Datenbanken u ¨ber JDBC-Verbindungen). Sie registrieren sich beim Transaktionsmanager, sobald sie in eine Transaktion einbezogen werden. • Transaktionale Objekte: Transaktionale Objekte nehmen an Transaktionen teil und greifen auf die von Ressourcenmanagern verwalteten Daten zu. • Transaktionale Clients: Transaktionale Clients k¨ onnen Transaktionen starten. Java-Anwendungen, Applets, Servlets und Enterprise Beans werden als Clients von EJBAnwendungen bezeichnet. Clients sind nicht zwangsl¨aufig transaktionale Clients. Bei Container-gesteuerten Transaktionen haben Clients keinen Einfluss auf den Ablauf von Transaktionen. Die EJB-Spezifikation schreibt vor, dass der EJB-Container die Java Transaction API, die aus mehreren Schnittstellen besteht, unterst¨ utzen muss.

7

Allerdings muss der EJB-Container Enterprise Beans nur die Schnittstelle javax.transaction.UserTransaction zur Verf¨ ugung stellen, damit Transaktionen Bean-gesteuert ablaufen k¨onnen. Die anderen Schnittstellen sind zur Integration des Transaktions- und des Ressourcenmanagers vorgesehen. Der Transaktionsmanager muss die Java Transaction API ebenfalls unterst¨ utzen. Optional kann der Transaktionsmanager die Schnittstellen des Java Transaction Service (JTS) ([SM99], [13]) implementieren, eine Java-Umsetzung der CORBA Object Transaction Service (OTS) 1.2.1 [OMG01] Spezifikation. Die Schnittstelle javax.jts.TransactionService erlaubt dem Object Request Broker (ORB), sich gegen¨ uber dem Transaktionsmanager zu identifizieren. Dem Transaktionsmanager erlaubt sie, dem ORB die Sender- und Empf¨angerschnittstellen zu u ¨bergeben. Die OTS-Schnittstellen org.omg.CosTransactions und org.omg.CosTSPortability gew¨ahrleisten Interoperabilit¨at und Portabilit¨at. Sie definieren einen Standardmechanismus, der es jeder IIOP (bzw. RMI-IIOP) basierten Implementierung erlaubt, Transaktionskontext zu erzeugen und zwischen JTS Transaktionsmanagern zu propagieren.

Abbildung 2.3: JTA und JTS Abbildung 2.3 zeigt einen Transaktionsmanager, der die JTS-Schnittstellen implementiert. Die Java-Anwendung, der Applikationsserver und der Ressourcenmanager kommunizieren jeweils u ¨ber eine andere JTA-Schnittstelle mit dem Transaktionsmanager. Die gestrichelte Linie veranschaulicht die internen Schnittstellen, die Zugriff auf die OTS-Implementierung erm¨oglichen. Der Transaktionsmanager ist nicht dazu verpflichtet, seine OTS-Implementierung Benutzern zug¨anglich zu machen, die ihn u ¨ber die javax.transaction.TransactionManager Schnittstelle ansteuern.

8

2.6

Parallele Transaktionsverarbeitung

Um m¨ oglichst viele Transaktionen in einem gewissen Zeitraum zu verarbeiten, muss die Verarbeitung parallel durchgef¨ uhrt werden. Eine sequentielle Abarbeitung w¨are undenkbar, da Transaktionen, die sich u ¨ber mehrere Minuten, Tage oder gar Wochen hinziehen (so genannte Long-Running Transactions), die Ausf¨ uhrung anderer Transaktionen verz¨ ogern w¨ urden. ¨ Ublicherweise sind J2EE-Applikationsserver selbst in Java programmiert, was vor allem auf den Vorteil der Plattformunabh¨angigkeit und die damit leichtere Wartbarkeit zur¨ uckzuf¨ uhren ist, da nur eine Codebasis vorhanden ist. Dies ist beispielsweise bei WebSphere unter AIX [14], Linux [15] und Windows [16] der Fall. Lediglich WebSphere unter z/OS bildet hier eine Ausnahme. Die J2EE-Spezifikation [SM03b] schreibt nicht vor, wie ein J2EE-Applikationsserver partitioniert sein muss. Es bleibt dem Produktanbieter u ¨berlassen, ob der Applikationsserver als einzelner Prozess implementiert ist, oder aus mehreren Prozessen innerhalb eines oder mehrerer Netzwerkknoten besteht. Die parallele Ausf¨ uhrung von Transaktionen kann auf zwei Arten implementiert werden. Die erste M¨ oglichkeit ist, f¨ ur jede Transaktionen eine eigene Virtual Machine zu starten. Diese Methode scheidet aber aufgrund der schlechten Performance und des enormen Speicherverbrauchs aus. Die zweite M¨oglichkeit ist die Verwendung von Threads, die Java in Form der Klasse Thread bereitstellt. Die Benutzung von Threads allein reicht aber nicht aus, um Transaktionen unterschiedlicher EJBAnwendungen sicher parallel auszuf¨ uhren. Anwendungen und Transaktionen, die in derselben Virtual Machine ausgef¨ uhrt werden, d¨ urfen sich nicht gegenseitig beeinflussen k¨ onnen. Insbesondere kritische Transaktionen erzwingen eine strikte Einhaltung der ACID-Eigenschaften, in denen auch die Isolation gefordert wird. Dabei wird zwischen zwei Arten der Isolation unterschieden. Der klassische Isolationslevel bei Transaktionen bestimmt, in welchem Maß ben¨otigte Ressourcen gesperrt werden. Er untergliedert sich in vier Stufen: Uncommitted Read, Read Committed, Read Stability und Serializable. Die andere Art der Isolation wird an dieser Stelle als Request Isolation bezeichnet und beschreibt die gegenseitige Beeinflussung parallel ablaufender Transaktionsthreads. In weiteren Kapiteln steht der Begriff Isolation bei Transaktionen immer f¨ ur Request Isolation.

9

10

Kapitel 3

Isolation unter Java 3.1

Das Sicherheitskonzept von Java

Java [GJSB05] wird als sichere Sprache bezeichnet. Diese Sicherheit basiert auf vier grundlegenden Techniken: • Bytecode-Verifikation: Durch Bytecode-Verifikation wird sichergestellt, dass dieser der Spezifikation ¨ entspricht. Diese Uberpr¨ ufung findet beim erstmaligen Zugriff auf eine Klasse statt. • Typsicherheit: Programme d¨ urfen nur Operationen auf Instanzen von Typen ausf¨ uhren, die die Sprache als sinnvoll erachtet. Unsichere Typumwandlungen (z.B. von int nach Object) sind nicht m¨ oglich und damit auch die F¨alschung von Objektreferenzen. • Automatische Speicherbereinigung: Automatische Speicherbereinigung (Garbage Collection) ist unabdingbar, um Typsicherheit zu gew¨ ahrleisten, da diese durch noch bestehende Referenzen auf explizit gel¨ oschte Objekte außer Kraft gesetzt werden w¨ urde. • Speicherschutz: Der Speicherschutz verhindert Buffer Overflows bei Vektor- und Stackoperationen, z.B. beim Zugriff auf einen Index außerhalb des zul¨assigen Bereichs. Dar¨ uber hinaus verwendet Java zwei Kontrollmechanismen, um u ¨ber den Zugriff in Zusammenhang mit Objekten zu entscheiden: • Statische Zugriffskontrolle: Statische Zugriffskontrollmechanismen stellen fest, welche Operationen ein Codesegment auf einem Objekt durchf¨ uhren darf. Beispielsweise ist es einer Methode erlaubt, auf private Felder der Klasse zuzugreifen, in der sie definiert wurde, w¨ ahrend dies von außerhalb nicht m¨oglich ist. • Dynamische Zugriffskontrolle: Dynamische Zugriffskontrollmechanismen u ufen anhand des Call Stacks ¨berpr¨ (Call Stack Inspection), also durch R¨ uckverfolgung des Methodenaufrufs eines Objekts, ob das aufrufende Objekt u ur ben¨otigte Berechtigung ¨ber die daf¨ verf¨ ugt.

11

Abbildung 3.1: Das Sicherheitskonzept von Java

Das Sicherheitskonzept von Java bietet Anwendungen, die parallel innerhalb derselben Virtual Machine ausgef¨ uhrt werden, eine gewisse Isolation. Beispielsweise ist es nicht m¨ oglich, dass eine Anwendung durch F¨alschung einer Objektreferenz Daten einer anderen Anwendung ver¨ andert. An dieser Stelle zeigt sich, dass die Trennlinie zwischen Programmiersprache und Betriebssystem bei Java zunehmend verschwimmt, was vor allem durch die Unterteilung in Programmiersprache und Laufzeitumgebung deutlich wird. Java ist jedoch nicht als virtuelles Betriebssystem konzipiert worden. Das Sicherheitskonzept von Java stellt den inneren Schutz von Anwendungen sicher, es adressiert aber nicht die Bereiche, in denen Probleme bei der parallelen Ausf¨ uhrung von Anwendungen innerhalb derselben Laufzeitumgebung auftreten k¨onnen: Isolation, Interprozesskommunikation, Ressourcenmanagement und die sichere Beendigung von Anwendungen. Sie werden in den n¨achsten Abschnitten n¨aher beschrieben. Java fehlt es an Mechanismen, wie sie in Betriebssystemen zur L¨osung von Problemen in diesen Bereichen eingesetzt werden. Durch Hinzuf¨ ugen dieser Funktionalit¨at k¨ onnte Java durchaus ein virtuelles Betriebssystem auf Grundlage sprachbasierter Sicherheitsmechanismen darstellen. Sprachbasierte Sicherheit unterscheidet sich von der Sicherheit herk¨ ommlicher Betriebssysteme, die meist auf adressbasierten Mechanismen aufbaut und Funktionalit¨at der Hardware in Anspruch nimmt. Die Erweiterung sprachbasierter Sicherheit um Betriebssystemkonzepte allgemein und ein Vergleich zwischen adressbasierter und sprachbasierter Sicherheit sind Inhalt zweier Arbeiten, die an der Cornell Universit¨at entstanden ([HE98], [Haw00]). 12

3.2

Defizite im Bereich der Isolation

Java fehlt die Abstraktion des Prozesses, wie sie von Betriebssystemen her bekannt ist, also z.B. eine Klasse, die einen Prozess repr¨asentiert. Der g¨angige Ansatz zur Isolation von Anwendungen ist die Benutzung der Class Loader, die im n¨achsten Abschnitt vorgestellt werden. Anhand ihrer l¨asst sich zwar eine Definition f¨ ur Prozesse formulieren, diese ist aber nicht zufriedenstellend.

3.2.1

Mathematischer Exkurs: Bin¨ are Relation, transitive Hu ¨ lle

In den folgenden Abschnitten und Kapiteln wird der Begriff der transitiven H¨ ulle ben¨ otigt, der hier kurz erl¨ autert werden soll. Grundlage daf¨ ur sind in diesem Fall bin¨are Relationen. Allgemein ist eine Relation eine Beziehung, die zwischen etwas bestehen kann. In der Mathematik ist eine bin¨ are Relation R eine Teilmenge des kartesischen Produkts A × B zweier Mengen A und B: R ⊆ A × B mit A × B := {(a, b)|(a ∈ A) ∧ (b ∈ B)} Beispiel: Sei < eine Relation, die beschreibt, dass zwei Klassen direkt miteinander in Verbindung stehen. Eine Klasse X steht direkt mit einer anderen Klasse Y in Verbindung, falls innerhalb von Klasse X der Name von Klasse Y auftaucht (z.B. als Typ einer lokalen Variable). Sei nun A eine Menge, die aus den Klassen a, b und c besteht, wobei Klasse a direkt in Verbindung mit Klasse b und Klasse b direkt in Verbindung mit Klasse c steht. Diese Beziehung kann mathematisch so ausgedr¨ uckt werden: A = {a, b, c} A × A = {(a, a), (a, b), (a, c), (b, a), (b, b), (b, c), (c, a), (c, b), (c, c)} < := steht direkt in V erbindung mit < ⊆ A × A = {(a, b), (b, c)} Die transitive H¨ ulle R+ einer bin¨aren Relation R ist die Erweiterung der Relation um alle indirekt erreichbaren Paare. Die mathematische Definition sieht folgendermaßen aus: (x, y) ∈ R+ ⇔ ∃n ≥ 2 : ∃x = x1 , ..., xn = y ∈ M : ∀i ∈ {1, ..., n − 1} : (xi , xi+1 ) ∈ R Im obigen Beispiel besteht die transitive H¨ ulle i d < f i e l d −name>v a l u e < s e s s i o n i d=” T r a n s f e r ”> T r a n s f e r e j b s . TransferHome e j b s . T r a n s f e r e j b s . TransferLocalHome e j b s . T r a n s f e r L o c a l e j b s . T r a n s f e r B e a n S t a t e l e s s C o n t a i n e r e j b / Account E n t i t y e j b s . AccountHome e j b s . Account Account < s e s s i o n i d=” T e s t ”> Test e j b s . TestHome e j b s . Test e j b s . TestBean

73

S t a t e l e s s C o n t a i n e r T h e s i s C l i e n t . j a r

A.1.2

Enterprise Bean: Account

Account.java package e j b s ; /∗ ∗ ∗ Remote i n t e r f a c e f o r E n t e r p r i s e Bean : Account ∗/ public i n t e r f a c e Account extends j a v a x . e j b . EJBObject { public i n t g e t V a l u e ( ) throws j a v a . rmi . RemoteException ; public void s e t V a l u e ( i n t newValue ) throws j a v a . rmi . RemoteException ; public void d e p o s i t ( i n t v a l u e ) throws j a v a . rmi . RemoteException ; public void withDraw ( i n t v a l u e ) throws j a v a . rmi . RemoteException ; }

74

AccountBean.java package e j b s ; /∗ ∗ ∗ Bean i m p l e m e n t a t i o n c l a s s f o r E n t e r p r i s e Bean : Account ∗/ public abstract c l a s s AccountBean implements j a v a x . e j b . E n t i t y B e a n { private j a v a x . e j b . E n t i t y C o n t e x t myEntityCtx ; public void s e t E n t i t y C o n t e x t ( j a v a x . e j b . E n t i t y C o n t e x t c t x ) { myEntityCtx = c t x ; } public j a v a x . e j b . E n t i t y C o n t e x t g e t E n t i t y C o n t e x t ( ) { return myEntityCtx ; } public void u n s e t E n t i t y C o n t e x t ( ) { myEntityCtx = n u l l ; } public e j b s . AccountKey e j b C r e a t e ( i n t i d ) throws javax . ejb . CreateException { setId ( id ) ; return n u l l ; } public void e j b P o s t C r e a t e ( i n t i d ) throws j a v a x . e j b . C r e a t e E x c e p t i o n { } public void e j b A c t i v a t e ( ) { } public void e j b L o a d ( ) { } public void e j b P a s s i v a t e ( ) { } public void ejbRemove ( ) throws j a v a x . e j b . RemoveException { } public void e j b S t o r e ( ) { } public abstract i n t g e t I d ( ) ; public abstract void s e t I d ( i n t newId ) ; public abstract i n t g e t V a l u e ( ) ; public abstract void s e t V a l u e ( i n t newValue ) ; public void d e p o s i t ( i n t v a l u e ) { setValue ( getValue ( ) + value ) ; } public void withDraw ( i n t v a l u e ) { setValue ( getValue ( ) − value ) ; } }

75

AccountHome.java package e j b s ; /∗ ∗ ∗ Home i n t e r f a c e f o r E n t e r p r i s e Bean : Account ∗/ public i n t e r f a c e AccountHome extends j a v a x . e j b . EJBHome { public e j b s . Account c r e a t e ( i n t i d ) throws j a v a x . e j b . C r e a t e E x c e p t i o n , j a v a . rmi . RemoteException ; public e j b s . Account findByPrimaryKey ( e j b s . AccountKey primaryKey ) throws j a v a x . e j b . F i n d e r E x c e p t i o n , j a v a . rmi . RemoteException ; }

AccountKey.java package e j b s ; /∗ ∗ ∗ Key c l a s s f o r E n t i t y Bean : Account ∗/ public c l a s s AccountKey implements j a v a . i o . S e r i a l i z a b l e { s t a t i c f i n a l long s e r i a l V e r s i o n U I D = . . . ; public i n t i d ; public AccountKey ( ) { } public AccountKey ( i n t i d ) { this . id = id ; } public boolean e q u a l s ( j a v a . l a n g . O b j e c t otherKey ) { i f ( otherKey i n s t a n c e o f e j b s . AccountKey ) { e j b s . AccountKey o = ( e j b s . AccountKey ) otherKey ; return ( ( t h i s . i d == o . i d ) ) ; } return f a l s e ; } public i n t hashCode ( ) { return ( ( new j a v a . l a n g . I n t e g e r ( i d ) . hashCode ( ) ) ) ; } }

AccountLocal.java package e j b s ; /∗ ∗ ∗ L o c a l i n t e r f a c e f o r E n t e r p r i s e Bean : Account ∗/ public i n t e r f a c e A c c o u n t L o c a l extends j a v a x . e j b . EJBLocalObject { public i n t g e t V a l u e ( ) ; public void s e t V a l u e ( i n t newValue ) ; public void d e p o s i t ( i n t v a l u e ) ; public void withDraw ( i n t v a l u e ) ; }

76

AccountLocalHome.java package e j b s ; /∗ ∗ ∗ L o c a l Home i n t e r f a c e f o r E n t e r p r i s e Bean : Account ∗/ public i n t e r f a c e AccountLocalHome extends j a v a x . e j b . EJBLocalHome { public e j b s . A c c o u n t L o c a l c r e a t e ( i n t i d ) throws javax . ejb . CreateException ; public e j b s . A c c o u n t L o c a l findByPrimaryKey ( e j b s . AccountKey primaryKey ) throws j a v a x . e j b . F i n d e r E x c e p t i o n ; }

A.1.3

Enterprise Bean: Transfer

Transfer.java package e j b s ; /∗ ∗ ∗ Remote i n t e r f a c e f o r E n t e r p r i s e Bean : T r a n s f e r ∗/ public i n t e r f a c e T r a n s f e r extends j a v a x . e j b . EJBObject { public void t r a n s f e r ( i n t primaryKey1 , i n t primaryKey2 , i n t v a l u e ) throws Exception ; }

77

TransferBean.java package e j b s ; import import import import import import import

com . ibm . e t o o l s . s e r v i c e . l o c a t o r . S e r v i c e L o c a t o r M a n a g e r ; e j b s . Account ; e j b s . AccountHome ; e j b s . AccountKey ; j a v a . rmi . RemoteException ; javax . ejb . ∗ ; j a v a x . naming . ∗ ;

/∗ ∗ ∗ Bean i m p l e m e n t a t i o n c l a s s f o r E n t e r p r i s e Bean : T r a n s f e r ∗/ public c l a s s T r a n s f e r B e a n implements j a v a x . e j b . S e s s i o n B e a n { private j a v a x . e j b . S e s s i o n C o n t e x t mySessionCtx ; private f i n a l s t a t i c S t r i n g STATIC AccountHome REF NAME = ” e j b / Account ” ; private f i n a l s t a t i c C l a s s STATIC AccountHome CLASS = AccountHome . c l a s s ; public j a v a x . e j b . S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t ( ) { return mySessionCtx ; } public void s e t S e s s i o n C o n t e x t ( j a v a x . e j b . S e s s i o n C o n t e x t c t x ) { mySessionCtx = c t x ; } public void e j b C r e a t e ( ) throws j a v a x . e j b . C r e a t e E x c e p t i o n { } public void e j b A c t i v a t e ( ) { } public void e j b P a s s i v a t e ( ) { } public void ejbRemove ( ) { } protected Account find A cco u nt H o m e f in dBy Pr i m a r yK ey ( AccountKey primaryKey ) { AccountHome anAccountHome = ( AccountHome ) S e r v i c e L o c a t o r M a n a g e r . getRemoteHome ( STATIC AccountHome REF NAME , STATIC AccountHome CLASS ) ; try { i f ( anAccountHome != n u l l ) return anAccountHome . findByPrimaryKey ( primaryKey ) ; } catch ( j a v a x . e j b . F i n d e r E x c e p t i o n f e ) { fe . printStackTrace ( ) ; } catch ( RemoteException r e ) { re . printStackTrace ( ) ; } return n u l l ; } public void t r a n s f e r ( i n t primaryKey1 , i n t primaryKey2 , i n t v a l u e ) throws E x c e p t i o n { Account a c c o u n t 1 = fi n d A cc ou nt H o m e f i ndBy Pr i m a r y Key (new AccountKey ( primaryKey1 ) ) ; Account a c c o u n t 2 = fi n d A cc ou nt H o m e f i ndBy Pr i m a r y Key (new AccountKey ( primaryKey2 ) ) ; a c c o u n t 1 . withDraw ( v a l u e ) ; account2 . d e p o s i t ( value ) ; } }

78

TransferHome.java package e j b s ; /∗ ∗ ∗ Home i n t e r f a c e f o r E n t e r p r i s e Bean : T r a n s f e r ∗/ public i n t e r f a c e TransferHome extends j a v a x . e j b . EJBHome { public e j b s . T r a n s f e r c r e a t e ( ) throws j a v a x . e j b . C r e a t e E x c e p t i o n , j a v a . rmi . RemoteException ; }

A.1.4

Enterprise Bean: Test

Test.java package e j b s ; import j a v a . rmi . RemoteException ; /∗ ∗ ∗ Remote i n t e r f a c e f o r E n t e r p r i s e Bean : Test ∗/ public i n t e r f a c e T e s t extends j a v a x . e j b . EJBObject { public void a l l o c a t e M e m o r y ( i n t megabytes , i n t m i l l i s e c o n d s T o W a i t , boolean s t o r e ) throws RemoteException ; }

79

TestBean.java package e j b s ; import j a v a . u t i l . ∗ ; /∗ ∗ ∗ Bean i m p l e m e n t a t i o n c l a s s f o r E n t e r p r i s e Bean : Test ∗/ public c l a s s TestBean implements j a v a x . e j b . S e s s i o n B e a n { private j a v a x . e j b . S e s s i o n C o n t e x t mySessionCtx ; public j a v a x . e j b . S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t ( ) { return mySessionCtx ; } public void s e t S e s s i o n C o n t e x t ( j a v a x . e j b . S e s s i o n C o n t e x t c t x ) { mySessionCtx = c t x ; } public void e j b C r e a t e ( ) throws j a v a x . e j b . C r e a t e E x c e p t i o n { } public void e j b A c t i v a t e ( ) { } public void e j b P a s s i v a t e ( ) { } public void ejbRemove ( ) { } public void a l l o c a t e M e m o r y ( i n t megabytes , i n t m i l l i s e c o n d s T o W a i t , boolean s t o r e ) { V e c t o r g a r b a g e = new V e c t o r ( ) ; f o r ( i n t i = 0 ; i < megabytes ; i ++) { try { if ( store ) g a r b a g e . addElement (new Garbage ( ) ) ; else new Garbage ( ) ; } catch ( OutOfMemoryError e ) { System . o ut . p r i n t l n ( ” TestBean . a l l o c a t e M e m o r y : ” + ” OutOfMemoryError − c l e a r i n g g a r b a g e ! ” ) ; garbage . c l e a r ( ) ; return ; } try { Thread . s l e e p ( m i l l i s e c o n d s T o W a i t ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) {} } garbage . c l e a r ( ) ; } }

80

TestHome.java package e j b s ; /∗ ∗ ∗ Home i n t e r f a c e f o r E n t e r p r i s e Bean : Test ∗/ public i n t e r f a c e TestHome extends j a v a x . e j b . EJBHome { public e j b s . T e s t c r e a t e ( ) throws j a v a x . e j b . C r e a t e E x c e p t i o n , j a v a . rmi . RemoteException ; }

Garbage.java package e j b s ; public c l a s s Garbage { private s t a t i c boolean f i n a l i z a t i o n = f a l s e ; private s t a t i c i n t c o u n t e r = 0 ; private i n t i d ; Byte [ ]

megabyte = new Byte [ 1 0 4 8 5 7 6 ] ;

Garbage ( ) { i d = c o u n t e r ++; System . o ut . p r i n t l n ( ” Erzeugung von Objekt ” + i d ) ; } public s t a t i c void s e t F i n a l i z a t i o n ( boolean f i n a l i z a t i o n ) { Garbage . f i n a l i z a t i o n = f i n a l i z a t i o n ; } protected void f i n a l i z e ( ) { while ( f i n a l i z a t i o n ) { System . o ut . p r i n t l n ( ” Ausf u ¨ hrung d e s id ) ; try { Thread . s l e e p ( 1 0 0 0 ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) {} } } }

81

F i n a l i s i e r e r s von Objekt ” +

A.2 A.2.1 import import import import import import import import

Der Denial-of-Service-Testclient ThesisEJBClient.java ejbs . ∗ ; j a v a . awt . ∗ ; j a v a . rmi . RemoteException ; java . u t i l . ∗ ; j a v a x . naming . ∗ ; j a v a x . rmi . P o r t a b l e R e m o t e O b j e c t ; javax . swing . ∗ ; javax . t r a n s a c t i o n . TransactionRolledbackException ;

public c l a s s T h e s i s E J B C l i e n t extends JFrame { private private private private private private private private private private

I n i t i a l C o n t e x t i n i t i a l C o n t e x t = null ; I n t e g e r t x s = new I n t e g e r ( 0 ) ; JFrame s e l f R e f e r e n c e = t h i s ; MemoryThread memoryThread = n u l l ; ReadOnlyDefaultTableModel t a b l e M o d e l = n u l l ; TestHome testHome = n u l l ; ThreadManager threadManager = new ThreadManager ( ) ; TransferHome t r a n s f e r H o m e = n u l l ; V e c t o r a c c o u n t s = new V e c t o r ( ) ; j a v a . u t i l . Timer t i m e r = n u l l ;

// GUI−Elemente private private private private private private private private private private private private private private private private private private private private private private private private private private private

JButton j B u t t o n = n u l l ; JButton j B u t t o n 1 = n u l l ; JButton j B u t t o n 2 = n u l l ; JButton j B u t t o n 3 = n u l l ; JCheckBox jCheckBox = n u l l ; JComboBox jComboBox = n u l l ; JComboBox jComboBox1 = n u l l ; JLabel jLa bel = null ; JLabel jLabel1 = null ; JLabel jLabel2 = null ; JLabel jLabel3 = null ; JLabel jLabel4 = null ; JLabel jLabel5 = null ; JLabel jLabel6 = null ; JMenu jMenu = n u l l ; JMenu jMenu1 = n u l l ; JMenu jMenu2 = n u l l ; JMenuBar jJMenuBar = n u l l ; JMenuItem jMenuItem = n u l l ; JMenuItem jMenuItem1 = n u l l ; JMenuItem jMenuItem2 = n u l l ; JPanel jContentPane = null ; JScrollPane j S c r o l l P a n e = null ; JScrollPane j S c r o l l P a n e 1 = null ; JTable j T a b l e = n u l l ; JTextArea j T e x t A r e a = n u l l ; PaintPanel jPanel = null ;

// K l a s s e UpdateTableTask private c l a s s UpdateTableTask extends TimerTask { public void run ( ) { u p d a t e T a b l e ( true ) ; } } // K l a s s e ThreadManager public c l a s s ThreadManager { private V e c t o r t h r e a d s = new V e c t o r ( ) ; private boolean r u n n i n g = f a l s e ; public i n t getThreadAccountNumber ( i n t i n d e x ) { return ( ( T r a n s f e r T h r e a d ) t h r e a d s . elem en t A t ( i n d e x ) ) . getAccountNumber ( ) ; } public void s t a r t T h r e a d s ( ) {

82

threads threads threads threads

. add (new . add (new . add (new . add (new

TransferThread (0 , TransferThread (1 , TransferThread (2 , TransferThread (3 ,

1000)); 1001)); 1002)); 1003));

f o r ( i n t i = 0 ; i < 2 ; i ++) { ( ( T r a n s f e r T h r e a d ) t h r e a d s . e l e m e nt A t ( i ) ) . s t a r t ( ) ; appendText ( ”THREAD ” + ( ( T r a n s f e r T h r e a d ) t h r e a d s . elem en t A t ( i ) ) . getAccountNumber ( ) + ” START\n” ) ; } r u n n i n g = true ; } public void s t o p T h r e a d s ( ) { i f ( ! running ) return ; f o r ( i n t i = 0 ; i < 2 ; i ++) ( ( T r a n s f e r T h r e a d ) t h r e a d s . e l e m e nt A t ( i ) ) . t e r m i n a t e ( ) ; f o r ( i n t i = 0 ; i < 2 ; i ++) try { ( ( T r a n s f e r T h r e a d ) t h r e a d s . e l e m e nt A t ( i ) ) . j o i n ( ) ; appendText ( ”THREAD ” + ( ( T r a n s f e r T h r e a d ) t h r e a d s . e l em en t A t ( i ) ) . getAccountNumber ( ) + ” STOP\n” ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) { System . o ut . p r i n t l n ( ” E x c e p t i o n i n ThreadManager . s t o p T h r e a d s : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; } threads . clear ( ) ; running = f a l s e ; } } // K l a s s e MemoryThread private c l a s s MemoryThread extends Thread { private T e s t t e s t ; private i n t megabytes ; private i n t m i l l i s e c o n d s T o W a i t ; MemoryThread ( i n t megabytes , i n t m i l l i s e c o n d s T o W a i t ) { t h i s . megabytes = megabytes ; this . millisecondsToWait = millisecondsToWait ; } public void run ( ) { try { t e s t = testHome . c r e a t e ( ) ; } catch ( E x c e p t i o n e ) { System . o ut . p r i n t l n ( ” E x c e p t i o n i n MemoryThread . run : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; } try { appendText ( ”THREAD MEMORY START\n” ) ; t e s t . a l l o c a t e M e m o r y ( megabytes , m i l l i s e c o n d s T o W a i t , jCheckBox . i s S e l e c t e d ( ) ) ; appendText ( ”THREAD MEMORY STOP\n” ) ; } catch ( E x c e p t i o n e ) { System . o ut . p r i n t l n ( ” E x c e p t i o n i n MemoryThread . run : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; } } } // K l a s s e TransferThread

83

private c l a s s T r a n s f e r T h r e a d extends Thread { private private private private private private

Random randomAccount = new Random ( ) ; Random randomValue = new Random ( ) ; Transfer tr a nsf er ; boolean t e r m i n a t i o n = f a l s e ; int accountIndex ; i n t accountNumber ;

T r a n s f e r T h r e a d ( i n t a c c o u n t I n d e x , i n t accountNumber ) { this . accountIndex = accountIndex ; t h i s . accountNumber = accountNumber ; try { t r a n s f e r = transferHome . c r e a t e ( ) ; } catch ( E x c e p t i o n e ) { System . o ut . p r i n t l n ( ” Exception in TransferThread . TransferThread : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; } } public void run ( ) { while ( ! t e r m i n a t i o n ) { try { t r a n s f e r . t r a n s f e r ( accountNumber , threadManager . getThreadAccountNumber ( a c c o u n t I n d e x + 2 ) , ( randomValue . n e x t I n t ( 1 0 ) + 1 ) ∗ 1 0 ) ; } catch ( T r a n s a c t i o n R o l l e d b a c k E x c e p t i o n e ) { appendText ( ”THREAD ” + accountNumber + ” T r a n s a c t i o n R o l l e d b a c k E x c e p t i o n \n” ) ; } catch ( E x c e p t i o n e ) { System . o u t . p r i n t l n ( ” E x c e p t i o n i n T r a n s f e r T h r e a d . run : ” + e . getMessage ( ) ) ; break ; } synchronized ( t x s ) { t x s = new I n t e g e r ( t x s . i n t V a l u e ( ) + 1 ) ; } } termination = false ; } public i n t getAccountNumber ( ) { return accountNumber ; } public void t e r m i n a t e ( ) { t e r m i n a t i o n = true ; } } public s t a t i c void main ( S t r i n g [ ] a r g s ) { T h e s i s E J B C l i e n t t h e s i s E J B C l i e n t = new T h e s i s E J B C l i e n t ( ) ; t h e s i s E J B C l i e n t . show ( ) ; } /∗ ∗ ∗ This i s t h e d e f a u l t c o n s t r u c t o r ∗/ public T h e s i s E J B C l i e n t ( ) { super ( ) ; initialize (); S t r i n g serverName = System . g e t P r o p e r t y ( ” serverName ” , ” ” ) ; if

( serverName . e q u a l s ( ” ” ) ) { JOptionPane . s h o w M e s s a g e D i a l o g ( s e l f R e f e r e n c e , ” Die S y s t e m e i g e n s c h a f t ’ serverName ’ i s t n i c h t g e s e t z t ! ” , ” H i n w e i s ” , JOptionPane .ERROR MESSAGE ) ; System . e x i t ( 0 ) ;

}

84

// I n i t i a l C o n t e x t P r o p e r t i e s p r o p s = new P r o p e r t i e s ( ) ; p r o p s . put ( Context . INITIAL CONTEXT FACTORY, ”com . ibm . w e b s p h e r e . naming . W s n I n i t i a l C o n t e x t F a c t o r y ” ) ; p r o p s . put ( Context . PROVIDER URL, ” i i o p : / / ” + serverName + ” : 2 8 0 9 ” ) ; try { i n i t i a l C o n t e x t = new I n i t i a l C o n t e x t ( p r o p s ) ; } catch ( NamingException e ) { System . o ut . p r i n t l n ( ” Exception in ThesisEJBClient . ThesisEJBClient : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; } Object r e f 1 = null ; Object r e f 2 = null ; Object r e f 3 = null ; try { r e f 1 = i n i t i a l C o n t e x t . l o o k u p ( ” e j b / e j b s / AccountHome ” ) ; r e f 2 = i n i t i a l C o n t e x t . l o o k u p ( ” e j b / e j b s / TestHome” ) ; r e f 3 = i n i t i a l C o n t e x t . l o o k u p ( ” e j b / e j b s / TransferHome ” ) ; } catch ( NamingException e ) { JOptionPane . s h o w M e s s a g e D i a l o g ( s e l f R e f e r e n c e , ” Der A p p l i k a t i o n s s e r v e r i s t n i c h t v e r f u ¨ gbar ! ” , ” Hinweis ” , JOptionPane .ERROR MESSAGE ) ; System . e x i t ( 0 ) ; } AccountHome accountHome = ( AccountHome ) P o r t a b l e R e m o t e O b j e c t . narrow ( r e f 1 , AccountHome . c l a s s ) ; testHome = ( TestHome ) P o r t a b l e R e m o t e O b j e c t . narrow ( r e f 2 , TestHome . c l a s s ) ; t r a n s f e r H o m e = ( TransferHome ) P o r t a b l e R e m o t e O b j e c t . narrow ( r e f 3 , TransferHome . c l a s s ) ; try { a c c o u n t s . add ( accountHome . findByPrimaryKey ( new AccountKey ( 1 0 0 0 ) ) ) ; a c c o u n t s . add ( accountHome . findByPrimaryKey ( new AccountKey ( 1 0 0 1 ) ) ) ; a c c o u n t s . add ( accountHome . findByPrimaryKey ( new AccountKey ( 1 0 0 2 ) ) ) ; a c c o u n t s . add ( accountHome . findByPrimaryKey ( new AccountKey ( 1 0 0 3 ) ) ) ; } catch ( E x c e p t i o n e ) { System . o ut . p r i n t l n ( ” Exception in ThesisEJBClient . ThesisEJBClient : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; } appendText ( ”EJB− I n i t i a l i s i e r u n g

e r f o l g r e i c h ! \ n” ) ;

// GUI t a b l e M o d e l = new ReadOnlyDefaultTableModel ( ) ; t a b l e M o d e l . addColumn ( ”Kontonummer” ) ; t a b l e M o d e l . addColumn ( ” S a l d o ” ) ; f o r ( i n t i = 0 ; i < a c c o u n t s . s i z e ( ) ; i ++) { Account a c c o u n t = ( Account ) a c c o u n t s . e l em en t A t ( i ) ; V e c t o r row = new V e c t o r ( ) ; try { row . add ( S t r i n g . v a l u e O f ( ( ( AccountKey ) a c c o u n t . getPrimaryKey ( ) ) . i d ) ) ; row . add ( S t r i n g . v a l u e O f ( a c c o u n t . g e t V a l u e ( ) ) ) ; } catch ( RemoteException e ) { System . o ut . p r i n t l n ( ” Exception in ThesisEJBClient . ThesisEJBClient : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; }

85

t a b l e M o d e l . addRow ( row ) ; } jTable . setModel ( tableModel ) ; } private void appendText ( S t r i n g t e x t ) { j T e x t A r e a . append ( ”− ” + t e x t ) ; S w i n g U t i l i t i e s . i n v o k e L a t e r (new Runnable ( ) { public void run ( ) { jTextArea . s e t C a r e t P o s i t i o n ( jTextArea . getText ( ) . l e n g t h ( ) ) ; } }); } private void s t o p T h r e a d s ( ) { threadManager . s t o p T h r e a d s ( ) ; } private void u p d a t e T a b l e ( boolean u p d a t e P a n e l ) { UpdateGUIRunnable updateGUIRunnable = n u l l ; if {

( updatePanel ) int value = txs . intValue ( ) ; synchronized ( t x s ) { t x s = new I n t e g e r ( 0 ) ; } updateGUIRunnable = new UpdateGUIRunnable ( t a b l e M o d e l , j L a b e l 2 , jPanel , value ) ;

} else updateGUIRunnable = new UpdateGUIRunnable ( t a b l e M o d e l ) ; f o r ( i n t i = 0 ; i < a c c o u n t s . s i z e ( ) ; i ++) { Account a c c o u n t = ( Account ) a c c o u n t s . e l em en t A t ( i ) ; S t r i n g value = ”” ; try { value = S t r i n g . valueOf ( account . getValue ( ) ) ; } catch ( RemoteException e ) { System . o ut . p r i n t l n ( ” Exception i n ThesisEJBClient . updateTable : ” + e . getMessage ( ) ) ; System . e x i t ( 0 ) ; } updateGUIRunnable . addTableDate (new TableDate ( v a l u e , i ,

1));

} S w i n g U t i l i t i e s . i n v o k e L a t e r ( updateGUIRunnable ) ; } /∗ ∗ ∗ This method i n i t i a l i z e s t h i s ∗ ∗ @return v o i d ∗/ private void i n i t i a l i z e ( ) { Dimension d i m e n s i o n = T o o l k i t . g e t D e f a u l t T o o l k i t ( ) . g e t S c r e e n S i z e ( ) ; this this this this

. s e t S i z e (630 , 650); . setContentPane ( getJContentPane ( ) ) ; . setJMenuBar ( getJJMenuBar ( ) ) ; . setIconImage ( j a v a . awt . T o o l k i t . g e t D e f a u l t T o o l k i t ( ) . g e t I m a g e ( System . g e t P r o p e r t i e s ( ) . g e t P r o p e r t y ( ” u s e r . d i r ” ) + ”/ java . g i f ” ) ) ; this . s e t T i t l e ( ” Diplomarbeit Jens Mu ¨ l l e r − D e n i a l −o f −S e r v i c e −T e s t c l i e n t ” ) ; this . setResizable ( false ) ; this . setLocation ( ( d i m e n s i o n . width − t h i s . g e t S i z e ( ) . width ) / 2 , ( dimension . height − this . g e t S i z e ( ) . height ) / 2 ) ; t h i s . addWindowListener (new j a v a . awt . e v e n t . WindowAdapter ( ) {

86

public void w i n d o w C l o s i n g ( j a v a . awt . e v e n t . WindowEvent e ) { i f ( memoryThread != n u l l ) { try { memoryThread . j o i n ( ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e x c e p t i o n ) {} } stopThreads ( ) ; System . e x i t ( 0 ) ; } }); } /∗ ∗ ∗ This method i n i t i a l i z e s j P a n e l ∗ ∗ @return j a v a x . swing . JPanel ∗/ private P a i n t P a n e l g e t J P a n e l ( ) { i f ( j P a n e l == n u l l ) { j P a n e l = new P a i n t P a n e l ( ) ; jPanel . s e t S i z e (290 , 151); jPanel . setLocation (300 , 230); jPanel . setFont ( new j a v a . awt . Font ( ” C o u r i e r New” , j a v a . awt . Font . PLAIN , 1 2 ) ) ; } return j P a n e l ; } /∗ ∗ ∗ This method i n i t i a l i z e s j B u t t o n ∗ ∗ @return j a v a x . swing . JButton ∗/ private j a v a x . s w i n g . JButton g e t J B u t t o n ( ) { i f ( j B u t t o n == n u l l ) { j B u t t o n = new j a v a x . s w i n g . JButton ( ) ; jButton . s e t S i z e (250 , 2 0 ) ; jButton . s e t L o c a t i o n (25 , 5 0 ) ; ¨ berweisungsthreads starten ” ) ; jButton . setText ( ” U j B u t t o n . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . A c t i o n E v e n t e ) { jButton . setEnabled ( f a l s e ) ; jButton2 . setEnabled ( f a l s e ) ; t i m e r = new j a v a . u t i l . Timer ( ) ; t i m e r . s c h e d u l e (new UpdateTableTask ( ) , 0 , 5 0 0 0 ) ; threadManager . s t a r t T h r e a d s ( ) ; j B u t t o n 1 . s e t E n a b l e d ( true ) ; } }); } return j B u t t o n ; } /∗ ∗ ∗ This method i n i t i a l i z e s j B u t t o n 1 ∗ ∗ @return j a v a x . swing . JButton ∗/ private j a v a x . s w i n g . JButton g e t J B u t t o n 1 ( ) { i f ( j B u t t o n 1 == n u l l ) { j B u t t o n 1 = new j a v a x . s w i n g . JButton ( ) ; jButton1 . s e t S i z e (250 , 2 0 ) ; jButton1 . s e t L o c a t i o n (25 , 8 0 ) ; ¨ berweisungsthreads stoppen ” ) ; jButton1 . setText ( ” U jButton1 . setEnabled ( f a l s e ) ; j B u t t o n 1 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . A c t i o n E v e n t e ) { jButton1 . setEnabled ( f a l s e ) ; stopThreads ( ) ; timer . cancel ( ) ; updateTable ( f a l s e ) ; j L a b e l 2 . s e t T e x t ( ”−” ) ; jPanel . r e s et ( ) ;

87

j B u t t o n . s e t E n a b l e d ( true ) ; j B u t t o n 2 . s e t E n a b l e d ( true ) ; } }); } return j B u t t o n 1 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j B u t t o n 2 ∗ ∗ @return j a v a x . swing . JButton ∗/ private j a v a x . s w i n g . JButton g e t J B u t t o n 2 ( ) { i f ( j B u t t o n 2 == n u l l ) { j B u t t o n 2 = new j a v a x . s w i n g . JButton ( ) ; jButton2 . s e t S i z e (250 , 2 0 ) ; jButton2 . s e t L o c a t i o n (25 , 1 1 0 ) ; jButton2 . setText ( ” S a l d i zuru ¨cksetzen ” ) ; j B u t t o n 2 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . A c t i o n E v e n t e ) { f o r ( i n t i = 0 ; i < a c c o u n t s . s i z e ( ) ; i ++) { Account a c c o u n t = ( Account ) a c c o u n t s . e l em en t A t ( i ) ; try { account . setValue (10000000); } catch ( RemoteException e x c e p t i o n ) { System . o u t . p r i n t l n ( ” Exception in getJButton2 ( ) : ” + ex c ept i o n . getMessage ( ) ) ; System . e x i t ( 0 ) ; } updateTable ( f a l s e ) ; } } }); } return j B u t t o n 2 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j B u t t o n 3 ∗ ∗ @return j a v a x . swing . JButton ∗/ private j a v a x . s w i n g . JButton g e t J B u t t o n 3 ( ) { i f ( j B u t t o n 3 == n u l l ) { j B u t t o n 3 = new j a v a x . s w i n g . JButton ( ) ; jButton3 . s e t S i z e (250 , 2 0 ) ; jButton3 . s e t L o c a t i o n (26 , 3 6 0 ) ; j B u t t o n 3 . s e t T e x t ( ” D e n i a l −o f −S e r v i c e −A n g r i f f s t a r t e n ” ) ; j B u t t o n 3 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . A c t i o n E v e n t e ) { i n t v1 = I n t e g e r . p a r s e I n t ( ( S t r i n g ) jComboBox . g e t S e l e c t e d I t e m ( ) ) ; i n t v2 = I n t e g e r . p a r s e I n t ( ( S t r i n g ) jComboBox1 . g e t S e l e c t e d I t e m ( ) ) ; memoryThread = new MemoryThread ( v1 , v2 ) ; memoryThread . s t a r t ( ) ; } }); } return j B u t t o n 3 ; } /∗ ∗ ∗ This method i n i t i a l i z e s jCheckBox ∗ ∗ @return j a v a x . swing . JCheckBox ∗/ private j a v a x . s w i n g . JCheckBox getJCheckBox ( ) { i f ( jCheckBox == n u l l ) { jCheckBox = new j a v a x . s w i n g . JCheckBox ( ) ; jCheckBox . s e t S i z e ( 2 5 0 , 2 1 ) ; jCheckBox . s e t T e x t ( ” O b j e k t e z w i s c h e n s p e i c h e r n ” ) ; jCheckBox . s e t L o c a t i o n ( 2 6 , 3 2 0 ) ; } return jCheckBox ; }

88

/∗ ∗ ∗ This method i n i t i a l i z e s jComboBox ∗ ∗ @return j a v a x . swing . JComboBox ∗/ private j a v a x . s w i n g . JComboBox getJComboBox ( ) { i f ( jComboBox == n u l l ) { jComboBox = new j a v a x . s w i n g . JComboBox ( ) ; jComboBox . s e t S i z e ( 1 2 0 , 2 4 ) ; jComboBox . s e t L o c a t i o n ( 1 5 5 , 2 3 0 ) ; } jComboBox . addItem ( ” 10 ” ) ; jComboBox . addItem ( ” 20 ” ) ; jComboBox . addItem ( ” 40 ” ) ; jComboBox . addItem ( ” 60 ” ) ; jComboBox . addItem ( ” 80 ” ) ; jComboBox . addItem ( ” 100 ” ) ; jComboBox . addItem ( ” 200 ” ) ; jComboBox . addItem ( ” 300 ” ) ; jComboBox . addItem ( ” 400 ” ) ; jComboBox . addItem ( ” 500 ” ) ; jComboBox . addItem ( ” 1000 ” ) ; return jComboBox ; } /∗ ∗ ∗ This method i n i t i a l i z e s jComboBox1 ∗ ∗ @return j a v a x . swing . JComboBox ∗/ private j a v a x . s w i n g . JComboBox getJComboBox1 ( ) { i f ( jComboBox1 == n u l l ) { jComboBox1 = new j a v a x . s w i n g . JComboBox ( ) ; jComboBox1 . s e t S i z e ( 1 2 0 , 2 4 ) ; jComboBox1 . s e t L o c a t i o n ( 1 5 5 , 2 8 0 ) ; } jComboBox1 . addItem ( ” 50 ” ) ; jComboBox1 . addItem ( ” 25 ” ) ; jComboBox1 . addItem ( ” 10 ” ) ; jComboBox1 . addItem ( ” 5 ” ) ; jComboBox1 . addItem ( ” 0 ” ) ; return jComboBox1 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j L a b e l ∗ ∗ @return j a v a x . swing . J L a b e l ∗/ private j a v a x . s w i n g . J L a b e l g e t J L a b e l ( ) { i f ( j L a b e l == n u l l ) { j L a b e l = new j a v a x . s w i n g . J L a b e l ( ) ; jLabel . s e t S i z e (100 , 10); j L a b e l . s e t T e x t ( ”Men¨ u” ) ; jLabel . setLocation (25 , 30); } return j L a b e l ; } /∗ ∗ ∗ This method i n i t i a l i z e s j L a b e l 1 ∗ ∗ @return j a v a x . swing . J L a b e l ∗/ private j a v a x . s w i n g . J L a b e l g e t J L a b e l 1 ( ) { i f ( j L a b e l 1 == n u l l ) { j L a b e l 1 = new j a v a x . s w i n g . J L a b e l ( ) ; jLabel1 . s e t S i z e (180 , 15); j L a b e l 1 . s e t T e x t ( ” T r a n s a k t i o n e n p r o Sekunde : ” ) ; jLabel1 . setLocation (300 , 200); } return j L a b e l 1 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j L a b e l 2 ∗ ∗ @return j a v a x . swing . J L a b e l ∗/ private j a v a x . s w i n g . J L a b e l g e t J L a b e l 2 ( ) {

89

if

( j L a b e l 2 == n u l l ) { j L a b e l 2 = new j a v a x . s w i n g . J L a b e l ( ) ; jLabel2 . setSize (50 , 15); j L a b e l 2 . s e t T e x t ( ”−” ) ; jLabel2 . setLocation (490 , 200); jLabel2 . setFont ( new j a v a . awt . Font ( ” C o u r i e r New” , j a v a . awt . Font . PLAIN ,

} return j L a b e l 2 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j L a b e l 3 ∗ ∗ @return j a v a x . swing . J L a b e l ∗/ private j a v a x . s w i n g . J L a b e l g e t J L a b e l 3 ( ) { i f ( j L a b e l 3 == n u l l ) { j L a b e l 3 = new j a v a x . s w i n g . J L a b e l ( ) ; jLabel3 . s e t S i z e (120 , 15); jLabel3 . setText ( ” Anzufordernde ” ) ; jLabel3 . setLocation (26 , 230); } return j L a b e l 3 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j L a b e l 4 ∗ ∗ @return j a v a x . swing . J L a b e l ∗/ private j a v a x . s w i n g . J L a b e l g e t J L a b e l 4 ( ) { i f ( j L a b e l 4 == n u l l ) { j L a b e l 4 = new j a v a x . s w i n g . J L a b e l ( ) ; jLabel4 . s e t S i z e (120 , 15); jLabel4 . setText ( ” Speichermenge ” ) ; jLabel4 . setLocation (26 , 245); } return j L a b e l 4 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j L a b e l 5 ∗ ∗ @return j a v a x . swing . J L a b e l ∗/ private j a v a x . s w i n g . J L a b e l g e t J L a b e l 5 ( ) { i f ( j L a b e l 5 == n u l l ) { j L a b e l 5 = new j a v a x . s w i n g . J L a b e l ( ) ; jLabel5 . s e t S i z e (120 , 15); j L a b e l 5 . setText ( ” Wartezeit pro ” ) ; jLabel5 . setLocation (26 , 280); } return j L a b e l 5 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j L a b e l 6 ∗ ∗ @return j a v a x . swing . J L a b e l ∗/ private j a v a x . s w i n g . J L a b e l g e t J L a b e l 6 ( ) { i f ( j L a b e l 6 == n u l l ) { j L a b e l 6 = new j a v a x . s w i n g . J L a b e l ( ) ; jLabel6 . s e t S i z e (120 , 15); j L a b e l 6 . s e t T e x t ( ”MB i n M i l l i s e k u n d e n ” ) ; jLabel6 . setLocation (26 , 295); } return j L a b e l 6 ; } /∗ ∗ ∗ This method i n i t i a l i z e s jMenu ∗ ∗ @return j a v a x . swing . JMenu ∗/ private j a v a x . s w i n g . JMenu getJMenu ( ) { i f ( jMenu == n u l l ) { jMenu = new j a v a x . s w i n g . JMenu ( ) ; jMenu . add ( getJMenuItem ( ) ) ; jMenu . s e t T e x t ( ” D a t e i ” ) ; } return jMenu ; } /∗ ∗

90

12));

∗ This method i n i t i a l i z e s jJMenuBar ∗ ∗ @return j a v a x . swing . JMenuBar ∗/ private j a v a x . s w i n g . JMenuBar getJJMenuBar ( ) { i f ( jJMenuBar == n u l l ) { jJMenuBar = new j a v a x . s w i n g . JMenuBar ( ) ; jJMenuBar . add ( getJMenu ( ) ) ; } return jJMenuBar ; } /∗ ∗ ∗ This method i n i t i a l i z e s jMenuItem ∗ ∗ @return j a v a x . swing . JMenuItem ∗/ private j a v a x . s w i n g . JMenuItem getJMenuItem ( ) { i f ( jMenuItem == n u l l ) { jMenuItem = new j a v a x . s w i n g . JMenuItem ( ) ; jMenuItem . s e t T e x t ( ” Beenden ” ) ; jMenuItem . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . A c t i o n E v e n t e ) { stopThreads ( ) ; System . e x i t ( 0 ) ; } }); } return jMenuItem ; } /∗ ∗ ∗ This method i n i t i a l i z e s jContentPane ∗ ∗ @return j a v a x . swing . JPanel ∗/ private j a v a x . s w i n g . J P a n e l g e t J C o n t e n t P a n e ( ) { i f ( j C o n t e n t P a n e == n u l l ) { j C o n t e n t P a n e = new j a v a x . s w i n g . J P a n e l ( ) ; jContentPane . setLayout ( null ) ; j C o n t e n t P a n e . add ( g e t J B u t t o n ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J B u t t o n 1 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J B u t t o n 2 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J B u t t o n 3 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( getJCheckBox ( ) , n u l l ) ; j C o n t e n t P a n e . add ( getJComboBox ( ) , n u l l ) ; j C o n t e n t P a n e . add ( getJComboBox1 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J L a b e l ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J L a b e l 1 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J L a b e l 2 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J L a b e l 3 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J L a b e l 4 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J L a b e l 5 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J L a b e l 6 ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J P a n e l ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J S c r o l l P a n e ( ) , n u l l ) ; j C o n t e n t P a n e . add ( g e t J S c r o l l P a n e 1 ( ) , n u l l ) ; } return j C o n t e n t P a n e ; } /∗ ∗ ∗ This method i n i t i a l i z e s j S c r o l l P a n e ∗ ∗ @return j a v a x . swing . J S c r o l l P a n e ∗/ private j a v a x . s w i n g . J S c r o l l P a n e g e t J S c r o l l P a n e ( ) { i f ( j S c r o l l P a n e == n u l l ) { j S c r o l l P a n e = new j a v a x . s w i n g . J S c r o l l P a n e ( ) ; j S c r o l l P a n e . setViewportView ( getJTable ( ) ) ; jScrollPane . s e t S i z e (290 , 130); jScrollPane . setLocation (300 , 50); } return j S c r o l l P a n e ; } /∗ ∗ ∗ This method i n i t i a l i z e s j S c r o l l P a n e 1 ∗ ∗ @return j a v a x . swing . J S c r o l l P a n e ∗/ private j a v a x . s w i n g . J S c r o l l P a n e g e t J S c r o l l P a n e 1 ( ) {

91

if

( jScrollPane1 jScrollPane1 jScrollPane1 jScrollPane1 jScrollPane1

== n u l l ) { = new j a v a x . s w i n g . J S c r o l l P a n e ( ) ; . setViewportView ( getJTextArea ( ) ) ; . s e t S i z e (565 , 180); . setLocation (25 , 400);

} return j S c r o l l P a n e 1 ; } /∗ ∗ ∗ This method i n i t i a l i z e s j T a b l e ∗ ∗ @return j a v a x . swing . JTable ∗/ private j a v a x . s w i n g . JTable g e t J T a b l e ( ) { i f ( j T a b l e == n u l l ) { j T a b l e = new j a v a x . s w i n g . JTable ( ) ; jTable . setRowSelectionAllowed ( false ) ; j T a b l e . s e t F o n t (new j a v a . awt . Font ( ” C o u r i e r New” , j a v a . awt . Font . PLAIN , 1 2 ) ) ; } return j T a b l e ; } /∗ ∗ ∗ This method i n i t i a l i z e s jTextArea ∗ ∗ @return j a v a x . swing . JTextArea ∗/ private j a v a x . s w i n g . JTextArea g e t J T e x t A r e a ( ) { i f ( j T e x t A r e a == n u l l ) { j T e x t A r e a = new JTextArea ( ) ; j T e x t A r e a . s e t F o n t (new j a v a . awt . Font ( ” C o u r i e r New” , j a v a . awt . Font . PLAIN , 1 2 ) ) ; } return j T e x t A r e a ; } }

92

A.2.2

PaintPanel.java

import j a v a . awt . ∗ ; import j a v a x . s w i n g . J P a n e l ; public c l a s s P a i n t P a n e l extends J P a n e l { private i n t v a l u e s [ ] = new i n t [ 3 0 ] ; private i n t y = 0 ; public P a i n t P a n e l ( ) { super ( ) ; for ( int i = 0 ; i < 30; values [ i ] = 0;

i ++)

} public void p a i n t ( G r a p h i c s g ) { super . p a i n t ( g ) ; g . setColor ( Color . black ) ; g . f i l l R e c t ( 0 , 0 , getWidth ( ) − 1 , g e t H e i g h t ( ) − 1 ) ; g . setColor ( Color . lightGray ) ; g . drawLine ( 0 , g e t H e i g h t ( ) / 2 − 1 , getWidth ( ) − 1 , g e t H e i g h t ( ) / 2 − 1); g . setColor ( Color . green ) ; f o r ( i n t i = 0 ; i < 2 9 ; i ++) g . drawLine ( i ∗ 1 0 , g e t H e i g h t ( ) − v a l u e s [ i ] − 1 , i ∗ 10 + 1 0 , getHeight () − values [ i + 1] − 1 ) ; g . setColor ( Color . lightGray ) ; g . drawString ( ”0” , 5 , getHeight ( ) − 5 ) ; g . d r a w S t r i n g ( ” 150 ” , 5 , g e t H e i g h t ( ) / 2 + 1 5 ) ; g . d r a w S t r i n g ( ” 300 ” , 5 , 1 5 ) ; } public void u p d a t e P a n e l ( i n t y ) { f o r ( i n t i = 0 ; i < 2 9 ; i ++) values [ i ] = values [ i + 1 ] ; values [ 2 9 ] = y / 2; repaint ( ) ; } public void r e s e t ( ) { for ( int i = 0 ; i < 30; values [ i ] = 0;

i ++)

repaint ( ) ; } }

A.2.3

ReadOnlyDefaultTableModel.java

import j a v a x . s w i n g . t a b l e . ∗ ; public c l a s s ReadOnlyDefaultTableModel extends D e f a u l t T a b l e M o d e l { public boolean i s C e l l E d i t a b l e ( i n t arg0 , i n t a r g 1 ) { return f a l s e ; } }

93

A.2.4

TableDate.java

public c l a s s TableDate { private S t r i n g v a l u e ; private i n t column ; private i n t row ; public TableDate ( S t r i n g v a l u e , i n t row , i n t column ) { this . value = value ; t h i s . row = row ; t h i s . column = column ; } public S t r i n g g e t V a l u e ( ) { return v a l u e ; } public i n t getRow ( ) { return row ; } public i n t getColumn ( ) { return column ; } }

A.2.5

UpdateGUIRunnable.java

import j a v a . u t i l . ∗ ; import j a v a x . s w i n g . ∗ ; public c l a s s UpdateGUIRunnable implements Runnable { private private private private private private

JLabel jLa bel = null ; PaintPanel jPanel = null ; ReadOnlyDefaultTableModel t a b l e M o d e l = n u l l ; V e c t o r t a b l e D a t a = new V e c t o r ( ) ; boolean p a n e l ; int value ;

public UpdateGUIRunnable ( ReadOnlyDefaultTableModel t a b l e M o d e l ) { this . tableModel = tableModel ; panel = false ; } public UpdateGUIRunnable ( ReadOnlyDefaultTableModel t a b l e M o d e l , JLabel jLabel , PaintPanel jPanel , int value ) { this . tableModel = tableModel ; this . jLabel = jLabel ; this . jPanel = jPanel ; this . value = value ; p a n e l = true ; } public void addTableDate ( TableDate t a b l e D a t e ) { t a b l e D a t a . add ( t a b l e D a t e ) ; } public void run ( ) { f o r ( i n t i = 0 ; i < t a b l e D a t a . s i z e ( ) ; i ++) { TableDate t a b l e D a t e = ( TableDate ) t a b l e D a t a . e l em en t A t ( i ) ; t a b l e M o d e l . s e t V a l u e A t ( t a b l e D a t e . g e t V a l u e ( ) , t a b l e D a t e . getRow ( ) , t a b l e D a t e . getColumn ( ) ) ; } if

( panel ) { j L a b e l . s e t T e x t (new I n t e g e r ( v a l u e / 5 ) . t o S t r i n g ( ) ) ; jPanel . updatePanel ( value / 5 ) ;

} } }

94

Anhang B

DVD zur Diplomarbeit B.1

Inhalt der DVD

• Verzeichnis \Diplomarbeit: Enth¨ alt die Diplomarbeit als PDF-Dokument. • Verzeichnis \Literatur: Enth¨ alt den Großteil der benutzten Literatur in Form von PDF- und PostScriptDokumenten. • Verzeichnis \Navigation: Enth¨ alt das Inhaltsverzeichnis der DVD als HTML-Dokument (index.html). • Verzeichnis \Software: Enth¨ alt die verwendete Software f¨ ur Windows (Trial-Versionen): – IBM DB2 Universal Database Enterprise Server Edition 8.2 – IBM Rational Application Developer 6.0 – IBM WebSphere Application Server 6.0 • Verzeichnis \Source: Enth¨ alt den Quellcode der im Rahmen der Diplomarbeit geschriebenen Software.

95

Abbildung B.1: Das Literaturverzeichnis auf DVD

96

Abku ¨ rzungsverzeichnis ABAP . . . . . . . . . . . . ACID . . . . . . . . . . . . . AIX . . . . . . . . . . . . . . API . . . . . . . . . . . . . . AWT . . . . . . . . . . . . . CICS . . . . . . . . . . . . . COM+ . . . . . . . . . . . CORBA . . . . . . . . . . CRM . . . . . . . . . . . . . DCOM . . . . . . . . . . . EIS . . . . . . . . . . . . . . . EJB . . . . . . . . . . . . . . GUI . . . . . . . . . . . . . . HTTP . . . . . . . . . . . . IBM . . . . . . . . . . . . . . IIOP . . . . . . . . . . . . . J2EE . . . . . . . . . . . . . J2ME . . . . . . . . . . . . J2SE . . . . . . . . . . . . . JCA . . . . . . . . . . . . . . JDBC . . . . . . . . . . . . JDK . . . . . . . . . . . . . . JMS . . . . . . . . . . . . . . JNI . . . . . . . . . . . . . . . JSP . . . . . . . . . . . . . . JTA . . . . . . . . . . . . . . JTS . . . . . . . . . . . . . . JVM . . . . . . . . . . . . . KVM . . . . . . . . . . . . . MVM . . . . . . . . . . . . ORB . . . . . . . . . . . . . OTM . . . . . . . . . . . . . OTS . . . . . . . . . . . . . . PRJVM . . . . . . . . . . RMI . . . . . . . . . . . . . . RMI-IIOP . . . . . . . . RPC . . . . . . . . . . . . . SAP . . . . . . . . . . . . . . XIMI . . . . . . . . . . . . . XML . . . . . . . . . . . . .

Advanced Business Application Programming Atomicity Consistency Isolation Durability Advanced Interactive Executive Application Programming Interface Abstract Window Toolkit Customer Information Control System Component Object Model + Common Object Request Broker Architecture Communication Resource Manager Distributed Component Object Model Enterprise Information System Enterprise JavaBeans Graphical User Interface Hypertext Transfer Protocol International Business Machines Internet Inter-Orb Protocol Java 2 Platform, Enterprise Edition Java 2 Platform, Micro Edition Java 2 Platform, Standard Edition J2EE Connector Architecture Java Database Connectivity J2SE Development Kit Java Message Service Java Native Interface Java Server Pages Java Transaction API Java Transaction Service Java Virtual Machine K Virtual Machine Multi-Tasking Virtual Machine Object Request Broker Object Transaction Monitor Object Transaction Service Persistent Reusable Java Virtual Machine Remote Method Invocation Remote Method Invocation over Internet Inter-Orb Protocol Remote Procedure Call Systeme, Anwendungen, Produkte in der Datenverarbeitung Cross-Isolate Method Invocation Extended Markup Language

97

98

Literaturverzeichnis [Bac02]

Back, G.: Isolation, Resource Management and Sharing in the KaffeOS Java Runtime System, University of Utah, Diss., 2002. – http://www. cs.utah.edu/flux/papers/back-thesis-base.html

[BG97]

Balfanz, D. ; Gong, L.: Experience with Secure Multi-Processing in Java / Department of Computer Science, Princeton University. 1997 (560-97). – Forschungsbericht. http://www.cs.princeton.edu/sip/ pub/icdcs.php3

[BH99]

Back, G. ; Hsieh, W.: Drawing the Red Line in Java. In: Proceedings of the 7th Workshop on Hot Topics in Operating Systems, 1999, S. 116–121. – http://www.cs.utah.edu/flux/papers/ redline-hotos7-base.html

[BHL00]

Back, G. ; Hsieh, W. ; Lepreau, J.: Processes in KaffeOS: Isolation, Resource Management, and Sharing in Java. In: Proceedings of the 4th USENIX Symposium on Operating System Design and Implementation, 2000, S. 333–346. – http://www.usenix.org/publications/library/ proceedings/osdi2000/back.html

[BPW+ 00] Borman, S. ; Paice, S. ; Webster, M. ; Trotter, M. ; McGuire, R. ; Stevens, A. ; Hutchison, B. ; Berry, R.: A Serially Reusable Java Virtual Machine Implementation for High Volume, Highly Reliable, Transaction Processing / IBM Hursley. 2000 (TR 29.3406). – Forschungsbericht. http://www.ibm.com/servers/eserver/zseries/ software/java/pdf/29.3406.pdf [Bry04]

Bryce, C.: Isolates: A New Approach to Multi-Programming in Java Platforms. In: OTLand Experts’ Corner (2004). – http://www.bitser. net/isolate-interest/papers/bryce-05.04.pdf

[BTS+ 98] Back, G. ; Tullmann, P. ; Stoller, L. ; Hsieh, W. ; Lepreau, J.: Java Operating Systems: Design and Implementation / School of Computing, University of Utah. 1998 (UUCS-98-015). – Forschungsbericht. http://www.cs.utah.edu/flux/papers/javaos-tr98015-abs.html [BTS+ 00] Back, G. ; Tullmann, P. ; Stoller, L. ; Hsieh, W. ; Lepreau, J.: Techniques for the Design of Java Operating Systems. In: Proceedings of the 2000 USENIX Annual Technical Conference, 2000, S. 197–210. – http://www.usenix.org/publications/library/proceedings/ usenix2000/general/back.html

99

[CCH+ 98] Czajkowski, G. ; Chang, C. ; Hawblitzel, C. ; Hu, D. ; Eicken, T. von: Resource Management for Extensible Internet Servers. In: Proceedings of the 8th ACM SIGOPS European workshop on Support for composing distributed applications, 1998, S. 33–39. – http://www. cs.cornell.edu/slk/papers/sigops98.pdf [CD01]

`s, L.: Multitasking without Compromise: Czajkowski, G. ; Dayne a Virtual Machine Evolution. In: Proceedings of the 16th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. New York : ACM Press, 2001, S. 125–138. – http: //research.sun.com/projects/barcelona/papers/oopsla01.pdf

[CDN02]

`s, L. ; Nystrom, N.: Code Sharing Czajkowski, G. ; Dayne among Virtual Machines. In: Proceedings of the 16th European Conference on Object-Oriented Programming. London : Springer-Verlag, 2002, S. 155–177. – http://research.sun.com/projects/barcelona/ papers/ecoop02.pdf

[CDT03]

`s, L. ; Titzer, B.: A Multi-User Virtual Czajkowski, G. ; Dayne Machine. In: Proceedings of the 2003 USENIX Annual Technical Conference, 2003, S. 85–98. – http://www.usenix.org/events/usenix03/ tech/full papers/czajkowski/czajkowski.pdf

[CDW01]

`s, L. ; Wolczko, M.: Automated and Czajkowski, G. ; Dayne Portable Native Code Isolation / Sun Microsystems, Inc. 2001 (TR2001-96). – Forschungsbericht. http://research.sun.com/projects/ barcelona/papers/TR 2001 96.pdf

[CE98]

Czajkowski, G. ; Eicken, T. von: JRes: A Resource Accounting Interface for Java. In: Proceedings of the 13th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. New York : ACM Press, 1998, S. 21–35. – http://www.cs.cornell. edu/slk/papers/oopsla98.pdf

[CFM+ 97] Cramer, T. ; Friedman, R. ; Miller, T. ; Seberger, D. ; Wilson, R. ; Wolczko, M.: Compiling Java Just in Time. In: IEEE Micro 17 (1997), S. 36–43. – http://portal.acm.org/citation.cfm?id= 624097 [CHS+ 03] Czajkowski, G. ; Hahn, S. ; Skinner, G. ; Soper, P. ; Bryce, C.: A Resource Management Interface for the Java Platform / Sun Microsystems, Inc. 2003 (TR-2003-124). – Forschungsbericht. http://research.sun.com/techrep/2003/smli tr-2003-124.pdf [CHSS02] Czajkowski, G. ; Hahn, S. ; Skinner, G. ; Soper, P.: Resource Consumption Interfaces for Java Application Programming - a Proposal. 2002. – http://www.ovmj.org/workshops/resman/resman02.tar.gz [Cza00]

Czajkowski, G.: Application Isolation in the Java Virtual Machine. In: Proceedings of the 15th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. New York : ACM Press, 2000, S. 354–366. – http: //research.sun.com/projects/barcelona/papers/oopsla00.pdf

100

[DBC+ 00] Dillenberger, D. ; Bordawekar, R. ; Clark, C. ; Durand, D. ; Emmes, D. ; Gohda, O. ; Howard, S. ; Oliver, M. ; Samuel, F. ; John, R. S.: Building a Java virtual machine for server applications: The Jvm on OS/390. In: IBM Systems Journal 39 (2000), Nr. 1, S. 194–210. – http://www.research.ibm.com/journal/sj/391/dillenberger.pdf [ECC+ 99] Eicken, T. von ; Chang, C. ; Czajkowski, G. ; Hawblitzel, C. ; Hu, D. ; Spoonhower, D.: J-Kernel: a Capability-Based Operating System for Java. In: Vitek, J. (Hrsg.) ; Jensen, C. (Hrsg.): Secure Internet Programming - Security Issues for Mobile and Distributed Objects. Berlin : Springer-Verlag, 1999, S. 369–394 [FHL+ 96] Ford, B. ; Hibler, M. ; Lepreau, J. ; Tullmann, P. ; Back, G. ; Clawson, S.: Microkernels Meet Recursive Virtual Machines. In: Proceedings of the USENIX 2nd Symposium on Operating Systems Design and Implementation, 1996, S. 137–151. – http://www.usenix.org/ publications/library/proceedings/osdi96/hibler.html [FKR+ 99] Fitzgerald, R. ; Knoblock, T. ; Ruf, E. ; Steensgaard, B. ; Tarditi, D.: Marmot: An Optimizing Compiler for Java / Microsoft Research. 1999 (MSR-TR-99-33). – Forschungsbericht. http: //research.microsoft.com/research/pubs/view.aspx?tr id=267 [Flu03a]

Flux Research Group: JanosVM User’s Manual and Tutorial, 2003. – http://www.cs.utah.edu/flux/janos/janosvm-1.0/janosvm-1. 0-manual/manual.ps

[Flu03b]

Flux Research Group: Pressemitteilung: JanosVM v1.0. 2003. – http://www.cs.utah.edu/flux/janos/janosvm-1.0/ANNOUNCE

[FS96]

Ford, B. ; Susarla, S.: CPU Inheritance Scheduling. In: Proceedings of the USENIX 2nd Symposium on Operating Systems Design and Implementation, 1996, S. 91–105. – http://www.usenix.org/ publications/library/proceedings/osdi96/ford.html

[GJSB05]

Gosling, J. ; Joy, B. ; Steele, G. ; Bracha, G.: The Java Language Specification. 3. Auflage. Boston : Addison Wesley, 2005. – http: //java.sun.com/docs/books/jls/download/langspec-3.0.pdf

[Gor99]

Gorrie, Luke: Echidna User Guide For Echidna 0.4.0, 1999. – http: //www.javagroup.org/echidna/EchidnaUserGuide.pdf

[GR93]

Gray, J. ; Reuter, A.: Transaction Processing: Concepts and Techniques. 1. Auflage. San Francisco : Morgan Kaufmann, 1993

[Haw00]

Hawblitzel, C.: Adding Operating System Structure to LanguageBased Protection, Cornell University, Diss., 2000. – http://www.cs. dartmouth.edu/∼hawblitz/publish/hawblitzel-thesis.pdf

[HCC+ 98] Hawblitzel, C. ; Chang, C. ; Czajkowski, G. ; Hu, D. ; Eicken, T. von: Implementing Multiple Protection Domains in Java. In: Proceedings of the 1998 USENIX Annual Technical Conference, 1998, S. 259–270. – http://www.usenix.org/publications/library/ proceedings/usenix98/hawblitzel.html [HE98]

Hawblitzel, C. ; Eicken, T. von: A Case for Language-Based Protection / Department of Computer Science, Cornell University. 1998 (98-1670). – Forschungsbericht. http://www.cs.cornell.edu/slk/ papers/TR98-1670.pdf 101

[HE99a]

Hawblitzel, C. ; Eicken, T. von: Tasks and Revocation for Java (or, Hey! You got your Operating System in my Language!). 1999. – http: //www.cs.dartmouth.edu/∼hawblitz/publish/luna-99-11-13.ps

[HE99b]

Hawblitzel, C. ; Eicken, T. von: Type System Support for Dynamic Revocation. In: Proceedings of the ACM SIGPLAN 1999 Workshop on Compiler Support for System Software, INRIA, 1999, S. 72–81. – http://www.cs.dartmouth.edu/∼hawblitz/publish/Wcsss99.ps

[HE02]

Hawblitzel, C. ; Eicken, T. von: Luna: a Flexible Java Protection System. In: Proceedings of the USENIX 5th Symposium on Operating Systems Design and Implementation, 2002, S. 391–403. – http://www. usenix.org/events/osdi02/tech/hawblitzel.html

[Hei05]

Heiss, J.: The Multi-Tasking Virtual Machine: Building a Highly Scalable JVM. In: Sun Technical Articles and Tips (2005). – http: //java.sun.com/developer/technicalArticles/Programming/mvm/

[IBM03]

IBM Corp.: Persistent Reusable Java Virtual Machine User’s Guide. 5. Auflage. IBM, 2003. – http://www.ibm.com/servers/eserver/ zseries/software/java/pdf/prjvm14.pdf

[IBM04]

IBM Corp.: IBM WebSphere Application Server, Version 6: Securing applications and their environment. 2004. – ftp://ftp.software.ibm.com/software/webserver/appserv/ library/v60/wasv600base security.pdf

[JCKS04]

Jordan, M. ; Czajkowski, G. ; Kouklinski, K. ; Skinner, G.: Extending a J2EE Server with Dynamic and Flexible Resource Management. In: Proceedings of the 5th ACM/IFIP/USENIX international conference on Middleware. New York : Springer Verlag, 2004, S. 439–458. – http:// research.sun.com/projects/barcelona/papers/middleware04.pdf

[JCP02]

JCP (Java Community Process): JSR-000121 Application Isolation API Specification (Public Review Draft). 2002. – http://jcp.org/ aboutJava/communityprocess/review/jsr121/

`s, L. ; Czajkowski, G. ; Jarzab, M. ; Bryce, [JDC+ 04] Jordan, M. ; Dayne C.: Scaling J2EE Application Servers with the Multi-Tasking Virtual Machine / Sun Microsystems, Inc. 2004 (TR-2004-135). – Forschungsbericht. http://research.sun.com/techrep/2004/abstract-135.html [KKL+ 02] Kuck, N. ; Kuck, H. ; Lott, E. ; Rohland, C. ; Schmidt, O.: SAP VM Container: Using Process Attachable Virtual Machines to Provide Isolation and Scalability for Large Servers / SAP AG. 2002. – Forschungsbericht. http://www.bitser.net/isolate-interest/ papers/PAVM.pdf [KP00]

Krause, J. ; Plattner, B.: Safe Class Sharing among Java Processes / IBM Research, Zurich Research Laboratory. 2000. – Forschungsbericht. http://www.zurich.ibm.com/pdf/rz3230.pdf

[LB98]

Liang, S. ; Bracha, G.: Dynamic Class Loading in the Java Virtual Machine. In: Proceedings of the 13th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. New York : ACM Press, 1998, S. 36–44. – http://portal.acm.org/ citation.cfm?id=286945 102

[Lev84]

Levy, H.: Capability-Based Computer Systems. 1. Auflage. Bedford : Digital Press, 1984. – http://www.cs.washington.edu/homes/levy/ capabook/

[OMG01]

Object Management Group, Inc.: Transaction Service Specification 1.2.1. 2001. – http://www.omg.org/cgi-bin/doc?formal/ 2001-11-03

[Par04]

Parnas, D.: SAP Virtual Machine Container (as seen on TechEd). In: SAP Developer Network Weblogs (2004). – https://www.sdn.sap. com/sdn/weblogs.sdn?blog=/pub/wlg/940

`s, L. ; Vitek, J.: In[PCDV02] Palacz, K. ; Czajkowskiy, G. ; Dayne communicado: Efficient Communication for Isolates. In: Proceedings of the 17th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. New York : ACM Press, 2002, S. 262–274. – http://research.sun.com/projects/barcelona/ papers/oopsla02.pdf [SGG03]

Silberschatz, A. ; Galvin, P. ; Gagne, G.: Operating System Concepts. 6. Auflage. New York : John Wiley & Sons, Inc., 2003

[SM97]

Sun Microsystems, Inc.: Pressemitteilung: SUN DEBUTS THE JAVA PLATFORM FOR THE ENTERPRISE. 1997. – http://www.sun. com/smi/Press/sunflash/1997-04/sunflash.970402.4383.html

[SM99]

Sun Microsystems, Inc.: Java Transaction Service (JTS) Version 1.0. 1999. – http://java.sun.com/products/jts/

[SM00]

Sun Microsystems, Inc.: J2ME Building Blocks for Mobile Devices. 2000. – http://java.sun.com/products/cldc/wp/KVMwp.pdf

[SM01]

Sun Microsystems, Inc.: J2EE Connector Architecture Specification Version 1.0. http://java.sun.com/j2ee/connector/download.html. Version: 2001

[SM02]

Sun Microsystems, Inc.: Java Transaction API (JTA) Version 1.0.1B. 2002. – http://java.sun.com/products/jta/

[SM03a]

Sun Microsystems, Inc.: Enterprise JavaBeans Specification Version 2.1. 2003. – http://java.sun.com/products/ejb/docs.html

[SM03b]

Sun Microsystems, Inc.: Java 2 Platform Enterprise Edition Specification Version 1.4. 2003. – http://java.sun.com/j2ee/1.4/ download.html

[SM04]

Sun Microsystems, Inc.: The Multitasking Virtual Machine. In: Sun Inner Circle Newsletter (2004). – http://www.sun.com/emrkt/ innercircle/newsletter/0404cto.html

[SM05]

Sun Microsystems, Inc.: Enterprise JavaBeans Specification Version 3.0 (Early Draft 2). 2005. – http://java.sun.com/products/ejb/ docs.html

[Smi04a]

Smits, T.: Unbreakable Java - A Java server that never goes down. In: JDJ 9 (2004), Nr. 12, S. 54–56. – http://pdf.sys-con.com/Java/ JDJDecember2004.pdf 103

[Smi04b]

Smits, T.: Unbreakable Java - The Java Server that Never Goes Down. https://www.sdn.sap.com/irj/servlet/prt/portal/ 2004. – prtroot/com.sap.km.cm.docs/documents/a1-8-4/Unbreakable% 20Java.pdf

[THL01]

Tullmann, P. ; Hibler, M. ; Lepreau, J.: Janos: A Java-oriented OS for Active Network Nodes. In: IEEE Journal on Selected Areas in Communications 19 (2001), Nr. 3, S. 501–510. – http://www.cs.utah. edu/flux/papers/janos-jsac01-base.html

[TL98]

Tullmann, P. ; Lepreau, J.: Nested Java Processes: OS Structure for Mobile Code. In: Proceedings of the 8th ACM SIGOPS European workshop on Support for composing distributed applications. New York : ACM Press, 1998, S. 111–117. – http://www.cs.utah.edu/flux/ papers/npmjava-esigops98web-abs.html

[Tul99]

Tullmann, P.: The Alta Operating System, University of Utah, http://www.cs.utah.edu/flux/papers/ Diplomarbeit, 1999. – tullmann-thesis-base.html

[Wil92]

Wilson, P.: Uniprocessor Garbage Collection Techniques. In: Proceedings of the International Workshop on Memory Management. Berlin : Springer Verlag, 1992, S. 1–42. – ftp://ftp.cs.utexas.edu/pub/ garbage/gcsurvey.ps

104

Internetseiten/ Mailinglistenbeitr¨ age [1] IBM Software - CICS family - Family Overview. software/htp/cics/ [2] IBM: z/OS operating system. zseries/zos/

http://www.ibm.com/

http://www.ibm.com/servers/eserver/

[3] Java 2 Platform, Enterprise Edition (J2EE). http://java.sun.com/j2ee/ [4] Enterprise JavaBeans Technology. http://java.sun.com/products/ejb/ [5] JavaServer Pages Technology. http://java.sun.com/products/jsp/ [6] Java Servlet Technology. http://java.sun.com/products/servlet/ [7] Welcome To The OMG’s CORBA Website. http://www.corba.org/ [8] Java RMI over IIOP. http://java.sun.com/products/rmi-iiop/ [9] BEA Systems - BEA Tuxedo. http://www.bea.com/tuxedo/ [10] COM: Component Object Model Technologies. http://www.microsoft.com/ com/ [11] IBM WebSphere Software. http://www.ibm.com/software/websphere/ [12] Java Transaction API (JTA). http://java.sun.com/products/jta/ [13] Java Transaction Service (JTS). http://java.sun.com/products/jts/ [14] IBM AIX 5L: UNIX operating system - an open UNIX solution. http:// www-1.ibm.com/servers/aix/ [15] The Linux Home Page at Linux Online. http://www.linux.org/ [16] Microsoft Windows Family Home Page. windows/

http://www.microsoft.com/

[17] String (Java 2 Platform SE 5.0). http://java.sun.com/j2se/1.5.0/docs/ api/java/lang/String.html#intern() [18] J2EE Connector Architecture. http://java.sun.com/j2ee/connector/ [19] Java Thread Primitive Deprecation. http://java.sun.com/j2se/1.5.0/ docs/guide/misc/threadPrimitiveDeprecation.html [20] Echidna - A free multiprocess system in Java. http://www.javagroup.org/ echidna/ 105

[21] http://www.cs.cornell.edu/slk/JKernel/Default.html [22] Java Remote Method Invocation (Java RMI). products/jdk/rmi/

http://java.sun.com/

[23] Kaffe.org. http://www.kaffe.org/ [24] Fluke: Flux µ-kernel Environment. http://www.cs.utah.edu/flux/fluke/ html/ [25] The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 121. http://jcp.org/en/jsr/detail?id=121 [26] Java Isolation JSR-121 isolate-interest/

Interest

Site.

http://www.bitser.net/

[27] JavaOne 2003 JSR-121 BOF Presentations. isolate-interest/JavaOne2003/

http://www.bitser.net/

[28] JavaOne 2004 JSR-121 BOF Presentations. isolate-interest/JavaOne2004/

http://www.bitser.net/

[29] [Isolate-interest] JSR-121 update. http://altair.cs.oswego.edu/ pipermail/isolate-interest/2003-July/000074.html [30] [Isolate-interest] JSR 121 status? http://altair.cs.oswego.edu/ pipermail/isolate-interest/2004-March/000099.html [31] [Isolate-interest] JSR 121 status? http://altair.cs.oswego.edu/ pipermail/isolate-interest/2004-March/000102.html [32] [Isolate-interest] any isolation API in J2SE.next will NOT be N:1 style. http://altair.cs.oswego.edu/pipermail/isolate-interest/ 2004-October/000216.html [33] [Isolate-interest] any isolation API in J2SE.next will NOT be N:1 style. http://altair.cs.oswego.edu/pipermail/isolate-interest/ 2004-October/000219.html [34] JSR-121 Expert Group Meeting 27 October 2004. http://www.bitser.net/ isolate-interest/egmeetings/m20041027.html [35] [Isolate-interest] JSR-121 status update. http://altair.cs.oswego.edu/ pipermail/isolate-interest/2004-December/000226.html [36] http://www.cs.utah.edu/flux/janos/janosvm.html [37] The Barcelona Project. http://research.sun.com/projects/barcelona/ [38] [Isolate-interest] MVM for research. http://altair.cs.oswego.edu/ pipermail/isolate-interest/2005-April/000229.html [39] [Isolate-interest] MVM for research. http://altair.cs.oswego.edu/ pipermail/isolate-interest/2005-April/000230.html [40] The Barcelona Project. mvm/

http://research.sun.com/projects/barcelona/

106