/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package fedora.server.journal.readerwriter.singlefile;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javanet.staxutils.IndentingXMLEventWriter;
import fedora.server.journal.JournalException;
import fedora.server.journal.JournalWriter;
import fedora.server.journal.ServerInterface;
import fedora.server.journal.entry.CreatorJournalEntry;
/**
* A rudimentary implementation of JournalWriter that just writes all entries to
* a single Journal file. Useful only for System tests.
*
* @author Jim Blake
*/
public class SingleFileJournalWriter
extends JournalWriter
implements SingleFileJournalConstants {
private final FileWriter out;
private final XMLEventWriter writer;
private boolean fileHasHeader = false;
/**
* Get the name of the journal file from the server parameters, create the
* file, wrap it in an XMLEventWriter, and initialize it with a document
* header.
*/
public SingleFileJournalWriter(Map<String, String> parameters,
String role,
ServerInterface server)
throws JournalException {
super(parameters, role, server);
if (!parameters.containsKey(PARAMETER_JOURNAL_FILENAME)) {
throw new JournalException("Parameter '"
+ PARAMETER_JOURNAL_FILENAME + "' not set.");
}
try {
out = new FileWriter(parameters.get(PARAMETER_JOURNAL_FILENAME));
XMLOutputFactory factory = XMLOutputFactory.newInstance();
writer =
new IndentingXMLEventWriter(factory
.createXMLEventWriter(out));
} catch (IOException e) {
throw new JournalException(e);
} catch (XMLStreamException e) {
throw new JournalException(e);
}
}
/**
* Make sure that the file has been initialized before writing any journal
* entries.
*/
@Override
public void prepareToWriteJournalEntry() throws JournalException {
if (!fileHasHeader) {
super.writeDocumentHeader(writer);
fileHasHeader = true;
}
}
/**
* Every journal entry just gets added to the file.
*/
@Override
public void writeJournalEntry(CreatorJournalEntry journalEntry)
throws JournalException {
try {
super.writeJournalEntry(journalEntry, writer);
writer.flush();
} catch (XMLStreamException e) {
throw new JournalException(e);
}
}
/**
* Add the document trailer and close the journal file.
*/
@Override
public void shutdown() throws JournalException {
try {
if (fileHasHeader) {
super.writeDocumentTrailer(writer);
}
writer.close();
out.close();
} catch (XMLStreamException e) {
throw new JournalException(e);
} catch (IOException e) {
throw new JournalException(e);
}
}
}