JAL-3141. This adds quite a lot of code to allow an 'Include backup files' checkbox...
[jalview.git] / src / jalview / io / BackupFilenameParts.java
index 6f7da93..a4fbb3b 100644 (file)
@@ -1,20 +1,27 @@
 package jalview.io;
 
+import jalview.bin.Cache;
+
 import java.io.File;
 
 public class BackupFilenameParts
 {
-  String base;
+  private String base;
 
-  String templateStart;
+  private String templateStart;
 
-  int num;
+  private int num;
 
-  int digits;
+  private int digits;
 
-  String templateEnd;
+  private String templateEnd;
 
-  boolean isBackupFile;
+  private boolean isBackupFile;
+
+  private BackupFilenameParts()
+  {
+    this.isBackupFile = false;
+  }
 
   public BackupFilenameParts(File file, String base, String template,
           int digits)
@@ -25,6 +32,12 @@ public class BackupFilenameParts
   public BackupFilenameParts(String filename, String base, String template,
           int suggesteddigits)
   {
+    this(filename, base, template, suggesteddigits, false);
+  }
+
+  public BackupFilenameParts(String filename, String base, String template,
+          int suggesteddigits, boolean extensionMatch)
+  {
     this.isBackupFile = false;
 
     int numcharstart = template.indexOf(BackupFiles.NUM_PLACEHOLDER);
@@ -39,11 +52,33 @@ public class BackupFilenameParts
       digits = suggesteddigits;
     }
 
+    String savedFilename = "";
+    // if extensionOnly is set then reset the filename to the last occurrence of the extension+templateStart and try the match
+    if (extensionMatch)
+    {
+      // only trying to match from extension onwards
+
+      int extensioncharstart = filename
+              .lastIndexOf('.' + base + templateStart);
+      if (extensioncharstart == -1)
+      {
+        return;
+      }
+
+      savedFilename = filename.substring(0, extensioncharstart + 1); // include
+                                                                     // the "."
+      filename = filename.substring(extensioncharstart + 1);
+    }
+
+    // full filename match
+
     // calculate minimum length of a backup filename
     int minlength = base.length() + template.length()
             - BackupFiles.NUM_PLACEHOLDER.length() + digits;
 
-    if (!(filename.startsWith(base) && filename.length() >= minlength))
+    if (!(filename.startsWith(base + templateStart)
+            && filename.endsWith(templateEnd)
+            && filename.length() >= minlength))
     {
       // non-starter
       return;
@@ -60,7 +95,7 @@ public class BackupFilenameParts
             && filename.endsWith(templateEnd)
             && numString.matches("[0-9]*"))
     {
-      this.base = base;
+      this.base = extensionMatch ? savedFilename + base : base;
       this.templateStart = templateStart;
       this.num = numString.length() > 0 ? Integer.parseInt(numString) : 0;
       this.digits = digits;
@@ -70,6 +105,28 @@ public class BackupFilenameParts
 
   }
 
+  public static BackupFilenameParts currentBackupFilenameParts(
+          String filename, String base, boolean extensionMatch)
+  {
+    BackupFilenameParts bfp = new BackupFilenameParts();
+    String template = Cache.getDefault(BackupFiles.SUFFIX, null);
+    if (template == null)
+    {
+      return bfp;
+    }
+    int digits;
+    try
+    {
+      digits = Integer
+              .parseInt(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, null));
+    } catch (Exception e)
+    {
+      return bfp;
+    }
+    return new BackupFilenameParts(filename, base, template, digits,
+            extensionMatch);
+  }
+
   public boolean isBackupFile()
   {
     return this.isBackupFile;
@@ -79,4 +136,14 @@ public class BackupFilenameParts
   {
     return this.num;
   }
+
+  public static String getBackupFilename(int index, String base,
+          String template, int digits)
+  {
+    String numString = String.format("%0" + digits + "d", index);
+    String backupSuffix = template.replaceFirst(BackupFiles.NUM_PLACEHOLDER,
+            numString);
+    String backupfilename = base + backupSuffix;
+    return backupfilename;
+  }
 }