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
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.
getTelegramTime
in interface ServerHighLevelCommunication
maxWaitingTime
- 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)
CommunicationInterface
Versendet ein Daten-Telegramm über diese Verbindung
sendData
in interface CommunicationInterface
telegram
- 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)
ServerHighLevelCommunication
Terminiert die Kommunikationsverbindung.
terminate
in interface ServerHighLevelCommunication
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 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.HighLevelCommunicationCallbackInterface
disconnected
in interface HighLevelCommunicationCallbackInterface
error
- 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.HighLevelCommunicationCallbackInterface
updateConfigData
in interface HighLevelCommunicationCallbackInterface
receivedData
- das Konfigurationstelegrammpublic final void triggerSender(BaseSubscriptionInfo data, byte state)
ApplicationCommunicationInterface
Diese 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 ApplicationCommunicationInterface
data
- Anmeldeinformationenstate
- BenachrichtigungscodeRequestSenderDataTelegram
public final long getId()
ServerHighLevelCommunication
Diese Methode wird von der Verbindungsverwaltung aufgerufen, um die ID der verbundenen Applikation zu erhalten.
getId
in interface ServerHighLevelCommunication
getId
in interface CommunicationInterface
public final UserLogin getUserLogin()
ServerHighLevelCommunication
Gibt die ID des verbundenen Benutzers zurück.
getUserLogin
in interface ServerHighLevelCommunication
getUserLogin
in interface CommunicationInterface
public void setUserLogin(UserLogin userLogin)
Setzt den eingeloggten Benutzer (nur für Testzwecke)
userLogin
- Benutzerpublic final long getConfigurationId()
T_A_HighLevelCommunicationInterface
Gibt die Id der Konfiguration zurück.
getConfigurationId
in interface T_A_HighLevelCommunicationInterface
public final java.lang.String getApplicationTypePid()
T_A_HighLevelCommunicationInterface
Gibt den Typ der Applikation zurück.
getApplicationTypePid
in interface T_A_HighLevelCommunicationInterface
public final java.lang.String getApplicationName()
T_A_HighLevelCommunicationInterface
Gibt den Namen der Applikation zurück.
getApplicationName
in interface T_A_HighLevelCommunicationInterface
public final boolean isConfiguration()
T_A_HighLevelCommunicationInterface
Gibt zurück, ob es sich um die Konfiguration handelt.
isConfiguration
in interface T_A_HighLevelCommunicationInterface
true
, wenn es sich um die Konfiguration handelt, sonst false
public final void continueAuthentication()
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.
continueAuthentication
in interface ServerHighLevelCommunication
private 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.HighLevelCommunicationCallbackInterface
update
in interface HighLevelCommunicationCallbackInterface
telegram
- 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.Object
private 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_ALIASE
private 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)
ConfigurationChangeException
private 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.