borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -4,7 +4,8 @@ import de.micromata.borgbutler.config.Configuration; import de.micromata.borgbutler.config.ConfigurationHandler; import de.micromata.borgbutler.json.JsonUtils; import de.micromata.borgbutler.json.borg.Archive; import de.micromata.borgbutler.json.borg.Archive1; import de.micromata.borgbutler.json.borg.ArchiveList; import de.micromata.borgbutler.json.borg.RepoInfo; import de.micromata.borgbutler.json.borg.RepoList; import org.apache.commons.exec.*; @@ -44,13 +45,14 @@ * @param archive * @return */ public static String info(BorgRepoConfig repoConfig, Archive archive) { public static ArchiveList info(BorgRepoConfig repoConfig, Archive1 archive) { String json = execute(repoConfig, "info", repoConfig.getRepo() + "::" + archive.getArchive(), "--json"); if (json == null) { return null; } log.info(json); return json; ArchiveList archiveList = JsonUtils.fromJson(ArchiveList.class, json); archiveList.setOriginalJson(json); return archiveList; } public static RepoList list(BorgRepoConfig repoConfig) { borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java
@@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import de.micromata.borgbutler.json.JsonUtils; import de.micromata.borgbutler.json.borg.RepositoryMatcher; import lombok.Getter; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @@ -38,11 +39,26 @@ return null; } public abstract boolean matches(T element, String identifier); public boolean matches(T element, String identifier) { if (!(element instanceof RepositoryMatcher)) { throw new UnsupportedOperationException("matches not implemented, only available for RepositoryMatcher: " + this.getClass()); } return ((RepositoryMatcher) element).matches(identifier); } public abstract String getIdentifier(T element); public String getIdentifier(T element) { if (!(element instanceof RepositoryMatcher)) { throw new UnsupportedOperationException("matches not implemented, only available for RepositoryMatcher: " + this.getClass()); } return ((RepositoryMatcher)element).getRepository().getId(); } public abstract void updateFrom(T dest, T source); public void updateFrom(T dest, T source) { if (!(dest instanceof RepositoryMatcher)) { throw new UnsupportedOperationException("matches not implemented, only available for RepositoryMatcher: " + this.getClass()); } ((RepositoryMatcher)dest).updateFrom(((RepositoryMatcher)source)); } /** * Removes all entries (doesn't effect the cache files!). borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveListCache.java
New file @@ -0,0 +1,22 @@ package de.micromata.borgbutler.cache; import de.micromata.borgbutler.json.borg.ArchiveList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; public class ArchiveListCache extends AbstractCache<ArchiveList> { private static Logger log = LoggerFactory.getLogger(ArchiveListCache.class); public static final String CACHE_ARCHIVE_LISTS_BASENAME = "archive-lists"; /** * Needed by jackson for deserialization. */ ArchiveListCache() { } ArchiveListCache(File cacheDir) { super(cacheDir, CACHE_ARCHIVE_LISTS_BASENAME); } } borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java
@@ -1,7 +1,6 @@ package de.micromata.borgbutler.cache; import de.micromata.borgbutler.json.borg.RepoInfo; import de.micromata.borgbutler.json.borg.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,23 +10,6 @@ private static Logger log = LoggerFactory.getLogger(RepoInfoCache.class); public static final String CACHE_REPOS_BASENAME = "repos"; public boolean matches(RepoInfo element, String identifier) { Repository repository = element.getRepository(); if (repository == null) { return false; } return identifier.equals(repository.getId()) || identifier.equals(repository.getName()) || identifier.equals(repository.getLocation()); } public String getIdentifier(RepoInfo element) { return element.getRepository().getId(); } public void updateFrom(RepoInfo dest, RepoInfo source) { dest.updateFrom(source); } /** * Needed by jackson for deserialization. */ borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java
@@ -1,7 +1,6 @@ package de.micromata.borgbutler.cache; import de.micromata.borgbutler.json.borg.RepoList; import de.micromata.borgbutler.json.borg.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,23 +10,6 @@ private static Logger log = LoggerFactory.getLogger(RepoListCache.class); public static final String CACHE_REPO_LISTS_BASENAME = "repo-lists"; public boolean matches(RepoList element, String identifier) { Repository repository = element.getRepository(); if (repository == null) { return false; } return identifier.equals(repository.getId()) || identifier.equals(repository.getName()) || identifier.equals(repository.getLocation()); } public String getIdentifier(RepoList element) { return element.getRepository().getId(); } public void updateFrom(RepoList dest, RepoList source) { dest.updateFrom(source); } /** * Needed by jackson for deserialization. */ borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Archive1.java
File was renamed from borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Archive.java @@ -5,7 +5,10 @@ import lombok.Getter; import lombok.Setter; public class Archive { /** * This object is given by <tt>borg list repo</tt>. */ public class Archive1 { @Getter private String archive; @Getter borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Archive2.java
New file @@ -0,0 +1,31 @@ package de.micromata.borgbutler.json.borg; import com.fasterxml.jackson.annotation.JsonProperty; import de.micromata.borgbutler.json.JsonUtils; import lombok.Getter; /** * This object is given by <tt>borg list archive</tt>. */ public class Archive2 { @Getter @JsonProperty("chunker_params") private int[] chunkerParams; /** * The command line used for creating this archive: borg create --filter... */ @Getter @JsonProperty("command_line") private String[] commandLine; @Getter private String comment; @Getter private String start; @Getter private ArchiveStats stats; @Getter private String username; public String toString() { return JsonUtils.toJson(this, true); } } borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveList.java
New file @@ -0,0 +1,30 @@ package de.micromata.borgbutler.json.borg; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Getter; import lombok.Setter; import java.util.List; /** * Result of <tt>borg list repo</tt>. */ public class ArchiveList extends RepositoryMatcher { @Getter private List<Archive2> archives; @Getter private Cache cache; @Getter private Encryption encryption; @Getter @Setter @JsonIgnore private String originalJson; public void updateFrom(ArchiveList archiveList) { super.updateFrom(archiveList); this.archives = archiveList.archives; this.cache = archiveList.cache; this.encryption = archiveList.encryption; } } borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveStats.java
New file @@ -0,0 +1,18 @@ package de.micromata.borgbutler.json.borg; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; public class ArchiveStats { @Getter @JsonProperty("compressed_size") private long compressedSize; @Getter @JsonProperty("deduplicated_size") private long deduplicatedSize; @Getter private long nfiles; @Getter @JsonProperty("original_size") private long originalSize; } borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoInfo.java
@@ -1,12 +1,9 @@ package de.micromata.borgbutler.json.borg; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import de.micromata.borgbutler.json.JsonUtils; import lombok.Getter; import lombok.Setter; public class RepoInfo { public class RepoInfo extends RepositoryMatcher { @Getter @JsonProperty("security_dir") private String securityDir; @@ -14,23 +11,11 @@ private Cache cache; @Getter private Encryption encryption; @Getter private Repository repository; @Getter @Setter @JsonIgnore private String originalJson; public String toString() { return JsonUtils.toJson(this, true); } public void updateFrom(RepoInfo repoInfo) { super.updateFrom(repoInfo); this.securityDir = repoInfo.securityDir; this.cache = repoInfo.cache; this.encryption = repoInfo.encryption; this.repository = repoInfo.getRepository(); this.originalJson = repoInfo.originalJson; } } borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoList.java
@@ -1,32 +1,18 @@ package de.micromata.borgbutler.json.borg; import com.fasterxml.jackson.annotation.JsonIgnore; import de.micromata.borgbutler.json.JsonUtils; import lombok.Getter; import lombok.Setter; import java.util.List; public class RepoList { public class RepoList extends RepositoryMatcher { @Getter private List<Archive> archives; private List<Archive1> archives; @Getter private Encryption encryption; @Getter private Repository repository; @Getter @Setter @JsonIgnore private String originalJson; public String toString() { return JsonUtils.toJson(this, true); } public void updateFrom(RepoList repoList) { super.updateFrom(repoList); this.archives = repoList.archives; this.encryption = repoList.encryption; this.repository = repoList.getRepository(); this.originalJson = repoList.originalJson; } } borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepositoryMatcher.java
New file @@ -0,0 +1,32 @@ package de.micromata.borgbutler.json.borg; import com.fasterxml.jackson.annotation.JsonIgnore; import de.micromata.borgbutler.json.JsonUtils; import lombok.Getter; import lombok.Setter; public abstract class RepositoryMatcher { @Getter protected Repository repository; @Getter @Setter @JsonIgnore protected String originalJson; public String toString() { return JsonUtils.toJson(this, true); } public void updateFrom(RepositoryMatcher from) { this.repository = from.repository; this.originalJson = from.originalJson; } public boolean matches(String identifier) { if (repository == null) { return false; } return identifier.equals(repository.getId()) || identifier.equals(repository.getName()) || identifier.equals(repository.getLocation()); } } borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
@@ -4,7 +4,8 @@ import de.micromata.borgbutler.config.BorgRepoConfig; import de.micromata.borgbutler.config.Configuration; import de.micromata.borgbutler.config.ConfigurationHandler; import de.micromata.borgbutler.json.borg.Archive; import de.micromata.borgbutler.json.borg.Archive1; import de.micromata.borgbutler.json.borg.ArchiveList; import de.micromata.borgbutler.json.borg.RepoInfo; import de.micromata.borgbutler.json.borg.RepoList; import org.apache.commons.collections4.CollectionUtils; @@ -53,9 +54,10 @@ BorgRepoConfig repoConfig = repoConfigs.get(0); RepoList repoList = ButlerCache.getRepoListCache().get(repoConfig.getRepo()); if (repoList != null && CollectionUtils.isNotEmpty(repoList.getArchives())) { Archive archive = repoList.getArchives().get(0); Archive1 archive = repoList.getArchives().get(0); if (archive != null) { String json = BorgCommands.info(repoConfig, archive); ArchiveList list = BorgCommands.info(repoConfig, archive); log.info(list.toString()); } } } @@ -82,4 +84,14 @@ assertNotNull(repoList); } } private void refresArchiveListCache(Configuration config, RepoListCache repoListCache) { for (BorgRepoConfig repo : config.getRepoConfigs()) { log.info("Processing repo list '" + repo + "'"); RepoList repoList = BorgCommands.list(repo); repoListCache.upsert(repoList); repoList = repoListCache.get(repoList.getRepository().getId()); assertNotNull(repoList); } } }