de.bsvrz.dav.daf.main.impl
Class SubscriptionManager

java.lang.Object
  extended by de.bsvrz.dav.daf.main.impl.SubscriptionManager

public class SubscriptionManager
extends Object

Verwaltung der Sende- und Empfangsanmeldungen der Datenverteiler-Applikationsfunktionen

Diese interne Subkomponente SubscriptionManager ist für die An und Abmeldungen zuständig. Sie startet beim Aufruf die notwendigen Anmeldungen für die gerichtete Kommunikation zwischen Applikation und Konfiguration oder Archiv. Sie bietet Methoden, um Anmeldungen und Abmeldungen, als Empfänger, Senke, Sender oder Quelle, über die Protokollsteuerung DaVDAF, beim Datenverteiler durchzuführen. Die Anmeldungen werden hier verwaltet, so dass keine doppelten Anmeldungen der gleichen Daten beim Datenverteiler existieren. Weiterhin bietet sie Methoden, um Daten, über die Protokollsteuerung DaV-DAF, zum Datenverteiler zu senden. Die zu sendenden Datensätze werden mit dem passenden Datensatzindex2 versehen (alter Datensatzindex + 1). Falls eine Empfangsanmeldung auch Archivdaten verlangt, werden die Anfrage aktueller Daten und die Archivanfrage so gesteuert, dass keine Lücken entstehen. Sie wird vom Cache-Manager benachrichtigt, falls neue Daten angekommen sind. Diese werden dann in eine Tabelle eingefügt. Diese wird von einem Aktualisierungsthread zyklisch entleert, und die Daten werden an den Interessenten weitergeleitet. Durch die zyklische en-bloc- Bearbeitung der in der Tabelle aufgelaufenen Daten erreicht man eine bessere Durchsatzrate im Vergleich zur Einzelbearbeitung der Datensätze.

Alle Sende und Empfangsanmeldungen werden in entsprechenden Hashtables gespeichert. Ein Thread leitet empfangene Telegramme an die entsprechenden angemeldeten Empfänger weiter.

Author:
Kappich Systemberatung

Nested Class Summary
(package private)  class SubscriptionManager.DataDeliveryThread
           
 
Field Summary
private  long _applicationId
          Die Id der Applikation
private  CacheManager _cacheManager
          Der Cachemanager
private  ConfigurationManager _configurationManager
          Der Konfigurationsmanager
private  boolean _configurationReadRequestConfirmed
          Signalisiert, dass die Konfigurationsanfrage zum Lesen vom Datenverteiler bestätigt wurde
private  boolean _configurationWriteRequestConfirmed
          Signalisiert, dass die Konfigurationsanfrage zum Schreiben vom Datenverteiler bestätigt wurde
private  ClientDavParameters _dafParameters
          Die Parameter der Datenverteiler-Applikationsfunktionen
private  SubscriptionManager.DataDeliveryThread _dataDeliveryThread
          Der Thread, der empfangene Datensätze an die angemeldeten Empfänger weiterleitet.
private static Debug _debug
          Debuglogger
private  ClientHighLevelCommunication _highLevelCommunication
          Die höhere Ebene der Kommunikation
private  boolean _initialisationComplete
          Signalisiert, dass die Initialisierung fertig ist
private  long _localConfigurationId
          Der ID des lokalen Konfigurationsverantwortlichen
private  CollectingReceiverManager _receiverManager
          Verwaltung der angemeldeten Receiver
private  Hashtable _receiverObjectTable
          Eine Tabelle wo die Empfangsanmeldungen und deren Informationen gehalten werden
private  Hashtable _senderObjectTable
          Eine Tabelle wo die Sendeanmeldungen und deren Informationen gehalten werden
 
Constructor Summary
SubscriptionManager(ClientDavParameters dafParameters)
           
 
Method Summary
(package private)  void actualDataUpdate(CachedObject cachedObject)
          Diese Methode wird von Cache-Manager aufgerufen, wenn aktuelle Daten empfangen wurden.
private  boolean checkATGUsage(DataDescription dataDescription, ReceiverRole receiverRole)
          Prüft, ob eine Anmeldung als Senke/Empfänger laut der benutzten ATG-Verwendung erlaubt ist.
private  boolean checkATGUsage(DataDescription dataDescription, SenderRole senderRole)
           
 void close()
          Schließt diese Subkomponente und terminiert den Aktualisierungsthread.
 void completeInitialisation()
          Initialisierung der Anmeldungsverwaltung.
 ClientHighLevelCommunication getHighLevelCommunication()
          Bestimmt die Kommunikationsschicht von der der SubscriptionManager abhängig ist
(package private)  long getSendDataIndex(BaseSubscriptionInfo info)
          Gibt der Index der Sendung der gegebene Anmeldungsinformation zurück.
(package private)  long getTimeInCache(BaseSubscriptionInfo info)
          Gibt die Verweilzeit eines Datums im Cache zurück
 boolean isInitialisationComplete()
          Überprüft, ob die notwendigen Anmeldungen einer gerichtete Kommunikation durch die Konfiguration erfolgt sind oder nicht.
private  boolean isOnlineUsage(AttributeGroupUsage.Usage usage)
          Prüft ob es sich um eine Anmeldung auf Onlinedaten handelt.
 void notifySenderApplication(BaseSubscriptionInfo info, byte state)
          Wenn eine Sendeanmeldung mit aktivierter Benachrichtigungsoption vorliegt, dann wird ihr über diese Methode mitgeteilt, welche Aktion von ihr durchzuführen ist.
 void sendData(ResultData result)
          Sendet einen Ergebnisdatensatz zum Datenverteiler.
(package private)  void sendData(SendDataObject sendData)
          Sendet eine Konfigurationsanfrage zum Datenverteiler.
(package private)  void setCacheManager(CacheManager cacheManager)
          Setzt den CacheManager dieser Subkomponente.
(package private)  void setConfigurationManager(ConfigurationManager configurationManager)
          Setzt den ConfigurationManager dieser Subkomponente und benachrichtigt die Protokollsteuerung DaV-DAF über die Bereitschaft, Konfigurationsdaten zu empfangen.
 void setHighLevelCommunication(ClientHighLevelCommunication highLevelCommunication)
          Setzt die ClientHighLevelCommunication-Subkomponente um Anmeldungen, Abmeldungen und Datensätze an den Datenverteiler weiterzuleiten.
 void subscribeReceiver(ClientReceiverInterface receiver, SystemObject[] objects, DataDescription dataDescription, ReceiveOptions options, ReceiverRole role, long cacheTime)
          Anmeldung zum Empfangen von Daten.
private  void subscribeReceiver(ReceiverSubscription receiverSubscription)
          Anmeldung zum Empfangen von Daten für eine Datenidentifikation.
 void subscribeSender(ClientSenderInterface sender, SystemObject[] objects, DataDescription dataDescription, SenderRole role)
          Anmeldung zum Senden von Daten.
private  Aspect substituteToAspect(AttributeGroup attributeGroup, Aspect aspect)
          Realisiert eine Aspektumleitung, sofern dies über entsprechende Aufrufargumente der Applikation vorgegeben wurde.
 void unsubscribeReceiver(ClientReceiverInterface receiver, SystemObject[] objects, DataDescription dataDescription)
          Abmeldung von angemeldeten Daten.
 void unsubscribeSender(ClientSenderInterface sender, SystemObject[] objects, DataDescription dataDescription)
          Abmeldung von angemeldeten Daten.
 
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


_senderObjectTable

private Hashtable _senderObjectTable
Eine Tabelle wo die Sendeanmeldungen und deren Informationen gehalten werden


_receiverObjectTable

private Hashtable _receiverObjectTable
Eine Tabelle wo die Empfangsanmeldungen und deren Informationen gehalten werden


_cacheManager

private CacheManager _cacheManager
Der Cachemanager


_configurationManager

private ConfigurationManager _configurationManager
Der Konfigurationsmanager


_highLevelCommunication

private ClientHighLevelCommunication _highLevelCommunication
Die höhere Ebene der Kommunikation


_dafParameters

private ClientDavParameters _dafParameters
Die Parameter der Datenverteiler-Applikationsfunktionen


_applicationId

private long _applicationId
Die Id der Applikation


_localConfigurationId

private long _localConfigurationId
Der ID des lokalen Konfigurationsverantwortlichen


_initialisationComplete

private boolean _initialisationComplete
Signalisiert, dass die Initialisierung fertig ist


_configurationReadRequestConfirmed

private boolean _configurationReadRequestConfirmed
Signalisiert, dass die Konfigurationsanfrage zum Lesen vom Datenverteiler bestätigt wurde


_configurationWriteRequestConfirmed

private boolean _configurationWriteRequestConfirmed
Signalisiert, dass die Konfigurationsanfrage zum Schreiben vom Datenverteiler bestätigt wurde


_dataDeliveryThread

private SubscriptionManager.DataDeliveryThread _dataDeliveryThread
Der Thread, der empfangene Datensätze an die angemeldeten Empfänger weiterleitet.


_receiverManager

private CollectingReceiverManager _receiverManager
Verwaltung der angemeldeten Receiver

Constructor Detail

SubscriptionManager

public SubscriptionManager(ClientDavParameters dafParameters)
Parameters:
dafParameters - Startparameter der Verbindung
Method Detail

setHighLevelCommunication

public final void setHighLevelCommunication(ClientHighLevelCommunication highLevelCommunication)
Setzt die ClientHighLevelCommunication-Subkomponente um Anmeldungen, Abmeldungen und Datensätze an den Datenverteiler weiterzuleiten. Diese interne Methode wird von der ClientHighLevelCommunication während der Initialisierungsphase aufgerufen, um die interne Kommunikation zwischen beiden Subkomponenten zu gewährleisten.

Parameters:
highLevelCommunication - Referenz auf die zu setzende Kommunikationsschicht

getHighLevelCommunication

public final ClientHighLevelCommunication getHighLevelCommunication()
Bestimmt die Kommunikationsschicht von der der SubscriptionManager abhängig ist

Returns:
Die Kommunikationsschicht.

completeInitialisation

public final void completeInitialisation()
Initialisierung der Anmeldungsverwaltung. Diese Methode wird nach erfolgreicher Authentifizierung beim Datenverteiler aufgerufen und meldet sich auf Konfigurationsanfragen und -antworten an.

Für alle Applikationen außer der Konfiguration sorgt diese Methode für die Anmeldung als Sender von Lese- und Schreibkonfigurationsanfragen und als Senke für Lese- und Schreibkonfigurationsantworten, um eine gerichtete Kommunikation mit der Konfiguration zu gewährleisten. Diese Methode wird von ClientDavConnection aufgerufen.


isInitialisationComplete

public final boolean isInitialisationComplete()
Überprüft, ob die notwendigen Anmeldungen einer gerichtete Kommunikation durch die Konfiguration erfolgt sind oder nicht.

Returns:
true wenn die Initialisierungsphase abgeschlossen ist; sonst false

setCacheManager

final void setCacheManager(CacheManager cacheManager)
Setzt den CacheManager dieser Subkomponente. Diese interne Methode wird während der Initialisierungsphase vom CacheManager aufgerufen, um die interne Kommunikation zwischen beiden Subkomponenten zu gewährleisten.

Parameters:
cacheManager - Referenz auf den zu setzenden Cachemanager

setConfigurationManager

final void setConfigurationManager(ConfigurationManager configurationManager)
Setzt den ConfigurationManager dieser Subkomponente und benachrichtigt die Protokollsteuerung DaV-DAF über die Bereitschaft, Konfigurationsdaten zu empfangen. Diese interne Methode wird während der Initialisierungsphase vom ConfigurationManager aufgerufen, um die interne Kommunikation zwischen beiden Subkomponenten zu gewährleisten.

Parameters:
configurationManager - Referenz auf den zu setzenden Konfigurationsmanager

substituteToAspect

private final Aspect substituteToAspect(AttributeGroup attributeGroup,
                                        Aspect aspect)
Realisiert eine Aspektumleitung, sofern dies über entsprechende Aufrufargumente der Applikation vorgegeben wurde. Gibt den Originalaspekt eines ersetzten Aspekts einer Attributgruppe zurück. Wenn keine entsprechende Aspektumleitung besteht, wird der übergebene Aspekt unverändert zurückgegeben.

Parameters:
attributeGroup - Umzuleitende Attributgruppe.
aspect - Ersetzer Aspekt.
Returns:
Originalaspekt eines ersetzenden Aspekts. Wenn keine Aspektumleitung besteht, wird der übergebene Aspekt unverändert zurückgegeben.

subscribeReceiver

private final void subscribeReceiver(ReceiverSubscription receiverSubscription)
                              throws DataNotSubscribedException
Anmeldung zum Empfangen von Daten für eine Datenidentifikation.

Parameters:
receiverSubscription - Anmeldeinformationen
Throws:
DataNotSubscribedException

subscribeReceiver

public final void subscribeReceiver(ClientReceiverInterface receiver,
                                    SystemObject[] objects,
                                    DataDescription dataDescription,
                                    ReceiveOptions options,
                                    ReceiverRole role,
                                    long cacheTime)
Anmeldung zum Empfangen von Daten. Mit der Anmeldung wird von der Applikation ein Objekt bereitgestellt, daß bei nachfolgenden Aktualisierungen der Daten entsprechend benachrichtigt wird.

Parameters:
receiver - Ein von der Applikation bereitzustellendes Objekt, das bei Aktualisierungen entsprechende Methodenaufrufe erhält.
objects - Liste mit System-Objekten für die die spezifizierten Daten anzumelden sind.
dataDescription - Beschreibende Informationen zu den anzumeldenden Daten.
options - Für die Anmeldung zu verwendende Optionen.
role - Für die Anmeldung zu verwendende Rolle (Empfänger oder Senke).
cacheTime - Vorhaltezeitraum in Millisekunden. Der Vorhaltezeitraum spezifiziert, wie lange empfangene Daten zwischengespeichert werden sollen.
Throws:
IllegalArgumentException - Die angegebene ReceiverRole verstößt gegen die Attributgruppenverwendung.

checkATGUsage

private boolean checkATGUsage(DataDescription dataDescription,
                              ReceiverRole receiverRole)
Prüft, ob eine Anmeldung als Senke/Empfänger laut der benutzten ATG-Verwendung erlaubt ist.

Eine Ausnahme bildet eine "Testverbindung", eine Testverbidnung darf Datenidentifikationen anmelden, die bei normalen Verbindungen nicht erlaubt sind.

Parameters:
dataDescription - Datenidentifikation, mit der angemeldet werden soll.
receiverRole - Rolle, mit der angemeldet werden soll.
Returns:
true = Die übergebene Datenidentifikation und die übergebene Rolle sind korrekt oder es handelt sich um eine Testverbindung; false = Die Senderolle verstößt gegen die ATG-Verwendung
Throws:
IllegalArgumentException - Es sollen Konfigurationsdaten angemeldet werden. Dies ist immer verboten.

checkATGUsage

private boolean checkATGUsage(DataDescription dataDescription,
                              SenderRole senderRole)

isOnlineUsage

private boolean isOnlineUsage(AttributeGroupUsage.Usage usage)
Prüft ob es sich um eine Anmeldung auf Onlinedaten handelt.

Parameters:
usage - Verwendete ATG-Usage
Returns:
true = Es handelt sich auf eine Anmeldung auf Onlinedaten; false = Es ist eine Anfrage auf Konfigurationsdaten
See Also:
AttributeGroupUsage.Usage#OnlineDataAsSenderDrain, AttributeGroupUsage.Usage#OnlineDataAsSourceReceiver, AttributeGroupUsage.Usage#OnlineDataAsSourceReceiverOrSenderDrain

unsubscribeReceiver

public final void unsubscribeReceiver(ClientReceiverInterface receiver,
                                      SystemObject[] objects,
                                      DataDescription dataDescription)
Abmeldung von angemeldeten Daten. Die Methode macht eine mit der Methode subscribeReceiver(de.bsvrz.dav.daf.main.impl.subscription.ReceiverSubscription) durchgeführte Empfangsanmeldung wieder rückgängig.

Parameters:
receiver - Das Anwendungsobjekt, das bei der Anmeldung benutzt wurde.
objects - Feld mit System-Objekten für die die spezifizierten Daten abzumelden sind.
dataDescription - Beschreibende Informationen zu den abzumeldenden Daten.

subscribeSender

public final void subscribeSender(ClientSenderInterface sender,
                                  SystemObject[] objects,
                                  DataDescription dataDescription,
                                  SenderRole role)
                           throws OneSubscriptionPerSendData
Anmeldung zum Senden von Daten.

Parameters:
sender - Applikationsobjekt zur Verarbeitung von Sendesteuerungen
objects - Feld mit System-Objekten für die spezifizierten Daten anzumelden sind.
dataDescription - Beschreibende Informationen zu den anzumeldenden Daten.
role - Für die Anmeldung zu verwendende Rolle (Quelle oder Sender).
Throws:
IllegalArgumentException - Die SenderRole verstößt gegen die Attributgruppenverwendung
OneSubscriptionPerSendData - Wenn bereits eine lokale Sendeanmeldung für diese Datenidentifikation vorhanden ist

unsubscribeSender

public final void unsubscribeSender(ClientSenderInterface sender,
                                    SystemObject[] objects,
                                    DataDescription dataDescription)
Abmeldung von angemeldeten Daten. Die Methode macht eine mit der Methode subscribeSender(de.bsvrz.dav.daf.main.ClientSenderInterface, de.bsvrz.dav.daf.main.config.SystemObject[], de.bsvrz.dav.daf.main.DataDescription, de.bsvrz.dav.daf.main.SenderRole) durchgeführte Sendeanmeldung wieder rückgängig.

Parameters:
sender - Das Anwendungsobjekt, das bei der Anmeldung benutzt wurde.
objects - Feld mit System-Objekten für die die spezifizierten Daten abzumelden sind.
dataDescription - Beschreibende Informationen zu den abzumeldenden Daten.

sendData

final void sendData(SendDataObject sendData)
             throws DataNotSubscribedException
Sendet eine Konfigurationsanfrage zum Datenverteiler. Die Daten müssen vorher mit einer Sendeanmeldung angemeldet worden sein.

Parameters:
sendData - Zu sendender Datensatz.
Throws:
DataNotSubscribedException - Wenn die Daten nicht zum Senden angemeldet waren.

sendData

public final void sendData(ResultData result)
                    throws DataNotSubscribedException,
                           SendSubscriptionNotConfirmed
Sendet einen Ergebnisdatensatz zum Datenverteiler. Die Daten müssen vorher mit einer Sendeanmeldung angemeldet worden sein.

Parameters:
result - Ergebnis mit dem zu sendenden Datensatz.
Throws:
DataNotSubscribedException - Wenn die Daten nicht zum Senden angemeldet waren.
SendSubscriptionNotConfirmed - Wenn die Sendesteuerung abgewartet werden muss, bevor gesendet werden kann.

notifySenderApplication

public void notifySenderApplication(BaseSubscriptionInfo info,
                                    byte state)
Wenn eine Sendeanmeldung mit aktivierter Benachrichtigungsoption vorliegt, dann wird ihr über diese Methode mitgeteilt, welche Aktion von ihr durchzuführen ist. Es gibt folgende mögliche Aktionen: o Sendung starten. o Sendung anhalten. o Sendung anhalten (Grund: keine Rechte vorhanden). o Sendung anhalten (Grund: mehrere Quellen vorhanden). Wenn eine Sendung wegen mehrerer vorhandener Quellen angehalten werden muss, wird der zugehörige Vermerk der Anmeldung aus dem Anmelde-Manager entfernt. Die Nachricht wird durch den Aufruf der ClientSenderInterface-Methode dataRequest(SystemObject object, DataDescription dataDescription, byte state) zum Sender weitergeleitet: Auch die Sendeanmeldungen der Konfiguration wird hierdurch bestätigt. So wird ersichtlich, ob eine Konfiguration im System vorhanden ist.

Parameters:
info - Anmeldeinfo, auf die sich die Sendesteuerung bezieht
state - Zustand der Sendesteuerung

getTimeInCache

long getTimeInCache(BaseSubscriptionInfo info)
Gibt die Verweilzeit eines Datums im Cache zurück

Parameters:
info - Anmeldeinfo, zu der die Verweilzeit bestimmt werden soll.
Returns:
Verweilzeit in Millisekunden

actualDataUpdate

void actualDataUpdate(CachedObject cachedObject)
                throws InterruptedException
Diese Methode wird von Cache-Manager aufgerufen, wenn aktuelle Daten empfangen wurden. Wenn eine entsprechende Empfangsanmeldung für diese Daten vorliegt, dann wird der zugehörige Repräsentant darüber benachrichtigt. Die Daten werden an angemeldete Empfänger weitergeleitet. Vorher wird der ursprüngliche bei der Anmeldung verwendete Aspekt wiederhergestellt, falls dieser umgeleitet wurde.

Parameters:
cachedObject - Empfangener Datensatz.
Throws:
InterruptedException - Wenn der Thread während eines blockierenden Aufrufs unterbrochen wurde

getSendDataIndex

final long getSendDataIndex(BaseSubscriptionInfo info)
Gibt der Index der Sendung der gegebene Anmeldungsinformation zurück. Der Index startet immer mit 1 und wird bei jeder Abfrage um 1 erhöht und wenn es 0x3FFFFFFF erreicht hat, dann fängt es wieder bei 1 an.

Parameters:
info - Anmeldeinformationen der Sendung
Returns:
der Index der Sendung

close

public final void close()
Schließt diese Subkomponente und terminiert den Aktualisierungsthread.