From 8e2de30e69ca74d7689b60144c87035b41c63223 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 08 Dec 2018 12:19:14 +0000
Subject: [PATCH] AbstractCache...
---
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java | 88 ++++++++++++++++++++++
borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java | 26 +++++-
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java | 76 ++----------------
3 files changed, 119 insertions(+), 71 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
new file mode 100644
index 0000000..63e572f
--- /dev/null
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java
@@ -0,0 +1,88 @@
+package de.micromata.borgbutler.cache;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import de.micromata.borgbutler.json.JsonUtils;
+import lombok.Getter;
+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 abstract class AbstractCache<T> {
+ private static Logger log = LoggerFactory.getLogger(AbstractCache.class);
+
+ @JsonIgnore
+ protected File cacheFile;
+ @Getter
+ @JsonProperty
+ private List<T> elements = new ArrayList<>();
+
+ public T get(String identifier) {
+ if (identifier == null) {
+ return null;
+ }
+ for (T element : elements) {
+ if (matches(element, identifier)) {
+ return element;
+ }
+ }
+ return null;
+ }
+
+ public abstract boolean matches(T element, String identifier);
+
+ public abstract String getIdentifier(T element);
+
+ public abstract void updateFrom(T dest, T source);
+
+ public void upsert(T element) {
+ T existingElement = get(getIdentifier(element));
+ if (existingElement == null) {
+ elements.add(element);
+ } else {
+ updateFrom(existingElement, element);
+ }
+ }
+
+ public void read() {
+ try {
+ String json = FileUtils.readFileToString(cacheFile, Charset.forName("UTF-8"));
+ AbstractCache readCache = JsonUtils.fromJson(this.getClass(), json);
+ if (readCache != null) {
+ this.elements = readCache.elements;
+ } else {
+ log.error("Error while parsing cache: " + cacheFile.getAbsolutePath());
+ }
+ } catch (IOException ex) {
+ log.error("Error while trying to read cache file '" + cacheFile.getAbsolutePath() + "': "
+ + ex.getMessage(), ex);
+ }
+ }
+
+ public void save() {
+ log.info("Saving to cache file: " + cacheFile);
+ String json = JsonUtils.toJson(this);
+ try {
+ FileUtils.write(cacheFile, json, Charset.forName("UTF-8"));
+ } catch (IOException ex) {
+ log.error("Error while trying to write repos cache file '" + cacheFile.getAbsolutePath() + "': "
+ + ex.getMessage(), ex);
+ }
+ }
+
+ /**
+ * Needed by jackson for deserialization.
+ */
+ AbstractCache() {
+ }
+
+ AbstractCache(File cacheDir, String cacheFilename) {
+ cacheFile = new File(cacheDir, cacheFilename);
+ }
+}
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 445d229..d91bc08 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,85 +1,31 @@
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 lombok.Getter;
-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 {
+public class RepoInfoCache extends AbstractCache<RepoInfo> {
private static Logger log = LoggerFactory.getLogger(RepoInfoCache.class);
public static final String CACHE_REPOS_FILENAME = "cache-repos.json";
- @JsonIgnore
- private File cacheReposFile;
- @Getter
- @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();
+ public boolean matches(RepoInfo element, String identifier) {
+ Repository repository = element.getRepository();
if (repository == null) {
- log.error("Oups, no repository given in RepoInfo (ignoring it): " + repoInfo);
- return;
+ return false;
}
- RepoInfo existingRepo = getRepoInfo(repository.getId());
- if (existingRepo == null) {
- repositories.add(repoInfo);
- } else {
- existingRepo.updateFrom(repoInfo);
- }
+ return identifier.equals(repository.getId()) || identifier.equals(repository.getName())
+ || identifier.equals(repository.getLocation());
}
- 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 String getIdentifier(RepoInfo element) {
+ return element.getRepository().getId();
}
- 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);
- }
+ public void updateFrom(RepoInfo dest, RepoInfo source) {
+ dest.updateFrom(source);
}
/**
@@ -89,6 +35,6 @@
}
RepoInfoCache(File cacheDir) {
- cacheReposFile = new File(cacheDir, CACHE_REPOS_FILENAME);
+ super(cacheDir, CACHE_REPOS_FILENAME);
}
}
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 8cb9370..6bdc42a 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
@@ -5,6 +5,7 @@
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;
@@ -17,7 +18,7 @@
private static Logger log = LoggerFactory.getLogger(CacheTest.class);
@Test
- void reposCachetest() {
+ void reposCacheTest() {
ConfigurationHandler configHandler = ConfigurationHandler.getInstance();
configHandler.read();
Configuration config = ConfigurationHandler.getConfiguration();
@@ -26,17 +27,30 @@
return;
}
RepoInfoCache cache = ButlerCache.getReposCache();
+ cache.read();
+ if (cache.getElements().size() != config.getRepos().size()) {
+ refreshReposCache(config, cache);
+ }
+ refreshRepoListsCache(config);
+ assertEquals(config.getRepos().size(), cache.getElements().size());
+ }
+
+ private void refreshReposCache(Configuration config, RepoInfoCache cache) {
for (BorgRepoConfig repo : config.getRepos()) {
log.info("Processing repo '" + repo + "'");
RepoInfo repoInfo = BorgCommands.info(repo);
cache.upsert(repoInfo);
- repoInfo = cache.getRepoInfo(repoInfo.getRepository().getId());
+ repoInfo = cache.get(repoInfo.getRepository().getId());
assertNotNull(repoInfo);
- //RepoList repoList = BorgCommands.list(repo);
- //log.info("Repo list: " + repoList);
}
cache.save();
- cache.read();
- assertEquals(config.getRepos().size(), cache.getRepositories().size());
+ }
+
+ private void refreshRepoListsCache(Configuration config) {
+ for (BorgRepoConfig repo : config.getRepos()) {
+ log.info("Processing repo '" + repo + "'");
+ RepoList repoList = BorgCommands.list(repo);
+ log.info("repoList: " + repoList);
+ }
}
}
--
Gitblit v1.10.0