Add PathResourceResolver conditionally

The ResourceHandlerRegistration now checks if the last resolver is an
instance of PathResourceResolver and if so it skips adding it.

This change also creates and adds the VersionResourceResolver (as well
as CssLinkTransformer) the first time any VersionStrategy is
registered. This ensures that custom resolvers (including an extension
of PathResourceResolver) may be added both before and after the
VersionResourceResolver.

Lastly this change renames addVersion and addVersionHash to be
consistent with addVersionStrategy.

Issue: SPR-12124
This commit is contained in:
Rossen Stoyanchev
2014-08-27 13:30:43 -04:00
parent d47c5433cb
commit fbfb7a3c48
5 changed files with 99 additions and 76 deletions

View File

@@ -109,14 +109,13 @@ public class ResourceHandlerRegistryTests {
@Test
public void simpleResourceChain() throws Exception {
ResourceResolver mockResolver = Mockito.mock(ResourceResolver.class);
ResourceTransformer mockTransformer = Mockito.mock(ResourceTransformer.class);
this.registration.addResolver(mockResolver).addTransformer(mockTransformer);
ResourceHttpRequestHandler handler = getHandler("/resources/**");
List<ResourceResolver> resolvers = handler.getResourceResolvers();
assertThat(resolvers, Matchers.hasSize(3));
assertThat(resolvers.toString(), resolvers, Matchers.hasSize(3));
assertThat(resolvers.get(0), Matchers.instanceOf(CachingResourceResolver.class));
CachingResourceResolver cachingResolver = (CachingResourceResolver) resolvers.get(0);
assertThat(cachingResolver.getCache(), Matchers.instanceOf(ConcurrentMapCache.class));
@@ -146,15 +145,16 @@ public class ResourceHandlerRegistryTests {
public void versionResourceChain() throws Exception {
this.registration
.addTransformer(new AppCacheManifestTransfomer())
.addVersion("fixed", "/**/*.js")
.addVersionHash("/**");
.addFixedVersionStrategy("fixed", "/**/*.js")
.addContentVersionStrategy("/**");
ResourceHttpRequestHandler handler = getHandler("/resources/**");
List<ResourceResolver> resolvers = handler.getResourceResolvers();
assertThat(resolvers, Matchers.hasSize(3));
assertThat(resolvers.toString(), resolvers, Matchers.hasSize(3));
assertThat(resolvers.get(0), Matchers.instanceOf(CachingResourceResolver.class));
assertThat(resolvers.get(1), Matchers.instanceOf(VersionResourceResolver.class));
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(resolvers.get(1));
@SuppressWarnings("unchecked")
Map<String, VersionStrategy> strategies =
(Map<String, VersionStrategy>) fieldAccessor.getPropertyValue("versionStrategyMap");
assertNotNull(strategies.get("/**/*.js"));
@@ -164,8 +164,8 @@ public class ResourceHandlerRegistryTests {
List<ResourceTransformer> transformers = handler.getResourceTransformers();
assertThat(transformers, Matchers.hasSize(3));
assertThat(transformers.get(0), Matchers.instanceOf(CachingResourceTransformer.class));
assertThat(transformers.get(1), Matchers.instanceOf(CssLinkResourceTransformer.class));
assertThat(transformers.get(2), Matchers.instanceOf(AppCacheManifestTransfomer.class));
assertThat(transformers.get(1), Matchers.instanceOf(AppCacheManifestTransfomer.class));
assertThat(transformers.get(2), Matchers.instanceOf(CssLinkResourceTransformer.class));
}
@Test
@@ -176,22 +176,23 @@ public class ResourceHandlerRegistryTests {
.addTransformer(cachingTransformer)
.addTransformer(new AppCacheManifestTransfomer())
.addResolver(cachingResolver)
.addVersion("fixed", "/**/*.js")
.addVersionHash("/**")
.addFixedVersionStrategy("fixed", "/**/*.js")
.addContentVersionStrategy("/**")
.addResolver(new CustomPathResourceResolver())
.setCachePeriod(3600);
ResourceHttpRequestHandler handler = getHandler("/resources/**");
List<ResourceResolver> resolvers = handler.getResourceResolvers();
assertThat(resolvers, Matchers.hasSize(3));
assertThat(resolvers.toString(), resolvers, Matchers.hasSize(3));
assertThat(resolvers.get(0), Matchers.equalTo(cachingResolver));
assertThat(resolvers.get(1), Matchers.instanceOf(VersionResourceResolver.class));
assertThat(resolvers.get(2), Matchers.instanceOf(PathResourceResolver.class));
assertThat(resolvers.get(2), Matchers.instanceOf(CustomPathResourceResolver.class));
List<ResourceTransformer> transformers = handler.getResourceTransformers();
assertThat(transformers, Matchers.hasSize(3));
assertThat(transformers.get(0), Matchers.equalTo(cachingTransformer));
assertThat(transformers.get(1), Matchers.instanceOf(CssLinkResourceTransformer.class));
assertThat(transformers.get(2), Matchers.instanceOf(AppCacheManifestTransfomer.class));
assertThat(transformers.get(1), Matchers.instanceOf(AppCacheManifestTransfomer.class));
assertThat(transformers.get(2), Matchers.instanceOf(CssLinkResourceTransformer.class));
}
private ResourceHttpRequestHandler getHandler(String pathPattern) {
@@ -199,4 +200,9 @@ public class ResourceHandlerRegistryTests {
return (ResourceHttpRequestHandler) handlerMapping.getUrlMap().get(pathPattern);
}
private static class CustomPathResourceResolver extends PathResourceResolver {
}
}

View File

@@ -113,7 +113,7 @@ public class ResourceUrlProviderJavaConfigTests {
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("classpath:org/springframework/web/servlet/resource/test/")
.addVersionHash("/**");
.addContentVersionStrategy("/**");
}
}