-
Notifications
You must be signed in to change notification settings - Fork 78
/
BuildServicesResolver.java
54 lines (43 loc) · 1.75 KB
/
BuildServicesResolver.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
package jakarta.enterprise.inject.build.compatible.spi;
import java.util.Collections;
import java.util.Comparator;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.TreeSet;
final class BuildServicesResolver {
private static final Object lock = new Object();
private static volatile Set<BuildServices> discoveredBuildServices;
private static volatile BuildServices configuredBuildServices;
static BuildServices get() {
if (configuredBuildServices != null) {
return configuredBuildServices;
}
if (discoveredBuildServices == null) {
synchronized (lock) {
if (discoveredBuildServices == null) {
discoverFactories();
}
}
}
configuredBuildServices = discoveredBuildServices.iterator().next();
return configuredBuildServices;
}
private static void discoverFactories() {
Set<BuildServices> factories = new TreeSet<>(
Comparator.comparingInt(BuildServices::getPriority).reversed());
ServiceLoader<BuildServices> loader = SecurityActions.loadService(
BuildServices.class, BuildServicesResolver.class.getClassLoader());
if (!loader.iterator().hasNext()) {
throw new IllegalStateException("Unable to locate AnnotationBuilderFactory implementation");
}
try {
for (BuildServices buildServicies : loader) {
factories.add(buildServicies);
}
} catch (ServiceConfigurationError e) {
throw new IllegalStateException(e);
}
BuildServicesResolver.discoveredBuildServices = Collections.unmodifiableSet(factories);
}
}