From 8f1019f522f630e98a254f13c4da96aed844bda1 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Tue, 18 Dec 2018 02:59:11 +0000
Subject: [PATCH] ...

---
 borgbutler-webapp/src/components/views/archives/FileListEntry.jsx                       |    4 
 borgbutler-webapp/src/components/views/archives/FileListPanel.jsx                       |    2 
 borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgFilesystemItem.java |    6 ++
 borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java        |   42 +++++++++++--
 borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java    |   68 ++++++++++++++++++++++
 5 files changed, 112 insertions(+), 10 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
index 6ed144b..8f0e580 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
@@ -19,7 +19,6 @@
     @Getter
     private Mode mode;
     @Getter
-    @Setter
     private String currentDirectory;
     // For storing sub directories of the currentDirectory
     private Map<String, BorgFilesystemItem> subDirectories;
@@ -48,6 +47,7 @@
      * @return true if the given item matches this filter.
      */
     public boolean matches(BorgFilesystemItem item) {
+        item.setDisplayPath(item.getPath());
         if (fileNumber != null) {
             if (item.getFileNumber() == fileNumber) {
                 finished = true; // Force finishing.
@@ -105,9 +105,14 @@
             list = new ArrayList<>();
             for (BorgFilesystemItem item : list2) {
                 String topLevel = getTopLevel(item.getPath());
+                if (topLevel == null) {
+                    continue;
+                }
                 if (set.contains(topLevel) == false) {
                     set.add(topLevel);
-                    list.add(subDirectories.get(topLevel));
+                    BorgFilesystemItem topItem = subDirectories.get(topLevel);
+                    topItem.setDisplayPath(StringUtils.removeStart(topItem.getPath(), currentDirectory));
+                    list.add(topItem);
                 }
             }
         }
@@ -119,7 +124,7 @@
      * @return null if the item is not a child of the current directory otherwise the top level sub directory name of
      * the current directory.
      */
-    private String getTopLevel(String path) {
+    String getTopLevel(String path) {
         if (StringUtils.isEmpty(currentDirectory)) {
             int pos = path.indexOf('/');
             if (pos < 0) {
@@ -135,7 +140,12 @@
             // Don't show the current directory itself.
             return null;
         }
-        return path.substring(currentDirectory.length());
+        path = StringUtils.removeStart(path, currentDirectory);
+        int pos = path.indexOf('/');
+        if (pos < 0) {
+            return path;
+        }
+        return path.substring(0, pos);
     }
 
     /**
@@ -179,10 +189,19 @@
      */
     public FileSystemFilter setMode(String mode) {
         if (mode != null && mode.toLowerCase().equals("tree")) {
-            this.mode = Mode.TREE;
+            return setMode(Mode.TREE);
+        }
+        return setMode(Mode.FLAT);
+    }
+
+    /**
+     * @param mode
+     * @return this for chaining.
+     */
+    public FileSystemFilter setMode(Mode mode) {
+        this.mode = mode;
+        if (mode == Mode.TREE) {
             this.subDirectories = new HashMap<>(); // needed only for tree view.
-        } else {
-            this.mode = Mode.FLAT;
         }
         return this;
     }
@@ -195,4 +214,13 @@
             this.finished = true;
         }
     }
+
+    public FileSystemFilter setCurrentDirectory(String currentDirectory) {
+        if (currentDirectory != null && currentDirectory.length() > 0) {
+            this.currentDirectory = currentDirectory + "/";
+        } else {
+            this.currentDirectory = currentDirectory;
+        }
+        return this;
+    }
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgFilesystemItem.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgFilesystemItem.java
index fb6c737..f2c48a6 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgFilesystemItem.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/json/borg/BorgFilesystemItem.java
@@ -1,5 +1,6 @@
 package de.micromata.borgbutler.json.borg;
 
+import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.commons.lang3.StringUtils;
@@ -12,6 +13,7 @@
      * d (directory), - (file)
      */
     @Getter
+    @Setter
     private String type;
     /**
      * Unix mode, e. g. <tt>drwxr-xr-x</tt>
@@ -27,7 +29,11 @@
     @Getter
     private long gid;
     @Getter
+    @Setter
     private String path;
+    @Setter
+    @Getter
+    private String displayPath;
     @Getter
     private boolean healthy;
     @Getter
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java
new file mode 100644
index 0000000..83622a5
--- /dev/null
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java
@@ -0,0 +1,68 @@
+package de.micromata.borgbutler.data;
+
+import de.micromata.borgbutler.json.borg.BorgFilesystemItem;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class FileSystemFilterTest {
+    @Test
+    void getTopLevelTest() {
+        FileSystemFilter filter = new FileSystemFilter();
+        assertEquals("home", filter.getTopLevel("home"));
+        assertEquals("home", filter.getTopLevel("home/test"));
+        assertEquals("home", filter.getTopLevel("home/"));
+        filter.setCurrentDirectory("home");
+        assertNull(filter.getTopLevel("home"));
+        assertEquals("kai", filter.getTopLevel("home/kai"));
+        assertEquals("kai", filter.getTopLevel("home/kai/test.java"));
+        assertNull(filter.getTopLevel("etc/test"));
+        List<BorgFilesystemItem> list = createList();
+        filter.setCurrentDirectory("").setMode(FileSystemFilter.Mode.TREE);
+        for (BorgFilesystemItem item : list) {
+            if (filter.matches(item)) {
+                // Do nothing.
+            }
+        }
+        list = filter.reduce(list);
+        assertEquals(2, list.size());
+        list = createList();
+        filter.setCurrentDirectory("home");
+        for (BorgFilesystemItem item : list) {
+            if (filter.matches(item)) {
+                // Do nothing.
+            }
+        }
+        list = filter.reduce(list);
+        assertEquals(2, list.size());
+
+    }
+
+    private BorgFilesystemItem create(String path, boolean directory) {
+        BorgFilesystemItem item = new BorgFilesystemItem().setPath(path);
+        if (directory) {
+            item.setType("d");
+        } else {
+            item.setType("-");
+        }
+        return item;
+    }
+
+    private List<BorgFilesystemItem> createList() {
+        List<BorgFilesystemItem> list = new ArrayList<>();
+        list.add(create("home", true));
+        list.add(create("home/admin", false));
+        list.add(create("home/kai", true));
+        list.add(create("home/kai/borg/cache", false));
+        list.add(create("home/kai/borg/config", false));
+        list.add(create("home/kai/Java/test.java", false));
+        list.add(create("home/kai/Java/test2.java", false));
+        list.add(create("etc/apache", true));
+        list.add(create("etc/apache/http.conf", false));
+        return list;
+    }
+}
diff --git a/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx b/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx
index 1d51d4c..f90abe1 100644
--- a/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx
+++ b/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx
@@ -35,9 +35,9 @@
 function FileListEntry({archiveId, entry, search, mode, changeCurrentDirectory}) {
     let path;
     if (mode === 'tree' && entry.type === 'd') {
-        path = <a href={'#'} onClick={() => changeCurrentDirectory(entry.path)}><Highlight search={search}>{entry.path}</Highlight></a>;
+        path = <a href={'#'} onClick={() => changeCurrentDirectory(entry.path)}><Highlight search={search}>{entry.displayPath}</Highlight></a>;
     } else {
-        path = <Highlight search={search}>{entry.path} tree</Highlight>;
+        path = <Highlight search={search}>{entry.displayPath}</Highlight>;
     }
     return (
         <tr>
diff --git a/borgbutler-webapp/src/components/views/archives/FileListPanel.jsx b/borgbutler-webapp/src/components/views/archives/FileListPanel.jsx
index 46ad627..905dc6b 100644
--- a/borgbutler-webapp/src/components/views/archives/FileListPanel.jsx
+++ b/borgbutler-webapp/src/components/views/archives/FileListPanel.jsx
@@ -109,7 +109,7 @@
                         <BreadcrumbItem><a onClick={() => this.changeCurrentDirectory('')}
                                                        href="#">Top</a></BreadcrumbItem>
                         {breadcrumbs}
-                        <BreadcrumbItem active>{dirs[dirs.length - 1]}lkdjfls</BreadcrumbItem>
+                        <BreadcrumbItem active>{dirs[dirs.length - 1]}</BreadcrumbItem>
                     </Breadcrumb>;
                 } else {
                     breadcrumb = '';

--
Gitblit v1.10.0