de.bsvrz.dav.daf.main.impl.archive.request
Class Query

java.lang.Object
  extended by de.bsvrz.dav.daf.main.impl.archive.request.Query
All Implemented Interfaces:
ArchiveDataQueryResult, ArchiveQueryResult

 class Query
extends Object
implements ArchiveDataQueryResult

Diese Klasse stellt alle Methoden zur Verfügung um eine Archivanfrage zu stellen, sie wird der Klasse StreamedArchiveRequester benutzt.

Author:
Kappich+Kniß Systemberatung Aachen (K2S), Achim Wullenkord (AW)

Nested Class Summary
private static class Query.DirectorStreamDemultiplexer
           
 
Field Summary
private  ArchiveQueryID _archiveRequestID
          Dieses Objekt identifiziert die Archivanfrage eindeutig.
private  DataStream[] _arrayOfStreams
          Hier werden alle streams, die zu einer Archivanfrage gehören, gespeichert.
private  boolean _blocking
          Solange diese Variable true ist, werden alle Anfragen an die Query blockiert da das Archiv noch nicht geantwortet hat.
private  int _blockingFactor
          Bestimmt den blockingFactor des StreamDemultiplexers.
private static Debug _debug
          DebugLogger für Debug-Ausgaben
private  short _defaultSimulationVariant
           
private  String _errorMessage
          Falls es zu einem Fehler gekommen ist, zu welchem.
private  int _numberOfFinishedStreams
          Diese Variable speichert, wie viele Streams bisher beendet wurden, entweder durch empfang des null-Pakets oder durch abort.
private  int _numberOfStreams
          Wieviele Streams gehören zu der Archivanfrage.
private  ArchiveQueryPriority _priority
           
private  int _receiveBufferSize
          Diese Variable bestimmt die Größe des Empfangspuffers (StreamDemultiplexer).
private  boolean _requestSuccessful
          Konnte die Anfrage zum Archiv durchgeführt werden
private  List _spec
          ArchiveDataSpecification einer Anfrage in einer Liste speichern
private  StreamDemultiplexer _streamDemultiplexer
           
(package private)  StreamedArchiveRequester _streamedArchiveRequester
           
 
Constructor Summary
Query(ArchiveQueryID archiveRequestID, ArchiveQueryPriority priority, ArchiveDataSpecification spec, int receiveBufferSize, StreamedArchiveRequester streamedArchiveRequester, short defaultSimulationVariant)
          Archivanfrage mit einem Objekt
Query(ArchiveQueryID archiveRequestID, ArchiveQueryPriority priority, List spec, int receiveBufferSize, StreamedArchiveRequester streamedArchiveRequester, short defaultSimulationVariant)
           
 
Method Summary
 void archiveDataResponse(byte[] data)
          Diese Methode verwaltet Nutzdaten, die für eine Archivanfrage empfangen wurden.
(package private)  void countFinishedStream()
          Diese Methode wird von einem Objekt der Klasse Query aufgerufen sobald der Stream des Objekts ein null-Paket empfängt oder die Empfängerapplikation abort aufruft.
 ArchiveQueryID getArchiveRequestID()
          Die Rückgabe identifiziert eine Archivanfrage.
 String getErrorMessage()
          Bestimmt eine Fehlernachricht, falls die entsprechende Archivanfrage nicht erfolgreich war.
 ArchiveDataStream[] getStreams()
          Diese Methode gibt alle Streams, die zu einer Archivanfrage gehören, zurück.
 void initiateArchiveRequest()
          Mit dieser Methode wird die initiale Archivanfrage verschickt.
 void initiateArchiveResponse(byte[] queryResponse)
          Diese Methode wird vom StreamedArchivRequester aufgerufen, sobald das Archiv auf die erste Archivanfrage eines Auftrags antwortet.
 boolean isRequestSuccessful()
          Diese Methode blockiert solange, bis das Archiv auf die erste Archivanfrage geantwortet hat.
(package private)  void killAllStreams()
          Diese Methode benachrichtigt den StreamDemultiplexer, dass ein Fehler aufgetreten ist und das alle Streams beendet werden müssen.
 void lostArchive()
          Die Verbindung zum Archive wurde unterbrochen, alle Streams werden abgebrochen und liefern beim Aufruf der Methode DataStream.take() eine Exception.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_streamedArchiveRequester

StreamedArchiveRequester _streamedArchiveRequester

_archiveRequestID

private final ArchiveQueryID _archiveRequestID
Dieses Objekt identifiziert die Archivanfrage eindeutig.


_arrayOfStreams

private DataStream[] _arrayOfStreams
Hier werden alle streams, die zu einer Archivanfrage gehören, gespeichert. Das Array wird mit null initialisiert, es bekommt erst dann die Streams, sobald das Archiv bereit ist Nutzdaten zu verschicken.


_priority

private final ArchiveQueryPriority _priority

_spec

private final List _spec
ArchiveDataSpecification einer Anfrage in einer Liste speichern


_streamDemultiplexer

private StreamDemultiplexer _streamDemultiplexer

_numberOfStreams

private final int _numberOfStreams
Wieviele Streams gehören zu der Archivanfrage. Jedes Objekt der Anfrage besitzt einen Stream.


_numberOfFinishedStreams

private int _numberOfFinishedStreams
Diese Variable speichert, wie viele Streams bisher beendet wurden, entweder durch empfang des null-Pakets oder durch abort. Ist der Wert der Variablen gleich _numberOfStreams kann die Verbindung zum Archiv beendet werden.


_receiveBufferSize

private final int _receiveBufferSize
Diese Variable bestimmt die Größe des Empfangspuffers (StreamDemultiplexer). Die Größe wird in Bytes angegben. Der Wert "0" ist der default Wert. Das bedeutet, dass das Archiv die Größe des Empfangspuffers festlegt. Der Defaultwert ist in der Konfiguration gespeichert und wird dort vom Archiv angefordert. Soll ein anderer Wert benutzt werden, so kann dieser mit StreamedArchiveRequester.setReceiveBufferSize(int) gesetzt werden, für diese Anfrage ist der Wert allerdings konstant.


_requestSuccessful

private boolean _requestSuccessful
Konnte die Anfrage zum Archiv durchgeführt werden


_errorMessage

private String _errorMessage
Falls es zu einem Fehler gekommen ist, zu welchem.


_blocking

private boolean _blocking
Solange diese Variable true ist, werden alle Anfragen an die Query blockiert da das Archiv noch nicht geantwortet hat. Erst wenn das Archiv zum ersten mal eine Nachricht zu der Anfrage geschickt hat, darf weiter gearbeitet werden.


_blockingFactor

private int _blockingFactor
Bestimmt den blockingFactor des StreamDemultiplexers. Dieser wird vom Archiv gesetzt (ist in der Antwort des Archivs, auf die Archivanfrage, enthalten)


_debug

private static final Debug _debug
DebugLogger für Debug-Ausgaben


_defaultSimulationVariant

private final short _defaultSimulationVariant
Constructor Detail

Query

public Query(ArchiveQueryID archiveRequestID,
             ArchiveQueryPriority priority,
             ArchiveDataSpecification spec,
             int receiveBufferSize,
             StreamedArchiveRequester streamedArchiveRequester,
             short defaultSimulationVariant)
Archivanfrage mit einem Objekt

Parameters:
archiveRequestID - eindeutige Identifizierung der Anfrage, diese wird benötigt um Archivantworten an das Objekt weiterzuleiten
priority - Priorität der Anfrage
spec - Archivanfrage
receiveBufferSize - Größe des Empfangspuffers (in Byte)
streamedArchiveRequester - Objekt über das Archivanfragen verschickt werden können
defaultSimulationVariant - Falls keine Simulationsvariante gesetzt wurde wird dieser Wert als default benutzt.

Query

public Query(ArchiveQueryID archiveRequestID,
             ArchiveQueryPriority priority,
             List spec,
             int receiveBufferSize,
             StreamedArchiveRequester streamedArchiveRequester,
             short defaultSimulationVariant)
Parameters:
archiveRequestID - eindeutige Identifizierung der Anfrage, diese wird benötigt um Archivantworten an das Objekt weiterzuleiten
priority - Priorität der Anfrage
spec - Archivanfrage
receiveBufferSize - Größe des Empfangspuffers (in Byte)
streamedArchiveRequester - Objekt über das Archivanfragen verschickt werden können
defaultSimulationVariant - Falls keine Simulationsvariante gesetzt wurde wird dieser Wert als default benutzt.
Method Detail

initiateArchiveRequest

public void initiateArchiveRequest()
Mit dieser Methode wird die initiale Archivanfrage verschickt.


isRequestSuccessful

public boolean isRequestSuccessful()
                            throws InterruptedException
Diese Methode blockiert solange, bis das Archiv auf die erste Archivanfrage geantwortet hat. In der Archivantwort wird dann geklärt, ob das Archiv die geforderten Nutzdaten zur Verfügung stellen kann (falls nicht, warum nicht).

Specified by:
isRequestSuccessful in interface ArchiveQueryResult
Returns:
true, falls das Archiv die Anfrage bearbeiten kann. false = das Archiv kann die Anfrage nicht bearbeiten, somit steht eine errorMessage zur Verfügung.
Throws:
InterruptedException - Falls der aufrufende Thread unterbrochen wurde, während auf die entsprechende Antwortnachricht aus dem Archivsystem gewartet wurde.

getErrorMessage

public String getErrorMessage()
                       throws InterruptedException
Description copied from interface: ArchiveQueryResult
Bestimmt eine Fehlernachricht, falls die entsprechende Archivanfrage nicht erfolgreich war.

Specified by:
getErrorMessage in interface ArchiveQueryResult
Returns:
Fehlernachricht, wenn die entsprechende Archivanfrage nicht erfolgreich, sonst leerer String.
Throws:
InterruptedException - Falls der aufrufende Thread unterbrochen wurde, während auf die entsprechende Antwortnachricht aus dem Archivsystem gewartet wurde.

getStreams

public ArchiveDataStream[] getStreams()
                               throws IllegalStateException,
                                      InterruptedException
Diese Methode gibt alle Streams, die zu einer Archivanfrage gehören, zurück. Die geforderten Archivdaten liegen in den Stream bereit und können mit der entsprechenden Methode angefordert werden.

Specified by:
getStreams in interface ArchiveDataQueryResult
Returns:
Alle Streams, die zu einer Archivanfrage gehören
Throws:
IllegalStateException - Die Archivanfrage konnte nicht vom Archiv bearbeitet werden, somit durfte diese Methode nicht aufgerufen werden
InterruptedException - Falls der aufrufende Thread unterbrochen wurde, während auf die entsprechende Antwortnachricht aus dem Archivsystem gewartet wurde.
See Also:
ArchiveRequestManager.request(ArchiveQueryPriority,ArchiveDataSpecification), ArchiveRequestManager.request(ArchiveQueryPriority, java.util.List)

initiateArchiveResponse

public void initiateArchiveResponse(byte[] queryResponse)
Diese Methode wird vom StreamedArchivRequester aufgerufen, sobald das Archiv auf die erste Archivanfrage eines Auftrags antwortet. Diese Antwort bedeutet, dass die Anfrage bearbeitet werden kann oder das ein Fehler aufgetreten ist.

Parameters:
queryResponse - Die Antwort des Archivs, die Informationen im byte-Array codiert

archiveDataResponse

public void archiveDataResponse(byte[] data)
Diese Methode verwaltet Nutzdaten, die für eine Archivanfrage empfangen wurden.

Parameters:
data - Nutzdaten für eine Archivanfrage

countFinishedStream

void countFinishedStream()
Diese Methode wird von einem Objekt der Klasse Query aufgerufen sobald der Stream des Objekts ein null-Paket empfängt oder die Empfängerapplikation abort aufruft. Das null-Paket bedeutet, dass das Archiv für diesen Stream keine Archivdaten mehr zur Verfügung hat. Der Aufruf von abort bedeutet, dass die Empfängeraplikation keine Archivdaten für diesen Stream mehr benötigt.

Sobald alle Streams ein null-Paket empfangen haben oder mit abort beendet wurden, wird das Objekt aus der Hashtable entfernt. TBD name schlecht gewählt, da im zweifelsfall die connection abgebaut wird, hier nicht nicht nur gezählt


killAllStreams

void killAllStreams()
Diese Methode benachrichtigt den StreamDemultiplexer, dass ein Fehler aufgetreten ist und das alle Streams beendet werden müssen. Jeder aufruf der take-Methode liefert eine entsprechende Exception.


lostArchive

public void lostArchive()
Die Verbindung zum Archive wurde unterbrochen, alle Streams werden abgebrochen und liefern beim Aufruf der Methode DataStream.take() eine Exception.


getArchiveRequestID

public ArchiveQueryID getArchiveRequestID()
Die Rückgabe identifiziert eine Archivanfrage.

Returns:
Eindeutige Identifikation einer Archivanfrage