Refactor ResourceResolverChain + resolver class names

This change splits out resource transformation out from the
ResourceResolverChain so that chain is focused entirely on resource
resolution (as its name suggests). The invocation of transformers
is left as a separate step, it uses a different (recursive)
algorithm in any case and iterates over a different set of objects.

Also ResourceResolverChain is now limited strictly to methods that
a ResourceResolver should be able to use to delegate to remaining
resolvers.

Furthermore, ResourceResolverChain now maintains an internal index
of the "current" resolver so that resolvers don't have to pass the
chain when invoking it much like a (Servlet API) FilterChain works.
If the last resolver calls the chain again, a null value is returned.
This commit is contained in:
Rossen Stoyanchev
2013-09-26 16:51:51 -04:00
parent 0e58125b15
commit 3c48b42106
18 changed files with 227 additions and 156 deletions

View File

@@ -40,9 +40,9 @@ public class ExtensionMappingResourceResolverTests {
@Before
public void setUp() {
List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
resolvers.add(new ExtensionMappingResourceResolver());
resolvers.add(new PathExtensionResourceResolver());
resolvers.add(new PathResourceResolver());
resolver = new DefaultResourceResolverChain(resolvers, new ArrayList<ResourceTransformer>());
resolver = new DefaultResourceResolverChain(resolvers);
locations = new ArrayList<Resource>();
locations.add(new ClassPathResource("test/", getClass()));
locations.add(new ClassPathResource("testalternatepath/", getClass()));
@@ -52,7 +52,7 @@ public class ExtensionMappingResourceResolverTests {
public void resolveLessResource() throws Exception {
String resourceId = "zoo.css";
Resource resource = new ClassPathResource("test/" + resourceId + ".less", getClass());
Resource resolved = resolver.resolveAndTransform(null, resourceId, locations);
Resource resolved = resolver.resolveResource(null, resourceId, locations);
assertEquals(resource, resolved);
}
@@ -60,6 +60,6 @@ public class ExtensionMappingResourceResolverTests {
public void resolveLessUrl() {
String resourceId = "zoo.css";
String url = "zoo.css";
assertEquals(url, resolver.resolveUrl(resourceId, locations));
assertEquals(url, resolver.resolveUrlPath(resourceId, locations));
}
}

View File

@@ -48,7 +48,7 @@ public class FingerprintResourceResolverTests {
List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
resolvers.add(resolver);
resolvers.add(new PathResourceResolver());
chain = new DefaultResourceResolverChain(resolvers, new ArrayList<ResourceTransformer>());
chain = new DefaultResourceResolverChain(resolvers);
locations = new ArrayList<Resource>();
locations.add(new ClassPathResource("test/", getClass()));
locations.add(new ClassPathResource("testalternatepath/", getClass()));
@@ -59,7 +59,7 @@ public class FingerprintResourceResolverTests {
public void resolveWithoutHash() throws Exception {
String file = "bar.css";
Resource expected = new ClassPathResource("test/" + file, getClass());
Resource actual = chain.resolveAndTransform(null, file, locations);
Resource actual = chain.resolveResource(null, file, locations);
assertEquals(expected, actual);
}
@@ -67,14 +67,14 @@ public class FingerprintResourceResolverTests {
@Test
public void resolveWithHashNoMatch() throws Exception {
String file = "bogus-e36d2e05253c6c7085a91522ce43a0b4.css";
assertNull(chain.resolveAndTransform(null, file, locations));
assertNull(chain.resolveResource(null, file, locations));
}
@Test
public void resolveStaticFingerprintedResource() throws Exception {
String file = "foo-e36d2e05253c6c7085a91522ce43a0b4.css";
Resource expected = new ClassPathResource("test/"+file, getClass());
Resource actual = chain.resolveAndTransform(null, file, locations);
Resource actual = chain.resolveResource(null, file, locations);
assertEquals(expected, actual);
}
@@ -84,7 +84,7 @@ public class FingerprintResourceResolverTests {
Resource expected = new ClassPathResource("test/bar.css", getClass());
String hash = DigestUtils.md5DigestAsHex(FileCopyUtils.copyToByteArray(expected.getInputStream()));
String path = "/bar-" + hash + ".css";
Resource actual = chain.resolveAndTransform(null, path, locations);
Resource actual = chain.resolveResource(null, path, locations);
assertEquals(expected, actual);
}
@@ -94,7 +94,7 @@ public class FingerprintResourceResolverTests {
Resource expected = new ClassPathResource("test/bar.min.css", getClass());
String hash = DigestUtils.md5DigestAsHex(FileCopyUtils.copyToByteArray(expected.getInputStream()));
String path = "/bar.min-" + hash + ".css";
Resource actual = chain.resolveAndTransform(null, path, locations);
Resource actual = chain.resolveResource(null, path, locations);
assertEquals(expected, actual);
}
@@ -104,7 +104,7 @@ public class FingerprintResourceResolverTests {
Resource expected = new ClassPathResource("test/foo-bar/foo-bar.css", getClass());
String hash = DigestUtils.md5DigestAsHex(FileCopyUtils.copyToByteArray(expected.getInputStream()));
String path = "/foo-bar/foo-bar-" + hash + ".css";
Resource actual = chain.resolveAndTransform(null, path, locations);
Resource actual = chain.resolveResource(null, path, locations);
assertEquals(expected, actual);
}

View File

@@ -72,7 +72,7 @@ public class GzipResourceResolverTests {
resolvers.add(new GzipResourceResolver());
resolvers.add(new FingerprintResourceResolver());
resolvers.add(new PathResourceResolver());
resolver = new DefaultResourceResolverChain(resolvers, new ArrayList<ResourceTransformer>());
resolver = new DefaultResourceResolverChain(resolvers);
locations = new ArrayList<Resource>();
locations.add(new ClassPathResource("test/", getClass()));
locations.add(new ClassPathResource("testalternatepath/", getClass()));
@@ -85,7 +85,7 @@ public class GzipResourceResolverTests {
String file = "js/foo.js";
String gzFile = file+".gz";
Resource resource = new ClassPathResource("test/"+gzFile, getClass());
Resource resolved = resolver.resolveAndTransform(request, file, locations);
Resource resolved = resolver.resolveResource(request, file, locations);
assertEquals(resource.getDescription(), resolved.getDescription());
assertEquals(new ClassPathResource("test/"+file).getFilename(), resolved.getFilename());
@@ -100,7 +100,7 @@ public class GzipResourceResolverTests {
String file = "foo-e36d2e05253c6c7085a91522ce43a0b4.css";
String gzFile = file+".gz";
Resource resource = new ClassPathResource("test/"+gzFile, getClass());
Resource resolved = resolver.resolveAndTransform(request, file, locations);
Resource resolved = resolver.resolveResource(request, file, locations);
assertEquals(resource.getDescription(), resolved.getDescription());
assertEquals(new ClassPathResource("test/"+file).getFilename(), resolved.getFilename());

View File

@@ -86,7 +86,7 @@ public class ResourceUrlMapperTests {
@Test
public void getExtensionMappedResourceUrl() {
List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
resolvers.add(new ExtensionMappingResourceResolver());
resolvers.add(new PathExtensionResourceResolver());
resolvers.add(new PathResourceResolver());
handler.setResourceResolvers(resolvers);
resetMapper();