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
|
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> {
|
public static class TreeNode<T> {
|
||||||
TreeNode parent
|
TreeNode parent
|
||||||
File file
|
File file
|
||||||
|
@ -53,7 +78,7 @@ class FileTree<T> {
|
||||||
final Set<TreeNode> children = new HashSet<>()
|
final Set<TreeNode> children = new HashSet<>()
|
||||||
|
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
file.hashCode()
|
Objects.hash(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean equals(Object o) {
|
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)
|
tree.remove(d)
|
||||||
assert tree.fileToNode.size() == 3
|
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