Beispiel 7.1. Einfaches Lesen
In diesem Beispiel wird das Einlesen eines Datenstroms mit der Reader API gezeigt. Der Einlesevorgang findet auf jenem Thread statt, von dem aus die Methode aufgerufen wird. Mit Rückkehr aus der Methode ist der Lesevorgang vollständig abgeschlossen.
Document readDocumentFromStream(InputStream inputStream) throws IOException, JadiceException { Reader reader = new Reader(); reader.read(inputStream); reader.complete(); return reader.getDocument(); }
Beispiel 7.2. Dokument und Annotationen gemeinsam lesen
In diesem Beispiel wird gezeigt, wie zusätzlich zu einem Haupt-Datenstrom auch Annotationen eingelesen werden können. Diese werden im Annotations-Layer auf den bereits existierenden Seiten abgelegt. Weitere Informationen zum Einlesen von Annotationsdaten gibt die Annotations-Dokumentation unter „Laden und Speichern von klassischen Annotationen“.
Document readDocumentAndAnnotations(InputStream documentStream, InputStream annotationStream)
throws IOException, JadiceException {
Reader reader = new Reader();
reader.read(documentStream);
Format annotationFormat = …;
reader.setFormat(annotationFormat);
reader.setTargetIndex(0);
reader.read(annotationStream);
reader.complete();
return reader.getDocument();
}
Beispiel 7.3. Nutzung eines Dokuments während des Ladevorgangs
In diesem Beispiel gezeigt wie ein Dokument, noch während der Ladevorgang
läuft, bereits zur Anzeige in einer PageView
eingesetzt werden kann. Mit
zunehmendem Fortschritt des Ladevorgangs werden dem Dokument weitere Seiten
hinzugefügt. Der Lesevorgang kann auf einem beliebigen Thread stattfinden.
Die Interaktion mit der Seitenanzeige muss auf dem Swing Event Dispatch
Thread erfolgen.[83]
Document readAndDisplay(InputStream inputStream, final PageView pageView) throws IOException, JadiceException {
final Reader reader = new Reader();
final Document document = reader.getDocument();
TGASwingUtil.invokeLater(new Runnable() {
@Override
public void run() {
pageView.setDocument(document);
}
});
reader.read(inputStream);
reader.complete();
return document;
}
Beispiel 7.4. Abbruch eines Ladevorgangs anfordern
In diesem Beispiel wird skizziert, wie dem Nutzer die Möglichkeit gegeben
werden kann, einen laufenden Lesevorgang abzubrechen. Dazu könnte
beispielsweise in der Methode
wireCancelerToCancelButton(…)
die Canceler
Instanz mit einem ›Abbrechen‹ Button in der grafischen Benutzeroberfläche
verknüpft werden. Nachdem der Lesevorgang des ersten Datenstroms
abgeschlossen ist, wird der zweite nur dann eingelesen, wenn noch kein
Abbruch angefordert wurde. Da das Dokument bereits während des Lesevorgangs
in einer PageView
angezeigt wird, wird es zum Schluss daraus wieder
entfernt falls ein Abbruch angefordert wurde.
void readWithCancelation(InputStream inputStream1, InputStream inputStream2, PageView pageView)
throws IOException, JadiceException {
Reader reader = new Reader();
final Canceler canceler = reader.getCanceler();
wireCancelerToCancelButton(canceler);
final Document document = reader.getDocument();
displayDocument(document, pageView);
boolean readFullyPerformed = reader.read(inputStream1);
if (readFullyPerformed) {
reader.read(inputStream2);
}
reader.complete();
if (canceler.isCancelationRequested()) {
displayDocument(null, pageView);
}
}
private void wireCancelerToCancelButton(Canceler canceler) {
…
}
private void displayDocument(final Document document, final PageView pageView) {
TGASwingUtil.invokeLater(new Runnable() {
@Override
public void run() {
pageView.setDocument(document);
}
});
}
Beispiel 7.5. Beispielhafte Umsetzung: Abbruch von Lesevorgängen
Die Klasse CancelableReaderTask
zeigt die vollständige Umsetzung eines
Lese-Tasks, der abgebrochen werden kann. Die Klasse kann als Basis für
integrationsspezifische Anpassungen verwendet werden.
Beispiel 7.6. Einfaches Lesen
In diesem Beispiel wird das Einlesen zweier Datenströme mit der Fluent Read API gezeigt.
InputStream inputStream1 = …; InputStream inputStream2 = …; SyncReadConfigurer configurer = Read.synchronously(); configurer.newDocument().append(inputStream1).append(inputStream2); configurer.execute(); Document document = configurer.getFirstDocument();
Beispiel 7.7. Wiederverwendbarkeit durch Verwenden einer ReadConfiguration
In diesem Beispiel wird gezeigt, wie die Logik zum Einlesen von
Dokumentdaten wiederverwendbar gestaltet werden kann indem eine
ReadConfiguration
implementiert wird.
Document readDocument() throws JadiceException, IOException {
SyncReadConfigurer configurer = Read.synchronously();
configurer.add(new ExampleReadConfiguration());
configurer.execute();
return configurer.getFirstDocument();
}
class ExampleReadConfiguration extends ReadConfiguration {
@Override
protected void doConfigure() {
String id = …;
newDocument().appendGroup()
.add(task(getContentInputStream(id)))
.add(task(getAnnotationsInputStream(id)).mapDefaultLayer().toAnnotationsLayer());
}
private InputStream getContentInputStream(String id) {
return …;
}
private InputStream getAnnotationsInputStream(String id) {
return …;
}
}
[83] Die Klasse TGASwingUtil
wird verwendet um Arbeit auf dem Event
Dispatch Thread auszuführen. Nähere Details gibt „Arbeit mit Swing und TGASwingUtil
“.