1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package de.smartics.testdoc.report.export.doc;
17
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.Collections;
21 import java.util.List;
22
23 import de.smartics.testdoc.core.doc.ScenarioTestDoc;
24
25
26
27
28 public class SelectionFilter
29 {
30
31
32
33
34
35
36
37
38
39
40 public static final String ALL_FILTER = "ALL";
41
42
43
44
45 public static final SelectionFilter STANDARD = new SelectionFilter();
46
47
48
49
50 private static final List<Class<?>> ALL = null;
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 private final List<Class<?>> includeCategories;
67
68
69
70
71
72
73
74
75
76
77
78
79
80 private final List<Class<?>> excludeCategories;
81
82
83
84
85
86
87
88
89 private SelectionFilter()
90 {
91 this(Arrays.asList(ALL_FILTER), new ArrayList<String>());
92 }
93
94
95
96
97
98
99
100
101
102 public SelectionFilter(final List<String> includeCategories,
103 final List<String> excludeCategories)
104 {
105 this.includeCategories = provideCategories(includeCategories);
106 this.excludeCategories = provideCategories(excludeCategories);
107 }
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 public List<ScenarioTestDoc> filterScenarios(
126 final List<ScenarioTestDoc> scenarios)
127 {
128 final List<ScenarioTestDoc> filtered =
129 new ArrayList<ScenarioTestDoc>(scenarios.size());
130 for (final ScenarioTestDoc scenario : scenarios)
131 {
132 final List<String> categories = scenario.getCategories();
133 if (acceptsAllOf(categories))
134 {
135 filtered.add(scenario);
136 }
137 }
138 return filtered;
139 }
140
141
142
143
144
145
146
147 public boolean acceptScenario(final ScenarioTestDoc scenario)
148 {
149 return acceptsAllOf(scenario.getCategories());
150 }
151
152
153
154
155
156
157
158
159 private boolean acceptsAllOf(final List<String> categories)
160 {
161 if (categories.isEmpty())
162 {
163 return excludeCategories != ALL;
164 }
165
166 for (final String category : categories)
167 {
168 if (!acceptCategory(category))
169 {
170 return false;
171 }
172 }
173
174 return true;
175 }
176
177
178
179
180 private static List<Class<?>> provideCategories(
181 final List<String> filterCategories) throws IllegalArgumentException
182 {
183 final List<Class<?>> categories = new ArrayList<Class<?>>();
184 if (filterCategories != null)
185 {
186 for (final String categoryName : filterCategories)
187 {
188 if (ALL_FILTER.equals(categoryName))
189 {
190 return ALL;
191 }
192 try
193 {
194 final Class<?> category = Class.forName(categoryName);
195 categories.add(category);
196 }
197 catch (final ClassNotFoundException e)
198 {
199 throw new IllegalArgumentException("Unknown category '"
200 + categoryName + "'.", e);
201 }
202 }
203 }
204 return Collections.unmodifiableList(categories);
205 }
206
207
208
209
210
211
212
213
214
215
216
217
218
219 public boolean acceptCategory(final String category)
220 {
221 try
222 {
223 final Class<?> type = Class.forName(category);
224 if (excludeCategories == ALL)
225 {
226 return acceptIncludes(type);
227 }
228 else
229 {
230 for (Class<?> excluded : excludeCategories)
231 {
232 if (excluded.isAssignableFrom(type))
233 {
234 return acceptIncludes(type);
235 }
236 }
237 return true;
238 }
239 }
240 catch (final ClassNotFoundException e)
241 {
242 return true;
243 }
244 }
245
246 private boolean acceptIncludes(final Class<?> type)
247 {
248 if (includeCategories == ALL)
249 {
250 return true;
251 }
252
253 for (Class<?> included : includeCategories)
254 {
255 if (included.isAssignableFrom(type))
256 {
257 return true;
258 }
259 }
260 return false;
261 }
262
263
264
265
266
267
268
269
270
271 public List<String> filterCategories(final List<String> categories)
272 {
273 if (categories == null)
274 {
275 return null;
276 }
277
278 if (excludeCategories != ALL && excludeCategories.isEmpty())
279 {
280 return new ArrayList<String>(categories);
281 }
282
283 final List<String> copy = new ArrayList<String>(categories.size());
284 for (final String category : categories)
285 {
286 if (acceptCategory(category))
287 {
288 copy.add(category);
289 }
290 }
291 return copy;
292 }
293
294
295
296 }