Skip to main content

Dokumente laden

info

Wir empfehlen dringend, URIs zu verwenden. Ein Source-Objekt ist dafür vorgesehen, alle Informationen zu transportieren, die benötigt werden, um ein Dokument aus einem Archiv zu laden. Lassen sich die benötigten Informationen nicht in einer URI abbilden, sollten Sie kritisch hinterfragen, ob wirklich alle Informationen die Sie transportieren möchten auch benötigt werden. Das Source-Objekt wird bei jedem Lade-Vorgang übertragen und sollte daher klein bleiben.

Der generelle Ladevorgang für Dokumente ist hier beschrieben.

Laden über URI

Im Client wird eine URI folgendermaßen (als UriSource) übergeben:

source: Nullable<DocumentSource | any> = {
uri: "custom://123Object456"
}

Im Backend muss nur noch ein DocumentDataProvider erstellt werden:

@Component
@UriScheme("custom")
public class CustomUriBasedDocumentDataProvider implements UriBasedDocumentDataProvider {

@Override
public void read(Reader reader, UriSource source) throws JadiceException, IOException {
// TODO: actual implementation comes here
reader.read(new URL(source.getUri()));
}

@Override
public void recover(Reader reader, UriHandle handle) throws RecoverFailedException, JadiceException {
// TODO: actual implementation comes here
try {
reader.read(new URL(handle.getUri()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

Laden über Source/Handle

Der empfohlene Weg Dokumente zu laden ist über eine URI. Es ist jedoch auch weiterhin möglich, komplexe Source/Handles für das Laden von Dokumenten zu verwenden.

Im Client wird die Source dann so definiert:

source: Nullable<DocumentSource | any> = {
type: "CUSTOM",
params: {
myId: "123Object456"
}
};

DocumentDataProvider:

@Component
public class CustomDocumentDataProvider implements DocumentDataProvider<CustomSource, CustomHandle> {
@Override
public CustomHandle createSourceHandle(CustomSource source) {
return new CustomHandle(source.getMyId());
}

@Override
public void read(Reader reader, CustomSource source) throws JadiceException, IOException {
// TODO: actual implementation comes here
reader.read(new URL(source.getMyId()));
}

@Override
public void recover(Reader reader, CustomHandle handle) throws RecoverFailedException, JadiceException {
try {
reader.read(new URL(handle.getMyId()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

Die Klasse Source/Handle:

public class CustomSource extends Source {

private String myId;

public CustomSource(String myId) {
this.myId = myId;
}

public CustomSource() {
}

public String getMyId() {
return myId;
}

public void setMyId(String myId) {
this.myId = myId;
}
}

public class CustomHandle extends PageSegmentHandle {

private String myId;

/**
* For serialization purposes only.
*/
public CustomHandle() {
}

public CustomHandle(String myId) {
this.myId = myId;
}

public String getMyId() {
return myId;
}

public void setMyId(String myId) {
this.myId = myId;
}

@Override
public String getIdentifier() {
return "";
}

@Override
public PageSegmentHandle copy() {
return new CustomHandle(myId);
}
}

Und an geeigneter Stelle muss einmalig das Mapping definiert werden:

// Make sure to re-use Mapper!!
ObjectMapper mapper = new ObjectMapper();
com.levigo.jadice.web.server.messaging.mapper.PageSegmentHandleMapper.get().registerMapping(
"CUSTOM",
CustomHandle.class,
(handle) -> mapper.valueToTree(handle),
(json) -> mapper.treeToValue(json, CustomHandle.class)
);

com.levigo.jadice.web.server.messaging.mapper.SourceMapper.get().registerMapping(
"CUSTOM",
CustomSource.class,
(handle) -> mapper.valueToTree(handle),
(json) -> mapper.treeToValue(json.get("params"), CustomSource.class)
);