1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.surefire.report;
20
21 import java.util.Map;
22 import java.util.concurrent.ConcurrentHashMap;
23 import java.util.concurrent.atomic.AtomicInteger;
24
25 import org.apache.maven.surefire.api.util.internal.ClassMethod;
26
27 import static java.util.Objects.requireNonNull;
28
29
30
31
32
33 public final class ClassMethodIndexer {
34 private final AtomicInteger classIndex = new AtomicInteger(1);
35 private final AtomicInteger methodIndex = new AtomicInteger(1);
36 private final Map<ClassMethod, Long> testIdMapping = new ConcurrentHashMap<>();
37 private final ThreadLocal<Long> testLocalMapping = new ThreadLocal<>();
38
39 public long indexClassMethod(String clazz, String method) {
40 ClassMethod key = new ClassMethod(requireNonNull(clazz), method);
41 return testIdMapping.computeIfAbsent(key, cm -> {
42 Long classId = testIdMapping.get(new ClassMethod(requireNonNull(clazz), null));
43 long c = classId == null ? (((long) classIndex.getAndIncrement()) << 32) : classId;
44 int m = method == null ? 0 : methodIndex.getAndIncrement();
45 long id = c | m;
46 testLocalMapping.set(id);
47 return id;
48 });
49 }
50
51 public long indexClass(String clazz) {
52 return indexClassMethod(clazz, null);
53 }
54
55 public Long getLocalIndex() {
56 return testLocalMapping.get();
57 }
58 }