de.bsvrz.dav.dav.main
Class ListsManager

java.lang.Object
  extended by de.bsvrz.dav.dav.main.ListsManager
All Implemented Interfaces:
ListsManagerInterface

public class ListsManager
extends Object
implements ListsManagerInterface

Diese Klasse dient zur Verwaltung von Anmeldelistentelegrammen, die zwischen Datenverteilern zum Austausch von Informationen über angemeldete Objekte, Attributgruppen und Aspekte verwendet werden. Jeder Datenverteiler hält grobe Informationen über die vorliegenden Quell- und Senkenanmeldungen der Applikationen, die bei ihm angemeldet sind, vor. Diese Informationen werden zwischen den einzelnen Datenverteilern ausgetauscht, damit bei Anmeldungen von Daten direkt geprüft werden kann, ob diese Daten potentiell im System vorhanden sind und welche Datenverteiler als Zentraldatenverteiler in Frage kommen. Um das Datenaufkommen und die Anzahl der Aktualisierungen hier gering zu halten, werden die Anmeldungen nicht detailliert vorgehalten und weitergegeben, sondern es werden nur Änderungen zweier Listen gepflegt und verteilt: Die erste enthält die Objekte zu denen Quell- oder Senkenanmeldungen bestehen (Objektliste); die zweite Liste enthält die Attributgruppen/Aspekt-Kombinationen zu denen Quell- oder Senkenanmeldungen bestehen (Attributgruppenliste). Jeder Datenverteiler verwaltet für jeden von ihm erreichbaren Datenverteiler eine Anmeldungsliste.

Author:
Kappich Systemberatung

Nested Class Summary
private  class ListsManager.DelayedSubscriptionHandle
           
private  class ListsManager.DelayedSubscriptionThread
          TBD Beschreibung
private  class ListsManager.LocalSubscriptionInfos
           
private static class ListsManager.ReferenceCount
           
private  class ListsManager.TransmitterSubscriptionInfos
          Enthält die Anmeldungsliste eines erreichbaren Datenverteilers.
 
Field Summary
private  BestWayManagerInterface _bestWayManager
           
private  ConnectionsManagerInterface _connectionsManager
           
private static Debug _debug
           
private  ArrayList _delayedSubscriptionList
           
private  Object _delayedSubscriptionSync
           
private  ListsManager.DelayedSubscriptionThread _delayedSubscriptionThread
           
private  ListsManager.LocalSubscriptionInfos _localSubscriptionInfos
           
private  Object _localSubscriptionInfosSendLock
           
private  long _localTransmitterId
          Eigene Datenverteiler-Id
private  ListsManager.TransmitterSubscriptionInfos _localTransmitterSubscriptionInfos
           
private  Map<Long,ListsManager.TransmitterSubscriptionInfos> _subscriptionInfos
          Map mit den Anmeldelisten der bekannten Datenverteiler.
private static long DELAYED_SUBSCRIPTION_TIME_LIMIT
           
 
Constructor Summary
ListsManager(ConnectionsManagerInterface connectionsManager)
          Erzeugt ein neues Objekt mit den übergebenen Parametern.
 
Method Summary
 void addEntry(long delivererId, long transmitterId)
          Diese Methode wird von der Wegverwaltung aufgerufen, wenn ein Datenverteiler als erreichbar festgestellt wird.
(package private)  void addInfo(BaseSubscriptionInfo info)
          Neue Anmeldung beim lokalen Datenverteiler in die Anmeldelistenverwaltung aufnehmen.
private  void cleanPendingDelayedSubscriptions(long[] ids)
          Diese Methode entfernt die wartenden verzögerten Anmeldungen.
(package private)  void close()
          Diese Methode gibt die vom ListsManager beanspruchten Resourcen wieder frei.
 BestWayManagerInterface getBestWayManager()
          Getter für das Verwaltungsobjekt zur Bestimmung der günstigsten Wege.
(package private)  Thread getDelayedSubscriptionThread()
          Bestimmt den Thread, der für die verzögerte Durchführung von Anmeldungen zuständig ist.
(package private)  long[] getPotentialTransmitters(BaseSubscriptionInfo info)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die potentiellen Zentraldatenverteiler des spezifizierten Datums zu bestimmen.
 void handleDisconnection(long transmitterId)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Datenverteilerverbindung nicht mehr existiert.
 void handleWaysChanges(long[] changedTransmitterIds)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn sich neue günstigste Wege für bestimmte Datenverteiler ergeben haben.
(package private)  void removeInfo(BaseSubscriptionInfo info)
          Anmeldung beim lokalen Datenverteiler aus der Anmeldelistenverwaltung entfernen.
private  void sendTransmitterUpdates(T_T_HighLevelCommunicationInterface connection, long transmitterId, boolean update, List objToAdd, List objToRemove, List combiToAdd, List combiToRemove)
          * Diese Methode sendet die Aktualisierungstelegramme, welche die Ergänzungen und Löschungen der Listen beinhalten.
private  void sendTransmitterUpdates(T_T_HighLevelCommunicationInterface connection, long transmitterId, List<Long> objToAdd, List<Long> combiToAdd)
          Diese Methode sendet die Aktualisierungstelegramme, welche die Ergänzungen der Listen beinhalten.
 void setBestWayManager(BestWayManagerInterface bestWayManager)
          Setter für das Verwaltungsobjekt zur Bestimmung der günstigsten Wege.
(package private)  void subscribe(long transmitterId, long[] ids)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Anmeldung auf die Zuliefererinformationen eines bestimmten Datenverteilers eingetroffen ist.
(package private)  void unsubscribe(long transmitterId, long[] ids)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Abmeldung auf die Zuliefererinformationen eines bestimmten Datenverteilers eingetroffen ist.
(package private)  void unsubscribeDeliverer(long transmitterId, long[] ids)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Kündigung eines Zulieferers auf die Zuliefererinformationen eines bestimmten Datenverteilers eingetroffen ist.
(package private)  void updateEntry(TransmitterListsUpdate transmitterListsUpdate)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Zuliefereraktualisierung eintrifft.
 
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

_localTransmitterId

private long _localTransmitterId
Eigene Datenverteiler-Id


_subscriptionInfos

private final Map<Long,ListsManager.TransmitterSubscriptionInfos> _subscriptionInfos
Map mit den Anmeldelisten der bekannten Datenverteiler.


_localSubscriptionInfos

private final ListsManager.LocalSubscriptionInfos _localSubscriptionInfos

_localTransmitterSubscriptionInfos

private final ListsManager.TransmitterSubscriptionInfos _localTransmitterSubscriptionInfos

DELAYED_SUBSCRIPTION_TIME_LIMIT

private static final long DELAYED_SUBSCRIPTION_TIME_LIMIT
See Also:
Constant Field Values

_connectionsManager

private ConnectionsManagerInterface _connectionsManager

_delayedSubscriptionList

private ArrayList _delayedSubscriptionList

_delayedSubscriptionSync

private Object _delayedSubscriptionSync

_delayedSubscriptionThread

private ListsManager.DelayedSubscriptionThread _delayedSubscriptionThread

_bestWayManager

private BestWayManagerInterface _bestWayManager

_localSubscriptionInfosSendLock

private final Object _localSubscriptionInfosSendLock
Constructor Detail

ListsManager

ListsManager(ConnectionsManagerInterface connectionsManager)
Erzeugt ein neues Objekt mit den übergebenen Parametern. Zu beachten ist, dass das Verwaltungsobjekt zur Bestimmung der günstigsten Wege nicht initialisiert wird, sondern im Anschluss mit einem Aufruf des entsprechenden Setters gesetzt werden muss, bevor die Dienste des ListsManagers in Anspruch genommen werden können.

Parameters:
connectionsManager - Verbindungsverwaltung
Method Detail

getDelayedSubscriptionThread

Thread getDelayedSubscriptionThread()
Bestimmt den Thread, der für die verzögerte Durchführung von Anmeldungen zuständig ist.

Returns:
Thread, der für die verzögerte Durchführung von Anmeldungen zuständig ist.

getBestWayManager

public BestWayManagerInterface getBestWayManager()
Getter für das Verwaltungsobjekt zur Bestimmung der günstigsten Wege.

Returns:
Verwaltungsobjekt zur Bestimmung der günstigsten Wege.

setBestWayManager

public void setBestWayManager(BestWayManagerInterface bestWayManager)
Setter für das Verwaltungsobjekt zur Bestimmung der günstigsten Wege.

Parameters:
bestWayManager - Verwaltungsobjekt zur Bestimmung der günstigsten Wege.

addEntry

public final void addEntry(long delivererId,
                           long transmitterId)
Description copied from interface: ListsManagerInterface
Diese Methode wird von der Wegverwaltung aufgerufen, wenn ein Datenverteiler als erreichbar festgestellt wird. Sie wird aber auch aufgerufen, wenn festgestellt wird, dass ein Datenverteiler über einen neuen Weg erreichbar ist und nicht mehr über den alten Weg. Ein Datenverteiler kann über eine direkte Verbindung oder über einen anderen Datenverteiler erreichbar sein. Zuerst wird überprüft ob ein Zulieferereintrag für den spezifizierten Datenverteiler existiert. Existiert keiner, so wird ein Eintrag erstellt und in die Tabelle eingefügt. Wenn kein Zulieferer mehr existiert (delivererId = -1), dann wird eine Zuliefererinformationskündigung wird zu jedem eingetragenen Abonnenten gesendet. Die Liste der Abonnenten wird dann geleert. Die Objekt- und Kombinationslisten werden auch geleert, da keine Verbindung mehr zum Datenverteiler existiert und die Informationen nicht mehr aktualisiert werden können. Wenn der neue Zulieferer ein anderer als der alte ist, wird eine Zuliefererinformationsabmeldung zum alten Zulieferer gesendet. Wenn der neue Zulieferer in der Abonnentenliste eingetragen ist, wird dieser Eintrag aus der Liste entfernt und an ihn eine Zuliefererinformationskündigung gesendet. Danach wird eine Zuliefererinformationsanmeldung zum neuen Zulieferer gesendet.

Specified by:
addEntry in interface ListsManagerInterface
Parameters:
delivererId - ID des Zulieferers oder -1, wenn der kein Zulieferer mehr existiert.
transmitterId - ID des Datenverteilers

handleWaysChanges

public final void handleWaysChanges(long[] changedTransmitterIds)
Description copied from interface: ListsManagerInterface
Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn sich neue günstigste Wege für bestimmte Datenverteiler ergeben haben.

Specified by:
handleWaysChanges in interface ListsManagerInterface
Parameters:
changedTransmitterIds - Array mit den IDs der betroffenen Datenverteiler.

subscribe

final void subscribe(long transmitterId,
                     long[] ids)
Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Anmeldung auf die Zuliefererinformationen eines bestimmten Datenverteilers eingetroffen ist. Zuerst wird der Eintrag jedes in ids spezifizierten Datenverteilers aus der Tabelle bestimmt. Wenn ein Eintrag vorhanden ist, dann wird überprüft, ob ein Zulieferer dafür definiert ist. Ist keiner vorhanden, so wird dem Datenverteiler, der hier ein Abonnement versucht, eine Zuliefererinformationsankündigung gesendet. Wenn aber ein Zulieferer existiert, wird überprüft ob dieser nicht schon abonniert ist. Ist dies nicht der Fall, wird er zur Abonnentenliste hinzugefügt, und alle registrierten Objekte und Kombinationen aus Attributgruppe und Aspekt werden zusammen in einer Zuliefereraktualisierung zu ihm gesendet.

Parameters:
transmitterId - ID des DAV
ids - long Array mit den IDs enthält die Liste der DAVs

unsubscribe

final void unsubscribe(long transmitterId,
                       long[] ids)
Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Abmeldung auf die Zuliefererinformationen eines bestimmten Datenverteilers eingetroffen ist. Zuerst wird der Eintrag jedes in ids spezifizierten Datenverteilers aus der Tabelle bestimmt. Wenn ein Eintrag vorhanden ist, dann wird überprüft, ob der Datenverteiler, der hier die Abmeldung geschickt hat, als Abonnent existiert. Ist dies der Fall, wird er aus der Abonnentenliste entfernt.

Parameters:
transmitterId - ID des DAV
ids - long Array mit den IDs, enthält die Liste der DAVs

unsubscribeDeliverer

final void unsubscribeDeliverer(long transmitterId,
                                long[] ids)
Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Kündigung eines Zulieferers auf die Zuliefererinformationen eines bestimmten Datenverteilers eingetroffen ist. Zuerst wird der Eintrag jedes in ids spezifizierten Datenverteilers aus der Tabelle bestimmt. Wenn ein Eintrag vorhanden ist, dann wird überprüft, ob der Datenverteiler, der hier die Kündigung geschickt hat, auch der eingetragene Zulieferer ist. Mit Hilfe des Wegmanagers wird überprüft, ob ein neuer Zulieferer in Frage kommt. Existiert ein anderer Zulieferer, dann wird ihm eine Zuliefererinformationsanmeldung gesendet. Wenn kein neuer Zulieferer existiert, dann wird eine Zuliefererinformationskündigung an die Abonnenten gesendet. Abonnentenliste, Objektliste und Kombinationsliste werden dann geleert.

Parameters:
transmitterId - ID des DAV
ids - long Array mit den IDs, enthält die Liste der DAVs

handleDisconnection

public final void handleDisconnection(long transmitterId)
Description copied from interface: ListsManagerInterface
Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Datenverteilerverbindung nicht mehr existiert. Zunächst wird der Eintrag des Datenverteilers transmitterId aus der Zulieferertabelle entfernt. Der Zulieferer dieses Eintrags wird durch eine Zuliefererinformationsabmeldung, die Abonnenten dieses Eintrags durch eine Zuliefererinformationskündigung benachrichtigt. Danach wird überprüft bei welchen Einträgen der spezifizierte Datenverteiler als Zulieferer auftaucht. Dort wird überprüft, ob der Antragsdatenverteiler über einen anderen Datenverteiler erreichbar ist. In diesem Falle, wird ihm eine Zuliefererinformationsanmeldung gesendet. Wenn kein neuer Zulieferer existiert, werden die Abonnenten durch eine Zuliefererinformationskündigung informiert und die Abonnentenliste, Objektliste und Kombinationsliste geleert. Zuletzt wird überprüft, bei welchen Einträgen der spezifizierte Datenverteiler als Abonnent eingetragen ist und wird als Abonnent aus diesen Listen gestrichen.

Specified by:
handleDisconnection in interface ListsManagerInterface
Parameters:
transmitterId - ID des Datenverteilers

updateEntry

final void updateEntry(TransmitterListsUpdate transmitterListsUpdate)
Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Zuliefereraktualisierung eintrifft. Bei dem Eintrag des spezifizierten Datenverteilers werden die Objekte und die Kombinationen aus Attributgruppen und Aspekten aktualisiert. Dabei werden vier Listen aufgebaut: - Liste der hinzugefügten Objekte - Liste der gelöschten Objekte - Liste der hinzugefügten Kombinationen - Liste der gelöschten Kombinationen aus Attributgruppen und Aspekten Diese Listen werden dann in eine Zuliefereraktualisierungsnachricht verpackt und an die Abonnenten weitergeleitet. Am Ende werden diese Listen zurückgegeben.


addInfo

final void addInfo(BaseSubscriptionInfo info)
Neue Anmeldung beim lokalen Datenverteiler in die Anmeldelistenverwaltung aufnehmen. Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Quell- oder Senkenanmeldung auf ein bestimmtes Datum erfolgt ist. Im Antrag des lokalen Datenverteilers wird überprüft, ob das Objekt und die Kombination aus Attributgruppe und Aspekt aus der spezifizierten Basisanmeldeinformation vorhanden sind. Wenn das Objekt oder die Kombination nicht vorhanden ist, wird eine Zuliefereraktualisierung mit den dazugekommenen Objekt und/oder der dazugekommenen Kombination gebildet und zu den Abonnenten gesendet. Wenn das Objekt oder die Kombination vorhanden ist, dann wird der jeweilige Objekt- bzw. Kombinationszähler um eins erhöht.

Parameters:
info - Anmeldeinformationen

removeInfo

final void removeInfo(BaseSubscriptionInfo info)
Anmeldung beim lokalen Datenverteiler aus der Anmeldelistenverwaltung entfernen. Diese Methode wird von der Verbindungsverwaltung aufgerufen, wenn eine Quell- oder Senkenabmeldung auf ein bestimmtes Datum erfolgt ist. Im Antrag des lokalen Datenverteilers wird überprüft ob das Objekt und die Kombination aus Attributgruppe und Aspekt aus der spezifizierten Basisanmeldeinformation vorhanden sind. Wenn das Objekt oder die Kombination vorhanden ist, wird deren Referenzzähler um eins vermindert. Wenn der Referenzzähler null ist, wird eine Zuliefereraktualisierung mit dem gelöschten Objekt und/oder der gelöschten Kombination gebildet, und zu den Abonnenten gesendet.

Parameters:
info - Anmeldeinformationen

getPotentialTransmitters

final long[] getPotentialTransmitters(BaseSubscriptionInfo info)
Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die potentiellen Zentraldatenverteiler des spezifizierten Datums zu bestimmen. In den Anmeldelisten der erreichbaren Datenverteiler wird überprüft, ob gewünschte Objekt und die Kombination aus Attributgruppe und Aspekt enthalten ist.

Parameters:
info - Anmeldeinformationen
Returns:
Feld mit den potentiellen Zentraldatenverteilern. Wenn kein Datenverteiler gefunden wurde, dann wird Null zurückgegeben.

close

final void close()
Diese Methode gibt die vom ListsManager beanspruchten Resourcen wieder frei. Sie wird von der Verbindungsverwaltung aufgerufen, wenn der Datenverteiler beendet werden soll. Die im Konstruktor gestarteten Threads werden terminiert.


sendTransmitterUpdates

private void sendTransmitterUpdates(T_T_HighLevelCommunicationInterface connection,
                                    long transmitterId,
                                    List<Long> objToAdd,
                                    List<Long> combiToAdd)
Diese Methode sendet die Aktualisierungstelegramme, welche die Ergänzungen der Listen beinhalten.

Parameters:
connection - Verbindung zwischen zwei DAV
transmitterId - ID des DAV
objToAdd - Liste der zu addierenden Objekte
combiToAdd - Liste der zu addierenden Attributgruppen-Aspekt-Kombinationen

sendTransmitterUpdates

private void sendTransmitterUpdates(T_T_HighLevelCommunicationInterface connection,
                                    long transmitterId,
                                    boolean update,
                                    List objToAdd,
                                    List objToRemove,
                                    List combiToAdd,
                                    List combiToRemove)
* Diese Methode sendet die Aktualisierungstelegramme, welche die Ergänzungen und Löschungen der Listen beinhalten.

Parameters:
connection - Verbindung zwischen zwei DAV
transmitterId - ID des DAV
update - true,false
objToAdd - Liste der zu addierenden Objekte
objToRemove - Liste der zu entfernenden Objekte
combiToAdd - Liste der zu addierenden Attributgruppen-Aspekt-Kombinationen
combiToRemove - Liste der zu entfernenden Attributgruppen-Aspekt-Kombinationen

cleanPendingDelayedSubscriptions

private void cleanPendingDelayedSubscriptions(long[] ids)
Diese Methode entfernt die wartenden verzögerten Anmeldungen.

Parameters:
ids - long Array mit den IDs der zu löschenden Datenverteiler