From c2489ecbd13878e205f8528eeb150d5cd0200d47 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 08 Dec 2018 17:41:12 +0000
Subject: [PATCH] Caches...

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java |   23 +++++++
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoInfo.java  |    1 
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoList.java  |    7 ++
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java |   40 +++++++++++++
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java   |   46 +++++++++++++-
 borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java     |   42 +++++++++-----
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java |    4 
 7 files changed, 139 insertions(+), 24 deletions(-)

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 63e572f..840be70 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
@@ -5,6 +5,7 @@
 import de.micromata.borgbutler.json.JsonUtils;
 import lombok.Getter;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -16,6 +17,8 @@
 
 public abstract class AbstractCache<T> {
     private static Logger log = LoggerFactory.getLogger(AbstractCache.class);
+    private static final String CACHE_FILE_PREFIX = "cache-";
+    private static final String CACHE_FILE_EXTENSION = "json";
 
     @JsonIgnore
     protected File cacheFile;
@@ -41,6 +44,13 @@
 
     public abstract void updateFrom(T dest, T source);
 
+    /**
+     * Removes all entries (doesn't effect the cache files!).
+     */
+    public void clear() {
+        elements.clear();
+    }
+
     public void upsert(T element) {
         T existingElement = get(getIdentifier(element));
         if (existingElement == null) {
@@ -52,6 +62,11 @@
 
     public void read() {
         try {
+            if (!cacheFile.exists()) {
+                // Cache file doesn't exist. Nothing to read.
+                return;
+            }
+            log.info("Parsing cache file '" + cacheFile.getAbsolutePath() + "'.");
             String json = FileUtils.readFileToString(cacheFile, Charset.forName("UTF-8"));
             AbstractCache readCache = JsonUtils.fromJson(this.getClass(), json);
             if (readCache != null) {
@@ -83,6 +98,12 @@
     }
 
     AbstractCache(File cacheDir, String cacheFilename) {
-        cacheFile = new File(cacheDir, cacheFilename);
+        cacheFile = new File(cacheDir, CACHE_FILE_PREFIX + cacheFilename + "." + CACHE_FILE_EXTENSION);
+    }
+
+    public static boolean isCacheFile(File file) {
+        String filename = file.getName();
+        String extension = FilenameUtils.getExtension(filename);
+        return filename.startsWith(CACHE_FILE_PREFIX) && extension.equals(CACHE_FILE_EXTENSION);
     }
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
index ebb0a64..8664817 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
@@ -5,13 +5,17 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
 public class ButlerCache {
     private static Logger log = LoggerFactory.getLogger(ButlerCache.class);
     public static final String CACHE_DIR_NAME = ".borgbutler";
     private static ButlerCache instance = new ButlerCache();
 
-    private RepoInfoCache reposCache;
+    private RepoInfoCache repoInfoCache;
+    private RepoListCache repoListCache;
+    private List<AbstractCache> caches;
 
     @JsonIgnore
     private File cacheDir;
@@ -20,12 +24,40 @@
         return instance;
     }
 
-    public static RepoInfoCache getReposCache() {
-        return instance.reposCache;
+    public static RepoInfoCache getRepoInfoCache() {
+        return instance.repoInfoCache;
+    }
+
+    public static RepoListCache getRepoListCache() {
+        return instance.repoListCache;
+    }
+
+    public void read() {
+        for (AbstractCache cache : caches) {
+            cache.read();
+        }
     }
 
     public void save() {
-        reposCache.save();
+        for (AbstractCache cache : caches) {
+            cache.save();
+        }
+    }
+
+    /**
+     * Removes all cache files and clears all caches.
+     */
+    public void removeAllCacheFiles() {
+        File[] files = cacheDir.listFiles();
+        for (File file : files) {
+            if (AbstractCache.isCacheFile(file)) {
+                log.info("Deleting cache file: " + file.getAbsolutePath());
+                file.delete();
+            }
+        }
+        for (AbstractCache cache : caches) {
+            cache.clear();
+        }
     }
 
     private ButlerCache() {
@@ -35,6 +67,10 @@
             log.info("Creating cache dir: " + cacheDir.getAbsolutePath());
             cacheDir.mkdir();
         }
-        reposCache = new RepoInfoCache(cacheDir);
+        repoInfoCache = new RepoInfoCache(cacheDir);
+        repoListCache = new RepoListCache(cacheDir);
+        caches = new ArrayList<>();
+        caches.add(repoInfoCache);
+        caches.add(repoListCache);
     }
 }
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 d91bc08..9f98632 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
@@ -9,7 +9,7 @@
 
 public class RepoInfoCache extends AbstractCache<RepoInfo> {
     private static Logger log = LoggerFactory.getLogger(RepoInfoCache.class);
-    public static final String CACHE_REPOS_FILENAME = "cache-repos.json";
+    public static final String CACHE_REPOS_BASENAME = "repos";
 
     public boolean matches(RepoInfo element, String identifier) {
         Repository repository = element.getRepository();
@@ -35,6 +35,6 @@
     }
 
     RepoInfoCache(File cacheDir) {
-        super(cacheDir, CACHE_REPOS_FILENAME);
+        super(cacheDir, CACHE_REPOS_BASENAME);
     }
 }
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
new file mode 100644
index 0000000..44a305a
--- /dev/null
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoListCache.java
@@ -0,0 +1,40 @@
+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;
+
+import java.io.File;
+
+public class RepoListCache extends AbstractCache<RepoList> {
+    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.
+     */
+    RepoListCache() {
+    }
+
+    RepoListCache(File cacheDir) {
+        super(cacheDir, CACHE_REPO_LISTS_BASENAME);
+    }
+}
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoInfo.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoInfo.java
index 242515a..602573f 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoInfo.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoInfo.java
@@ -33,5 +33,4 @@
         this.repository = repoInfo.getRepository();
         this.originalJson = repoInfo.originalJson;
     }
-
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoList.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoList.java
index 39909fc..dd55a03 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoList.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoList.java
@@ -22,4 +22,11 @@
     public String toString() {
         return JsonUtils.toJson(this, true);
     }
+
+    public void updateFrom(RepoList repoList) {
+        this.archives = repoList.archives;
+        this.encryption = repoList.encryption;
+        this.repository = repoList.getRepository();
+        this.originalJson = repoList.originalJson;
+    }
 }
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 6bdc42a..37bd9a7 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
@@ -18,7 +18,7 @@
     private static Logger log = LoggerFactory.getLogger(CacheTest.class);
 
     @Test
-    void reposCacheTest() {
+    void repoCacheTest() {
         ConfigurationHandler configHandler = ConfigurationHandler.getInstance();
         configHandler.read();
         Configuration config = ConfigurationHandler.getConfiguration();
@@ -26,31 +26,43 @@
             log.info("No repos configured. Please configure repos first in: " + configHandler.getConfigFile().getAbsolutePath());
             return;
         }
-        RepoInfoCache cache = ButlerCache.getReposCache();
-        cache.read();
-        if (cache.getElements().size() != config.getRepos().size()) {
-            refreshReposCache(config, cache);
+        ButlerCache butlerCache = ButlerCache.getInstance();
+        //butlerCache.removeAllCacheFiles();
+        butlerCache.read();
+        {
+            RepoInfoCache repoInfoCache = ButlerCache.getRepoInfoCache();
+            if (repoInfoCache.getElements().size() != config.getRepos().size()) {
+                refreshRepoInfoCache(config, repoInfoCache);
+            }
+            assertEquals(config.getRepos().size(), repoInfoCache.getElements().size());
         }
-        refreshRepoListsCache(config);
-        assertEquals(config.getRepos().size(), cache.getElements().size());
+        {
+            RepoListCache repoListCache = ButlerCache.getRepoListCache();
+            if (repoListCache.getElements().size() != config.getRepos().size()) {
+                refreshRepoListCache(config, repoListCache);
+            }
+            assertEquals(config.getRepos().size(), repoListCache.getElements().size());
+        }
+        butlerCache.save();
     }
 
-    private void refreshReposCache(Configuration config, RepoInfoCache cache) {
+    private void refreshRepoInfoCache(Configuration config, RepoInfoCache repoInfoCache) {
         for (BorgRepoConfig repo : config.getRepos()) {
-            log.info("Processing repo '" + repo + "'");
+            log.info("Processing repo info '" + repo + "'");
             RepoInfo repoInfo = BorgCommands.info(repo);
-            cache.upsert(repoInfo);
-            repoInfo = cache.get(repoInfo.getRepository().getId());
+            repoInfoCache.upsert(repoInfo);
+            repoInfo = repoInfoCache.get(repoInfo.getRepository().getId());
             assertNotNull(repoInfo);
         }
-        cache.save();
     }
 
-    private void refreshRepoListsCache(Configuration config) {
+    private void refreshRepoListCache(Configuration config, RepoListCache repoListCache) {
         for (BorgRepoConfig repo : config.getRepos()) {
-            log.info("Processing repo '" + repo + "'");
+            log.info("Processing repo list '" + repo + "'");
             RepoList repoList = BorgCommands.list(repo);
-            log.info("repoList: " + repoList);
+            repoListCache.upsert(repoList);
+            repoList = repoListCache.get(repoList.getRepository().getId());
+            assertNotNull(repoList);
         }
     }
 }

--
Gitblit v1.10.0