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