From c592e7144967fe7560a7fa25909ea3932018888b Mon Sep 17 00:00:00 2001 From: Madhura Bhave Date: Mon, 1 Apr 2019 15:42:02 -0700 Subject: [PATCH] Override missing methods in FilteredClassLoader Closes gh-16404 --- .../test/context/FilteredClassLoader.java | 23 ++++++++++ .../context/FilteredClassLoaderTests.java | 42 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/FilteredClassLoader.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/FilteredClassLoader.java index e6f77ce3f8..efbd146c5f 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/FilteredClassLoader.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/FilteredClassLoader.java @@ -16,11 +16,14 @@ package org.springframework.boot.test.context; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; import java.util.function.Predicate; import org.springframework.core.io.ClassPathResource; @@ -109,6 +112,26 @@ public class FilteredClassLoader extends URLClassLoader { return super.getResource(name); } + @Override + public Enumeration getResources(String name) throws IOException { + for (Predicate filter : this.resourcesFilters) { + if (filter.test(name)) { + return Collections.emptyEnumeration(); + } + } + return super.getResources(name); + } + + @Override + public InputStream getResourceAsStream(String name) { + for (Predicate filter : this.resourcesFilters) { + if (filter.test(name)) { + return null; + } + } + return super.getResourceAsStream(name); + } + /** * Filter to restrict the classes that can be loaded. */ diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/FilteredClassLoaderTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/FilteredClassLoaderTests.java index 6ebf612fe6..99367fea71 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/FilteredClassLoaderTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/FilteredClassLoaderTests.java @@ -16,7 +16,9 @@ package org.springframework.boot.test.context; +import java.io.InputStream; import java.net.URL; +import java.util.Enumeration; import org.junit.Test; @@ -81,4 +83,44 @@ public class FilteredClassLoaderTests { } } + @Test + public void loadResourcesWhenFilteredOnResourceShouldReturnNotFound() + throws Exception { + try (FilteredClassLoader classLoader = new FilteredClassLoader(TEST_RESOURCE)) { + final Enumeration loaded = classLoader + .getResources(TEST_RESOURCE.getPath()); + assertThat(loaded.hasMoreElements()).isFalse(); + } + } + + @Test + public void loadResourcesWhenNotFilteredShouldLoadResource() throws Exception { + try (FilteredClassLoader classLoader = new FilteredClassLoader( + (resourceName) -> false)) { + final Enumeration loaded = classLoader + .getResources(TEST_RESOURCE.getPath()); + assertThat(loaded.hasMoreElements()).isTrue(); + } + } + + @Test + public void loadResourceAsStreamWhenFilteredOnResourceShouldReturnNotFound() + throws Exception { + try (FilteredClassLoader classLoader = new FilteredClassLoader(TEST_RESOURCE)) { + final InputStream loaded = classLoader + .getResourceAsStream(TEST_RESOURCE.getPath()); + assertThat(loaded).isNull(); + } + } + + @Test + public void loadResourceAsStreamWhenNotFilteredShouldLoadResource() throws Exception { + try (FilteredClassLoader classLoader = new FilteredClassLoader( + (resourceName) -> false)) { + final InputStream loaded = classLoader + .getResourceAsStream(TEST_RESOURCE.getPath()); + assertThat(loaded).isNotNull(); + } + } + }