Class SubscriptionInfo

java.lang.Object
de.bsvrz.dav.dav.subscriptions.SubscriptionInfo
All Implemented Interfaces:
Closeable, AutoCloseable

public class SubscriptionInfo extends Object implements Closeable
Diese Klasse kapselt eine Anmeldungsinformation zu einer Objekt/Attributgruppe/Aspekt/Simulationsvariante-Kombination. Enthalten sind die eigentlichen Anmeldungen von Applikationen und Datenverteilern auf diese BaseSubscriptionInfo. Diese Klasse kümmert sich darum, die Anmeldungen zu verwalten und je nach Verfügbarkeit von Sendern, Empfängern, Quellen und Senken und je nach vorhandenen Rechten den einzelnen Verbindungen per Sendesteuerung oder leeren Datensätzen den Zustand der Anmeldung zu übermitteln. Zusätzlich übernimmt diese Klasse das Verteilen von Datensätzen an interessierte und gültige Empfangsanmeldungen.
  • Constructor Details

    • SubscriptionInfo

      public SubscriptionInfo(SubscriptionsManager subscriptionsManager, de.bsvrz.dav.daf.communication.lowLevel.telegrams.BaseSubscriptionInfo baseSubscriptionInfo)
      Erstellt eine neue SubscriptionInfo
      Parameters:
      subscriptionsManager - Anmeldungsverwaltung
      baseSubscriptionInfo - Datenidentifikation
  • Method Details

    • addSendingSubscription

      public void addSendingSubscription(SendingSubscription sendingSubscription)
      Fügt eine sendende Anmeldung hinzu
      Parameters:
      sendingSubscription - neue sendende Anmeldung
    • addReceivingSubscription

      public void addReceivingSubscription(ReceivingSubscription receivingSubscription)
      Fügt eine empfangende Anmeldung hinzu
      Parameters:
      receivingSubscription - neue empfangende Anmeldung
    • removeReceivingSubscription

      public void removeReceivingSubscription(ReceivingSubscription receivingSubscription)
      Entfernt eine empfangende Anmeldung
      Parameters:
      receivingSubscription - empfangende Anmeldung
    • removeSendingSubscription

      public void removeSendingSubscription(SendingSubscription sendingSubscription)
      Entfernt eine sendende Anmeldung
      Parameters:
      sendingSubscription - sendende Anmeldung
    • removeSendingSubscriptions

      public List<SendingSubscription> removeSendingSubscriptions(CommunicationInterface communication)
      Entfernt alle sendende Anmedungen, die über die angegebene Verbindung angemeldet sind
      Parameters:
      communication - Verbindung
      Returns:
      Liste mit entfernten Sendern und Quellen
    • removeReceivingSubscriptions

      public List<ReceivingSubscription> removeReceivingSubscriptions(CommunicationInterface communication)
      Entfernt alle empfangende Anmedungen, die über die angegebene Verbindung angemeldet sind
      Parameters:
      communication - Verbindung
      Returns:
      Liste mit entfernten Empfängern und Senken
    • getValidSenderSubscriptions

      public List<SendingSubscription> getValidSenderSubscriptions()
      Gibt alle gültigen sendenden Anmeldungen zurück
      Returns:
      alle gültigen sendenden Anmeldungen (Quellen und Sender)
    • getValidReceiverSubscriptions

      public List<ReceivingSubscription> getValidReceiverSubscriptions()
      Gibt alle gültigen empfangenden Anmeldungen zurück
      Returns:
      alle gültigen empfangenden Anmeldungen (Senken und Empfänger)
    • isEmpty

      public boolean isEmpty()
      Gibt true zurück, wenn es keine Anmeldungen gibt
      Returns:
      true, wenn es keine Anmeldungen gibt, sonst false
    • isCentralDistributor

      public boolean isCentralDistributor()
      Gibt true zurück, wenn dieser Datenverteiler Zentraldatenverteiler für diese Anmeldung ist
      Returns:
      true, wenn dieser Datenverteiler Zentraldatenverteiler für diese Anmeldung ist, sonst false
    • getNextDataIndex

      public long getNextDataIndex(long runningNumber)
      Berechnet den nächsten Datenindex und gibt diesen zurück
      Parameters:
      runningNumber - Laufende Nummer, wird vom SubscriptionsManager bereitgestellt, da diese Objekte gelöscht werden sobas keine Anmeldungen mehr vorhanden sind
      Returns:
      nächsten Datenindex, "0" falls dieser Datenverteiler nicht der Zentraldatenverteiler ist.
    • getCurrentDataIndex

      public long getCurrentDataIndex(long runningNumber)
      Gibt den zuletzt berechneten Datenindex zurück
      Parameters:
      runningNumber - Laufende Nummer, wird vom SubscriptionsManager bereitgestellt, da diese Objekte gelöscht werden sobas keine Anmeldungen mehr vorhanden sind
      Returns:
      zuletzt berechneten Datenindex, "0" falls dieser Datenverteiler nicht der Zentraldatenverteiler ist.
    • distributeTelegram

      public void distributeTelegram(de.bsvrz.dav.daf.communication.lowLevel.telegrams.ApplicationDataTelegram applicationDataTelegram, boolean toCentralDistributor, CommunicationInterface communication, long applicationId)
      Verschickt ein einzelnes Datentelegramm an alle interessierten und korrekt angemeldeten Empfänger
      Parameters:
      applicationDataTelegram - Datentelegramm
      toCentralDistributor - wenn das Telegramm noch nicht beim Zentraldatenverteiler behandelt wurde, also der Datenindex noch nicht vernünftig gesetzt wurde
      communication - Verbindung über die der Emfang erfolgt ist (zur Rechteprüfung), bei null findet keine Prüfung statt
      applicationId - Applikation, die das Telegramm ursprünglich gesendet hat oder -1 falls unbekannt
    • distributeTelegrams

      public void distributeTelegrams(List<de.bsvrz.dav.daf.communication.lowLevel.telegrams.ApplicationDataTelegram> applicationDataTelegrams, boolean toCentralDistributor, CommunicationInterface communication, long applicationId)
      Verschickt eine Liste von zusammengehörigen Datentelegrammen an alle interessierten und korrekt angemeldeten Empfänger
      Parameters:
      applicationDataTelegrams - Datentelegramme
      toCentralDistributor - wenn das Telegramm noch nicht beim Zentraldatenverteiler behandelt wurde, also der Datenindex noch nicht vernünftig gesetzt wurde
      communication - Verbindung über die der Emfang erfolgt ist (zur Rechteprüfung), bei null findet keine Prüfung statt
      applicationId - Applikation, die die Telegramme ursprünglich gesendet hat oder -1 falls unbekannt
    • updatePendingSubscriptionDataIndex

      public void updatePendingSubscriptionDataIndex(CommunicationInterface communication, long dataIndex)
    • handleUserRightsChanged

      public void handleUserRightsChanged(long userId)
      Aktualisert die Rechte von Anmeldungen und macht diese dadurch gültig/ungültig
      Parameters:
      userId - geänderter Benutzer, dessen Anmeldungen zu aktualisieren sind
    • setRemoteSourceSubscriptionStatus

      public void setRemoteSourceSubscriptionStatus(TransmitterCommunicationInterface communication, ConnectionState state, long mainTransmitterId)
      Verarbeitet eine Anmeldungsquittung von einem anderen Datenverteiler, aktualisert den Status der entsprechenden ausgehenden Anmeldung
      Parameters:
      communication - Kommunikation
      state - neuer Status
      mainTransmitterId - Id des Zentraldatenverteilers
    • setRemoteDrainSubscriptionStatus

      public void setRemoteDrainSubscriptionStatus(TransmitterCommunicationInterface communication, ConnectionState state, long mainTransmitterId)
      Verarbeitet eine Anmeldungsquittung von einem anderen Datenverteiler, aktualisert den Status der entsprechenden ausgehenden Anmeldung
      Parameters:
      communication - Kommunikation
      state - neuer Status
      mainTransmitterId - Id des Zentraldatenverteilers
    • getBaseSubscriptionInfo

      public de.bsvrz.dav.daf.communication.lowLevel.telegrams.BaseSubscriptionInfo getBaseSubscriptionInfo()
      Gibt das BaseSubscriptionInfo zurück
      Returns:
      das BaseSubscriptionInfo
    • updateRemoteConnections

      public void updateRemoteConnections()
      Wird aufgerufen, wenn im ListsManager ein Update stattfand und so eventuell neue oder bessere Wege für die Remote-Anmeldungen existieren
    • hasSource

      public boolean hasSource()
      Gibt true zurück, wenn eine Quelle verbunden ist (entweder lokal oder über eine Transmitterverbindung)
      Returns:
      true, wenn eine Quelle verbunden ist, sonst false
    • hasDrain

      public boolean hasDrain()
      Gibt true zurück, wenn eine Senke verbunden ist (entweder lokal oder über eine Transmitterverbindung)
      Returns:
      true, wenn eine Senke verbunden ist, sonst false
    • isValidSender

      public boolean isValidSender(CommunicationInterface communication)
      Prüft, ob die angegebene Kommunikationsklasse senden darf (also als gültiger Sender angemeldet ist)
      Parameters:
      communication - Kommunikation
      Returns:
      true wenn gültig
    • setMultiRemoteLockActive

      public void setMultiRemoteLockActive(boolean multiRemoteLockActive)
      Setzt, ob Anmeldung ungültig gemacht werden sollen, weil mehrere remote-Zzentraldatenverteiler positive Rückmeldungen verschickt haben
      Parameters:
      multiRemoteLockActive - ob die Sperre _multiRemoteLockActive aktiv sein soll.
    • getSendingSubscriptions

      public List<SendingSubscription> getSendingSubscriptions(CommunicationInterface communicationInterface)
      Gibt alle Sende-Anmeldungen zu einer Verbindung zurück
      Parameters:
      communicationInterface - Verbindung
      Returns:
      Alle Quellen und Sender hinter dieser Verbindung (evtl. eine leere Liste falls nicht vorhanden)
    • getReceivingSubscriptions

      public List<ReceivingSubscription> getReceivingSubscriptions(CommunicationInterface communicationInterface)
      Gibt alle Empfangs-Anmeldungen zu einer Verbindung zurück
      Parameters:
      communicationInterface - Verbindung
      Returns:
      Alle Senken und Empfänger hinter dieser Verbindung (evtl. eine leere Liste falls nicht vorhanden)
    • getSendingSubscriptions

      public Collection<SendingSubscription> getSendingSubscriptions()
      Gibt alle sendenden Anmeldungen zurück
      Returns:
      alle Sender und Quellen dieser Datenidentifikation
    • getReceivingSubscriptions

      public Collection<ReceivingSubscription> getReceivingSubscriptions()
      Gibt alle Empfangs-Anmeldungen zurück
      Returns:
      alle Senken und Empfänger dieser Datenidentifikation
    • updateBestWay

      public void updateBestWay(long transmitterId, TransmitterCommunicationInterface oldConnection, TransmitterCommunicationInterface newConnection)
      Wird von bestWaymanager aufgerufen, wenn es eine neue beste lokale Verbindung zu einem Zentraldatenverteiler gibt
      Parameters:
      transmitterId - Zentraldatenverteiler-ID
      oldConnection - Alte Verbindung
      newConnection - Neue Verbindung
    • serializeToBytes

      public byte[] serializeToBytes() throws IOException
      Serialisiert die Anmelde-Informationen in Bytes um sie über den Datenverteiler zu Testzwecken abrufen zu können.
      Returns:
      Byte-Array
      Throws:
      IOException
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getOrCreateRemoteDrainSubscription

      public RemoteDrainSubscription getOrCreateRemoteDrainSubscription(TransmitterCommunicationInterface connection)
      Erstellt eine Remote-Senken-Anmeldung über eine angegebene Verbindung bzw. gibt diese zurück wenn sie schon besteht
      Parameters:
      connection - Verbindung
      Returns:
      Senkenanmeldung
    • getOrCreateRemoteSourceSubscription

      public RemoteSourceSubscription getOrCreateRemoteSourceSubscription(TransmitterCommunicationInterface connection)
      Erstellt eine Remote-Quellen-Anmeldung über eine angegebene Verbindung bzw. gibt diese zurück wenn sie schon besteht
      Parameters:
      connection - Verbindung
      Returns:
      Quellenanmeldung
    • updateOrCreateRemoteReceiverSubscription

      public void updateOrCreateRemoteReceiverSubscription(TransmitterCommunicationInterface communication, Collection<Long> ids)
      Erstellt eine eingehende Anmeldung von einem anderen Datenverteiler als interessierter Empfänger (dieser Datenverteiler ist dann typischerweise potentiell Quell-Datenverteiler bzw. agiert als Proxy zum eigentlichen Zentraldatenverteiler). Wenn es schon eine bestehende Anmeldung gibt wird diese stattdessen um die potentiellen Zentraldatenverteiler erweitert.
      Parameters:
      communication - Verbindung
      ids - Liste mit Zentaldatenverteiler-Ids, die berücksichtigt werden sollen
    • updateOrCreateRemoteSenderSubscription

      public void updateOrCreateRemoteSenderSubscription(TransmitterCommunicationInterface communication, Collection<Long> ids)
      Erstellt eine eingehende Anmeldung von einem anderen Datenverteiler als interessierter Sender (dieser Datenverteiler ist dann typischerweise potentiell eine Senke bzw. agiert als Proxy zum eigentlichen Zentraldatenverteiler). Wenn es schon eine bestehende Anmeldung gibt wird diese stattdessen um die potentiellen Zentraldatenverteiler erweitert.
      Parameters:
      communication - Verbindung
      ids - Liste mit Zentaldatenverteiler-Ids, die berücksichtigt werden sollen
    • open

      public void open()
      Markiert das SubscriptionInfo als offen, sodass Änderungen an den Anmeldungen durchgeführt werden dürfen.

      Wird auf den SubscriptionsManager synchronisiert ausgeführt

    • close

      public void close()
      Markiert das SubscriptionInfo als geschlossen, nachdem Änderungen an den Anmeldungen durchgeführt wurden. Falls das Objekt leer ist und von keinem mehr offen ist, wird geprüft ob Anmeldungen vorhanden sind. Falls nicht, wird das Objekt aus dem SubscriptionsManager entfernt.

      Synchronisiert auf den _subscriptionsManager, daher keine Synchronisation von _referenceCounter notwendig.

      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable