16
16
17
17
package org .springframework .boot .io ;
18
18
19
+ import java .util .Collections ;
19
20
import java .util .List ;
20
21
21
- import org .springframework .core .io .ClassPathResource ;
22
22
import org .springframework .core .io .ContextResource ;
23
23
import org .springframework .core .io .DefaultResourceLoader ;
24
24
import org .springframework .core .io .FileSystemResource ;
27
27
import org .springframework .core .io .ResourceLoader ;
28
28
import org .springframework .core .io .support .SpringFactoriesLoader ;
29
29
import org .springframework .util .Assert ;
30
- import org .springframework .util .ClassUtils ;
31
30
import org .springframework .util .StringUtils ;
32
31
33
32
/**
@@ -131,9 +130,8 @@ public static ResourceLoader get(ResourceLoader resourceLoader) {
131
130
* {@code spring.factories}. The factories file will be resolved using the default
132
131
* class loader at the time this call is made.
133
132
* @param resourceLoader the delegate resource loader
134
- * @param preferFileResolution if file based resolution is preferred over
135
- * {@code ServletContextResource}, {@code FilteredReactiveWebContextResource} or
136
- * {@link ClassPathResource} when no resource prefix is provided.
133
+ * @param preferFileResolution if file based resolution is preferred when a suitable
134
+ * {@link ResourceFilePathResolver} support the resource
137
135
* @return a {@link ResourceLoader} instance
138
136
* @since 3.4.1
139
137
*/
@@ -161,8 +159,10 @@ private static ResourceLoader get(ResourceLoader resourceLoader, SpringFactories
161
159
boolean preferFileResolution ) {
162
160
Assert .notNull (resourceLoader , "'resourceLoader' must not be null" );
163
161
Assert .notNull (springFactoriesLoader , "'springFactoriesLoader' must not be null" );
164
- return new ProtocolResolvingResourceLoader (resourceLoader , springFactoriesLoader .load (ProtocolResolver .class ),
165
- preferFileResolution );
162
+ List <ProtocolResolver > protocolResolvers = springFactoriesLoader .load (ProtocolResolver .class );
163
+ List <ResourceFilePathResolver > filePathResolvers = (preferFileResolution )
164
+ ? springFactoriesLoader .load (ResourceFilePathResolver .class ) : Collections .emptyList ();
165
+ return new ProtocolResolvingResourceLoader (resourceLoader , protocolResolvers , filePathResolvers );
166
166
}
167
167
168
168
/**
@@ -210,28 +210,17 @@ public String getPathWithinContext() {
210
210
*/
211
211
private static class ProtocolResolvingResourceLoader implements ResourceLoader {
212
212
213
- private static final String SERVLET_CONTEXT_RESOURCE_CLASS_NAME = "org.springframework.web.context.support.ServletContextResource" ;
214
-
215
- private static final String FILTERED_REACTIVE_WEB_CONTEXT_RESOURCE_CLASS_NAME = "org.springframework.boot.web.reactive.context.FilteredReactiveWebContextResource" ;
216
-
217
213
private final ResourceLoader resourceLoader ;
218
214
219
215
private final List <ProtocolResolver > protocolResolvers ;
220
216
221
- private final boolean preferFileResolution ;
222
-
223
- private final Class <?> servletContextResourceClass ;
224
-
225
- private final Class <?> filteredReactiveWebContextResourceClass ;
217
+ private final List <ResourceFilePathResolver > filePathResolvers ;
226
218
227
219
ProtocolResolvingResourceLoader (ResourceLoader resourceLoader , List <ProtocolResolver > protocolResolvers ,
228
- boolean preferFileResolution ) {
220
+ List < ResourceFilePathResolver > filePathResolvers ) {
229
221
this .resourceLoader = resourceLoader ;
230
222
this .protocolResolvers = protocolResolvers ;
231
- this .preferFileResolution = preferFileResolution ;
232
- this .servletContextResourceClass = resolveServletContextResourceClass (resourceLoader );
233
- this .filteredReactiveWebContextResourceClass = resolveFilteredReactiveWebContextResourceClass (
234
- resourceLoader );
223
+ this .filePathResolvers = filePathResolvers ;
235
224
}
236
225
237
226
@ Override
@@ -250,47 +239,18 @@ public Resource getResource(String location) {
250
239
}
251
240
}
252
241
Resource resource = this .resourceLoader .getResource (location );
253
- if (shouldUseFileResolution (location , resource )) {
254
- return new ApplicationResource (location );
255
- }
256
- return resource ;
257
- }
258
-
259
- private boolean shouldUseFileResolution (String location , Resource resource ) {
260
- if (!this .preferFileResolution ) {
261
- return false ;
262
- }
263
- return isClassPathResourceByPath (location , resource ) || isServletContextResource (resource )
264
- || isFilteredReactiveWebContextResource (resource );
265
- }
266
-
267
- private boolean isClassPathResourceByPath (String location , Resource resource ) {
268
- return (resource instanceof ClassPathResource ) && !location .startsWith (CLASSPATH_URL_PREFIX );
269
- }
270
-
271
- private boolean isServletContextResource (Resource resource ) {
272
- return (this .servletContextResourceClass != null ) && this .servletContextResourceClass .isInstance (resource );
273
- }
274
-
275
- private boolean isFilteredReactiveWebContextResource (Resource resource ) {
276
- return (this .filteredReactiveWebContextResourceClass != null )
277
- && this .filteredReactiveWebContextResourceClass .isInstance (resource );
242
+ String fileSystemPath = getFileSystemPath (location , resource );
243
+ return (fileSystemPath != null ) ? new ApplicationResource (fileSystemPath ) : resource ;
278
244
}
279
245
280
- private static Class <?> resolveServletContextResourceClass (ResourceLoader resourceLoader ) {
281
- return resolveClassName (SERVLET_CONTEXT_RESOURCE_CLASS_NAME , resourceLoader .getClass ().getClassLoader ());
282
- }
283
-
284
- private static Class <?> resolveFilteredReactiveWebContextResourceClass (ResourceLoader resourceLoader ) {
285
- return resolveClassName (FILTERED_REACTIVE_WEB_CONTEXT_RESOURCE_CLASS_NAME ,
286
- resourceLoader .getClass ().getClassLoader ());
287
- }
288
-
289
- private static Class <?> resolveClassName (String clazz , ClassLoader classLoader ) {
290
- if (!ClassUtils .isPresent (clazz , classLoader )) {
291
- return null ;
246
+ private String getFileSystemPath (String location , Resource resource ) {
247
+ for (ResourceFilePathResolver filePathResolver : this .filePathResolvers ) {
248
+ String filePath = filePathResolver .resolveFilePath (location , resource );
249
+ if (filePath != null ) {
250
+ return filePath ;
251
+ }
292
252
}
293
- return ClassUtils . resolveClassName ( clazz , classLoader ) ;
253
+ return null ;
294
254
}
295
255
296
256
}
0 commit comments