public class T_A_HighLevelCommunication extends java.lang.Object implements T_A_HighLevelCommunicationInterface, HighLevelCommunicationCallbackInterface
Diese Klasse stellt eine Verbindung vom Datenverteiler zur Applikation dar. Über diese Verbindung können Telegramme an eine Applikation verschickt werden.
| Modifier and Type | Field and Description |
|---|---|
private long |
_applicationId
Der Applikation Id
|
private HighLevelApplicationManager |
_applicationManager |
private java.lang.String |
_applicationName
Der Name der Applikation
|
private java.lang.String |
_applicationTypePid
Die Pid des Applikationstyps
|
private AuthentificationComponent |
_authentificationComponent
Die Authentifizierungskomponente
|
private boolean |
_closed |
private java.lang.Object |
_closedLock |
private long |
_configurationId
Der Konfiguration Id
|
private java.lang.String |
_configurationPid
Die Pid der Konfiguration
|
private long |
_connectionCreatedTime |
private static Debug |
_debug |
private LowLevelCommunicationInterface |
_lowLevelCommunication
Die erste Ebene der Kommunikation
|
private LowLevelConnectionsManagerInterface |
_lowLevelConnectionsManager |
private UserLogin |
_pendingSrpUserLogin |
private ServerConnectionProperties |
_properties
Die Eigenschaften diese Verbindung
|
private static java.lang.String |
_secretToken
Geheimer datenverteilerseitig eindeutiger Zufallstext, aus dem SRP-Fake-Verifier gebildet werden können.
|
private SrpCryptoParameter |
_srpCryptoParameter
Kryptographische Parameter für die SRP-Authentifizierung
|
private SrpRequest |
_srpRequest
Die SRP-Anfragedaten
|
private SrpServerAuthentication |
_srpServerSession
Die Informationen zur SRP-Anmeldung
|
private java.util.Set<java.lang.Integer> |
_supportedProtocolVersions
Die unterstützten Versionen des Datenverteilers
|
private java.lang.Object |
_sync
Objekt zur internen Synchronization
|
private java.util.List<DataTelegram> |
_syncSystemTelegramList
Temporäre Liste der Systemtelegramme für interne Synchronisationszwecke.
|
private UserLogin |
_userLogin
Die Id des Benutzers
|
private boolean |
_waitForConfiguration
Die Information ob auf die Konfiguration gewartet werden muss.
|
| Constructor and Description |
|---|
T_A_HighLevelCommunication(ServerConnectionProperties properties,
HighLevelApplicationManager applicationManager,
LowLevelConnectionsManagerInterface lowLevelConnectionsManager,
boolean waitForConfiguration)
Erzeugt ein neues Objekt mit den gegebenen Parametern.
|
| Modifier and Type | Method and Description |
|---|---|
private void |
completeAuthenticationAndSendAnswer()
Prüft ob die vorangegangene Authentifizierung erfolgreich war.
|
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.
|
private boolean |
createApplicationObject()
Legt ein Applikationsobjekt an (falls es sich nicht um die lokale Konfiguration handelt)
|
void |
disconnected(boolean error,
java.lang.String message)
Wird von der unteren Kommunikationsschicht in Fehlersituationen zum Abbruch der Kommunikationsverbindung aufgerufen.
|
private static SrpVerifierData |
fakeVerifier(ClientCredentials clientCredentials,
java.lang.String userName) |
private SrpVerifierAndUser |
fetchSrpUserData(java.lang.String userName,
int passwordIndex)
Bestimmt für den Benutzernamen und übergebenen Einmal-Passwortindex (bzw -1 für Standardpasswort) den Srp-Verifier und die Benutzer-ID.
|
private boolean |
firstInitialization(java.lang.String applicationTypePid,
java.lang.String applicationName,
java.lang.String configurationPid)
Speichert die bei der Authentifizierung übertragenen Daten zwischen und wartet ggf. auf die Konfiguration.
|
java.lang.String |
getApplicationName()
Gibt den Namen der Applikation zurück.
|
java.lang.String |
getApplicationTypePid()
Gibt den Typ der Applikation zurück.
|
long |
getConfigurationId()
Gibt die Id der Konfiguration zurück.
|
long |
getConnectionCreatedTime()
Zeitpunkt, an dem das Objekt erstellt wurde und somit eine Verbindung zum DaV bestand.
|
private long |
getFormativeConfigurationId()
Gibt die prägende ID der Konfiguration zurück
|
long |
getId()
Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.
|
private int |
getPreferredVersion(int[] versions)
Gibt die Version zurück, die von dieser Verbindung unterstützt wird.
|
java.lang.String |
getSendBufferState()
Liefert einen beschreibenden Text mit dem Zustand des Sendepuffers aus der LowLevelCommunication.
|
long |
getTelegramTime(long maxWaitingTime)
Diese Methode wird von der Verbindungsverwaltung aufgerufen.
|
UserLogin |
getUserLogin()
Gibt die ID des verbundenen Benutzers zurück.
|
private boolean |
initializeConfiguration()
Diese Methode prüft, ob es schon eine Konfiguration gibt.
|
boolean |
isConfiguration()
Gibt zurück, ob es sich um die Konfiguration handelt.
|
private void |
needsToBeAuthenticated()
Hilfsfunktion, die eine Exception wirft, wenn der Benutzer noch nicht erfolgreich authentifiziert ist
|
private void |
needsToBeNotAuthenticated()
Hilfsfunktion, die eine Exception wirft, wenn der Benutzer schon erfolgreich authentifiziert ist
|
private static byte[] |
secretHash(java.lang.String userName) |
void |
sendData(ApplicationDataTelegram telegram) |
void |
sendData(ApplicationDataTelegram[] telegrams) |
void |
sendData(ApplicationDataTelegram telegram,
boolean toCentralDistributor)
Versendet ein Daten-Telegramm über diese Verbindung
|
void |
setUserLogin(UserLogin userLogin)
Setzt den eingeloggten Benutzer (nur für Testzwecke)
|
void |
terminate(boolean error,
java.lang.String message)
Terminiert die Kommunikationsverbindung.
|
void |
terminate(boolean error,
java.lang.String message,
DataTelegram terminationTelegram) |
java.lang.String |
toString() |
void |
triggerSender(BaseSubscriptionInfo data,
byte state)
Diese Methode wird von der Verbindungsverwaltung aufgerufen, um eine Sendesteuerung an die Applikation weiterzuleiten.
|
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 boolean |
updateParametersAndCreateApplicationObject()
Aktualisiert verschiedene Parameter und legt ein Applikationsobjekt an
|
private static final Debug _debug
private final LowLevelCommunicationInterface _lowLevelCommunication
Die erste Ebene der Kommunikation
private ServerConnectionProperties _properties
Die Eigenschaften diese Verbindung
private final java.util.Set<java.lang.Integer> _supportedProtocolVersions
Die unterstützten Versionen des Datenverteilers
private long _applicationId
Der Applikation Id
private UserLogin _userLogin
Die Id des Benutzers
private long _configurationId
Der Konfiguration Id
private java.lang.String _applicationName
Der Name der Applikation
private java.lang.String _applicationTypePid
Die Pid des Applikationstyps
private java.lang.String _configurationPid
Die Pid der Konfiguration
private AuthentificationComponent _authentificationComponent
Die Authentifizierungskomponente
private java.util.List<DataTelegram> _syncSystemTelegramList
Temporäre Liste der Systemtelegramme für interne Synchronisationszwecke.
private boolean _waitForConfiguration
Die Information ob auf die Konfiguration gewartet werden muss.
private final java.lang.Object _sync
Objekt zur internen Synchronization
private boolean _closed
private java.lang.Object _closedLock
private final long _connectionCreatedTime
private final HighLevelApplicationManager _applicationManager
private final LowLevelConnectionsManagerInterface _lowLevelConnectionsManager
private SrpServerAuthentication _srpServerSession
Die Informationen zur SRP-Anmeldung
private SrpRequest _srpRequest
Die SRP-Anfragedaten
private static final java.lang.String _secretToken
Geheimer datenverteilerseitig eindeutiger Zufallstext, aus dem SRP-Fake-Verifier gebildet werden können. Dieser Text wird vorberechnet, damit Fake-Verifier über die Laufzeit des Datenverteilers konstant sind und jemand so nicht einfach die Existenz von Benutzern prüfen kann
private SrpCryptoParameter _srpCryptoParameter
Kryptographische Parameter für die SRP-Authentifizierung
private UserLogin _pendingSrpUserLogin
public T_A_HighLevelCommunication(ServerConnectionProperties properties, HighLevelApplicationManager applicationManager, LowLevelConnectionsManagerInterface lowLevelConnectionsManager, boolean waitForConfiguration)
Erzeugt ein neues Objekt mit den gegebenen Parametern.
properties - stellt die Parameter einer Verbindung zwischen zwei ServernlowLevelConnectionsManager - waitForConfiguration - true: ,false:public final long getTelegramTime(long maxWaitingTime)
throws CommunicationError
ServerHighLevelCommunicationDiese 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.
getTelegramTime in interface ServerHighLevelCommunicationmaxWaitingTime - Maximale Zeit, die auf eine Antwort gewartet wird.-1, wenn nicht innnerhalb der maximalen Wartezeit eine Antwort empfangen wurde.CommunicationError - Wenn bei der initialen Kommunikation mit dem Datenverteiler Fehler aufgetreten sind.public final void sendData(ApplicationDataTelegram telegram, boolean toCentralDistributor)
CommunicationInterfaceVersendet ein Daten-Telegramm über diese Verbindung
sendData in interface CommunicationInterfacetelegram - TelegrammtoCentralDistributor - true: In Richtung des Zentraldatenverteilers, beim Sender-Senke-Datenfluss. false: Aus Richtung des Zentraldatenverteilers, beim Quelle-Empfänger-Datenfluss.public final void sendData(ApplicationDataTelegram telegram)
public final void sendData(ApplicationDataTelegram[] telegrams)
public final void terminate(boolean error,
java.lang.String message)
ServerHighLevelCommunicationTerminiert die Kommunikationsverbindung.
terminate in interface ServerHighLevelCommunicationerror - 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 long getConnectionCreatedTime()
Zeitpunkt, an dem das Objekt erstellt wurde und somit eine Verbindung zum DaV bestand.
public java.lang.String getSendBufferState()
Liefert einen beschreibenden Text mit dem Zustand des Sendepuffers aus der LowLevelCommunication.
LowLevelCommunicationInterface.getSendBufferState()public final void terminate(boolean error,
java.lang.String message,
DataTelegram terminationTelegram)
public void disconnected(boolean error,
java.lang.String message)
de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterfacedisconnected in interface HighLevelCommunicationCallbackInterfaceerror - true signalisiert eine Fehlersituation der unteren Kommunikationsschicht.message - Fehlermeldung, die die Fehlersituation näher beschreibt.public void updateConfigData(SendDataObject receivedData)
de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterfaceupdateConfigData in interface HighLevelCommunicationCallbackInterfacereceivedData - das Konfigurationstelegrammpublic final void triggerSender(BaseSubscriptionInfo data, byte state)
ApplicationCommunicationInterfaceDiese Methode wird von der Verbindungsverwaltung aufgerufen, um eine Sendesteuerung an die Applikation weiterzuleiten. Aus den übergebenen Parametern wird ein RequestSenderDataTelegram-Array gebildet und über die Telegrammverwaltung an die Applikation gesendet.
triggerSender in interface ApplicationCommunicationInterfacedata - Anmeldeinformationenstate - BenachrichtigungscodeRequestSenderDataTelegrampublic final long getId()
ServerHighLevelCommunicationDiese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.
getId in interface ServerHighLevelCommunicationgetId in interface CommunicationInterfacepublic final UserLogin getUserLogin()
ServerHighLevelCommunicationGibt die ID des verbundenen Benutzers zurück.
getUserLogin in interface ServerHighLevelCommunicationgetUserLogin in interface CommunicationInterfacepublic void setUserLogin(UserLogin userLogin)
Setzt den eingeloggten Benutzer (nur für Testzwecke)
userLogin - Benutzerpublic final long getConfigurationId()
T_A_HighLevelCommunicationInterfaceGibt die Id der Konfiguration zurück.
getConfigurationId in interface T_A_HighLevelCommunicationInterfacepublic final java.lang.String getApplicationTypePid()
T_A_HighLevelCommunicationInterfaceGibt den Typ der Applikation zurück.
getApplicationTypePid in interface T_A_HighLevelCommunicationInterfacepublic final java.lang.String getApplicationName()
T_A_HighLevelCommunicationInterfaceGibt den Namen der Applikation zurück.
getApplicationName in interface T_A_HighLevelCommunicationInterfacepublic final boolean isConfiguration()
T_A_HighLevelCommunicationInterfaceGibt zurück, ob es sich um die Konfiguration handelt.
isConfiguration in interface T_A_HighLevelCommunicationInterfacetrue, wenn es sich um die Konfiguration handelt, sonst falsepublic final void continueAuthentication()
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.
continueAuthentication in interface ServerHighLevelCommunicationprivate int getPreferredVersion(int[] versions)
Gibt die Version zurück, die von dieser Verbindung unterstützt wird.
versions - Versionen, die unterstützt werden sollen. Wird null übergeben, so wird -1 zurückgegeben.public final void update(DataTelegram telegram)
de.bsvrz.dav.daf.communication.lowLevel.HighLevelCommunicationCallbackInterfaceupdate in interface HighLevelCommunicationCallbackInterfacetelegram - Das empfangene Telegrammprivate void needsToBeAuthenticated()
Hilfsfunktion, die eine Exception wirft, wenn der Benutzer noch nicht erfolgreich authentifiziert ist
private void needsToBeNotAuthenticated()
Hilfsfunktion, die eine Exception wirft, wenn der Benutzer schon erfolgreich authentifiziert ist
private SrpVerifierAndUser fetchSrpUserData(java.lang.String userName, int passwordIndex) throws SrpNotSupportedException
Bestimmt für den Benutzernamen und übergebenen Einmal-Passwortindex (bzw -1 für Standardpasswort) den Srp-Verifier und die Benutzer-ID. Hierzu wird normalerweise die Konfiguration gefragt, aber für die Anmeldung der lokalen Konfiguration, Parametrierung und der SelfClientDavConnection gibt es Spezialfälle.
userName - BenutzernamepasswordIndex - Einmalpasswort-IndexSrpNotSupportedException - SRP wird von der Konfiguration nicht unterstütztprivate static SrpVerifierData fakeVerifier(ClientCredentials clientCredentials, java.lang.String userName)
private static byte[] secretHash(java.lang.String userName)
public java.lang.String toString()
toString in class java.lang.Objectprivate void completeAuthenticationAndSendAnswer()
throws ConfigurationChangeException
Prüft ob die vorangegangene Authentifizierung erfolgreich war. Ist dies der Fall, wird die Initialisierung abgeschlossen und ggf. ein Applikationsobjekt bei der Konfiguration angefordert.
Schickt eine Antwort über den Authentifizierungs-Erfolg an den Client.
ConfigurationChangeException - Fehler beim Anlegen eines Applikationsobjektsprivate boolean firstInitialization(java.lang.String applicationTypePid,
java.lang.String applicationName,
java.lang.String configurationPid)
Speichert die bei der Authentifizierung übertragenen Daten zwischen und wartet ggf. auf die Konfiguration. Da zu diesem Zeitpunkt noch keine Authentifizierung erfolgt ist, dürfen diese Daten noch nicht an relevanten Stellen weiterverwendet werden
applicationTypePid - Pid des verbundenen Applikationstyps (z.B. “typ.applikation”)applicationName - Name der verbundenen ApplikationconfigurationPid - Bei der lokalen Konfiguration: “Pid:ID” des KV, sonst CommunicationConstant.LOCALE_CONFIGURATION_PID_ALIASEprivate boolean updateParametersAndCreateApplicationObject()
throws ConfigurationChangeException
Aktualisiert verschiedene Parameter und legt ein Applikationsobjekt an
ConfigurationChangeException - Problem beim Anlegen des Applikationsobjektsprivate boolean createApplicationObject()
throws ConfigurationChangeException
Legt ein Applikationsobjekt an (falls es sich nicht um die lokale Konfiguration handelt)
ConfigurationChangeExceptionprivate long getFormativeConfigurationId()
Gibt die prägende ID der Konfiguration zurück
private boolean initializeConfiguration()
Diese Methode prüft, ob es schon eine Konfiguration gibt. Falls ja, gibt die Methode true zurück. Falls nein wird geprüft ob es sich bei dieser Applikation um die Konfiguration handelt. Falls ja, wird der Datenverteiler mit dieser Konfiguration geprägt. Falls nein wird auf die Konfiguration gewartet.