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; } } 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 borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java
New file @@ -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; } } 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> 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 = '';