From 4ece88750272b3e2fc0bbccec7202d2faa1115b8 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 08 Dec 2018 23:32:11 +0000
Subject: [PATCH] cache refactored.

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java         |   43 +++++---------
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java                |    6 +-
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveListCache.java      |   28 ++++++++
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java         |   24 ++++++++
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveInfo.java       |    4 
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepositoryMatcher.java |    2 
 borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java             |   18 +++---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java         |   26 ++++++++
 8 files changed, 105 insertions(+), 46 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
index 41da950..ed58dae 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
+++ b/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;
     }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java
index 0b70220..b1fc92d 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java
+++ b/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);
         }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveListCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveListCache.java
index 6f3a38a..c418939 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveListCache.java
+++ b/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.
      */
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java
index 2e41324..d6f360d 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java
+++ b/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.
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java
index 4851278..6a3eea3 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java
+++ b/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.
      */
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveList.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveInfo.java
similarity index 84%
rename from borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveList.java
rename to borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveInfo.java
index a03d7fe..76b40bc 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveList.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/ArchiveInfo.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;
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepositoryMatcher.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepositoryMatcher.java
index 20f183b..207c516 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepositoryMatcher.java
+++ b/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())
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
index 7f68d7a..e16e0bd 100644
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
+++ b/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);
         }
     }

--
Gitblit v1.10.0