2222import java .net .MalformedURLException ;
2323import java .net .URL ;
2424import java .util .ArrayList ;
25+ import java .util .Collection ;
2526import java .util .List ;
2627import java .util .Map .Entry ;
28+ import java .util .function .Supplier ;
2729
2830import org .springframework .boot .devtools .restart .classloader .ClassLoaderFile ;
2931import org .springframework .boot .devtools .restart .classloader .ClassLoaderFile .Kind ;
3032import org .springframework .boot .devtools .restart .classloader .ClassLoaderFileURLStreamHandler ;
3133import org .springframework .boot .devtools .restart .classloader .ClassLoaderFiles ;
3234import org .springframework .boot .devtools .restart .classloader .ClassLoaderFiles .SourceFolder ;
3335import org .springframework .context .ApplicationContext ;
36+ import org .springframework .context .support .AbstractApplicationContext ;
3437import org .springframework .core .io .AbstractResource ;
3538import org .springframework .core .io .DefaultResourceLoader ;
3639import org .springframework .core .io .ProtocolResolver ;
@@ -67,7 +70,8 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
6770
6871 private final ClassLoaderFiles classLoaderFiles ;
6972
70- ClassLoaderFilesResourcePatternResolver (ApplicationContext applicationContext , ClassLoaderFiles classLoaderFiles ) {
73+ ClassLoaderFilesResourcePatternResolver (AbstractApplicationContext applicationContext ,
74+ ClassLoaderFiles classLoaderFiles ) {
7175 this .classLoaderFiles = classLoaderFiles ;
7276 this .patternResolverDelegate = getResourcePatternResolverFactory ()
7377 .getResourcePatternResolver (applicationContext , retrieveResourceLoader (applicationContext ));
@@ -195,28 +199,11 @@ public InputStream getInputStream() throws IOException {
195199 */
196200 private static class ResourcePatternResolverFactory {
197201
198- public ResourcePatternResolver getResourcePatternResolver (ApplicationContext applicationContext ,
202+ public ResourcePatternResolver getResourcePatternResolver (AbstractApplicationContext applicationContext ,
199203 ResourceLoader resourceLoader ) {
200- if (resourceLoader == null ) {
201- resourceLoader = new DefaultResourceLoader ();
202- copyProtocolResolvers (applicationContext , resourceLoader );
203- }
204- return new PathMatchingResourcePatternResolver (resourceLoader );
205- }
206-
207- protected final void copyProtocolResolvers (ApplicationContext applicationContext ,
208- ResourceLoader resourceLoader ) {
209- if (applicationContext instanceof DefaultResourceLoader
210- && resourceLoader instanceof DefaultResourceLoader ) {
211- copyProtocolResolvers ((DefaultResourceLoader ) applicationContext ,
212- (DefaultResourceLoader ) resourceLoader );
213- }
214- }
215-
216- protected final void copyProtocolResolvers (DefaultResourceLoader source , DefaultResourceLoader destination ) {
217- for (ProtocolResolver resolver : source .getProtocolResolvers ()) {
218- destination .addProtocolResolver (resolver );
219- }
204+ ResourceLoader targetResourceLoader = (resourceLoader != null ) ? resourceLoader
205+ : new ApplicationContextResourceLoader (applicationContext ::getProtocolResolvers );
206+ return new PathMatchingResourcePatternResolver (targetResourceLoader );
220207 }
221208
222209 }
@@ -228,22 +215,35 @@ protected final void copyProtocolResolvers(DefaultResourceLoader source, Default
228215 private static class WebResourcePatternResolverFactory extends ResourcePatternResolverFactory {
229216
230217 @ Override
231- public ResourcePatternResolver getResourcePatternResolver (ApplicationContext applicationContext ,
218+ public ResourcePatternResolver getResourcePatternResolver (AbstractApplicationContext applicationContext ,
232219 ResourceLoader resourceLoader ) {
233220 if (applicationContext instanceof WebApplicationContext ) {
234- return getResourcePatternResolver (( WebApplicationContext ) applicationContext , resourceLoader );
221+ return getServletContextResourcePatternResolver ( applicationContext , resourceLoader );
235222 }
236223 return super .getResourcePatternResolver (applicationContext , resourceLoader );
237224 }
238225
239- private ResourcePatternResolver getResourcePatternResolver (WebApplicationContext applicationContext ,
240- ResourceLoader resourceLoader ) {
241- if (resourceLoader == null ) {
242- resourceLoader = new WebApplicationContextResourceLoader (applicationContext );
243- copyProtocolResolvers (applicationContext , resourceLoader );
244- }
245- return new ServletContextResourcePatternResolver (resourceLoader );
226+ private ResourcePatternResolver getServletContextResourcePatternResolver (
227+ AbstractApplicationContext applicationContext , ResourceLoader resourceLoader ) {
228+ ResourceLoader targetResourceLoader = (resourceLoader != null ) ? resourceLoader
229+ : new WebApplicationContextResourceLoader (applicationContext ::getProtocolResolvers ,
230+ (WebApplicationContext ) applicationContext );
231+ return new ServletContextResourcePatternResolver (targetResourceLoader );
232+ }
233+
234+ }
235+
236+ private static class ApplicationContextResourceLoader extends DefaultResourceLoader {
246237
238+ private final Supplier <Collection <ProtocolResolver >> protocolResolvers ;
239+
240+ ApplicationContextResourceLoader (Supplier <Collection <ProtocolResolver >> protocolResolvers ) {
241+ this .protocolResolvers = protocolResolvers ;
242+ }
243+
244+ @ Override
245+ public Collection <ProtocolResolver > getProtocolResolvers () {
246+ return this .protocolResolvers .get ();
247247 }
248248
249249 }
@@ -252,11 +252,13 @@ private ResourcePatternResolver getResourcePatternResolver(WebApplicationContext
252252 * {@link ResourceLoader} that optionally supports {@link ServletContextResource
253253 * ServletContextResources}.
254254 */
255- private static class WebApplicationContextResourceLoader extends DefaultResourceLoader {
255+ private static class WebApplicationContextResourceLoader extends ApplicationContextResourceLoader {
256256
257257 private final WebApplicationContext applicationContext ;
258258
259- WebApplicationContextResourceLoader (WebApplicationContext applicationContext ) {
259+ WebApplicationContextResourceLoader (Supplier <Collection <ProtocolResolver >> protocolResolvers ,
260+ WebApplicationContext applicationContext ) {
261+ super (protocolResolvers );
260262 this .applicationContext = applicationContext ;
261263 }
262264
0 commit comments