-
-
Notifications
You must be signed in to change notification settings - Fork 693
/
JbossDir.java
75 lines (62 loc) · 2.09 KB
/
JbossDir.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package org.reflections.vfs;
import org.jboss.vfs.VirtualFile;
import org.jboss.vfs.VirtualJarInputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.Iterator;
import java.util.Stack;
import java.util.jar.JarFile;
public class JbossDir implements Vfs.Dir {
private final VirtualFile virtualFile;
private JbossDir(VirtualFile virtualFile) {
this.virtualFile = virtualFile;
}
public static Vfs.Dir createDir(URL url) throws Exception {
Object content = url.openConnection().getContent();
if (content instanceof VirtualJarInputStream) {
Field root = content.getClass().getDeclaredField("root");
root.setAccessible(true);
content = root.get(content);
}
VirtualFile virtualFile = (VirtualFile) content;
if (virtualFile.isFile()) {
return new ZipDir(new JarFile(virtualFile.getPhysicalFile()));
}
return new JbossDir(virtualFile);
}
@Override
public String getPath() {
return virtualFile.getPathName();
}
@Override
public Iterable<Vfs.File> getFiles() {
return () -> new Iterator<Vfs.File>() {
final Stack<VirtualFile> stack = new Stack<>();
Vfs.File entry = null;
{
stack.addAll(virtualFile.getChildren());
}
@Override
public boolean hasNext() {
return entry != null || (entry = computeNext()) != null;
}
@Override
public Vfs.File next() {
Vfs.File next = entry;
entry = null;
return next;
}
private Vfs.File computeNext() {
while (!stack.isEmpty()) {
final VirtualFile file = stack.pop();
if (file.isDirectory()) {
stack.addAll(file.getChildren());
} else {
return new JbossFile(JbossDir.this, file);
}
}
return null;
}
};
}
}