EventList und Erweiterungen an der Collections API

Allgemeine Funktionalität

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.

Locking und Thread-Sicherheit

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 EventLists

EventList<Page> pageList = ... // get some Document's Pages
Lock writeLock = pageList.getReadWriteLock().writeLock();1
writeLock.lock();2
try {
  // manipulate pageList
} finally {
  writeLock.unlock();3
}

1

Jede EventList stellt über getReadWriteLock() ihr Lock-Objekt zur Verfügung.

2

Mit Rückkehr aus dieser Methode besitzt der aktuelle Thread das alleinige Zugriffsrecht.

3

Das Zugriffsrecht auf die Liste wird wieder abgegeben. Um die zuverlässige Ausführung zu gewährleisten, muss dies unbedingt in einem finally-Block geschehen.




[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 EventLists verwenden, werden intern von unterschiedlichen Threads genutzt, sodass korrektes Locking zwingend erforderlich ist.

[jadice document platform Version 5.5.12.1: Dokumentation für Entwickler. Veröffentlicht: 2021-08-17]