AFP / Modca ResourceLoader-API

Übersicht ResourceLoader-API

Die ResourceLoader-API wird verwendet um externe Resource-Objekte, die nicht im Dokumentdatenstrom enthalten sind, der Anwendung zur Verfügung zu stellen, folgende Implementationen stehen zur Verfügung (Basis ist das Interface com.levigo.jadice.format.resource.ResourceLoader):

 

 

Die API bietet das erstellen eigener ResourceLoader-Implementationen an.

Das Resourcen-Objekt wird über die Methode getResourceStream(String, Type) mit dem Parameter Resourcenname (java.lang.String) und Resourcentyp (com.levigo.jadice.format.modca.resource.ResourceLoader.Type) angefordert, wird es nicht gefunden wird null zurückgegeben.

Ein nicht gefundenes Resourcen-Objekt hat in der Regel Auswirkung auf die Darstellung des Dokuments, es können Teile einer Seite fehlen, wie z.B. Kopf- / Fusszeilen, Logos, aber auch die Schriftdarstellung kann nicht korrekt sein, z.B. falsche Laufweite / Schriftgrösse, Zeichendarstellung usw.

Enum-Implementation com.levigo.jadice.format.modca.resource.ResourceLoader.Type

Um das angeforderte Resourcen-Objekt eindeutig identifizieren zu können, gibt es den Datentyp com.levigo.jadice.format.modca.resource.ResourceLoader.Type:

CharacterSet

Schriftobjekte, i.d.R. Raster- und Outline-Fonts, beinhaltet Schriftinformationen, Laufweiten einzelner Zeichen usw., ist diese Resource nicht vorhanden kann der Text meist nicht korrekt dargestellt werden.

CodedFont

Definiert ein Schrift- und Codepage-Objekt, ist diese Resource nicht vorhanden kann der Text meist nicht korrekt dargestellt werden.

CodePage

beinhaltet Zeicheninformationen, wird zur Darstellung von Text in Zusammenhang mit Schriftarten verwendet, ist diese Resource nicht vorhanden, kann die zugehörige Schriftart nicht dargestellt werden.

DataMap

verweist auf zusätzliche Seiteninformationen, wird im AFP-Linemode Kontext verwendet.

FormMap

beinhaltet zusätzliche Seiteninformationen, wie z.B. zusätzliche Overlay-Resource Verweise, Druckinformationen, usw.

ObjectContainer

Resource die ein beliebiges Objekt wie z.B. Grafik, Schrift usw. enthalten kann

Overlay

Overlay-Resource beinhaltet i.d.R. ein Teil einer Seite, z.B. Kopf- / Fusszeile, Formular, usw.

PageSegment

PageSegment-Resource beinhaltet Grafik-Objekte, z.B. Logos, Hintergrundgrafiken usw.

 

Beschreibung der Implementationen
ResourceFileLoader

Wird zum Laden einzelner Resource-Objekte aus dem Dateisystem verwendet. Die Resourcenamen werden intern alle zu Grossbuchstaben konvertiert, d.h. bei Betriebssystemen die Gross- / Kleinschreibung im Dateisystem beachten müssen die Resourcedateinamen entsprechend angepasst werden.

Funktion: Wenn die Resource 'S1LOGO' angefordert wird, muss die Datei S1LOGO im Pfad vorhanden sein.

Beim Erstellen der Instanz muss der Pfad zu den einzelnen Resourcen angegeben werden:

Konstruktor #1
String path = "D:\\resources\\";
ResourceFileLoader loader = new ResourceFileLoader(path);

Zudem ist es möglich zum Pfad noch ein Array mit Dateiendungen anzugeben, wird z.B. nach 'S1LOGO' angefordert, wird zuerst nach 'S1LOGO', dann 'S1LOGO.300 und zuletzt nach 'S1LOGO.240' im Pfad gesucht.

Konstruktor #2
String path = "D:\\resources\\";
String[] extensions = new String[] {"300", "240"};
ResourceFileLoader loader = new ResourceFileLoader(path, extensions);

Die Erweiterungen können auch nachträglich gesetzt werden:

String[] extensions = new String[] {"300", "240"};
loader.setExtensions(extensions);
ResourceGroupLoader

Wird zum Laden von gruppierter Resource-Objekten verwendet, Quelle ist ein java.io.InputStream-Objekt

Erstellen einer Instanz:

Konstruktor #1
ResourceGroupLoader loader = new ResourceGroupLoader();

Nun können die gruppierten Resourcen hinzugefügt werden, z.B.:

Gruppierte Resourcen hinzufügen
// Datei mit gruppierten Resourcen
String fileName = "D:\\resources\\all_resources.res";
loader.addFile(fileName);

// Datenstrom mit gruppierten Resourcen 
InputStream is = <Datenstrom mit gruppierten Resourcen>;
loader.addStream(is);

 

ResourceUrlLoader

Wird zum Laden einzelner Resource-Objekte von einer URL-Quelle verwendet. Die Resourcenamen werden intern alle zu Grossbuchstaben konvertiert, d.h. die Resourcedateinamen müssen entsprechend auf dem HTTP-Server abgelegt werden.

Konstruktor #1
String baseURL = "http://localhost/resources/";
ResourceUrlLoader loader = new ResourceUrlLoader(baseURL);

 

ResourceMultiLoader

Spezielle Implementation, die mehrerer ResourceLoader-Implementationen verwaltet. ResourceLoader-Implementationen werden in einer Liste verwaltet, bei einer Resourcen-Anfrage wird die Liste abgearbeitet, es ist also darauf zu achten die Reihenfolge beim Erstellen korrekt festzulegen.

Erstellen einer Instanz:

Konstruktor #1
ResourceMultiLoader loader = new ResourceMultiLoader();

// Hinzufügen einer ResourceLoader-Instanz, wird immer an das Ende der Liste gesetzt
loader.addLoader(<ResourceLoader-Instanz>);

// Entfernen einer ResourceLoader-Implemenation
loader.removeLoader(<ResourceLoader-Instanz>);

Alternativ können beim Erstellen ResourceLoader-Instanzen deklariert werden:

Konstruktor #1
ResourceMultiLoader loader = new ResourceMultiLoader(<ResourceLoader-Instanz 1>, <ResourceLoader-Instanz 2>, ...);

 

DefaultResourceLoader

Spezielle Implementation, die die Funktionalität von ResourceGroupLoader und ResourceFileLoader vereint und somit die gängisten Arten von Resource-Quellen verarbeiten kann.

Erstellen einer Instanz via Standard-Konstruktor, Resource-Quellen können nachträglich hinzugefügt werden:

Konstruktor #1
DefaultResourceLoader loader = new DefaultResourceLoader();

// Resource-Quelle über eine weitere ResourceLoader-Instanz hinzufügen
loader.addLoader(<ResourceLoader-Instanz>);

Erstellen einer Instanz mit Zugriff auf das lokale Dateisystem. Es können auch gruppierte Resourcen ins angegebene Verzeichnis abgelegt werden, die Datei muss mit .res oder .fde enden, damit sie als gruppierte Resource erkannt wird:

Konstruktor #2
String path = "D:\\resources\\";
DefaultResourceLoader loader = new DefaultResourceLoader(path);

Erstellen einer Instanz wie bei Konstruktor #2 Beispiel mit dem Zusatz Dateiendungen zu definieren, Funktionsweise wie bei der ResourceFileLoader-Implementation:

Konstruktor #3
String path = "D:\\resources\\";
String[] extensions = new String[] {"240", "300"};
DefaultResourceLoader loader = new DefaultResourceLoader(path, extensions);


Anwendung ResourceLoader-Implementation via Reader-API

Die ResourceLoader-Impementation kann über die MODCAReaderSettings-Klasse beim Laden des Dokuments via Reader-API (siehe auch jadice documentplatform Dokumentation) gesetzt werden und ist für jede Seite im Dokument verfügbar, z.B.:

Anwendung via Reader-API
Reader reader = new Reader();
reader.getSettings(MODCAReaderSettings.class).setResourceLoader(<ResourceLoader-Implementation>);
reader.read(<AFP/Modca-Dokument>);

Die Anwendung mehrere ResourceLoader-Instanzen kann über die ResourceMultiLoader-Implementation realisiert werden.