Browse Source
This change splits out a base VersionPathStrategy interface that focuses on where in the URL path the version is embedded.pull/602/merge
Rossen Stoyanchev
10 years ago
committed by
Brian Clozel
15 changed files with 303 additions and 342 deletions
@ -1,81 +0,0 @@
@@ -1,81 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2014 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 java.io.IOException; |
||||
import java.util.List; |
||||
|
||||
import org.springframework.core.io.Resource; |
||||
import org.springframework.util.DigestUtils; |
||||
import org.springframework.util.FileCopyUtils; |
||||
|
||||
/** |
||||
* A {@code VersionStrategy} that handles version strings as a Hex MD5 hash in resource file names. |
||||
* |
||||
* <p>For example the path "styles/foo-e36d2e05253c6c7085a91522ce43a0b4.css" will |
||||
* match to "styles/foo.css" assuming the hash computed from the content of |
||||
* "foo.css" matches the hash in the path. |
||||
* |
||||
* @author Jeremy Grelle |
||||
* @author Rossen Stoyanchev |
||||
* @author Sam Brannen |
||||
* @author Brian Clozel |
||||
* @since 4.1 |
||||
* @see VersionResourceResolver |
||||
*/ |
||||
public class ContentBasedVersionStrategy extends AbstractVersionStrategy { |
||||
|
||||
@Override |
||||
public String extractVersionFromPath(String requestPath) { |
||||
return extractVersionFromFilename(requestPath); |
||||
} |
||||
|
||||
@Override |
||||
public String deleteVersionFromPath(String requestPath, String candidateVersion) { |
||||
return deleteVersionFromFilename(requestPath, candidateVersion); |
||||
} |
||||
|
||||
@Override |
||||
public boolean resourceVersionMatches(Resource baseResource, String candidateVersion) { |
||||
String resourceHash = calculateHash(baseResource); |
||||
return candidateVersion.equals(resourceHash); |
||||
} |
||||
|
||||
@Override |
||||
public String addVersionToUrl(String baseUrl, List<? extends Resource> locations, ResourceResolverChain chain) { |
||||
if (logger.isTraceEnabled()) { |
||||
logger.trace("Getting the original resource to calculate hash"); |
||||
} |
||||
Resource original = chain.resolveResource(null, baseUrl, locations); |
||||
String hash = calculateHash(original); |
||||
if (logger.isTraceEnabled()) { |
||||
logger.trace("Calculated hash=" + hash); |
||||
} |
||||
return addVersionToFilename(baseUrl, hash); |
||||
} |
||||
|
||||
private String calculateHash(Resource resource) { |
||||
try { |
||||
byte[] content = FileCopyUtils.copyToByteArray(resource.getInputStream()); |
||||
return DigestUtils.md5DigestAsHex(content); |
||||
} |
||||
catch (IOException e) { |
||||
logger.error("Failed to calculate hash for resource [" + resource + "]"); |
||||
return ""; |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
/* |
||||
* Copyright 2002-2014 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 java.io.IOException; |
||||
|
||||
import org.springframework.core.io.Resource; |
||||
import org.springframework.util.DigestUtils; |
||||
import org.springframework.util.FileCopyUtils; |
||||
|
||||
/** |
||||
* A {@code VersionStrategy} that calculates an Hex MD5 hashes from the content |
||||
* of the resource and appends it to the file name, e.g. |
||||
* {@code "styles/main-e36d2e05253c6c7085a91522ce43a0b4.css"}. |
||||
* |
||||
* @author Brian Clozel |
||||
* @author Rossen Stoyanchev |
||||
* @since 4.1 |
||||
* @see VersionResourceResolver |
||||
*/ |
||||
public class ContentVersionStrategy extends AbstractVersionStrategy { |
||||
|
||||
|
||||
public ContentVersionStrategy() { |
||||
super(new FileNameVersionPathStrategy()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String getResourceVersion(Resource resource) { |
||||
try { |
||||
byte[] content = FileCopyUtils.copyToByteArray(resource.getInputStream()); |
||||
return DigestUtils.md5DigestAsHex(content); |
||||
} |
||||
catch (IOException ex) { |
||||
throw new IllegalStateException("Failed to calculate hash for resource [" + resource + "]", ex); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
/* |
||||
* Copyright 2002-2014 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; |
||||
|
||||
/** |
||||
* A strategy for extracting and embedding a resource version in its URL path. |
||||
* |
||||
* @author Brian Clozel |
||||
* @author Rossen Stoyanchev |
||||
* @since 4.1 |
||||
*/ |
||||
public interface VersionPathStrategy { |
||||
|
||||
/** |
||||
* Extract the resource version from the request path. |
||||
* @param requestPath the request path to check |
||||
* @return the version string or {@code null} if none was found |
||||
*/ |
||||
String extractVersion(String requestPath); |
||||
|
||||
/** |
||||
* Remove the version from the request path. It is assumed that the given |
||||
* version was extracted via {@link #extractVersion(String)}. |
||||
* @param requestPath the request path of the resource being resolved |
||||
* @param version the version obtained from {@link #extractVersion(String)} |
||||
* @return the request path with the version removed |
||||
*/ |
||||
String removeVersion(String requestPath, String version); |
||||
|
||||
/** |
||||
* Add a version to the given request path. |
||||
* @param requestPath the requestPath |
||||
* @param version the version |
||||
* @return the requestPath updated with a version string |
||||
*/ |
||||
String addVersion(String requestPath, String version); |
||||
|
||||
} |
Loading…
Reference in new issue