// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.replication.common;
import java.io.File;
import java.util.StringTokenizer;
import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
/**
* Formats replication sequence numbers into file names.
*/
public class ReplicationFileSequenceFormatter {
private ReplicationSequenceFormatter sequenceFormatter;
private File workingDirectory;
/**
* Creates a new instance. The minimum length and grouping length will default to 9 and 3
* respectively.
*
* @param workingDirectory
* The directory from which to base all created files.
*/
public ReplicationFileSequenceFormatter(File workingDirectory) {
this(workingDirectory, 9, 3);
}
/**
* Creates a new instance.
*
* @param minimumLength
* The minimum length file sequence string to generate. For example, setting a length
* of 2 will generate sequence numbers from "00" to "99".
* @param groupingLength
* The number of characters to write before separating with a '/' character. Used for
* creating sequence numbers to be written to files in a nested directory structure.
* @param workingDirectory
* The directory from which to base all created files.
*/
public ReplicationFileSequenceFormatter(File workingDirectory, int minimumLength, int groupingLength) {
this.workingDirectory = workingDirectory;
sequenceFormatter = new ReplicationSequenceFormatter(minimumLength, groupingLength);
}
/**
* Formats the sequence number into a file name. Any sub-directories required will be
* automatically created.
*
* @param sequenceNumber
* The sequence number.
* @param fileNameSuffix
* The suffix to append to the end of the file name.
* @return The formatted file.
*/
public File getFormattedName(long sequenceNumber, String fileNameSuffix) {
String fileName;
StringTokenizer pathTokenizer;
File formattedPath;
fileName = sequenceFormatter.getFormattedName(sequenceNumber, fileNameSuffix);
pathTokenizer = new StringTokenizer(fileName, "/");
formattedPath = workingDirectory;
while (pathTokenizer.hasMoreTokens()) {
// Move to the next item in the path.
formattedPath = new File(formattedPath, pathTokenizer.nextToken());
// If this is a directory within the path (ie. not the final element in the path) then
// ensure it exists and create it if it doesn't exist.
if (pathTokenizer.hasMoreTokens()) {
if (!formattedPath.exists() && !formattedPath.mkdir()) {
throw new OsmosisRuntimeException("Unable to create directory \"" + formattedPath + "\".");
}
}
}
return formattedPath;
}
}