Auflistung der JavaSpaces-spezifischen Annotationen für AID
Transcription
Auflistung der JavaSpaces-spezifischen Annotationen für AID
Auflistung der JavaSpaces-spezifischen Annotationen für AID Thomas Ewender 17. August 2006 Inhaltsverzeichnis 1 Annotationen für die Vertreterseite von JavaSpaces 2 2 Annotationen für die Treiberseite von JavaSpaces 2.1 Header . . . . . . . . . . . . . . . . . . . . . . 2.2 Component . . . . . . . . . . . . . . . . . . . 2.2.1 spacename_in . . . . . . . . . . . . 2.2.2 spacename_out . . . . . . . . . . . 2.3 Interface . . . . . . . . . . . . . . . . . . . . . 2.3.1 spacename_in . . . . . . . . . . . . 2.3.2 spacename_out . . . . . . . . . . . 2.4 Exception . . . . . . . . . . . . . . . . . . . . 2.5 Tuple . . . . . . . . . . . . . . . . . . . . . . 2.5.1 classname . . . . . . . . . . . . . . 2.6 Constructor . . . . . . . . . . . . . . . . . . . 2.6.1 classname . . . . . . . . . . . . . . 2.6.2 property . . . . . . . . . . . . . . . 2.6.3 option . . . . . . . . . . . . . . . . 2.6.4 creation_mode . . . . . . . . . . . 2.6.5 path . . . . . . . . . . . . . . . . . . 2.6.6 classname . . . . . . . . . . . . . . 2.7 IN-Event . . . . . . . . . . . . . . . . . . . . 2.7.1 attribute_in . . . . . . . . . . . . 2.7.2 spacename_in . . . . . . . . . . . . 2.7.3 classname_in . . . . . . . . . . . . 2.8 OUT-Event . . . . . . . . . . . . . . . . . . . 2.8.1 attribute_out . . . . . . . . . . . 2.8.2 spacename_out . . . . . . . . . . . 2.8.3 classname_out . . . . . . . . . . . 2.9 INOUT-Event . . . . . . . . . . . . . . . . . . 2 2 4 4 4 4 4 4 4 5 5 5 6 6 6 7 7 7 7 8 8 8 9 9 10 10 10 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.9.1 Ledigliches Entfernen eines Entry-Objekts aus dem Tupelraum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.9.2 Schreiben und anschließendes Lesen von Entry-Objekten . 2.9.3 attribute_out . . . . . . . . . . . . . . . . . . . . . 2.9.4 attribute_in . . . . . . . . . . . . . . . . . . . . . . 2.9.5 spacename_in . . . . . . . . . . . . . . . . . . . . . . 2.9.6 classname_in . . . . . . . . . . . . . . . . . . . . . . 2.9.7 attribute_out . . . . . . . . . . . . . . . . . . . . . 2.9.8 spacename_out . . . . . . . . . . . . . . . . . . . . . 2.9.9 classname_out . . . . . . . . . . . . . . . . . . . . . 2.10 OUTIN-Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.10.1 attribute_out . . . . . . . . . . . . . . . . . . . . . 2.10.2 attribute_in . . . . . . . . . . . . . . . . . . . . . . 2.10.3 spacename_in . . . . . . . . . . . . . . . . . . . . . . 2.10.4 classname_in . . . . . . . . . . . . . . . . . . . . . . 2.10.5 attribute_out . . . . . . . . . . . . . . . . . . . . . 2.10.6 spacename_out . . . . . . . . . . . . . . . . . . . . . 2.10.7 classname_out . . . . . . . . . . . . . . . . . . . . . 2.11 Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.1 take . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.2 write . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11.3 matching_param . . . . . . . . . . . . . . . . . . . . 11 11 11 12 12 12 12 12 12 13 13 13 13 13 14 14 14 14 14 14 14 1 Annotationen für die Vertreterseite von JavaSpaces TBD 2 Annotationen für die Treiberseite von JavaSpaces Ein Treiber für eine tupelraumbasierte Komponente ermöglicht die Kommunikation dieser Komponente mit einer andersartig interagierenden Umgebung. Aufgabe der AID-Spezifikation zusammen mit den interaktionsstilspezifischen Annotationen ist es, die tupelraumbasierte Komponente so detailliert zu beschreiben, dass eine Umsetzung der abstrakten AID-Ereignisse in konkrete Tupelraum-Operationen möglich ist. Die für JavaSpaces notwendigen Annotationen werden im Folgenden vorgestellt. 2.1 Header Für das AID-Element Header sind keine Annotationen vorgesehen. 2 Abbildung 1: Treiber für eine JavaSpaces-Komponente in einer Umgebung mit inkompatiblem Interaktionsstil. 3 2.2 Component 2.2.1 spacename_in Bezeichnet den Tupelraum1 , über den alle Ereignisse dieser Komponente interagieren. Ist für ein Interface oder ein Ereignis dieses Component-Elements eine eigene Annotation spacename_in vorhanden, so wird diese verwendet. Anderenfalls wird der Tupelraum des Component-Elements vererbt. 2.2.2 spacename_out Bezeichnet den JavaSpace, in den die Komponente ihre Entry-Objekte schreibt. Ist für ein Interface oder ein Event-Element eine separate Annotation spacename_in vorhanden, so wird diese verwendet. Aus dem mit spacename_out spezifizierten Tupelraum werden die Entry-Objekte gelesen, die den OUT-Teil von OUT-, INOUT- und OUTIN-Ereignissen darstellen. 2.3 Interface 2.3.1 spacename_in Bezeichnet den JavaSpace, über den alle Ereignisse dieses Interfaces interagieren. Ist für ein Event-Element dieses Interfaces eine separate Annotation spacename_in vorhanden, so wird diese verwendet. Ist weder für das Interface noch für das Event-Element ein JavaSpace spezifiziert, muss ein JavaSpace für das ComponentElement vorhanden sein, dass entsprechend vererbt wird. 2.3.2 spacename_out Bezeichnet den JavaSpace, in den die Komponente Entries dieses Interfaces schreibt. Ist für ein Event-Element eine separate Annotation spacename_out vorhanden, so wird diese verwendet. Aus diesem Tupelraum werden die Entry-Objekte gelesen, die den OUT-Teil von OUT-, INOUT- und OUTIN-Ereignissen darstellen. 2.4 Exception Es sind keine Annotationen für Exceptions vorgesehen. Für den Interaktionsstil JavaSpace gibt es keine benutzerdefinierten Ausnahmen. Für das Schreiben und Lesen von Entry-Objekten sind nur Ausnahmen definiert, die sich auf den Kommunikationsvorgang an sich beziehen und nicht auf das 1 Der Wert der Annotation spacename_in wird über den Namensdienst Reggie der JiniLaufzeitumgebung aufgelöst und in eine Referenz (exakt: einen Fernverweis) auf ein JavaSpaceObjekt umgewandelt. Spricht man von Tupelraum, bezieht man sich immer auf ein unter einem bestimmten Namen registrierten JavaSpaces-Objekt. 4 Ereignis, das durch das Schreiben/Lesen des Entry-Objekts repräsentiert wird. Es sind fünf Systemausnahmen für die Operationen read, take und write definiert: • UnusableEntryException (falls ein serialisiertes Feld des Entry-Objekts, das gelesen wird, aus irgendwelchen Gründen nicht deserialisert werden kann) • TransactionException (falls bei der Transaktion ein Fehler auftritt) • InterruptedException (falls der Thread, in dem die Operation aufgerufen wird, unterbrochen wird) • RemoteException (falls ein Kommunikationsfehler auftritt) • IllegalArgumentException (falls ein negativer Wert für den timeout-Parameter benutzt wird oder ein Objekt einer Klasse benutzt wird, das nicht public deklariert ist) Letztendlich existiert also für JavaSpaces-Komponenten keine Möglichkeit, Ausnahmen im Sinne von AID zu realisieren. Die Software, die die Vermittlung zur JavaSpaces-Komponente, realisiert muss sich demnach auf die Weitergabe dieser fünf Ausnahmen beschränken. 2.5 Tuple Das AID-Element Tuple als Datenkapsel ermöglicht die Verwendung von Objekten als Attribute eines Entry-Objekts. Um eine Musteranpassung von Seiten der Komponente zu ermöglichen, muss die Klasse der Komponente bekannt sein, die vordefinierte Klasse muss demnach dem Generator zur Verfügung stehen. Dazu dient die Annotation classname. 2.5.1 classname Bezeichnet die Klasse, die für das Tupel verwendet werden soll. An dieser Stelle muss auf Konsistenz geachtet werden, da die Member-Variablen des Tupels den öffentlichen Attributen der durch classname spezifizierten Klasse entsprechen müssen. Namensgleichheit ist dazu notwendig, um die entsprechenden Attribute des Objekts setzen zu können. Um Kapselung zu berücksichtigen, kann man auch die Benutzung entsprechender Getter- und Setter-Methoden unterstützen. 2.6 Constructor INIT-Ereignisse können zwei verschiedene Initialisierungsarten in JavaSpaces darstellen. 5 1. Ein INIT-Ereignis signalisiert den Aufruf eines Java-Programms mit allen dazugehörigen Konfigurationsmöglichkeiten. Dazu zählen Kommandozeilenargumente und System-Properties2 (notwendig, um die Properties für die Codebase3 , den SecurityManager4 und die Policy5 zu übergeben). Dazu sind zudem auch der Pfad sowie der Klassenname notwendig, mit dem das Programm gestartet werden soll. Ferner sollte eventuell die Möglichkeit bestehen, Standardoptionen, die an den java-Befehl übergeben werden sollen (wie -jar) zu unterstützen. 2. Ein INIT-Ereignis steht für den Aufruf eines Konstruktors einer Java-Klasse. Dem neu zu erzeugenden Objekt werden sämtliche zur Konfiguration notwendigen Parameter über den Konstruktor übergeben. Eine korrekt konfigurierte Laufzeitumgebung ist Voraussetzung für die Erzeugung dieses Objekts. Die hierfür notwendigen Annotationen beschränken sich auf den Klassennamen des zu erzeugenden Objekts. Diese beiden Varianten werden mit Hilfe der Annotation creation_mode unterschieden, die die Werte process bzw. instantiation annehmen kann. 2.6.1 classname Voll qualifizierter Klassenname, der als Klassenname dem Befehl java (engl. Java application launcher) übergeben wird oder zur Erzeugung eines Objekts der Klasse classname verwendet wird, abhängig von der Belegung der Annotation creation_mode 2.6.2 property System-Properties, mit denen die Anwendung gestartet werden soll. Hierzu sind mehrere Annotationen vom Typ property möglich. Die Properties werden unverändert durch Voranstellen des Strings -D an den Java Application Launcher übergeben. Diese Annotation ist nur für die Belegung creation_mode = process vorgesehen. 2.6.3 option Der Wert der Annotation option wird als Standardoption an den Java Application Launcher übergeben. Somit können Optionen wie -jar beim Anwendungsaufruf gesetzt werden. 2 Standard-Option mit -D vorangestellt. Non-Standard-Options, die über -X gekennzeichnet werden, wie Xms128m für inital memory, können über die Annotation option übergeben werden. (siehe http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html) 3 java.rmi.server.codebase 4 java.lang.SecurityManager 5 java.security.policy 6 2.6.4 creation_mode Kann einen der Werte process oder instantiation annehmen, die für das Starten einer Anwendung oder für das Erzeugen eines Objekts innerhalb einer vorhandenen Laufzeitumgebung stehen. 2.6.5 path Die Annotation Pfad beschreibt den absoluten Pfad zur Anwendung. Diese Annotation ist nur für die Belegung creation_mode = process vorgesehen, dafür aber obligatorisch. 2.6.6 classname Spezifiziert den Klassennamen des zu erzeugenden Objekts oder der zu startenden Java-Anwendung. Übergabe von Parametern/Argumenten Die Parameter des Konstruktors werden je nach Belegung der Annotation creation_mode dem Klassenkonstruktor übergeben oder in der angegebenen Reihenfolge als Kommandozeilenargumente der Anwendung übergeben. Fixe Werte werden über die Annotation attribute_in übergeben. Beispiel: INIT | | | | | classname = mp3converter.ChannelCreator creation_mode = process path=/usr/home/mp3converter property java.security.policy=policy/policy.all property java.lang.SecurityManager=java.lang.SecurityManager string channelname, int init_size, string spacename Resultiert in dem folgenden Aufruf: java -Djava.security.policy=policy/policy.all -Djava.lang.SecurityManager=java.lang.SecurityManager mp3converter.ChannelCreator channelname init_size spacename wobei die Argumente durch ihre aktuellen Werte der formalen Parameter ersetzt werden. 2.7 IN-Event Ein IN-Ereignis ist ein asynchrones Ereignis, dessen Umsetzung in JavaSpaces dem Schreiben eines Entry-Objekts in einen vorgesehenen JavaSpace entspricht. 7 2.7.1 attribute_in Durch die Annotation attribute_in werden vordefinierte Attributwerte der EntryObjekte gesetzt. Aufgrund der bei JavaSpaces-Operationen verwendeten Musteranpassung kann es nötig sein, bestimmte Attribute mit einem konstanten Wert vorzubelegen, der von der angesprochenen Komponente immer mit dieser Belegung erwartet wird. Da dieser Wert immer konstant bleibt und sie ein Spezifikum der Kommunikation auf JavaSpaces-Ebene und nicht auf AID-Ebene ist, soll dieses Attribut für den späteren Benutzer der Komponente transparent sein. Als Beispiel soll eine Klasse namens Index dienen, deren Inkarnationen zur Verwaltung einer FIFO-Schlange dienen. Das type-Attribut der Klasse entscheidet über die Verwendung des Index-Objekts als Kopf oder Ende der Schlange. Das Ereignis IN setTail | attribute_in type=tail | classname_in=queue.Index string channel, int position wird realisiert, indem ein Objekt der Klasse queue.Index mit den Attributen channel, position und dem mit «tail» vorbelegten Attribut type im JavaSpace abgelegt wird. 2.7.2 spacename_in Die Annotation spacename_in beschreibt den JavaSpace, in den dieses Ereignis geschrieben werden soll. Ist für das übergeordnete Interface oder Component bereits ein JavaSpace festgelegt, ist diese Annotation nicht obligatorisch, da der übergeordnete JavaSpace übernommen wird. Ist für das Ereignis ein JavaSpace annotiert, so wird dieser benutzt. 2.7.3 classname_in classname_in legt den voll qualifizierten Klassennamen des Entry-Objekts fest, das das IN-Ereignis repräsentiert. Die Klasse muss das Interface org.jini.core.Entry implementieren, einen öffentlichen Standardkonstruktor besitzen sowie nur öffentliche, nicht-primitive Attribute besitzen. Näheres dazu in der JiniTM Entry Specification6 . 6 http://java.sun.com/products/jini/2.1/doc/specs/html/entry-spec.html 8 2.8 OUT-Event Ein OUT-Ereignis ist ein asynchrones Ereignis, dessen Umsetzung in JavaSpaces dem Lesen eines Entry-Objekts aus einen vorgesehenen JavaSpace entspricht. Im Detail betrachtet, schreibt die Komponente ein Entry-Objekt in den JavaSpace. Der Treiber entfernt dieses Tupel und leitet das Ereignis mitsamt Attributen an die Umgebung als Empfänger des Ereignisses weiter. Die Komponente erhält keine Rückantwort, daher ist die Kommunikation asynchron. Da JavaSpaces die Operationen take und read beim Lesen von Tupeln unterscheidet, muss man diese beiden Varianten auch mit Hilfe von Annotationen berücksichtigen. Ist die Annotation take_only für das OUT-Event gesetzt, wird das Tupel aus dem Tupelraum nur gelesen und verbleibt im Tupelraum, im Standardfall wird es aus dem Tupelraum entfernt. Die für beide Fälle zu verwendenden Annotationen variieren nur geringfügig in semantischen Details und sind deshalb gemeinsam aufgeführt. 2.8.1 attribute_out Durch die Annotation attribute_out werden vordefinierte Attributwerte des zur Musteranpassung verwendeten Entry-Objekts gesetzt. Wie bei attribute_out kann es aufgrund der bei JavaSpaces-Operationen verwendeten Musteranpassung notwendig sein, dass bestimmte Ereignisse durch fixe Belegung von Attributewerten charakterisiert sind. Will der Treiber ein derartiges Ereignis entgegennehmen, muss er dieses Attribut mit diesem konstanten Wert vorzubelegen, um andere nicht gewollte Ereignisse auszuschließen. Wir schließen an das Beispiel für die Annotation attribute_in für IN-Ereignisse an. Um ein für das Ereignis getTailPosition passendes Entry-Objekt zu erhalten, muss das Attribute type mit "tail"vorbelegt sein. Dadurch werden Objekte, die den Kopf der Schlange beschreiben, von der Mustererkennung ausgeschlossen. INOUT getTailPosition string channel, | take RETURNS int position | attribute_in type="tail" | classname_out=mp3converter.Index | tupelspace=music.mp3ts Entwurfsüberlegung Konzeptionell wäre auch vorstellbar, die Annotationen attribute_in und attribute_out nicht zu verwenden. Das Problem hierbei liegt jedoch darin, dass diese fixen Belegungen notwendig sind, um die Kommunikation zwischen Treiber und Komponente zu ermöglichen. Im Fall des oben gezeigten INOUT-Ereignisses müsste der Benutzer das Attribute type immer auf tail setzen, ansonsten würde der Kopf der Schlange ausgelesen, der jedoch in diesem Fall 9 ausschließlich von der Komponente benutzt wird. Diese zusätzliche Information müsste in der Schnittstelle dokumentiert und bei der Verwendung der Komponente beachtet werden. Die Entscheidung für oder gegen die Verwendung vordefinierter Attribute als Annotationen ist letztendlich eine Designentscheidung hinsichtlich der Frage, wie viel Abstraktion die Schnittstelle zu einer JavaSpaces-Komponente bieten soll. Denkbar wäre beispielsweise eine Komponente, deren Funktionsfähigkeit von der Belegung eines Attributes mit einer magic number abhängt. Diese magic number hat immer die gleiche Belegung und wird bei einem Ereignis immer gesetzt. Grundsätzlich ist hier auch ein manuelles Setzen dieses Attributs durch den Benutzer der Komponente denkbar, jedoch erscheint die Abstraktion davon mit Hilfe von vordefinierten Attributen doch als die komfortablere Alternative. Will man auf der anderen Seite dem Benutzer das Setzen dieses Attributs ermöglichen, so ist das durch eine entsprechende Modifizierung der AID-Schnittstelle jederzeit möglich. 2.8.2 spacename_out Bezeichnet den JavaSpace, in den die Komponente die Entry-Objekte für dieses Ereignis schreibt. Ist für ein Ereignis ein kein separater spacename_out annotiert, so wird der JavaSpace aus der jeweiligen Interface bzw. Component-Annotation verwendet. Aus diesem JavaSpace werden die Entries gelesen, die den OUT-Teil von OUT und INOUT und OUTIN-Ereignissen darstellen. 2.8.3 classname_out classname_out legt den voll qualifizierten Klassennamen des Entry-Objekts fest, das das OUT-Ereignis repräsentiert. Die Klassendefinition muss der JiniTM Entry Specification entsprechen. Objekte dieser Klasse werden als Template verwendet, um Entry-Objekte, die OUT-Ereignisse repräsentieren, aus dem Tupelraum zu entfernen. Die gelesenen/entnommenen Entry-Objekte besitzen ebenfalls diesen Typ classname_out. 2.9 INOUT-Event Es gibt zwei verschiedene Möglichkeiten, ein AID-INOUT-Ereignis auf JavaSpaces zu übertragen. Zur Unterscheidung dieser beiden Fälle dient die Annotation matching_only. Ist sie bei einem INOUT-Ereignis vorhanden, zeigt sie an, dass lediglich ein Entry-Objekt mittels Musteranpassung aus dem Tupelraum entfernt werden soll. Ist diese Annotation nicht gesetzt, wird ein Entry-Objekt im Tupelraum abgelegt und anschließend ein Antwort-Tupel entnommen. 10 2.9.1 Ledigliches Entfernen eines Entry-Objekts aus dem Tupelraum Es wird lediglich ein Entry-Objekt aus dem Tupelraum entnommen. Dazu muss ein Template-Objekt erzeugt werden, dessen Attribute gemäß der aktuellen Ereignisparameter gesetzt werden. Mit diesem Objekt als Template wird eine takeOperation ausgeführt. Die Untermenge an Attributen des als Rückgabewert erhaltenen Entry-Objekts, die in der RETURNS-Liste enthalten ist, wird im OUT-Ereignis als Antwortereignis gesetzt. Dieser Kommunikationsakt findet asynchron zwischen Umgebung und Komponente statt. Die Komponente sorgt lediglich dafür, dass ein passendes EntryObjekt im Tupelraum vorhanden ist, der Treiber liest dieses zeitlich entkoppelt aus dem Tupelraum aus und leitet es an die Umgebung weiter. 2.9.2 Schreiben und anschließendes Lesen von Entry-Objekten Zuerst wird ein Entry-Objekt im Tupelraum abgelegt, im Anschluss daran wird ein Antwort-Tupel entnommen. Dazu wird erst ein Entry-Objekt von Typ classname_in erzeugt und seine Attribute mit denjenigen Parametern gesetzt, die die Annotation write besitzen. Konstante Attribute werden durch die Annotation attribute_in erkannt und die entsprechenden Felder des Entry-Objekts gesetzt. Dieses Objekt wird in den Tupelraum abgelegt. Anschließend wird ein Template erzeugt, um ein Anwort-Tupel möglicherweise anderen Typs zu entnehmen. Für dieses Auslesen ist es unter Umständen notwendig, Attribute des Template-Objekts mit bestimmten Werten zu belegen. Hierzu werden mit write annotierte Parameter sowie konstante Attribute, die durch die Annotation attribute_out zur Verfügung gestellt werden, benutzt. Mit diesem Objekt als Template wird analog zum ersten Fall eine take-Operation ausgeführt. Die Untermenge an Attributen des als Rückgabewert erhaltenen EntryObjekts, die in der RETURNS-Liste enthalten ist, wird im OUT-Ereignis als Antwortereignis gesetzt. In diesem Fall sind also obligatorische take und write-Annotationen für die Parameter der Parameterliste notwendig. Parameter können hier sowohl zur Musteranpassung als auch als Belegungen der Attribute des Tupels, das in den Tupelraum abgelegt wird, benutzt werden. Näheres dazu unter Parameter. Analog zu OUT-Ereignissen müssen auch für diese beiden Fälle von INOUTEreignissen die Operationen take und read beim Lesen von Tupeln unterschieden werden. Ist die Annotation take_only für das INOUT-Event gesetzt, wird beim OUT-Teil des Ereignisses das Tupel aus dem Tupelraum nur gelesen und verbleibt im Tupelraum, im Standardfall wird es aus dem Tupelraum entfernt. 2.9.3 attribute_out Die für beide Fälle zu verwendenden Annotationen variieren nur geringfügig in semantischen Details und sind deshalb gemeinsam aufgeführt. 11 2.9.4 attribute_in Durch die Annotation attribute_in werden vordefinierte Attributwerte der EntryObjekte gesetzt. Die Verwendung geschieht analog zu IN-Ereignissen. Diese konstanten Attribute beziehen sich auf das Entry-Objekt, das zu Beginn in den Tupelraum geschrieben wird, findet also nur im zweiten Fall, also im Fall des Lesens und Schreibens von Tupeln Verwendung. 2.9.5 spacename_in Die Annotation spacename_in beschreibt den JavaSpace, in den das zuerst abzulegende Tupel geschrieben werden soll. Es wird analog zum gleichnamigen Attribut bei IN-Ereibnissen verwendet. Dieses Attribut bezieht sich wie attribute_in auf das Entry-Objekt, das zu Beginn in den Tupelraum geschrieben wird, es findet also auch nur im zweiten Fall Verwendung. 2.9.6 classname_in classname_in legt den voll qualifizierten Klassennamen des Entry-Objekts fest, das das IN-Ereignis repräsentiert. Die Klasse muss das Interface org.jini.core.Entry implementieren, einen öffentlichen Standardkonstruktor besitzen sowie nur öffentliche, nicht-primitive Attribute besitzen. Näheres in der JiniTM Entry Specification . Dieses Attribut bezieht sich ebenfalls nur auf das Entry-Objekt, das im zweiten Fall zu Beginn in den Tupelraum geschrieben wird. 2.9.7 attribute_out attribute_out wird analog zur gleichnamigen Annotation bei OUT-Ereignissen verwendet. Es werden dadurch beschriebene vordefinierte Attributwerte des zur Musteranpassung verwendeten Entry-Objekts gesetzt. 2.9.8 spacename_out spacename_out wird ebenfalls analog zur entsprechenden Annotation bei OUTEreignissen verwandt. Die Annotation bezeichnet den JavaSpace, aus dem EntryObjekte gelesen werden, die die Komponente als OUT-Ereignis in diesen Tupelraum schreibt. 2.9.9 classname_out classname_out wird ebenfalls analog zur gleichnamigen Annotation bei OUT-Ereignissen verwendet. Objekte dieser Klasse werden als Template verwendet, um Entry-Objekte, die OUT-Ereignisse repräsentieren, aus dem Tupelraum zu entfernen. 12 2.10 OUTIN-Event OUTIN-Ereignisse stellen sich in JavaSpaces folgendermaßen dar: Die Komponente schreibt ein Entry-Objekt ein den Tupelraum. Der Treiber leitet dieses Ereignis an die Umgebung weiter, welche im Anschluss ein Anwortereignis zurücksendet. Der Treiber ist daraufhin veranlasst ein Anworttupel entsprechend dem Antwortereignis in den Tupelraum zurückzuschreiben. Analog zu OUT-Ereignissen müssen auch hier die Operationen take und read beim Lesen von Tupeln unterschieden werden. Ist die Annotation take_only für das INOUT-Event gesetzt, wird beim OUT-Teil des Ereignisses das Tupel aus dem Tupelraum nur gelesen und verbleibt im Tupelraum, im Standardfall wird es aus dem Tupelraum entfernt. 2.10.1 attribute_out Die Parameter der Parameterliste müssen bei OUTIN-Ereignissen separat mit take oder write-Annotationen versehen werden, abhänging davon, ob sie für das Entnehmen des Entry-Objekts das das OUT-Ereignis repräsentiert, vorgesehen sind oder für das Entry-Objekt, das anschließend in den Tupelraum als Antwort zurückgeschrieben wird. Näheres dazu im Abschnitt Parameter. Die Typen in der RETURNS-Liste müssen eine Untermenge der Attribute des Entry-Objekts sein, das aus dem JavaSpace gelesen wird. Für diese Typen ist keine Unterscheidung in take oder write notwendig. 2.10.2 attribute_in Durch die Annotation attribute_in werden vordefinierte Attributwerte der EntryObjekte gesetzt. Die Verwendung geschieht analog zu IN-Ereignissen. Diese konstanten Attribute beziehen sich auf das Entry-Objekt, das als Antwort in den Tupelraum geschrieben wird. 2.10.3 spacename_in Die Annotation spacename_in beschreibt den JavaSpace, in den das als Antwort abzulegende Tupel geschrieben werden soll. Es wird analog zum gleichnamigen Attribut bei IN-Ereibnissen verwendet. Dieses Attribut bezieht sich also wie attribute_in auf das Entry-Objekt, das von der Umgebung als Antwort in den Tupelraum geschrieben wird. 2.10.4 classname_in classname_in wird analog zur gleichnamigen Annotation der IN-Ereignisse verwendet. Dieses Attribut bezieht sich ebenfalls nur auf das Entry-Objekt, das als Antwort von der Umgebung in den Tupelraum geschrieben wird. 13 2.10.5 attribute_out attribute_out wird analog zur gleichnamigen Annotation bei OUT-Ereignissen verwendet. Es werden dadurch beschriebene vordefinierte Attributwerte des zur Musteranpassung verwendeten Entry-Objekts gesetzt. 2.10.6 spacename_out spacename_out wird ebenfalls analog zur entsprechenden Annotation bei OUTEreignissen verwandt. Die Annotation bezeichnet den JavaSpace, aus dem EntryObjekte gelesen werden, die die Komponente als OUT-Ereignis in diesen Tupelraum schreibt. 2.10.7 classname_out classname_out wird ebenfalls analog zur gleichnamigen Annotation bei OUT-Ereignissen verwendet. Objekte dieser Klasse werden als Template verwendet, um Entry-Objekte, die OUT-Ereignisse repräsentieren, aus dem Tupelraum zu entfernen. 2.11 Parameter Die AID-Parameter werden über Namensgleichheit den öffentlichen Attributen der Entry-Objekte zugeordnet. Die Attribute der Entry-Klassen müssen dem Datentyp, der durch die kanonische Zuordnung von AID-Datentypen und Java-Datentypen vorgeschrieben ist. Um die für die Ereignisse vom Typ INOUT und OUTIN nötige Unterscheidung der Parameter zu realisieren, wurden für Parameter die Annotationen take und write eingeführt. 2.11.1 take Der mit take annotierte Parameter wird zur Belegung eines Attributes des als Template verwendeten Entry-Objekts benutzt. 2.11.2 write Der mit write annotierte Parameter wird zur Belegung eines Attributes des EntryObjekts verwendet, das in den Tupelraum abgelegt wird. 2.11.3 matching_param Semantisch ist die Annotation matching_param die Kombination aus den Annotationen take und write. Je nachdem, ob sie bei INOUT oder OUTIN-Ereignissen verwendet wird, hat ihre Benutzung unterschiedliche Auswirkungen. 14 Benutzung von matching_param bei OUTIN-Events Hierbei bezeichnet matching_param ein benutzerdefiniertes Attribut, das zur Belegung eines Attributes des Template-Objekts zum Auslesen des OUT-Ereignisses verwendet wird. Dasselbe, dem Parameter entsprechende Attribut wird auch beim anschließend im Tupelraum abgelegten Objekt gesetzt, das dem IN-Ereignis entspricht. Benutzung von matching_param bei INOUT-Events Ein mit der Annotation matching_param versehenes Attribut wird bei INOUT-Ereignissen als Attribut des initiativen IN-Ereignisses gesetzt und anschließend bei der Mustererkennung zur Entnahme des Antworttupels benutzt. Die Annotation matching_param kann nur im zweiten Fall von INOUT-Ereignissen verwendet werden, bei dem Tupel in den Tupelraum geschrieben und wieder entfernt werden. Der mit matching_param annotierte Parameter wird dann sowohl im abzulegenden Objekt gesetzt als auch zur Musteranpassung beim Template-Objekt zur Entnahme des Antworttupels. Im Unterschied zur Annotation attribute_out wird der Parameter für jedes AIDEreignis vom Benutzer festgelegt und bezeichnet nicht ein konstantes Attribut. Als Beispiel diene ein virtueller Marktplatz. Der Anwender hat die Wahl, Angebote auf Artikel abzugeben, die eine eindeutige Kennung besitzen. Vorstellbar ist eine Operation, um ein Gebot abzugeben, das Antworttupel beinhaltet die Information, ob der Artikel bereits verkauft ist. Die beiden Entry-Klassen seien Bid und SaleState. Bei der Beschreibung der Operation wird der Parameter article_id verwendet, der mit der Annotation matching_param versehen ist. Das Attribut article_id wird als Attribut des Bid-Objekts gesetzt, das zuerst in den Tupelraum geschrieben wird. Anschließend wird ein Template-Objekt SaleState erzeugt, bei dem wiederum article_id entsprechend dem Parameterwert gesetzt wird, um ausschließlich SaleState-Objekte auszulesen, die sich auf diesen Artikel beziehen. Literatur [1] S. Hupfer. Make Room for JavaSpaces, Part (www.javaworld.com), Copyright IDG, October 2000. 15 IV. JavaWorld