| borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java | ●●●●● patch | view | raw | blame | history | |
| borgbutler-core/src/main/java/de/micromata/borgbutler/cache/RepoInfoCache.java | ●●●●● patch | view | raw | blame | history | |
| borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java | ●●●●● patch | view | raw | blame | history |
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/AbstractCache.java
New file @@ -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); } } 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(); public boolean matches(RepoInfo element, String identifier) { Repository repository = element.getRepository(); if (repository == null) { continue; return false; } if (idOrName.equals(repository.getId()) || idOrName.equals(repository.getName()) || idOrName.equals(repository.getLocation())) { return repoInfo; } } return null; return identifier.equals(repository.getId()) || identifier.equals(repository.getName()) || identifier.equals(repository.getLocation()); } 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 String getIdentifier(RepoInfo element) { return element.getRepository().getId(); } 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); } 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); } } 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); } } }