From a6e08347222224f0df7bf31f3d94a4889563bbdc Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Fri, 6 Dec 2019 12:47:08 +0000 Subject: [PATCH] add a single-level list traversal of the tree --- .../muwire/core/files/FileListCallback.java | 10 +++++ .../com/muwire/core/files/FileTree.groovy | 15 +++++++ .../com/muwire/core/files/FileTreeTest.groovy | 45 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 core/src/main/groovy/com/muwire/core/files/FileListCallback.java diff --git a/core/src/main/groovy/com/muwire/core/files/FileListCallback.java b/core/src/main/groovy/com/muwire/core/files/FileListCallback.java new file mode 100644 index 00000000..b6246d8d --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/FileListCallback.java @@ -0,0 +1,10 @@ +package com.muwire.core.files; + +import java.io.File; + +public interface FileListCallback { + + public void onFile(File f, T value); + + public void onDirectory(File f); +} diff --git a/core/src/main/groovy/com/muwire/core/files/FileTree.groovy b/core/src/main/groovy/com/muwire/core/files/FileTree.groovy index 6dabb849..88c756ba 100644 --- a/core/src/main/groovy/com/muwire/core/files/FileTree.groovy +++ b/core/src/main/groovy/com/muwire/core/files/FileTree.groovy @@ -71,6 +71,21 @@ class FileTree { callback.onDirectoryLeave() } + synchronized void list(File parent, FileListCallback callback) { + TreeNode node + if (parent == null) + node = root + else + node = fileToNode.get(parent) + + node.children.each { + if (it.file.isFile()) + callback.onFile(it.file, it.value) + else + callback.onDirectory(it.file) + } + } + public static class TreeNode { TreeNode parent File file diff --git a/core/src/test/groovy/com/muwire/core/files/FileTreeTest.groovy b/core/src/test/groovy/com/muwire/core/files/FileTreeTest.groovy index b9719ce3..1cfa6392 100644 --- a/core/src/test/groovy/com/muwire/core/files/FileTreeTest.groovy +++ b/core/src/test/groovy/com/muwire/core/files/FileTreeTest.groovy @@ -89,4 +89,49 @@ class FileTreeTest { assert values.contains("c") assert values.contains("e") } + + @Test + public void testList() { + Set directories = new HashSet<>() + Set values = new HashSet<>() + def cb = new FileListCallback() { + + @Override + public void onDirectory(File file) { + directories.add(file) + } + + @Override + public void onFile(File file, String value) { + values.add(value) + } + } + + File a = new File("a") + a.createNewFile() + File b = new File("b") + b.mkdir() + File c = new File(b, "c") + c.createNewFile() + + FileTree tree = new FileTree<>() + + tree.add(a, "a") + tree.add(b, "b") + tree.add(c, "c") + + tree.list(null, cb) + + assert directories.size() == 1 + assert directories.contains(b) + assert values.size() == 1 + assert values.contains("a") + + directories.clear() + values.clear() + tree.list(b, cb) + assert directories.isEmpty() + assert values.size() == 1 + assert values.contains("c") + } }