// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.replication.v0_6;
import java.io.File;
import java.util.Map;
import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer;
import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink;
import org.openstreetmap.osmosis.replication.common.FileReplicationStore;
import org.openstreetmap.osmosis.replication.common.ReplicationState;
import org.openstreetmap.osmosis.replication.common.ReplicationStore;
import org.openstreetmap.osmosis.xml.v0_6.XmlChangeWriter;
/**
* This class receives replication streams and writes them to replication files.
* It supports the initialize and complete method being called multiple times to
* signify multiple replication intervals and each will be written to a
* different replication file with a unique sequence number.
*
* @author Brett Henderson
*/
public class ReplicationWriter implements ChangeSink {
private ReplicationStore replicationStore;
private ReplicationStateWriter stateWriter;
private ReplicationState state;
private XmlChangeWriter changeWriter;
/**
* Creates a new instance.
*
* @param workingDirectory
* The directory containing configuration and tracking files.
*/
public ReplicationWriter(File workingDirectory) {
replicationStore = new FileReplicationStore(workingDirectory, false);
stateWriter = new ReplicationStateWriter(workingDirectory);
}
@Override
public void initialize(Map<String, Object> metaData) {
// Initialise the replication meta data.
stateWriter.initialize(metaData);
// Get the replication state for this pipeline run.
state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY);
// Initialize a new change writer for the current sequence number.
if (state.getSequenceNumber() > 0) {
changeWriter = replicationStore.saveData(state.getSequenceNumber());
}
}
@Override
public void process(ChangeContainer change) {
changeWriter.process(change);
}
@Override
public void complete() {
if (state.getSequenceNumber() > 0) {
// Complete the writing of the change file.
changeWriter.complete();
changeWriter.close();
changeWriter = null;
}
// Write the sequenced state file.
replicationStore.saveState(state);
// We must only complete the state writer after we've finished writing
// the replication data and sequence numbered state.
stateWriter.complete();
}
@Override
public void close() {
if (changeWriter != null) {
changeWriter.close();
changeWriter = null;
}
stateWriter.close();
}
}