EventList
und Erweiterungen an der Collections API
Die jadice document platform enthält verschiedene Klassen, die den Umgang mit der Java
Collections API vereinfachen und deren Möglichkeiten
erweitern. Zentrales Interface ist die EventList
, mit der gewöhnliche Java
Listen um die Möglichkeit zur Eventverarbeitung und Listener-Registrierung
ergänzt werden.[49]
Als konkrete Implementationen der EventList
stehen viele unterschiedliche
Klassen zur Verfügung, die dementsprechend verschiedene Funktionsausprägungen
bereitstellen. Wichtige Beispiele sind:
BasicEventList
-
Grundlegende Implementation des Interface
EventList
. Funktion entspricht der gewöhnlichen Listen-Funktionalität. FilterList
-
Erlaubt eine gefilterte und unabhängige zweite Sicht auf eine existierende Liste. Es werden nur jene Listenelemente angezeigt, die dem Filterkriterium entsprechen.
SortedList
-
Bietet eine geordnete Darstellung der Elemente einer existierenden Liste.
Zusätzlich zu den genannten Klassen existieren noch andere Ausprägungen, die weitere Zusatzfunktionalitäten bieten.
Sämtlichen Varianten ist gemein, dass sie Methoden zur Registrierung eines
Listeners bereithalten. Über addListEventListener(...)
ist
es möglich, Implementationen von ListEventListener
anzumelden, sodass diese
über Änderungen an der Liste informiert werden.
Bei Verwendung einer EventList
durch mehrere Threads ist es notwendig, die
Zugriffe auf die Liste zu synchronisieren. Zu diesem Zweck existiert ein
eingebautes Locking-System, das gleichzeitige Zugriffe serialisiert. Von jeder
EventList
kann eine Instanz von ReadWriteLock
angefordert werden, die zwei unterschiedliche Lock-Objekte für rein lesenden
oder lesenden und schreibenden Zugriff bereithält.[50] Zugriffe auf eine Liste dürfen stets nur nach Erwerb des jeweiligen
Lock-Objektes erfolgen.[51]
Der folgende Code-Ausschnitt zeigt die generelle Verwendung von Lock-Objekten am Beispiel der Seitenliste eines Dokuments der jadice document platform:
Beispiel 5.1. Locking von EventList
s
EventList<Page> pageList = ... // get some Document's Pages Lock writeLock = pageList.getReadWriteLock().writeLock(); writeLock.lock(); try { // manipulate pageList } finally { writeLock.unlock(); }
Jede |
|
Mit Rückkehr aus dieser Methode besitzt der aktuelle Thread das alleinige Zugriffsrecht. |
|
Das Zugriffsrecht auf die Liste wird wieder abgegeben. Um die
zuverlässige Ausführung zu gewährleisten, muss dies unbedingt in
einem |
[49] Die in diesem Kapitel beschriebenen Funktionailtäten rund um die
Klasse EventList
entstammen dem
GlazedLists Framework. Um keine
Abhängigkeit zu einer externen Bibliothek zu schaffen, wurden
wesentliche Teile des Frameworks in jadice integriert. Weitere
Informationen zu GlazedLists im Allgemeinen
finden sich unter http://www.glazedlists.com/.
[50] Der Grund für diese Trennung ist die Tatsache, dass beliebig viele lesende Zugriffe gleichzeit erfolgen können. Schreibender Zugriff kann hingegen stets nur einem Thread gewährt werden und auch nicht gleichzeitig mit einem lesenden Zugriff.
[51] Einzige Ausnahme bildet die garantiert ausschließliche Verwendung
einer EventList
auf einem einzigen Thread. In diesem Fall könnte auf
das Locking verzichtet werden. Dokumente und andere Entitäten der
jadice document platform, die EventList
s verwenden, werden intern von unterschiedlichen
Threads genutzt, sodass korrektes Locking zwingend erforderlich
ist.