mirror of https://github.com/zlatinb/muwire
add traversal of the file tree
parent
23b2c912e2
commit
a0f70f7677
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue