Repository: wicket Updated Branches: refs/heads/master f6a22ae3d -> cd24f18a2
WICKET-5581 CachingResourceStreamLocator is not extension-aware Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/cd24f18a Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/cd24f18a Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/cd24f18a Branch: refs/heads/master Commit: cd24f18a2f2667857a5e5b86744bf1e129d7bba8 Parents: f6a22ae Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Tue May 20 23:01:10 2014 +0300 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue May 20 23:01:10 2014 +0300 ---------------------------------------------------------------------- .../caching/CachingResourceStreamLocator.java | 47 ++++++++++++++++++-- .../request/resource/ResourceReference.java | 2 +- .../CachingResourceStreamLocatorTest.java | 38 +++++++++++++--- 3 files changed, 76 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/cd24f18a/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/caching/CachingResourceStreamLocator.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/caching/CachingResourceStreamLocator.java b/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/caching/CachingResourceStreamLocator.java index a3f7c4f..93fb0b3 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/caching/CachingResourceStreamLocator.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/resource/locator/caching/CachingResourceStreamLocator.java @@ -43,7 +43,7 @@ import org.apache.wicket.util.resource.IResourceStream; */ public class CachingResourceStreamLocator implements IResourceStreamLocator { - private final ConcurrentMap<Key, IResourceStreamReference> cache; + private final ConcurrentMap<CacheKey, IResourceStreamReference> cache; private final IResourceStreamLocator delegate; @@ -73,7 +73,7 @@ public class CachingResourceStreamLocator implements IResourceStreamLocator @Override public IResourceStream locate(Class<?> clazz, String path) { - Key key = new Key(clazz.getName(), path, null, null, null); + CacheKey key = new CacheKey(clazz.getName(), path, null, null, null, null); IResourceStreamReference resourceStreamReference = cache.get(key); final IResourceStream result; @@ -91,7 +91,7 @@ public class CachingResourceStreamLocator implements IResourceStreamLocator return result; } - private void updateCache(Key key, IResourceStream stream) + private void updateCache(CacheKey key, IResourceStream stream) { if (null == stream) { @@ -113,7 +113,7 @@ public class CachingResourceStreamLocator implements IResourceStreamLocator public IResourceStream locate(Class<?> scope, String path, String style, String variation, Locale locale, String extension, boolean strict) { - Key key = new Key(scope.getName(), path, locale, style, variation); + CacheKey key = new CacheKey(scope.getName(), path, extension, locale, style, variation); IResourceStreamReference resourceStreamReference = cache.get(key); final IResourceStream result; @@ -143,4 +143,43 @@ public class CachingResourceStreamLocator implements IResourceStreamLocator cache.clear(); } + /** + * A specialization of {@link org.apache.wicket.request.resource.ResourceReference.Key} that + * additionally takes the file extension into account + */ + private static class CacheKey extends Key + { + /** + * The file extension + */ + private final String extension; + + private CacheKey(String scope, String name, String extension, Locale locale, String style, String variation) + { + super(scope, name, locale, style, variation); + + this.extension = extension; + } + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + + CacheKey cacheKey = (CacheKey) o; + + return !(extension != null ? !extension.equals(cacheKey.extension) : cacheKey.extension != null); + + } + + @Override + public int hashCode() + { + int result = super.hashCode(); + result = 31 * result + (extension != null ? extension.hashCode() : 0); + return result; + } + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/cd24f18a/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReference.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReference.java index 04dd8b9..ad64d25 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReference.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReference.java @@ -336,7 +336,7 @@ public abstract class ResourceReference implements IClusterable /** * A (re-usable) data store for all relevant ResourceReference data */ - public final static class Key implements Serializable + public static class Key implements Serializable { private static final long serialVersionUID = 1L; http://git-wip-us.apache.org/repos/asf/wicket/blob/cd24f18a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java b/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java index 9f50fe7..65ea0ad 100644 --- a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java @@ -32,9 +32,9 @@ import org.apache.wicket.core.util.resource.locator.caching.CachingResourceStrea import org.junit.Test; /** + * Tests for CachingResourceStreamLocator + * * <a href="https://issues.apache.org/jira/browse/WICKET-3511">WICKET-3511</a> - * - * @author mgrigorov */ public class CachingResourceStreamLocatorTest { @@ -70,18 +70,44 @@ public class CachingResourceStreamLocatorTest FileResourceStream frs = new FileResourceStream(new File(".")); when( - resourceStreamLocator.locate(String.class, "path", "style", "variation", null, - "extension", true)).thenReturn(frs); + resourceStreamLocator.locate(String.class, "path", "style", "variation", null, + "extension", true)).thenReturn(frs); CachingResourceStreamLocator cachingLocator = new CachingResourceStreamLocator( - resourceStreamLocator); + resourceStreamLocator); cachingLocator.locate(String.class, "path", "style", "variation", null, "extension", true); cachingLocator.locate(String.class, "path", "style", "variation", null, "extension", true); // there is a file resource with that Key so expect just one call to the delegate verify(resourceStreamLocator, times(1)).locate(String.class, "path", "style", "variation", - null, "extension", true); + null, "extension", true); + } + + /** + * Tests two FileResourceStreamReferences with different extensions + */ + @Test + public void fileResourceDifferentExtensions() + { + IResourceStreamLocator resourceStreamLocator = mock(IResourceStreamLocator.class); + + FileResourceStream frs = new FileResourceStream(new File(".")); + + when(resourceStreamLocator.locate(String.class, "path", "style", "variation", null, + "extension", true)).thenReturn(frs); + + CachingResourceStreamLocator cachingLocator = new CachingResourceStreamLocator(resourceStreamLocator); + + cachingLocator.locate(String.class, "path", "style", "variation", null, "extension", true); + cachingLocator.locate(String.class, "path", "style", "variation", null, "extension", true); + cachingLocator.locate(String.class, "path", "style", "variation", null, "extension2", true); + + // there is a file resource with that Key so expect just one call to the delegate + verify(resourceStreamLocator, times(1)).locate(String.class, "path", "style", "variation", + null, "extension", true); + verify(resourceStreamLocator, times(1)).locate(String.class, "path", "style", "variation", + null, "extension2", true); } /**
