1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs2;
18
19 import java.util.ArrayList;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Set;
23
24 import org.apache.commons.vfs2.provider.AbstractFileObject;
25 import org.apache.commons.vfs2.util.FileObjectUtils;
26 import org.junit.jupiter.api.Assertions;
27
28
29
30
31 public class VerifyingFileSelector extends Assertions implements FileSelector {
32
33 private final FileInfo rootFile;
34 private final List<FileObject> files = new ArrayList<>();
35
36 private FileInfo currentFolderInfo;
37 private FileObject currentFolder;
38 private Set<String> children;
39 private final List<Set<String>> stack = new ArrayList<>();
40
41 public VerifyingFileSelector(final FileInfo fileInfo) {
42 rootFile = fileInfo;
43 children = new HashSet<>();
44 children.add(rootFile.baseName);
45 }
46
47
48
49
50
51
52 public List<FileObject> finish() {
53 assertEquals(0, children.size());
54 return files;
55 }
56
57
58
59
60 private FileInfo getChild(final String baseName) {
61 if (currentFolderInfo == null) {
62 assertEquals(rootFile.baseName, baseName);
63 return rootFile;
64 }
65 final FileInfo child = currentFolderInfo.children.get(baseName);
66 assertNotNull(child, "Could not locate child " + baseName);
67 return child;
68 }
69
70
71
72
73 @Override
74 public boolean includeFile(final FileSelectInfo fileInfo) throws FileSystemException {
75 final FileObject file = fileInfo.getFile();
76 if (file == currentFolder) {
77
78 assertEquals(0, children.size());
79 currentFolder = currentFolder.getParent();
80 currentFolderInfo = currentFolderInfo.getParent();
81 children = stack.remove(0);
82 }
83
84 final String baseName = file.getName().getBaseName();
85
86 final FileInfo childInfo = getChild(baseName);
87 assertSame(childInfo.type, file.getType());
88
89 final boolean isChild = children.remove(baseName);
90 assertTrue(isChild);
91
92 files.add(file);
93 return true;
94 }
95
96
97
98
99 @Override
100 public boolean traverseDescendents(final FileSelectInfo fileInfo) throws FileSystemException {
101
102 final FileObject folder = FileObjectUtils.getAbstractFileObject(fileInfo.getFile());
103 assertSame(FileType.FOLDER, folder.getType());
104 assertTrue(folder.isFolder());
105
106
107 final String baseName = folder.getName().getBaseName();
108 if (currentFolder == null) {
109 assertEquals(rootFile.baseName, baseName);
110 currentFolderInfo = rootFile;
111 } else {
112 final AbstractFileObject parent = FileObjectUtils.getAbstractFileObject(folder.getParent());
113 assertSame(currentFolder, parent);
114
115
116 currentFolderInfo = getChild(baseName);
117 assertSame(FileType.FOLDER, currentFolderInfo.type);
118 }
119
120
121 stack.add(0, children);
122 children = new HashSet<>(currentFolderInfo.children.keySet());
123 currentFolder = folder;
124
125 return true;
126 }
127
128 }