import java.io.File;
import java.io.FilenameFilter;
+import java.io.IOException;
-public class BackupFileFilter implements FilenameFilter
+public class BackupFilenameFilter implements FilenameFilter
{
public String base;
public String extension;
- public BackupFileFilter(String base, String template, int digits,
+ public BackupFilenameFilter(String base, String template, int digits,
String extension)
{
this.base = base;
}
@Override
- public boolean accept(File file, String filename)
+ public boolean accept(File dir, String filename)
{
- if (file.isDirectory())
+ boolean ret = false;
+ try
{
- return true;
- }
- else
- {
- int numcharstart = template.indexOf(BackupFiles.NUM_PLACEHOLDER);
- String templateStart = template;
- String templateEnd = "";
- if (numcharstart > -1)
- {
- templateStart = template.substring(0, numcharstart);
- templateEnd = template.substring(numcharstart + BackupFiles.NUM_PLACEHOLDER.length());
- }
- int startLength = base.length() + templateStart.length();
- int endLength = templateEnd.length() + extension.length();
- if (filename.length() == startLength + digits + endLength
- && filename.startsWith(base + templateStart)
- && filename.endsWith(templateEnd + extension)
- && filename
- .substring(startLength,
- filename.length() - endLength + 1)
- .matches("[0-9]+"))
+ File file = new File(
+ dir.getCanonicalPath() + File.separatorChar + filename);
+ if (file.isDirectory())
{
- return true;
+ // backup files aren't dirs!
+ return false;
}
-
+ } catch (IOException e)
+ {
+ System.out.println("IOException when checking file '" + filename
+ + "' is a backupfile");
}
- return false;
+
+ BackupFilenameParts bffp = new BackupFilenameParts(filename, base,
+ template, digits, extension);
+ ret = bffp.isBackupFile();
+ return ret;
+ }
+
+ public static String getBackupFilename(int index, String base,
+ String template, int digits, String extension)
+ {
+ String numString = String.format("%0" + digits + "d", index);
+ String backupSuffix = template.replaceAll(BackupFiles.NUM_PLACEHOLDER,
+ numString);
+ String backupfilename = base + backupSuffix + extension;
+ return backupfilename;
}
}
+
+class BackupFilenameParts
+{
+ String base;
+
+ String templateStart;
+
+ int num;
+
+ int digits;
+
+ String templateEnd;
+
+ String extension;
+
+ boolean isBackupFile;
+
+ public BackupFilenameParts(File file, String base, String template, int digits,
+ String extension)
+ {
+ this(file.getName(), base, template, digits, extension);
+ }
+
+ public BackupFilenameParts(String filename, String base, String template,
+ int digits, String extension)
+ {
+ this.isBackupFile = false;
+
+ // calculate minimum length of a backup filename
+ int minlength = base.length() + template.length()
+ - BackupFiles.NUM_PLACEHOLDER.length() + digits
+ + extension.length();
+
+ if (!(filename.startsWith(base) && filename.endsWith(extension)
+ && filename.length() >= minlength))
+ {
+ // non-starter
+ return;
+ }
+
+ int numcharstart = template.indexOf(BackupFiles.NUM_PLACEHOLDER);
+ String templateStart = template;
+ String templateEnd = "";
+ if (numcharstart > -1)
+ {
+ templateStart = template.substring(0, numcharstart);
+ templateEnd = template.substring(
+ numcharstart + BackupFiles.NUM_PLACEHOLDER.length());
+ }
+
+ int startLength = base.length() + templateStart.length();
+ int endLength = templateEnd.length() + extension.length();
+ String numString = filename.substring(startLength,
+ filename.length() - endLength);
+
+ if (filename.length() >= startLength + digits + endLength
+ && filename.startsWith(base + templateStart)
+ && filename.endsWith(templateEnd + extension)
+ && numString.matches("[0-9]+"))
+ {
+ this.base = base;
+ this.templateStart = templateStart;
+ this.num = Integer.parseInt(numString);
+ this.digits = digits;
+ this.templateStart = templateStart;
+ this.templateEnd = templateEnd;
+ this.isBackupFile = true;
+ }
+
+ }
+
+ public boolean isBackupFile()
+ {
+ return this.isBackupFile;
+ }
+
+ public int indexNum()
+ {
+ return this.num;
+ }
+}
\ No newline at end of file