Für das Einlesen von Daten in die jadice document platform stehen verschiedene Wege zur Verfügung.

Der Ladevorgang kann sowohl ein bereits bestehendes wie auch ein zu diesem Zweck neu erstelltes jadice Document befüllen. Zudem muß entschieden werden, ob ein Ladevorgang synchron oder asynchron ablaufen soll. Synchron geladene Dokumente stehen erst zur Verfügung, nachdem der gesamte Lesevorgang abgeschlossen ist. Das Dokument ist dann vollständig in dem Sinn, dass alle angefragten Daten verfügbar sind. Beim asynchronen Laden werden die Dokumentdaten im Hintergrund eingelesen. Es wird daher zunächst ein unvollständiges Dokument zurückgegeben mit dem zwar bereits gearbeitet werden kann, das aber durch den Lade-Thread noch verändert wird.

Ein erstelltes Dokument kann bereits in »unbefülltem« Zustand der PageView zur Anzeige übergeben werden. Diese erkennt automatisch, wenn die erste Seite (beziehungsweise das erste Seitensegment in einer Seite) geladen wurde und zeigt die Inhalte bereits an, obwohl im Hintergrund der Ladevorgang noch nicht abgeschlossen sein muss. Dies ist insbesondere bei langsamen Netzwerkverbindungen und großen Dokumenten von Vorteil.

Für den eigentlichen Lesevorgang stehen zwei unterschiedliche APIs zur Verfügung: Die Reader API, die einen imperativen Ansatz verfolgt, sowie die Fluent Reader API, die konfigurationsbasiert arbeitet. Beide werden in den folgenden Abschnitten vorgestellt.

Die Reader API, rund um deren zentrale Klasse Reader, bietet die klassische Programmierschnittstelle zum Einlesen von Dokumentdaten in jadice Dokumente. Instanzen von Reader können über den parameterlosen Konstruktor erzeugt werden. Sie bieten die Möglichkeit, Lesevorgänge zu konfigurieren und zu starten.

Grundsätzlich gilt, dass jeweils ein logisch zusammengehöriger Lesevorgang auf einer dedizierten Instanz von Reader durchgeführt werden sollte. Als logisch zusammengehörig wird in diesem Fall ein Lesevorgang bezeichnet, der alle Datenströme umfasst, die notwendig sind um das gewünschte Dokument vollständig einzulesen. Dies kann beispielsweise die Datenströme für Seiteninhalte und Annotationen umfassen.[20]

Der Programmieransatz zur Verwendung der Reader API folgt dem imperativen Programmierparadigma. Einer Instanz von Reader werden aufeinanderfolgend Anweisungen erteilt, die entweder interne Statusänderungen oder einzelne (Teil-)Lesevorgänge zur Folge haben. Auf diese Weise wird ein jadice-Dokument nach und nach mit Inhalten befüllt.

Der Reader bietet verschiedene read(…)-Methoden, die auf unterschiedliche Weisen Datenströme entgegennehmen und einlesen. Die Lesevorgänge erfolgen jeweils mit den zum Zeitpunkt des Methodenaufrufs vorliegenden Einstellungen des Readers. Typischerweise sieht der Gesamtablauf daher so aus, dass abwechselnd Einstellungen auf dem Reader getroffen werden und darauf basierend Streams eingelesen werden.

Unter anderem stehen folgende Einstellungen auf dem Reader zur Verfügung:

  • Dokument in das gelesen werden soll. Ist kein Dokument gesetzt, so wird vor dem Lesevorgang ein leeres Dokument erzeugt.

  • Zielposition (Seitenzahl) der Seite im Dokument. Diese Einstellung wird target index genannt und durch den Reader automatisch inkrementiert falls ein mehrseitiges Dokument aus einem Datenstrom gelesen wird. Zur Vereinfachung existieren zwei Konstanten, die festlegen, dass neue Seiten stets vor der ersten oder nach der letzten vorhandenen Seite eingefügt werden sollen.

  • LayerMapping das bestimmt, in welche Seitenebene die erzeugten Seitensegmente abgelegt werden sollen.

  • Dokumentformat, das für den Lesevorgang verwendet werden soll.

Sämtliche Methoden der Klasse Reader arbeiten synchron, sodass mit der Rückkehr aus dem Methodenaufruf der gesamte Arbeitsschritt abgeschlossen ist. Ist Nebenläufigkeit gewünscht, wird dies typischerweise realisiert indem die gesamte Arbeit mit einem Reader-Objekt – also ein logisch zusammengehöriger Lesevorgang – in eine Instanz von Runnable verpackt und auf einem eigenen Thread ausgeführt wird.

Häufig (und besonders bei asynchroner Verwendung) besteht in einzelnen Programmteilen Interesse daran, Informationen über den Fortschritt eines Dokument-Lesevorgangs zu erhalten. Zu diesem Zweck bietet der Reader die Möglichkeit, Instanzen von ReaderListener zu registrieren, die über Änderungen informiert werden.[21]

Naturgemäß arbeiten Instanzen von Reader eng mit den Dokumenten zusammen, in denen sie gelesene Daten ablegen. Aus diesem Grund wird durch Lesevorgänge automatisch der Dokumentstatus der aktuell gesetzten Instanz von Document geändert. Konkret wird bei jedem Aufruf einer read(…)-Methode der Dokumentstatus auf Document.BasicState.LOADING gesetzt – falls dieser Status nicht sowieso schon gesetzt ist. Ist das Lesen eines einzelnen Datenstroms abgeschlossen, bleibt der Status weiterhin gesetzt. Da der Reader keine Information darüber besitzt, wann sämtliche logisch zusammengehörenden Streams eingelesen wurden, ist es Aufgabe des Integrators zum geeigneten Zeitpunkt das Dokument in den Status Document.BasicState.READY zu versetzen.[22]

Um die generell empfohlene Vorgehensweise der Verwendung einer dedizierten Instanz von Reader pro logisch zusammengehörendem Lesevorgang möglichst einfach zu gestalten, bietet die Klasse eine Komfort-Methode an, um den Abschluss des Lesevorgangs zu markieren. Es handelt sich um die Methode complete(). Diese bringt das Dokument, in welches die Daten gelesen wurden, in den Dokumentstatus Document.BasicState.READY und benachrichtigt alle registrierten ReaderListener darüber, dass der logisch zusammengehörende Lesevorgang abgeschlossen ist. Ein Reader, auf dem die Methode complete() aufgerufen wurde, kann danach nicht mehr für weitere Lesevorgänge genutzt werden.

Hinweis: Soll mit einem Dokument bereits während des Ladevorgangs interagiert werden, sollten notwendige Permissions frühestmöglich gesetzt werden. Dies kann bereits vor dem Lesevorgang erfolgen da Permissions nur für User-Interaktionen gelten.



[20] Die Vorgabe, zusammengehörige Datenströme mit derselben Instanz von Reader zu lesen, ist besonders für den Umgang mit Annotationen wichtig. Diese können unter Umständen nicht auf der korrekten Seite positioniert werden falls Annotations-Datenströme mit einer unabhängigen Reader-Instanz gelesen werden. Nähere Details sind abhängig vom Annotations-Format und werden in der Annotations-Dokumentation (Annotations-Dokumentation) gegeben.

[21] Details dazu unter „ReaderListener“

[22] Dieser Status sollte unbedingt gesetzt werden, da manche jadice-Komponenten ihre Arbeit nur aufnehmen können, wenn das zugeordnete Dokument als READY markiert ist.

[jadice document platform Version 5.4.2.13: Dokumentation für Entwickler. Veröffentlicht: 2020-04-08]
loading table of contents...