3 import jalview.bin.Cache;
7 public class BackupFilenameParts
11 private String templateStart;
17 private String templateEnd;
19 private boolean isBackupFile;
21 private BackupFilenameParts()
23 this.isBackupFile = false;
26 public BackupFilenameParts(File file, String base, String template,
29 this(file.getName(), base, template, digits);
32 public BackupFilenameParts(String filename, String base, String template,
35 this(filename, base, template, suggesteddigits, false);
38 public BackupFilenameParts(String filename, String base, String template,
39 int suggesteddigits, boolean extensionMatch)
41 this.isBackupFile = false;
43 int numcharstart = template.indexOf(BackupFiles.NUM_PLACEHOLDER);
45 String templateStart = template;
46 String templateEnd = "";
47 if (numcharstart > -1)
49 templateStart = template.substring(0, numcharstart);
50 templateEnd = template.substring(
51 numcharstart + BackupFiles.NUM_PLACEHOLDER.length());
52 digits = suggesteddigits;
55 String savedFilename = "";
56 // if extensionOnly is set then reset the filename to the last occurrence of the extension+templateStart and try the match
59 // only trying to match from extension onwards
61 int extensioncharstart = filename
62 .lastIndexOf('.' + base + templateStart);
63 if (extensioncharstart == -1)
68 savedFilename = filename.substring(0, extensioncharstart + 1); // include
70 filename = filename.substring(extensioncharstart + 1);
73 // full filename match
75 // calculate minimum length of a backup filename
76 int minlength = base.length() + template.length()
77 - BackupFiles.NUM_PLACEHOLDER.length() + digits;
79 if (!(filename.startsWith(base + templateStart)
80 && filename.endsWith(templateEnd)
81 && filename.length() >= minlength))
87 int startLength = base.length() + templateStart.length();
88 int endLength = templateEnd.length();
89 String numString = numcharstart > -1
90 ? filename.substring(startLength, filename.length() - endLength)
93 if (filename.length() >= startLength + digits + endLength
94 && filename.startsWith(base + templateStart)
95 && filename.endsWith(templateEnd)
96 // match exactly digits number of number-characters (numString
97 // should be all digits and at least the right length), or more than
98 // digits long with proviso it's not zero-leading.
99 && (numString.matches("[0-9]{" + digits + "}")
100 || numString.matches("[1-9][0-9]{" + digits + ",}")))
102 this.base = extensionMatch ? savedFilename + base : base;
103 this.templateStart = templateStart;
104 this.num = numString.length() > 0 ? Integer.parseInt(numString) : 0;
105 this.digits = digits;
106 this.templateEnd = templateEnd;
107 this.isBackupFile = true;
112 public static BackupFilenameParts currentBackupFilenameParts(
113 String filename, String base, boolean extensionMatch)
115 BackupFilenameParts bfp = new BackupFilenameParts();
116 String template = Cache.getDefault(BackupFiles.SUFFIX, null);
117 if (template == null)
125 .parseInt(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, null));
126 } catch (Exception e)
130 return new BackupFilenameParts(filename, base, template, digits,
134 public boolean isBackupFile()
136 return this.isBackupFile;
139 public int indexNum()
144 public static String getBackupFilename(int index, String base,
145 String template, int digits)
147 String numString = String.format("%0" + digits + "d", index);
148 String backupSuffix = template.replaceFirst(BackupFiles.NUM_PLACEHOLDER,
150 String backupfilename = base + backupSuffix;
151 return backupfilename;