/* 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.multicast; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.Map; import javax.xml.stream.FactoryConfigurationError; 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.helpers.ParameterHelper; /** * <p> * LocalDirectoryTransport.java * </p> * <p> * Writes Journal files to a local disk directory. It requires these parameters: * <ul> * <li>directoryPath - full path to the directory where the Journals will be * stored.</li> * </ul> * </p> * * @author jblake * @version $Id: LocalDirectoryTransport.java,v 1.1 2007/03/06 15:02:58 jblake * Exp $ */ public class LocalDirectoryTransport extends Transport { public static final String PARAMETER_DIRECTORY_PATH = "directoryPath"; /** The directory in which to create journal files. */ private final File directory; /** The current journal file, if open, or most recent file if closed. */ private TransportOutputFile journalFile; /** An XMLEventWriter that writes to the current journal file, if open. */ private XMLEventWriter xmlWriter; public LocalDirectoryTransport(Map<String, String> parameters, boolean crucial, TransportParent parent) throws JournalException { super(parameters, crucial, parent); directory = ParameterHelper .parseParametersForWritableDirectory(parameters, PARAMETER_DIRECTORY_PATH); } /** * On a request to open the file, * <ul> * <li>check that we are in a valid state,</li> * <li>create the file,</li> * <li>create the {@link XMLEventWriter} for use on the file,</li> * <li>ask the parent to write the header to the file,</li> * <li>set the state.</li> * </ul> */ @Override public void openFile(String repositoryHash, String filename, Date currentDate) throws JournalException { try { super.testStateChange(State.FILE_OPEN); journalFile = new TransportOutputFile(directory, filename); xmlWriter = new IndentingXMLEventWriter(XMLOutputFactory.newInstance() .createXMLEventWriter(journalFile.open())); parent.writeDocumentHeader(xmlWriter, repositoryHash, currentDate); super.setState(State.FILE_OPEN); } catch (FactoryConfigurationError e) { throw new JournalException(e); } catch (XMLStreamException e) { throw new JournalException(e); } catch (IOException e) { throw new JournalException(e); } } /** * Check that our current state is correct before filling a request for an * {@link XMLEventWriter}. */ @Override public XMLEventWriter getWriter() throws JournalException { super.testWriterState(); return xmlWriter; } /** * On a request to close the file, * <ul> * <li>check that we are in a valid state,</li> * <li>close the {@link XMLEventWriter} and the {@link TransportOutputFile},</li> * <li>set the state.</li> * </ul> */ @Override public void closeFile() throws JournalException { try { super.testStateChange(State.FILE_CLOSED); parent.writeDocumentTrailer(xmlWriter); xmlWriter.close(); journalFile.close(); super.setState(State.FILE_CLOSED); } catch (XMLStreamException e) { throw new JournalException(e); } catch (IOException e) { throw new JournalException(e); } } /** * On a request to shut down, * <ul> * <li>check that we are in a valid state,</li> * <li>set the state.</li> * </ul> * If we have already shut down, a second call is not an error, but requires * no action. */ @Override public void shutdown() throws JournalException { super.testStateChange(State.SHUTDOWN); if (super.getState() != State.SHUTDOWN) { super.setState(State.SHUTDOWN); } } }