mirror of https://github.com/micromata/borgbackup-butler.git

Kai Reinhard
09.32.2018 4ece88750272b3e2fc0bbccec7202d2faa1115b8
cache refactored.
1 files renamed
7 files modified
151 ■■■■■ changed files
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java 6 ●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java 43 ●●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveListCache.java 28 ●●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java 26 ●●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java 24 ●●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveInfo.java 4 ●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepositoryMatcher.java 2 ●●● patch | view | raw | blame | history
borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java 18 ●●●● patch | view | raw | blame | history
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);
        }
    }