Skip to content

Commit 0c5ed92

Browse files
committed
apply default package rejections
1 parent 309668f commit 0c5ed92

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/server/scanner/ReflectionsClassFinder.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,42 @@
5353
* @since 2.0
5454
*/
5555
public class ReflectionsClassFinder implements ClassFinder {
56+
/**
57+
* System property name to be used to disable default package filtering
58+
* during class scan. See {@link #applyScannerPackageFilters(ClassGraph)}
59+
* and {@link #DEFAULT_REJECTED_PACKAGES}
60+
*/
61+
public static final String DISABLE_DEFAULT_PACKAGE_FILTER = "vaadin.classfinder.disableDefaultPackageFilter";
62+
63+
private static final String[] DEFAULT_REJECTED_PACKAGES = new String[] {
64+
"antlr", "cglib", "ch.quos.logback", "commons-codec",
65+
"commons-fileupload", "commons-io", "commons-logging",
66+
"com.fasterxml", "tools.jackson", "com.google", "com.h2database",
67+
"com.helger", "com.vaadin.external.atmosphere", "com.vaadin.webjar",
68+
"junit", "net.bytebuddy", "org.apache", "org.aspectj",
69+
"org.bouncycastle", "org.dom4j", "org.easymock",
70+
"org.eclipse.persistence", "org.hamcrest", "org.hibernate",
71+
"org.javassist", "org.jboss", "org.jsoup", "org.seleniumhq",
72+
"org.slf4j", "org.atmosphere", "org.springframework",
73+
"org.webjars.bowergithub", "org.yaml",
74+
75+
"java.*", "javax.*", "javafx.*", "com.sun.*", "oracle.deploy",
76+
"oracle.javafx", "oracle.jrockit", "oracle.jvm", "oracle.net",
77+
"oracle.nio", "oracle.tools", "oracle.util", "oracle.webservices",
78+
"oracle.xmlns",
79+
80+
"com.intellij.*", "org.jetbrains",
81+
82+
"com.vaadin.external.gwt", "javassist.*", "io.methvin",
83+
"com.github.javaparser", "oshi.*", "io.micrometer", "jakarta.*",
84+
"com.nimbusds", "elemental.util", "org.reflections",
85+
"org.aopalliance", "org.objectweb",
86+
87+
"com.vaadin.hilla", "com.vaadin.copilot" };
88+
5689
private static final Logger LOGGER = LoggerFactory
5790
.getLogger(ReflectionsClassFinder.class);
91+
5892
private final transient ClassLoader classLoader;
5993

6094
// Cache all discovered classes by annotation
@@ -108,7 +142,7 @@ public ReflectionsClassFinder(ClassLoader classLoader, URL... urls) {
108142
.ignoreClassVisibility() // Scan non-public classes
109143
.filterClasspathElements(
110144
path -> !path.endsWith("module-info.class"));
111-
145+
applyScannerPackageFilters(classGraph);
112146
if (VersionFinder.JAVA_MAJOR_VERSION < 24) {
113147
// Not available on Java 24+ currently, because of the deprecation
114148
// of the Unsafe API
@@ -296,4 +330,10 @@ private Map<String, Set<String>> buildSubtypeCache(
296330

297331
return cache;
298332
}
333+
334+
private void applyScannerPackageFilters(ClassGraph classGraph) {
335+
if (!Boolean.getBoolean(DISABLE_DEFAULT_PACKAGE_FILTER)) {
336+
classGraph.rejectPackages(DEFAULT_REJECTED_PACKAGES);
337+
}
338+
}
299339
}

flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/server/scanner/ReflectionsClassFinderTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.nio.charset.StandardCharsets;
2626
import java.nio.file.Files;
2727
import java.nio.file.Path;
28+
import java.util.Arrays;
2829
import java.util.List;
2930
import java.util.Set;
3031
import java.util.stream.Collectors;
@@ -86,6 +87,42 @@ public void getSubTypesOf_orderIsDeterministic() {
8687
Assert.assertEquals(a2, a3);
8788
}
8889

90+
@Test
91+
public void getSubTypesOf_rejectNotVaadinKnownPackages() throws Exception {
92+
urls = Arrays.copyOf(urls, urls.length + 1);
93+
urls[urls.length - 1] = createTestModule("module-4",
94+
"org.springframework.feature.ui", "SpringUIComponent", "2.0.0");
95+
Set<String> result = new ReflectionsClassFinder(urls)
96+
.getSubTypesOf(Component.class).stream().map(Class::getName)
97+
.collect(Collectors.toSet());
98+
Assert.assertFalse(
99+
"Classes from know not-UI packages should be rejected by default",
100+
result.contains(
101+
"org.springframework.feature.ui.SpringUIComponent"));
102+
}
103+
104+
@Test
105+
public void getSubTypesOf_defaultRejectDisabled_scansAllPackages()
106+
throws Exception {
107+
urls = Arrays.copyOf(urls, urls.length + 1);
108+
urls[urls.length - 1] = createTestModule("module-4",
109+
"org.springframework.feature.ui", "SpringUIComponent", "2.0.0");
110+
System.setProperty(
111+
ReflectionsClassFinder.DISABLE_DEFAULT_PACKAGE_FILTER, "true");
112+
try {
113+
Set<String> result = new ReflectionsClassFinder(urls)
114+
.getSubTypesOf(Component.class).stream().map(Class::getName)
115+
.collect(Collectors.toSet());
116+
Assert.assertTrue(
117+
"Classes from know not-UI packages should be found when default rejection is disabled",
118+
result.contains(
119+
"org.springframework.feature.ui.SpringUIComponent"));
120+
} finally {
121+
System.clearProperty(
122+
ReflectionsClassFinder.DISABLE_DEFAULT_PACKAGE_FILTER);
123+
}
124+
}
125+
89126
@Test
90127
public void getAnnotatedClasses_orderIsDeterministic() {
91128
List<String> a1 = toList(new ReflectionsClassFinder(urls)

0 commit comments

Comments
 (0)