Skip to content

Commit d7b43a3

Browse files
committed
Filter out non-public classes when documenting auto-config classes
Fixes gh-25948
1 parent 7355973 commit d7b43a3

File tree

1 file changed

+36
-3
lines changed

1 file changed

+36
-3
lines changed

buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationMetadata.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,11 +17,15 @@
1717
package org.springframework.boot.build.autoconfigure;
1818

1919
import java.io.File;
20+
import java.io.FileInputStream;
2021
import java.io.FileReader;
2122
import java.io.FileWriter;
2223
import java.io.IOException;
24+
import java.io.InputStream;
2325
import java.io.Reader;
26+
import java.util.LinkedHashSet;
2427
import java.util.Properties;
28+
import java.util.Set;
2529
import java.util.concurrent.Callable;
2630

2731
import org.gradle.api.DefaultTask;
@@ -30,7 +34,10 @@
3034
import org.gradle.api.tasks.SourceSet;
3135
import org.gradle.api.tasks.TaskAction;
3236

37+
import org.springframework.asm.ClassReader;
38+
import org.springframework.asm.Opcodes;
3339
import org.springframework.core.CollectionFactory;
40+
import org.springframework.util.StringUtils;
3441

3542
/**
3643
* A {@link Task} for generating metadata describing a project's auto-configuration
@@ -78,12 +85,38 @@ private Properties readAutoConfiguration() throws IOException {
7885
Properties autoConfiguration = CollectionFactory.createSortedProperties(true);
7986
Properties springFactories = readSpringFactories(
8087
new File(this.sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories"));
81-
autoConfiguration.setProperty("autoConfigurationClassNames",
82-
springFactories.getProperty("org.springframework.boot.autoconfigure.EnableAutoConfiguration"));
88+
String enableAutoConfiguration = springFactories
89+
.getProperty("org.springframework.boot.autoconfigure.EnableAutoConfiguration");
90+
Set<String> classNames = StringUtils.commaDelimitedListToSet(enableAutoConfiguration);
91+
Set<String> publicClassNames = new LinkedHashSet<>();
92+
for (String className : classNames) {
93+
File classFile = findClassFile(className);
94+
if (classFile == null) {
95+
throw new IllegalStateException("Auto-configuration class '" + className + "' not found.");
96+
}
97+
try (InputStream in = new FileInputStream(classFile)) {
98+
int access = new ClassReader(in).getAccess();
99+
if ((access & Opcodes.ACC_PUBLIC) == Opcodes.ACC_PUBLIC) {
100+
publicClassNames.add(className);
101+
}
102+
}
103+
}
104+
autoConfiguration.setProperty("autoConfigurationClassNames", String.join(",", publicClassNames));
83105
autoConfiguration.setProperty("module", getProject().getName());
84106
return autoConfiguration;
85107
}
86108

109+
private File findClassFile(String className) {
110+
String classFileName = className.replace(".", "/") + ".class";
111+
for (File classesDir : this.sourceSet.getOutput().getClassesDirs()) {
112+
File classFile = new File(classesDir, classFileName);
113+
if (classFile.isFile()) {
114+
return classFile;
115+
}
116+
}
117+
return null;
118+
}
119+
87120
private Properties readSpringFactories(File file) throws IOException {
88121
Properties springFactories = new Properties();
89122
try (Reader in = new FileReader(file)) {

0 commit comments

Comments
 (0)