public abstract class DataLoader
extends java.lang.Object
Abstrakte Klasse, die allgemeine Funktionen bietet (Parameter-)Daten eines Systemobjekts zu laden, auf dessen Initialisierung zu warten usw.
Modifier and Type | Field and Description |
---|---|
private java.lang.String |
_aspectPid
Aspekt-Pid
|
private java.lang.String |
_attributeGroupPid
Attributgruppen-Pid
|
private ClientDavInterface |
_connection
Dav-Verbindung
|
private DataDescription |
_dataDescription
Datenbeschreibung
|
private DataState |
_dataState |
protected Debug |
_debug
Debug
|
private boolean |
_hasData
Ob auch wirklich Daten da sind (nicht true wenn “keine Daten” oder “keine Quelle”)
|
private boolean |
_isInitialized
Ob der Receiver bereits etwas empfangen hat (auch true wenn “keine Daten” oder “keine Quelle”)
|
private long |
_noDataTime |
protected java.util.concurrent.locks.Lock |
_readLock
Lock, das zum Lesen von Daten benutzt wird.
|
private java.util.concurrent.locks.ReadWriteLock |
_readWriteLock |
private ClientReceiverInterface |
_receiver
Empfänger
|
private SystemObject |
_systemObject
Gekapseltes Systemobjekt
|
private java.lang.Object |
_updateNotifier
Objekt, das für notifyAll() benutzt wird um das Eintreffen von Daten zu signalisieren
|
private boolean |
_waitForData
Ob auf das Eintreffen von Daten gewartet werden soll, oder ob auch das Eintreffen von “keine Daten” oder “keine Quelle” ausreichen soll, mit dem Initialisieren aufzuhören
|
protected java.util.concurrent.locks.Lock |
_writeLock |
private static int |
TIMEOUT
Wie lange auf Daten gewartet wird (in ms)
|
Constructor and Description |
---|
DataLoader(ClientDavInterface connection,
java.lang.String attributeGroupPid,
java.lang.String aspectPid,
java.lang.Object lock)
Erstellt ein neues Objekt, für das Daten aktualisiert werden sollen.
|
Modifier and Type | Method and Description |
---|---|
protected abstract void |
deactivateInvalidChild(DataLoader node)
Wenn es ein Problem mit der Rekursion gibt, wird dieses Objekt hiermit angewiesen den Verweis auf das angegebene (Unter-)Objekt zu deaktivieren.
|
protected abstract java.util.Collection<DataLoader> |
getChildObjects()
Gibt die untergeordneten Objekte zurück.
|
(package private) ClientDavInterface |
getConnection()
Gibt die Verbindung zum Datenverteiler zurück
|
DataState |
getDataState()
Gibt den aktuellen Zustand zurück
|
long |
getNoDataTime()
Gibt zurück, wie lange keine Daten eingetroffen sind
|
SystemObject |
getSystemObject()
Gibt das Systemobjekt zurück
|
(package private) void |
invalidate()
Wird für Tests usw. gebraucht um dem Objekt zu sagen, dass es nicht initialisiert ist, also bei der nächsten Anfrage darauf warten soll, bis neue Daten eintreffen
|
boolean |
isInitialized()
Prüft, ob dieses DataLoader-Objekt mit dem Laden der Daten fertig ist
|
protected void |
startDataListener(SystemObject systemObject)
Startet das Aktualisieren der Daten über das ClientReceiverInterface.
|
void |
stopDataListener()
Beendet das Aktualisieren der Daten über das ClientReceiverInterface
|
java.lang.String |
toString() |
java.lang.String |
toString(boolean verbose)
Bietet auf Wunsch eine ausführlichere String-Darstellung des Objekts (Allerdings auf Kosten der Verarbeitungszeit)
|
(package private) java.lang.String |
toString(boolean verbose,
int depth)
Bietet auf Wunsch eine ausführlichere String-Darstellung des Objekts (Allerdings auf Kosten der Verarbeitungszeit)
|
protected abstract void |
update(Data data)
Wird aufgerufen, wenn neue Daten eingetroffen sind.
|
void |
waitForInitialization()
Wartet bis dieses Objekt mit dem Laden fertig ist, aber maximal die in
TIMEOUT angegebene Zeit. |
void |
waitForInitializationTree()
Wartet bis dieses Objekt und alle Kindobjekte mit dem Laden fertig sind, aber pro Objekt maximal die in
TIMEOUT angegebene Zeit. |
private final ClientReceiverInterface _receiver
Empfänger
private DataDescription _dataDescription
Datenbeschreibung
private SystemObject _systemObject
Gekapseltes Systemobjekt
private final ClientDavInterface _connection
Dav-Verbindung
private final java.lang.String _attributeGroupPid
Attributgruppen-Pid
private final java.lang.String _aspectPid
Aspekt-Pid
protected final Debug _debug
Debug
private volatile boolean _waitForData
Ob auf das Eintreffen von Daten gewartet werden soll, oder ob auch das Eintreffen von “keine Daten” oder “keine Quelle” ausreichen soll, mit dem Initialisieren aufzuhören
private volatile boolean _isInitialized
Ob der Receiver bereits etwas empfangen hat (auch true wenn “keine Daten” oder “keine Quelle”)
private volatile boolean _hasData
Ob auch wirklich Daten da sind (nicht true wenn “keine Daten” oder “keine Quelle”)
private final java.lang.Object _updateNotifier
Objekt, das für notifyAll() benutzt wird um das Eintreffen von Daten zu signalisieren
private static final int TIMEOUT
Wie lange auf Daten gewartet wird (in ms)
private final java.util.concurrent.locks.ReadWriteLock _readWriteLock
protected final java.util.concurrent.locks.Lock _readLock
Lock, das zum Lesen von Daten benutzt wird. Um Deadlocks zu verhindern und gleichzeitige Abfragen aus Performancegründen zu ermöglichen sollte dieses ReadLock bei allen lesenden Zugriffen verwendet werden. (Durch das Update einer Rolle/Region wird enumerateChildren bei anderen DataLoadern ausgeführt, wenn nebenläufig noch eine Abfrage nach Benutzerrechten läuft und und beide Threads ein exklusives Lock verwenden, gibt es Probleme. Da der Thread, in dem das Update durchgeführt wird, zwingend eine exklusives Lock (ein WriteLock) braucht, müssen alle Abfragen nach Benutzerrechten nicht exklusiv sein (ReadLock). Da immer nur ein Objekt gleichzeitig geupdatet wird, kommt es nicht zu Deadlocks durch mehrere WriteLocks)
protected final java.util.concurrent.locks.Lock _writeLock
private volatile long _noDataTime
private volatile DataState _dataState
public DataLoader(ClientDavInterface connection, java.lang.String attributeGroupPid, java.lang.String aspectPid, java.lang.Object lock)
Erstellt ein neues Objekt, für das Daten aktualisiert werden sollen.
connection
- Verbindung zum DatenverteilerattributeGroupPid
- AttributgruppeaspectPid
- Aspektlock
- protected abstract void update(Data data)
Wird aufgerufen, wenn neue Daten eingetroffen sind. Implementierende Klassen sollten hier das Data-Objekt verarbeiten.
data
- Data-Objekt entsprechend Attributgruppe und Aspektprotected abstract java.util.Collection<DataLoader> getChildObjects()
Gibt die untergeordneten Objekte zurück. Z.B. die Rollen und Regionen bei der Berechtigungsklasse oder die Berechtigungsklassen beim Benutzer. Wird gebraucht um Rekursionen zu erkennen und um den HighLevelSubscriptionsManager
über geänderte Benutzerrechte zu informieren. Achtung: Es werden nur die direkten Kinder zurückzugeben, nicht die “Enkel” usw. - Will man alle “Enkel” usw. haben muss man diese Funktion rekursiv aufrufen.
Hinweis: Mit deactivateInvalidChild(DataLoader)
deaktivierte Kindelemente werden nicht aufgeführt.
protected final void startDataListener(SystemObject systemObject)
Startet das Aktualisieren der Daten über das ClientReceiverInterface. Wartet bis die Daten geladen wurden. Nachdem diese Methode aufgerufen wurde, sollte das Objekt also initialisiert sein. Bei jedem Eintreffen von Daten wird die update(de.bsvrz.dav.daf.main.Data)
-Methode aufgerufen (auch nach dem ersten Aufruf der Methode). Um das Laden der Daten anzuhalten ist stopDataListener()
aufzurufen.
systemObject
- Objekt für das die Daten geholt werden sollenpublic void stopDataListener()
Beendet das Aktualisieren der Daten über das ClientReceiverInterface
protected abstract void deactivateInvalidChild(DataLoader node)
Wenn es ein Problem mit der Rekursion gibt, wird dieses Objekt hiermit angewiesen den Verweis auf das angegebene (Unter-)Objekt zu deaktivieren. Beispielsweise könnte eine Rolle angewiesen werden, eine innere Rolle zu deaktivieren, weil sie identisch mit der eigentlichen Rolle ist.
node
- Das zu entfernende Kindobjektpublic java.lang.String toString()
toString
in class java.lang.Object
public java.lang.String toString(boolean verbose)
Bietet auf Wunsch eine ausführlichere String-Darstellung des Objekts (Allerdings auf Kosten der Verarbeitungszeit)
verbose
- ausführlichere Darstellung wenn truejava.lang.String toString(boolean verbose, int depth)
Bietet auf Wunsch eine ausführlichere String-Darstellung des Objekts (Allerdings auf Kosten der Verarbeitungszeit)
verbose
- ausführlichere Darstellung wenn truedepth
- Tiefe für Einrückung zur DarstellungClientDavInterface getConnection()
Gibt die Verbindung zum Datenverteiler zurück
public boolean isInitialized()
Prüft, ob dieses DataLoader-Objekt mit dem Laden der Daten fertig ist
public long getNoDataTime()
Gibt zurück, wie lange keine Daten eingetroffen sind
public DataState getDataState()
Gibt den aktuellen Zustand zurück
public SystemObject getSystemObject()
Gibt das Systemobjekt zurück
public void waitForInitialization()
Wartet bis dieses Objekt mit dem Laden fertig ist, aber maximal die in TIMEOUT
angegebene Zeit. Bei Anfragen an dieses Objekt, sollte zu erst diese Funktion aufgerufen werden um sicherzustellen, das das Objekt bereits Daten erhalten hat.
public void waitForInitializationTree()
Wartet bis dieses Objekt und alle Kindobjekte mit dem Laden fertig sind, aber pro Objekt maximal die in TIMEOUT
angegebene Zeit.
void invalidate()
Wird für Tests usw. gebraucht um dem Objekt zu sagen, dass es nicht initialisiert ist, also bei der nächsten Anfrage darauf warten soll, bis neue Daten eintreffen