Rename ResolvedResource to HttpResource

`ResolvedResource` is a rather generic name - changing the extended
interface to something more meaningful: `HttpResource`.
For now, implementations are linked with the resource handling chain,
but this aspect has been removed from the interface documentation.

Issue: SPR-14264
This commit is contained in:
Brian Clozel 2016-09-09 18:18:09 +02:00
parent 2f2e6dffb4
commit 4588b6c9f4
14 changed files with 82 additions and 94 deletions

View File

@ -75,7 +75,7 @@ public class GzipResourceResolver extends AbstractResourceResolver {
}
private static final class GzippedResource extends AbstractResource implements ResolvedResource {
private static final class GzippedResource extends AbstractResource implements HttpResource {
private final Resource original;
@ -142,8 +142,8 @@ public class GzipResourceResolver extends AbstractResourceResolver {
@Override
public HttpHeaders getResponseHeaders() {
HttpHeaders headers;
if(this.original instanceof ResolvedResource) {
headers = ((ResolvedResource) this.original).getResponseHeaders();
if(this.original instanceof HttpResource) {
headers = ((HttpResource) this.original).getResponseHeaders();
}
else {
headers = new HttpHeaders();

View File

@ -0,0 +1,21 @@
package org.springframework.web.reactive.resource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
/**
* Extended interface for a {@link Resource} to be written to an
* HTTP response.
*
* @author Brian Clozel
* @since 5.0
*/
public interface HttpResource extends Resource {
/**
* The HTTP headers to be contributed to the HTTP response
* that serves the current resource.
* @return the HTTP response headers
*/
HttpHeaders getResponseHeaders();
}

View File

@ -1,27 +0,0 @@
package org.springframework.web.reactive.resource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
/**
* Interface for resources resolved through the
* {@link org.springframework.web.reactive.resource.ResourceResolverChain}
* that may contribute HTTP response headers as they're served to HTTP clients.
*
* <p>Some resource implementations, while served by the
* {@link org.springframework.web.reactive.resource.ResourceResolverChain} need
* to contribute resource metadata as HTTP response headers so that HTTP clients
* can interpret them properly.
*
* @author Brian Clozel
* @since 5.0
*/
public interface ResolvedResource extends Resource {
/**
* The HTTP headers to be contributed to the HTTP response
* that serves the current resource.
* @return the HTTP response headers
*/
HttpHeaders getResponseHeaders();
}

View File

@ -482,8 +482,8 @@ public class ResourceWebHandler
if (mediaType != null) {
headers.setContentType(mediaType);
}
if (resource instanceof ResolvedResource) {
HttpHeaders resourceHeaders = ((ResolvedResource) resource).getResponseHeaders();
if (resource instanceof HttpResource) {
HttpHeaders resourceHeaders = ((HttpResource) resource).getResponseHeaders();
exchange.getResponse().getHeaders().putAll(resourceHeaders);
}
headers.set(HttpHeaders.ACCEPT_RANGES, "bytes");

View File

@ -242,7 +242,7 @@ public class VersionResourceResolver extends AbstractResourceResolver {
}
private class FileNameVersionedResource extends AbstractResource implements ResolvedResource {
private class FileNameVersionedResource extends AbstractResource implements HttpResource {
private final Resource original;
@ -321,8 +321,8 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@Override
public HttpHeaders getResponseHeaders() {
HttpHeaders headers;
if(this.original instanceof ResolvedResource) {
headers = ((ResolvedResource) this.original).getResponseHeaders();
if(this.original instanceof HttpResource) {
headers = ((HttpResource) this.original).getResponseHeaders();
}
else {
headers = new HttpHeaders();

View File

@ -123,8 +123,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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
@Test
@ -137,8 +137,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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
@Test
@ -151,8 +151,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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
// resolved resource is now cached in CachingResourceResolver
@ -165,8 +165,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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertFalse("Expected " + resolved + " to *not* be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
@Test // SPR-13149
@ -178,7 +178,7 @@ 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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
}

View File

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

View File

@ -78,7 +78,7 @@ public class GzipResourceResolver extends AbstractResourceResolver {
}
private static final class GzippedResource extends AbstractResource implements ResolvedResource {
private static final class GzippedResource extends AbstractResource implements HttpResource {
private final Resource original;
@ -145,8 +145,8 @@ public class GzipResourceResolver extends AbstractResourceResolver {
@Override
public HttpHeaders getResponseHeaders() {
HttpHeaders headers;
if(this.original instanceof ResolvedResource) {
headers = ((ResolvedResource) this.original).getResponseHeaders();
if(this.original instanceof HttpResource) {
headers = ((HttpResource) this.original).getResponseHeaders();
}
else {
headers = new HttpHeaders();

View File

@ -0,0 +1,21 @@
package org.springframework.web.servlet.resource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
/**
* Extended interface for a {@link Resource} to be written to an
* HTTP response.
*
* @author Brian Clozel
* @since 5.0
*/
public interface HttpResource extends Resource {
/**
* The HTTP headers to be contributed to the HTTP response
* that serves the current resource.
* @return the HTTP response headers
*/
HttpHeaders getResponseHeaders();
}

View File

@ -1,27 +0,0 @@
package org.springframework.web.servlet.resource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
/**
* Interface for resources resolved through the
* {@link org.springframework.web.servlet.resource.ResourceResolverChain}
* that may contribute HTTP response headers as they're served to HTTP clients.
*
* <p>Some resource implementations, while served by the
* {@link org.springframework.web.servlet.resource.ResourceResolverChain} need
* to contribute resource metadata as HTTP response headers so that HTTP clients
* can interpret them properly.
*
* @author Brian Clozel
* @since 5.0
*/
public interface ResolvedResource extends Resource {
/**
* The HTTP headers to be contributed to the HTTP response
* that serves the current resource.
* @return the HTTP response headers
*/
HttpHeaders getResponseHeaders();
}

View File

@ -542,8 +542,8 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
if (mediaType != null) {
response.setContentType(mediaType.toString());
}
if (resource instanceof ResolvedResource) {
HttpHeaders resourceHeaders = ((ResolvedResource) resource).getResponseHeaders();
if (resource instanceof HttpResource) {
HttpHeaders resourceHeaders = ((HttpResource) resource).getResponseHeaders();
resourceHeaders.toSingleValueMap().entrySet()
.stream().forEach(entry -> response.setHeader(entry.getKey(), entry.getValue()));
}

View File

@ -239,7 +239,7 @@ public class VersionResourceResolver extends AbstractResourceResolver {
}
private class FileNameVersionedResource extends AbstractResource implements ResolvedResource {
private class FileNameVersionedResource extends AbstractResource implements HttpResource {
private final Resource original;
@ -318,8 +318,8 @@ public class VersionResourceResolver extends AbstractResourceResolver {
@Override
public HttpHeaders getResponseHeaders() {
HttpHeaders headers;
if(this.original instanceof ResolvedResource) {
headers = ((ResolvedResource) this.original).getResponseHeaders();
if(this.original instanceof HttpResource) {
headers = ((HttpResource) this.original).getResponseHeaders();
}
else {
headers = new HttpHeaders();

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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
@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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
@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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
// 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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertFalse("Expected " + resolved + " to *not* be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
@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 " + ResolvedResource.class,
resolved instanceof ResolvedResource);
assertTrue("Expected " + resolved + " to be of type " + HttpResource.class,
resolved instanceof HttpResource);
}
}

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(ResolvedResource.class));
assertEquals("\"" + version + "\"", ((ResolvedResource)actual).getResponseHeaders().getETag());
assertThat(actual, instanceOf(HttpResource.class));
assertEquals("\"" + version + "\"", ((HttpResource)actual).getResponseHeaders().getETag());
}
@Test