You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/10/10 00:44:04 UTC

git commit: ISIS-902: first-cut impl.

Repository: isis
Updated Branches:
  refs/heads/ISIS-902 [created] 9cc514d12


ISIS-902: first-cut impl.


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

Branch: refs/heads/ISIS-902
Commit: 9cc514d12e5c6bf3890f3b8025233e6ba7e3b243
Parents: 81c34b3
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Oct 9 23:43:35 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Oct 9 23:43:35 2014 +0100

----------------------------------------------------------------------
 .../imagecache/ImageResourceCacheClassPath.java | 244 ++++++++++++++-----
 .../wicket/viewer/imagecache/KeyTest.java       | 162 ++++++++++++
 .../todoapp/dom/src/main/java/app/Dashboard.png | Bin 0 -> 684 bytes
 .../src/main/java/dom/todo/ToDoItem-done.png    | Bin 0 -> 1363 bytes
 .../src/main/java/dom/todo/ToDoItem-todo.png    | Bin 0 -> 971 bytes
 .../dom/src/main/java/dom/todo/ToDoItem.png     | Bin 0 -> 971 bytes
 .../dom/src/main/resources/images/Dashboard.png | Bin 684 -> 0 bytes
 .../src/main/resources/images/ToDoItem-done.png | Bin 1363 -> 0 bytes
 .../src/main/resources/images/ToDoItem-todo.png | Bin 971 -> 0 bytes
 .../dom/src/main/resources/images/ToDoItem.png  | Bin 971 -> 0 bytes
 10 files changed, 344 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java
index 1990075..807303e 100644
--- a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java
+++ b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java
@@ -23,18 +23,17 @@ import images.Images;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.inject.Singleton;
-
 import org.apache.wicket.request.resource.PackageResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
 
@@ -43,7 +42,7 @@ import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
  * class).
  * 
  * <p>
- * Searches for a fixed set of suffixes: {@value #IMAGE_SUFFICES}.
+ * Searches for a fixed set of suffixes: {@link #IMAGE_SUFFICES}.
  */
 @Singleton
 public class ImageResourceCacheClassPath implements ImageResourceCache {
@@ -52,83 +51,204 @@ public class ImageResourceCacheClassPath implements ImageResourceCache {
     
     private static final List<String> IMAGE_SUFFICES = Arrays.asList("png", "gif", "jpeg", "jpg");
     private static final String FALLBACK_IMAGE = "Default.png";
-    
-    private final Map<ObjectSpecId, ResourceReference> resourceReferenceBySpec = Maps.newHashMap();
-    private PackageResourceReference fallbackResourceReference;
 
+    private final Map<Key, ResourceReference> resourceReferenceByKey = Maps.newConcurrentMap();
 
-    @Override
-    public ResourceReference resourceReferenceFor(ObjectAdapter adapter) {
-        String adapterIconName = adapter.getIconName();
-        if (adapterIconName != null) {
-            return resourceReferenceFor(adapter.getIconName());
+    static final class Key implements Serializable {
+
+        private final Class<?> resourceClass;
+        private final String iconName;
+        private final String toString;
+
+        public Key(
+                final Class<?> correspondingClass,
+                final String iconName) {
+            this.iconName = iconName;
+            this.resourceClass = correspondingClass;
+            this.toString = calcToString();
         }
-        return resourceReferenceForSpec(adapter.getSpecification());
-    }
 
-    @Override
-    public ResourceReference resourceReferenceForSpec(final ObjectSpecification spec) {
-        if(spec == null) {
-            return fallbackResourceReference(); 
+        //region > getResourceClass, getIconName
+
+        public final Class<?> getResourceClass() {
+            return resourceClass;
         }
-        ResourceReference resourceReference = resourceReferenceBySpec.get(spec);
-        if(resourceReference != null) {
-            return resourceReference;
+
+        public final String getResourceName() {
+            return iconName;
         }
-        
-        resourceReference = lookupResourceReferenceFor(spec);
-        
-        final ObjectSpecId specId = spec.getSpecId();
-        resourceReferenceBySpec.put(specId, resourceReference);
-        return resourceReference;
-    }
+        //endregion
+
+        //region > superKey
+
+        Key superKey() {
+            if(resourceClass == null) {
+                return null;
+            }
+            final Class<?> superclass = resourceClass.getSuperclass();
+            if(superclass == Object.class) {
+                return null;
+            }
+            return new Key(superclass, iconName);
+        }
+
+        //endregion
 
-    private ResourceReference lookupResourceReferenceFor(final ObjectSpecification spec) {
-        final Class<?> correspondingClass = spec.getCorrespondingClass();
-        final String specName = correspondingClass.getSimpleName();
-        
-        final ResourceReference resourceReference = resourceReferenceFor(specName);
-        if(resourceReference != null) {
-            return resourceReference;
+        //region > resourcePaths
+
+        List<Key> resourcePaths(final String... suffices) {
+            return resourcePaths(Arrays.asList(suffices));
         }
-        
-        // search up hierarchy
-        final ObjectSpecification superSpec = spec.superclass();
-        if(superSpec != null) {
-            return resourceReferenceForSpec(superSpec);
-        } 
-
-        return fallbackResourceReference();
+
+        List<Key> resourcePaths(final List<String> suffices) {
+
+            Key key;
+            final List<Key> resourcePaths = Lists.newArrayList();
+
+            if(resourceClass != null) {
+                // with the iconName
+                if(iconName != null) {
+                    key = this;
+                    do {
+                        for (String suffix : suffices) {
+                            resourcePaths.add(new Key(key.getResourceClass(), key.getResourceClass().getSimpleName() + "-" + iconName + "." + suffix));
+                        }
+                        for (String suffix : suffices) {
+                            resourcePaths.add(new Key(key.getResourceClass(), iconName + "." + suffix));
+                        }
+                    } while ((key = key.superKey()) != null);
+                    key = this;
+                    do {
+                        for (String suffix : suffices) {
+                            resourcePaths.add(new Key(null, key.getResourceClass().getSimpleName() + "-" + iconName + "." + suffix));
+                        }
+                    } while ((key = key.superKey()) != null);
+                    for (String suffix : suffices) {
+                        resourcePaths.add(new Key(null, iconName + "." + suffix));
+                    }
+                }
+
+                // without the iconName
+                key = this;
+                do {
+                    for (String suffix : suffices) {
+                        resourcePaths.add(new Key(key.getResourceClass(), key.getResourceClass().getSimpleName() + "." + suffix));
+                    }
+                } while ((key = key.superKey()) != null);
+                key = this;
+                do {
+                    for (String suffix : suffices) {
+                        resourcePaths.add(new Key(null, key.getResourceClass().getSimpleName() + "." + suffix));
+                    }
+                } while ((key = key.superKey()) != null);
+
+
+            } else {
+
+                if(iconName != null) {
+                    for (String suffix : suffices) {
+                        resourcePaths.add(new Key(null, iconName + "." + suffix));
+                    }
+                }
+            }
+
+            // fallback
+            for (String suffix : suffices) {
+                resourcePaths.add(new Key(null, "Default" + "." + suffix));
+            }
+
+
+            return Collections.unmodifiableList(resourcePaths);
+        }
+
+        //endregion
+
+        //region > equals, hashCode, toString
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Key key = (Key) o;
+            if (toString != null ? !toString.equals(key.toString) : key.toString != null) return false;
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            return toString != null ? toString.hashCode() : 0;
+        }
+
+        @Override
+        public String toString() {
+            return toString;
+        }
+
+        private String calcToString() {
+            final StringBuilder buf = new StringBuilder();
+            if(resourceClass != null) {
+                buf.append(resourceClass.getName()).append("/").append(resourceClass.getSimpleName());
+            }
+            if(buf.length() > 0) {
+                buf.append("-");
+            }
+            if(iconName != null) {
+                buf.append(iconName);
+            }
+            return buf.toString();
+        }
+        //endregion
     }
 
-    
-    private ResourceReference fallbackResourceReference() {
-        if(fallbackResourceReference == null) {
-            fallbackResourceReference = newPackageResourceReference(FALLBACK_IMAGE);
+    public ImageResourceCacheClassPath() {
+        resourceReferenceByKey.put(new Key(null, null), new PackageResourceReference(Images.class, FALLBACK_IMAGE));
+    }
+
+    @Override
+    public ResourceReference resourceReferenceFor(final ObjectAdapter adapter) {
+        return resourceReferenceFor(adapter.getSpecification(), adapter.getIconName());
+    }
+
+    @Override
+    public ResourceReference resourceReferenceForSpec(final ObjectSpecification spec) {
+        return resourceReferenceFor(spec, null);
+    }
+
+    private ResourceReference resourceReferenceFor(
+            final ObjectSpecification specification,
+            final String iconNameIfAny) {
+
+        final Class<?> correspondingClassIfAny = specification != null? specification.getCorrespondingClass(): null;
+        final Key key = new Key(correspondingClassIfAny, iconNameIfAny);
+
+        ResourceReference resourceReference = resourceReferenceByKey.get(key);
+        if(resourceReference == null) {
+            resourceReference = findResourceReferenceFor(key);
+            resourceReferenceByKey.put(key, resourceReference);
         }
-        return fallbackResourceReference;
+
+        return resourceReference;
     }
 
-    private static ResourceReference resourceReferenceFor(final String specName) {
-        for(String imageSuffix: IMAGE_SUFFICES) {
-            final String imageName = specName + "." + imageSuffix;
+    private ResourceReference findResourceReferenceFor(final Key key) {
 
-            InputStream resourceAsStream = null;
-            resourceAsStream = Images.class.getResourceAsStream(imageName);
-            if(resourceAsStream == null) {
-                continue;
-            } else {
+        final List<Key> keys = key.resourcePaths(IMAGE_SUFFICES);
+        for (Key resourceKey : keys) {
+            Class<?> resourceClass = resourceKey.getResourceClass();
+            if(resourceClass == null) {
+                resourceClass = Images.class;
+            }
+            final String iconName = resourceKey.iconName;
+
+            final InputStream resourceAsStream = resourceClass.getResourceAsStream(iconName);
+            if (resourceAsStream != null) {
                 closeSafely(resourceAsStream);
+                return new PackageResourceReference(resourceClass, iconName);
             }
-            return newPackageResourceReference(imageName);
         }
         return null;
     }
 
-    private static PackageResourceReference newPackageResourceReference(final String imageFile) {
-        return new PackageResourceReference(Images.class, imageFile);
-    }
-
     private static void closeSafely(InputStream resourceAsStream) {
         try {
             resourceAsStream.close();

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/component/viewer/wicket/impl/src/test/java/org/apache/isis/viewer/wicket/viewer/imagecache/KeyTest.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/impl/src/test/java/org/apache/isis/viewer/wicket/viewer/imagecache/KeyTest.java b/component/viewer/wicket/impl/src/test/java/org/apache/isis/viewer/wicket/viewer/imagecache/KeyTest.java
new file mode 100644
index 0000000..f5118fc
--- /dev/null
+++ b/component/viewer/wicket/impl/src/test/java/org/apache/isis/viewer/wicket/viewer/imagecache/KeyTest.java
@@ -0,0 +1,162 @@
+package org.apache.isis.viewer.wicket.viewer.imagecache;
+
+import java.util.Iterator;
+import java.util.List;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.*;
+
+public class KeyTest {
+
+    ImageResourceCacheClassPath.Key key;
+
+    public static class SomeSuperclass {
+
+    }
+
+    public static class SomeSubclass extends SomeSuperclass {
+
+    }
+
+
+    public static class SuperKey extends KeyTest {
+
+        @Test
+        public void whenSubclass() throws Exception {
+
+            key = new ImageResourceCacheClassPath.Key(SomeSubclass.class, "foo");
+            final ImageResourceCacheClassPath.Key superKey = key.superKey();
+
+            assertEquals(SomeSuperclass.class, superKey.getResourceClass());
+            assertEquals("foo", key.getResourceName());
+        }
+
+        @Test
+        public void whenSuperClass() throws Exception {
+
+            key = new ImageResourceCacheClassPath.Key(SomeSuperclass.class, null);
+            final ImageResourceCacheClassPath.Key superKey = key.superKey();
+
+            assertNull(superKey);
+        }
+
+    }
+
+    public static class ResourcePaths extends KeyTest {
+
+        @Test
+        public void withIconName() throws Exception {
+            key = new ImageResourceCacheClassPath.Key(SomeSubclass.class, "foo");
+
+            final List<ImageResourceCacheClassPath.Key> keys = key.resourcePaths("png", "jpg", "jpeg");
+
+            final Iterator<ImageResourceCacheClassPath.Key> iterator = keys.iterator();
+
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass-foo.png");
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass-foo.jpg");
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass-foo.jpeg");
+
+            assertNext(iterator, SomeSubclass.class, "foo.png");
+            assertNext(iterator, SomeSubclass.class, "foo.jpg");
+            assertNext(iterator, SomeSubclass.class, "foo.jpeg");
+
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass-foo.png");
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass-foo.jpg");
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass-foo.jpeg");
+
+            assertNext(iterator, SomeSuperclass.class, "foo.png");
+            assertNext(iterator, SomeSuperclass.class, "foo.jpg");
+            assertNext(iterator, SomeSuperclass.class, "foo.jpeg");
+
+            assertNext(iterator, null, "SomeSubclass-foo.png");
+            assertNext(iterator, null, "SomeSubclass-foo.jpg");
+            assertNext(iterator, null, "SomeSubclass-foo.jpeg");
+
+            assertNext(iterator, null, "SomeSuperclass-foo.png");
+            assertNext(iterator, null, "SomeSuperclass-foo.jpg");
+            assertNext(iterator, null, "SomeSuperclass-foo.jpeg");
+
+            assertNext(iterator, null, "foo.png");
+            assertNext(iterator, null, "foo.jpg");
+            assertNext(iterator, null, "foo.jpeg");
+
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass.png");
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass.jpg");
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass.jpeg");
+
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass.png");
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass.jpg");
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass.jpeg");
+
+            assertNext(iterator, null, "SomeSubclass.png");
+            assertNext(iterator, null, "SomeSubclass.jpg");
+            assertNext(iterator, null, "SomeSubclass.jpeg");
+
+            assertNext(iterator, null, "SomeSuperclass.png");
+            assertNext(iterator, null, "SomeSuperclass.jpg");
+            assertNext(iterator, null, "SomeSuperclass.jpeg");
+
+            assertNext(iterator, null, "Default.png");
+            assertNext(iterator, null, "Default.jpg");
+            assertNext(iterator, null, "Default.jpeg");
+
+        }
+
+        @Test
+        public void withoutIconName() throws Exception {
+            key = new ImageResourceCacheClassPath.Key(SomeSubclass.class, null);
+
+            final List<ImageResourceCacheClassPath.Key> keys = key.resourcePaths("png", "jpg", "jpeg");
+
+            final Iterator<ImageResourceCacheClassPath.Key> iterator = keys.iterator();
+
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass.png");
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass.jpg");
+            assertNext(iterator, SomeSubclass.class, "SomeSubclass.jpeg");
+
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass.png");
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass.jpg");
+            assertNext(iterator, SomeSuperclass.class, "SomeSuperclass.jpeg");
+
+            assertNext(iterator, null, "SomeSubclass.png");
+            assertNext(iterator, null, "SomeSubclass.jpg");
+            assertNext(iterator, null, "SomeSubclass.jpeg");
+
+            assertNext(iterator, null, "SomeSuperclass.png");
+            assertNext(iterator, null, "SomeSuperclass.jpg");
+            assertNext(iterator, null, "SomeSuperclass.jpeg");
+
+            assertNext(iterator, null, "Default.png");
+            assertNext(iterator, null, "Default.jpg");
+            assertNext(iterator, null, "Default.jpeg");
+
+        }
+
+        @Test
+        public void withoutClass() throws Exception {
+            key = new ImageResourceCacheClassPath.Key(null, "foo");
+
+            final List<ImageResourceCacheClassPath.Key> keys = key.resourcePaths("png", "jpg", "jpeg");
+
+            final Iterator<ImageResourceCacheClassPath.Key> iterator = keys.iterator();
+
+            assertNext(iterator, null, "foo.png");
+            assertNext(iterator, null, "foo.jpg");
+            assertNext(iterator, null, "foo.jpeg");
+
+            assertNext(iterator, null, "Default.png");
+            assertNext(iterator, null, "Default.jpg");
+            assertNext(iterator, null, "Default.jpeg");
+
+        }
+
+        private static void assertNext(Iterator<ImageResourceCacheClassPath.Key> iterator, Class<?> resourceClass, String resourceName) {
+            assertThat(iterator.hasNext(), is(true));
+            final ImageResourceCacheClassPath.Key next = iterator.next();
+            assertEquals(resourceClass, next.getResourceClass());
+            assertEquals(resourceName, next.getResourceName());
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/java/app/Dashboard.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/app/Dashboard.png b/example/application/todoapp/dom/src/main/java/app/Dashboard.png
new file mode 100644
index 0000000..c22ab2b
Binary files /dev/null and b/example/application/todoapp/dom/src/main/java/app/Dashboard.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-done.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-done.png b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-done.png
new file mode 100644
index 0000000..b0fc6e8
Binary files /dev/null and b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-done.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-todo.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-todo.png b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-todo.png
new file mode 100644
index 0000000..99a9fed
Binary files /dev/null and b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem-todo.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.png b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.png
new file mode 100644
index 0000000..99a9fed
Binary files /dev/null and b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/resources/images/Dashboard.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/resources/images/Dashboard.png b/example/application/todoapp/dom/src/main/resources/images/Dashboard.png
deleted file mode 100644
index c22ab2b..0000000
Binary files a/example/application/todoapp/dom/src/main/resources/images/Dashboard.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/resources/images/ToDoItem-done.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/resources/images/ToDoItem-done.png b/example/application/todoapp/dom/src/main/resources/images/ToDoItem-done.png
deleted file mode 100644
index b0fc6e8..0000000
Binary files a/example/application/todoapp/dom/src/main/resources/images/ToDoItem-done.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/resources/images/ToDoItem-todo.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/resources/images/ToDoItem-todo.png b/example/application/todoapp/dom/src/main/resources/images/ToDoItem-todo.png
deleted file mode 100644
index 99a9fed..0000000
Binary files a/example/application/todoapp/dom/src/main/resources/images/ToDoItem-todo.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/isis/blob/9cc514d1/example/application/todoapp/dom/src/main/resources/images/ToDoItem.png
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/resources/images/ToDoItem.png b/example/application/todoapp/dom/src/main/resources/images/ToDoItem.png
deleted file mode 100644
index 99a9fed..0000000
Binary files a/example/application/todoapp/dom/src/main/resources/images/ToDoItem.png and /dev/null differ