Merge branch 'bug/JAL-3120restoreFeatureColour' into merge/JAL-3120
[jalview.git] / src / jalview / io / BackupFilenameParts.java
1 package jalview.io;
2
3 import jalview.bin.Cache;
4
5 import java.io.File;
6
7 public class BackupFilenameParts
8 {
9   private String base;
10
11   private String templateStart;
12
13   private int num;
14
15   private int digits;
16
17   private String templateEnd;
18
19   private boolean isBackupFile;
20
21   private BackupFilenameParts()
22   {
23     this.isBackupFile = false;
24   }
25
26   public BackupFilenameParts(File file, String base, String template,
27           int digits)
28   {
29     this(file.getName(), base, template, digits);
30   }
31
32   public BackupFilenameParts(String filename, String base, String template,
33           int suggesteddigits)
34   {
35     this(filename, base, template, suggesteddigits, false);
36   }
37
38   public BackupFilenameParts(String filename, String base, String template,
39           int suggesteddigits, boolean extensionMatch)
40   {
41     this.isBackupFile = false;
42
43     int numcharstart = template.indexOf(BackupFiles.NUM_PLACEHOLDER);
44     int digits = 0;
45     String templateStart = template;
46     String templateEnd = "";
47     if (numcharstart > -1)
48     {
49       templateStart = template.substring(0, numcharstart);
50       templateEnd = template.substring(
51               numcharstart + BackupFiles.NUM_PLACEHOLDER.length());
52       digits = suggesteddigits;
53     }
54
55     String savedFilename = "";
56     // if extensionOnly is set then reset the filename to the last occurrence of the extension+templateStart and try the match
57     if (extensionMatch)
58     {
59       // only trying to match from extension onwards
60
61       int extensioncharstart = filename
62               .lastIndexOf('.' + base + templateStart);
63       if (extensioncharstart == -1)
64       {
65         return;
66       }
67
68       savedFilename = filename.substring(0, extensioncharstart + 1); // include
69                                                                      // the "."
70       filename = filename.substring(extensioncharstart + 1);
71     }
72
73     // full filename match
74
75     // calculate minimum length of a backup filename
76     int minlength = base.length() + template.length()
77             - BackupFiles.NUM_PLACEHOLDER.length() + digits;
78
79     if (!(filename.startsWith(base + templateStart)
80             && filename.endsWith(templateEnd)
81             && filename.length() >= minlength))
82     {
83       // non-starter
84       return;
85     }
86
87     int startLength = base.length() + templateStart.length();
88     int endLength = templateEnd.length();
89     String numString = numcharstart > -1
90             ? filename.substring(startLength, filename.length() - endLength)
91             : "";
92
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 + ",}")))
101     {
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;
108     }
109
110   }
111
112   public static BackupFilenameParts currentBackupFilenameParts(
113           String filename, String base, boolean extensionMatch)
114   {
115     BackupFilenameParts bfp = new BackupFilenameParts();
116     String template = Cache.getDefault(BackupFiles.SUFFIX, null);
117     if (template == null)
118     {
119       return bfp;
120     }
121     int digits;
122     try
123     {
124       digits = Integer
125               .parseInt(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, null));
126     } catch (Exception e)
127     {
128       return bfp;
129     }
130     return new BackupFilenameParts(filename, base, template, digits,
131             extensionMatch);
132   }
133
134   public boolean isBackupFile()
135   {
136     return this.isBackupFile;
137   }
138
139   public int indexNum()
140   {
141     return this.num;
142   }
143
144   public static String getBackupFilename(int index, String base,
145           String template, int digits)
146   {
147     String numString = String.format("%0" + digits + "d", index);
148     String backupSuffix = template.replaceFirst(BackupFiles.NUM_PLACEHOLDER,
149             numString);
150     String backupfilename = base + backupSuffix;
151     return backupfilename;
152   }
153 }