io.swagger.v3.oas.integration.GenericOpenApiScanner Maven / Gradle / Ivy
package io.swagger.v3.oas.integration;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ScanResult;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.integration.api.OpenAPIConfiguration;
import io.swagger.v3.oas.integration.api.OpenApiScanner;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class GenericOpenApiScanner implements OpenApiScanner {
static final Set ignored = new HashSet();
static {
ignored.addAll(IgnoredPackages.ignored);
}
private static Logger LOGGER = LoggerFactory.getLogger(GenericOpenApiScanner.class);
OpenAPIConfiguration openApiConfiguration;
@Override
public void setConfiguration(OpenAPIConfiguration openApiConfiguration) {
this.openApiConfiguration = openApiConfiguration;
}
@Override
public Set> classes() {
ClassGraph graph = new ClassGraph().enableAllInfo();
Set acceptablePackages = new HashSet();
Set> output = new HashSet>();
boolean allowAllPackages = false;
// if classes are passed, use them
if (openApiConfiguration.getResourceClasses() != null && !openApiConfiguration.getResourceClasses().isEmpty()) {
for (String className : openApiConfiguration.getResourceClasses()) {
if (!isIgnored(className)) {
try {
output.add(Class.forName(className));
} catch (ClassNotFoundException e) {
LOGGER.warn("error loading class from resourceClasses: " + e.getMessage(), e);
}
}
}
return output;
}
if (openApiConfiguration.getResourcePackages() != null && !openApiConfiguration.getResourcePackages().isEmpty()) {
for (String pkg : openApiConfiguration.getResourcePackages()) {
if (!isIgnored(pkg)) {
acceptablePackages.add(pkg);
graph.whitelistPackages(pkg);
}
}
} else {
allowAllPackages = true;
}
// this is generic, specific Jaxrs scanner will also look for @Path
final Set> classes;
try (ScanResult scanResult = graph.scan()) {
classes = new HashSet<>(scanResult.getClassesWithAnnotation(OpenAPIDefinition.class.getName()).loadClasses());
}
for (Class> cls : classes) {
if (allowAllPackages) {
output.add(cls);
} else {
for (String pkg : acceptablePackages) {
if (cls.getPackage().getName().startsWith(pkg)) {
output.add(cls);
}
}
}
}
return output;
}
@Override
public Map resources() {
return new HashMap<>();
}
protected boolean isIgnored(String classOrPackageName) {
if (StringUtils.isBlank(classOrPackageName)) {
return true;
}
return ignored.stream().anyMatch(i -> classOrPackageName.startsWith(i));
}
}