From bbccf49e3e8d05c73789672be62a3cf9e549b099 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 9 Aug 2008 01:08:47 +0000 Subject: written a lot --- LaTeX/chapters/implementierung.tex | 132 +- LaTeX/chapters/simulator.tex | 1 - LaTeX/diplomarbeit.pdf | 5784 +++++++++++++++-------------- LaTeX/images/ss-protokollvariablen.png | Bin 0 -> 27355 bytes ROADMAP | 3 +- sources/prefs/VSDefaultPrefs.java | 2 +- sources/protocols/VSAbstractProtocol.java | 2 +- 7 files changed, 3175 insertions(+), 2749 deletions(-) create mode 100644 LaTeX/images/ss-protokollvariablen.png diff --git a/LaTeX/chapters/implementierung.tex b/LaTeX/chapters/implementierung.tex index 8b3b8a8..25dd82e 100644 --- a/LaTeX/chapters/implementierung.tex +++ b/LaTeX/chapters/implementierung.tex @@ -131,6 +131,7 @@ Die Klasse \textit{VSSimulatorEditor} dient f\"{u}r das Editieren der globalen S F\"{u}r Protokolle gibt es keine separate Editor-Klasse, da sie bereits vom Prozesseditor aus editiert werden k\"{o}nnen. Dabei iteriert der Prozesseditor \"{u}ber alle f\"{u}r den jeweiligen Prozess verf\"{u}gbaren Protokollobjekte und f\"{u}gt deren Variablen zus\"{a}tzlich in den Prozesseditor ein. Somit erscheinen die Prozess- und die dazugeh\"{o}rigen Protokollvariablen im selben Editor, womit dem Benutzer eine bessere \"{U}bersicht geboten wird. +\newpage \section{Ereignisse} \subsection{Funktionsweise von Ereignissen} @@ -184,7 +185,7 @@ Des Weiteren werden folgende nicht-abstrakte Methoden von \textit{VSAbstractEven Jede Ereiginsklasse hat zudem Zugriff auf folgende Attribute, die von \textit{VSAbstractEvent} vererbt werden: \begin{itemize} - \item \textit{protected VSPrefs prefs}: Eine Referenz auf das Simulationseinstellungsobjekt. Hier\"{u}ber lassen sich alle Simulationseinstellungen beziehen. \textit{prefs} ist nicht zu verwechseln mit den TODO + \item \textit{protected VSPrefs prefs}: Eine Referenz auf das Simulationseinstellungsobjekt. Hier\"{u}ber lassen sich alle Simulationseinstellungen beziehen. \item \textit{protected VSAbstractProcess process}: Eine Referenz auf das Prozessobjekt des jeweiligen Prozesses, auf welches das Ereignis angewendet wird. \end{itemize} @@ -202,18 +203,19 @@ extends VSAbstractEvent implements VSCopyableEvent { } public void onInit() { - setClassname(getClass().toString()); + super.setClassname(super.getClass().toString()); } public void onStart() { if (!process.isCrashed()) { process.isCrashed(true); - logg(prefs.getString("lang.crashed")); + super.logg(prefs.getString("lang.crashed")); } } } \end{code} +\newpage \section{Zeitformate, Prozesse, Nachrichten sowie Task-Manager} \subsection{Funktionsweise} @@ -270,6 +272,7 @@ void createCrashAndRecoverExample(VSTaskManager taskManager, In diesem Beispiel wurden zwei Ereignisse (Absturz- und Wiederbelebung eines gegebenen Prozesses) angelegt. Das Absturzereignis tritt bei der aktuellen lokalen Prozesszeit plus \textit{500ms} ein, w\"{a}hrend das Wiederbelebungsereignis bei einer globalen Zeit von \textit{2000ms} stattfindet. F\"{u}r den Fall, dass das Wiederbelebungsereignis vor dem Absturzereignis eintritt wird es nicht ausgef\"{u}hrt, da der Prozess noch nicht abgest\"{u}rzt ist. +\newpage \section{Protokolle} \subsection{Funktionsweise des Protokoll-APIs} @@ -281,11 +284,21 @@ In diesem Beispiel wurden zwei Ereignisse (Absturz- und Wiederbelebung eines geg \label{fig:PackageProtocols} \end{figure} -In diesem Abschnitt wird auf die Implementierung der Protokolle eingegangen. Auf Abbildung \ref{fig:PackageProtocols} sind die Pakete \textit{protocols} und \textit{protocols.implementations} dargestellt, welche f\"{u}r die Protokollimplementierungen zust\"{a}ndig sind. \textit{VSAbstractProtocol} stellt lediglich gemeinsame Methoden und Attribute zur Verf\"{u}gung, die von allen Protokollen verwendet werden k\"{o}nnen. Jedes Protokoll hat im Paket \textit{protocols.implementations} seine eigene Klasse, die von \textit{VSAbstractProtocol} erbt. Wie bereits erw\"{a}hnt erbt \textit{VSAbstractProtocol} von \textit{VSAbstractEvent}, sodass jedes Protokoll auch als Ereignis (Server- beziehnungsweise Clientanfrage starten) eingesetzt werden kann. +In diesem Abschnitt wird auf die Implementierung der Protokolle eingegangen. Auf Abbildung \ref{fig:PackageProtocols} sind die Pakete \textit{protocols} und \textit{protocols.implementations} dargestellt, welche f\"{u}r die Protokollimplementierungen zust\"{a}ndig sind. \textit{VSAbstractProtocol} stellt lediglich gemeinsame Methoden und Attribute zur Verf\"{u}gung, die von allen Protokollen verwendet werden k\"{o}nnen. Jedes Protokoll hat im Paket \textit{protocols.implementations} seine eigene Klasse, die von \textit{VSAbstractProtocol} erbt. Im Prinzip besitzt jedes Prozessobjekt von jedem Protokoll seine eigene Instanz. Bei \textit{10} Protokollen und \textit{3} beteiligten Prozessen werden also \textit{30} Protokollobjekte verwendet. Jedes Protokollobjekt verwaltet sowohl die Server- als auch die Clientseite eines Protokolls auf einmal. Dabei merkt sich \textit{VSAbstractProtocol} anhand eines Flags ob der aktuelle Kontext server- oder clientbezogen ist und f\"{u}hrt dementsprechen beim Eintreffen von Ereignissen die Server- beziehungsweise Clientmethoden des Protokolls auf. \textit{VSAbstractProtocol} \"{u}berpr\"{u}ft auch, ob Client oder Server \"{u}berhaupt aktiviert ist. Nur wenn der Server oder Client aktiviert ist, reagiert der Server beziehungsweise der Cleint wenn f\"{u}r sie ein Ereignis eintritt. -Jede Protokollklasse mu die folgenden Methoden implementieren: +\begin{figure}[h] + \centering + \includegraphics[width=10cm]{images/ss-protokollvariablen} + \caption{Protokollvariablen im Prozesseditor} + \label{fig:Protokollvariablen} +\end{figure} + +Es ist bereits bekannt, dass Protokolle auch eigene vom Anwender im Prozesseditor editierbare Variablen haben k\"{o}nnen. Da \textit{VSAbstractProtocol} von \textit{VSAbstractEvent} erbt, was wiederum von \textit{VSPrefs} erbt, werden alle Protokollvariablen einfach in die Mutterklasse \textit{VSPrefs} abgelegt. Zum Beispiel kann mit \textit{super.setBoolean(``test'', true);} eine neue Protokollvariable ``true'' angelegt werden. Anhand eines sp\"{a}teren Beispiels wird dies noch weiter verdeutlicht. + +Da der Simulator daf\"{u}r ausgelegt wurde eigene Protokolle zu implementieren, werden im Folgenden alle verf\"{u}gbaren Protokoll-API-Methoden etwas ausf\"{u}hrlicher als gewohnt beschrieben. Jede Protokollklasse mu die folgenden Methoden implementieren: \begin{itemize} + \setlength{\itemsep}{-2mm} \item Einen \"{o}ffentlichen (\textit{public}) Konstruktor. Der Konstruktor mu angeben, ob bei dem gegebene Protokoll der Client oder der Server die Anfragen startet. \item \textit{abstract public void onClientInit()}: Bevor das Protokollobjekt benutzt werden kann, mu es initialisiert werden. Diese Methode wird vor dem ersten Verwenden des Protokolls innerhalb einer Simulation ausgef\"{u}hrt. In der Regel werden hier Protokollvariablen unter Verwendung von \textit{VSPrefs} und Attribute der Protokollklasse initialisiert. Die hier initialisierten Protokollvariablen lassen sich vom Benutzer im Prozesseditor des jeweiligen Prozesses editieren. \item \textit{abstract public void onClientReset()}: Dese Methode wird jedes Mal ausgef\"{u}hrt, wenn die Simulation zur\"{u}ckgesetzt wird. @@ -295,13 +308,76 @@ Jede Protokollklasse mu \item \textit{public String toString()}: Diese Methode ist nur optional. Hiermit lassen sich die Loggnachrichten eines Protokolls anpassen. Wenn diese Methode in einer Protokollimplementierung ausgelassen wird, so wird stets die \textit{toString}-Methode der Mutterklasse \textit{VSAbstractProtocol} verwendet. \end{itemize} -F\"{u}r alle hier aufgelisteten Client-Methoden sind auch die korespondierenen Server-Methoden anzugeben. Die Server-Methoden sind analog zu den Client-Methoden aufgebaut. +F\"{u}r alle hier aufgelisteten Client-Methoden sind auch die korespondierenen Server-Methoden anzugeben. Die Server-Methoden sind analog zu den Client-Methoden aufgebaut, wobei lediglich \textit{Client} durch \textit{Server} ausgetauscht werden mu. + +Jede Protokollklasse bekommt folgende Methoden von \textit{VSAbstractProtocol} vererbt, welche allesamt vom Protokollentwickler verwendet werden k\"{o}nnen: + +\begin{itemize} + \setlength{\itemsep}{-2mm} + \item \textit{pubic void sendMessage(VSMessage message)}: Hiermit verchickt das Protokoll eine Nachricht. + \item \textit{pubic final boolean hasOnServerStart()}: Hiermit l\"{a}t sich bestimmen, ob der Server- oder der Client bei dem aktuellen Protokoll die Anfragen startet. + \item \textit{pubic final boolean isServer()}: Hiermit l\"{a}t sich bestimmen, ob der aktuelle Prozess das aktuelle Protokoll serverseitig aktiviert hat. + \item \textit{pubic final boolean isClient()}: Hiermit l\"{a}t sich bestimmen, ob der aktuelle Prozess das aktuelle Protokoll clientseitig aktiviert hat. + \item \textit{pubic final void scheduleAt(long time)}: Diese Methode stellt einen Wecker, der zur angegebenen lokalen Prozesszeit eintritt. Nach Ablauf des Weckers wird, abh\"{a}ngig ob der aktuelle Kontext Client- oder Serverseitig ist, \textit{onClientSchedue} beziehungsweise \textit{onServerSchedule} ausgef\"{u}hrt. + \item \textit{pubic final void removeSchedules()}: Entfernt alle gesetzten Wecker des aktuellen Kontextes (Server oder Client). + \item \textit{pubic final int getNumProcesses()}: Gibt die Anzahl an der Simulation beteiligten Prozesse zur\"{u}ck. +\end{itemize} + +Bei der Implementierung von Protokollen k\"{o}nnen zus\"{a}tzlich auf die vererbten Attribute \textit{VSAbstractProcess process} und \textit{VSPrefs prefs} zugegriffen werden. Verf\"{u}gbare Methoden von \textit{VSPrefs} wurden bereits behandelt. \"{U}ber \textit{prefs} lassen sich alle globalen Simulationseinstellungen abrufen (zum Beispiel die Simulationsvariable die Angibt, ob Prozesse eigene nachrichten empfangen: \textit{bool foo = prefs.getBoolean(``sim.message.own.recv'')}). Folgende Prozessmethoden d\"{u}rfen auf \textit{process} aus dem Protokoll-API verwendet werden: + +\begin{itemize} + \setlength{\itemsep}{-2mm} + \item \textit{public float getClockVariance()}: Gibt die Uhrabweichung zur\"{u}ck. + \item \textit{public void setClockVariance(float clockVariance)}: Setzt die Uhrabweichung des Prozesses. + \item \textit{public long getGlobalTime()}: Gibt die aktuelle globale Simulationszeit zur\"{u}ck. + \item \textit{public long getTime()}: Gibt die aktuelle lokale Prozesszeit zur\"{u}ck. + \item \textit{public void setTime(long time)}: Setzt die aktuelle lokale Prozesszeit. + \item \textit{public long getLamportTime()}: Gibt die aktuelle Lamportzeit des Prozesses zur\"{u}ck. + \item \textit{public void setLamportTime(long lamportTime)}: Setzt die aktuelle Lamportzeit des Prozesses. + \item \textit{public void increaseLamportTime()}: Inkrementiert die Lamportzeit um eins. + \item \textit{public void updateLamportTime(long lamportTime)}: Erneuert die Lamportzeit. Siehe Kapitel 2.6.1 wie die Lamportzeiten erneuert werden. + \item \textit{public VSVectorTime getVectorTime()}: Gibt die aktuelle Vektor-Zeit des Prozesses zur\"{u}ck. + \item \textit{public VSTime[] getLamportTimeArray()}: Gibt die gesamte Lamportzeitstempelhistorie des Prozesses zur\"{u}ck. Kann jeweils nach VSLamportTime gecastet werden. + \item \textit{public VSTime getVectorTimeArray()}: Gibt die gesamte Vektor-Zeitstempelhistorie des Prozesses zur\"{u}ck. Kann jeweils nach VSVectorTime gecastet werden. + \item \textit{public void updateVectorTime(VSVectorTime vectorTimeUpdate)}: Erneuert die Vektorzeit. Siehe Kapitel 2.6.1 wie die Vektorzeiten erneuert werden. + \item \textit{public void increaseVectorTime()}: Inkrementiert die Vektorzeit an lokalem Index um eins. + \item \textit{public int getProcessID()}: Gibt die PID zur\"{u}ck. + \item \textit{public void setProcessID(int processID)}: Setz die PID. + \item \textit{public int getProcessNum()}: Gibt die Prozessnummer zur\"{u}ck. Dieser Wert unterscheidet sich von der PID. Die Prozessnummer gibt an, um den wievielten Prozess, beginnend bei 0, es sich handelt. + \item \textit{public int getRandomPercentage()}: Gibt einen Zufallswert zwischen \textit{0} und \textit{100} zur\"{u}ck. + \item \textit{public boolean hasCrashed()}: Gibt \textit{true} zur\"{u}ck, wenn der Prozess w\"{a}hrend der aktuellen Simulation schonmal abgest\"{u}rzt ist. + \item \textit{public boolean isCrashed()}: Gibt \textit{true} zur\"{u}ck, wenn der Prozess aktuell abgest\"{u}rzt ist. + \item \textit{public void isCrashed(boolean isCrashed)}: Hiermit kann man den Prozess abst\"{u}rzen (\textit{isCrashed = true}) und wiederbeleben (\textit{isCrashed = false}) lassen. +\end{itemize} + +In der Regel werden in Protokollen auch Nachrichten (\textit{VSMessage}) verschickt. Folgende Methoden d\"{u}rfen davon im Protokoll-API verwendet werden: + +\begin{itemize} + \setlength{\itemsep}{-2mm} + \item \textit{public VSMessage()}: Der Standardkonstruktor f\"{u}r die Erstellung einer neuen Nachricht. + \item \textit{public String getProtocolClassname()}: Gibt den Klassennamen des zur Nachricht dazugeh\"{o}rigen Protokolls zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten. + \item \textit{public int getmessageID()}: Gibt die Nachrichten-ID zur\"{u}ck. + \item \textit{public boolean equals(VSMessage message)}: Hiermit l\"{a}t sich \"{u}berpr\"{u}fen, ob eine gegebene Nachricht die selbe Nachrichten-ID besitzt (es sich um die selbe Nachricht handelt). +\end{itemize} + +Folgende weitere Methoden von \textit{VSMessage} k\"{o}nnen bei Erhalt einer Nachricht verwendet werden: + +\begin{itemize} + \setlength{\itemsep}{-2mm} + \item \textit{public String getName()}: Gibt den Namen des zur Nachricht dazugeh\"{o}rigen Protokolls zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig. + \item \textit{public String getProtocolClassname()}: Gibt den Klassennamen des zur Nachricht dazugeh\"{o}rigen Protokolls zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig. + \item \textit{public VSInternalProcess getSendingProcess()}: Gibt eine Referenz auf den Senderprozess zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig. + \item \textit{public long getLamportTime()}: Gibt die Lamportzeit des Senderprozesses zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig. + \item \textit{public boolean isServerMessage()}: Hiermit l\"{a}t sich entscheiden, ob es sich um eine Server- oder eine Clientnachricht handelt. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig. +\end{itemize} + +Wenn \"{u}ber eine Nachricht Daten verschickt werden sollen, so werden die von \textit{VSPrefs} vererben Methoden verwendet. \subsection{Beispielimplementierung eines Protokolls} Im Folgenden wird die Implementierung des zuverl\"{a}ssigen Multicast-Protokolls \textit{VSReliableMulticastProtocol.java} als Beispiel aufgef\"{u}hrt. Die Funktionsweise des Protokolls wurde bereits in Kapitel 2.5.10 beschrieben. Client- und Serverseite werden in der selben Klasse implementiert. -Im Konstruktor mu stets angegeben werden, ob beim gegebenen Protokoll der Client oder der Server die Anfragen startet. Mit \textit{HAS\_ON\_CLIENT\_START} wird dem API mitgeteilt, dass der Client die Anfragen startet. F\"{u}r \textit{HAS\_ON\_SERVER\_START} und Serveranfragen gilt Selbiges analog: +Im Konstruktor mu stets angegeben werden, ob beim gegebenen Protokoll der Client oder der Server die Anfragen startet. Mit \textit{HAS\_ON\_CLIENT\_START} wird dem API mitgeteilt, dass der Client die Anfragen startet. F\"{u}r \textit{HAS\_ON\_SERVER\_START} und Serveranfragen gilt Selbiges analog. Da ein Protokoll auch ein \textit{VSAbstractEvent} ist, muss auch hier im Konstruktor mit \textit{setClassname} der Klassenname des aktuellen Protokolls angegeben werden: \begin{code} package protocols.implementations; @@ -315,22 +391,23 @@ public class VSReliableMulticastProtocol extends VSAbstractProtocol { public VSReliableMulticastProtocol() { super(VSAbstractProtocol.HAS_ON_CLIENT_START); - setClassname(getClass().toString()); + super.setClassname(super.getClass().toString()); } \end{code} \subsubsection{Clientseite des Protokolls} -Das private Klassenattribut \textit{pids} wird f\"{u}r die Zwischenspeicherung beteiligter PIDs ben\"{o}tigt. Hier sind alle PIDs abgelegt, von denen noch Best\"{a}tigungsnachrichten erwartet werden. Hier werden als Standard-PIDs \textit{1} und \textit{3} verwendet. Die Methoden \textit{initVector} und \textit{initLong} wurden von \textit{VSPrefs} vererbt und initialisieren die Protokollvariablen \textit{pids} und \textit{timeout}, welche vom Benutzer im Prozesseditor editiert werden k\"{o}nnen: +Das private Klassenattribut \textit{pids} wird f\"{u}r die Zwischenspeicherung beteiligter PIDs ben\"{o}tigt. Hier sind alle PIDs abgelegt, von denen noch Best\"{a}tigungsnachrichten erwartet werden. Hier werden als Standard-PIDs \textit{1} und \textit{3} verwendet. Die Methoden \textit{initVector} und \textit{initLong} wurden von \textit{VSPrefs} vererbt und initialisieren die Protokollvariablen \textit{pids} und \textit{timeout}, welche vom Benutzer im Prozesseditor editiert werden k\"{o}nnen (siehe Abbildung \ref{fig:Protokollvariablen} unter ``Reliable Multicast Client'' ganz unten): \begin{code} private ArrayList pids; public void onClientInit() { Vector vec = new Vector(); vec.add(1); vec.add(3); - initVector("pids", vec, "PIDs beteilitger Prozesse"); - initLong("timeout", 2500, - "Zeit bis erneute Anfrage", "ms"); + super.initVector("pids", vec, + "PIDs beteilitger Prozesse"); + super.initLong("timeout", 2500, + "Zeit bis erneute Anfrage", "ms"); } \end{code} @@ -338,7 +415,7 @@ Wenn die Simulation zur\"{u}ckgesetzt wird, dann wird auch \textit{pids} reiniti \begin{code} public void onClientReset() { pids.clear(); - pids.addAll(getVector("pids")); + pids.addAll(super.getVector("pids")); } \end{code} @@ -346,12 +423,13 @@ In \textit{onClientStart} wird gepr\"{u}ft, ob eine Clientanfrage gestartet werd \begin{code} public void onClientStart() { if (pids.size() != 0) { - long timeout = getLong("timeout") + process.getTime(); - scheduleAt(timeout); + long timeout = super.getLong("timeout") + + process.getTime(); + super.scheduleAt(timeout); VSMessage message = new VSMessage(); message.setBoolean("isMulticast", true); - sendMessage(message); + super.sendMessage(message); } } \end{code} @@ -368,13 +446,13 @@ Wenn eine Serverantwort eintrifft, dann wird \textit{onClientRecv} aufgerufen. H else return; - logg("ACK von Prozess " + pid + " erhalten!"); + super.logg("ACK von Prozess " + pid + " erhalten!"); if (pids.size() == 0) { - logg("ACKs von allen beteiligten Prozessen " + - "erhalten!"); + super.logg("ACKs von allen beteiligten " + + " Prozessen erhalten!"); - removeSchedules(); + super.removeSchedules(); } } } @@ -407,12 +485,12 @@ Wenn der Server eine Clientanfrage erhalten hat, so \"{u}berpr\"{u}ft der Server VSMessage message = new VSMessage(); message.setBoolean("isAck", true); message.setInteger("pid", process.getProcessID()); - sendMessage(message); + super.sendMessage(message); if (ackSent) { - logg("ACK erneut versendet"); + super.logg("ACK erneut versendet"); } else { - logg("ACK versendet"); + super.logg("ACK versendet"); ackSent = true; } } @@ -444,6 +522,7 @@ registerEvent("protocols.implementations.VSMyProtocol", \item Mit dem Befehl \textit{ant dist} das Archiv \textit{dist/lib/VS-Sim-Latest.jar} erstellen und verwenden. \end{enumerate} +\newpage \section{GUI sowie Simulationsvisualisierung} Das Paket \textit{simulator} (vereinfacht auf Abbildung \ref{fig:PackageProtocols} dargestellt) implementiert die eigentliche graphische Benutzeroberf\"{a}che des Simulators. Ausnahmen sind die Editorklassen in \textit{prefs.editors} sowie \textit{utils.VSFrame}. @@ -455,9 +534,9 @@ Das Paket \textit{simulator} (vereinfacht auf Abbildung \ref{fig:PackageProtocol \label{fig:PackageProtocols} \end{figure} -Beim Starten des Simulators wird auf die Main-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instanziiert ein \textit{VSDefaultPrefs}-Objekt, wo alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (wie bereits schon auf Abbildung \ref{fig:NeuesFenster} zu sehen war) implementiert. Das Simulatorfenster erstellt f\"{u}r jede neue Simulation jeweils ein Objekt von \textit{VSSimulator}. Jede Simulation hat im Simulationsfenster einen eigenen Tab. Auf Abbildung \ref{fig:NeuErstellteSimulation} wurde bereits eine neue Simulation erstellt, wo auch unten links der dazugeh\"{o}rige Tab mit der Beschriftung ``Simulator 1'' zu sehen ist. Jede Simulation besitzt eine eigene Simulationsnummer, die bei jeder neuen Simulation um eins inkrementiert wird. Jedes \textit{VSSimulator}-Objekt greift auf \textit{VSSimulatorVisualization} zur\"{u}ck, was die Simulationsvisualisierung (Abbildung \ref{fig:Visualisierung}) implementiert. +Beim Starten des Simulators wird auf die Main-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instanziiert ein \textit{VSDefaultPrefs}-Objekt, wo alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (wie bereits schon auf Abbildung \ref{fig:NeuesFenster} zu sehen war) implementiert. Das Simulatorfenster erstellt f\"{u}r jede neue Simulation jeweils ein Objekt von \textit{VSSimulator}. Jede Simulation hat im Simulationsfenster einen eigenen Tab. Auf Abbildung \ref{fig:NeuErstellteSimulation} wurde bereits eine neue Simulation erstellt, wo auch unten links der dazugeh\"{o}rige Tab mit der Beschriftung ``Simulator 1'' zu sehen ist. Jede Simulation besitzt dabei eine eigene Simulationsnummer, die bei jeder neuen Simulation um eins inkrementiert wird. Jedes \textit{VSSimulator}-Objekt greift auf \textit{VSSimulatorVisualization} zur\"{u}ck, was die Simulationsvisualisierung (Abbildung \ref{fig:Visualisierung}) implementiert. -\textit{VSSimulatorVisualization} ist bei Weitem die kryptischste Klasse des Simulators. Die greift auf die Java2D-Grafikbibliothek zur\"{u}ck und ist aus Performancegr\"{u}nden mit dem Simulationsverlauf stark verzahnt. Variablen, die stets den selbe Wert haben, wurden stets als finale Variablen angelegt. Variablen, die von Konfigurationen oder Einstellungen abh\"{a}ngig sind, die sich nur nach Konfigurations\"{a}nderung oder Vergr\"{o}ern beziehungsweise Verkleinern des Simulationsfensters \"{a}ndern, werden nur wenn es n\"{o}tig ist neuberechnet. +\textit{VSSimulatorVisualization} ist bei Weitem die kryptischste Klasse des Simulators. Die greift auf die Java2D-Grafikbibliothek zur\"{u}ck und ist aus Performancegr\"{u}nden mit dem Simulationsverlauf stark verzahnt. Variablen, die stets den selbe Wert haben, wurden stets als finale Variablen angelegt. Variablen, die von Konfigurationen oder Einstellungen abh\"{a}ngig sind, die sich nur nach Konfigurations\"{a}nderung oder Vergr\"{o}ern beziehungsweise Verkleinern des Simulationsfensters \"{a}ndern, werden nur wenn es n\"{o}tig ist neu berechnet. Die Klasse \textit{VSMenuItemStates} wird f\"{u}r die Synchronisierung des Simulationsstatusses, der Toolbar und des Simulations-Men\"{u}s (beide Letztere auf Abbildung \ref{fig:Toolbar} zu sehen) verwendet. Damit ist gemeint, ob die Simulation bereits gestartet wurde oder nicht oder gegebenenfalls schon abgelaufen ist. Oder ob die Simulation sich in einem pausierten Status befindet. Abh\"{a}ngig davon kann der Benutzer bestimmte Aktionen durchf\"{u}hren oder nicht (beispielsweise kann eine Simulation nur pausiert werden, wenn sie aktuell abgespielt wird). Alle hier m\"{o}glichen Aktionen wurden bereits in Kapitel 2.1 im Abschnitt ``Die Toolbar'' behandelt. @@ -465,12 +544,14 @@ Die klasse \textit{VSCreateTask} wird vom Ereigniseditor verwendet. Der Ereignis \textit{VSLogging} kapselt ein \textit{javax.swing.JTextArea}-Objekt, wo alle Nachrichten geloggt werden. Hier werden alle Loggfunktionen (inklusive Loggfilter sowie tempor\"{a}re Deaktivierung des Loggen) implementiert. Die \textit{JTextArea} wird dem \textit{VSSimulator}-Objekt \"{u}bergeben und dort dargestellt. +\newpage \section{Serialisierung von Simulationen} Der Anwender kann eine erstellte Simulation im Datei-Men\"{u} speichern und/oder eine bereits abgespeicherte Simulation laden. \subsubsection{R\"{u}ckw\"{a}rtskompatibel} +\newpage \section{Helferklassen und Klassen f\"{u}r Ausnahmebehandlungen} Es wurden noch nicht die Klassen der Pakete \textit{utils} (Abbildung \ref{fig:PackageUtils}) sowie \textit{exceptions} (Abbildung \ref{fig:PackageExceptions}) vorgestellt. \textit{utils} fasst lediglich einige Helferklassen zusammen, die vom restlichen Quelltext verwendet werden. @@ -502,6 +583,7 @@ Es wurden noch nicht die Klassen der Pakete \textit{utils} (Abbildung \ref{fig:P Im Paket \textit{exceptions} befinden sich lediglich einige eigene Objekte f\"{u}r Ausnahmebehandlungen. \textit{VSNotCopyableException} wird von einem nicht-kopierbaren Ereignis geworfen, wenn versucht wird es zu kopieren. \textit{VSNegatieNumberException} wird geworfen, wenn intern negative Zahlen dort auftreten, wo sie es nicht sollten. Wenn ein Editorobjekt die Benutzereingabe einer Integer-Vektor-Variable nicht parsen kann, so greifen es auf \textit{VSParseIntegerVectorException} zur\"{u}ck. +\newpage \section{Entwicklungsumgebung} In diesem Teilkapitel soll ein kleiner Einblick in die Umgebung, in der der Simulator entwickelt wurde, gew\"{a}hrt werden. F\"{u}r diese Diplomarbeit wurde ausschlielich Open Source Software verwendet. Die einzige Ausnahme stellt Microsoft Windows XP dar, worauf der Simulator zus\"{a}tzlich getestet wurde. Der Simulator wurde jedoch haupts\"{a}chlich unter dem Betriebssystem FreeBSD 7.0, was ein open source Unix-Derivat ist, programmiert. diff --git a/LaTeX/chapters/simulator.tex b/LaTeX/chapters/simulator.tex index 5596b53..c1c6c8d 100644 --- a/LaTeX/chapters/simulator.tex +++ b/LaTeX/chapters/simulator.tex @@ -257,7 +257,6 @@ In diesem Abschnitt wird genauer auf die m\"{o}glichen Konfigurationsm\"{o}glich \begin{figure}[h] \centering \fbox{\includegraphics{images/ss-simulationseinstellungen}} - %\fbox{\includegraphics[width=11cm]{images/ss-simulationseinstellungen}} \caption{Das Fenster zu den Simulationseinstellungen} \label{fig:Simulationseinstellungen} \end{figure} diff --git a/LaTeX/diplomarbeit.pdf b/LaTeX/diplomarbeit.pdf index b51e803..89967aa 100644 --- a/LaTeX/diplomarbeit.pdf +++ b/LaTeX/diplomarbeit.pdf @@ -297,7 +297,7 @@ endobj stream xڍUMs6W(͔ͮWvҦZD#.d%`xb$)b:KV #[ܻ@RSŅ[[ܼ|GUbĘhrN2k΄42쳘ؗ pvX79,@n yɈyQ2@Ŵ`dQaձ+y9$Ùfj _/'oqMR \Sokzxb9{k<ũT\P +EpM髮,lyΫ\m4m~\dyr̲i]0u9"+F ι>wyW 7Ve{'} n4~' ,T$Z%UԭoVH!/"4`( %Ҙ给b|UhWEKZ^ gZR@!~r1d*RvXʧhu,L!q5Dk;N(̞+ -ŨF&qeXd˩ʝgZN p.ͩ2):os>0]e{JK|hF"{gj,wy*fxIϫ608J|-_`_K_!sPӱ bk{>>3(~Zuh엗qDh\P@4w1ωuȷgH%Աf`.O{F,s>`ϮbtEEiOԡӀpFu<|9ҊPypΎ|L^K Sbqt8c&4(\܊endstream +ŨF&qeXd˩ʝgZN p.ͩ2):os>0]e{JK|hF"{gj,wy*fxIϫ608J|-_`_K_!sPӱ bk{>>3(~Zuh엗qDh\P@4w1ωuȷgH%Աf`.O{F,s>`ϮbtEEiOԡӀpFu<|9ҊPypΎ|L^K Sqt8c&4(܋endstream endobj 198 0 obj << /Type /Page @@ -487,8 +487,8 @@ xڍU )/KHB;!idzIgW.k* vsqy#oj >qԳDR&ڦ &l,P>n,|YS'dY(ֻѪ%)>r [Ib/џmy˴巄 -C1D\q{oJ7. pV1H9:+zF"M6<{v0Kᆱ\MWU\Vڕݼayj7"Aӷ\rTRp:h;vrͣi*@I3i·5E,f^I v,|,dIii-z} 6NMƴǨV:#B䤧"6lF ’PW0f [*WeC!w}:+zF"M6<{v0Kᆱ\MWU\Vڕݼayj7"Aӷ\rTRp:h;vrͣi*@I3i·5E,f^I v,|,dIii-z} 6NMƴǨV:#B䤧"6lF ’PW0f [*WeC!w}> endobj 255 0 obj << -/Length 1933 +/Length 1937 /Filter /FlateDecode >> stream -xYs6)(T(1&izMq_z<(6c$'~.HrDiM.?. - -_0HTa ƊZ\?Y]*V?x -KֲxUp NF/X=T)5hO-M9<y':pD-#qUfO2bz=;P$Ciaߗ54%MEZ C`*֌ɼYxݐVC.'qyf}UP+d0?oծ>,]TYfiwu =]jIґɕAPeb N>"F4c3ypp㱕0?^W妊6B4 U]NLv5@4xkZŲ4nZIܟ̍#MGjNy=kf>uQ ʗn&M v_֗76Sh;/y.py]S!V)]ɘbz7.j{7grVlSS^Un/;?(f6Tw* +76󇿎SZ5d*f:rdPJ;+i3X]ڗPjE< }{U"$I!sVaLR{CDǜ-${ 8%A Bl5IuIlj|u5l;3d*YChzq 8>z֞𿇿=_T)4h-_jb :0E %vb+X/Cuߔ6F8:Fԩ1F 7#|2N6ml&Ly3()" uPv:]'ֵԚ~_`BţvFlUz0Ð6ml-&401$W'ley029$,t+W-BH00':'0Ec;ILQs<9^PA)k@Ey M.fSsųx!PzAg/<`ylfO3y=9a[MC_T['׏ַŕwl^a5wq"<(KgK-6&D7U9}sٓ ͐\}'I- BYlݕW-Ѯ&DYXܫ9 1zi' şw0p¬xJ;T~[w:ڡ.B#QD(]:3Nn(k K9C&Mf%B̫k'KS`t.endstream endobj 254 0 obj << /Type /Page @@ -1156,23 +1152,22 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 343 0 obj << -/Length 1100 +/Length 1201 /Filter /FlateDecode >> stream -xnF~>}9&$B.dŐ ӧVS-6Y9" Y*Z0*z gx(^Wd8q=ZRa]=lXm^ϧ ߂Kk_w_~\u`#nMII,~&g/Kq:!poLG$5HKk-!RrRnpsβ,h"$1izAA@b~OC"ymw֚k5.,ԋ Y6Hθڀծib)f1\nЛ]y~'}|MP!`; 1N*3yZ%"[j t842 &FIyS)?O_ &ރ9x9OT;HX=&S&]/\abOF˟[kvpc^W ó4D]}_oXZ8٘Y#[(xˉ<fr<ԇa;HOp %KTMD@ZuI%+\Bׇ}kp}Ӵ*DKK2I 1N8u2+9a^BD@'0a{d2 '059 +q_>yޗ.֟J + k!rX}yk-p̟#.T)wtwINQ9&f6f!x!$777c"{wUXK WK`5?s8c|LlLlT[ ΃E5%O)o网[}l۱E8¸5/X_.7%8?4\Մ '%y}%.".g:xp#O߰r~nەy},]o ]ǃ}:OiwJ VÍ*:zRLRT[K)SEq(XJN +_{#Oq.SN68MMd/W-cXz_O5E7o{#ަ5-Fvj"1UoFFOx> endobj 345 0 obj << /Type /Annot @@ -1233,24 +1228,31 @@ endobj 353 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [86.8628 605.2166 190.0803 613.7814] +/Rect [86.8628 605.2166 249.4056 613.7814] /Subtype /Link /A << /S /GoTo /D (figure.3.7) >> >> endobj 354 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [86.8628 587.2894 168.9961 595.8542] +/Rect [86.8628 587.2894 190.0803 595.8542] /Subtype /Link /A << /S /GoTo /D (figure.3.8) >> >> endobj 355 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [86.8628 567.6586 195.644 577.927] +/Rect [86.8628 569.3622 168.9961 577.927] /Subtype /Link /A << /S /GoTo /D (figure.3.9) >> >> endobj +356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [86.8628 549.7314 195.644 559.9997] +/Subtype /Link +/A << /S /GoTo /D (figure.3.10) >> +>> endobj 344 0 obj << /D [342 0 R /XYZ 74.4095 793.4011 null] >> endobj @@ -1258,7 +1260,7 @@ endobj /Font << /F61 259 0 R /F28 209 0 R >> /ProcSet [ /PDF /Text ] >> endobj -370 0 obj << +372 0 obj << /Length 1852 /Filter /FlateDecode >> @@ -1277,158 +1279,158 @@ U2 f ugܟGΨ<g=; L,S(V;ZU4oX-o݇7AjGkgTm{wY_2wZoW{ :Tea'\;  {/Z[ozF.9L:vF51> endobj -373 0 obj << +375 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 612.425 338.2165 623.0073] /Subtype /Link /A << /S /GoTo /D (table.2.1) >> >> endobj -374 0 obj << +376 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 594.4978 298.9616 605.0801] /Subtype /Link /A << /S /GoTo /D (table.2.2) >> >> endobj -375 0 obj << +377 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 576.5706 180.2935 586.9466] /Subtype /Link /A << /S /GoTo /D (table.2.3) >> >> endobj -376 0 obj << +378 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 558.6433 257.1971 569.0193] /Subtype /Link /A << /S /GoTo /D (table.2.4) >> >> endobj -377 0 obj << +379 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 540.7161 289.7984 551.2984] /Subtype /Link /A << /S /GoTo /D (table.2.5) >> >> endobj -378 0 obj << +380 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 522.7889 256.1481 533.1649] /Subtype /Link /A << /S /GoTo /D (table.2.6) >> >> endobj -379 0 obj << +381 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 504.8616 335.2394 515.4439] /Subtype /Link /A << /S /GoTo /D (table.2.7) >> >> endobj -380 0 obj << +382 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 486.9344 406.6109 497.5167] /Subtype /Link /A << /S /GoTo /D (table.2.8) >> >> endobj -381 0 obj << +383 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 469.0072 319.7369 479.3832] /Subtype /Link /A << /S /GoTo /D (table.2.9) >> >> endobj -382 0 obj << +384 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 451.0799 295.5011 461.6622] /Subtype /Link /A << /S /GoTo /D (table.2.10) >> >> endobj -383 0 obj << +385 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 433.1527 301.3831 443.735] /Subtype /Link /A << /S /GoTo /D (table.2.11) >> >> endobj -384 0 obj << +386 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 415.2255 371.7415 425.8077] /Subtype /Link /A << /S /GoTo /D (table.2.12) >> >> endobj -385 0 obj << +387 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 397.2982 385.1908 407.8805] /Subtype /Link /A << /S /GoTo /D (table.2.13) >> >> endobj -386 0 obj << +388 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 379.371 276.0623 389.747] /Subtype /Link /A << /S /GoTo /D (table.2.14) >> >> endobj -387 0 obj << +389 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 361.4438 286.3466 371.8198] /Subtype /Link /A << /S /GoTo /D (table.2.15) >> >> endobj -388 0 obj << +390 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 343.5165 356.705 353.8925] /Subtype /Link /A << /S /GoTo /D (table.2.16) >> >> endobj -389 0 obj << +391 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 325.5893 370.1543 336.1716] /Subtype /Link /A << /S /GoTo /D (table.2.17) >> >> endobj -390 0 obj << +392 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 299.5107 177.8368 308.0754] /Subtype /Link /A << /S /GoTo /D (table.3.1) >> >> endobj -391 0 obj << +393 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 281.5834 345.4789 290.3545] /Subtype /Link /A << /S /GoTo /D (table.3.2) >> >> endobj -371 0 obj << -/D [369 0 R /XYZ 74.4095 793.4011 null] +373 0 obj << +/D [371 0 R /XYZ 74.4095 793.4011 null] >> endobj -372 0 obj << -/D [369 0 R /XYZ 74.4095 643.0739 null] +374 0 obj << +/D [371 0 R /XYZ 74.4095 643.0739 null] >> endobj -368 0 obj << +370 0 obj << /Font << /F26 206 0 R /F28 209 0 R /F61 259 0 R >> /ProcSet [ /PDF /Text ] >> endobj -413 0 obj << +415 0 obj << /Length 1758 /Filter /FlateDecode >> @@ -1443,35 +1445,35 @@ D /2|ʾGbڠ%"6c]+B?'5y{ %y%S>ZKNCAnȓL)W K4<9s2GNBr{,KqY3R 3_kܸiʵ\yO`6zKiW QبנS2<'G3s96lΕcM|mekYsi, NC {jTI>H;Wqn5chk/}o이,5{zQ$űya bMH =QB3~Gj2iEKN_eK!DqՆ@[Mq\o"ȪuN'+r*8ìvwy煲 ,O~+D巇adT oS";N+/endstream endobj -412 0 obj << +414 0 obj << /Type /Page -/Contents 413 0 R -/Resources 411 0 R +/Contents 415 0 R +/Resources 413 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 356 0 R -/Annots [ 415 0 R ] +/Parent 357 0 R +/Annots [ 417 0 R ] >> endobj -415 0 obj << +417 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [75.9058 417.1708 102.2418 425.7356] /Subtype /Link /A << /S /GoTo /D (cite.Tanenbaum) >> >> endobj -414 0 obj << -/D [412 0 R /XYZ 74.4095 793.4011 null] +416 0 obj << +/D [414 0 R /XYZ 74.4095 793.4011 null] >> endobj 6 0 obj << -/D [412 0 R /XYZ 74.4095 771.7323 null] +/D [414 0 R /XYZ 74.4095 771.7323 null] >> endobj 10 0 obj << -/D [412 0 R /XYZ 74.4095 570.9064 null] +/D [414 0 R /XYZ 74.4095 570.9064 null] >> endobj -411 0 obj << +413 0 obj << /Font << /F26 206 0 R /F28 209 0 R /F61 259 0 R >> /ProcSet [ /PDF /Text ] >> endobj -421 0 obj << +423 0 obj << /Length 1854 /Filter /FlateDecode >> @@ -1484,30 +1486,30 @@ c {*06UMvG}0=ϧz琹ӿuJh3)C@j RӔg:pKr+ʌW={&_ٽ#}1mGD9$= 0:T9 s_S/lkYVim*+(3ZZp7M@4Io)4k蒾2B[Ǯ1b9k %zdC1D6bOS&6βRQ Ky ?lnf2Uu <c<'e(gg,Ybendstream endobj -420 0 obj << +422 0 obj << /Type /Page -/Contents 421 0 R -/Resources 419 0 R +/Contents 423 0 R +/Resources 421 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 356 0 R -/Annots [ 424 0 R ] +/Parent 357 0 R +/Annots [ 426 0 R ] >> endobj -417 0 obj << +419 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/home/buetow/svn/vs/trunk/LaTeX/images/client-server.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 427 0 R +/PTEX.InfoDict 429 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 382.00000000 112.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 428 0 R ->>/Font << /R8 429 0 R >> +/R7 430 0 R +>>/Font << /R8 431 0 R >> >> -/Length 430 0 R +/Length 432 0 R /Filter /FlateDecode >> stream @@ -1515,60 +1517,60 @@ x (C!R;}tI6?΃ߏbw'> endobj -428 0 obj +430 0 obj << /Type /ExtGState /OPM 1 >> endobj -429 0 obj +431 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -430 0 obj +432 0 obj 452 endobj -424 0 obj << +426 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [439.9225 458.2842 454.378 468.8664] /Subtype /Link /A << /S /GoTo /D (figure.1.1) >> >> endobj -422 0 obj << -/D [420 0 R /XYZ 74.4095 793.4011 null] +424 0 obj << +/D [422 0 R /XYZ 74.4095 793.4011 null] >> endobj 14 0 obj << -/D [420 0 R /XYZ 74.4095 771.7323 null] +/D [422 0 R /XYZ 74.4095 771.7323 null] >> endobj -423 0 obj << -/D [420 0 R /XYZ 74.4095 659.2541 null] +425 0 obj << +/D [422 0 R /XYZ 74.4095 659.2541 null] >> endobj 314 0 obj << -/D [420 0 R /XYZ 288.3666 523.6815 null] +/D [422 0 R /XYZ 288.3666 523.6815 null] >> endobj -425 0 obj << -/D [420 0 R /XYZ 74.4095 396.6881 null] +427 0 obj << +/D [422 0 R /XYZ 74.4095 396.6881 null] >> endobj -426 0 obj << -/D [420 0 R /XYZ 74.4095 235.3536 null] +428 0 obj << +/D [422 0 R /XYZ 74.4095 235.3536 null] >> endobj -419 0 obj << +421 0 obj << /Font << /F61 259 0 R /F26 206 0 R /F28 209 0 R >> -/XObject << /Im2 417 0 R >> +/XObject << /Im2 419 0 R >> /ProcSet [ /PDF /Text ] >> endobj -433 0 obj << +435 0 obj << /Length 1352 /Filter /FlateDecode >> @@ -1582,29 +1584,29 @@ U  #c-ݻЩ ҂φ0ΗX;$q!Lq˝2:϶:؜*se)])ZLAқLPR$}ɒ')@7Xo{I%/ Ova &/3kl ,M F[~7)׹_3ㅏR2v'Jg}#)aendstream endobj -432 0 obj << +434 0 obj << /Type /Page -/Contents 433 0 R -/Resources 431 0 R +/Contents 435 0 R +/Resources 433 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 356 0 R +/Parent 357 0 R >> endobj -418 0 obj << +420 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/home/buetow/svn/vs/trunk/LaTeX/images/client-server-protokolle.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 436 0 R +/PTEX.InfoDict 438 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 376.00000000 320.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 437 0 R ->>/Font << /R8 438 0 R >> +/R7 439 0 R +>>/Font << /R8 440 0 R >> >> -/Length 439 0 R +/Length 441 0 R /Filter /FlateDecode >> stream @@ -1614,44 +1616,44 @@ x Y La- 7pD7[:pHp {-q*YA^6@K  B|jZ%Tp'endstream endobj -436 0 obj +438 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080808220147Z00'00') -/ModDate (D:20080808220147Z00'00') +/CreationDate (D:20080809025807Z00'00') +/ModDate (D:20080809025807Z00'00') >> endobj -437 0 obj +439 0 obj << /Type /ExtGState /OPM 1 >> endobj -438 0 obj +440 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -439 0 obj +441 0 obj 499 endobj -434 0 obj << -/D [432 0 R /XYZ 74.4095 793.4011 null] +436 0 obj << +/D [434 0 R /XYZ 74.4095 793.4011 null] >> endobj -435 0 obj << -/D [432 0 R /XYZ 74.4095 750.3359 null] +437 0 obj << +/D [434 0 R /XYZ 74.4095 750.3359 null] >> endobj 315 0 obj << -/D [432 0 R /XYZ 281.7271 358.4221 null] +/D [434 0 R /XYZ 281.7271 358.4221 null] >> endobj -431 0 obj << +433 0 obj << /Font << /F61 259 0 R /F26 206 0 R /F28 209 0 R >> -/XObject << /Im3 418 0 R >> +/XObject << /Im3 420 0 R >> /ProcSet [ /PDF /Text ] >> endobj -442 0 obj << +444 0 obj << /Length 1762 /Filter /FlateDecode >> @@ -1663,35 +1665,35 @@ xڍ CG1zPI.A 0vwXuɈ>V+LK/?**Jg5蝷:M^7gÜ3Y\ܼ+=pPGu:25.-oZ014eaį7`6r b|Fz.7>DE`Pendstream endobj -441 0 obj << +443 0 obj << /Type /Page -/Contents 442 0 R -/Resources 440 0 R +/Contents 444 0 R +/Resources 442 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 356 0 R -/Annots [ 446 0 R ] +/Parent 357 0 R +/Annots [ 448 0 R ] >> endobj -446 0 obj << +448 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.1829 465.5316 140.6385 476.1138] /Subtype /Link /A << /S /GoTo /D (figure.1.2) >> >> endobj -443 0 obj << -/D [441 0 R /XYZ 74.4095 793.4011 null] +445 0 obj << +/D [443 0 R /XYZ 74.4095 793.4011 null] >> endobj -444 0 obj << -/D [441 0 R /XYZ 74.4095 750.7482 null] +446 0 obj << +/D [443 0 R /XYZ 74.4095 750.7482 null] >> endobj -445 0 obj << -/D [441 0 R /XYZ 74.4095 608.3473 null] +447 0 obj << +/D [443 0 R /XYZ 74.4095 608.3473 null] >> endobj -440 0 obj << +442 0 obj << /Font << /F61 259 0 R /F26 206 0 R /F28 209 0 R >> /ProcSet [ /PDF /Text ] >> endobj -450 0 obj << +452 0 obj << /Length 1160 /Filter /FlateDecode >> @@ -1701,15 +1703,15 @@ xڭWKs l0.JRCvF';%ZhS.ʳµRX+ﱬ} +J"+2pamlhUOH~ kZ((i;GK9e/)-!I!3NlA%0F>*7* !LM|jSv[y r.`+tNq k9Wiy ,!88bPq."C_x=(.@>~*<30l7T[%= eghFVCc gzC uIHLiXU|YC.S#K+i;?U&o} D7悝˅pPM.z72AnD)1pujR._k~ǃP+&…O97+T!6y<$u"omY崀tSF`OkDwr L}W]>H?٢1|EP> endobj -447 0 obj << +449 0 obj << /Type /XObject /Subtype /Image /Width 1024 @@ -1731,45 +1733,45 @@ pz t ?y#rϲP{@Z N>:?}?o2k#9uuѣGkLlĝefqSSMp\8G<'G#s_dS!tN杫5_?|BNwW=z4Fٯ x;O[4^qo>lO3Ʃc&*q[(WY/5886qcߓͺ򝏙'O;ί6lnL++*ZZ]zȑ#]>@hKvI+H8]ˈ#sNBNn|Ny: jꚛ<(\E(>(=X8$5WQz8 X:ԾpSki>Xcձȫ+Ty`)sq7i[#~=3ϘӪSϬӊC(X޽{k`A; 0eWte|A9N\ڣg;k_`Aj5.khKG ZQN#M~~ Rs7?_hi>&? ҔpύT5ue4?R8yeSNo9?w:7+d2L&4[AC{s_?@@{~@?@@?_?@??@@?_?@??@?@??@??@?@?@@?@?@?@?@@?_?@@{~@?@@?_?@??@@?_?@??@?@??@??@?@?@@?@?@?@?@@?_?@@{~@?@@?_?@??@@?_?@??@?@??@??@?@?@@?@?@?@?@@?_?@@{~@?@@?_?@??@@?_?@??@?@??@??@?@?@@?@?@?@?@̏7L&d2Lij`0`6endstream endobj -452 0 obj << +454 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 189.397 87.8688 199.9793] /Subtype /Link /A << /S /GoTo /D (figure.2.1) >> >> endobj -453 0 obj << +455 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [389.0928 189.397 403.5483 199.9793] /Subtype /Link /A << /S /GoTo /D (figure.2.2) >> >> endobj -454 0 obj << +456 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [300.1067 135.6153 314.5622 146.1976] /Subtype /Link /A << /S /GoTo /D (figure.2.3) >> >> endobj -451 0 obj << -/D [449 0 R /XYZ 74.4095 793.4011 null] +453 0 obj << +/D [451 0 R /XYZ 74.4095 793.4011 null] >> endobj 18 0 obj << -/D [449 0 R /XYZ 74.4095 771.7323 null] +/D [451 0 R /XYZ 74.4095 771.7323 null] >> endobj 22 0 obj << -/D [449 0 R /XYZ 74.4095 581.9662 null] +/D [451 0 R /XYZ 74.4095 581.9662 null] >> endobj 316 0 obj << -/D [449 0 R /XYZ 250.8743 253.9309 null] +/D [451 0 R /XYZ 250.8743 253.9309 null] >> endobj -448 0 obj << +450 0 obj << /Font << /F26 206 0 R /F28 209 0 R /F61 259 0 R >> -/XObject << /Im4 447 0 R >> +/XObject << /Im4 449 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj -461 0 obj << +463 0 obj << /Length 1704 /Filter /FlateDecode >> @@ -1782,15 +1784,15 @@ gG 6d p1nD*},f#վCJw]Xl-hpvG =wa7n2zc6h٘"OiĬ{v\WWO[lp: i{Lxܘl|NTtloG2qcCK$?~i2Cf㮣K>%> endobj -456 0 obj << +458 0 obj << /Type /XObject /Subtype /Image /Width 234 @@ -1829,38 +1831,38 @@ ze TzZz`QE^^^RRRH/EzI/EzWl֬Y˗/WFF:wqyK'snڰaٳ.]*_5bwhhhh͚5p7nT sNl߮o޼ِ)jطo [۷ ;;;Uz"ndAhY\Ct-7T Ez vޝ"竮fm2.+Hw"_.Q k3Cd+ K~@P >OsL':TYT EzĽxXBW.QYf:ٗ.]Zds=W]]t%(K^K^K^" /LLL*Dz)KQH/Ez)R(K^"Ez)KQH/E^R(K^K^"Ez)KQH/E^R(K^"5}#endstream endobj -464 0 obj << +466 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [183.9175 721.5786 198.3731 732.1608] /Subtype /Link /A << /S /GoTo /D (figure.2.2) >> >> endobj -466 0 obj << +468 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [323.2532 153.5425 337.7088 164.1248] /Subtype /Link /A << /S /GoTo /D (figure.2.4) >> >> endobj -462 0 obj << -/D [460 0 R /XYZ 74.4095 793.4011 null] +464 0 obj << +/D [462 0 R /XYZ 74.4095 793.4011 null] >> endobj -463 0 obj << -/D [460 0 R /XYZ 74.4095 752.2837 null] +465 0 obj << +/D [462 0 R /XYZ 74.4095 752.2837 null] >> endobj 317 0 obj << -/D [460 0 R /XYZ 305.5773 401.9113 null] +/D [462 0 R /XYZ 305.5773 401.9113 null] >> endobj -465 0 obj << -/D [460 0 R /XYZ 74.4095 184.2476 null] +467 0 obj << +/D [462 0 R /XYZ 74.4095 184.2476 null] >> endobj -459 0 obj << +461 0 obj << /Font << /F61 259 0 R /F26 206 0 R /F28 209 0 R >> -/XObject << /Im5 456 0 R >> +/XObject << /Im5 458 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj -469 0 obj << +471 0 obj << /Length 1085 /Filter /FlateDecode >> @@ -1870,14 +1872,14 @@ xڭW 6&\$ΒfiG3&0&=gyXݜ?o]m|_Тxى@o1kډJZLҁ&xO^U:Fv,.HzuYdP[ (09]{@ )eM2vӈ{eZ,H[dλ,ݧa4-Ц` ۩Pja_Ӕn$ \:mufŠ[䭍w764'n=7k'׋{ %F1&bA5 fip>8+jFUf-&ԭd\K@]em ?koLAYfs^3 =]R?S*Dm͒p5Sdm%UJe jan X 6Ce qS _i!YNw19-pE3#7O~yS8QQl۴|B١&CI.ʅ/lnW QWA(?<1pDQ-g!7cI|5;xX\&qZ]kŬm N 9=gMzk8=5րt71 KQq=2si!ܖaR3_\PK\Uv\]f᪟5jHߘƧKO`bW Zz%Z*-KY;Z.zߵ3.:aNu C넉uaQ:SUD-> endobj -457 0 obj << +459 0 obj << /Type /XObject /Subtype /Image /Width 1024 @@ -1949,7 +1951,7 @@ Oo9/ q^/jY?P?o#K ~{^{g~$)*0?Jr=7op˜Nn"x[O:_#?w.^>lz31ƻ,]:L7yL2Smz/@_r s kg-vfz=Eu^||ڿ]1r'o/43-NS%$p?,p')b` wBON wH``endstream endobj -458 0 obj << +460 0 obj << /Type /XObject /Subtype /Image /Width 180 @@ -1977,21 +1979,21 @@ SȈoD\ ٘Zl7Z%lL-6Z!7,7>L")dcjb,>߰ߞ{و|t9T,t)T(«8 {endstream endobj -470 0 obj << -/D [468 0 R /XYZ 74.4095 793.4011 null] +472 0 obj << +/D [470 0 R /XYZ 74.4095 793.4011 null] >> endobj 318 0 obj << -/D [468 0 R /XYZ 286.4299 503.2659 null] +/D [470 0 R /XYZ 286.4299 503.2659 null] >> endobj 319 0 obj << -/D [468 0 R /XYZ 266.1839 382.6614 null] +/D [470 0 R /XYZ 266.1839 382.6614 null] >> endobj -467 0 obj << +469 0 obj << /Font << /F61 259 0 R /F28 209 0 R /F35 221 0 R >> -/XObject << /Im6 457 0 R /Im7 458 0 R >> +/XObject << /Im6 459 0 R /Im7 460 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj -475 0 obj << +477 0 obj << /Length 1296 /Filter /FlateDecode >> @@ -2005,15 +2007,15 @@ xڭWYo jq\ԯMz1EF TNѹ-˭'D| ӏ(eD$ETOڃ`&Bn1=L Ra:*@UrD|S `7 :ur5HX WbLנNX|,[m&q i`9WɈ{U>aV?R~0"ςP UeA%<p˾6MFU4<yW-º X=7be= :0Hpi`R~Otd%/< S2endstream endobj -474 0 obj << +476 0 obj << /Type /Page -/Contents 475 0 R -/Resources 473 0 R +/Contents 477 0 R +/Resources 475 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 455 0 R -/Annots [ 478 0 R ] +/Parent 457 0 R +/Annots [ 480 0 R ] >> endobj -471 0 obj << +473 0 obj << /Type /XObject /Subtype /Image /Width 586 @@ -2028,7 +2030,7 @@ x 7-XW [r7g7U~Zz?ކ[1g bǗsI9ۮ㥧 '&7Wjo_E3/jcOL˺=.cuQ݌1]uUKc-usg1uzJݦY,Ց;[aaX,uV7bX,usX,n,R7ucX,bMX,nVbXfX,bMX,nbX,u,R7;bMX,nbX,uS7bdX,YMbbXn,RFu[c5Y,5Mݾ8;b-n"n`{M[bX6Jݎ_гsX,KݞvVyn,Śn{QRv"aX,u˯kbXm= vb[BQDnbX]Vyn,Śnů\X,kvcX,(uܼqncLsncM݌1ƨ1ӷnߞ{&1Ƙ.uLX,kXNX,nVbXfX,KX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXf5Y,n,R7ucX,bMX,nVbXfX,bMX,nbX,u,R7;bMX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXfX,KX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXf5Y,n,R7ucX,bMX,nVbXfX,bMX,nbX,u,R7;bMX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXfX,KX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXf5Y,n,R7ucX,bMX,nVbXfX,bMX,nbX,u,R7;bMX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXfX,KX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXf5Y,n,R7ucX,ݯbXiյ9,nu[vqkwRQv҅bXkcucX,|u[݋bX,U3qvb[~>^S7b=ngnsX,KJZ)~fݬ&b2V|\X,k](X,˵dX,VӺU~vncLs,mf1u1Ƙm#3u3m{&1Ƙ.uLX,kXNX,nVbXfX,KX,nbX,uS7bdX,YMbbXn,R7ucX,bjX,KR7ucX,bMX,nVbXf5Y,n,R7ucX,bMX,nVbXf