de.bsvrz.dav.daf.main.impl.config.request.telegramManager
Class AbstractSenderReceiverCommunication

java.lang.Object
  extended by de.bsvrz.dav.daf.main.impl.config.request.telegramManager.AbstractSenderReceiverCommunication
All Implemented Interfaces:
SenderReceiverCommunication
Direct Known Subclasses:
ConfigurationRequestArea, ConfigurationRequestReadData, ConfigurationRequestUserAdministration, ConfigurationRequestWriteData

public abstract class AbstractSenderReceiverCommunication
extends Object
implements SenderReceiverCommunication

Bietet eine Kommunikation mit einem Sender und einer Senke. Der Sender verschickt Aufträge, die Antworten auf diese Aufträge werden dann durch die Quelle empfangen.

Author:
Kappich Systemberatung

Nested Class Summary
private  class AbstractSenderReceiverCommunication.AnswerReceiver
          Receiverklasse, die Anworten der Konfiguration verarbeitet
static interface AbstractSenderReceiverCommunication.DataListener
          Dieses Interface ermöglich es Daten, die durch eine Instanz der Klasse AbstractSenderReceiverCommunication empfangen wurde, zu verarbeiten, bevor diese durch den normalen Mechanismus bearbeitet werden.
private  class AbstractSenderReceiverCommunication.RequestSender
          Callback-Klasse für Sendeanmeldung der Anfragen
 
Nested classes/interfaces inherited from interface de.bsvrz.dav.daf.main.impl.config.request.telegramManager.SenderReceiverCommunication
SenderReceiverCommunication.ConnectionState
 
Field Summary
private  boolean _closed
          Wird auf true gesetzt, wenn die Verbindung zum Datenverteiler geschlossen wurde
private  ClientDavInterface _connection
           
private  SenderReceiverCommunication.ConnectionState _connectionState
           
private  AbstractSenderReceiverCommunication.DataListener _dataListener
          Objekt, das Telegramm verarbeiten kann und dieses dann aus dem Strom der Telegramme entfernen kann.
private  DataState _dataStateReceiver
          Beschreibt ob der Empfänger für Antworten für Konfigurationsanfragen diese Antworten auch empfangen darf.
private static Debug _debug
          DebugLogger für Debug-Ausgaben
private  Object _monitor
           
private  ClientReceiverInterface _receiver
           
private  SystemObject _receiverObject
           
private  List<Data> _replyList
          Hier werden die Antworten von der Konfiguration abgelegt, die dann zur weiteren Verarbeitung von der Methode "waitForReply" wieder herausgenommen werden.
private  DataDescription _requestDescription
          Für Anfragen
private  ClientSenderInterface _requester
           
private  int _requestIndex
           
private  DataDescription _responseDescription
          Für Antworten, kann null bleiben, wenn keine Antworten benötigt werden
private  SystemObject _senderObject
           
private  boolean _subscribeReceiver
           
 
Constructor Summary
protected AbstractSenderReceiverCommunication(ClientDavInterface connection, SystemObject senderObject, SystemObject ordererObject)
           
 
Method Summary
 void close()
          Schließt alle geöffneten Verbindungen und beendet mögliche Threads
private  Data createRequestData(String messageType, byte[] message, int requestIndex)
           
 SenderReceiverCommunication.ConnectionState getConnectionState()
          Diese Methode gibt den derzeitigen Zustand einer Anmeldung als Sender/Quelle wieder.
 void handleReply(Data data)
           
 void init(AttributeGroup requestAtg, Aspect requestAspect, AttributeGroup responseAtg, Aspect responseAspect, AbstractSenderReceiverCommunication.DataListener dataListener)
          Meldet einen Sender und eine Senke auf die übergebenen Parameter an, wenn alle vier Parameter gesetzt sind.
 void init(AttributeGroup requestAtg, Aspect requestAspect, AttributeGroup responseAtg, Aspect responseAspect, short simulationVariant, AbstractSenderReceiverCommunication.DataListener dataListener)
          Meldet einen Sender und eine Senke auf die übergebenen Parameter an, wenn alle vier Parameter gesetzt sind.
 int sendData(String messageType, byte[] data)
          Verschickt eine Anfrage vom angegeben Typ und mit dem in einem Byte Array angegebenen serialisierten Inhalt, die Methode gibt ohne zu blockieren eine neue Anfragenummer zurück.
 void sendData(String messageType, byte[] data, int queryIndex)
          Verschickt eine Antwort vom angegeben Typ zu einer Anfrage.
 void setMutableCollectionChangeListener(MutableCollectionChangeListener notifyingMutableCollectionChangeListener)
          Setzt den Listener zur Verarbeitung und Verteilung von Aktualisierungsnachrichten bzgl. Defaultimplementierung erzeugt eine Exception.
 Data waitForReply(int reqestIndex)
          Stellt die Antwort auf eine Anfrage zur Verfügung
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_debug

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


_connection

private final ClientDavInterface _connection

_senderObject

private final SystemObject _senderObject

_receiverObject

private final SystemObject _receiverObject

_dataListener

private AbstractSenderReceiverCommunication.DataListener _dataListener
Objekt, das Telegramm verarbeiten kann und dieses dann aus dem Strom der Telegramme entfernen kann. Ist das Objekt null, werden die Telegramme normal durch diese Klasse bearbeitet.


_dataStateReceiver

private DataState _dataStateReceiver
Beschreibt ob der Empfänger für Antworten für Konfigurationsanfragen diese Antworten auch empfangen darf. Dürfen keine antworten empfangen werden, weil die Rechte nicht gesetzt wurde, so darf auch keine Anfrage gesendet werden (da die Antwort der Konfigurations niemals empfangen werden könnte und ewig auf die Antwort gewartet werden würde).

Der default DataState.DATA ist zufällig gewählt und muss nur ungleich DataState.NO_RIGHTS sein.


_requestDescription

private DataDescription _requestDescription
Für Anfragen


_responseDescription

private DataDescription _responseDescription
Für Antworten, kann null bleiben, wenn keine Antworten benötigt werden


_monitor

private final Object _monitor

_requestIndex

private int _requestIndex

_connectionState

private SenderReceiverCommunication.ConnectionState _connectionState

_subscribeReceiver

private boolean _subscribeReceiver

_replyList

private List<Data> _replyList
Hier werden die Antworten von der Konfiguration abgelegt, die dann zur weiteren Verarbeitung von der Methode "waitForReply" wieder herausgenommen werden.


_closed

private boolean _closed
Wird auf true gesetzt, wenn die Verbindung zum Datenverteiler geschlossen wurde


_requester

private ClientSenderInterface _requester

_receiver

private ClientReceiverInterface _receiver
Constructor Detail

AbstractSenderReceiverCommunication

protected AbstractSenderReceiverCommunication(ClientDavInterface connection,
                                              SystemObject senderObject,
                                              SystemObject ordererObject)
Parameters:
connection - Verbindung zum DaV
senderObject - Objekt, zum anmelden für Sendeaufträge
ordererObject - Objekt, zum anmelden als Senke (siehe init(de.bsvrz.dav.daf.main.config.AttributeGroup, de.bsvrz.dav.daf.main.config.Aspect, de.bsvrz.dav.daf.main.config.AttributeGroup, de.bsvrz.dav.daf.main.config.Aspect, de.bsvrz.dav.daf.main.impl.config.request.telegramManager.AbstractSenderReceiverCommunication.DataListener)). Dieses Objekt wird beim versenden auch als "Absender" eingetragen. Dadurch weiss die Empfangende Applikation (senderObjekt), wohin die Antwort muss(wenn eine Senke angemeldet wurde) bzw. wer die Antwort verschickt hat.
Method Detail

init

public void init(AttributeGroup requestAtg,
                 Aspect requestAspect,
                 AttributeGroup responseAtg,
                 Aspect responseAspect,
                 AbstractSenderReceiverCommunication.DataListener dataListener)
          throws OneSubscriptionPerSendData
Meldet einen Sender und eine Senke auf die übergebenen Parameter an, wenn alle vier Parameter gesetzt sind. Als Simulationsvariante wird die beim starten der Applikation gesetzt Variante benutzt.

Sind die Parameter responseAtg und responseAspect null, wird keine Senke angemeldet sondern nur der Sender.

Parameters:
requestAtg - ATG für Anfrage (Anmeldung als Sender)
requestAspect - Aspekt für Anfragen (Anmeldung für Sender)
responseAtg - ATG für Antworten auf Anfragen (Anmeldung als Senke) oder null, wenn kein Senke angemeldet werden soll.
responseAspect - Aspekt für Antworten auf Anfragen (Anmeldung als Senke) oder null, wenn kein Senke angemeldet werden soll.
dataListener - Objekt, das Telegramme verarbeiten und diese dann aus dem Strom der Telegramme entfernen kann. Ist das Objekt null, werden die Telegramme nicht gefiltert und normal durch diese Klasse bearbeitet.
Throws:
OneSubscriptionPerSendData - Wenn bereits eine Senke für die gleichen Daten angemeldet wurde.

init

public void init(AttributeGroup requestAtg,
                 Aspect requestAspect,
                 AttributeGroup responseAtg,
                 Aspect responseAspect,
                 short simulationVariant,
                 AbstractSenderReceiverCommunication.DataListener dataListener)
          throws OneSubscriptionPerSendData
Meldet einen Sender und eine Senke auf die übergebenen Parameter an, wenn alle vier Parameter gesetzt sind. Die zu nutzende Simulationsvariante wird übergeben.

Sind die Parameter responseAtg und responseAspect null, wird keine Senke angemeldet sondern nur der Sender.

Parameters:
requestAtg - ATG für Anfrage (Anmeldung als Sender)
requestAspect - Aspekt für Anfragen (Anmeldung für Sender)
responseAtg - ATG für Antworten auf Anfragen (Anmeldung als Senke) oder null, wenn kein Senke angemeldet werden soll.
responseAspect - Aspekt für Antworten auf Anfragen (Anmeldung als Senke) oder null, wenn kein Senke angemeldet werden soll.
simulationVariant - Simulationsvariante, die zur Anmeldung benutzt werden soll
dataListener - Objekt, das Telegramme verarbeiten und diese dann aus dem Strom der Telegramme entfernen kann. Ist das Objekt null, werden die Telegramme nicht gefiltert und normal durch diese Klasse bearbeitet.
Throws:
OneSubscriptionPerSendData - Wenn bereits eine Senke für die gleichen Daten angemeldet wurde.

sendData

public int sendData(String messageType,
                    byte[] data)
             throws SendSubscriptionNotConfirmed,
                    IllegalStateException
Description copied from interface: SenderReceiverCommunication
Verschickt eine Anfrage vom angegeben Typ und mit dem in einem Byte Array angegebenen serialisierten Inhalt, die Methode gibt ohne zu blockieren eine neue Anfragenummer zurück. Die Antwort kann mit SenderReceiverCommunication.waitForReply(int) abgerufen werden.

Specified by:
sendData in interface SenderReceiverCommunication
Parameters:
messageType - Anfragetyp
data - Daten Serialiserte Anfragedaten.
Returns:
Index, der benötigt wird um die Antwort auf eine Anfrage zu abzufragen.
Throws:
SendSubscriptionNotConfirmed - Wenn noch keine positive Sendesteuerung vom Datenverteiler für die zu versendenden Daten vorliegt
IllegalStateException - Die Daten können versendet werden, aber die Antwort kann nicht empfangen werden, da für den empfang der Daten nicht die benötigten Rechte vorhanden sind. Aus diesem Grund werden die Daten nicht verschickt.

sendData

public void sendData(String messageType,
                     byte[] data,
                     int queryIndex)
              throws SendSubscriptionNotConfirmed,
                     IllegalStateException
Description copied from interface: SenderReceiverCommunication
Verschickt eine Antwort vom angegeben Typ zu einer Anfrage.

Specified by:
sendData in interface SenderReceiverCommunication
Parameters:
messageType - Antworttyp
data - Daten Serialiserte Anfragedaten.
queryIndex - Index der zugehörigen Anfrage
Throws:
SendSubscriptionNotConfirmed - Wenn noch keine positive Sendesteuerung vom Datenverteiler für die zu versendenden Daten vorliegt
IllegalStateException - Die Daten können versendet werden, aber die Antwort kann nicht empfangen werden, da für den empfang der Daten nicht die benötigten Rechte vorhanden sind. Aus diesem Grund werden die Daten nicht verschickt.

createRequestData

private Data createRequestData(String messageType,
                               byte[] message,
                               int requestIndex)

handleReply

public void handleReply(Data data)

waitForReply

public Data waitForReply(int reqestIndex)
                  throws RequestException
Description copied from interface: SenderReceiverCommunication
Stellt die Antwort auf eine Anfrage zur Verfügung

Specified by:
waitForReply in interface SenderReceiverCommunication
Parameters:
reqestIndex - Index, der bei der Methode SenderReceiverCommunication.sendData(java.lang.String, byte[]) als Rückgabeparameter zurückgegeben wurde
Returns:
Antwort auf eine Anfrage
Throws:
RequestException - Wenn die Kommunikation zum Datenverteiler unterbrochen wurde.

getConnectionState

public SenderReceiverCommunication.ConnectionState getConnectionState()
Description copied from interface: SenderReceiverCommunication
Diese Methode gibt den derzeitigen Zustand einer Anmeldung als Sender/Quelle wieder.

Specified by:
getConnectionState in interface SenderReceiverCommunication
Returns:
derzeitiger Zustand der Verbindung

close

public void close()
Description copied from interface: SenderReceiverCommunication
Schließt alle geöffneten Verbindungen und beendet mögliche Threads

Specified by:
close in interface SenderReceiverCommunication

setMutableCollectionChangeListener

public void setMutableCollectionChangeListener(MutableCollectionChangeListener notifyingMutableCollectionChangeListener)
Setzt den Listener zur Verarbeitung und Verteilung von Aktualisierungsnachrichten bzgl. Änderungen der Elemente von dynamischen Mengen bzw. dynamischen Typen. Defaultimplementierung erzeugt eine Exception.

Specified by:
setMutableCollectionChangeListener in interface SenderReceiverCommunication
Parameters:
notifyingMutableCollectionChangeListener -
Throws:
UnsupportedOperationException - Wenn die Methode nicht überschrieben wurde.