From 5db1733cdfdac831cc10ff734c61d68079c47d1f Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 08 Dec 2018 11:46:22 +0000
Subject: [PATCH] Caching started...

---
 /dev/null                                                                       |   31 ------
 borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java |   12 ++
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/RepoInfo.java   |   10 ++
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Repository.java |   28 +++++
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java    |   40 ++++++++
 borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java      |   41 ++++++++
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java  |   86 +++++++++++++++++
 7 files changed, 217 insertions(+), 31 deletions(-)

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
new file mode 100644
index 0000000..ebb0a64
--- /dev/null
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
@@ -0,0 +1,40 @@
+package de.micromata.borgbutler.cache;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+
+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;
+
+    @JsonIgnore
+    private File cacheDir;
+
+    public static ButlerCache getInstance() {
+        return instance;
+    }
+
+    public static RepoInfoCache getReposCache() {
+        return instance.reposCache;
+    }
+
+    public void save() {
+        reposCache.save();
+    }
+
+    private ButlerCache() {
+        String homeDir = System.getProperty("user.home");
+        cacheDir = new File(homeDir, CACHE_DIR_NAME);
+        if (!cacheDir.exists()) {
+            log.info("Creating cache dir: " + cacheDir.getAbsolutePath());
+            cacheDir.mkdir();
+        }
+        reposCache = new RepoInfoCache(cacheDir);
+    }
+}
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
new file mode 100644
index 0000000..d1a1b5d
--- /dev/null
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java
@@ -0,0 +1,86 @@
+package de.micromata.borgbutler.cache;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import de.micromata.borgbutler.json.JsonUtils;
+import de.micromata.borgbutler.json.borg.RepoInfo;
+import de.micromata.borgbutler.json.borg.Repository;
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RepoInfoCache {
+    private static Logger log = LoggerFactory.getLogger(RepoInfoCache.class);
+    public static final String CACHE_REPOS_FILENAME = "cache-repos.json";
+
+    @JsonIgnore
+    private File cacheReposFile;
+    @JsonProperty
+    private List<RepoInfo> repositories = new ArrayList<>();
+
+    public RepoInfo getRepoInfo(String idOrName) {
+        if (idOrName == null) {
+            return null;
+        }
+        for (RepoInfo repoInfo : repositories) {
+            Repository repository = repoInfo.getRepository();
+            if (repository == null) {
+                continue;
+            }
+            if (idOrName.equals(repository.getId()) || idOrName.equals(repository.getName()) || idOrName.equals(repository.getLocation())) {
+                return repoInfo;
+            }
+        }
+        return null;
+    }
+
+    public void upsert(RepoInfo repoInfo) {
+        Repository repository = repoInfo.getRepository();
+        if (repository == null) {
+            log.error("Oups, no repository given in RepoInfo (ignoring it): " + repoInfo);
+            return;
+        }
+        RepoInfo existingRepo = getRepoInfo(repository.getId());
+        if (existingRepo == null) {
+            repositories.add(repoInfo);
+        } else {
+            existingRepo.updateFrom(repoInfo);
+        }
+    }
+
+    public void read() {
+        try {
+            String json = FileUtils.readFileToString(cacheReposFile, Charset.forName("UTF-8"));
+            RepoInfoCache readCache = JsonUtils.fromJson(this.getClass(), json);
+            if (readCache != null) {
+                this.repositories = readCache.repositories;
+            } else {
+                log.error("Error while parsing repos cache: " + cacheReposFile.getAbsolutePath());
+            }
+        } catch (IOException ex) {
+            log.error("Error while trying to read repos cache file '" + cacheReposFile.getAbsolutePath() + "': "
+                    + ex.getMessage(), ex);
+        }
+    }
+
+    public void save() {
+        log.info("Saving repo infos to cache file: " + cacheReposFile);
+        String json = JsonUtils.toJson(this);
+        try {
+            FileUtils.write(cacheReposFile, json, Charset.forName("UTF-8"));
+        } catch (IOException ex) {
+            log.error("Error while trying to write repos cache file '" + cacheReposFile.getAbsolutePath() + "': "
+                    + ex.getMessage(), ex);
+        }
+    }
+
+    RepoInfoCache(File cacheDir) {
+        cacheReposFile = new File(cacheDir, CACHE_REPOS_FILENAME);
+    }
+}
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
index 449f910..69698f4 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
@@ -14,4 +14,16 @@
     public void add(BorgRepoConfig repo) {
         repos.add(repo);
     }
+
+    public BorgRepoConfig getRepo(String idOrName) {
+        if (idOrName == null) {
+            return null;
+        }
+        for (BorgRepoConfig repoConfig : repos) {
+            if (idOrName.equals(repoConfig.getRepo()) ||idOrName.equals(repoConfig.getName())) {
+                return repoConfig;
+            }
+        }
+        return null;
+    }
 }
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 72bcfd0..242515a 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
@@ -24,4 +24,14 @@
     public String toString() {
         return JsonUtils.toJson(this, true);
     }
+
+
+    public void updateFrom(RepoInfo repoInfo) {
+        this.securityDir = repoInfo.securityDir;
+        this.cache = repoInfo.cache;
+        this.encryption = repoInfo.encryption;
+        this.repository = repoInfo.getRepository();
+        this.originalJson = repoInfo.originalJson;
+    }
+
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Repository.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Repository.java
index c0006e4..85a51a9 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Repository.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/Repository.java
@@ -1,9 +1,21 @@
 package de.micromata.borgbutler.json.borg;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import de.micromata.borgbutler.config.BorgRepoConfig;
+import de.micromata.borgbutler.config.ConfigurationHandler;
 import lombok.Getter;
+import lombok.Setter;
 
 public class Repository {
+    /**
+     * A name describing this config. Only used for displaying purposes. This is automatically set with the name
+     * of the repository configuration.
+     *
+     * @see BorgRepoConfig#getName()
+     */
+    @Getter
+    @Setter
+    String name;
     @Getter
     private String id;
     @Getter
@@ -11,4 +23,20 @@
     private String lastModified;
     @Getter
     private String location;
+
+    /**
+     * Sets also the name for this repository if available in the configuration.
+     *
+     * @param location
+     * @return
+     */
+    public Repository setLocation(String location) {
+        this.location = location;
+        // It's ugly but efficiently ;-)
+        BorgRepoConfig repoConfig = ConfigurationHandler.getConfiguration().getRepo(location);
+        if (repoConfig != null) {
+            this.name = repoConfig.getName();
+        }
+        return this;
+    }
 }
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/BorgCommandsTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/BorgCommandsTest.java
deleted file mode 100644
index 656aba5..0000000
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/BorgCommandsTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package de.micromata.borgbutler;
-
-import de.micromata.borgbutler.config.BorgRepoConfig;
-import de.micromata.borgbutler.config.Configuration;
-import de.micromata.borgbutler.config.ConfigurationHandler;
-import de.micromata.borgbutler.json.borg.RepoInfo;
-import de.micromata.borgbutler.json.borg.RepoList;
-import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class BorgCommandsTest {
-    private static Logger log = LoggerFactory.getLogger(BorgCommandsTest.class);
-    @Test
-    void infoTest() {
-        ConfigurationHandler configHandler = ConfigurationHandler.getInstance();
-        configHandler.read();
-        Configuration config = ConfigurationHandler.getConfiguration();
-        if (config.getRepos().size() == 0) {
-            log.info("No repos configured. Please configure repos first in: " + configHandler.getConfigFile().getAbsolutePath());
-            return;
-        }
-        for (BorgRepoConfig repo : config.getRepos()) {
-            log.info("Processing repo '" + repo + "'");
-            RepoInfo repoInfo = BorgCommands.info(repo);
-            log.info("Repo info: " + repoInfo);
-            RepoList repoList = BorgCommands.list(repo);
-            log.info("Repo list: " + repoList);
-        }
-    }
-}
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
new file mode 100644
index 0000000..a5673f6
--- /dev/null
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
@@ -0,0 +1,41 @@
+package de.micromata.borgbutler.cache;
+
+import de.micromata.borgbutler.BorgCommands;
+import de.micromata.borgbutler.config.BorgRepoConfig;
+import de.micromata.borgbutler.config.Configuration;
+import de.micromata.borgbutler.config.ConfigurationHandler;
+import de.micromata.borgbutler.json.borg.RepoInfo;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+
+public class CacheTest {
+    private static Logger log = LoggerFactory.getLogger(CacheTest.class);
+
+    @Test
+    void reposCachetest() {
+        ConfigurationHandler configHandler = ConfigurationHandler.getInstance();
+        configHandler.read();
+        Configuration config = ConfigurationHandler.getConfiguration();
+        if (config.getRepos().size() == 0) {
+            log.info("No repos configured. Please configure repos first in: " + configHandler.getConfigFile().getAbsolutePath());
+            return;
+        }
+        for (BorgRepoConfig repo : config.getRepos()) {
+            log.info("Processing repo '" + repo + "'");
+            RepoInfo repoInfo = BorgCommands.info(repo);
+            log.info("Repo info: " + repoInfo);
+            RepoInfoCache cache = ButlerCache.getReposCache();
+            cache.upsert(repoInfo);
+            repoInfo = cache.getRepoInfo(repoInfo.getRepository().getId());
+            assertNotNull(repoInfo);
+            cache.save();
+            log.info("Repo info: " + repoInfo);
+            //RepoList repoList = BorgCommands.list(repo);
+            //log.info("Repo list: " + repoList);
+        }
+    }
+}

--
Gitblit v1.10.0