borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -4,7 +4,7 @@ import de.micromata.borgbutler.config.Configuration; import de.micromata.borgbutler.config.ConfigurationHandler; import de.micromata.borgbutler.json.JsonUtils; import de.micromata.borgbutler.json.borg.ArchiveList; import de.micromata.borgbutler.json.borg.ArchiveInfo; import de.micromata.borgbutler.json.borg.RepoInfo; import de.micromata.borgbutler.json.borg.RepoList; import org.apache.commons.exec.*; @@ -44,12 +44,12 @@ * @param archive * @return */ public static ArchiveList info(BorgRepoConfig repoConfig, String archive) { public static ArchiveInfo info(BorgRepoConfig repoConfig, String archive) { String json = execute(repoConfig, "info", repoConfig.getRepo() + "::" + archive, "--json"); if (json == null) { return null; } ArchiveList archiveList = JsonUtils.fromJson(ArchiveList.class, json); ArchiveInfo archiveList = JsonUtils.fromJson(ArchiveInfo.class, json); archiveList.setOriginalJson(json); return archiveList; } borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java
@@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import de.micromata.borgbutler.config.BorgRepoConfig; 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; @@ -13,8 +13,8 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.HashMap; import java.util.Map; public abstract class AbstractCache<T> { private static Logger log = LoggerFactory.getLogger(AbstractCache.class); @@ -25,40 +25,27 @@ protected File cacheFile; @Getter @JsonProperty private List<T> elements = new ArrayList<>(); protected Map<String, T> elements = new HashMap<>(); public T get(String identifier) { public T get(BorgRepoConfig repoConfig, String identifier) { if (identifier == null) { return null; } for (T element : elements) { for (T element : elements.values()) { if (matches(element, identifier)) { return element; } } return null; return load(repoConfig, 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); } protected abstract T load(BorgRepoConfig repoConfig, String identifier); 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 boolean matches(T element, String identifier); 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)); } public abstract String getIdentifier(T element); public abstract void updateFrom(T dest, T source); /** * Removes all entries (doesn't effect the cache files!). @@ -67,10 +54,10 @@ elements.clear(); } public void upsert(T element) { T existingElement = get(getIdentifier(element)); public void upsert(BorgRepoConfig repoConfig, T element) { T existingElement = get(repoConfig, getIdentifier(element)); if (existingElement == null) { elements.add(element); elements.put(getIdentifier(element), element); } else { updateFrom(existingElement, element); } borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveListCache.java
@@ -1,15 +1,39 @@ package de.micromata.borgbutler.cache; import de.micromata.borgbutler.json.borg.ArchiveList; import de.micromata.borgbutler.BorgCommands; import de.micromata.borgbutler.config.BorgRepoConfig; import de.micromata.borgbutler.json.borg.ArchiveInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; public class ArchiveListCache extends AbstractCache<ArchiveList> { public class ArchiveListCache extends AbstractCache<ArchiveInfo> { private static Logger log = LoggerFactory.getLogger(ArchiveListCache.class); public static final String CACHE_ARCHIVE_LISTS_BASENAME = "archive-lists"; @Override protected ArchiveInfo load(BorgRepoConfig repoConfig, String identifier) { ArchiveInfo archiveInfo = BorgCommands.info(repoConfig, identifier); this.elements.put(getIdentifier(archiveInfo), archiveInfo); return archiveInfo; } @Override public boolean matches(ArchiveInfo element, String identifier) { return element.matches(identifier); } @Override public String getIdentifier(ArchiveInfo element) { return element.getRepository().getId(); } @Override public void updateFrom(ArchiveInfo dest, ArchiveInfo source) { dest.updateFrom(source); } /** * Needed by jackson for deserialization. */ borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java
@@ -1,5 +1,7 @@ package de.micromata.borgbutler.cache; import de.micromata.borgbutler.BorgCommands; import de.micromata.borgbutler.config.BorgRepoConfig; import de.micromata.borgbutler.json.borg.RepoInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,7 +10,29 @@ public class RepoInfoCache extends AbstractCache<RepoInfo> { private static Logger log = LoggerFactory.getLogger(RepoInfoCache.class); public static final String CACHE_REPOS_BASENAME = "repos"; public static final String CACHE_REPOS_BASENAME = "repo-infos"; @Override protected RepoInfo load(BorgRepoConfig repoConfig, String identifier) { RepoInfo repoInfo = BorgCommands.info(repoConfig); this.elements.put(getIdentifier(repoInfo), repoInfo); return repoInfo; } @Override public boolean matches(RepoInfo element, String identifier) { return element.matches(identifier); } @Override public String getIdentifier(RepoInfo element) { return element.getRepository().getId(); } @Override 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,5 +1,7 @@ package de.micromata.borgbutler.cache; import de.micromata.borgbutler.BorgCommands; import de.micromata.borgbutler.config.BorgRepoConfig; import de.micromata.borgbutler.json.borg.RepoList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,6 +12,28 @@ private static Logger log = LoggerFactory.getLogger(RepoListCache.class); public static final String CACHE_REPO_LISTS_BASENAME = "repo-lists"; @Override protected RepoList load(BorgRepoConfig repoConfig, String identifier) { RepoList repoList = BorgCommands.list(repoConfig); this.elements.put(getIdentifier(repoList), repoList); return repoList; } @Override public boolean matches(RepoList element, String identifier) { return element.matches(identifier); } @Override public String getIdentifier(RepoList element) { return element.getRepository().getId(); } @Override 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/ArchiveInfo.java
File was renamed from borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveList.java @@ -9,7 +9,7 @@ /** * Result of <tt>borg list repo</tt>. */ public class ArchiveList extends RepositoryMatcher { public class ArchiveInfo extends RepositoryMatcher { @Getter private List<Archive2> archives; @Getter @@ -21,7 +21,7 @@ @JsonIgnore private String originalJson; public void updateFrom(ArchiveList archiveList) { public void updateFrom(ArchiveInfo archiveList) { super.updateFrom(archiveList); this.archives = archiveList.archives; this.cache = archiveList.cache; borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepositoryMatcher.java
@@ -23,7 +23,7 @@ } public boolean matches(String identifier) { if (repository == null) { if (repository == null || identifier == null) { return false; } return identifier.equals(repository.getId()) || identifier.equals(repository.getName()) borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
@@ -52,7 +52,7 @@ BorgRepoConfig repoConfig = null; if (CollectionUtils.isNotEmpty(repoConfigs)) { repoConfig = repoConfigs.get(0); RepoList repoList = ButlerCache.getInstance().getRepoListCache().get(repoConfig.getRepo()); RepoList repoList = ButlerCache.getInstance().getRepoListCache().get(repoConfig, repoConfig.getRepo()); if (repoList != null && CollectionUtils.isNotEmpty(repoList.getArchives())) { archive = repoList.getArchives().get(0); } @@ -72,11 +72,11 @@ } }*/ } { {/* if (archive != null) { String json = BorgCommands.list(repoConfig, archive.getArchive()); log.info(json); } }*/ } butlerCache.save(); } @@ -85,8 +85,8 @@ for (BorgRepoConfig repo : config.getRepoConfigs()) { log.info("Processing repo info '" + repo + "'"); RepoInfo repoInfo = BorgCommands.info(repo); repoInfoCache.upsert(repoInfo); repoInfo = repoInfoCache.get(repoInfo.getRepository().getId()); repoInfoCache.upsert(repo, repoInfo); repoInfo = repoInfoCache.get(repo, repoInfo.getRepository().getId()); assertNotNull(repoInfo); } } @@ -95,8 +95,8 @@ 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()); repoListCache.upsert(repo, repoList); repoList = repoListCache.get(repo, repoList.getRepository().getId()); assertNotNull(repoList); } } @@ -105,8 +105,8 @@ 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()); repoListCache.upsert(repo, repoList); repoList = repoListCache.get(repo, repoList.getRepository().getId()); assertNotNull(repoList); } }