add traversal of the file tree

pull/34/head
Zlatin Balevsky 2019-12-06 10:51:07 +00:00
parent 23b2c912e2
commit a0f70f7677
3 changed files with 85 additions and 1 deletions

View File

@ -46,6 +46,31 @@ class FileTree<T> {
true
}
synchronized void traverse(FileTreeCallback<T> callback) {
doTraverse(root, callback);
}
private void doTraverse(TreeNode<T> node, FileTreeCallback<T> 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<T> {
TreeNode parent
File file
@ -53,7 +78,7 @@ class FileTree<T> {
final Set<TreeNode> children = new HashSet<>()
public int hashCode() {
file.hashCode()
Objects.hash(file)
}
public boolean equals(Object o) {

View File

@ -0,0 +1,9 @@
package com.muwire.core.files;
import java.io.File;
public interface FileTreeCallback<T> {
public void onDirectoryEnter(File file);
public void onDirectoryLeave();
public void onFile(File file, T value);
}

View File

@ -39,4 +39,54 @@ class FileTreeTest {
tree.remove(d)
assert tree.fileToNode.size() == 3
}
@Test
public void testTraverse() {
Stack stack = new Stack()
Set<String> values = new HashSet<>()
StringBuilder sb = new StringBuilder()
def cb = new FileTreeCallback<String>() {
@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<String> 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")
}
}