// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.replication.common;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
import org.openstreetmap.osmosis.core.time.DateFormatter;
import org.openstreetmap.osmosis.core.time.DateParser;
/**
* Maintains the time that the extraction process has reached. It persists the
* time across invocations using a file.
*
* @author Brett Henderson
*/
public class TimestampTracker {
private File timestampFile;
private File newTimestampFile;
private DateParser dateParser;
private DateFormatter dateFormatter;
/**
* Creates a new instance.
*
* @param timestampFile
* The location of the file containing the persisted timestamp.
* @param newTimestampFile
* The location of the temp file to use when updating the
* persisted timestamp to make the update atomic.
*/
public TimestampTracker(File timestampFile, File newTimestampFile) {
this.timestampFile = timestampFile;
this.newTimestampFile = newTimestampFile;
dateParser = new DateParser();
dateFormatter = new DateFormatter();
}
/**
* Renames the new timestamp file to the current file deleting the current
* file if it exists.
*/
private void renameNewFileToCurrent() {
// Make sure we have a new timestamp file.
if (!newTimestampFile.exists()) {
throw new OsmosisRuntimeException("Can't rename non-existent file " + newTimestampFile + ".");
}
// Delete the existing timestamp file if it exists.
if (timestampFile.exists()) {
if (!timestampFile.delete()) {
throw new OsmosisRuntimeException("Unable to delete file " + timestampFile + ".");
}
}
// Rename the new file to the existing file.
if (!newTimestampFile.renameTo(timestampFile)) {
throw new OsmosisRuntimeException(
"Unable to rename file " + newTimestampFile + " to " + timestampFile + ".");
}
}
/**
* Retrieve the current time.
*
* @return The time.
*/
public Date getTime() {
try (BufferedReader reader = new BufferedReader(new FileReader(timestampFile))) {
return dateParser.parse(reader.readLine());
} catch (IOException e) {
throw new OsmosisRuntimeException("Unable to read the time from file " + timestampFile + ".", e);
}
}
/**
* Update the stored time.
*
* @param time
* The time to set.
*/
public void setTime(Date time) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(newTimestampFile))) {
writer.write(dateFormatter.format(time));
} catch (IOException e) {
throw new OsmosisRuntimeException(
"Unable to write the time to temporary file " + newTimestampFile + ".", e);
}
renameNewFileToCurrent();
}
}