From 60b424b101e42fa1aadb9300f32a842c9681a092 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 15 Dec 2018 22:39:43 +0000
Subject: [PATCH] Only one JCS cache for repositories containing also archives.

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java     |   11 +-
 borgbutler-core/src/test/java/de/micromata/borgbutler/cache/ArchiveFilelistCacheTest.java |   14 +-
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java                   |   77 +++++++--------
 borgbutler-webapp/src/components/views/repos/ArchiveView.jsx                              |    6 
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchive.java          |   14 --
 borgbutler-core/src/main/java/de/micromata/borgbutler/data/Archive.java                   |   54 ++++++++++
 borgbutler-webapp/src/components/views/repos/RepoArchiveListView.jsx                      |    2 
 borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java                |   20 ++-
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java              |   76 ++++++---------
 borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java                |   19 +--
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java        |    3 
 11 files changed, 156 insertions(+), 140 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 8a89c49..75bff07 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -15,7 +15,6 @@
 import org.apache.commons.exec.PumpStreamHandler;
 import org.apache.commons.exec.environment.EnvironmentUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
-import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,71 +58,65 @@
 
     /**
      * Executes borg list repository.
-     * The given repository will be cloned and archives will be added.
-     * The field {@link Repository#getLastModified()} of masterRepository will be updated.
+     * The given repository will be used and archives will be added.
      *
-     * @param repoConfig       The repo config associated to the masterRepository. Needed for the borg call.
-     * @param masterRepository Repository without archives.
-     * @return Parsed repo config returned by Borg command including archives.
+     * @param repoConfig The repo config associated to the masterRepository. Needed for the borg call.
+     * @param repository Repository without archives, archives will be loaded.
      */
-    public static Repository list(BorgRepoConfig repoConfig, Repository masterRepository) {
-        String json = execute(repoConfig, "list", masterRepository.getName(), "--json");
+    public static void list(BorgRepoConfig repoConfig, Repository repository) {
+        String json = execute(repoConfig, "list", repository.getName(), "--json");
         if (json == null) {
-            log.error("Can't load archives from repo '" + masterRepository.getName() + "'.");
-            return null;
+            log.error("Can't load archives from repo '" + repository.getName() + "'.");
+            return;
         }
         BorgRepoList repoList = JsonUtils.fromJson(BorgRepoList.class, json);
-        if (repoList == null) {
-            log.error("Can't load archives from repo '" + masterRepository.getName() + "'.");
-            return null;
+        if (repoList == null || CollectionUtils.isEmpty(repoList.getArchives())) {
+            log.error("Can't load archives from repo '" + repository.getName() + "'.");
+            return;
         }
-        masterRepository.setLastModified(DateUtils.format(repoList.getRepository().getLastModified()))
+        repository.setLastModified(DateUtils.format(repoList.getRepository().getLastModified()))
                 .setLastCacheRefresh(DateUtils.format(LocalDateTime.now()));
-        Repository repository = ObjectUtils.clone(masterRepository)
-                .addAll(repoList.getArchives());
-        if (repository.getArchives() != null) {
-            for (BorgArchive archive : repository.getArchives()) {
-                // Reformat Borg date strings.
-                archive.setStart(DateUtils.format(archive.getStart()));
-                archive.setTime(DateUtils.format(archive.getTime()));
-            }
+        for (BorgArchive borgArchive : repoList.getArchives()) {
+            Archive archive = new Archive()
+                    .setName(borgArchive.getArchive())
+                    .setId(borgArchive.getId())
+                    .setStart(DateUtils.format(borgArchive.getStart()))
+                    .setTime(DateUtils.format(borgArchive.getTime()))
+                    .setRepoId(repository.getId())
+                    .setRepoName(repository.getName());
+            repository.add(archive);
         }
-        return repository;
     }
 
     /**
      * Executes borg info repository::archive.
-     * The given repository will be cloned and assigned to the returned archive.
+     * The given repository will be modified.
      * The field {@link Repository#getLastModified()} of masterRepository will be updated.
      *
-     * @param repoConfig       The repo config associated to the masterRepository. Needed for the borg call.
-     * @param archiveName      The name of the archive returned by {@link BorgArchive#getArchive()}
-     * @param masterRepository Repository without archives.
-     * @return Parsed repo config returned by Borg command including archives.
+     * @param repoConfig The repo config associated to the repository. Needed for the borg call.
+     * @param archive    The archive to update.
+     * @param repository Repository without archives.
      */
-    public static Archive info(BorgRepoConfig repoConfig, String archiveName, Repository masterRepository) {
-        String archiveFullname = repoConfig.getRepo() + "::" + archiveName;
+    public static void info(BorgRepoConfig repoConfig, Archive archive, Repository repository) {
+        String archiveFullname = repoConfig.getRepo() + "::" + archive.getName();
         String json = execute(repoConfig, "info", archiveFullname, "--json");
         if (json == null) {
-            return null;
+            return;
         }
         BorgArchiveInfo archiveInfo = JsonUtils.fromJson(BorgArchiveInfo.class, json);
         if (archiveInfo == null) {
             log.error("Archive '" + archiveFullname + "' not found.");
-            return null;
+            return;
         }
-        masterRepository.setLastModified(DateUtils.format(archiveInfo.getRepository().getLastModified()))
+        repository.setLastModified(DateUtils.format(archiveInfo.getRepository().getLastModified()))
                 .setLastCacheRefresh(DateUtils.format(LocalDateTime.now()));
-        Repository repository = ObjectUtils.clone(masterRepository);
-        Archive archive = new Archive()
-                .setCache(archiveInfo.getCache())
-                .setEncryption(archiveInfo.getEncryption())
-                .setRepository(repository);
+        archive.setCache(archiveInfo.getCache())
+                .setEncryption(archiveInfo.getEncryption());
         if (CollectionUtils.isEmpty(archiveInfo.getArchives())) {
             log.error("The returned borg archive contains no archive infos: " + json);
-            return null;
+            return;
         }
-        if (archiveInfo.getArchives().size() > 1   ) {
+        if (archiveInfo.getArchives().size() > 1) {
             log.warn("Archive '" + archiveFullname + "' contains more than one archives!? (Using only first.)");
         }
         BorgArchive2 borgArchive2 = archiveInfo.getArchives().get(0);
@@ -131,8 +124,8 @@
                 .setChunkerParams(borgArchive2.getChunkerParams())
                 .setCommandLine(borgArchive2.getCommandLine())
                 .setComment(borgArchive2.getComment())
-                .setStats(borgArchive2.getStats());
-        return archive;
+                .setStats(borgArchive2.getStats())
+                .setUsername(borgArchive2.getUsername());
     }
 
     public static List<BorgFilesystemItem> listArchiveContent(BorgRepoConfig repoConfig, String archiveId) {
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
index 4b9ef45..3b55521 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
@@ -1,6 +1,7 @@
 package de.micromata.borgbutler.cache;
 
 import de.micromata.borgbutler.config.BorgRepoConfig;
+import de.micromata.borgbutler.data.Archive;
 import de.micromata.borgbutler.json.borg.BorgArchive;
 import de.micromata.borgbutler.json.borg.BorgFilesystemItem;
 import de.micromata.borgbutler.utils.ReplaceUtils;
@@ -29,10 +30,10 @@
     private long FILES_EXPIRE_TIME = 7 * 24 * 3660 * 1000; // Expires after 7 days.
 
     @Getter
-    private BorgArchive archive;
+    private Archive archive;
     private List<BorgFilesystemItem> content;
 
-    public void save(BorgRepoConfig repoConfig, BorgArchive archive, List<BorgFilesystemItem> filesystemItems) {
+    public void save(BorgRepoConfig repoConfig, Archive archive, List<BorgFilesystemItem> filesystemItems) {
         File file = getFile(repoConfig, archive);
         if (CollectionUtils.isEmpty(filesystemItems)) {
             return;
@@ -57,7 +58,7 @@
      * @param archive
      * @return
      */
-    public BorgFilesystemItem[] load(BorgRepoConfig repoConfig, BorgArchive archive) {
+    public BorgFilesystemItem[] load(BorgRepoConfig repoConfig, Archive archive) {
         File file = getFile(repoConfig, archive);
         if (!file.exists()) {
             return null;
@@ -181,9 +182,9 @@
         }
     }
 
-    File getFile(BorgRepoConfig repoConfig, BorgArchive archive) {
+    File getFile(BorgRepoConfig repoConfig, Archive archive) {
         return new File(cacheDir, ReplaceUtils.encodeFilename(CACHE_ARCHIVE_LISTS_BASENAME + archive.getTime()
-                + "-" + repoConfig.getRepo() + "-" + archive.getArchive() + ".gz", true));
+                + "-" + repoConfig.getRepo() + "-" + archive.getName() + ".gz", true));
     }
 
     ArchiveFilelistCache(File cacheDir, int cacheArchiveContentMaxDiscSizeMB) {
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 bf96c44..88e838d 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
@@ -6,7 +6,6 @@
 import de.micromata.borgbutler.config.ConfigurationHandler;
 import de.micromata.borgbutler.data.Archive;
 import de.micromata.borgbutler.data.Repository;
-import de.micromata.borgbutler.json.borg.BorgArchive;
 import de.micromata.borgbutler.json.borg.BorgFilesystemItem;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.jcs.JCS;
@@ -26,8 +25,6 @@
 
     private JCSCache jcsCache;
     private CacheAccess<String, Repository> repoCacheAccess;
-    private CacheAccess<String, Repository> repoArchivesCacheAccess;
-    private CacheAccess<String, Archive> archivesCacheAccess;
     private ArchiveFilelistCache archiveFilelistCache;
 
     public static ButlerCache getInstance() {
@@ -36,7 +33,7 @@
 
     /**
      * @param idOrName
-     * @return Repository without list of archives.
+     * @return Repository.
      */
     public Repository getRepository(String idOrName) {
         BorgRepoConfig repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(idOrName);
@@ -57,7 +54,7 @@
 
     /**
      * @param repoConfig
-     * @return Repository without list of archives.
+     * @return Repository.
      */
     private Repository getRepository(BorgRepoConfig repoConfig) {
         Repository repository = repoCacheAccess.get(repoConfig.getRepo());
@@ -74,7 +71,7 @@
     }
 
     /**
-     * @return the list of all repositories without the list of archives.
+     * @return the list of all repositories.
      */
     public List<Repository> getAllRepositories() {
         List<Repository> repositories = new ArrayList<>();
@@ -90,11 +87,8 @@
 
     public void clearAllCaches() {
         clearRepoCacheAccess();
-        clearRepoArchicesCacheAccess();
         log.info("Clearing cache with file lists of archives...");
         this.archiveFilelistCache.removeAllCacheFiles();
-        log.info("Clearing archives cache...");
-        this.archivesCacheAccess.clear();
     }
 
     public void clearRepoCacheAccess() {
@@ -102,28 +96,20 @@
         this.repoCacheAccess.clear();
     }
 
-    public void clearRepoArchicesCacheAccess() {
-        log.info("Clearing repositories cache (with included archives)...");
-        this.repoArchivesCacheAccess.clear();
-    }
-
     /**
      * @param idOrName
-     * @return The repository including all archives.
+     * @return The repository (ensures that the list of archives is loaded).
      */
     public Repository getRepositoryArchives(String idOrName) {
-        Repository masterRepository = getRepository(idOrName);
-        if (masterRepository == null) {
+        Repository repository = getRepository(idOrName);
+        if (repository == null) {
             return null;
         }
-        Repository repository = repoArchivesCacheAccess.get(masterRepository.getName());
-        if (repository != null) {
+        if (repository.isArchivesLoaded()) {
             return repository;
         }
-        BorgRepoConfig repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(masterRepository.getName());
-        repository = BorgCommands.list(repoConfig, masterRepository);
-        if (repository == null) return null;
-        repoArchivesCacheAccess.put(repository.getName(), repository);
+        BorgRepoConfig repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(repository.getName());
+        BorgCommands.list(repoConfig, repository);
         return repository;
     }
 
@@ -147,50 +133,50 @@
     }
 
     public Archive getArchive(BorgRepoConfig repoConfig, String archiveIdOrName, boolean forceReload) {
-        Repository masterRepository = getRepositoryArchives(repoConfig.getRepo());
-        if (masterRepository == null) {
+        Repository repository = getRepositoryArchives(repoConfig.getRepo());
+        if (repository == null) {
             log.error("Repository '" + repoConfig.getRepo() + "' not found.");
             return null;
         }
-        String archiveName = archiveIdOrName;
-        if (CollectionUtils.isEmpty(masterRepository.getArchives())) {
+        Archive archive = null;
+        if (CollectionUtils.isEmpty(repository.getArchives())) {
             log.warn("Repository '" + repoConfig.getRepo() + "' doesn't contain archives.");
         } else {
-            for (BorgArchive borgArchive : masterRepository.getArchives()) {
-                if (StringUtils.equals(borgArchive.getArchive(), archiveIdOrName)
-                        || StringUtils.equals(borgArchive.getId(), archiveIdOrName)) {
-                    archiveName = borgArchive.getArchive();
+            for (Archive arch : repository.getArchives()) {
+                if (StringUtils.equals(arch.getName(), archiveIdOrName)
+                        || StringUtils.equals(arch.getId(), archiveIdOrName)) {
+                    archive = arch;
                     break;
                 }
             }
         }
-        String archiveFullname = repoConfig.getRepo() + "::" + archiveName;
-        if (!forceReload) {
-            Archive archive = this.archivesCacheAccess.get(archiveFullname);
-            if (archive != null) {
-                return archive;
-            }
+        if (archive == null) {
+            log.error("Archive with id or name '" + archiveIdOrName + "' not found for repo '" + repoConfig.getRepo()
+                    + "'.");
+            return null;
         }
-        Archive archive = BorgCommands.info(repoConfig, archiveName, masterRepository);
-        if (archive != null)
-            this.archivesCacheAccess.put(archiveFullname, archive);
+        if (!forceReload && archive.hasInfoData()) {
+            // borg info archive was already called.
+            return archive;
+        }
+        BorgCommands.info(repoConfig, archive, repository);
         return archive;
     }
 
-    public BorgFilesystemItem[] getArchiveContent(BorgRepoConfig repoConfig, BorgArchive archive) {
-        if (archive == null || StringUtils.isBlank(archive.getArchive())) {
+    public BorgFilesystemItem[] getArchiveContent(BorgRepoConfig repoConfig, Archive archive) {
+        if (archive == null || StringUtils.isBlank(archive.getName())) {
             return null;
         }
         BorgFilesystemItem[] items = archiveFilelistCache.load(repoConfig, archive);
         if (items == null) {
-            List<BorgFilesystemItem> list = BorgCommands.listArchiveContent(repoConfig, archive.getArchive());
+            List<BorgFilesystemItem> list = BorgCommands.listArchiveContent(repoConfig, archive.getName());
             if (CollectionUtils.isNotEmpty(list)) {
                 archiveFilelistCache.save(repoConfig, archive, list);
                 items = list.toArray(new BorgFilesystemItem[0]);
             }
         }
         if (items == null) {
-            log.warn("Repo::archiv with name '" + repoConfig.getRepo() + "::" + archive.getArchive() + "' not found.");
+            log.warn("Repo::archiv with name '" + archive.getBorgIdentifier() + "' not found.");
         }
         return items;
     }
@@ -211,8 +197,6 @@
         Configuration configuration = ConfigurationHandler.getConfiguration();
         this.jcsCache = JCSCache.getInstance();
         this.repoCacheAccess = jcsCache.getJCSCache("repositories");
-        this.repoArchivesCacheAccess = jcsCache.getJCSCache("repositoriesArchives");
-        this.archivesCacheAccess = jcsCache.getJCSCache("archives");
         this.archiveFilelistCache = new ArchiveFilelistCache(getCacheDir(), configuration.getCacheArchiveContentMaxDiscSizeMB());
     }
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Archive.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Archive.java
index 14c6f7b..0d2547a 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Archive.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Archive.java
@@ -5,16 +5,32 @@
 import de.micromata.borgbutler.json.borg.BorgEncryption;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
 
 /**
  *
  */
-public class Archive implements Serializable {
+public class Archive implements Serializable, Comparable<Archive> {
+    /**
+     * For convenience purposes for the client.
+     */
     @Getter
     @Setter
-    private Repository repository;
+    private String repoName;
+    /**
+     * For convenience purposes for the client.
+     */
+    @Getter
+    @Setter
+    private String repoId;
+    @Getter
+    @Setter
+    private String name;
+    @Getter
+    @Setter
+    private String id;
     @Getter
     @Setter
     private BorgCache cache;
@@ -39,6 +55,40 @@
     private String start;
     @Getter
     @Setter
+    private String time;
+    @Getter
+    @Setter
     private BorgArchiveStats stats;
+    @Getter
+    @Setter
+    private String username;
 
+    /**
+     *
+     * @return repoName::archiveName
+     */
+    public String getBorgIdentifier() {
+        return repoName + "::" + name;
+    }
+
+    /**
+     * Is <tt>borg info repo::archive</tt> already called for this archive?
+     *
+     * @return true, if borg info was called, otherwise false.
+     */
+    public boolean hasInfoData() {
+        return commandLine != null && commandLine.length > 0;
+    }
+
+    /**
+     * In reverse order, compares times.
+     *
+     * @param o
+     * @return
+     */
+    @Override
+    public int compareTo(Archive o) {
+        // Reverse order:
+        return StringUtils.compare(o.time, this.time);
+    }
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
index 5c20f88..0b275e5 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
@@ -1,21 +1,20 @@
 package de.micromata.borgbutler.data;
 
 import de.micromata.borgbutler.config.BorgRepoConfig;
-import de.micromata.borgbutler.json.borg.BorgArchive;
 import de.micromata.borgbutler.json.borg.BorgCache;
 import de.micromata.borgbutler.json.borg.BorgEncryption;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.collections4.CollectionUtils;
 
 import java.io.Serializable;
-import java.util.Collection;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
 /**
  * Part of Borg json objects to refer objects to repositories.
  */
-public class Repository implements Serializable, Cloneable {
+public class Repository implements Serializable {
     private static final long serialVersionUID = 1278802519434516280L;
     /**
      * The repo configured for borg.
@@ -68,18 +67,21 @@
      */
     @Getter
     @Setter
-    private SortedSet<BorgArchive> archives;
+    private SortedSet<Archive> archives;
 
-    public Repository addAll(Collection<BorgArchive> archives) {
+    public Repository add(Archive archive) {
         if (this.archives == null) {
             this.archives = new TreeSet<>();
         }
-        this.archives.addAll(archives);
+        this.archives.add(archive);
         return this;
     }
 
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-        return super.clone();
+    /**
+     * Is <tt>borg list repo</tt> already called?
+     * @return
+     */
+    public boolean isArchivesLoaded() {
+        return CollectionUtils.isNotEmpty(archives);
     }
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchive.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchive.java
index 92888ed..3af01f3 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchive.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgArchive.java
@@ -3,14 +3,13 @@
 import de.micromata.borgbutler.json.JsonUtils;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
 
 /**
  * This object is given by <tt>borg list repo</tt>.
  */
-public class BorgArchive implements Serializable, Comparable<BorgArchive> {
+public class BorgArchive implements Serializable {
     private static final long serialVersionUID = -7872260170265536732L;
     @Getter
     private String archive;
@@ -27,17 +26,6 @@
     @Setter
     private String time;
 
-    /**
-     * In reverse order, compares times.
-     * @param o
-     * @return
-     */
-    @Override
-    public int compareTo(BorgArchive o) {
-        // Reverse order:
-        return StringUtils.compare(o.time, this.time);
-    }
-
     public String toString() {
         return JsonUtils.toJson(this, true);
     }
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/ArchiveFilelistCacheTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/ArchiveFilelistCacheTest.java
index 642a3ff..4f6dbb4 100644
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/ArchiveFilelistCacheTest.java
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/ArchiveFilelistCacheTest.java
@@ -1,7 +1,7 @@
 package de.micromata.borgbutler.cache;
 
 import de.micromata.borgbutler.config.BorgRepoConfig;
-import de.micromata.borgbutler.json.borg.BorgArchive;
+import de.micromata.borgbutler.data.Archive;
 import de.micromata.borgbutler.json.borg.BorgFilesystemItem;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
@@ -29,7 +29,7 @@
         cache.removeAllCacheFiles();
         BorgRepoConfig repoConfig = new BorgRepoConfig();
         repoConfig.setRepo("repo");
-        BorgArchive archive = createArchive("2018-12-10");
+        Archive archive = createArchive("2018-12-10");
         log.info("Saving " + list.size() + " items to out dir.");
         cache.save(repoConfig, archive, list);
         log.info("Saving done.");
@@ -50,7 +50,7 @@
         cache.removeAllCacheFiles();
         BorgRepoConfig repoConfig = new BorgRepoConfig();
         repoConfig.setRepo("repo");
-        BorgArchive archive = createArchive("2018-12-09");
+        Archive archive = createArchive("2018-12-09");
         assertNull(cache.load(repoConfig, archive));
         cache.save(repoConfig, archive, list);
         BorgFilesystemItem[] filesystemItems = cache.load(repoConfig, archive);
@@ -68,7 +68,7 @@
 
         long millis = System.currentTimeMillis();
 
-        BorgArchive archive = createArchive("2018-11-20");
+        Archive archive = createArchive("2018-11-20");
         cache.save(repoConfig, archive, list);
         File oldestFile = cache.getFile(repoConfig, archive);
         setLastModificationTime(oldestFile, millis - 10 * 3600000); // Fake lastModifiedTime - 10 h
@@ -104,7 +104,7 @@
 
         long millis = System.currentTimeMillis();
 
-        BorgArchive archive = createArchive("2018-10-20");
+        Archive archive = createArchive("2018-10-20");
         cache.save(repoConfig, archive, list);
         File notExpiredFile = cache.getFile(repoConfig, archive);
         setLastModificationTime(notExpiredFile, millis - 6 * 24 * 3600000); // Fake lastModifiedTime - 10 h
@@ -146,8 +146,8 @@
         return this;
     }
 
-    private BorgArchive createArchive(String time) throws Exception {
-        BorgArchive archive = new BorgArchive();
+    private Archive createArchive(String time) throws Exception {
+        Archive archive = new Archive();
         set(archive, "archive", "archive-" + time);
         set(archive, "time", time);
         return archive;
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 1a600e8..3c3f79e 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,7 +5,6 @@
 import de.micromata.borgbutler.config.ConfigurationHandler;
 import de.micromata.borgbutler.data.Archive;
 import de.micromata.borgbutler.data.Repository;
-import de.micromata.borgbutler.json.borg.BorgArchive;
 import de.micromata.borgbutler.json.borg.BorgFilesystemItem;
 import org.apache.commons.collections4.CollectionUtils;
 import org.junit.jupiter.api.Test;
@@ -43,24 +42,24 @@
             assertEquals(config.getRepoConfigs().size(), ButlerCache.getInstance().getAllRepositories().size());
         }
         List<BorgRepoConfig> repoConfigs = ConfigurationHandler.getConfiguration().getRepoConfigs();
-        BorgArchive borgArchive = null;
+        Archive archive = null;
         BorgRepoConfig repoConfig = null;
         if (CollectionUtils.isNotEmpty(repoConfigs)) {
             repoConfig = repoConfigs.get(0);
             Repository rerepositoryoList = ButlerCache.getInstance().getRepositoryArchives(repoConfig.getRepo());
             if (rerepositoryoList != null && CollectionUtils.isNotEmpty(rerepositoryoList.getArchives())) {
-                borgArchive = rerepositoryoList.getArchives().first();
+                archive = rerepositoryoList.getArchives().first();
             }
         }
         {
-            if (borgArchive != null) {
-                Archive archive = ButlerCache.getInstance().getArchive(repoConfig.getRepo(), borgArchive.getName());
-                assertNotNull(archive);
-                archive = ButlerCache.getInstance().getArchive(repoConfig.getRepo(), borgArchive.getId());
-                assertNotNull(archive);
-                BorgFilesystemItem[] content = ButlerCache.getInstance().getArchiveContent(repoConfig, borgArchive);
+            if (archive != null) {
+                Archive archive2 = ButlerCache.getInstance().getArchive(repoConfig.getRepo(), archive.getName());
+                assertNotNull(archive2);
+                archive = ButlerCache.getInstance().getArchive(repoConfig.getRepo(), archive.getId());
+                assertNotNull(archive2);
+                BorgFilesystemItem[] content = ButlerCache.getInstance().getArchiveContent(repoConfig, archive2);
                 log.info("Number of items (content) of archive: " + content.length);
-                content = ButlerCache.getInstance().getArchiveContent(repoConfig, borgArchive);
+                content = ButlerCache.getInstance().getArchiveContent(repoConfig, archive2);
                 log.info("Number of items (content) of archive: " + content.length);
             }
         }
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java
index fa2bca9..e337b50 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ReposRest.java
@@ -49,7 +49,7 @@
     public String getRepoArchiveList(@QueryParam("id") String id, @QueryParam("force") boolean force,
                                      @QueryParam("prettyPrinter") boolean prettyPrinter) {
         if (force) {
-            ButlerCache.getInstance().clearRepoArchicesCacheAccess();
+            ButlerCache.getInstance().clearRepoCacheAccess();
         }
         Repository repository = ButlerCache.getInstance().getRepositoryArchives(id);
         return JsonUtils.toJson(repository, prettyPrinter);
@@ -86,7 +86,6 @@
     public String getList(@QueryParam("force") boolean force, @QueryParam("prettyPrinter") boolean prettyPrinter) {
         if (force) {
             ButlerCache.getInstance().clearRepoCacheAccess();
-            ButlerCache.getInstance().clearRepoArchicesCacheAccess();
         }
         List<Repository> repositories = ButlerCache.getInstance().getAllRepositories();
         if (CollectionUtils.isEmpty(repositories)) {
diff --git a/borgbutler-webapp/src/components/views/repos/ArchiveView.jsx b/borgbutler-webapp/src/components/views/repos/ArchiveView.jsx
index 3ed8c4a..1beea1a 100644
--- a/borgbutler-webapp/src/components/views/repos/ArchiveView.jsx
+++ b/borgbutler-webapp/src/components/views/repos/ArchiveView.jsx
@@ -38,7 +38,7 @@
             .then(json => {
                 this.setState({
                     isFetching: false,
-                    repo: json
+                    archive: json
                 })
             })
             .catch(() => this.setState({isFetching: false, failed: true}));
@@ -46,7 +46,7 @@
 
     render = () => {
         let content = undefined;
-        const repo = this.state.repo;
+        const archive = this.state.archive;
         let pageHeader = '';
 
         if (this.state.isFetching) {
@@ -62,7 +62,7 @@
             />;
         } else if (this.state.repo) {
             pageHeader = <React.Fragment>
-                {repo.displayName}
+                {archive.id}
                 <div
                     className={'btn btn-outline-primary refresh-button-right'}
                     onClick={this.fetchArchive.bind(this, true)}
diff --git a/borgbutler-webapp/src/components/views/repos/RepoArchiveListView.jsx b/borgbutler-webapp/src/components/views/repos/RepoArchiveListView.jsx
index 22eb67f..71b6f56 100644
--- a/borgbutler-webapp/src/components/views/repos/RepoArchiveListView.jsx
+++ b/borgbutler-webapp/src/components/views/repos/RepoArchiveListView.jsx
@@ -112,7 +112,7 @@
                                 // Return the element. Also pass key
                                 return (
                                     <tr key={archive.id}>
-                                        <td><Link to={`/archives/${repo.id}/${archive.id}`}>{archive.archive}</Link></td>
+                                        <td><Link to={`/archives/${repo.id}/${archive.id}`}>{archive.name}</Link></td>
                                         <td>{archive.time}</td>
                                         <td>{archive.id}</td>
                                     </tr>);

--
Gitblit v1.10.0