1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package de.smartics.testdoc.core.doc;
17
18 import java.io.Serializable;
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.LinkedHashMap;
22 import java.util.List;
23 import java.util.Map;
24
25 import org.apache.commons.lang.NullArgumentException;
26
27 import net.jcip.annotations.GuardedBy;
28 import net.jcip.annotations.ThreadSafe;
29
30
31
32
33
34
35
36 @ThreadSafe
37 public class UnitTestDocIndex implements Serializable
38 {
39
40
41
42
43
44
45
46 private static final long serialVersionUID = 1L;
47
48
49
50
51 private static final String GUARD = "unitTestDocs";
52
53
54
55
56
57
58
59
60 private final Map<Type, UnitTestDoc> unitTestDocs =
61 new LinkedHashMap<Type, UnitTestDoc>();
62
63
64
65
66
67
68
69 private final Map<Type, List<UnitTestDoc>> testCases =
70 new LinkedHashMap<Type, List<UnitTestDoc>>();
71
72
73
74
75
76
77
78
79 public UnitTestDocIndex()
80 {
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 @GuardedBy(GUARD)
98 public List<UnitTestDoc> getUnitTestDocs()
99 {
100 synchronized (unitTestDocs)
101 {
102 return new ArrayList<UnitTestDoc>(unitTestDocs.values());
103 }
104 }
105
106
107
108
109
110
111 @GuardedBy(GUARD)
112 public Integer getSize()
113 {
114 synchronized (unitTestDocs)
115 {
116 return unitTestDocs.size();
117 }
118 }
119
120
121
122
123
124
125
126 @GuardedBy(GUARD)
127 public boolean isEmpty()
128 {
129 synchronized (unitTestDocs)
130 {
131 return unitTestDocs.isEmpty();
132 }
133 }
134
135
136
137
138
139
140
141
142
143
144
145
146 @GuardedBy(GUARD)
147 public UnitTestDoc register(final UnitTestDoc unitTestDoc)
148 throws NullPointerException
149 {
150 final Type uutType = unitTestDoc.getUutType();
151 synchronized (unitTestDocs)
152 {
153 final UnitTestDoc representative;
154 if (unitTestDocs.containsKey(uutType))
155 {
156 representative = unitTestDocs.get(uutType);
157 representative.addScenarios(unitTestDoc);
158 }
159 else
160 {
161 representative = unitTestDoc;
162 unitTestDocs.put(uutType, representative);
163 }
164 registerByTestCase(representative);
165 return representative;
166 }
167 }
168
169
170
171
172
173
174 private void registerByTestCase(final UnitTestDoc testDoc)
175 {
176 scenarios: for (final ScenarioTestDoc scenario : testDoc.getScenarios())
177 {
178 final Type testCaseType = scenario.getTestCaseType();
179 List<UnitTestDoc> unitTestDocs = this.testCases.get(testCaseType);
180 if (unitTestDocs == null)
181 {
182 unitTestDocs = new ArrayList<UnitTestDoc>();
183 testCases.put(testCaseType, unitTestDocs);
184 }
185 else
186 {
187 for (final UnitTestDoc currentTestDoc : unitTestDocs)
188 {
189 if (testDoc == currentTestDoc)
190 {
191 continue scenarios;
192 }
193 }
194 }
195 unitTestDocs.add(testDoc);
196 }
197 }
198
199
200
201
202
203
204
205
206 @GuardedBy(GUARD)
207 public UnitTestDoc get(final Type uutType)
208 {
209 synchronized (unitTestDocs)
210 {
211 return unitTestDocs.get(uutType);
212 }
213 }
214
215
216
217
218
219
220
221
222
223
224 @GuardedBy(GUARD)
225 public List<UnitTestDoc> getByTestCase(final Type testCaseType)
226 {
227 synchronized (unitTestDocs)
228 {
229 final List<UnitTestDoc> registered = testCases.get(testCaseType);
230 if (registered != null)
231 {
232 final List<UnitTestDoc> unitTestsOfTestCase =
233 filterScenariosByTestCase(testCaseType, registered);
234
235 return Collections.unmodifiableList(unitTestsOfTestCase);
236 }
237 else
238 {
239 return Collections.emptyList();
240 }
241 }
242 }
243
244 private static List<UnitTestDoc> filterScenariosByTestCase(
245 final Type testCaseType, final List<UnitTestDoc> registered)
246 {
247 final List<UnitTestDoc> unitTestsOfTestCase =
248 new ArrayList<UnitTestDoc>(registered.size());
249 for (final UnitTestDoc unitTestDoc : registered)
250 {
251 final List<ScenarioTestDoc> scenariosOfTestCase =
252 filterScenarios(testCaseType, unitTestDoc);
253 final UnitTestDoc unitTestDocOfTestCase =
254 cloneWithNewScenarios(unitTestDoc, scenariosOfTestCase);
255 unitTestsOfTestCase.add(unitTestDocOfTestCase);
256 }
257 return unitTestsOfTestCase;
258 }
259
260 private static List<ScenarioTestDoc> filterScenarios(final Type testCaseType,
261 final UnitTestDoc unitTestDoc)
262 {
263 final List<ScenarioTestDoc> scenariosOfTestCase =
264 new ArrayList<ScenarioTestDoc>();
265 for (final ScenarioTestDoc scenario : unitTestDoc.getScenarios())
266 {
267 if (testCaseType.equals(scenario.getTestCaseType()))
268 {
269 scenariosOfTestCase.add(scenario);
270 }
271 }
272 return scenariosOfTestCase;
273 }
274
275 private static UnitTestDoc cloneWithNewScenarios(
276 final UnitTestDoc unitTestDoc,
277 final List<ScenarioTestDoc> scenariosOfTestCase)
278 {
279 final UnitTestDoc unitTestDocOfTestCase =
280 new UnitTestDoc(unitTestDoc.getUutType(), scenariosOfTestCase);
281 return unitTestDocOfTestCase;
282 }
283
284
285
286
287
288
289
290
291
292 @GuardedBy(GUARD)
293 public void deregisterTestCase(final Type testCaseType)
294 throws NullArgumentException
295 {
296 if (testCaseType == null)
297 {
298 throw new NullArgumentException("testCaseType");
299 }
300
301 synchronized (unitTestDocs)
302 {
303 final List<UnitTestDoc> unitTestDocsOfTestCase =
304 testCases.get(testCaseType);
305 if (unitTestDocsOfTestCase != null)
306 {
307 for (final UnitTestDoc unitTestDoc : unitTestDocsOfTestCase)
308 {
309 unitTestDoc.removeScenarios(testCaseType);
310 }
311 }
312 }
313 }
314
315
316
317
318 @GuardedBy(GUARD)
319 public void clear()
320 {
321 synchronized (unitTestDocs)
322 {
323 unitTestDocs.clear();
324 testCases.clear();
325 }
326 }
327
328
329
330 }