-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathJaxRSScanner.java
More file actions
78 lines (64 loc) · 3.1 KB
/
JaxRSScanner.java
File metadata and controls
78 lines (64 loc) · 3.1 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package io.openapitools.swagger;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import org.apache.maven.plugin.logging.Log;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
/**
* Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition}
* annotation, and for {@link Application} instances.
*/
class JaxRSScanner {
private final Log log;
private final ClassGraph classGraph;
private final Set<String> resourcePackages;
private final boolean useResourcePackagesChildren;
public JaxRSScanner(Log log, ClassLoader clzLoader, Set<String> resourcePackages, Boolean useResourcePackagesChildren) {
this.log = log;
this.classGraph = new ClassGraph().enableClassInfo().enableAnnotationInfo()
.addClassLoader(clzLoader);
this.resourcePackages = resourcePackages == null ? Collections.emptySet() : new HashSet<>(resourcePackages);
this.useResourcePackagesChildren = Boolean.TRUE.equals(useResourcePackagesChildren);
}
Application applicationInstance() {
Application applicationInstance = null;
try (ScanResult scanResult = classGraph.scan()) {
ClassInfoList applicationClasses = scanResult.getSubclasses(Application.class.getName())
.filter(this::filterClassByResourcePackages);
if (applicationClasses.size() == 1) {
applicationInstance = ClassUtils.createInstance(applicationClasses.get(0).loadClass(Application.class));
} else if (applicationClasses.size() > 1) {
log.warn("More than one javax.ws.rs.core.Application classes found on the classpath, skipping");
}
}
return applicationInstance;
}
Set<Class<?>> classes() {
Set<Class<?>> classes;
try (ScanResult scanResult = classGraph.scan()) {
ClassInfoList apiClasses = scanResult.getClassesWithAnnotation(Path.class.getName());
ClassInfoList defClasses = scanResult.getClassesWithAnnotation(OpenAPIDefinition.class.getName());
classes = Stream.of(apiClasses, defClasses)
.flatMap(classList -> classList.filter(this::filterClassByResourcePackages).stream())
.map(ClassInfo::loadClass)
.collect(Collectors.toSet());
}
if (classes.isEmpty()) {
log.warn("No @Path or @OpenAPIDefinition annotated classes found in given resource packages: " + resourcePackages);
}
return classes;
}
private boolean filterClassByResourcePackages(ClassInfo cls) {
return resourcePackages.isEmpty()
|| resourcePackages.contains(cls.getPackageName())
|| (useResourcePackagesChildren && resourcePackages.stream().anyMatch(p -> cls.getPackageName().startsWith(p)));
}
}