package jalview.io; import jalview.bin.Cache; import java.io.File; import java.io.IOException; public class BackupFiles { // labels for saved params in Cache and .jalview_properties private static String NS = "BACKUPFILES"; public static String ENABLED = NS + "_ENABLED"; public static String SUFFIX = NS + "_SUFFIX"; public static String ROLL_MAX = NS + "_ROLL_MAX"; public static String SUFFIX_DIGITS = NS + "_SUFFIX_DIGITS"; public static String REVERSE_ORDER = NS + "_REVERSE_ORDER"; private static String DEFAULT_TEMP_FILE = "jalview_temp_file_" + NS; // file - File object to be backed up and then updated (written over) private File file; // enabled - default flag as to whether to do the backup file roll (if not // defined in preferences) private boolean enabled = true; // defaultSuffix - default template to use to append to basename of file private String suffix = "-v%n"; // defaultMax - default max number of backup files private int max = 4; // defaultDigits - number of zero-led digits to use in the filename private int digits = 2; // reverseOrder - set to true to make newest (latest) files lowest number // (like rolled log files) private boolean reverseOrder = false; // temp saved file to become new saved file private File tempFile; public BackupFiles(String filename) { this(new File(filename)); } // first time defaults for ENABLED, SUFFIX, ROLL_MAX, SUFFIX_DIGITS and // REVERSE_ORDER public BackupFiles(File file) { this(file, true, "-v%n", 4, 2, false); } // set, get and rename temp file into place public void setTempFile(File temp) { this.tempFile = temp; } public File getTempFile() { return tempFile; } public boolean renameTempFile() { return tempFile.renameTo(file); } protected BackupFiles(File file, boolean defaultEnabled, String defaultSuffix, int defaultMax, int defaultDigits, boolean defaultReverseOrder) { this.file = file; this.enabled = Cache.getDefault(ENABLED, defaultEnabled); this.suffix = Cache.getDefault(SUFFIX, defaultSuffix); this.max = Cache.getDefault(ROLL_MAX, defaultMax); this.digits = Cache.getDefault(SUFFIX_DIGITS, defaultDigits); this.reverseOrder = Cache.getDefault(REVERSE_ORDER, defaultReverseOrder); // create a temp file to save new data in File temp; try { if (file != null) { String tempfilename = file.getName(); File tempdir = file.getParentFile(); temp = File.createTempFile(tempfilename, ".tmp", tempdir); } else { temp = File.createTempFile(DEFAULT_TEMP_FILE, ".tmp"); setTempFile(temp); } } catch (IOException e) { System.out.println( "Could not create temp file to save into (IOException)"); } catch (Exception e) { System.out.println("Exception ctreating temp file for saving"); } } // roll the backupfiles public boolean rollBackupFiles() { // file doesn't yet exist or backups are not enabled if ((!file.exists()) || (!enabled) || (max < 1)) { // nothing to do return true; } // split filename up to insert suffix template in the right place. template // and backupMax can be set in .jalview_properties String dir = ""; try { File dirFile = file.getParentFile(); dir = dirFile.getCanonicalPath(); } catch (Exception e) { System.out.println( "Could not get canonical path for file '" + file + "'"); return false; } String filename = file.getName(); String basename = filename; String extension = ""; int dotcharpos = filename.lastIndexOf('.'); // don't split of filenames with the last '.' at the very beginning or // very end of the filename if ((dotcharpos > 0) && (dotcharpos < filename.length() - 1)) { basename = filename.substring(0, dotcharpos); extension = filename.substring(dotcharpos); // NOTE this includes the '.' } boolean ret = true; // Create/move backups up one String numString = null; File lastfile = null; if (reverseOrder) { // backup style numbering for (int m = 0; m < max; m++) { int n = max - m; numString = String.format("%0" + digits + "d", n); String backupSuffix = suffix.replaceAll("%n", numString); String backupfilename = dir + File.separatorChar + basename + backupSuffix + extension; File backupfile_n = new File(backupfilename); if (!backupfile_n.exists()) { lastfile = backupfile_n; continue; } if (m == 0) { // Move the max backup to /tmp instead of deleting (Just In // Case) String tmpfile = "tmp-" + backupfile_n.getName(); try { File tmpFile = File.createTempFile(tmpfile, ".tmp"); ret = ret && backupfile_n.renameTo(tmpFile); } catch (IOException e) { System.out.println( "Could not create temp file '" + tmpfile + ".tmp'"); } } else { // Just In Case if (lastfile != null) { ret = ret && backupfile_n.renameTo(lastfile); } } lastfile = backupfile_n; } } else { // version style numbering (with file rolling though) // check if all backup files exist int largest = 0; for (int m = 0; m < max; m++) { int n = m + 1; numString = String.format("%0" + digits + "d", n); String backupSuffix = suffix.replaceAll("%n", numString); String backupfilename = dir + File.separatorChar + basename + backupSuffix + extension; File backupfile_n = new File(backupfilename); if (backupfile_n.exists()) { largest = n; } } // MORE CODE HERE BEN! } // now actually backup the important file! ret = ret && file.renameTo(lastfile); return ret; } }