Stephan Bazalka
EProg Runde 4, BspNr. 4100
Matrikelnummer: 0225725
eMail: bazalka@gmx.net

PROGRAMMBESCHREIBUNG
--------------------
Das Programm simuliert ein Token Ring Netzwerk mit folgenden Komponenten:
Knoten: Gibt Paket einfach weiter
Workstation: Erzeugt neues Paket/entfernt es, wenn Adressat nicht gefunden wird
Fileserver: Speichert das Paket
Printserver: Druckt das Paket


FUNKTIONSWEISE (besonders wichtige Methoden)
--------------

Main.java:
Erzeugt neues Objekt "Input", das die Eingabe repräsentiert.
Nach erfolgreicher Überprüfung wird ein neues Netzwerk erzeugt, mit
Parametern von Input.
Infos über das Netzwerk werd an runQuery() übergeben, das die Abfrage
durchführt.
Der zurückgegebene String wird ausgegeben.

Input.java:
Die Überprüfung der Eingabe erfolgt gemäß den Angaben in der
Spezifikation (s.u.)

Network.java:
In buildNetwork() wird je nach Angabe ein entsprechender Rechner
im Netzwerk erzeugt und mit dem vorhergehenden verknüpft. Dabei
wird die Liste der Knoten von hinten durchlaufen (damit der zu
verknüpfende Rechner schon existiert).
Außerdem durchläuft das Paket vom ersten Knoten an das Netzwerk,
bis es seinen Absender gefunden hat.

runQuery() unterscheidet die verschiedenen Abfragetypen und
ruft dementsprechend eigene Methoden zur Bearbeitung auf.
Allgemein wird in diesen Methoden das Paket ausgehend vom Sender
entsprechend viele Zeitschritte durch das Netzwerk geschickt und
dann der Inhalt des Pakets oder die Zeit bis zur Bearbeitung
ausgegeben.

Da sich die p- bzw. s-Abfrage kaum unterscheiden, wurden sie
in einer Funktion zusammengefasst. Selbiges könnte man auch mit den
Klassen Printserver und Fileserver machen, das widerspräche aber
der Spezifikation.

Node.java:
Printserver, Workstation und Fileserver basieren auf dem Knoten.
Wenn er ein Paket empfängt, geschieht nichts damit.
Der Konstruktor des Knotens wird auch von den Unterklassen verwendet.

Printserver.java/Fileserver.java:
Wenn sie ein Paket empfangen, das für sie bestimmt ist, verarbeiten
sie es, indem sie es drucken oder speichern (sprich den Inhalt des
Pakets verändern).

Workstation.java:
Die Workstation sendet ein Paket los und entfernt es, wenn es nach
einem Durchlauf im Netzwerk keinen Empfänger gefunden hat.


====================================================================
Spezifikation

4100 netzwerk Token Ring Netzwerk 


Kurzbeschreibung:
Ein Token Ring Netzwerk soll modelliert werden. Informationspakete werden in diesem Netzwerk an einen Zielrechner weitergeleitet und verarbeitet. 

Aufgabenstellung:
In einem einfachen LAN (Local Area Network) können vier Arten von Geräte vorkommen: Workstations, Drucker (Printserver), Fileserver und Knoten (Node), die Informationspakete (Packet) senden und empfangen. Alle Geräte sind untereinander als Token-Ring (kreisförmig) verschaltet. 
Dieses Netzwerk soll durch ein Java-Programm modelliert werden. Im einzelnen soll gelten:

Jedes Gerät des Netzwerkes kann erzeugt werden: Ihm kann ein Name und ein Nachfolger zugeordnet werden, sodaß alle Geräte im Netz einen Kreis bilden.

Pakete können erzeugt werden: Ihnen kann als Sender bzw. Empfängeradresse der Name eines Gerätes im Netzwerk zugewiesen werden sowie ein (geeigneter) Inhalt.

Ein Knoten (K) sendet empfangene Pakete im nächsten Zeitschritt lediglich weiter.

Eine Workstation (W) verhält sich wie ein Knoten, kann jedoch zusätzlich neue Pakete erzeugen und in das Netz einspeisen, indem sie das Paket im nächsten Zeitschritt ihrem Nachfolger sendet. Ein Paket, welches einmal vollständig im Netz rotiert ist (kein Adressat gefunden), wird von dieser Workstation sofort beim Empfang entfernt.

Ein Fileserver (F) verhält sich wie ein Knoten, außer er empfängt ein Paket, dessen Adressat er ist. In diesem Fall speichert der Fileserver den Inhalt des Pakets (in einer Datei) im nächsten Zeitschritt.

Ein Printserver (P) verhält sich wie ein Knoten, außer er empfängt ein Paket, dessen Adressat er ist. In diesem Fall verarbeitet er den Inhalt des Pakets im nächsten Zeitschritt. 
Implementieren Sie die Klassen: Packet, Node, Workstation, Fileserver und Printserver. 

Das zu modellierende Token Ring Netzwerk muß aus mindestens 3 Knoten (Nodes, Fileserver, Printserver oder Workstation) bestehen. Zumindest einer der Knoten muß eine Workstation sein, an dieser wird die Nachricht in das Netzwerk zum Zeitpunkt 0 erzeugt und im nächsten Schritt weitergeleitet. (zum Zeitpunkt 2 befindet sich dieses Paket dann im darauffolgenden Knoten.) 

Die Aufgabe besteht nun darin, ein in diesem Netzwerk rotierendes Paket zu beobachten bzw. den Zustand des Netzwerkes abzufragen. Der Aufbau des Netzwerkes wird in den Eingabedaten beschrieben, desweiteren wird angenommen das n diskrete Zeitschritte bereits vergangen sind. Folgende Abfragen sollen möglich sein: 

w - where: gibt den Namen des Knoten aus, an dem sich das Paket gerade befindet, "FINISHED" falls es von dem adressierten Print/Fileserver bereits verarbeitet wurde, "INVALID" falls es von der sendenden Workstation entfernt wurde. 

p - printed: gibt die Anzahl der Zeitschritte bis zur Verarbeitung des Packetes an dem adressierten Printserver aus, 0 falls es bereits verarbeitet wurde bzw. die negierte Anzahl der Zeitschritte bis zum Eintreffen des Packetes an der sendenden Workstation. 

s - stored: gibt die Anzahl der Zeitschritte bis zum Abspeichern des Packetes an dem adressierten Fileserver aus, 0 falls es bereits gespeichert wurde bzw. die negierte Anzahl der Zeitschritte bis zum Eintreffen des Packetes an der sendenden Workstation. 

q,Rechnername - query: gibt den Inhalt des Packets am angeführten Rechner aus, ansonsten "EMPTY". 

Eingabedaten:
Lesen Sie einen String ein, der aus Knoten, Packet, Zeit, und Abfrage, jeweils durch ein Leerzeichen getrennt, besteht.
Ein Knoten besteht aus einem Typ (K,W,F,P) gefolgt von dem Rechnername. Der Rechnername muß zwischen 3 und 10 Zeichen lang sein (inklusive) und mit einem Großbuchstaben beginnen. Mehrere Knoten sind durch "," getrennt, die Anzahl der Knoten liegt wiederum zwischen 3 und 10 (inklusive). Ein Knoten des Netzwerkes muß vom Typ Workstation sein. Die Reihenfolge der Knoten im Netzwerk ist durch die Reihenfolge im String bereits vorgegeben, vergessen Sie aber nicht daß es sich bei dem Netzwerkmodell um eine Ringstruktur handelt.

Eine Packet besteht aus zwei Rechnernamen (Sender, Empfänger) und dem Inhalt. Der Rechnername des Senders muß existieren und vom Typ Workstation sein. Die Läge des Inhaltes liegt zwischen 1 und 10 Zeichen (inklusive), es besteht nur aus Groß und Kleinbuchstaben. (keine Leerzeichen, Sonderzeichen, Zahlen). Um das Modell zu vereinfachen enthalten die Eingabedatensätze nur ein einziges Paket.

Die Zeitangabe kann zwischen 1 und der Knotenanzahl+1 liegen, diese soll die Anzahl der vergangenen Zeitschritte seit der Erzeugung des Pakets darstellen. Da bei der Simulation mit diskreten Zeitschritten gearbeitet wird muß diese ganzahlig sein. Wählen Sie dazu selbst einen geeigneten Datentyp aus.

Eine Abfrage muß aus einem der vorher beschriebenen 4 Befehlen w,p,s oder q (gegebenenfalls mit Angabe des Rechnernamens nach einem Komma) bestehen. 

Ausgabedaten:

Bei korrekten Eingabesätzen soll Ihr Programm die in der Abfrage geforderten Berechnungen durchführen und das Ergebnis ausgeben. Geben Sie am Ende einen Zeilenvorschub aus. 
Fehlerbehandlung:
Generell wird bei fehlerhaften Eingabedatensätzen nur eine einzige Fehlermeldung erzeugt, weitere Berechnungen werden nicht mehr durchgeführt. 
Enthält der Eingabedatensatz einen ungültigen Datentyp, so soll einmal das Zeichen "?", gefolgt von einem Zeilenvorschub, ausgegeben werden. 
Wenn der Eingabestring nicht den Bedingungen genügt, so soll Ihr Programm die Fehlermeldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.