// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.extract.apidb.v0_6;
import java.io.File;
import java.util.Date;
import org.openstreetmap.osmosis.apidb.v0_6.ApidbChangeReader;
import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
import org.openstreetmap.osmosis.core.sort.v0_6.ChangeTagSorter;
import org.openstreetmap.osmosis.extract.apidb.common.Configuration;
import org.openstreetmap.osmosis.replication.v0_6.impl.ChangesetFileNameFormatter;
import org.openstreetmap.osmosis.xml.common.CompressionMethod;
import org.openstreetmap.osmosis.xml.v0_6.XmlChangeWriter;
/**
* Performs an extract from a database for a single time interval and writes to a change file.
*
* @author Brett Henderson
*/
public class IntervalExtractor {
private static final String TMP_FILE_NAME = "tmpchangeset.osc.gz";
private final Configuration config;
private final File baseDirectory;
private final Date intervalBegin;
private final Date intervalEnd;
private final boolean fullHistory;
/**
* Creates a new instance.
*
* @param config
* The configuration object defining runtime parameters.
* @param baseDirectory
* The root of the changeset extraction directory tree.
* @param intervalBegin
* The beginning of the interval to extract.
* @param intervalEnd
* The end of the interval to extract.
* @param fullHistory
* Specifies if full version history should be returned, or just a single change per
* entity for the interval.
*/
public IntervalExtractor(Configuration config, File baseDirectory, Date intervalBegin, Date intervalEnd,
boolean fullHistory) {
this.baseDirectory = baseDirectory;
this.config = config;
this.intervalBegin = intervalBegin;
this.intervalEnd = intervalEnd;
this.fullHistory = fullHistory;
}
/**
* Runs the changeset extraction.
*/
public void run() {
ApidbChangeReader reader;
XmlChangeWriter writer;
ChangeTagSorter tagSorter;
String fileName;
File tmpFile;
File file;
// Generate the changeset file name.
fileName = new ChangesetFileNameFormatter(config.getChangeFileBeginFormat(), config.getChangeFileEndFormat())
.generateFileName(intervalBegin, intervalEnd);
// Generate the temporary output file.
tmpFile = new File(baseDirectory, TMP_FILE_NAME);
// Generate the changeset output file.
file = new File(baseDirectory, fileName);
// Create the output task to write to a compressed xml file.
writer = new XmlChangeWriter(tmpFile, CompressionMethod.GZip);
// Create the input task to read the change interval from the database.
reader = new ApidbChangeReader(config.getDatabaseLoginCredentials(), config.getDatabasePreferences(),
intervalBegin, intervalEnd, fullHistory);
// Create the tag sorter to ensure that output files are consistent allowing simple
// comparisons when auditing results.
tagSorter = new ChangeTagSorter();
// Connect the tasks together.
reader.setChangeSink(tagSorter);
tagSorter.setChangeSink(writer);
// Run the changeset extraction.
reader.run();
// Delete the destination file if it already exists.
if (file.exists()) {
if (!file.delete()) {
throw new OsmosisRuntimeException("Unable to delete existing file " + file + ".");
}
}
// Rename the temporary file to the final file name.
if (!tmpFile.renameTo(file)) {
throw new OsmosisRuntimeException("Unable to rename temporary file " + tmpFile + " to " + file + ".");
}
}
}