package pt.utl.ist.codeGenerator.database; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; public class UpgradesFinder { public List listUpgradeDirs(File baseDir,Date lastVersionDate) { //Get all the upgrades directories inside the first level ArrayList upgradesDirectories=new ArrayList(); UpgradeDirFilter upgradeDirFilter=new UpgradeDirFilter(lastVersionDate); upgradesDirectories.addAll(Arrays.asList(baseDir.listFiles(upgradeDirFilter))); //Now find all the subdir with possible upgrades (R2005,R2006,...) List upgradeSubDirs=listSubDirsWithPossibleUpgrades(baseDir, lastVersionDate); for(File upgradeSubDir:upgradeSubDirs) {//for each subdir with upgrades, add the upgrades directories inside it upgradesDirectories.addAll(Arrays.asList(upgradeSubDir.listFiles(upgradeDirFilter))); } return upgradesDirectories; } public List listSubDirsWithPossibleUpgrades(File baseDir,Date lastVersionDate) { return Arrays.asList(baseDir.listFiles(new UpgradeSubDirFilter(lastVersionDate))); } public class UpgradeSubDirFilter implements java.io.FileFilter { private long millisLastVersion = Long.MAX_VALUE; public UpgradeSubDirFilter(Date lastVersionDate) { this.millisLastVersion = lastVersionDate.getTime(); } public boolean accept(File f) { if (f.isDirectory() && f.canRead()) { String dirName = f.getName(); // name should be in format R2006 - Ryyyy if (dirName.startsWith("R") && dirName.length() >= "Ryyyy".length()) { String yearStr = dirName.substring(1, 5); try { int year = Integer.parseInt(yearStr); Calendar c = new GregorianCalendar(year, 12, 31); if (millisLastVersion <= c.getTimeInMillis()) return true; } catch (Exception e) { } } } return false; } } public class UpgradeDirFilter implements java.io.FileFilter { private long millisLastVersion = Long.MAX_VALUE; public UpgradeDirFilter(Date lastVersionDate) { this.millisLastVersion = lastVersionDate.getTime(); } public boolean accept(File f) { if (f.isDirectory() && f.canRead()) { // check if it has a "run" file inside File[] runFiles = f.listFiles(runFileFilter); if (runFiles == null || runFiles.length == 0) return false; String dirName = f.getName(); // name should be in format R2006-06-12 - Ryyyy-mm-dd if (dirName.startsWith("R") && dirName.contains("-") && dirName.length() >= "Ryyyy-mm-dd".length()) { String yearStr = dirName.substring(1, 5); String monthStr = dirName.substring(6, 8); String dayStr = dirName.substring(9, 11); try { int day = Integer.parseInt(dayStr); int month = Integer.parseInt(monthStr); int year = Integer.parseInt(yearStr); Calendar c = new GregorianCalendar(year, month, day); if (millisLastVersion <= c.getTimeInMillis()) return true; } catch (Exception e) { } } } return false; } } private RunFileFilter runFileFilter=new RunFileFilter(); private class RunFileFilter implements java.io.FileFilter { public boolean accept(File file) { return file.isFile() && file.canRead() && file.getName().equals("run"); } } public List listUpgradeFiles(File upgradeDir) { return Arrays.asList(upgradeDir.listFiles(runFileFilter)); } }