1 package org
.argeo
.slc
.backup
.vfs
;
3 import java
.text
.DateFormat
;
4 import java
.time
.Period
;
5 import java
.time
.ZoneId
;
6 import java
.time
.ZonedDateTime
;
8 import java
.util
.SortedMap
;
9 import java
.util
.TreeMap
;
11 import org
.apache
.commons
.vfs2
.FileObject
;
12 import org
.apache
.commons
.vfs2
.FileSystemManager
;
13 import org
.apache
.commons
.vfs2
.FileSystemOptions
;
14 import org
.apache
.commons
.vfs2
.Selectors
;
15 import org
.argeo
.api
.cms
.CmsLog
;
17 /** Simple backup purge which keeps backups only for a given number of days */
18 public class SimpleBackupPurge
implements BackupPurge
{
19 private final static CmsLog log
= CmsLog
.getLog(SimpleBackupPurge
.class);
21 private Integer daysKept
= 30;
24 public void purge(FileSystemManager fileSystemManager
, String base
, String name
, DateFormat dateFormat
,
25 FileSystemOptions opts
) {
27 ZonedDateTime nowDt
= ZonedDateTime
.now();
28 FileObject baseFo
= fileSystemManager
.resolveFile(base
+ '/' + name
, opts
);
30 SortedMap
<ZonedDateTime
, FileObject
> toDelete
= new TreeMap
<ZonedDateTime
, FileObject
>();
33 // make sure base dir exists
34 baseFo
.createFolder();
36 // scan backups and list those which should be deleted
37 for (FileObject backupFo
: baseFo
.getChildren()) {
38 String backupName
= backupFo
.getName().getBaseName();
39 Date backupDate
= dateFormat
.parse(backupName
);
41 ZonedDateTime backupDt
= ZonedDateTime
.ofInstant(backupDate
.toInstant(), ZoneId
.systemDefault());
42 Period sinceThen
= Period
.between(backupDt
.toLocalDate(), nowDt
.toLocalDate());
43 // new Period(backupDt, nowDt);
44 int days
= sinceThen
.getDays();
45 // int days = sinceThen.getMinutes();
46 if (days
> daysKept
) {
47 toDelete
.put(backupDt
, backupFo
);
51 if (toDelete
.size() != 0 && toDelete
.size() == backupCount
) {
52 // all backups would be deleted
53 // but we want to keep at least one
54 ZonedDateTime lastBackupDt
= toDelete
.firstKey();
55 FileObject keptFo
= toDelete
.remove(lastBackupDt
);
56 log
.warn("Backup " + keptFo
+ " kept although it is older than " + daysKept
+ " days.");
60 for (FileObject backupFo
: toDelete
.values()) {
61 backupFo
.delete(Selectors
.SELECT_ALL
);
62 if (log
.isDebugEnabled())
63 log
.debug("Deleted backup " + backupFo
);
65 } catch (Exception e
) {
66 throw new MaintenanceException("Could not purge previous backups", e
);