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 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
ConstructorsConstructorDescriptionT_T_HighLevelCommunication(ServerConnectionProperties properties, HighLevelTransmitterManagerInterface transmitterManager, LowLevelConnectionsManagerInterface lowLevelConnectionsManager, short weight, boolean waitForConfiguration, 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 TypeMethodDescriptionfinal booleanDiese Methode wird von der Verbindungsverwaltung aufgerufen, um die Initialisierung einer Verbindung abzuschließen.final voidconnect()Diese Methode wird von der Verbindungsverwaltung aufgerufen, um eine logische Verbindung zwischen zwei Datenverteilern herzustellen.voidDiese 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.voiddisconnected(boolean error, String message) de.bsvrz.dav.daf.main.EncryptionStatusfinal longgetId()Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.final Stringfinal longDiese Methode gibt die ID des Zielknotens zurück.final intDiese Methode gibt die Subadresse (Portnummer) des Kommunikationspartners zurück.getState()Gibt den Verbindungszustand zurückfinal longgetTelegramTime(long maxWaitingTime) Diese Methode wird von der Verbindungsverwaltung aufgerufen.final intDiese Methode gibt die Gewichtung der Verbindung zurück.de.bsvrz.dav.daf.main.impl.config.telegrams.TransmitterInfoGibt bei ausgehenden Verbindungen die Infos über den Ziel_Datenverteiler zurück, der hätte erreicht werden sollen.final de.bsvrz.dav.daf.communication.protocol.UserLoginGibt die ID des verbundenen Benutzers zurück.booleanisClosed()final booleanGibt die Information zurück, ob diese Verbindung von dem anderen Datenverteiler aufgebaut wurde.final voidsendData(de.bsvrz.dav.daf.communication.lowLevel.telegrams.ApplicationDataTelegram telegram, long applicationId, boolean toCentralDistributor) Versendet ein Daten-Telegramm über diese VerbindungvoidsendReceipt(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.final voidsendRoutingUpdate(de.bsvrz.dav.daf.communication.lowLevel.telegrams.RoutingUpdate[] routingUpdates) Diese Methode findet die besten Wege.voidsendTelegram(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram telegram) Diese Methode wird von der Verbindungsverwaltung, der Zuliefererverwaltung und der Anmeldungsverwaltung aufgerufen.voidsendTelegrams(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram[] telegrams) Mehrere Telegramme können en bloc versandt werden.voidsubscribeToRemote(RemoteCentralSubscription remoteCentralSubscription) Sorgt für eine Datenanmeldung bei einem entfernten Zentraldatenverteiler.voidTerminiert die Kommunikationsverbindung.toString()voidunsubscribeToRemote(RemoteCentralSubscription remoteCentralSubscription) Sorgt für Datenabmeldung bei einem entfernten Zentraldatenverteiler.voidupdate(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram telegram) voidupdateConfigData(de.bsvrz.dav.daf.communication.dataRepresentation.datavalue.SendDataObject receivedData)
-
Constructor Details
-
T_T_HighLevelCommunication
public T_T_HighLevelCommunication(ServerConnectionProperties properties, HighLevelTransmitterManagerInterface transmitterManager, LowLevelConnectionsManagerInterface lowLevelConnectionsManager, short weight, boolean waitForConfiguration, 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 VerbindungtransmitterManager- High-Level-Datenverteiler-VerwaltunglowLevelConnectionsManager- Low-Level-Verbindungsverwaltungweight- Gewichtung dieser VerbindungwaitForConfiguration- true: auf die Konfiguration muss gewartet werden, false: Konfiguration ist vorhandenuserForAuthentication- Benutzername mit dem sich dieser Datenverteiler beim anderen Datenverteiler authentifizieren sollcredentialsForAuthentication- 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.CommunicationErrorDiese 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
-
isClosed
public boolean isClosed()- Returns:
- Liefert
truezurück, falls die Verbindung geschlossen wurde, sonstfalse.
-
getTelegramTime
public final long getTelegramTime(long maxWaitingTime) throws de.bsvrz.dav.daf.main.CommunicationError Description copied from interface:ServerHighLevelCommunicationDiese Methode wird von der Verbindungsverwaltung aufgerufen. Ein TelegrammTelegramTimeRequestwird erzeugt und zur Applikation gesendet. Danach wird auf die AntwortTelegramTimeAnswergewartet. Wenn die Antwort nicht innerhalb der angegebenen maximalen Wartezeit angekommen ist, wird eineAusnahmeerzeugt.- Specified by:
getTelegramTimein interfaceServerHighLevelCommunication- 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:RoutingConnectionInterfaceDiese Methode gibt die ID des Zielknotens zurück.- Specified by:
getRemoteNodeIdin interfaceRoutingConnectionInterface- Returns:
- ID des Zielknotens
-
getThroughputResistance
public final int getThroughputResistance()Description copied from interface:RoutingConnectionInterfaceDiese Methode gibt die Gewichtung der Verbindung zurück.- Specified by:
getThroughputResistancein interfaceRoutingConnectionInterface- Specified by:
getThroughputResistancein interfaceTransmitterCommunicationInterface- Returns:
- Gewichtung der Verbindung
-
sendRoutingUpdate
public final void sendRoutingUpdate(de.bsvrz.dav.daf.communication.lowLevel.telegrams.RoutingUpdate[] routingUpdates) Description copied from interface:RoutingConnectionInterfaceDiese Methode findet die besten Wege.- Specified by:
sendRoutingUpdatein interfaceRoutingConnectionInterface- Parameters:
routingUpdates- Aktualisierung der Verbindung
-
getUserLogin
public final de.bsvrz.dav.daf.communication.protocol.UserLogin getUserLogin()Description copied from interface:ServerHighLevelCommunicationGibt die ID des verbundenen Benutzers zurück.- Specified by:
getUserLoginin interfaceCommunicationInterface- Specified by:
getUserLoginin interfaceServerHighLevelCommunication- Returns:
- die Benutzer ID
-
getId
public final long getId()Description copied from interface:ServerHighLevelCommunicationDiese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.- Specified by:
getIdin interfaceCommunicationInterface- Specified by:
getIdin interfaceServerHighLevelCommunication- 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
- 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:ServerHighLevelCommunicationDiese 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:
continueAuthenticationin interfaceServerHighLevelCommunication
-
terminate
Description copied from interface:ServerHighLevelCommunicationTerminiert die Kommunikationsverbindung.- Specified by:
terminatein interfaceServerHighLevelCommunication- Parameters:
error- Isttrue, 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
- Specified by:
disconnectedin interfacede.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterface
-
updateConfigData
public void updateConfigData(de.bsvrz.dav.daf.communication.dataRepresentation.datavalue.SendDataObject receivedData) - Specified by:
updateConfigDatain interfacede.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_HighLevelCommunicationInterfaceDiese Methode wird von der Verbindungsverwaltung, der Zuliefererverwaltung und der Anmeldungsverwaltung aufgerufen. Sie sendet über die Telegrammverwaltung ein Telegramm zu einem anderen Datenverteiler.- Specified by:
sendTelegramin interfaceT_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_HighLevelCommunicationInterfaceMehrere Telegramme können en bloc versandt werden.- Specified by:
sendTelegramsin interfaceT_T_HighLevelCommunicationInterface- Parameters:
telegrams- Feld von zu sendenden Telegrammen- See Also:
-
update
public void update(de.bsvrz.dav.daf.communication.lowLevel.telegrams.DataTelegram telegram) - Specified by:
updatein interfacede.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
-
subscribeToRemote
Description copied from interface:TransmitterCommunicationInterfaceSorgt 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:
subscribeToRemotein interfaceTransmitterCommunicationInterface- Parameters:
remoteCentralSubscription- Anmeldeinformation auf einen Zentraldatenverteiler
-
unsubscribeToRemote
Description copied from interface:TransmitterCommunicationInterfaceSorgt 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:
unsubscribeToRemotein interfaceTransmitterCommunicationInterface- 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:CommunicationInterfaceVersendet ein Daten-Telegramm über diese Verbindung- Specified by:
sendDatain interfaceCommunicationInterface- Parameters:
telegram- TelegrammapplicationId- Absender-Applikation oder -1 falls nicht bekannttoCentralDistributor- 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:TransmitterCommunicationInterfaceSendet eine Quittung auf eine Datenanmeldung zurück bzw. informiert darüber, ob es wirklich einen Zentraldatenverteiler auf, bzw hinter diesem Datenverteiler gibt.- Specified by:
sendReceiptin interfaceTransmitterCommunicationInterface- Parameters:
centralTransmitterId- ID des zentraldatenverteilers, sofern vorhanden. Typischerweise die ID dieses Datenverteilers oder eines nachgelagerten Datenverteilers.state- Verbindungszustand, sieheConnectionStatereceiver- Art der Anmeldung Quelle-Empfänger oder Sender-SenkeremoteReceiverSubscription- Entweder eineRemoteSenderSubscriptionoder eineRemoteReceiverSubscription, die die zugehörige eingehende Anmeldung von eine manderen Datenverteiler darstellt.
-
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
-