Repository: wicket
Updated Branches:
  refs/heads/wicket-6.x 6fc822d0b -> c49d2044b


WICKET-5581 CachingResourceStreamLocator is not extension-aware

(cherry picked from commit cd24f18a2f2667857a5e5b86744bf1e129d7bba8)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c49d2044
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c49d2044
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c49d2044

Branch: refs/heads/wicket-6.x
Commit: c49d2044b48536a22bedd5568172ac54c2f0f198
Parents: 6fc822d
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:03:09 2014 +0300

----------------------------------------------------------------------
 .../caching/CachingResourceStreamLocator.java   | 50 ++++++++++++++++++--
 .../request/resource/ResourceReference.java     |  2 +-
 .../CachingResourceStreamLocatorTest.java       | 38 ++++++++++++---
 3 files changed, 78 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/c49d2044/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 74fa3c0..de2ec65 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;
 
@@ -59,7 +59,7 @@ public class CachingResourceStreamLocator implements 
IResourceStreamLocator
 
                delegate = resourceStreamLocator;
 
-               cache = new ConcurrentHashMap<Key, IResourceStreamReference>();
+               cache = new ConcurrentHashMap<CacheKey, 
IResourceStreamReference>();
        }
 
        /**
@@ -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;
@@ -142,4 +142,44 @@ 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/c49d2044/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 b936115..87ae806 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
@@ -335,7 +335,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/c49d2044/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);
        }
 
        /**

Reply via email to