From ccb3c44dbcd4ab4741aec7b366ed43efa2f90b44 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 6 Sep 2016 18:53:02 +0200 Subject: [PATCH] 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 --- .../reactive/resource/EncodedResource.java | 43 ------------------- .../resource/GzipResourceResolver.java | 16 +++++-- .../reactive/resource/ResolvedResource.java | 27 ++++++++++++ .../reactive/resource/ResourceWebHandler.java | 8 ++-- .../resource/VersionResourceResolver.java | 15 +++++-- .../reactive/resource/VersionedResource.java | 34 --------------- .../resource/GzipResourceResolverTests.java | 20 ++++----- .../VersionResourceResolverTests.java | 4 +- .../web/servlet/resource/EncodedResource.java | 43 ------------------- .../resource/GzipResourceResolver.java | 18 ++++++-- .../servlet/resource/ResolvedResource.java | 27 ++++++++++++ .../resource/ResourceHttpRequestHandler.java | 9 ++-- .../resource/VersionResourceResolver.java | 16 +++++-- .../servlet/resource/VersionedResource.java | 33 -------------- .../resource/GzipResourceResolverTests.java | 20 ++++----- .../VersionResourceResolverTests.java | 4 +- 16 files changed, 138 insertions(+), 199 deletions(-) delete mode 100644 spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/EncodedResource.java create mode 100644 spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResolvedResource.java delete mode 100644 spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionedResource.java delete mode 100644 spring-webmvc/src/main/java/org/springframework/web/servlet/resource/EncodedResource.java create mode 100644 spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResolvedResource.java delete mode 100644 spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionedResource.java diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/EncodedResource.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/EncodedResource.java deleted file mode 100644 index 20a603bc306..00000000000 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/EncodedResource.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2002-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.web.reactive.resource; - -import org.springframework.core.io.Resource; - -/** - * Interface for a resource descriptor that describes the encoding - * applied to the entire resource content. - * - *

This information is required if the client consuming that resource - * needs additional decoding capabilities to retrieve the resource's content. - * - * @author Rossen Stoyanchev - * @since 5.0 - * @see - * HTTP/1.1: Semantics and Content, section 3.1.2.2 - */ -public interface EncodedResource extends Resource { - - /** - * The content coding value, as defined in the IANA registry - * @return the content encoding - * @see HTTP/1.1: Semantics - * and Content, section 3.1.2.1 - */ - String getContentEncoding(); - -} diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/GzipResourceResolver.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/GzipResourceResolver.java index cc1f2218c68..c73579cfa5e 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/GzipResourceResolver.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/GzipResourceResolver.java @@ -25,6 +25,7 @@ import java.util.List; import org.springframework.core.io.AbstractResource; import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; import org.springframework.web.server.ServerWebExchange; /** @@ -74,7 +75,7 @@ public class GzipResourceResolver extends AbstractResourceResolver { } - private static final class GzippedResource extends AbstractResource implements EncodedResource { + private static final class GzippedResource extends AbstractResource implements ResolvedResource { private final Resource original; @@ -138,8 +139,17 @@ public class GzipResourceResolver extends AbstractResourceResolver { return this.gzipped.getDescription(); } - public String getContentEncoding() { - return "gzip"; + @Override + public HttpHeaders getResponseHeaders() { + HttpHeaders headers; + if(this.original instanceof ResolvedResource) { + headers = ((ResolvedResource) this.original).getResponseHeaders(); + } + else { + headers = new HttpHeaders(); + } + headers.add(HttpHeaders.CONTENT_ENCODING, "gzip"); + return headers; } } diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResolvedResource.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResolvedResource.java new file mode 100644 index 00000000000..edf6f052172 --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResolvedResource.java @@ -0,0 +1,27 @@ +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. + * + *

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(); +} diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java index 8be303f20f5..bd7fbe7bad0 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java @@ -482,11 +482,9 @@ public class ResourceWebHandler if (mediaType != null) { headers.setContentType(mediaType); } - if (resource instanceof EncodedResource) { - headers.set(HttpHeaders.CONTENT_ENCODING, ((EncodedResource) resource).getContentEncoding()); - } - if (resource instanceof VersionedResource) { - headers.setETag("\"" + ((VersionedResource) resource).getVersion() + "\""); + if (resource instanceof ResolvedResource) { + HttpHeaders resourceHeaders = ((ResolvedResource) resource).getResponseHeaders(); + exchange.getResponse().getHeaders().putAll(resourceHeaders); } headers.set(HttpHeaders.ACCEPT_RANGES, "bytes"); } diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java index bf71c5507d8..39ee7775cb5 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java @@ -31,6 +31,7 @@ import java.util.Map; import org.springframework.core.io.AbstractResource; import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; import org.springframework.util.AntPathMatcher; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; @@ -241,7 +242,7 @@ public class VersionResourceResolver extends AbstractResourceResolver { } - private class FileNameVersionedResource extends AbstractResource implements VersionedResource { + private class FileNameVersionedResource extends AbstractResource implements ResolvedResource { private final Resource original; @@ -318,8 +319,16 @@ public class VersionResourceResolver extends AbstractResourceResolver { } @Override - public String getVersion() { - return this.version; + public HttpHeaders getResponseHeaders() { + HttpHeaders headers; + if(this.original instanceof ResolvedResource) { + headers = ((ResolvedResource) this.original).getResponseHeaders(); + } + else { + headers = new HttpHeaders(); + } + headers.setETag("\"" + this.version + "\""); + return headers; } } diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionedResource.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionedResource.java deleted file mode 100644 index da44b3d1081..00000000000 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/VersionedResource.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2002-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.web.reactive.resource; - -import org.springframework.core.io.Resource; - -/** - * Interface for a resource descriptor that describes its version with a - * version string that can be derived from its content and/or metadata. - * - * @author Rossen Stoyanchev - * @author Brian Clozel - * @since 5.0 - * @see VersionResourceResolver - */ -public interface VersionedResource extends Resource { - - String getVersion(); - -} diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/GzipResourceResolverTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/GzipResourceResolverTests.java index 2b58179fb87..79de27aaebb 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/GzipResourceResolverTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/GzipResourceResolverTests.java @@ -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 " + EncodedResource.class, - resolved instanceof EncodedResource); + assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class, + resolved instanceof ResolvedResource); } @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 " + EncodedResource.class, - resolved instanceof EncodedResource); + assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class, + resolved instanceof ResolvedResource); } @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 " + EncodedResource.class, - resolved instanceof EncodedResource); + assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class, + resolved instanceof ResolvedResource); // 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 " + EncodedResource.class, - resolved instanceof EncodedResource); + assertFalse("Expected " + resolved + " to *not* be of type " + ResolvedResource.class, + resolved instanceof ResolvedResource); } @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 " + EncodedResource.class, - resolved instanceof EncodedResource); + assertTrue("Expected " + resolved + " to be of type " + ResolvedResource.class, + resolved instanceof ResolvedResource); } } diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/VersionResourceResolverTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/VersionResourceResolverTests.java index 4a868f082e9..948e89519a3 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/VersionResourceResolverTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/VersionResourceResolverTests.java @@ -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(VersionedResource.class)); - assertEquals(version, ((VersionedResource)actual).getVersion()); + assertThat(actual, instanceOf(ResolvedResource.class)); + assertEquals("\"" + version + "\"", ((ResolvedResource)actual).getResponseHeaders().getETag()); } @Test diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/EncodedResource.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/EncodedResource.java deleted file mode 100644 index e3b44e25731..00000000000 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/EncodedResource.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2002-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.web.servlet.resource; - -import org.springframework.core.io.Resource; - -/** - * Interface for a resource descriptor that describes the encoding - * applied to the entire resource content. - * - *

This information is required if the client consuming that resource - * needs additional decoding capabilities to retrieve the resource's content. - * - * @author Jeremy Grelle - * @since 4.1 - * @see HTTP/1.1: Semantics - * and Content, section 3.1.2.2 - */ -public interface EncodedResource extends Resource { - - /** - * The content coding value, as defined in the IANA registry - * @return the content encoding - * @see HTTP/1.1: Semantics - * and Content, section 3.1.2.1 - */ - String getContentEncoding(); - -} diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/GzipResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/GzipResourceResolver.java index 4187758514c..040644fd4a5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/GzipResourceResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/GzipResourceResolver.java @@ -22,10 +22,12 @@ import java.io.InputStream; import java.net.URI; import java.net.URL; import java.util.List; + import javax.servlet.http.HttpServletRequest; import org.springframework.core.io.AbstractResource; import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; /** * A {@code ResourceResolver} that delegates to the chain to locate a resource @@ -76,7 +78,7 @@ public class GzipResourceResolver extends AbstractResourceResolver { } - private static final class GzippedResource extends AbstractResource implements EncodedResource { + private static final class GzippedResource extends AbstractResource implements ResolvedResource { private final Resource original; @@ -140,9 +142,19 @@ public class GzipResourceResolver extends AbstractResourceResolver { return this.gzipped.getDescription(); } - public String getContentEncoding() { - return "gzip"; + @Override + public HttpHeaders getResponseHeaders() { + HttpHeaders headers; + if(this.original instanceof ResolvedResource) { + headers = ((ResolvedResource) this.original).getResponseHeaders(); + } + else { + headers = new HttpHeaders(); + } + headers.add(HttpHeaders.CONTENT_ENCODING, "gzip"); + return headers; } + } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResolvedResource.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResolvedResource.java new file mode 100644 index 00000000000..fd1261cc5c1 --- /dev/null +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResolvedResource.java @@ -0,0 +1,27 @@ +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. + * + *

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(); +} diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java index e779bef52db..0b6fc850bb3 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java @@ -542,11 +542,10 @@ public class ResourceHttpRequestHandler extends WebContentGenerator if (mediaType != null) { response.setContentType(mediaType.toString()); } - if (resource instanceof EncodedResource) { - response.setHeader(HttpHeaders.CONTENT_ENCODING, ((EncodedResource) resource).getContentEncoding()); - } - if (resource instanceof VersionedResource) { - response.setHeader(HttpHeaders.ETAG, "\"" + ((VersionedResource) resource).getVersion() + "\""); + if (resource instanceof ResolvedResource) { + HttpHeaders resourceHeaders = ((ResolvedResource) resource).getResponseHeaders(); + resourceHeaders.toSingleValueMap().entrySet() + .stream().forEach(entry -> response.setHeader(entry.getKey(), entry.getValue())); } response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes"); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionResourceResolver.java index 5f897f7f9d4..ad9f45ca221 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionResourceResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionResourceResolver.java @@ -32,6 +32,7 @@ import javax.servlet.http.HttpServletRequest; import org.springframework.core.io.AbstractResource; import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; import org.springframework.util.AntPathMatcher; import org.springframework.util.StringUtils; @@ -238,7 +239,7 @@ public class VersionResourceResolver extends AbstractResourceResolver { } - private class FileNameVersionedResource extends AbstractResource implements VersionedResource { + private class FileNameVersionedResource extends AbstractResource implements ResolvedResource { private final Resource original; @@ -315,9 +316,18 @@ public class VersionResourceResolver extends AbstractResourceResolver { } @Override - public String getVersion() { - return this.version; + public HttpHeaders getResponseHeaders() { + HttpHeaders headers; + if(this.original instanceof ResolvedResource) { + headers = ((ResolvedResource) this.original).getResponseHeaders(); + } + else { + headers = new HttpHeaders(); + } + headers.setETag("\"" + this.version + "\""); + return headers; } + } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionedResource.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionedResource.java deleted file mode 100644 index c780df8c891..00000000000 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/VersionedResource.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2002-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.web.servlet.resource; - -import org.springframework.core.io.Resource; - -/** - * Interface for a resource descriptor that describes its version with a - * version string that can be derived from its content and/or metadata. - * - * @author Brian Clozel - * @since 4.2.5 - * @see VersionResourceResolver - */ -public interface VersionedResource extends Resource { - - String getVersion(); - -} diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/GzipResourceResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/GzipResourceResolverTests.java index a3e9c64fec7..cbbfd384771 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/GzipResourceResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/GzipResourceResolverTests.java @@ -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); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java index a38f416f4b8..65f9d108651 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java @@ -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