Class T_T_HighLevelCommunication

java.lang.Object
de.bsvrz.dav.dav.communication.davProtocol.T_T_HighLevelCommunication
All Implemented Interfaces:
de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterface, T_T_HighLevelCommunicationInterface, RoutingConnectionInterface, ServerHighLevelCommunication, CommunicationInterface, TransmitterCommunicationInterface

public class T_T_HighLevelCommunication
extends java.lang.Object
implements T_T_HighLevelCommunicationInterface, de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterface
Diese Klasse stellt die Funktionalitäten für die Kommunikation zwischen zwei Datenverteilern zur Verfügung. Hier wird die Verbindung zwischen zwei DAV aufgebaut, sowie die Authentifizierung durchgeführt.
  • Constructor Summary

    Constructors
    Constructor Description
    T_T_HighLevelCommunication​(ServerConnectionProperties properties, HighLevelTransmitterManagerInterface transmitterManager, LowLevelConnectionsManagerInterface lowLevelConnectionsManager, short weight, boolean waitForConfiguration, java.lang.String userForAuthentication, de.bsvrz.dav.daf.main.authentication.ClientCredentials credentialsForAuthentication, de.bsvrz.dav.daf.main.impl.config.telegrams.TransmitterInfo outgoingTransmitterInfo)
    Erzeugt ein neues Objekt mit den gegebenen Parametern.
  • Method Summary

    Modifier and Type Method Description
    boolean completeInitialisation()
    Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die Initialisierung einer Verbindung abzuschließen.
    void connect()
    Diese Methode wird von der Verbindungsverwaltung aufgerufen, um eine logische Verbindung zwischen zwei Datenverteilern herzustellen.
    void continueAuthentication()
    Diese Methode wird von der Verbindungsverwaltung aufgerufen, sobald die Konfiguration vorhanden ist, um zu signalisieren, dass eine blockierte Authentifizierung weiter bearbeitet werden kann: Steht eine Authentifizierungsschlüsselanfrage an, während die Konfiguration noch nicht vorhanden ist, wird die Antwort blockiert bis die Konfiguration bereit ist.
    void disconnected​(boolean error, java.lang.String message)  
    de.bsvrz.dav.daf.main.EncryptionStatus getEncryptionStatus()  
    long getId()
    Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.
    LowLevelConnectionsManagerInterface getLowLevelConnectionsManager()  
    java.lang.String getRemoteAdress()  
    long getRemoteNodeId()
    Diese Methode gibt die ID des Zielknotens zurück.
    int getRemoteSubadress()
    Diese Methode gibt die Subadresse (Portnummer) des Kommunikationspartners zurück.
    CommunicationStateAndMessage getState()
    Gibt den Verbindungszustand zurück
    long getTelegramTime​(long maxWaitingTime)
    Diese Methode wird von der Verbindungsverwaltung aufgerufen.
    int getThroughputResistance()
    Diese Methode gibt die Gewichtung der Verbindung zurück.
    de.bsvrz.dav.daf.main.impl.config.telegrams.TransmitterInfo getTransmitterInfo()
    Gibt bei ausgehenden Verbindungen die Infos über den Ziel_Datenverteiler zurück, der hätte erreicht werden sollen.
    de.bsvrz.dav.daf.communication.protocol.UserLogin getUserLogin()
    Gibt die ID des verbundenen Benutzers zurück.
    boolean isClosed()  
    boolean isIncomingConnection()
    Gibt die Information zurück, ob diese Verbindung von dem anderen Datenverteiler aufgebaut wurde.
    void sendData​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.ApplicationDataTelegram telegram, long applicationId, boolean toCentralDistributor)
    Versendet ein Daten-Telegramm über diese Verbindung
    void sendReceipt​(long centralTransmitterId, ConnectionState state, de.bsvrz.dav.daf.communication.lowLevel.telegrams.TransmitterSubscriptionType receiver, RemoteSubscription remoteReceiverSubscription)
    Sendet eine Quittung auf eine Datenanmeldung zurück bzw. informiert darüber, ob es wirklich einen Zentraldatenverteiler auf, bzw hinter diesem Datenverteiler gibt.
    void sendRoutingUpdate​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.RoutingUpdate[] routingUpdates)
    Diese Methode findet die besten Wege.
    void sendTelegram​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram telegram)
    Diese Methode wird von der Verbindungsverwaltung, der Zuliefererverwaltung und der Anmeldungsverwaltung aufgerufen.
    void sendTelegrams​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram[] telegrams)
    Mehrere Telegramme können en bloc versandt werden.
    void subscribeToRemote​(RemoteCentralSubscription remoteCentralSubscription)
    Sorgt für eine Datenanmeldung bei einem entfernten Zentraldatenverteiler.
    void terminate​(boolean error, java.lang.String message)
    Terminiert die Kommunikationsverbindung.
    java.lang.String toString()  
    void unsubscribeToRemote​(RemoteCentralSubscription remoteCentralSubscription)
    Sorgt für Datenabmeldung bei einem entfernten Zentraldatenverteiler.
    void update​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram telegram)  
    void updateConfigData​(de.bsvrz.dav.daf.communication.dataRepresentation.datavalue.SendDataObject receivedData)  

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • T_T_HighLevelCommunication

      public T_T_HighLevelCommunication​(ServerConnectionProperties properties, HighLevelTransmitterManagerInterface transmitterManager, LowLevelConnectionsManagerInterface lowLevelConnectionsManager, short weight, boolean waitForConfiguration, java.lang.String userForAuthentication, @Nullable de.bsvrz.dav.daf.main.authentication.ClientCredentials credentialsForAuthentication, @Nullable de.bsvrz.dav.daf.main.impl.config.telegrams.TransmitterInfo outgoingTransmitterInfo)
      Erzeugt ein neues Objekt mit den gegebenen Parametern.
      Parameters:
      properties - Eigenschaften dieser Verbindung
      transmitterManager - High-Level-Datenverteiler-Verwaltung
      lowLevelConnectionsManager - Low-Level-Verbindungsverwaltung
      weight - Gewichtung dieser Verbindung
      waitForConfiguration - true: auf die Konfiguration muss gewartet werden, false: Konfiguration ist vorhanden
      userForAuthentication - Benutzername mit dem sich dieser Datenverteiler beim anderen Datenverteiler authentifizieren soll
      credentialsForAuthentication - Passwort des Benutzers, mit dem sich dieser Datenverteiler beim anderen Datenverteiler authentifizieren soll. null, falls unbekannt.
      outgoingTransmitterInfo - Eigenschaften des Datenverteilers bei ausgehenden Verbindungen, null bei eingehenden.
  • Method Details

    • connect

      public final void connect() throws de.bsvrz.dav.daf.main.CommunicationError
      Diese Methode wird von der Verbindungsverwaltung aufgerufen, um eine logische Verbindung zwischen zwei Datenverteilern herzustellen. Zunächst wird die Protokollversion verhandelt. In einem Systemtelegramm ?TransmitterProtocolVersionRequest? werden die unterstützten Versionen über die Telegrammverwaltung an den zweiten Datenverteiler gesendet. Auf die Antwort wird eine gewisse Zeit gewartet (maximale Wartezeit auf synchrone Antworten). Wenn die Antwort innerhalb diese Zeit nicht angekommen bzw. keine der Protokollversionen vom anderen Datenverteiler unterstützt wird, wird eine CommunicationErrorAusnahme erzeugt.
      Danach erfolgt die Authentifizierung: Über die Telegrammverwaltung wird ein Telegramm? TransmitterAuthentificationTextRequest? zum anderen Datenverteiler gesendet, um einen Schlüssel für die Authentifizierung anzufordern. Die ID des sendenden Datenverteilers wird den ServerConnectionProperties entnommen. Auf die Antwort ?TransmitterAuthentificationTextAnswer? wird eine gewisse Zeit gewartet (maximale Wartezeit auf synchrone Antworten). Wenn die Antwort nicht innerhalb dieser Zeit angekommen ist, wird eine CommunicationError-Ausnahme erzeugt. Das Passwort, welches in den ServerConnectionProperties spezifiziert ist, wird mit diesem Schlüssel und dem spezifizierten Authentifizierungsverfahren verschlüsselt. Aus dem Authentifizierungsverfahrennamen, dem verschlüsselten Passwort und dem Benutzernamen wird ein ?TransmitterAuthentificationRequest?-Telegramm gebildet und mittels Telegrammverwaltung zum anderen Datenverteiler gesendet. Auf die Antwort ?TransmitterAuthentificationAnswer? wird eine gewisse Zeit gewartet (maximale Wartezeit auf synchrone Antworten). Wenn die Antwort nicht innerhalb dieser Zeit angekommen ist oder konnte die Authentifizierung nicht erfolgreich abgeschlossen werden, so wird eine CommunicationError-Ausnahme erzeugt
      Danach geht diese Methode geht in den Wartezustand, bis der andere Datenverteiler sich in umgekehrter Richtung auch erfolgreich authentifiziert hat. Dabei durchläuft der andere Datenverteiler das gleiche Prozedere wie zuvor beschrieben.
      Im nächsten Schritt verhandeln die Datenverteiler die Keep-alive-Parameter und die Durchsatzprüfungsparameter (Verbindungsparameter). Ein ?TransmitterComParametersRequest? wird zum anderen Datenverteiler gesendet. Auch hier wird eine gewisse Zeit auf die Antwort ?TransmitterComParametersAnswer? gewartet (maximale Wartezeit auf synchrone Antworten). Wenn die Antwort nicht innerhalb dieser Zeit angekommen ist, wird eine CommunicationError-Ausnahme erzeugt. Sonst ist der Verbindungsaufbau erfolgreich abund der Austausch von Daten kann sicher durchgeführt werden.
      Throws:
      de.bsvrz.dav.daf.main.CommunicationError - , wenn bei der initialen Kommunikation mit dem Datenverteiler Fehler aufgetreten sind
    • getLowLevelConnectionsManager

      public LowLevelConnectionsManagerInterface getLowLevelConnectionsManager()
    • isClosed

      public boolean isClosed()
      Returns:
      Liefert true zurück, falls die Verbindung geschlossen wurde, sonst false.
    • getTelegramTime

      public final long getTelegramTime​(long maxWaitingTime) throws de.bsvrz.dav.daf.main.CommunicationError
      Description copied from interface: ServerHighLevelCommunication
      Diese Methode wird von der Verbindungsverwaltung aufgerufen. Ein Telegramm TelegramTimeRequest wird erzeugt und zur Applikation gesendet. Danach wird auf die Antwort TelegramTimeAnswer gewartet. Wenn die Antwort nicht innerhalb der angegebenen maximalen Wartezeit angekommen ist, wird eine Ausnahme erzeugt.
      Specified by:
      getTelegramTime in interface ServerHighLevelCommunication
      Parameters:
      maxWaitingTime - Maximale Zeit, die auf eine Antwort gewartet wird.
      Returns:
      die Telegrammlaufzeit oder -1, wenn nicht innnerhalb der maximalen Wartezeit eine Antwort empfangen wurde.
      Throws:
      de.bsvrz.dav.daf.main.CommunicationError - Wenn bei der initialen Kommunikation mit dem Datenverteiler Fehler aufgetreten sind.
    • getRemoteNodeId

      public final long getRemoteNodeId()
      Description copied from interface: RoutingConnectionInterface
      Diese Methode gibt die ID des Zielknotens zurück.
      Specified by:
      getRemoteNodeId in interface RoutingConnectionInterface
      Returns:
      ID des Zielknotens
    • getThroughputResistance

      public final int getThroughputResistance()
      Description copied from interface: RoutingConnectionInterface
      Diese Methode gibt die Gewichtung der Verbindung zurück.
      Specified by:
      getThroughputResistance in interface RoutingConnectionInterface
      Specified by:
      getThroughputResistance in interface TransmitterCommunicationInterface
      Returns:
      Gewichtung der Verbindung
    • sendRoutingUpdate

      public final void sendRoutingUpdate​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.RoutingUpdate[] routingUpdates)
      Description copied from interface: RoutingConnectionInterface
      Diese Methode findet die besten Wege.
      Specified by:
      sendRoutingUpdate in interface RoutingConnectionInterface
      Parameters:
      routingUpdates - Aktualisierung der Verbindung
    • getUserLogin

      public final de.bsvrz.dav.daf.communication.protocol.UserLogin getUserLogin()
      Description copied from interface: ServerHighLevelCommunication
      Gibt die ID des verbundenen Benutzers zurück.
      Specified by:
      getUserLogin in interface CommunicationInterface
      Specified by:
      getUserLogin in interface ServerHighLevelCommunication
      Returns:
      die Benutzer ID
    • getId

      public final long getId()
      Description copied from interface: ServerHighLevelCommunication
      Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.
      Specified by:
      getId in interface CommunicationInterface
      Specified by:
      getId in interface ServerHighLevelCommunication
      Returns:
      ID des Kommunikationpartners
    • getEncryptionStatus

      public de.bsvrz.dav.daf.main.EncryptionStatus getEncryptionStatus()
    • isIncomingConnection

      public final boolean isIncomingConnection()
      Gibt die Information zurück, ob diese Verbindung von dem anderen Datenverteiler aufgebaut wurde.
      Returns:
      true: Verbindung wurde vom anderen Datenverteiler aufgebaut und von diesem akzeptiert (Dieser Datenverteiler ist der "Server", der auf eingehende Verbindungen wartet). false: Dieser Datenverteiler hat die Verbindung aktiv aufgebaut, der andere Datenverteiler ist der "Server", der auf eingehende Verbindungen wartet.
    • getRemoteAdress

      public final java.lang.String getRemoteAdress()
      Returns:
      (TCP -)Adresse des Datenverteilers
    • getRemoteSubadress

      public final int getRemoteSubadress()
      Diese Methode gibt die Subadresse (Portnummer) des Kommunikationspartners zurück.
      Returns:
      die Subadresse des Kommunikationspartners
    • continueAuthentication

      public void continueAuthentication()
      Description copied from interface: ServerHighLevelCommunication
      Diese Methode wird von der Verbindungsverwaltung aufgerufen, sobald die Konfiguration vorhanden ist, um zu signalisieren, dass eine blockierte Authentifizierung weiter bearbeitet werden kann: Steht eine Authentifizierungsschlüsselanfrage an, während die Konfiguration noch nicht vorhanden ist, wird die Antwort blockiert bis die Konfiguration bereit ist. Dies ist notwendig, da nur die Konfiguration bestimmen kann, ob die Authentifizierungsdaten korrekt sind. Auch für die Interpretation der Daten ist die Konfiguration notwendig.
      Specified by:
      continueAuthentication in interface ServerHighLevelCommunication
    • terminate

      public void terminate​(boolean error, java.lang.String message)
      Description copied from interface: ServerHighLevelCommunication
      Terminiert die Kommunikationsverbindung.
      Specified by:
      terminate in interface ServerHighLevelCommunication
      Parameters:
      error - Ist true, wenn die Verbindung im Fehlerfall abgebrochen werden soll, ohne die noch gepufferten Telegramme zu versenden; false, wenn versucht werden soll alle gepufferten Telegramme zu versenden.
      message - Fehlermeldung, die die Fehlersituation näher beschreibt.
    • disconnected

      public void disconnected​(boolean error, java.lang.String message)
      Specified by:
      disconnected in interface de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterface
    • updateConfigData

      public void updateConfigData​(de.bsvrz.dav.daf.communication.dataRepresentation.datavalue.SendDataObject receivedData)
      Specified by:
      updateConfigData in interface de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterface
    • sendTelegram

      public void sendTelegram​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram telegram)
      Description copied from interface: T_T_HighLevelCommunicationInterface
      Diese Methode wird von der Verbindungsverwaltung, der Zuliefererverwaltung und der Anmeldungsverwaltung aufgerufen. Sie sendet über die Telegrammverwaltung ein Telegramm zu einem anderen Datenverteiler.
      Specified by:
      sendTelegram in interface T_T_HighLevelCommunicationInterface
      Parameters:
      telegram - Grundtyp eines Telegramms
    • sendTelegrams

      public void sendTelegrams​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram[] telegrams)
      Description copied from interface: T_T_HighLevelCommunicationInterface
      Mehrere Telegramme können en bloc versandt werden.
      Specified by:
      sendTelegrams in interface T_T_HighLevelCommunicationInterface
      Parameters:
      telegrams - Feld von zu sendenden Telegrammen
      See Also:
      T_T_HighLevelCommunicationInterface.sendTelegram(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram)
    • update

      public void update​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram telegram)
      Specified by:
      update in interface de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterface
    • completeInitialisation

      public final boolean completeInitialisation()
      Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die Initialisierung einer Verbindung abzuschließen. Zuerst wird eine Instanz der Anmeldungsverwaltung für diese Verbindung erzeugt und zur Anmeldeverwaltung hinzugefügt. Danach wird die addWayMethode der Wegverwaltung aufgerufen, um einen Eintrag für den verbundenen Datenverteiler zu erzeugen. Danach werden die Telegramme bearbeitet, die nicht zum Etablieren dieser Verbindung dienen und vor Fertigstellung der Initialisierung angekommen sind (Online-Daten, Wegeanmeldungen, Listenanmeldungen usw.).
      Returns:
      immer true (aus Kompatibilitätsgründen)
    • toString

      public java.lang.String toString()
      Overrides:
      toString in class java.lang.Object
    • subscribeToRemote

      public void subscribeToRemote​(RemoteCentralSubscription remoteCentralSubscription)
      Description copied from interface: TransmitterCommunicationInterface
      Sorgt für eine Datenanmeldung bei einem entfernten Zentraldatenverteiler. Wird von diesem Datenverteiler selbstständig ausgelöst, wenn es keine lokale Quelle/Senke gibt und es potentielle remote-Datenverteiler über diese Verbindung gibt.
      Specified by:
      subscribeToRemote in interface TransmitterCommunicationInterface
      Parameters:
      remoteCentralSubscription - Anmeldeinformation auf einen Zentraldatenverteiler
    • unsubscribeToRemote

      public void unsubscribeToRemote​(RemoteCentralSubscription remoteCentralSubscription)
      Description copied from interface: TransmitterCommunicationInterface
      Sorgt für Datenabmeldung bei einem entfernten Zentraldatenverteiler. Wird von diesem Datenverteiler selbstständig ausgelöst, wenn kein Bedarf mehr an einer solchen Verbindung besteht.
      Specified by:
      unsubscribeToRemote in interface TransmitterCommunicationInterface
      Parameters:
      remoteCentralSubscription - Anmeldeinformation auf einen Zentraldatenverteiler
    • sendData

      public final void sendData​(de.bsvrz.dav.daf.communication.lowLevel.telegrams.ApplicationDataTelegram telegram, long applicationId, boolean toCentralDistributor)
      Description copied from interface: CommunicationInterface
      Versendet ein Daten-Telegramm über diese Verbindung
      Specified by:
      sendData in interface CommunicationInterface
      Parameters:
      telegram - Telegramm
      applicationId - Absender-Applikation oder -1 falls nicht bekannt
      toCentralDistributor - true: In Richtung des Zentraldatenverteilers, beim Sender-Senke-Datenfluss. false: Aus Richtung des Zentraldatenverteilers, beim Quelle-Empfänger-Datenfluss.
    • sendReceipt

      public void sendReceipt​(long centralTransmitterId, ConnectionState state, de.bsvrz.dav.daf.communication.lowLevel.telegrams.TransmitterSubscriptionType receiver, RemoteSubscription remoteReceiverSubscription)
      Description copied from interface: TransmitterCommunicationInterface
      Sendet eine Quittung auf eine Datenanmeldung zurück bzw. informiert darüber, ob es wirklich einen Zentraldatenverteiler auf, bzw hinter diesem Datenverteiler gibt.
      Specified by:
      sendReceipt in interface TransmitterCommunicationInterface
      Parameters:
      centralTransmitterId - ID des zentraldatenverteilers, sofern vorhanden. Typischerweise die ID dieses Datenverteilers oder eines nachgelagerten Datenverteilers.
      state - Verbindungszustand, siehe ConnectionState
      receiver - Art der Anmeldung Quelle-Empfänger oder Sender-Senke
      remoteReceiverSubscription - Entweder eine RemoteSenderSubscription oder eine RemoteReceiverSubscription, die die zugehörige eingehende Anmeldung von eine manderen Datenverteiler darstellt.
    • getState

      public CommunicationStateAndMessage getState()
      Gibt den Verbindungszustand zurück
      Returns:
      den Verbindungszustand
    • getTransmitterInfo

      public de.bsvrz.dav.daf.main.impl.config.telegrams.TransmitterInfo getTransmitterInfo()
      Gibt bei ausgehenden Verbindungen die Infos über den Ziel_Datenverteiler zurück, der hätte erreicht werden sollen.
      Returns:
      Ziel-Datenverteiler-Info