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);
        }
 
        /**

Reply via email to