1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 3.2//EN">
5 <META NAME=
"GENERATOR" CONTENT=
"StarOffice/4.0 (WinNT/Win95)">
6 <META NAME=
"AUTHOR" CONTENT=
" ">
7 <META NAME=
"CREATED" CONTENT=
"19970401;13233926">
8 <META NAME=
"CHANGEDBY" CONTENT=
" ">
9 <META NAME=
"CHANGED" CONTENT=
"19970529;8045806">
12 <H1>Stardivision erweiterte Java Grundkonzepte
</H1>
13 <H2><A NAME=
"Exceptions"></A>Exceptions:
</H2>
14 <P>Die Grundidee von Exceptions ist es einen Fehlerkontext
15 aufzuspannen, der erst n
äher betrachtet werden mu
ß, wenn
16 man Fehler korrigieren will. Der Programmcode sollte durch die
17 Behandlung von Fehlern nicht undurchsichtig und unleserlich werden.
18 Meiner Meinung nach sollten Exceptions deswegen auch nicht als
19 zweiter Returnwert vergewaltigt werden.
<BR><B>Ziel:
</B> Nach dem
20 Auftreten einer Exception sollte es m
öglichst einfach sein das
21 System in einen definierten arbeitsf
ähigen Zustand zu
22 versetzen.
<BR>Es gibt grunds
ätzlich drei verschiedenen Arten von
23 Exceptions. Diese unterscheiden sich durch den Zustand in dem sie das
24 Objekt hinterlassen.
</P>
26 <LI><P><A NAME=
"Undefined Exception"></A>Die von der Methode
27 benutzten Objekte sind in einem undefinierten Zustand. Jede auf dem
28 Objekt aufgerufene Methode mu
ß nach einer solchen Exception
29 nicht mehr ihre Spezifikation einhalten. Diese Exception wird im
30 folgenden mit
„Undefined Exception
“ benannt. Dabei ist zu
31 beachten, da
ß keine weiteren
<A HREF=
"#Resourcen">Resourcen
</A>,
32 au
ßer die angegebenen, benutzt werden. Au
ßerdem werden
33 „ReadOnly
“ Resourcen nicht modifiziert.
</P>
34 <LI><P><A NAME=
"Defined Exception"></A>Die von der Methode benutzten
35 Objekte sind in einem genau definierten Zustand, der aber von der
36 Zusicherung der Methode abweicht. Diese Exception wird im folgenden
37 mit
„Defined Exception
“ benannt. Dabei ist zu beachten,
38 da
ß keine weiteren
<A HREF=
"#Resourcen">Resourcen
</A>, au
ßer
39 die angegebenen, benutzt werden. Au
ßerdem werden
„ReadOnly
“
40 Resourcen nicht modifiziert.
</P>
41 <LI><P><A NAME=
"Transacted Exception"></A>Die von der Methode
42 benutzten Objekte sind in ihrem vorherigen Zustand, der aber von der
43 Zusicherung der Methode abweicht. Diese Exception wird im folgenden
44 mit
„Transacted Exception
“ benannt. Dabei ist zu beachten,
45 da
ß keine weiteren
<A HREF=
"#Resourcen">Resourcen
</A>, au
ßer
46 die angegebenen, benutzt werden. Au
ßerdem werden
„ReadOnly
“
47 Resourcen nicht modifiziert. Diese Spezifikation trifft auch auf
48 „Defined Exception
“ zu, wegen ihrer Bedeutung f
ühre
49 ich sie extra auf.
</P>
51 <P>Die Benutzbarkeit eines Objektes, nachdem eine Exception
52 aufgetreten ist, ist vom obigen Typ der Exception abh
ängig.
</P>
53 <P><FONT COLOR=
"#ff0000">Satz
1.1: Nachdem eine
„Undefined
54 Exception
“ aufgetreten ist, kann mit dem Objekt sowie allen
55 „ReadWrite
“ Resourcen nicht mehr weiter gearbeitet werden.
</FONT></P>
56 <P><FONT COLOR=
"#ff0000">Satz
1.2: Nachdem eine
„Defined
57 Exception
“ aufgetreten ist, kann aufgrund des genau definierten
58 Zustandes weiter gearbeitet werden.
</FONT></P>
59 <P><FONT COLOR=
"#ff0000">Satz
1.3: Nach einer
„Transacted
60 Exception
“ ist der gleiche Zustand wie vor dem Aufruf
61 wiederhergestellt.
</FONT></P>
62 <P>Es sollten m
öglichst nur
„Transacted Exception
“
63 ausgel
öst werden. Bei komplizierten Methoden l
äßt
64 sich aber eine
„Defined Exception
“ nicht immer vermeiden.
65 Eine
„Undefined Exception
“ deutet immer auf eine
66 Programmierfehler hin. Der Typ der Exeption kann nur in Zusammenhang
67 mit der Methode in der sie Auftritt ermittelt werden.
</P>
68 <P><FONT COLOR=
"#ff0000">Satz
1.4: Durch die Klasse der Exception
69 kann niemals alleine der Typ (undefined, defined oder transacted)
70 entschieden werden.
</FONT></P>
71 <H2><A NAME=
"Resourcen"></A>Resourcen (under construction)
</H2>
72 <P>Die Grundidee von Resourcen ist die Aufteilung eines Gebildes in
73 weitere Einheiten. Auf diesen k
önnen dann verschiedene Auftr
äge
74 gleichzeitig arbeiten, wenn sie nicht dieselben Resourcen benutzen.
75 Z.B. kann man in einer Textverarbeitung die einzelnen Dokumente als
76 Einheiten betrachten. Auftr
äge, die sich nur auf ein Dokument
77 beziehen, k
önnen parallel zu anderen Dokumenten bearbeitet
78 werden.
<BR>Mit Resourcen sind im System bzw. der Applikation
79 vorhandene Objekte, Services, Kan
äle ... gemeint, die zur Zeit
80 nur von einem Thread benutzt werden k
önnen. Als Konsequenz
81 m
üssen Resourcen einem Thread zugeordnet werden, bevor dieser
82 sie benutzt.
<BR><B>Ziel:
</B> Es mu
ß m
öglich sein,
1.
83 Auftr
äge parallel abzuarbeiten,
2. die Frage
„Warum k
önnen
84 zwei Auftr
äge nicht parallel arbeiten?
“ beantwortet zu
85 k
önnen.
<BR>Es gibt verschiedene M
öglichkeiten diese
86 Zuordnung vorzunehmen. Zwei stelle ich kurz vor.
</P>
88 <LI><P><A NAME=
"Prealloc Resource Konzept"></A>Eine Art der
89 Zuordnung ist das vorherige Anfordern aller f
ür den Auftrag
90 ben
ötigten Resourcen. Ist dies m
öglich, kann der Auftrag
91 ohne weitere St
örungen ablaufen. Die Resourcen d
ürfen
92 freigegeben werden, bevor der Auftrag beendet ist. Dies gilt
93 nat
ürlich nur f
ür nicht mehr verwendete Resourcen. Es darf
94 ebenfalls das Zuordnungsrecht von lesend und schreibend auf lesend
95 zur
ückgenommen werden. Diese Zuornungsart wird im weiteren mit
96 „Prealloc Resource Konzept
“ bezeichnet.
</P>
97 <LI><P><A NAME=
"Ondemand Resource Konzept"></A>Eine andere Art der
98 Zuordnung ist das Anfordern der Resourcen, wenn sie ben
ötigt
99 werden. Dabei kann es zu St
örungen kommen, wenn sich
100 verschiedene Auftr
äge um die gleiche Resource bewerben. Die
101 Resourcen d
ürfen freigegeben werden, bevor der Auftrag beendet
102 ist. Dies gilt nat
ürlich nur f
ür nicht mehr verwendete
103 Resourcen. Es darf ebenfalls das Zuordnungsrecht von lesend und
104 schreibend auf lesend zur
ückgenommen werden. Diese Zuornungsart
105 wird im weiteren mit
„Ondemand Resource Konzept
“
108 <P>Es gibt noch weitere M
öglichkeiten Auftr
äge zu
109 bearbeiten, die die gleichen Resourcen benutzen. H
äufig findet
110 man solche L
ösungen bei Datenbankanwendungen.
<BR>In der
111 folgenden Tabelle stehen sich die beiden Konzepte mit ihren Vor- und
112 Nachteilen und ihren Anforderungen gegen
über.
</P>
113 <TABLE WIDTH=
100% BORDER=
1 CELLPADDING=
5 FRAME=BOX RULES=ALL
>
121 <TH WIDTH=
33% VALIGN=TOP
>
123 <TD WIDTH=
33% VALIGN=TOP
><DL>
124 <DD>Prealloc Resource Konzept
</DD>
127 <TD WIDTH=
33% VALIGN=TOP
>
129 <DD>Ondemand Resource Konzept
</DD>
137 <P>Alle Resourcen m
üssen vor der Auftragsausf
ührung
146 <P>Nicht mehr ben
ötigte Resourcen d
ürfen freigegeben
155 <P>Es kann zu Verklemmungen oder
„Races
“ kommen.
</TD>
163 <P>In Bearbeitung befindliche Auftr
äge m
üssen, aufgrund
164 fehlender Resourcen, abgebrochen werden.
</TD>
172 <P>Der Zustand der Resourcen ist zu jedem Zeitpunkt der
173 Auftragsabarbeitung bekannt.
</TD>
181 <P>Algorithmus zur Resourcevergabe.
</TD>
183 <P>Einfach, da nur
überpr
üft werden mu
ß, ob alle
184 ben
ötigten Resourcen verf
ügbar sind.
</TD>
186 <P>Komplex, da neben dem Anfordern von Resourcen auch noch
187 überpr
üft werden mu
ß, ob das System
<A HREF=
"#lebendig">lebendig
</A>
192 <P>Parallelit
ät
</TD>
194 <P>Hoch, da unabh
ängige Auftr
äge meistens nur lesend
195 auf gemeinsame Resourcen zugreifen.
</TD>
197 <P>Sehr hoch, da die ben
ötigten Resourcen erst angefordert
198 werden, wenn man sie braucht.
</TD>
202 <P ALIGN=LEFT
>Meiner Meinung nach ist nur das
„Prealloc Resource
203 Konzept
“ ohne richtige Programmierwerkzeuge zur Entwicklung
204 paralleler Algorithmen (z.B. Netzprogrammierung) wenigstens ein
205 bi
ßchen beherschbar.
</P>
206 <P ALIGN=LEFT
>Es stellt sich die Frage wie das
„Prealloc
207 Resource Konzept
“ in einem Komponenten-Modell und in einem
208 Objekt-Environment integriert werden kann. Ein Objekt-Environment ist
209 ein mehr oder weniger dynamische Menge von Objekten die miteinander
210 in Verbindung stehen. Aus dem obigen Beispiel k
önnte man die
211 Verbindung der Textverarbeitung zu ihren Dokumenten als
212 Objekt-Environment bezeichnen. Ein Objekt in diesem Environment kann
213 nun
über seine Verbindungen mit anderen Objekten kommunizieren.
214 Die Schnittstellen mit denen
über die Verbindung kommuniziert
215 wird nennt man Komponenten-Modell. Die Idee des Objekt-Environments
216 ist es weitere Objekte m
öglichst einfach zu integrieren. So
217 k
önnten in unserem Beispiel weitere Dokumenttypen wie ein
218 HTML-Dokument eingebunden werden. Die Schittstellen m
üßten
219 nur dem, von der Textverarbeitung geforderten, Komponenten-Modell
220 gen
ügen. Liefert aber das Modell, wie heute
üblich, keine
221 Information
über die ben
ötigten Resourcen bei Benutzung der
222 Schnittstellen, dann k
önnen Verklemmungen bzw. Inkonsistenzen
223 nicht vermieden werden. Aus diesem Grunde ist es notwendig, das
224 Resource-Konzept in das Komponenten-Modell zu integrieren.
<BR><B>Ziel:
</B>
225 Es mu
ß ein Kompromi
ß zwischen hoher Nebenl
äufigkeit
226 und der damit verbundenen Komplexit
ät, sowie einfacher
227 Programmierung und geringer Nebenl
äufigkeit gefunden
228 werden.
<BR><B>Folgen:
</B> In einem Objekt-Environment m
üssen die
229 einzelnen Objekte also dynamisch auf Verbindungen zu Objekten mit
230 hoher oder geringer Nebenl
äufigkeit reagieren. Die Komplexit
ät
231 dieser Aufgabe darf aber nicht in die Objekte verlagert werden, da
232 von einem seriellen Objekt (bzw. dessen Programmierer) nicht die
233 Steuerung nebenl
äufiger Auftr
äge verlangt werden
234 kann.
<BR><B>L
ösungsansatz:
</B> Die Behandlung der
235 Nebenl
äufigkeit wird nicht in einer einfachen Komponente
236 implementiert. Das bedeutet sie mu
ß mit einer
237 Default-Behandlung zufrieden sein, die minimale Nebel
äufigkeit
238 nach sich zieht. Eine Komponente kann sich aber in die Vergabe der
239 Resourcen einmischen. So kann sie ihren Grad der Nebenl
äufigkeit
240 erh
öhen. Dies ist dann aber auch mit erh
öhtem
241 Implementationsaufwand zu bezahlen. Auf der anderen Seite macht es
242 aber keinen Sinn serielle oder Komponenten mit zu gro
ßem
243 Resourcebedarf einzubinden, wenn das Objekt-Environment danach
244 praktisch nicht mehr lauff
ähig ist. Das bedeutet, da
ß das
245 Objekt-Environment auch Forderungen bez
üglich des Resourcebedarf
246 an die Komponenten stellen darf.
</P>
247 <H3>Anforderungen
</H3>
249 <LI><P ALIGN=LEFT
>Es mu
ß ein Modell geben, in dem alle
250 vorhandenen Resourcen und deren Beziehung zueinander eingetragen
251 werden. Dadurch kann abgesch
ätzt werden, welchen Resourcebedarf
252 eine Komponente hat. Das
„Sch
ätzen
“ ist w
örtlich
253 zu nehmen. (Im Zusammenhang mit
<A HREF=
"#Security">Security
</A>
254 wird man aber auch noch sehen, da
ß der Zugriff auf bestimmte
255 Resourcen nicht m
öglich ist.) F
ür das
„Prealloc
256 Resource Konzept
“ gilt, es m
üssen mindestens die
257 ben
ötigten Resourcen verf
ügbar sein. Zur Not sind diese
259 <LI><P ALIGN=LEFT
>Eine nebenl
äufige Komponente mu
ß in
260 jeder ihrer von au
ßen erreichbaren Methoden kontrollieren, ob
261 die entsprechenden Resourcen f
ür sie angefordert wurden. Damit
262 serielle Komponenten diese Methoden nutzen k
önnen, k
önnen
263 die ben
ötigten Resourcen angefordert werden, wenn vorher noch
264 <B>keine einzige
</B> durch den ausf
ührenden Auftrag belegt war.
265 Zur Erl
äuterung: Serielle Komponenten belegen keine Resourcen.
266 Damit w
ürde jeder Aufruf einer nebenl
äufigen Komponente
267 scheitern. Um dies zu vermeiden, werden die Resourcen in der
268 nebenl
äufigen Komponente angefordert.
</P>
269 <LI><P ALIGN=LEFT
>Serielle Komponenten m
üssen also damit
270 rechnen eine Fehlermeldung
über nicht verf
ügbare Resourcen
274 <P>Von unserem bisherigen Beispiel ausgehend, gibt es eine
275 Applikation in der sich drei Dokumente befinden. Ein serielles
276 Textdokument, ein nebenl
äufiges Tabellendokument und ein
277 nebenl
äufiges Pr
äsentationsdokument. Die Applikation selbst
278 ist nebenl
äufig. Die Relationen gehen von der Applikation zu den
279 Dokumenten und umgekehrt. Die Dokumente kennen sich nicht.
</P>
280 <P>Fall
1:
<BR>In das serielle Textdokument soll eine Zeichenfolge
281 eingef
ügt werden. Da es sich um eine serielle Komponente
282 handelt, kann dieses Einf
ügen nicht von selbst ausgel
öst
283 werden, es mu
ß von einer nebenl
äufigen Komponente, hier
284 die Applikation, angesto
ßen werden. Die Applikation ist aber
285 verpflichtet die Resourcen vorher zu reservieren. F
ür diese
286 Absch
ätzung gibt es drei realistische M
öglichkeiten.
1. Sie
287 reserviert nur das Textdokument selbst. Das bedeutet, das
288 Textdokument kann mit keinem anderen Objekt, auch nicht mit der
289 Applikation, kommunizieren.
2. Die Applikation und das Textdokument
290 wird reserviert. Es ist also nur der Zugriff auf die anderen
291 Dokumente verwehrt.
3. Alle Objekte werden reserviert. Geht es nach
292 dem
„Prealloc Resource Konzept
“ mu
ß 3. gew
ählt
293 werden. Aufgrund von Sicherheitsbeschr
änkungen werden wir aber
294 noch sehen, das serielle Komponenten in ihrer Auftragsbearbeitung
295 gestoppt werden k
önnen. Wenn der Abbruch eines Auftrags m
öglich
296 ist, spielt es aber keine Rolle durch wen (Resourcen oder
<A HREF=
"#Security">Security
</A>)
297 dies geschehen ist.
</P>
298 <P>Fall
2:
<BR>In das nebenl
äufige Tabellendokument soll eine
299 Zeichenfolge eingef
ügt werden. Dieser Auftrag kann von der
300 Applikation oder der Komponente selbst ausgel
öst werden. In
301 jedem Fall m
üssen die Resourcen vor der Auftragsbearbeitung
302 reserviert werden. Man kann dies auch der Komponente
überlassen
303 (siehe Anforderung
2.), aber man scheitert, wenn zwei Auftr
äge
304 zu einem Auftrag zusammengefa
ßt werden sollen. Dies passiert
305 z.B., wenn der Auftrag
„Text ersetzen
“ aus den Auftr
ägen
306 „L
öschen
“ und
„Einf
ügen
“ besteht. Auf
307 jeden Fall wird nur das Tabellendokument selbst reserviert, da das
308 Einf
ügen keine Auswirkung auf andere Komponenten hat.
</P>
309 <P>Fall
3:
<BR>In das nebenl
äufige Tabellendokument wird der
310 Applikationsname aus der Applikation eingef
ügt. Dazu fragt das
311 Tabellendokument nach den ben
ötigten Resourcen, um den Namen zu
312 holen und ihn einzuf
ügen. Zum Holen wird die Applikation
313 ben
ötigt und zum Einf
ügen das Tabellendokument. Beide
314 m
üssen vor der Auftragsausf
ührung reserviert werden.
</P>
315 <P>Fall
4:
<BR>Das nebenl
äufige Tabellendokument f
ügt
316 selektierten Text aus dem seriellen Textdokument ein. Da das
317 Textdokument seinen Resourcebedarf nicht mitteilt, wird einer aus
318 Fall eins abgesch
ätzte Bedarf genommen. Man kann sehen, da
ß
319 der Auftrag f
ür alle drei M
öglichkeiten erteilt werden
320 kann. Seine Nebenl
äufigkeit wird dann durch die Absch
ätzung
321 eingeschr
änkt. Zus
ätzlich m
üssen nat
ürlich die
322 ben
ötigten Resourcen f
ür das Einf
ügen geholt werden.
323 Alle m
üssen vor der Auftragsausf
ührung reserviert werden.
</P>
324 <H3>Programmierkonzepte
</H3>
325 <P>Welche Konzepte k
önnen in einer objektorientierten Sprache
326 wie c++ oder Java oder einer prozeduralen Sprache wie Fortran oder
327 „c
“ eingesetzt werden, um Nebenl
äufigkeit zu
330 <LI><P>Es gibt zwei M
öglichkeiten eine Resource zu belegen. Das
331 ist Exclusive (lesen, schreiben) und
„ReadOnly
“. Eine
332 Resource kann von mehreren Auftr
ägen benutzt werden, wenn diese
333 nur
„ReadOnly
“ ben
ötigen.
</P>
334 <LI><P>Es gibt Resourcen f
ür die man die Resourceverteilung
335 optimieren kann. Ein Objekt welches nicht ge
ändert werden kann
336 und das w
ährend der Auftragsausf
ührung immer konsistent
337 ist kann die Anforderung
„Exclusiv
“ automatisch auf
338 „ReadOnly
“ abschw
ächen. Dies lohnt sich, wenn man
339 serielle Komponenten hat, die nichts
über die
340 Resourceanforderungen mitteilen. Als Beispiel m
öchte ich eine
341 Instanz der Klasse String in Java nennen. Ein weitere Art von
342 Resourcen fordern bei Auftr
ägen an sie
1. keine weiteren
343 Auftr
äge an,
2. beenden sie die Auftr
äge schnell und
3.
344 die Reihenfolge der
Änderung an ihnen ist f
ür andere nicht
345 wichtig. Dies ist zum Beispiel bei der Speicherverwaltung in c der
346 Fall. Diese Art der Resource darf zu einem sp
äteren Zeitpunkt
347 angefordert werden. Sie mu
ß sofort benutzt und wieder
348 freigegeben werden. Aus diesem Grund erledigen solche Resourcen das
349 Anfordern und Freigeben selbst.
</P>
350 <LI><P>Bevor ein Auftrag ausgef
ührt werden kann, m
üssen
351 alle von ihm ben
ötigten Resourcen reserviert werden. Dies ist
352 f
ür einen Auftrag, der aus mehreren Teilauftr
ägen besteht,
353 aufwendig. Eine Optimierung kann darin bestehen die Teilauftr
äge
354 asynchron auszuf
ühren. Allerdings dringt diese Verhaltensweise
355 nach au
ßen. Z.B. m
üssen Auftr
äge, die diesen dann
356 asynchronen Auftrag nutzen, dann auch asynchron sein. Eine weitere
357 Optimierung in der Autragsvergabe gibt es, wenn ein Autrag die
358 Resourcervergabe nicht
ändert. Es ist dann m
öglich mehr
359 Auftr
äge vorzuziehen.
</P>
360 <LI><P>Es mu
ß eine Queue geben, in die Auftr
äge eingef
ügt
361 werden k
önnen. Konfliktfreie Auftr
äge k
önnen parallel
362 ausgef
ührt werden.
<B>Achtung:
</B> Der Resourcebedarf eines
363 Auftrages kann nur bestimmt werden, wenn alle ben
ötigten
364 Resourcen
„ReadOnly
“ reserviert werden k
önnen, es sei
365 denn kein vor ihm laufender Auftrag
ändert die Resourcevergabe.
366 Warum ist das so? Ein Auftrag kann eine Resource dahingehend
ändern,
367 da
ß danach andere Resourcen ben
ötigt werden als vorher.
368 Der vorher bestimmte Bedarf ist dann falsch.
</P>
369 <LI><P>Das Modell der Resourcen kann vergr
öbert oder verfeinert
370 werden. In einem Tabellendokument k
önnte man jede einzelne
371 Zelle zu einer Resource machen. Um die Komplexit
ät der
372 Resourcemodells zu vereinfachen kann man aber weiter alle Zellen der
373 Dokument-Resource zuordnen. Wird also aus einer anderen Komponente
374 die Zelle angefordert, wird automatisch das ganze Dokument
375 reserviert. Daraus ergeben sich zwei Vorteile:
1. F
ür den
376 Auftraggeber ist die Vergr
öberung transparent und
2. Kann die
377 Resource an dem Objekt reserviert werden, das man ohnehin kennt.
</P>
378 <LI><P>Das Resource-Modell ist hierarchisch. Eine Resource kann nur
379 einer Vergr
öberung zugeordnet werden. Die Tabellenzellen d
ürfen
380 also nur dem Tabellendokument zugeordnet werden. Daraus ergibt sich,
381 da
ß innerhalb einer solchen Hierarchie nebenl
äufig
382 gearbeitet werden kann. Es d
ürfen dann aber keine Resourcen
383 au
ßerhalb der Hierarchie benutzt werden, selbst wenn diese
386 <H3>Probleme und L
ösungen
</H3>
387 <P>Über den Benutzer m
üssen Daten abgefragt werden, die
388 über die Benutzung von Resourcen entscheidet (z.B.
389 Dateiname):
<BR>Ein solcher Auftrag mu
ß in zwei Teilauftr
äge
390 unterteilt werden. Der erste erledigt die Abfrage. Danach werden alle
391 Resourcen freigegeben und dann fordert der zweite seine Resourcen und
392 wird bearbeitet. Eventuell kann ein solcher Auftrag den vorherigen
393 ersetzten, um zu verhindern das andere abh
ängige Auftr
äge
394 vor dem Aufgeteilten bearbeitet werden.
</P>
395 <P>Ich habe mich bei einem Objekt als Listener angemeldet:
<BR>Es gibt
396 zwei Arten von Benachrichtigungen die ich erhalte.
1. Aufgrund der
397 Ausf
ührung eines Auftrages und
2. einen Event von einer
398 nebenl
äufigen Komponente. Im ersten Fall
überpr
üfe ich
399 den Resourcebedarf und f
ühre dann den Auftrag aus. Im zweiten
400 Fall reserviere ich die ben
ötigten Resourcen und f
ühren den
401 Auftrag aus. Sind Resourcen reserviert, ist dies Fall eins, sonst
403 <P>Ich bin Broadcaster:
<BR>Broadcaste ich aufgrund eines Auftrags tue
404 ich nichts weiter. L
öse ich den Broadcast ohne Auftrag aus, mu
ß
405 ich die Resourcen f
ür die Listener bestimmen und sie vor dem
406 Aufruf reservieren. Die einzelnen Listener werden als unabh
ängig
407 betrachtet. Im Detail findet folgender Ablauf statt.
1. Die Liste der
408 Listener wird kopiert.
2. F
ür den ersten Listener wird der
409 Resourcebedarf ermittelt.
</P>
410 <H3>Implementation
</H3>
411 <P>Die Basis f
ür die Implementation des Resourcekonzeptes legen
412 die Klassen
<A HREF=
"stardiv.resource.Resource.html#Resource">Resource
</A>,
413 <A HREF=
"stardiv.resource.ResourceList.html#ResourceList">ResourceList
</A>,
414 <A HREF=
"stardiv.resource.ResourceLockException.html#ResourceLockException">ResourceLockException
</A>,
415 <A HREF=
"stardiv.resource.Task.html#Task">Task
</A>,
<A HREF=
"stardiv.resource.TaskManager.html#TaskManager">TaskManager
</A>,
416 <A HREF=
"stardiv.resource.TaskThread.html#Task">TaskThread
</A>,
417 <A HREF=
"stardiv.resource.ThreadData.html#ThreadData">ThreadData
</A>
418 und das Interface
<A HREF=
"stardiv.resource.Resourceable.html#Resourceable">Resourceable
</A>
419 fest. Um ein Objekt in das Resourcekonzept einbinden zu k
önnen
420 sind folgende Schritte notwendig:
<BR>1. Das Resourceable Interface
421 mu
ß implementiert werden.
2. Ein Konstruktor mit der dem
422 Objekte zugewiesenen Resource.
3. Jede public Methode bekommt eine
423 *_Resource(...) Methode zur Seite, mit der der Resourcebedarf
424 ermittelt werden kann.
4. Innerhalb der public Methode wird der
425 Resourcebedarf ermittelt.
5. Mit dieser Information die als
426 ResourceListe vorliegt, wird eine Auftrag (Task) erzeugt.
6. Dieser
427 Auftrag wird beim TaskManager angemeldet.
7. Nach der Zuteilung durch
428 den TaskManager wird der Auftrag ausgef
ührt.
8. Alle Resourcen
429 und der Auftrag werden wieder freigegeben.
<BR>Diese Liste ist
430 detailliert aber nicht
<B>vollst
ändig
</B>. In der Klasse
431 Resource steht imm eine Beispiel, welches aktuell sein sollte.
</P>
432 <P>Folgende Programmierrichtlinien gibt es, um das
„Prealloc
433 Resource Konzept
“ in Java zu integrieren:
</P>
435 <LI><P ALIGN=LEFT
>Es mu
ß das Interface
<A HREF=
"stardiv.resource.Resourceable.html#Resourceable">Resourceable
</A>
436 implementiert werden. Mit Hilfe dieses Interfaces kann der
437 Resourcebedarf eines Objektes erfragt werden. Diese Richtlinien
438 gelten dann auch f
ür die Superklasse.
</P>
439 <LI><P ALIGN=LEFT
>???Es mu
ß das Interface
<A HREF=
"stardiv.concepts.ModifyTestable.html#ModifyTestable">ModifyTestable
</A>
440 implementiert werden. Damit kann
überpr
üft werden, ob an
441 den Resourcen Ver
änderungen vorgenommen wurden.
</P>
442 <LI><P ALIGN=LEFT
>Nur Methoden die
über die Lebensdauer des
443 Objektes keine ver
änderten Werte liefern d
ürfen immer
444 gerufen werden. Das sind zum Beispiel alle Methoden der Klasse
445 java.lang.Object.
</P>
446 <LI><P ALIGN=LEFT
>Um den Resourcebedarf einzelner Methoden genauer
447 zu ermitteln kann eine Methode mit dem, um _Resource( ResourceList
448 aRL, boolean bCheck, ... ) erweiterten Namen, gerufen werden. Ein
449 Beispiel befindet sich in der Klasse
<A HREF=
"stardiv.resource.Resource.html#Resource">Resource
</A>.
</P>
451 <H2><A NAME=
"Security"></A>Security
</H2>
452 <H2><A NAME=
"Data Requests"></A>Data Requests
</H2>
453 <P>Diese Schnittstelle soll das Anfordern von Daten vereinheitlichen.
454 Das Problem, welches zu diesem Ansatz f
ührte, ist das Lesen von
455 Daten
über einen
„langsamen
“ Internet-Stream. Das
456 bedeutet es werden Daten ben
ötigt, die erst noch
übertragen
457 werden m
üssen. Da das Pull-Modell immer einen eigenen Thread
458 vorraussetzt, um die restliche Anwendung nicht zu blockieren, habe
459 ich das Push-Modell gew
ählt.
<BR><B>Ziel:
</B> F
ür die
460 Implementation sollte es m
öglichst transparent sein, wie die
461 Daten herangeschafft werden. Als zweites soll die Schnittstelle f
ür
462 denjenigen einfach sein, der alle Daten sofort bereith
ält.
<BR><B>L
ösung:
</B>
463 Der Datenverarbeiter ist passiv. Das bedeutet, beim Entgegennehmen
464 der Daten beginnt er nicht sie zu verarbeiten. Dies mu
ß extra
465 angesto
ßen werden. Zweitens, der Datenverarbeiter h
ält den
466 Status des Datenlieferanten. Dies k
önnen EOF, f
ür alle
467 Daten gelesen, READY, f
ür sind Daten da, PENDING, es kommen noch
468 weitere Daten und NO_SOURCE, es wurden nicht alle Daten verarbeitet
469 und es kommen keine weiteren Daten mehr.
<B>Achtung
</B> der Status
470 ist nur zu bestimmten Zeitpunkten g
ültig. Der Datenverarbeiter
471 darf nur im Zustand PENDING Daten bekommen. Diese Annahme sch
ützt
472 ihn vor der Implementation eines Puffers. Das
<A HREF=
"stardiv.concepts.QueryData.html#QueryData">QueryData
</A>
473 - Interface ist die Spezifikation f
ür dieses Verhalten.
</P>
474 <H2><A NAME=
"Modify"></A>Modify
</H2>
475 <P>Das Ziel ist nur eine Schnittstelle zu erstellen, mit der ein
476 Objekt auf
Änderungen
überpr
üft werden kann. Da es f
ür
477 ein Objekt verschiedene M
öglichkeiten gibt
Änderungen an
478 sich zu pr
üfen (z.B.
Änderungsz
ähler, Kopie), mu
ß
479 die Schnittstelle m
öglichst flexibel sein, um vielen
480 Implementationen gerecht zu werden. Die L
ösung sind zwei
481 Methoden. Mit der einen (getModifyHandle()) kann der Zeitpunkt
482 festgemacht werden, zu dem m
ögliche
Änderungen
überpr
üft
483 werden sollen. Der R
ückgabewert ist eine beliebiges Objekt, so
484 da
ß in ihm die ben
ötigte
Überpr
üfungsinformation
485 (z.B. der
Änderungsz
ähler) untergebracht werden kann.
486 Danach kann mit der zweiten Methode (isModified(Object))
überpr
üft
487 werden, ob eine
Änderung stattgefunden hat. Das Interface f
ür
488 dieses Konzept hei
ßt
<A HREF=
"stardiv.concepts.ModifyTestable.html#ModifyTestable">ModifyTestable
</A>
490 <H2><A NAME=
"LifeConnect"></A>LifeConnect
</H2>
491 <P>LifeConnect ist die Kommunikation zwischen PlugIns, Applets und
492 JavaScript. Die Kommunikation kann in beide Richtungen erfolgen.Unter
493 JavaScript kann auf alle Systemklassen zugegriffen werden. Die
494 Abbildung der JavaScript-Aufrufe nach Java ist die Aufgabe der Klasse
495 <A HREF=
"stardiv.js.ip.CallJava.html#CallJava">CallJava
</A>. Dazu
496 wird das in Java
1.1 implementierte Package java.lang.reflect
497 benutzt. Da JavaScript eine nicht typisierte Sprache ist, werden die
498 Werte nach JavaScript-Regeln in die entsprechenden Javatypen
499 umgesetzt. Bez
üglich der Sicherheit wird ein JavaScript-Programm
500 auf die gleiche Stufe wie ein Applet gestellt. Um den Zugriff der
501 Applets auf JavaScript zu gestatten, mu
ß das HTML-Tag MYSCRIPT
502 angegeben werden. Auf die Java-Klassen kann in JavaScript mit dem
503 Prefix
„Package
“ zugegriffen werden (sun, java und netscape
504 ben
ötigen keinen Prefix). Die Klassen netscape.plugin.Plugin,
505 netscape.javascript.JSObject und netscape.javascript.JSException
506 dienen zur Kommunikation von Java mit JavaScript.
</P>
507 <P>Konvertierungstabelle anhand der Spezifikation
„JavaScript
508 Language Specifications
“ 3.1.2 TypeConversion
</P>
509 <TABLE WIDTH=
100% BORDER=
1 CELLPADDING=
5 CELLSPACING=
0 FRAME=HSIDES RULES=ALL
>
520 <TH WIDTH=
10% VALIGN=TOP
>
522 <TH WIDTH=
16% VALIGN=TOP
>
524 <TH WIDTH=
19% VALIGN=TOP
>
526 <TH WIDTH=
19% VALIGN=TOP
>
528 <TH WIDTH=
19% VALIGN=TOP
>
530 <TH WIDTH=
19% VALIGN=TOP
>
537 <P ALIGN=LEFT
>Undef.
</TD>
539 <P ALIGN=LEFT
>Fehler
</TD>
541 <P ALIGN=LEFT
>Fehler
</TD>
543 <P ALIGN=LEFT
>Fehler
</TD>
545 <P ALIGN=LEFT
>Fehler
</TD>
547 <P ALIGN=LEFT
>Fehler
</TD>
551 <P ALIGN=LEFT
>Function
</TD>
553 <P ALIGN=LEFT
>(
10) valueOf/error
</TD>
555 <P ALIGN=LEFT
>(
11) valueOf/error
</TD>
557 <P ALIGN=LEFT
>(
11) valueOf/error
</TD>
559 <P ALIGN=LEFT
>(
12) valueOf/error
</TD>
561 <P ALIGN=LEFT
>(
13) valueOf/error
</TD>
565 <P ALIGN=LEFT
>Object
</TD>
567 <P ALIGN=LEFT
>(
10) valueOf/error
</TD>
569 <P ALIGN=LEFT
>(
11) valueOf/error
</TD>
571 <P ALIGN=LEFT
>(
11) valueOf/error
</TD>
573 <P ALIGN=LEFT
>(
12) valueOf/error
</TD>
575 <P ALIGN=LEFT
>(
13) valueOf/error
</TD>
579 <P ALIGN=LEFT
>Object (null)
</TD>
581 <P ALIGN=LEFT
>(
10)
0</TD>
583 <P ALIGN=LEFT
>(
11)
0</TD>
585 <P ALIGN=LEFT
>(
11)
0</TD>
587 <P ALIGN=LEFT
>(
12)
0</TD>
589 <P ALIGN=LEFT
>(
13)
0</TD>
593 <P ALIGN=LEFT
>double
</TD>
595 <P ALIGN=LEFT
>(
10) Zahl oder Fehler, wenn Bereichs-
überschreitung
</TD>
597 <P ALIGN=LEFT
>(
11) Zahl oder Fehler, wenn Bereichs-
überschreitung
</TD>
599 <P ALIGN=LEFT
>(
11) Zahl oder Fehler, wenn Bereichs-
überschreitung
</TD>
601 <P ALIGN=LEFT
>(
12) Zahl oder Fehler, wenn Bereichs-
überschreitung
</TD>
603 <P ALIGN=LEFT
>(
13) Zahl oder Fehler, wenn Bereichs-
überschreitung
</TD>
607 <P ALIGN=LEFT
>boolean
</TD>
609 <P ALIGN=LEFT
>(
15)
0/
1</TD>
611 <P ALIGN=LEFT
>(
15)
0/
1</TD>
613 <P ALIGN=LEFT
>(
15)
0/
1</TD>
615 <P ALIGN=LEFT
>(
15)
0/
1</TD>
617 <P ALIGN=LEFT
>(
15)
0/
1</TD>
621 <P ALIGN=LEFT
>Leer String
</TD>
623 <P ALIGN=LEFT
>error
</TD>
625 <P ALIGN=LEFT
>error
</TD>
627 <P ALIGN=LEFT
>error
</TD>
629 <P ALIGN=LEFT
>error
</TD>
631 <P ALIGN=LEFT
>error
</TD>
635 <P ALIGN=LEFT
>String
</TD>
637 <P ALIGN=LEFT
>(
10) error/ Zahl
</TD>
639 <P ALIGN=LEFT
>(
11) error/ Zahl
</TD>
641 <P ALIGN=LEFT
>(
11) error/ Zahl
</TD>
643 <P ALIGN=LEFT
>(
12) error/ Zahl
</TD>
645 <P ALIGN=LEFT
>(
13) error/ Zahl
</TD>
651 <TABLE WIDTH=
100% BORDER=
1 CELLPADDING=
5 CELLSPACING=
0 FRAME=BOX RULES=ALL
>
662 <TH WIDTH=
10% VALIGN=TOP
>
664 <TH WIDTH=
23% VALIGN=TOP
>
666 <TH WIDTH=
17% VALIGN=TOP
>
667 <P><I>double
</I></TH>
668 <TH WIDTH=
14% VALIGN=TOP
>
669 <P><I>boolean
</I></TH>
670 <TH WIDTH=
14% VALIGN=TOP
>
671 <P><I>String
</I></TH>
672 <TH WIDTH=
22% VALIGN=TOP
>
673 <P><I>Object
</I></TH>
679 <P ALIGN=LEFT
>Undef.
</TD>
681 <P ALIGN=LEFT
>Fehler
</TD>
683 <P ALIGN=LEFT
>Fehler
</TD>
685 <P ALIGN=LEFT
>false
</TD>
687 <P ALIGN=LEFT
>„undefined
“</TD>
689 <P ALIGN=LEFT
>null
</TD>
693 <P ALIGN=LEFT
>Function
</TD>
695 <P ALIGN=LEFT
>(
14) valueOf/error
</TD>
697 <P ALIGN=LEFT
>(
15) valueOf/error
</TD>
699 <P ALIGN=LEFT
>(
15) valueOf/ true
</TD>
701 <P ALIGN=LEFT
>(
15) JS-Code der Funktion
</TD>
703 <P ALIGN=LEFT
>(
30) netscape .javascript. JSObject
</TD>
707 <P ALIGN=LEFT
>Object
</TD>
709 <P ALIGN=LEFT
>(
14) valueOf/error
</TD>
711 <P ALIGN=LEFT
>(
15) valueOf/error
</TD>
713 <P ALIGN=LEFT
>(
15) valueOf/ true
</TD>
715 <P ALIGN=LEFT
>(
15) valueOf / toString
718 <P ALIGN=LEFT
>(
30) Java-Cast/ error
</TD>
722 <P ALIGN=LEFT
>Object (null)
</TD>
724 <P ALIGN=LEFT
>(
14)
0</TD>
726 <P ALIGN=LEFT
>(
15)
0</TD>
728 <P ALIGN=LEFT
>(
15) false
</TD>
730 <P ALIGN=LEFT
>(
15)
„null
“</TD>
732 <P ALIGN=LEFT
>(
30) null
</TD>
736 <P ALIGN=LEFT
>double
</TD>
738 <P ALIGN=LEFT
>(
14) Zahl oder Fehler, wenn Bereichs-
überschreitung
</TD>
740 <P ALIGN=LEFT
>(
30) Zahl
</TD>
742 <P ALIGN=LEFT
>(
7)
0, NaN -
> false !
0, -+Infinite -
> true
</TD>
744 <P ALIGN=LEFT
>(
8) Zahl, NaN, Infinity oder -Infinity
</TD>
746 <P ALIGN=LEFT
>(
9) Number/ error
751 <P ALIGN=LEFT
>boolean
</TD>
753 <P ALIGN=LEFT
>(
15)
0/
1</TD>
755 <P ALIGN=LEFT
>(
15)
0/
1</TD>
757 <P ALIGN=LEFT
>(
30) boolean
</TD>
759 <P ALIGN=LEFT
>(
15)
„false
“/
“true
“</TD>
761 <P ALIGN=LEFT
>(
15) Boolean/ error
</TD>
765 <P ALIGN=LEFT
>Leer String
</TD>
767 <P ALIGN=LEFT
>error
</TD>
769 <P ALIGN=LEFT
>error
</TD>
771 <P ALIGN=LEFT
>(
15) false
</TD>
773 <P ALIGN=LEFT
>(
30) String
</TD>
775 <P ALIGN=LEFT
>(
15) String/ error
</TD>
779 <P ALIGN=LEFT
>String
</TD>
781 <P ALIGN=LEFT
>(
14) error/ Zahl
</TD>
783 <P ALIGN=LEFT
>(
15) error/ Zahl
</TD>
785 <P ALIGN=LEFT
>(
15) true
</TD>
787 <P ALIGN=LEFT
>(
30) String
</TD>
789 <P ALIGN=LEFT
>(
15) String/ error
</TD>
794 <P>Der Algorithmus zum mappen der polymorphen Methoden in Java:
<BR>1.
795 Die Anzahl der Parameter mu
ß übereinstimmen.
<BR>2. Die
796 Parameter m
üssen, nach der obigen Tabelle, konvertiert werden
797 k
önnen.
<BR>3. Es gibt ein Punktesystem, nach dem die Methode
798 ausgew
ählt wird. Die Punkte stehen in Klammern in den
799 Tabelleneintr
ägen. Die Konvertierungspunkte f
ür Zahlen sind
800 typabh
ängig und nicht wertabh
ängig. Dadurch ist
801 sichergestellt, das nicht unterschiedliche Methoden bei sich
802 ändernden Werten gerufen werden. Kommt es allerdings zu einem
803 Konvertierungsfehler (
Überlauf), dann wird versucht eine andere
804 Methode zu finden.
<BR>4. Es wird vorausgesetzt, da
ß die
805 Methoden
„valueOf
“ und
„toString
“ keine
806 Seiteneffekte haben. Sie d
ürfen also beliebig oft aufgerufen
807 werden.
<BR>5. Es wird nur null auf eine Java-Array abgebildet.
</P>
808 <H2><A NAME=
"Testen"></A>Testen
</H2>
809 <P>Das Ziel dieses Abschnitts ist es Vorgehensweisen zu entwickeln,
810 mit denen sich die Java Grundkonzepte testen lassen. Folgende
811 Checkliste ist f
ür jede Methode abzuarbeiten.
</P>
813 <LI><P>Zu jeder Klasse gibt es eine entsprechende Testklasse. Diese
814 steht im Package
„test
“.... Der Name der Klasse wird mit
815 „Test
“ erweitert. Beispiel: stardiv.memory.BitArray wird
816 zu test.memory.BitArrayTest. Jede dieser Klassen hat eine Methode
817 „public static void main( String [] )
“. Diese Methode wird
818 aufgerufen, um den Test aller Methoden anzusto
ßen. Der Test
819 ist nicht interaktiv. Wird ein Fehler festgestellt, wird das
820 Programm mit exit( -
1 ) verlassen.
</P>
821 <LI><P>Jede Methode mu
ß unabh
ängig von ihren Environment
822 getestet werden. Alle Resourcen f
ür die Methode werden als
823 Dummy f
ür den Test implementiert. Diese Forderung f
ührt zu
824 sauberen Schnittstellen, da ansonsten f
ür den Test ja ganze
825 Objekte implementiert werden m
üssen.
</P>
826 <LI><P>Das Testprotokoll protokolliert mit
„System.out.println
“.
827 Vor dem Test der einzelnen Methoden wird in einer Zeile kurz
über
828 den Test informiert. Scheitert der Test, dann wird eine
829 Fehlermeldung ausgegeben in der
„failed
“ enthalten sein
831 <LI><P>Um
<A HREF=
"#Defined Exception">Defined Exception
</A> und
832 <A HREF=
"#Transacted Exception">Transacted Exception
</A> testen zu
833 k
önnen, sollten die
<A HREF=
"stardiv.concepts.Resource.html#Resource">Resource
</A>
834 und
<A HREF=
"stardiv.concepts.ModifyTestable.html#ModifyTestable">ModifyTestable
</A>
835 Interfaces implementiert werden. Es kann damit automatisch gepr
üft
836 werden, ob sich eine Resource unerlaubter Weise ge
ändert hat.
</P>
839 <P><A NAME=
"lebendig"></A>Lebendig: Ein System wird als lebendig
840 bezeichnet, wenn alle in ihm befindlichen Auftr
äge
841 fertiggestellt werden k
önnen. Sie sich also nicht in einer
842 Verklemmung oder einem
„Race
“ befinden.
</P>