public class ClientHighLevelCommunication extends Object implements HighLevelCommunicationCallbackInterface
Modifier and Type | Class and Description |
---|---|
private class |
ClientHighLevelCommunication.SendControlNotifier
Asynchrone Verarbeitung von empfangenen Sendsteuerungstelegrammen.
|
Modifier and Type | Field and Description |
---|---|
private long |
_applicationId
Die Applikation Id
|
private CacheManager |
_cacheManager
Der Cache-Manager (Teil der Verwaltung).
|
private ApplicationCloseActionHandler |
_closer
Das Objekt, das für das Schliessen nach Auftritt eines Fehlers zuständig ist.
|
private ConfigurationManager |
_configurationManager
Der Konfigurationsmanager (Teil der Verwaltung).
|
private DavConnectionListener |
_connectionListener
Beobachter für Zustandsänderungen der Datenverteilerverbindung.
|
private int |
_dafVersion
Die eingestellte Protokollversion
|
private static Debug |
_debug
Der Debug-Logger.
|
private boolean |
_disconnecting
Wird beim ersten Aufruf von terminate(...) gesetzt.
|
private boolean |
_disconnectingOnError
Wird beim ersten Aufruf von terminate(true, ...) gesetzt.
|
private long |
_localConfigurationId
Die lokale Konfiguration Id
|
private long |
_localDVId
Die lokale Datenverteiler-Id
|
private boolean |
_readyForConfigDependantData
Hält die Informationen über den Initialisierungszustand dieser Komponente.
|
private ClientHighLevelCommunication.SendControlNotifier |
_sendControlNotifier
Asynchrone Verarbeitung von empfangenen Sendsteuerungstelegrammen
|
private SubscriptionManager |
_subscriptionManager
Der Anmeldemanager (Teil der Verwaltung).
|
private List<DataTelegram> |
_syncSystemTelegramList
Temporäre Liste der Systemtelegramme für interne Synchronisationszwecke.
|
private long |
_userId
Die Id des Benutzers
|
private ClientConnectionProperties |
properties
Die Kommunikationseingenschaften
|
private SplittedApplicationTelegramsTable |
splittedTelegramsTable
Temporäre Liste der zerstückelten Telegramme.
|
Constructor and Description |
---|
ClientHighLevelCommunication()
Dieser Konstruktor wird für JUnit-Tests gebraucht.
|
ClientHighLevelCommunication(ClientDavParameters clientDavParameters,
ApplicationCloseActionHandler closer)
Dieser Konstruktor erzeugt eine Instanz dieser Klasse mit den übergebenen Parametern.
|
Modifier and Type | Method and Description |
---|---|
private AuthentificationAnswer |
authentify(byte[] encryptedUserPassword)
Schickt ein Authentifikations-Telegramm zum Datenverteiler und wartet auf seine Antwort.
|
void |
completeInitialisation(ConfigurationManager configurationManager,
CacheManager cacheManager,
SubscriptionManager subscriptionManager)
Schließt die Initialisierung ab.
|
void |
connect()
Die Methode erstellt eine logische Verbindung zum Datenverteiler, d.
|
void |
disconnected(boolean error,
String message)
Wird von der unteren Kommunikationsschicht in Fehlersituationen zum Abbruch der Kommunikationsverbindung aufgerufen.
|
long |
getApplicationId()
Gibt die Id der Applikation zurück.
|
private AuthentificationTextAnswer |
getAuthentificationText()
Schickt ein AuthentifikationsText-Telegramm zum Datenverteiler und wartet auf seine Antwort.
|
private ComParametersAnswer |
getComParameters()
Schickt ein ComParameter-Telegramm zum Datenverteiler und wartet auf seine Antwort.
|
long |
getConfigurationId()
Gibt die Id der Konfiguration zurück.
|
ClientConnectionProperties |
getConnectionProperties()
Diese Methode gibt die Eigenschaften dieser Verbindung zurück.
|
private DataTelegram |
getDataTelegram(long maximumWaitingTime,
byte telegramType)
Diese Methode dient dem reduzieren von doppeltem Code.
|
long |
getDataTransmitterId()
Gibt die Id des Datenverteilers zurück.
|
private ProtocolVersionAnswer |
getProtocolVersions()
Schickt ein Protokollversions-Telegramm zum Datenverteiler und wartet auf seine Antwort.
|
List<DataTelegram> |
getSyncSystemTelegramList()
Gibt die temporäre Liste der Systemtelegramme für interne Synchronisationszwecke zurück.
|
long |
getTelegramTime(long maxWaitingTime)
Schickt ein Laufzeitermittlungs-Telegramm zum Datenverteiler und wartet auf seine Antwort, um herauszubekommen, wie viel Zeit die Übertragung in Anspruch
nimmt.
|
long |
getUserId()
Gibt die Id des Benutzers zurück.
|
private void |
notifyConnectionClosed()
Wird die Verbindung zum Datenverteiler terminiert, so wird dem Beobachter, der sich dafür interessiert, dieses mitgeteilt.
|
void |
sendData(SendDataObject dataToSend)
Versendet ein Applikationsdatentelegramm an den Datenverteiler.
|
void |
sendReceiveSubscription(ReceiveSubscriptionInfo subscription)
Es wird ein
Empfangsanmeldungstelegramm erstellt und zum Datenverteiler gesendet. |
void |
sendReceiveUnsubscription(BaseSubscriptionInfo unsubscription)
Es wird ein
Empfangsabmeldungstelegramm erstellt und zum Datenverteiler gesendet. |
void |
sendSendSubscription(SendSubscriptionInfo subscription)
Es wird ein
Sendeanmeldetelegramm erstellt und zum Datenverteiler gesendet. |
void |
sendSendUnsubscription(BaseSubscriptionInfo unsubscription)
Es wird ein
Sendeabmeldetelegramm erstellt und zum Datenverteiler gesendet. |
void |
setCloseHandler(ApplicationCloseActionHandler closer)
Setzt den
ApplicationCloseActionHandler dieser Subkomponente. |
void |
setConnectionListener(DavConnectionListener connectionListener)
Meldet einen Beobachter für Zustandsänderungen der Datenverteilerverbindung an.
|
void |
setReadyForConfigDependantData()
Diese Methode wird vom Anmeldungsmanager aufgerufen, nachdem die Anmeldungen erfolgreich abgeschlossen sind, die eine gerichtete Kommunikation mit der
Konfiguration gewährleisten.
|
void |
terminate(boolean error,
String message)
Die bestehende Verbindung zum Datenverteiler wird terminiert, und der Kommunikationskanal wird geschlossen.
|
void |
terminate(boolean error,
String message,
DataTelegram terminationTelegram) |
void |
update(DataTelegram telegram)
Wird von der unteren Kommunikationsschicht nach Empfang eines Telegramms aufgerufen.
|
void |
updateConfigData(SendDataObject receivedData)
Wenn ein neues Konfigurationstelegramm angekommen ist, wird es an die Verwaltung weitergeleitet.
|
private static final Debug _debug
private int _dafVersion
private long _userId
private long _applicationId
private long _localConfigurationId
private long _localDVId
private ConfigurationManager _configurationManager
private CacheManager _cacheManager
private SubscriptionManager _subscriptionManager
private final List<DataTelegram> _syncSystemTelegramList
private SplittedApplicationTelegramsTable splittedTelegramsTable
private boolean _readyForConfigDependantData
private volatile boolean _disconnecting
private volatile boolean _disconnectingOnError
private ApplicationCloseActionHandler _closer
private ClientConnectionProperties properties
private DavConnectionListener _connectionListener
private ClientHighLevelCommunication.SendControlNotifier _sendControlNotifier
public ClientHighLevelCommunication(ClientDavParameters clientDavParameters, ApplicationCloseActionHandler closer) throws CommunicationError, ConnectionException
ClientDavParameters
enthält die Adresse
und Subadresse des Datenverteilers, spezifiziert das zu verwendende Protokoll durch dessen Namen. ApplicationCloseActionHandler
bestimmt wie die Applikationsfunktion auf einen Kommunikationsfehler reagieren soll.
ClientConnectionProperties
werden erzeugt, die die Eigenschaften dieser Verbindung verkörpern. Sie spezifizieren insbesondere
den AuthentificationProcess
, das für die Passwortverschlüsselung zuständige Verfahren. Weiter enthalten
sie die PID der Konfiguration.
Ein Systemtelegramm ProtocolVersionRequest
wird gebildet und zum Datenverteiler gesendet. Es enthält Angaben über die
unterstützte Protokollversion. Auf die Antwort wird eine festgelegte Zeit gewartet (maximale Wartezeit auf synchrone Antworten). Wenn die Antwort nicht
innerhalb diese Zeit an-gekommen ist oder die Protokollversion vom Datenverteiler nicht unterstützt wird, dann wird eine CommunicationError-Ausnahme
erzeugt.clientDavParameters
- Parameterklasse für die Datenverteiler-Applikationsfunktionencloser
- bestimmt, wie die Applikationsfunktionen auf einen Kommunikationsfehler reagieren sollCommunicationError
- Wenn die Verhandlung der Protokollversion nicht durchgeführt wurde oder die Protokollversion nicht unterstützt wird.ConnectionException
- Wenn die Verbindung über die Telegrammverwaltung fehlschlägt.public ClientHighLevelCommunication()
public final void completeInitialisation(ConfigurationManager configurationManager, CacheManager cacheManager, SubscriptionManager subscriptionManager)
configurationManager
- der KonfigurationsmanagercacheManager
- der Cache-ManagersubscriptionManager
- der Anmeldungsmanagerpublic long getApplicationId()
public final long getDataTransmitterId()
public final long getConfigurationId()
public final long getUserId()
public final void setReadyForConfigDependantData()
public final void setCloseHandler(ApplicationCloseActionHandler closer)
ApplicationCloseActionHandler
dieser Subkomponente. Dieser bestimmt wie die Applikationsfunktion auf einen Kommunikationsfehler reagieren
soll.closer
- ApplicationCloseActionHandler
public final void connect() throws InconsistentLoginException, CommunicationError
AuthentificationTextRequest
-Telegramm mit der
Konfigurations-PID wird über die Telegrammverwaltung
zum Datenverteiler gesendet, um einen Schlüssel für die
Authentifizierung anzufordern. Auf die Antwort AuthentificationTextAnswer
wird eine gewisse Zeit gewartet (maximale Wartezeit auf synchrone
Antworten). Mit dem vom Datenverteiler erhaltenen Schlüssel wird das Benutzerpasswort durch den AuthentificationProcess
verschlüsselt und als AuthentificationRequest
zum Datenverteiler gesendet. Auch hier wird eine gewisse Zeit auf die Antwort AuthentificationAnswer
gewartet (maximale
Wartezeit auf synchrone Antworten). Wenn die Authentifizierung erfolgreich ist, werden die Ids der Applikation, des Datenverteilers, der Konfiguration und
des Benutzers übertragen und von dieser Subkomponente festgehalten. Wird als Id der Konfiguration -1
zurückgegeben, so war die spezifizierte
PID dem System nicht bekannt. Sonst werden die Keep-alive-Parameter und die Durchsatzprüfungsparameter mit dem Datenverteiler verhandelt. Ein ComParametersRequest
wird zum Datenverteiler gesendet. Auch hier wird auf die Antwort ComParametersAnswer
eine gewisse Zeit gewartet (maximale
Wartezeit auf synchrone Antworten).InconsistentLoginException
- Wenn die Authentifizierung nicht erfolgreich abgeschlossen werden konnte.CommunicationError
- Wenn eine Antwort nicht innerhalb einer parametrierten Zeit vom Datenverteiler beantwortet wird oder wenn als Id der
Konfiguration eine -1
ermittelt wird.public void sendReceiveSubscription(ReceiveSubscriptionInfo subscription)
Empfangsanmeldungstelegramm
erstellt und zum Datenverteiler gesendet.subscription
- die Empfangsanmeldeinformationenpublic final void sendReceiveUnsubscription(BaseSubscriptionInfo unsubscription)
Empfangsabmeldungstelegramm
erstellt und zum Datenverteiler gesendet.unsubscription
- die Empfangsabmeldeinformationenpublic void sendSendSubscription(SendSubscriptionInfo subscription)
Sendeanmeldetelegramm
erstellt und zum Datenverteiler gesendet.subscription
- die Sendeanmeldeinformationenpublic final void sendSendUnsubscription(BaseSubscriptionInfo unsubscription)
Sendeabmeldetelegramm
erstellt und zum Datenverteiler gesendet.unsubscription
- die Sendeabmeldeinformationenpublic final void sendData(SendDataObject dataToSend)
dataToSend
- die zu sendenden Daten als Bytefeld vorbereitetpublic final void terminate(boolean error, String message)
error
gesetzt
ist, wird die close-Methode vom ApplicationCloseActionHandler
aufgerufen.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.public final void terminate(boolean error, String message, DataTelegram terminationTelegram)
public void disconnected(boolean error, String message)
HighLevelCommunicationCallbackInterface
disconnected
in interface HighLevelCommunicationCallbackInterface
error
- true
signalisiert eine Fehlersituation der unteren Kommunikationsschicht.message
- Fehlermeldung, die die Fehlersituation näher beschreibt.public final void update(DataTelegram telegram) throws InterruptedException
LowLevelCommunication
aufgerufen, wenn ein neues
Telegramm angekommen ist. Sie reagiert nur auf die Telegramme, die für die Applikation von Interesse sind.
Neu ankommende Telegramme werden je nach Typ unterschiedlich weiterverarbeitet:
Wenn das Telegramm vom Typ AuthentificationTextAnswer
, AuthentificationAnswer
, ComParametersAnswer
, ProtocolVersionAnswer
oder TelegramTimeAnswer
ist, wird es in eine Liste eingefügt und eine Broadcast-Nachricht an alle wartenden Methoden gesendet. Diese überprüfen ob
die Nachricht für sie relevant ist. In diesem Falle wird sie aus der Liste entfernt und bearbeitet.TelegramTimeRequest
ist, wird anhand der übergebenen gemessene Zeit ein TelegramTimeAnswer
gebildet und zum Datenverteiler gesendet. RequestSenderDataTelegram
ist, wird die Methode notifySenderApplication
des Anmeldungsmanagers aufgerufen, um die Applikation zu benachrichtigen. ApplicationDataTelegram
ist, wird zunächst überprüft, ob ein zerstückeltes Telegramm vorliegt. Ist dies der Fall, dann wird es in eine Liste eingefügt und
überprüft ob alle Teiltelegramme vorhanden sind. Sind alle vorhanden, wird aus den Telegrammen ein SendDataObject
erzeugt, das weiterverarbeitet
werden kann. Wenn das Telegramm nicht zerstückelt ist, wird es sofort in ein SendDataObject
zur Weiterbearbeitung umgewandelt. Wenn dieses
erfolgreich erzeugt wurde, wird anhand seiner Basisanmeldeinformation überprüft, ob es eine Antwort einer Konfigurationsanfrage ist. Ist dies der Fall, so
wird das Telegramm der update
-Methode des
Konfigurations-Managers übergeben, wenn nicht, handelt es sich um ein Online-Telegramm und es wird an die update
-Methode des Cache-Managers übergeben. ClosingTelegram
oder TerminateOrderTelegram
ist, wird die Methode terminate(boolean, java.lang.String)
aufgerufen.
Jeder andere Telegrammtyp wird ignoriert.update
in interface HighLevelCommunicationCallbackInterface
telegram
- Das empfangene TelegrammInterruptedException
- Wenn der Thread während eines blockierenden Aufrufs unterbrochen wurdepublic final void updateConfigData(SendDataObject receivedData)
HighLevelCommunicationCallbackInterface
updateConfigData
in interface HighLevelCommunicationCallbackInterface
receivedData
- das Konfigurationstelegrammpublic final ClientConnectionProperties getConnectionProperties()
private ProtocolVersionAnswer getProtocolVersions()
null
, falls die Antwort nicht ermittelt werden konnte.private DataTelegram getDataTelegram(long maximumWaitingTime, byte telegramType)
maximumWaitingTime
- die gewünschte maximale WartezeittelegramType
- den gewünschten Telegramm-Typprivate AuthentificationTextAnswer getAuthentificationText()
null
, falls sie nicht ermittelt werden konnte.private AuthentificationAnswer authentify(byte[] encryptedUserPassword)
encryptedUserPassword
- das verschlüsselte Passwort des Benutzersnull
, falls die Antwort nicht ermittelt werden konnte.private ComParametersAnswer getComParameters()
null
, falls die Antwort nicht ermittelt werden konnte.public final long getTelegramTime(long maxWaitingTime) throws CommunicationError
maxWaitingTime
- Zeit in Millisekunden, die maximal auf eine Antwort gewartet wird.-1
falls innerhalb
der angegebenen Timeout-Zeit keine Antwort empfangen wurde.CommunicationError
- Falls die Verbindung zum Datenverteiler gestört ist.public void setConnectionListener(DavConnectionListener connectionListener)
connectionListener
- Beobachter für Zustandsänderungen der Datenverteilerverbindungprivate void notifyConnectionClosed()
public List<DataTelegram> getSyncSystemTelegramList()