Add ResolvedResource in resource handling chain

Prior to this commit, the resource handling chain and its
`ResourceResolvers` would use specific `Resource` implementations in
order to add resource metadata to the HTTP response. For example,
`VersionedResource` and `EncodedResource` are both adding specific HTTP
response headers.

This commit aims at making this mechanism more stable and reusable,
since the previous implementation would fail in case a resolved resource
would be both a `VersionedResource` wrapping a `EncodedResource` (or the
other way arount). Only one of the specific implementations would
contribute its metadata since the code supporting that in
`ResourceHttpRequestHandler` would only check for `instanceof` tests,
whereas those implementations are acutally delegating calls to
the wrapped resource.

Now both `VersionedResource` and `EncodedResource` have been replaced by
specific implementations of `ResolvedResource`, which directly provides
those HTTP response headers as part of `getResponseHeaders()`.

This commit applies the same changes for the web reactive
implementations and its `ResourceWebHandler`.

Issue: SPR-14264
This commit is contained in:
Brian Clozel
2016-09-06 18:53:02 +02:00
parent 42f101fb5b
commit ccb3c44dbc
16 changed files with 138 additions and 199 deletions

View File

@@ -111,8 +111,8 @@ public class GzipResourceResolverTests {
Resource resource = new ClassPathResource("test/"+gzFile, getClass());
assertEquals(resource.getDescription(), resolved.getDescription());
assertEquals(new ClassPathResource("test/" + file).getFilename(), resolved.getFilename());
assertTrue("Expected " + resolved + " to be of type " + EncodedResource.class,
resolved instanceof EncodedResource);
assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class,
resolved instanceof ResolvedResource);
}
@Test
@@ -126,8 +126,8 @@ public class GzipResourceResolverTests {
Resource resource = new ClassPathResource("test/"+gzFile, getClass());
assertEquals(resource.getDescription(), resolved.getDescription());
assertEquals(new ClassPathResource("test/"+file).getFilename(), resolved.getFilename());
assertTrue("Expected " + resolved + " to be of type " + EncodedResource.class,
resolved instanceof EncodedResource);
assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class,
resolved instanceof ResolvedResource);
}
@Test
@@ -141,8 +141,8 @@ public class GzipResourceResolverTests {
Resource gzResource = new ClassPathResource("test/"+gzFile, getClass());
assertEquals(gzResource.getDescription(), resolved.getDescription());
assertEquals(new ClassPathResource("test/" + file).getFilename(), resolved.getFilename());
assertTrue("Expected " + resolved + " to be of type " + EncodedResource.class,
resolved instanceof EncodedResource);
assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class,
resolved instanceof ResolvedResource);
// resolved resource is now cached in CachingResourceResolver
@@ -152,8 +152,8 @@ public class GzipResourceResolverTests {
Resource resource = new ClassPathResource("test/"+file, getClass());
assertEquals(resource.getDescription(), resolved.getDescription());
assertEquals(new ClassPathResource("test/" + file).getFilename(), resolved.getFilename());
assertFalse("Expected " + resolved + " to *not* be of type " + EncodedResource.class,
resolved instanceof EncodedResource);
assertFalse("Expected " + resolved + " to *not* be of type " + ResolvedResource.class,
resolved instanceof ResolvedResource);
}
@Test // SPR-13149
@@ -165,8 +165,8 @@ public class GzipResourceResolverTests {
Resource gzResource = new ClassPathResource("test/"+gzFile, getClass());
assertEquals(gzResource.getDescription(), resolved.getDescription());
assertEquals(new ClassPathResource("test/" + file).getFilename(), resolved.getFilename());
assertTrue("Expected " + resolved + " to be of type " + EncodedResource.class,
resolved instanceof EncodedResource);
assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class,
resolved instanceof ResolvedResource);
}
}

View File

@@ -150,8 +150,8 @@ public class VersionResourceResolverTests {
Resource actual = this.resolver.resolveResourceInternal(request, versionFile, this.locations, this.chain);
assertEquals(expected.getFilename(), actual.getFilename());
verify(this.versionStrategy, times(1)).getResourceVersion(expected);
assertThat(actual, instanceOf(VersionedResource.class));
assertEquals(version, ((VersionedResource)actual).getVersion());
assertThat(actual, instanceOf(ResolvedResource.class));
assertEquals("\"" + version + "\"", ((ResolvedResource)actual).getResponseHeaders().getETag());
}
@Test