DisTAnz 1.0

Implementierung des Agenten

Klassendiagramm

Das neue Klassendiagramm des Agenten (neues Browserfenster). Vorsicht: Sehr groß (84 kB, 2564x1725 Pixel)

Änderungen zum Feinentwurf

Neue Variablen/Klassen/Methoden sind so markiert, entfallene sind anders markiert und geänderte auf diese Art. Variablen werden der Übersichtlichkeit halber nicht aufgeführt, wenn sie noch "im Originalzustand" sind.


Das Package agent
Klasse Variable/Methode Erläuterung
DTAManager DTAManager() Keine Veränderung.
go():void Dient nach dem Erzeugen der nötigen Instanzen durch den Konstruktor zum Start der Agententätigkeit.
main(args:String[]):void Keine Veränderung.
DataStorage DataStorage() Keine Veränderung.
size():int Liefert die Größe des data-Vectors zurück.
clear():void Löscht den Inhalt von DataStorage. Wichtig!
removeElementAt(pos:int):void Ersetzt deleteBlock, welches im Feinentwurf nur unvollständig spezifiziert wurde.
toString():String Dient hauptsächlich dem Test der Klasse und liefert eine String-Repräsentation des Inhaltes von DataStorage.
refreshBlocks():void Es werden jetzt immer alle Blöcke in DataStorage überprüft, eine Angabe der Blöcke ist daher nicht mehr nötig.
deleteBlock():void Wird durch removeElementAt ersetzt.
ManagerData ManagerData() Keine Veränderung.
getLastRequest(managerIP:InetAddress):Date Keine Veränderung.
setLastRequest(managerIP:InetAddress, requestTime:Date):Date Keine Veränderung.
main(args:String[]):void Dient dem Test der Klasse.
DataCollector port:int Es wird kein Standardwert mehr vorgesehen.
in:BufferedReader Zum Lesen des Datenstromes von localhost:2000. Im Feinentwurf vergessen.
myMemory:DataStorage Zum Speichern der gesammelten Daten. Im Feinentwurf vergessen.
collThread:Thread Dient der Threadkontrolle. Im Feinentwurf nicht enthalten, da diese Art der Threadsteuerung noch nicht bekannt bzw. geplant war.
DataCollector(storage:DataStorage) Keine Veränderung an der Spezifikation. Es wird jedoch implizit port=2000 gesetzt.
DataCollector(storage:DataStorage, port:int) Zur Angabe eines vom Standard abweichenden Ports.
start():void Startet den Thread. Im Feinentwurf nicht enthalten, da diese Art der Threadsteuerung nicht bekannt war.
run():void Keine Veränderung.
die():void Ersetzt stop. Erklärung siehe dort.
filterPacketInfo(dataPacket:String):Flow Keine Veränderung.
main(args:String[]):void Dient dem Test der Klasse.
stop():void Ersetzt durch die(). Grund: Bei ersten Implementierungen wurde Thread beerbt, und stop überschrieb eine Methode, die als deprecated markiert war. Bei der jetzigen Implementierung von Runnable könnte auch wieder stop() verwendet werden. Von einer erneuten Änderung wurde jedoch abgesehen.
DTAProtocol   Im Feinentwurf nicht enthalten. Lagert die Protokollverarbeitung aus der Klasse RequestHandlerData aus, die dadurch kompakter und weniger fehleranfällig wird.
WAITING:int=0 Markiert den Wartezustand
SENTDATA:int=1 MArkiert den Zustand "Daten wurden gesendet".
state:int Zum speichern des aktuellen Zustandes.
data:Vector Zur Zwischenspeicherung der zu versendenden Daten.
dStorage:DataStorage Ermöglicht den Zugriff auf die zu versendenden Daten.
mData:ManagerData Ermöglicht das speichern der neuen letzten Abfragezeit durch den Manager.
mAddress:InetAddress Zur Identifikation des zu bedienenden Managers.
rqTime:long Die Zeit der aktuellen Abfrage. Zur Umrechnung der in den zu versendenden Daten enthaltenen Zeitangaben.
DTAProtocol(mData:ManagerData, dStorage:DataStorage, mAddress:InetAddress, rqTime:long) Der Konstruktor.
processInput(theInput:String):String Verarbeitet die übergebene Zeile (die vom Manager empfangen wurde) und gibt die passende Ausgabezeile zurück.
RequestServerData mData:ManagerData Im Feinentwurf nicht enthalten, da die Notwendigkeit der Übergabe einer solche Referenz übersehen wurde.
dStorage:DataStorage Im Feinentwurf nicht enthalten, da die Notwendigkeit der Übergabe einer solche Referenz übersehen wurde.
srvThread:Thread Dient der Threadkontrolle. Im Feinentwurf nicht enthalten, da diese Art der Threadsteuerung noch nicht bekannt bzw. geplant war.
RequestServerData(port:int, mData:ManagerData, dStorage:DataStorage) Durch die Einführung von mData und dStorage wurde auch die Anpassung des Konstruktors nötig, so daß die entsprechenden Objekte übergeben werden können.
start():void Startet den Thread. Im Feinentwurf nicht enthalten, da diese Art der Threadsteuerung nicht bekannt war.
run():void Keine Veränderung.
die():void Ersetzt stop. Erklärung siehe dort.
main(args:String[]):void Dient dem Test der Klasse.
stop():void Erklärung siehe DataCollector.stop.
RequestServerExistance mSocket:MulticastSocket Im Feinentwurf nicht enthalten. Durch Auflösung der Klasse RequestHandlerExistance in diese Klasse mit eingegangen.
dSocket:DatagramSocket Im Feinentwurf nicht enthalten, da die Notwendigkeit eines DatagramSocket noch nicht klar war.
srvThread:Thread Dient der Threadkontrolle. Im Feinentwurf nicht enthalten, da diese Art der Threadsteuerung noch nicht bekannt bzw. geplant war.
RequestServerExistance(port:int, group:InetAddress) Keine Veränderung.
run():void Keine Veränderung.
die():void Ersetzt stop. Erklärung siehe dort.
main(args:String[]):void Dient dem Test der Klasse.
stop():void Erklärung siehe DataCollector.stop.
RequestHandlerData inputLine:String Im Feinentwurf nicht enthalten, da die Notwendigkeit für eine solche Variable erst in der Implementierungsphase zutage trat. Relativ geringe Wichtigkeit.
outputLine:String Im Feinentwurf nicht enthalten, da die Notwendigkeit für eine solche Variable erst in der Implementierungsphase zutage trat. Relativ geringe Wichtigkeit.
convertTimeToRelative():void Nicht mehr enthalten. da die nötige Funktionalität durch die neuen toString()-Methoden in DataBlock und Flow erfüllt wird.
RequestHandlerExistance   Entfällt komplett. Die Funktionalität wurde in den RequestServerExistance integriert. Dies erschien aufgrund der Einfachheit der Antwortfunktionalität einfacher und sinnvoller, als dafür jeweils einen eigenen Thread zu starten.

Das Package common
Klasse Variable/Methode Erläuterung
DataBlock DataBlock(duration:int) Keine Veränderung.
DataBlock(duration:int, data:Vector) Keine Veränderung.
DataBlock(duration:int, startTime:long, data:Vector) Neuer Konstruktor, der das Erzeugen von DataBlocks mit einer bestimmten Startzeit ermöglicht.
isPossibleToAdd(dataFlow:Flow):boolean Liefert true, wenn es möglich ist, diesem DataBlock den übergebenen Flow hinzuzufügen.
addData(dataFlow:Flow):void Keine Veränderung.
getData():Vector Keine Veränderung.
elementAt(index:int):Flow Liefert den durch index spezifizierten Flow aus dem internen data-Objekt.
size():int Liefert die Größe des internen data-Objektes zurück.
getStart():Date Keine Veränderung.
setStart(newStart:Date):void Keine Veränderung.
getDuration():long Keine Veränderung.
setDuration(newDuration:long):void Keine Veränderung.
toString():String Liefert eine String-Repräsentation der DataBlock-Inhalte.
toString(showAsLong:boolean):String Wie toString, liefert jedoch alle Zeitangaben als long-Wert.
toString(time:long):String Wie toString, liefert jedoch alle Zeitangaben als auf den Wert time relativierten long-Wert.
isEmpty():boolean Gibt bei leerem DataBlock true zurück.
Flow Flow() Keine Veränderung.
Flow(timeStamp:Date, sourceIP:InetAddress, sourcePort:int, destIP:InetAddress, destPort:int, protocoll:int, size:long) Keine Veränderung.
getTime():Date Keine Veränderung.
setTime(newTime:Date):void Keine Veränderung.
getSourceIP():InetAddress Keine Veränderung.
setSourceIP(newSourceIP:InetAddress):void Keine Veränderung.
getDestIP():InetAddress Keine Veränderung.
setDestIP(newDestIP:InetAddress):void Keine Veränderung.
getSourcePort():int Im Feinentwurf vergessen.
setSourcePort(newSourcePort:int):void Im Feinentwurf vergessen.
getDestPort():int Keine Veränderung.
setDestPort(newDestPort:int):void Keine Veränderung.
getProtocoll():int Keine Veränderung.
setProtocoll(newProtocoll:int):void Keine Veränderung.
getSize():int Keine Veränderung.
setSize(newsize:long):void Im Feinentwurf nicht vorhanden, allerdings nötig (schon aufgrund der Tatsache, daß im Allgemeinen zu jeder get-Methode auch ein set-Äquivalent existieren sollte).
equals(packet:Flow):boolean Keine Veränderung.
add(packet:Flow):void Keine Veränderung.
toString():String Liefert eine String-Repräsentation der Flow-Inhalte.
toString(showAsLong:boolean):String Wie toString, liefert jedoch alle Zeitangaben als long-Wert.
toString(time:long):String Wie toString, liefert jedoch alle Zeitangaben als auf den Wert time relativierten long-Wert.

Schlußfolgerung

Die bereits im Feinentwurf vorhandenen Klassen blieben weitgehend unverändert, wie die niedrige Zahl der veränderten bzw. entfallenen Methoden und Variablen zeigt.

Die relativ hohe Anzahl von im Vergleich zum Feinentwurf hinzugekommenen Variablen und Methoden deutet dagegen auf zwei Tatsachen hin:

Erstens war die Problematik des Zugriffs auf andere Klassen und Methoden nicht völlig klar. Dies wird besonders deutlich, wenn man die direkte Assoziation von DataStorage und RequestHandlerData im Klassendiagramm des Feinentwurfes betrachtet. Auch die fehlende Übergabe von Referenzen der sonstigen assoziierten Objekte ist so zu erklären (d.h. es ist kein Zugriff über Konstrukte wie super().AndereKlasse oder parent().AndereKlasse möglich (wie zumindest ich es mir noch zu Beginn des Feinentwurfes in etwa vorstellte, Anm. des Verfassers).

Zweitens macht sich die fehlende detailliertere Planung der Abläufe im Programm bemerkbar, die wahrscheinlich die Notwendigkeit vieler der neu hinzugekommenen Methoden aufgezeigt hätte.

Quot erat demonstrandum: Es gab etwas zu lernen! :o)