de.bsvrz.sys.funclib.communicationStreams
Class StreamDemultiplexer.DemultiplexerStreaminformations

java.lang.Object
  extended by de.bsvrz.sys.funclib.communicationStreams.StreamDemultiplexer.DemultiplexerStreaminformations
Enclosing class:
StreamDemultiplexer

private static class StreamDemultiplexer.DemultiplexerStreaminformations
extends Object

Diese Objekt beinhaltet alle Informationen, die für einen Stream, auf Empfängerseite, wichtig sind. Diese Objekte werden in einem Array (Index des Arrays ist dabei gleich der Nummer des Stream) gespeichert. Somit können alle Inforamtionen zu einem Stream mit einem Arrayzugriff geholt werden


Field Summary
private  UnboundedQueue _bigDataPacketQueue
          In dieser Queue werden die großen Nutzdatenpakete gespeichert.
private  boolean _endStream
          Wenn der Sender keine Nutzdaten mehr für den Empfänger hat, dann wird der Stream beendet (dies sollte der Normalfall sein).
private  int _indexOfStream
           
private  boolean _lostConnectionToSender
          Bei der Übertragung der Daten ist ein Fehler aufgetreten.
private  int _maxStreamPacketIndex
          Bis zu welchem Paketindex darf der Sender Pakete versenden
private  int _nextPacketIndex
          Welchen Paketindex muß das nächste Paket haben.
private  int _packetIndexToSendNextMaxTicketIndex
          Wann muß das nächste Ticket zum Sender geschickt werden, damit er neue Nutzdatenpakete verschickt
private  UnboundedQueue _smallDataPacketQueue
          In dieser Queue werden die Nutzdaten gespeichert.
private  boolean _streamAborted
          Wenn ein Stream mit abort beendet wurde, dann geschieht dies durch den Empfänger (er will keine Nutzdaten mehr).
private  boolean _streamTerminated
          Bei der Übertragung der Daten ist ein Fehler aufgetreten, entweder wurde ein Nutzdatenpaket doppelt empfangen oder ein Paket fehlt.
 
Constructor Summary
StreamDemultiplexer.DemultiplexerStreaminformations(int indexOfStream, int packetIndexToSendNextMaxTicketIndex, int maxStreamPacketIndex)
           
 
Method Summary
 void createUnlockPacket()
          Es kann passieren, dass in der _bigDataPacketQueue Threads auf Daten warten (durch den take-Aufruf).
 byte[] getData()
          Diese Methode stellt die Nutzdaten des Streams zur Verfügung.
 int getIndexOfStream()
          Index des Streams
 int getMaxStreamPacketIndex()
           
 int getNextPacketIndex()
           
 int getPacketIndexToSendNextMaxTicketIndex()
           
 StreamDemultiplexer.ReferenceDataPacket getReferenceDataPacket()
          Diese Methode fordert ein Datenpaket des Streams an.
 boolean isEndStream()
          Wurde der Stream aufgrund fehlender Nutzdaten vom Sender beendet.
 boolean isLostConnectionToSender()
          Wurde der Stream durch die Empfängerapplikation beendet, weil die physische Verbindung zur Senderapplikation unterbrochen wurde.
 boolean isStreamAborted()
          Wurde der Stream vom der Empfängerapplikation beendet (aus welchen Gründen auch immer).
 boolean isStreamTerminated()
          Wurde der Stream durch den Empfänger beendet, weil ein Paket doppelt vorhanden oder gar nicht vorhanden war.
 void newDataPacketForStream(StreamDemultiplexer.ReferenceDataPacket dataPacket)
          Ein Datenpaket in einem Stream speichern (das Datenpaket muß mit take von der Applikation abgerufen werden, sonst steht es nicht zur Verfügung)
 void putDataSmallDataPacketQueue(byte[] data)
          Ein Nutzdatenpaket speichern, diese wird dann später an die Empfängerapplikation weiter gegeben.
 void setEndStreamTrue()
          Der Stream bei einem take Aufruf ein null-Paket zurück geliefert.
 void setLostConnectionToSenderTrue()
          Da die physische Verbindung zum Sender unterbrochen wurde, und somit keine Nutzdatenpakete mehr ankommen, können die restlichen Nutdaten auch gelöscht werden.
 void setMaxStreamPacketIndex(int maxStreamPacketIndex)
           
 void setNextPacketIndex(int nextPacketIndex)
          Der Index des Nutzdatenpakets, das als nächstes erwartet wird, wird hier neu gesetzt.
 void setPacketIndexToSendNextMaxTicketIndex(int packetIndexToSendNextMaxTicketIndex)
           
 void setStreamAbortedTrue()
          Der Stream wurde abgebrochen, es kann passieren, dass noch Threads in der _bigDataPacketQueue hängen und auf Daten warten.
 void setStreamTerminatedTrue()
          Da Fehlerhafte Nutzdatenpakete empfangen wurden, können alle empfangenen Nutzdatenpakete, die sich in der dataQueue befinden, verworfen werden.
 int sizeOfDataQueue()
          Diese Methode dient zum Debuggen.
 int sizeOfSmallDataPacketQueue()
          Bestimmt die Größe der Queue, die die Nutzdatenpakete für die Empfängerapplikation speichert.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_indexOfStream

private final int _indexOfStream

_packetIndexToSendNextMaxTicketIndex

private int _packetIndexToSendNextMaxTicketIndex
Wann muß das nächste Ticket zum Sender geschickt werden, damit er neue Nutzdatenpakete verschickt


_maxStreamPacketIndex

private int _maxStreamPacketIndex
Bis zu welchem Paketindex darf der Sender Pakete versenden


_nextPacketIndex

private int _nextPacketIndex
Welchen Paketindex muß das nächste Paket haben. Diese Variable soll verhindern, dass Pakete doppelt empfangen werden oder das Pakete "verschwinden". Der default Wert ist 1, da das erste Paket den Index 1 hat.


_bigDataPacketQueue

private final UnboundedQueue _bigDataPacketQueue
In dieser Queue werden die großen Nutzdatenpakete gespeichert. Diese Pakete enthalten die kleinen Nutzdatenpakete und können somit nicht zur Empfängerapplikation weitergegeben werden, sondern müssen zuerst ausgepackt werden. Die kleinen Nutzdatenpakete werden dann an die Empfängerapplikation weitergegeben.


_smallDataPacketQueue

private final UnboundedQueue _smallDataPacketQueue
In dieser Queue werden die Nutzdaten gespeichert. Diese Pakete werden an die Empfängerapplikation weitergegeben.


_endStream

private boolean _endStream
Wenn der Sender keine Nutzdaten mehr für den Empfänger hat, dann wird der Stream beendet (dies sollte der Normalfall sein). Diese Variable wird auf true gesetzt, wenn dieser Fall eintritt.


_streamAborted

private boolean _streamAborted
Wenn ein Stream mit abort beendet wurde, dann geschieht dies durch den Empfänger (er will keine Nutzdaten mehr). Die Variable _streamAborted wird auf true gesetzt.


_streamTerminated

private boolean _streamTerminated
Bei der Übertragung der Daten ist ein Fehler aufgetreten, entweder wurde ein Nutzdatenpaket doppelt empfangen oder ein Paket fehlt. Dieser Fehler betrifft aber nur diesen einen Stream. Damit die Applaktion auf die fehlerhafte Datenleitung des einen Streams aufmerksam gemacht werden kann, wird diese Variable auf true gesetzt, dadurch kann eine ProtocolException ausgelöst.


_lostConnectionToSender

private boolean _lostConnectionToSender
Bei der Übertragung der Daten ist ein Fehler aufgetreten. Der DaV meldet, dass ein Verbindungsproblem vorliegt. Dies betrifft alle Streams und alle Streams werden beendet. Dieser Fall erzeugt eine ClosedChannelException für alle Streams auf die ein take ausgeführt wird.

Constructor Detail

StreamDemultiplexer.DemultiplexerStreaminformations

public StreamDemultiplexer.DemultiplexerStreaminformations(int indexOfStream,
                                                           int packetIndexToSendNextMaxTicketIndex,
                                                           int maxStreamPacketIndex)
Method Detail

getPacketIndexToSendNextMaxTicketIndex

public int getPacketIndexToSendNextMaxTicketIndex()

setPacketIndexToSendNextMaxTicketIndex

public void setPacketIndexToSendNextMaxTicketIndex(int packetIndexToSendNextMaxTicketIndex)

getMaxStreamPacketIndex

public int getMaxStreamPacketIndex()

setMaxStreamPacketIndex

public void setMaxStreamPacketIndex(int maxStreamPacketIndex)

getNextPacketIndex

public int getNextPacketIndex()

getIndexOfStream

public int getIndexOfStream()
Index des Streams

Returns:
Index des Streams

setNextPacketIndex

public void setNextPacketIndex(int nextPacketIndex)
Der Index des Nutzdatenpakets, das als nächstes erwartet wird, wird hier neu gesetzt.


getReferenceDataPacket

public StreamDemultiplexer.ReferenceDataPacket getReferenceDataPacket()
                                                               throws InterruptedException
Diese Methode fordert ein Datenpaket des Streams an. Die Datenpakete werden in einer Queue gespeichert. Aus der Schlange wird das erste Paket zurück gegeben.

Returns:
Nutzdatenpaket, es besteht aus (verkapselt) data (Nutzdaten) und dem Index des Pakets
Throws:
InterruptedException - Die Datenstruktur UnboundedQueue kann durch ein Interrupt unterbrochen werden

newDataPacketForStream

public void newDataPacketForStream(StreamDemultiplexer.ReferenceDataPacket dataPacket)
Ein Datenpaket in einem Stream speichern (das Datenpaket muß mit take von der Applikation abgerufen werden, sonst steht es nicht zur Verfügung)

Parameters:
dataPacket - Ein Datenpaket (Definition: s.o.)

sizeOfSmallDataPacketQueue

public int sizeOfSmallDataPacketQueue()
Bestimmt die Größe der Queue, die die Nutzdatenpakete für die Empfängerapplikation speichert. Ist die Größe "0", dann muss ein großes Paket ausgepackt werden.

Returns:
Anzahl von Nutzdatenpakete, die für die Empfängerapplikation bestimmt sind

putDataSmallDataPacketQueue

public void putDataSmallDataPacketQueue(byte[] data)
Ein Nutzdatenpaket speichern, diese wird dann später an die Empfängerapplikation weiter gegeben.

Parameters:
data - Ein Nutzdaten für die Empfängerapplikation

getData

public byte[] getData()
               throws InterruptedException
Diese Methode stellt die Nutzdaten des Streams zur Verfügung. Dieser Zugriff wird nur dann ausgeführt, wenn vorher überprüft wurde, ob überhaupt Nutzdaten vorhanden sind (Methode: sizeOfSmallDataPacketQueue).

Returns:
Throws:
InterruptedException

isEndStream

public boolean isEndStream()
Wurde der Stream aufgrund fehlender Nutzdaten vom Sender beendet. true = ja, false = nein


isStreamAborted

public boolean isStreamAborted()
Wurde der Stream vom der Empfängerapplikation beendet (aus welchen Gründen auch immer). true = ja, false = nein


isStreamTerminated

public boolean isStreamTerminated()
Wurde der Stream durch den Empfänger beendet, weil ein Paket doppelt vorhanden oder gar nicht vorhanden war. true = ja, false = nein


isLostConnectionToSender

public boolean isLostConnectionToSender()
Wurde der Stream durch die Empfängerapplikation beendet, weil die physische Verbindung zur Senderapplikation unterbrochen wurde. true = ja, false = nein


setEndStreamTrue

public void setEndStreamTrue()
Der Stream bei einem take Aufruf ein null-Paket zurück geliefert. Somit hatte die Senderapplikation keine Nutzdaten mehr und hat den Stream auf ihrer Seite bereits beendet. Der StreamDemultiplexer kann seinen Stream ebenfalls beenden.


setStreamAbortedTrue

public void setStreamAbortedTrue()
Der Stream wurde abgebrochen, es kann passieren, dass noch Threads in der _bigDataPacketQueue hängen und auf Daten warten. Diese müßen künstlich befreit werden, in dem "unlockPackets" erzeugt werden. Diese Datenpakete enthalten keine Daten werden aber in die _bigDataPacketQueue aufgenommen und befreien somit einen Thread.


setStreamTerminatedTrue

public void setStreamTerminatedTrue()
Da Fehlerhafte Nutzdatenpakete empfangen wurden, können alle empfangenen Nutzdatenpakete, die sich in der dataQueue befinden, verworfen werden. Falls noch Threads auf Daten warten, müßen diese befreit werden (Erklärung, siehe "setStreamAbortedTrue").


setLostConnectionToSenderTrue

public void setLostConnectionToSenderTrue()
Da die physische Verbindung zum Sender unterbrochen wurde, und somit keine Nutzdatenpakete mehr ankommen, können die restlichen Nutdaten auch gelöscht werden. Falls noch Threads auf Daten warten, müßen diese befreit werden (Erklärung, siehe "setStreamAbortedTrue").


createUnlockPacket

public void createUnlockPacket()
Es kann passieren, dass in der _bigDataPacketQueue Threads auf Daten warten (durch den take-Aufruf). Wenn nun der Stream unterbrochen/beendet wird, dann kommen keine Pakete mehr. Die Threads warten also vergebens in der _bigDataPacketQueue. Damit diese Threads nun befreit werden können, werden "Unlock Packets" erzeugt. Diese enthalten keine Nutzdaten und jedes Paket befreit genau einen Thread aus der _bigDataPacketQueue. Der Thread wird dann mit dem "UnlockPacket" weiterarbeiten. Sobald er aber an die Stelle kommt an der der Zustand des Streams getestet wird (take Methode, synchronized(stream), if-Abfragen), wird eine Exception geworfen (der Stream wurde ja unterbrochen/beendet, also darf er nichts mehr senden). Diese Pakete sind also nur ein Trick um "hängende" Threads aus der dataQueue zu befreien.

Jeder Thread, der eine Exception auslösen wird (mit throws Exception), wird vorher diese Methode aufrufen.


sizeOfDataQueue

public int sizeOfDataQueue()
Diese Methode dient zum Debuggen. Sie liefert die größe (Anzahl Objekte) der Queue zurück. Ist die Anzahl der eingetragenen Elemente größer als der _deblockingFactor, dann ist ein Fehler aufgetreten. (Der Sender überlastet den Empfänger)

Returns:
Anzahl der eingetragenen Objekte in der Queue