From a0f70f767736e4a98037b3789792d04eeee5d768 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Fri, 6 Dec 2019 10:51:07 +0000 Subject: [PATCH] add traversal of the file tree --- .../com/muwire/core/files/FileTree.groovy | 27 +++++++++- .../muwire/core/files/FileTreeCallback.java | 9 ++++ .../com/muwire/core/files/FileTreeTest.groovy | 50 +++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 core/src/main/groovy/com/muwire/core/files/FileTreeCallback.java 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 a143be82..6dabb849 100644 --- a/core/src/main/groovy/com/muwire/core/files/FileTree.groovy +++ b/core/src/main/groovy/com/muwire/core/files/FileTree.groovy @@ -46,6 +46,31 @@ class FileTree { true } + synchronized void traverse(FileTreeCallback callback) { + doTraverse(root, callback); + } + + private void doTraverse(TreeNode node, FileTreeCallback callback) { + println "traversing $node" + boolean leave = false + if (node.file != null) { + println "file is $node.file" + if (node.file.isFile()) + callback.onFile(node.file, node.value) + else { + leave = true + callback.onDirectoryEnter(node.file) + } + } + + node.children.each { + doTraverse(it, callback) + } + + if (leave) + callback.onDirectoryLeave() + } + public static class TreeNode { TreeNode parent File file @@ -53,7 +78,7 @@ class FileTree { final Set children = new HashSet<>() public int hashCode() { - file.hashCode() + Objects.hash(file) } public boolean equals(Object o) { diff --git a/core/src/main/groovy/com/muwire/core/files/FileTreeCallback.java b/core/src/main/groovy/com/muwire/core/files/FileTreeCallback.java new file mode 100644 index 00000000..cede30ac --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/FileTreeCallback.java @@ -0,0 +1,9 @@ +package com.muwire.core.files; + +import java.io.File; + +public interface FileTreeCallback { + public void onDirectoryEnter(File file); + public void onDirectoryLeave(); + public void onFile(File file, T value); +} 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 86476c2d..b9719ce3 100644 --- a/core/src/test/groovy/com/muwire/core/files/FileTreeTest.groovy +++ b/core/src/test/groovy/com/muwire/core/files/FileTreeTest.groovy @@ -39,4 +39,54 @@ class FileTreeTest { tree.remove(d) assert tree.fileToNode.size() == 3 } + + @Test + public void testTraverse() { + Stack stack = new Stack() + Set values = new HashSet<>() + StringBuilder sb = new StringBuilder() + def cb = new FileTreeCallback() { + + @Override + public void onDirectoryEnter(File file) { + stack.push(file) + } + + @Override + public void onDirectoryLeave() { + stack.pop() + } + + @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() + File d = new File(b, "d") + d.mkdir() + File e = new File(d, "e") + e.createNewFile() + FileTree tree = new FileTree<>() + + tree.add(a, "a") + tree.add(b, "b") + tree.add(c, "c") + tree.add(d, "d") + tree.add(e, "e") + + tree.traverse(cb) + + assert stack.isEmpty() + assert values.size() == 3 + assert values.contains("a") + assert values.contains("c") + assert values.contains("e") + } }