22
22
import java .net .MalformedURLException ;
23
23
import java .net .URL ;
24
24
import java .util .ArrayList ;
25
+ import java .util .Collection ;
25
26
import java .util .List ;
26
27
import java .util .Map .Entry ;
28
+ import java .util .function .Supplier ;
27
29
28
30
import org .springframework .boot .devtools .restart .classloader .ClassLoaderFile ;
29
31
import org .springframework .boot .devtools .restart .classloader .ClassLoaderFile .Kind ;
30
32
import org .springframework .boot .devtools .restart .classloader .ClassLoaderFileURLStreamHandler ;
31
33
import org .springframework .boot .devtools .restart .classloader .ClassLoaderFiles ;
32
34
import org .springframework .boot .devtools .restart .classloader .ClassLoaderFiles .SourceFolder ;
33
35
import org .springframework .context .ApplicationContext ;
36
+ import org .springframework .context .support .AbstractApplicationContext ;
34
37
import org .springframework .core .io .AbstractResource ;
35
38
import org .springframework .core .io .DefaultResourceLoader ;
36
39
import org .springframework .core .io .ProtocolResolver ;
@@ -67,7 +70,8 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
67
70
68
71
private final ClassLoaderFiles classLoaderFiles ;
69
72
70
- ClassLoaderFilesResourcePatternResolver (ApplicationContext applicationContext , ClassLoaderFiles classLoaderFiles ) {
73
+ ClassLoaderFilesResourcePatternResolver (AbstractApplicationContext applicationContext ,
74
+ ClassLoaderFiles classLoaderFiles ) {
71
75
this .classLoaderFiles = classLoaderFiles ;
72
76
this .patternResolverDelegate = getResourcePatternResolverFactory ()
73
77
.getResourcePatternResolver (applicationContext , retrieveResourceLoader (applicationContext ));
@@ -195,28 +199,11 @@ public InputStream getInputStream() throws IOException {
195
199
*/
196
200
private static class ResourcePatternResolverFactory {
197
201
198
- public ResourcePatternResolver getResourcePatternResolver (ApplicationContext applicationContext ,
202
+ public ResourcePatternResolver getResourcePatternResolver (AbstractApplicationContext applicationContext ,
199
203
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 );
220
207
}
221
208
222
209
}
@@ -228,22 +215,35 @@ protected final void copyProtocolResolvers(DefaultResourceLoader source, Default
228
215
private static class WebResourcePatternResolverFactory extends ResourcePatternResolverFactory {
229
216
230
217
@ Override
231
- public ResourcePatternResolver getResourcePatternResolver (ApplicationContext applicationContext ,
218
+ public ResourcePatternResolver getResourcePatternResolver (AbstractApplicationContext applicationContext ,
232
219
ResourceLoader resourceLoader ) {
233
220
if (applicationContext instanceof WebApplicationContext ) {
234
- return getResourcePatternResolver (( WebApplicationContext ) applicationContext , resourceLoader );
221
+ return getServletContextResourcePatternResolver ( applicationContext , resourceLoader );
235
222
}
236
223
return super .getResourcePatternResolver (applicationContext , resourceLoader );
237
224
}
238
225
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 {
246
237
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 ();
247
247
}
248
248
249
249
}
@@ -252,11 +252,13 @@ private ResourcePatternResolver getResourcePatternResolver(WebApplicationContext
252
252
* {@link ResourceLoader} that optionally supports {@link ServletContextResource
253
253
* ServletContextResources}.
254
254
*/
255
- private static class WebApplicationContextResourceLoader extends DefaultResourceLoader {
255
+ private static class WebApplicationContextResourceLoader extends ApplicationContextResourceLoader {
256
256
257
257
private final WebApplicationContext applicationContext ;
258
258
259
- WebApplicationContextResourceLoader (WebApplicationContext applicationContext ) {
259
+ WebApplicationContextResourceLoader (Supplier <Collection <ProtocolResolver >> protocolResolvers ,
260
+ WebApplicationContext applicationContext ) {
261
+ super (protocolResolvers );
260
262
this .applicationContext = applicationContext ;
261
263
}
262
264
0 commit comments