@Override protected Mono<String> resolveUrlPathInternal(String resourceUrlPath, List<? extends Resource> locations, ResourceResolverChain chain) { return chain.resolveUrlPath(resourceUrlPath, locations) .flatMap(baseUrl -> { if (StringUtils.hasText(baseUrl)) { VersionStrategy strategy = getStrategyForPath(resourceUrlPath); if (strategy == null) { return Mono.just(baseUrl); } return chain.resolveResource(null, baseUrl, locations) .flatMap(resource -> strategy.getResourceVersion(resource) .map(version -> strategy.addVersion(baseUrl, version))); } return Mono.empty(); }); }
private Mono<Resource> resolveVersionedResource(@Nullable ServerWebExchange exchange, String requestPath, List<? extends Resource> locations, ResourceResolverChain chain) { VersionStrategy versionStrategy = getStrategyForPath(requestPath); if (versionStrategy == null) { return Mono.empty(); } String candidate = versionStrategy.extractVersion(requestPath); if (StringUtils.isEmpty(candidate)) { return Mono.empty(); } String simplePath = versionStrategy.removeVersion(requestPath, candidate); return chain.resolveResource(exchange, simplePath, locations) .filterWhen(resource -> versionStrategy.getResourceVersion(resource) .map(actual -> { if (candidate.equals(actual)) { return true; } else { if (logger.isTraceEnabled()) { String logPrefix = exchange != null ? exchange.getLogPrefix() : ""; logger.trace(logPrefix + "Found resource for \"" + requestPath + "\", but version [" + candidate + "] does not match"); } return false; } })) .map(resource -> new FileNameVersionedResource(resource, candidate)); }
@Test // SPR-13883 public void shouldConfigureFixedPrefixAutomatically() { this.resolver.addFixedVersionStrategy("fixedversion", "/js/**", "/css/**", "/fixedversion/css/**"); assertThat(this.resolver.getStrategyMap().size(), is(4)); assertThat(this.resolver.getStrategyForPath("js/something.js"), Matchers.instanceOf(FixedVersionStrategy.class)); assertThat(this.resolver.getStrategyForPath("fixedversion/js/something.js"), Matchers.instanceOf(FixedVersionStrategy.class)); assertThat(this.resolver.getStrategyForPath("css/something.css"), Matchers.instanceOf(FixedVersionStrategy.class)); assertThat(this.resolver.getStrategyForPath("fixedversion/css/something.css"), Matchers.instanceOf(FixedVersionStrategy.class)); }
@Test public void getStrategyForPath() { Map<String, VersionStrategy> strategies = new HashMap<>(); VersionStrategy jsStrategy = mock(VersionStrategy.class); VersionStrategy catchAllStrategy = mock(VersionStrategy.class); strategies.put("/**", catchAllStrategy); strategies.put("/**/*.js", jsStrategy); this.resolver.setStrategyMap(strategies); assertEquals(catchAllStrategy, this.resolver.getStrategyForPath("foo.css")); assertEquals(catchAllStrategy, this.resolver.getStrategyForPath("foo-js.css")); assertEquals(jsStrategy, this.resolver.getStrategyForPath("foo.js")); assertEquals(jsStrategy, this.resolver.getStrategyForPath("bar/foo.js")); }
@Override protected Mono<String> resolveUrlPathInternal(String resourceUrlPath, List<? extends Resource> locations, ResourceResolverChain chain) { return chain.resolveUrlPath(resourceUrlPath, locations) .then(baseUrl -> { if (StringUtils.hasText(baseUrl)) { VersionStrategy versionStrategy = getStrategyForPath(resourceUrlPath); if (versionStrategy == null) { return Mono.empty(); } if (logger.isTraceEnabled()) { logger.trace("Getting the original resource to determine version " + "for path \"" + resourceUrlPath + "\""); } return chain.resolveResource(null, baseUrl, locations) .map(resource -> { String version = versionStrategy.getResourceVersion(resource); if (logger.isTraceEnabled()) { logger.trace("Determined version [" + version + "] for " + resource); } return versionStrategy.addVersion(baseUrl, version); }); } return Mono.empty(); }); }
private Mono<Resource> resolveVersionedResource(ServerWebExchange exchange, String requestPath, List<? extends Resource> locations, ResourceResolverChain chain) { VersionStrategy versionStrategy = getStrategyForPath(requestPath); if (versionStrategy == null) { return Mono.empty();