package fitnesse.reporting.history;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import fitnesse.util.Clock;
import fitnesse.wiki.WikiPagePath;
import util.FileUtil;
import static java.lang.String.format;
public class HistoryPurger {
private static final Logger LOG = Logger.getLogger(HistoryPurger.class.getName());
private final File resultsDirectory;
private final Date expirationDate;
public HistoryPurger(File resultsDirectory, int days) {
this.resultsDirectory = resultsDirectory;
this.expirationDate = getDateDaysAgo(days);
}
public void deleteTestHistoryOlderThanDays() {
File[] files = FileUtil.getDirectoryListing(resultsDirectory);
deleteExpiredFiles(files);
}
public void deleteTestHistoryOlderThanDays(WikiPagePath path) {
String pageName = path.toString();
String subPagePrefix = pageName + ".";
File[] files = FileUtil.getDirectoryListing(resultsDirectory);
for (File file : files) {
String fileName = file.getName();
if (fileName.equals(pageName) || fileName.startsWith(subPagePrefix)) {
deleteIfExpired(file);
}
}
}
private void deleteExpiredFiles(File[] files) {
for (File file : files)
deleteIfExpired(file);
}
public Date getDateDaysAgo(int days) {
long now = Clock.currentTimeInMillis();
long millisecondsPerDay = 1000L * 60L * 60L * 24L;
Date daysEarlier = new Date(now - (millisecondsPerDay * days));
return daysEarlier;
}
private void deleteIfExpired(File file) {
try {
if (file.isDirectory()) {
deleteDirectoryIfExpired(file);
} else
deleteFileIfExpired(file);
} catch (IOException e) {
LOG.log(Level.INFO, format("Unable to remove test history file %s", file.getPath()));
}
}
private void deleteDirectoryIfExpired(File file) throws IOException {
File[] files = FileUtil.getDirectoryListing(file);
deleteExpiredFiles(files);
if (file.list().length == 0)
FileUtil.deleteFileSystemDirectory(file);
}
private void deleteFileIfExpired(File file) throws IOException {
String name = file.getName();
Date date = getDateFromPageHistoryFileName(name);
if (date.getTime() < expirationDate.getTime())
FileUtil.deleteFile(file);
}
private Date getDateFromPageHistoryFileName(String name) {
try {
return tryExtractDateFromTestHistoryName(name);
} catch (ParseException e) {
LOG.log(Level.INFO, format("Can not determine date from test history file %s", name));
return new Date();
}
}
private Date tryExtractDateFromTestHistoryName(String testHistoryName) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat(PageHistory.TEST_RESULT_FILE_DATE_PATTERN);
String dateString = testHistoryName.split("_")[0];
return dateFormat.parse(dateString);
}
}