Untergeordnete Seiten
  • 2 - Laden eines Dokuments
Zum Ende der Metadaten springen
Zum Anfang der Metadaten

In 1 - Einbinden jadice web toolkit haben wir den jadice Viewer eingebunden, aber noch kein Dokument zur Anzeige gebracht. In diesem Tutorial legen wir die Basis zum Laden und zur Anzeige eines Dokuments von einer beliebigen HTTP-URL.

Um ein Dokument laden zu können, muss ein eigener DocumentDataProvider, eine passende Source und ein PageSegmentHandle implementiert werden. Damit die Implementierungen von JWT verwendet werden, müssen sie in der DocumentDataProviderRegistry registriert sein. Zur Anzeige eines Dokuments auf Client-Seite, muss dieser eine Source über einen Reader anfragen.

Das Ergebnis des Tutorials kann in https://github.com/levigo/jwt-getting-started/tree/master/jwt-tutorial-002 überprüft werden.

Projektstruktur

Folgende Klassen werden wir in diesem Tutorial ergänzen:

Verzeichnisstruktur

Source

Die Source enthält alle Informationen, die zum Auffinden des Dokument-Datenstroms benötigt werden. Das kann z.B. eine Dokument-Id innerhalb eines Archivs oder der Dokumenten-Pfad in einem Dateisystem sein. In unserem Beispiel ist das die HTTP-URL des Dokuments.

org.jwt.shared.model.UrlSource.java

PageSegmentHandle

Wurde das Dokument vom DocumentDataProvider erfolgreich geladen, werden bereits geladene Seiten des Dokuments über ein PageSegmentHandle identifiziert. Alle weiteren Client-Anfragen zu einer Dokument-Seite werden automatisch über die PageSegmentHandles durchgeführt.

org.jwt.shared.model.UrlHandle.java

DocumentDataProvider

Ein DocumentDataProvider ist auf Serverseite für das Laden von Dokumenten verantwortlich. Hier ist also der Einstiegspunkt zum Einbinden des eigenen Dokument-Archivs, Dokument-Dienstes oder einer beliebigen anderen Dokumenten-Ablage. In unserem Beispiel-Projekt laden wir die Resource, die über die von der Source übergebenen URL referenziert wird.

http://webtoolkit.levigo.de/doc/sect.chapter-reference.general.html#sect.reference.docdataprov

org.jwt.server.dataprovider.UrlDocumentDataProvider.java

Interessant sind vor allem folgende Methoden:

  • read()
    Dieser Aufruf wird beim initialen Laden des Dokuments durchgeführt. Der Client fordert über eine Source ein Dokument an, und die Implementierung versucht dieses anhand der enthaltenen Informationen zu laden.
  • recover()
    Falls ein bereits geladenes Dokument aufgrund technischer Probleme wiederhergestellt werden muss, passiert das über den revocer-Aufruf. Gut zu erkennen ist, dass hier die PageSegmentHandle als Referenz auf das entsprechende Dokument genutzt wird.

In beiden Fällen laden wir in getResourceStream() den Datenstrom anhand der übergebenen URL. Die Implementierung über URLConnection ist an dieser Stelle absichtlich so einfach gehalten. Eine produktive Implementierung sollte hier sicherlich mehr Wert auf Sicherheitsaspekte und Fehlerbehandlung legen.

DocumentDataProviderRegistry

Die implementierten Klassen müssen nun noch in der DocumentDataProviderRegistry registriert werden. Hierzu gibt es verschiedene Möglichkeiten:

  1. Manuelle Registrierung über DocumentDataProviderRegistry.registerProvider() (Handbuch - DocumentDataProviderRegistry)
  2. Automatische Registrierung:
    1. über den Java ServiceLoader (Handbuch - Automatische Registrierung von DocumentDataProvidern)
    2. über CDI, bei Verwendung des Java-EE-Integrationsmodul (Handbuch - Automatische Registrierung von DocumentDataProvidern per CDI )
    3. über Spring-DI, bei Verwendung von Spring Boot (Handbuch - Spring-Integrationsmodul)

In unserem Beispiel wollen wir den ServiceLoader-Ansatz nutzen, da dies vom integrierten Jetty aus dem Workspace problemlos unterstützt wird. Bei Verwendung anderer Applikationsserver haben die CDI-Varianten aber durchaus Vorteile. Zur Registrierung müssen wir den UrlDocumentDataProvider vollqualifiziert in der Datei src/main/resources/META-INF/services/com.levigo.jadice.web.server.DocumentDataProvider angeben:

resources/META-INF/services/com.levigo.jadice.web.server.DocumentDataProvider

 

Sollte der Provider nicht aufgelöst werden können, erscheint eine Fehlermeldung in der Art:
java.util.ServiceConfigurationError: com.levigo.jadice.web.server.DocumentDataProvider: Provider org.jwt.server.dataprovider.UrlDocumentDataProvider not found

Icon

Sollte sich GWT über nicht gefunde Klassen beschweren, müssen wir sicherstellen, dass

  1. die Anwendung korrekt kompiliert wurde (z.B. Maven > Update Maven Project oder Maven compile).
  2. das Package dieser Klasse als source in der gwt.xml gelistet ist.

Reader

Um im Client tatsächlich ein Dokument zu laden, müssen wir die gewünschte Source an einen Reader übergeben. Über einen AsyncCallback können wir im Erfolgsfall das zurückgelieferte Document zur Anzeige bringen, indem wir es der PageView unseres zuvor erstellten JadiceWidgets übergeben. In unserem Beispiel erweitern wir dazu die Klasse ApplicationEntryPoint:

org.jwt.client.ApplicationEntryPoint.java

Modulkonfiguration (gwt.xml)

Unser UrlSource und PageSegmenthandle haben wir unterhalb des neuen packages org.jwt.shared abgelegt, dass der Modulkonfiguration bisher nicht bekannt ist. Damit wir die Klassen auch auf Clientseite nutzen können, müssen wir unsere Modulkonfiguration noch anpassen:

src/main/java/org/jwt/Application.gwt.xml

Zusammenfassung

In diesem Tutorial haben wir erfolgreich ein Dokument über eine HTTP-URL geladen. Wir können innerhalb des Dokument scrollen, weitere Interaktionsmöglichkeiten sind bisher aber nicht möglich.