Forked from
IT1901 / course-material
270 commits behind the upstream repository.
-
Hallvard Trætteberg authoredHallvard Trætteberg authored
SimpleJsonFileStorageImpl.java 1.88 KiB
package fxutil.doc;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Collections;
public abstract class SimpleJsonFileStorageImpl<T> extends AbstractDocumentStorageImpl<T, File>
implements IDocumentStorage<File> {
private T document;
private final ObjectMapper objectMapper;
private final Class<T> documentClass;
public SimpleJsonFileStorageImpl(final Class<T> documentClass) {
this.documentClass = documentClass;
final SimpleModule module = new SimpleModule();
configureJacksonModule(module);
objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
}
protected abstract void configureJacksonModule(final SimpleModule module);
@Override
public T loadDocument(final InputStream inputStream) throws Exception {
return objectMapper.readValue(inputStream, documentClass);
}
@Override
public void saveDocument(final T document, final File documentLocation) throws Exception {
try (OutputStream outputStream = new FileOutputStream(documentLocation, false)) {
objectMapper.writeValue(outputStream, document);
}
}
@Override
public Collection<IDocumentImporter> getDocumentImporters() {
return Collections.emptyList();
}
@Override
public T getDocument() {
return document;
}
@Override
public void setDocument(final T document) {
final T oldDocument = this.document;
this.document = document;
fireDocumentChanged(oldDocument);
}
@Override
protected T createDocument() {
try {
return documentClass.getDeclaredConstructor().newInstance();
} catch (final Exception e) {
throw new RuntimeException("Exception when instantiating " + documentClass, e);
}
}
}