de.bsvrz.dav.dav.communication.davProtocol
Class T_T_HighLevelCommunication

java.lang.Object
  extended by de.bsvrz.dav.dav.communication.davProtocol.T_T_HighLevelCommunication
All Implemented Interfaces:
HighLevelCommunicationCallbackInterface, T_T_HighLevelCommunicationInterface, RoutingConnectionInterface, ServerHighLevelCommunication

public class T_T_HighLevelCommunication
extends Object
implements T_T_HighLevelCommunicationInterface, 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.

Author:
Kappich Systemberatung

Constructor Summary
T_T_HighLevelCommunication(ServerConnectionProperties properties, SubscriptionsManager subscriptionsManager, ConnectionsManager connectionsManager, BestWayManager bestWayManager, short weight, boolean waitForConfiguration, String authentifyAsUser, String authentifyWithPassword)
          Erzeugt ein neues Objekt mit den gegebenen Parametern.
 
Method Summary
 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 continueAuthentification()
          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, String message)
           
 long getId()
          Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.
 String getRemoteAdress()
           
 long getRemoteNodeId()
          Diese Methode gibt die ID des Zielknotens zurück.
 int getRemoteSubadress()
          Diese Methode gibt die Subadresse des Kommunikationspartners zurück.
 long getRemoteUserId()
          Gibt die ID des verbundenen Benutzers zurück.
 SubscriptionComponent getSubscriptionComponent()
          Gibt die Komponente zurück, die die Anmeldungen der Verbindung verwaltet.
 long getTelegrammTime(long maxWaitingTime)
          Diese Methode wird von der Verbindungsverwaltung aufgerufen.
 int getThroughputResistance()
          Diese Methode gibt die Gewichtung der Verbindung zurück.
 boolean isAcceptedConnection()
          Gibt die Information zurück, ob diese Verbindung von dem anderen Datenverteiler akzeptiert wurde.
 void sendRoutingUpdate(RoutingUpdate[] routingUpdates)
          Diese Methode findet die besten Wege.
 void sendTelegram(DataTelegram telegram)
          Diese Methode wird von der Verbindungsverwaltung, der Zuliefererverwaltung und der Anmeldungsverwaltung aufgerufen.
 void sendTelegrams(DataTelegram[] telegrams)
          Mehrere Telegramme können en bloc versandt werden.
 void terminate(boolean error, String message)
          Terminiert die Kommunikationsverbindung.
 void terminate(boolean error, String message, DataTelegram terminationTelegram)
           
 void update(DataTelegram telegram)
           
 void updateConfigData(SendDataObject receivedData)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

T_T_HighLevelCommunication

public T_T_HighLevelCommunication(ServerConnectionProperties properties,
                                  SubscriptionsManager subscriptionsManager,
                                  ConnectionsManager connectionsManager,
                                  BestWayManager bestWayManager,
                                  short weight,
                                  boolean waitForConfiguration,
                                  String authentifyAsUser,
                                  String authentifyWithPassword)
Erzeugt ein neues Objekt mit den gegebenen Parametern.

Parameters:
properties - Eigenschaften dieser Verbindung
subscriptionsManager - Anmeldungsverwaltung
connectionsManager - Verbindungsverwaltung
bestWayManager - Verwaltung der günstigsten Wege zu anderen Datenverteilern
weight - Gewichtung dieser Verbindung
waitForConfiguration - true: auf die KOnfiguration muss gewartet werden, false: Konfiguration ist vorhanden
authentifyAsUser - Benutzername mit dem sich dieser Datenverteiler beim anderen Datenverteiler authentifizieren soll
authentifyWithPassword - Passwort des Benutzers mit dem sich dieser Datenverteiler beim anderen Datenverteiler authentifizieren soll
Method Detail

connect

public final void connect()
                   throws 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:
CommunicationError - , wenn bei der initialen Kommunikation mit dem Datenverteiler Fehler aufgetreten sind

getTelegrammTime

public final long getTelegrammTime(long maxWaitingTime)
                            throws 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:
getTelegrammTime 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:
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
Returns:
Gewichtung der Verbindung

sendRoutingUpdate

public final void sendRoutingUpdate(RoutingUpdate[] routingUpdates)
Description copied from interface: RoutingConnectionInterface
Diese Methode findet die besten Wege.

Specified by:
sendRoutingUpdate in interface RoutingConnectionInterface
Parameters:
routingUpdates - Aktualisierung der Verbindung

getRemoteUserId

public final long getRemoteUserId()
Description copied from interface: ServerHighLevelCommunication
Gibt die ID des verbundenen Benutzers zurück.

Specified by:
getRemoteUserId 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 ServerHighLevelCommunication
Returns:
ID des Kommunikationpartners

isAcceptedConnection

public final boolean isAcceptedConnection()
Gibt die Information zurück, ob diese Verbindung von dem anderen Datenverteiler akzeptiert wurde.

Returns:
true: verbindung wurde akzeptiert, false: Verbindung wurde nicht akzeptiert.

getRemoteAdress

public final String getRemoteAdress()
Returns:

getRemoteSubadress

public final int getRemoteSubadress()
Diese Methode gibt die Subadresse des Kommunikationspartners zurück.

Returns:
die Subadresse des Kommunikationspartners

continueAuthentification

public void continueAuthentification()
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:
continueAuthentification in interface ServerHighLevelCommunication

terminate

public void terminate(boolean error,
                      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.

terminate

public final void terminate(boolean error,
                            String message,
                            DataTelegram terminationTelegram)

disconnected

public void disconnected(boolean error,
                         String message)
Specified by:
disconnected in interface HighLevelCommunicationCallbackInterface

updateConfigData

public void updateConfigData(SendDataObject receivedData)
Specified by:
updateConfigData in interface HighLevelCommunicationCallbackInterface

sendTelegram

public void sendTelegram(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(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)

getSubscriptionComponent

public final SubscriptionComponent getSubscriptionComponent()
Description copied from interface: ServerHighLevelCommunication
Gibt die Komponente zurück, die die Anmeldungen der Verbindung verwaltet.

Specified by:
getSubscriptionComponent in interface ServerHighLevelCommunication
Returns:
Komponente die die Anmeldungen der Verbindung

update

public void update(DataTelegram telegram)
Specified by:
update in interface 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:
true: Initialisierung abgeschlossen, false: Initialisierung nicht abgeschlossen