JAL-3141 Tests now available and working, bringing to light a problem with the classI...
[jalview.git] / src / jalview / io / BackupFilenameFilter.java
index 647e250..1fed65c 100644 (file)
@@ -2,8 +2,9 @@ package jalview.io;
 
 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;
@@ -14,7 +15,7 @@ public class BackupFileFilter implements FilenameFilter
 
   public String extension;
 
-  public BackupFileFilter(String base, String template, int digits,
+  public BackupFilenameFilter(String base, String template, int digits,
           String extension)
   {
     this.base = base;
@@ -24,37 +25,119 @@ public class BackupFileFilter implements FilenameFilter
   }
 
   @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