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/02/20 14:10:57 UTC

[1/5] git commit: ISIS-695: removing unused imports, fixing comments

Repository: isis
Updated Branches:
  refs/heads/master c44bf4d52 -> 48de256e6


ISIS-695: removing unused imports, fixing comments


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

Branch: refs/heads/master
Commit: a55e8d505d3cb50a204c8069dd1399a8e48d26af
Parents: c44bf4d
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Feb 20 12:32:17 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Feb 20 12:32:17 2014 +0000

----------------------------------------------------------------------
 .../viewer/wicket/ui/components/actions/ActionPanel.java     | 8 +-------
 .../apache/isis/core/metamodel/adapter/ObjectAdapter.java    | 2 +-
 2 files changed, 2 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a55e8d50/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
index e8ddbcf..14511e8 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
@@ -29,9 +29,6 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.applib.RecoverableException;
-import org.apache.isis.applib.annotation.Command.ExecuteIn;
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.Command.Executor;
 import org.apache.isis.applib.services.command.CommandContext;
@@ -39,10 +36,7 @@ import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 import org.apache.isis.core.commons.authentication.MessageBroker;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
-import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
@@ -52,8 +46,8 @@ import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
 import org.apache.isis.viewer.wicket.model.models.BookmarkedPagesModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
 import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponse;
+import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
 import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseType;
 import org.apache.isis.viewer.wicket.ui.pages.BookmarkedPagesModelProvider;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/a55e8d50/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index 7178e11..859195f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -52,7 +52,7 @@ public interface ObjectAdapter extends Instance, org.apache.isis.applib.annotati
 
     /**
      * Returns the adapted domain object, the POJO, that this adapter represents
-     * with the NOF.
+     * with the framework.
      */
     Object getObject();
 


[2/5] git commit: ISIS-659: extend MementoService to support enums

Posted by da...@apache.org.
ISIS-659: extend MementoService to support enums


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

Branch: refs/heads/master
Commit: e14017822ab3073062b2ec45dea2237a31c96e0f
Parents: a55e8d5
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Feb 20 12:37:09 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Feb 20 12:37:09 2014 +0000

----------------------------------------------------------------------
 .../runtime/services/memento/Dom4jUtil.java     | 41 +++++++++++++-------
 .../memento/MementoServiceDefaultTest.java      |  9 +++++
 2 files changed, 35 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e1401782/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java
index 88e9a89..a22e49b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java
@@ -112,85 +112,95 @@ class Dom4jUtil {
     static enum Parseable {
         STRING(String.class) {
             @SuppressWarnings("unchecked")
-            public <T> T parseStr(String str) {
+            public <T> T parseStr(String str, Class<T> cls) {
                 return (T) str;
             }
         },
         BOOLEAN(Boolean.class, boolean.class) {
             @SuppressWarnings("unchecked")
             @Override
-            public <T> T parseStr(String str) {
+            public <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Boolean(str);
             }
         },
         BYTE(Byte.class, byte.class) {
             @SuppressWarnings("unchecked")
             @Override
-            public <T> T parseStr(String str) {
+            public <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Byte(str);
             }
         },
         SHORT(Short.class, short.class) {
-
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Short(str);
             }
         },
         INTEGER(Integer.class, int.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Integer(str);
             }
         },
         LONG(Long.class, long.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Long(str);
             }
         },
         FLOAT(Float.class, float.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Float(str);
             }
         },
         DOUBLE(Double.class, double.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Double(str);
             }
         },
         BIG_DECIMAL(BigDecimal.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new BigDecimal(str);
             }
         },
         BIG_INTEGER(BigInteger.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new BigInteger(str);
             }
         },
         LOCAL_DATE(LocalDate.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new LocalDate(str);
             } 
         },
+        ENUM(Enum.class) {
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            @Override
+            <T> T parseStr(String str, Class<T> cls) {
+                Class rawCls = cls;
+                return (T) valueOf(str, rawCls);
+            } 
+            private <E extends Enum<E>> E valueOf(String name, Class<E> cls) {
+                return Enum.valueOf(cls, name);
+            }
+        },
         BOOKMARK(Bookmark.class) {
             @SuppressWarnings("unchecked")
             @Override
-            <T> T parseStr(String str) {
+            <T> T parseStr(String str, Class<T> cls) {
                 return (T) new Bookmark(str);
             } 
         };
@@ -201,17 +211,18 @@ class Dom4jUtil {
         public Class<?>[] getClasses() {
             return classes;
         }
-        abstract <T> T parseStr(String str);
+        abstract <T> T parseStr(String str, Class<T> cls);
         
         // //////////////////////////////////////
 
+        @SuppressWarnings("unchecked")
         static <T> T parse(final String str, final Class<?> cls) {
             assertSupported(cls);
             for (Parseable sc : values()) {
                 for (Class<?> eachCls: sc.getClasses()) {
                     if(eachCls.isAssignableFrom(cls)) {
                         if(!eachCls.isPrimitive() || str != null) {
-                            return sc.parseStr(str);
+                            return (T) sc.parseStr(str, cls);
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1401782/core/runtime/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java
index 222f8ab..7511b57 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java
@@ -39,6 +39,10 @@ public class MementoServiceDefaultTest {
         mementoService = new MementoServiceDefault().withNoEncoding();
     }
     
+    static enum DOW {
+        Mon,Tue,Wed,Thu,Fri
+    }
+    
     @Test
     public void roundtrip() {
         final Memento memento = mementoService.create();
@@ -60,6 +64,8 @@ public class MementoServiceDefaultTest {
         memento.set("someBookmark", new Bookmark("CUS", "12345"));
         memento.set("someNullValue", null);
         
+        memento.set("someEnum", DOW.Wed);
+        
         final String str = memento.asString();
         
         final Memento memento2 = mementoService.parse(str);
@@ -83,5 +89,8 @@ public class MementoServiceDefaultTest {
         assertThat(memento2.get("someNullValue", Integer.class), is(nullValue()));
         assertThat(memento2.get("someNullValue", Bookmark.class), is(nullValue()));
         assertThat(memento2.get("someNullValue", LocalDate.class), is(nullValue()));
+        
+        assertThat(memento2.get("someEnum", DOW.class), is(DOW.Wed));
+        
     }
 }


[5/5] git commit: ISIS-708: BookmarkService null handling

Posted by da...@apache.org.
ISIS-708: BookmarkService null handling


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

Branch: refs/heads/master
Commit: 48de256e6060accfa3a664b73e503f397f73328a
Parents: f10d671
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Feb 20 13:04:05 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Feb 20 13:04:05 2014 +0000

----------------------------------------------------------------------
 .../services/bookmarks/BookmarkServiceDefault.java          | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/48de256e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceDefault.java
index de4505e..ea5bf2a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceDefault.java
@@ -81,7 +81,11 @@ public class BookmarkServiceDefault implements BookmarkService, DomainObjectServ
         if(bookmark == null) {
             return null;
         }
-        return domainObjectServices.lookup(bookmark);
+        try {
+            return domainObjectServices.lookup(bookmark);
+        } catch(org.apache.isis.core.runtime.persistence.ObjectNotFoundException ex) {
+            return null;
+        }
     }
 
     @SuppressWarnings("unchecked")
@@ -94,6 +98,9 @@ public class BookmarkServiceDefault implements BookmarkService, DomainObjectServ
     @Hidden
     @Override
     public Bookmark bookmarkFor(final Object domainObject) {
+        if(domainObject == null) {
+            return null;
+        }
         return domainObjectServices.bookmarkFor(domainObject);
     }
 


[4/5] git commit: ISIS-707: bulk interaction facet contributed actions

Posted by da...@apache.org.
ISIS-707: bulk interaction facet contributed actions

ObjectActionContributee
- same set up of Bulk.InteractionContext as currently done by ActionInvocationFacetViaMethod

requires changes to:
- ObjectMemberContext
  - to provide a servicesProvider (for lookup of the bookmarkService)
- ObjectReflectorDefault
  - to initialize ObjectMemberContext
- ObjectMemberAbstract
  - to expose servicesProvider to subclasses (ie ObjectActionContributee)
- unit tests

and requires changes to:
- ServicesProvider API
  - to provide a new lookupService(Class) method
- RuntimeContextFromSession, RuntimeContextNoRuntime
  - corresponding impls


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

Branch: refs/heads/master
Commit: f10d671f52303c45a53e3b83a3840bfa24713315
Parents: 19b7c17
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Feb 20 13:00:45 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Feb 20 13:00:45 2014 +0000

----------------------------------------------------------------------
 .../core/metamodel/adapter/ServicesProvider.java |  2 ++
 .../noruntime/RuntimeContextNoRuntime.java       |  5 +++++
 .../spec/feature/ObjectMemberContext.java        | 16 +++++++++++++++-
 .../specloader/ObjectReflectorDefault.java       |  2 +-
 .../specimpl/ObjectActionContributee.java        | 19 +++++++++++++++++++
 .../specimpl/ObjectMemberAbstract.java           |  7 +++++++
 .../specimpl/ObjectAssociationAbstractTest.java  |  2 +-
 ...jectAssociationAbstractTest_alwaysHidden.java |  2 +-
 .../internal/RuntimeContextFromSession.java      |  5 +++++
 .../runtime/system/ObjectActionImplTest.java     |  2 +-
 .../runtime/system/ObjectMemberAbstractTest.java |  2 +-
 .../system/OneToManyAssociationImplTest.java     |  5 ++++-
 12 files changed, 62 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ServicesProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ServicesProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ServicesProvider.java
index 568aa70..f315aaa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ServicesProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ServicesProvider.java
@@ -31,4 +31,6 @@ public interface ServicesProvider extends Injectable {
      */
     List<ObjectAdapter> getServices();
 
+    <T> T lookupService(Class<T> cls);
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
index faec78f..2f1da7c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
@@ -353,6 +353,11 @@ public class RuntimeContextNoRuntime extends RuntimeContextAbstract {
             public List<ObjectAdapter> getServices() {
                 return Collections.emptyList();
             }
+
+            @Override
+            public <T> T lookupService(Class<T> cls) {
+                return null;
+            }
         };
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberContext.java
index f86dc31..2aef1e1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberContext.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.adapter.QuerySubmitter;
+import org.apache.isis.core.metamodel.adapter.ServicesProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
@@ -31,8 +32,16 @@ public class ObjectMemberContext {
     private final AdapterManager adapterManager;
     private final QuerySubmitter querySubmitter;
     private final CollectionTypeRegistry collectionTypeRegistry;
+    private final ServicesProvider servicesProvider;
 
-    public ObjectMemberContext(final DeploymentCategory deploymentCategory, final AuthenticationSessionProvider authenticationSessionProvider, final SpecificationLoader specificationLookup, final AdapterManager adapterManager, final QuerySubmitter querySubmitter, final CollectionTypeRegistry collectionTypeRegistry) {
+    public ObjectMemberContext(
+            final DeploymentCategory deploymentCategory, 
+            final AuthenticationSessionProvider authenticationSessionProvider, 
+            final SpecificationLoader specificationLookup, 
+            final AdapterManager adapterManager, 
+            final QuerySubmitter querySubmitter, 
+            final CollectionTypeRegistry collectionTypeRegistry,
+            final ServicesProvider servicesProvider) {
 
         this.deploymentCategory = deploymentCategory;
         this.authenticationSessionProvider = authenticationSessionProvider;
@@ -40,6 +49,7 @@ public class ObjectMemberContext {
         this.adapterManager = adapterManager;
         this.querySubmitter = querySubmitter;
         this.collectionTypeRegistry = collectionTypeRegistry;
+        this.servicesProvider = servicesProvider;
     }
 
     public DeploymentCategory getDeploymentCategory() {
@@ -58,6 +68,10 @@ public class ObjectMemberContext {
         return adapterManager;
     }
 
+    public ServicesProvider getServicesProvider() {
+        return servicesProvider;
+    }
+    
     public QuerySubmitter getQuerySubmitter() {
         return querySubmitter;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index d83d2fb..a354a17 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -504,7 +504,7 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
         final SpecificationContext specContext = new SpecificationContext(getDeploymentCategory(), authenticationSessionProvider, servicesProvider, objectInstantiator, specificationLookup, facetProcessor);
 
         final AdapterManager adapterMap = getRuntimeContext().getAdapterManager();
-        final ObjectMemberContext objectMemberContext = new ObjectMemberContext(getDeploymentCategory(), authenticationSessionProvider, specificationLookup, adapterMap, getRuntimeContext().getQuerySubmitter(), collectionTypeRegistry);
+        final ObjectMemberContext objectMemberContext = new ObjectMemberContext(getDeploymentCategory(), authenticationSessionProvider, specificationLookup, adapterMap, getRuntimeContext().getQuerySubmitter(), collectionTypeRegistry, servicesProvider);
 
         // ... and create the specs
         if (FreeStandingList.class.isAssignableFrom(cls)) {

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
index de00892..49cd76c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
@@ -17,11 +17,14 @@
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.Bulk.InteractionContext.InvokedAs;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -33,9 +36,11 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
+import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
+import org.apache.isis.core.progmodel.facets.actions.bulk.BulkFacet;
 
 public class ObjectActionContributee extends ObjectActionImpl implements ContributeeMember {
 
@@ -164,6 +169,20 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
 
     @Override
     public ObjectAdapter execute(final ObjectAdapter contributee, final ObjectAdapter[] arguments) {
+        
+        // this code also exists in ActionInvocationFacetViaMethod
+        // we need to repeat it here because the target adapter should be the contributee, not the contributing service.
+        final Bulk.InteractionContext bulkInteractionContext = getServicesProvider().lookupService(Bulk.InteractionContext.class);
+
+        final BulkFacet bulkFacet = getFacet(BulkFacet.class);
+        if (bulkFacet != null && 
+            bulkInteractionContext != null &&
+            bulkInteractionContext.getInvokedAs() == null) {
+            
+            bulkInteractionContext.setInvokedAs(InvokedAs.REGULAR);
+            bulkInteractionContext.setDomainObjects(Collections.singletonList(contributee.getObject()));
+        }
+
         return serviceAction.execute(serviceAdapter, argsPlusContributee(contributee, arguments));
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 6f520c3..b688f56 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider
 import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.QuerySubmitter;
+import org.apache.isis.core.metamodel.adapter.ServicesProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
@@ -67,6 +68,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     private final AuthenticationSessionProvider authenticationSessionProvider;
     private final SpecificationLoader specificationLookup;
     private final AdapterManager adapterManager;
+    private final ServicesProvider servicesProvider;
     private final QuerySubmitter querySubmitter;
     private final CollectionTypeRegistry collectionTypeRegistry;
     private final DeploymentCategory deploymentCategory;
@@ -85,6 +87,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         this.authenticationSessionProvider = objectMemberContext.getAuthenticationSessionProvider();
         this.specificationLookup = objectMemberContext.getSpecificationLookup();
         this.adapterManager = objectMemberContext.getAdapterManager();
+        this.servicesProvider = objectMemberContext.getServicesProvider();
         this.querySubmitter = objectMemberContext.getQuerySubmitter();
         this.collectionTypeRegistry = objectMemberContext.getCollectionTypeRegistry();
     }
@@ -312,6 +315,10 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         return adapterManager;
     }
 
+    public ServicesProvider getServicesProvider() {
+        return servicesProvider;
+    }
+
     public QuerySubmitter getQuerySubmitter() {
         return querySubmitter;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
index 0bee5d1..c445bf6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
@@ -73,7 +73,7 @@ public class ObjectAssociationAbstractTest {
     public void setup() {
         facetedMethod = FacetedMethod.createForProperty(Customer.class, "firstName");
         
-        objectAssociation = new ObjectAssociationAbstract(facetedMethod, FeatureType.PROPERTY, objectSpecification, new ObjectMemberContext(DeploymentCategory.PRODUCTION, null, null, null, null, null)) {
+        objectAssociation = new ObjectAssociationAbstract(facetedMethod, FeatureType.PROPERTY, objectSpecification, new ObjectMemberContext(DeploymentCategory.PRODUCTION, null, null, null, null, null, null)) {
 
             @Override
             public ObjectAdapter get(final ObjectAdapter fromObject) {

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
index b4cdf5a..1bfbfb7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
@@ -72,7 +72,7 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
     public void setup() {
         facetedMethod = FacetedMethod.createForProperty(Customer.class, "firstName");
         
-        objectAssociation = new ObjectAssociationAbstract(facetedMethod, FeatureType.PROPERTY, objectSpecification, new ObjectMemberContext(DeploymentCategory.PRODUCTION, null, null, null, null, null)) {
+        objectAssociation = new ObjectAssociationAbstract(facetedMethod, FeatureType.PROPERTY, objectSpecification, new ObjectMemberContext(DeploymentCategory.PRODUCTION, null, null, null, null, null, null)) {
 
             @Override
             public ObjectAdapter get(final ObjectAdapter fromObject) {

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
index a1dba17..02fa73e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
@@ -179,6 +179,11 @@ public class RuntimeContextFromSession extends RuntimeContextAbstract {
             public List<ObjectAdapter> getServices() {
                 return getPersistenceSession().getServices();
             }
+
+            @Override
+            public <T> T lookupService(Class<T> cls) {
+                return getPersistenceSession().getServicesInjector().lookupService(cls);
+            }
         };
         this.domainObjectServices = new DomainObjectServicesAbstract() {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
index 8571dae..9620344 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
@@ -77,7 +77,7 @@ public class ObjectActionImplTest {
             }
         });
 
-        action = new ObjectActionImpl(mockFacetedMethod, new ObjectMemberContext(DeploymentCategory.PRODUCTION, mockAuthenticationSessionProvider, mockSpecificationLookup, mockAdapterManager, mockQuerySubmitter, mockCollectionTypeRegistry));
+        action = new ObjectActionImpl(mockFacetedMethod, new ObjectMemberContext(DeploymentCategory.PRODUCTION, mockAuthenticationSessionProvider, mockSpecificationLookup, mockAdapterManager, mockQuerySubmitter, mockCollectionTypeRegistry, mockServicesProvider));
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
index 9c80148..588ad36 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
@@ -205,7 +205,7 @@ class ObjectMemberAbstractImpl extends ObjectMemberAbstract {
     }
 
     protected ObjectMemberAbstractImpl(final String id) {
-        super(FacetedMethod.createForProperty(Customer.class, "firstName"), FeatureType.PROPERTY, new ObjectMemberContext(DeploymentCategory.PRODUCTION, null, null, null, null, null));
+        super(FacetedMethod.createForProperty(Customer.class, "firstName"), FeatureType.PROPERTY, new ObjectMemberContext(DeploymentCategory.PRODUCTION, null, null, null, null, null, null));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/f10d671f/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java
index 688a821..8af224a 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.QuerySubmitter;
+import org.apache.isis.core.metamodel.adapter.ServicesProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
@@ -80,6 +81,8 @@ public class OneToManyAssociationImplTest {
     @Mock
     private NamedFacet mockNamedFacet;
     @Mock
+    private ServicesProvider mockServicesProvider;
+    @Mock
     private CollectionAddToFacet mockCollectionAddToFacet;
     @Mock
     private CollectionTypeRegistry mockCollectionTypeRegistry;
@@ -91,7 +94,7 @@ public class OneToManyAssociationImplTest {
         allowingPeerToReturnCollectionType();
         allowingPeerToReturnIdentifier();
         allowingSpecLoaderToReturnSpecs();
-        association = new OneToManyAssociationImpl(mockPeer, new ObjectMemberContext(DeploymentCategory.PRODUCTION, mockAuthenticationSessionProvider, mockSpecificationLookup, mockAdapterManager, mockQuerySubmitter, mockCollectionTypeRegistry));
+        association = new OneToManyAssociationImpl(mockPeer, new ObjectMemberContext(DeploymentCategory.PRODUCTION, mockAuthenticationSessionProvider, mockSpecificationLookup, mockAdapterManager, mockQuerySubmitter, mockCollectionTypeRegistry, mockServicesProvider));
     }
 
     private void allowingSpecLoaderToReturnSpecs() {


[3/5] git commit: ISIS-706: blob vs clob handling, also w.r.t. bulk actions

Posted by da...@apache.org.
ISIS-706: blob vs clob handling, also w.r.t. bulk actions

ActionModel:
- blob vs clob, use same API so far as possible (differ only in IResourceStream impl)

BulkActionsLinkFactory:
- use ActionResultResponseHandlingStrategy for dealing with lastReturnedAdapter

CssMenuItems
- consistenct in config of LinkAndLabel (for the 'noVeil' CSS class workaround for actions returning blob/clob)

@Bulk.InteractionContext.InvokedAs
- new convenience methods on this enum

ObjectAction.Filters.bulk()
- added checks that the parameter count must be 0, and must not return a Blob/Clob
- the parameter check is here because removed from...

BulkAnnotationFacetFactory
- no longer requires that action has zero params
- doing so was causing bulk facet to not be installed on contributed actions
- in any case, when bulk actions with params are eventually supported, would need to remove anyway


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

Branch: refs/heads/master
Commit: 19b7c178ceb3c30663c9a496643c1c0f158c5b02
Parents: e140178
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Feb 20 12:52:52 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Feb 20 12:52:52 2014 +0000

----------------------------------------------------------------------
 .../viewer/wicket/model/models/ActionModel.java | 42 ++++++++++++++++----
 .../ajaxtable/BulkActionsLinkFactory.java       |  7 ++--
 .../components/widgets/cssmenu/CssMenuItem.java |  2 +-
 .../org/apache/isis/applib/annotation/Bulk.java |  4 +-
 .../metamodel/spec/feature/ObjectAction.java    | 21 +++++++++-
 .../annotation/BulkAnnotationFacetFactory.java  |  4 --
 6 files changed, 61 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/19b7c178/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index e7ef110..de73f6c 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.viewer.wicket.model.models;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -38,6 +41,9 @@ import org.apache.wicket.request.http.handler.RedirectRequestHandler;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.ByteArrayResource;
 import org.apache.wicket.request.resource.ContentDisposition;
+import org.apache.wicket.util.resource.AbstractResourceStream;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.apache.wicket.util.resource.StringResourceStream;
 
 import org.apache.isis.applib.RecoverableException;
@@ -46,6 +52,7 @@ import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
+import org.apache.isis.applib.value.NamedWithMimeType;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
@@ -523,22 +530,41 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> {
 
     public static IRequestHandler downloadHandler(final Object value) {
         if(value instanceof Clob) {
-            return downloadHandler((Clob)value);
+            Clob clob = (Clob)value;
+            return handlerFor(resourceStreamFor(clob), clob);
         }
         if(value instanceof Blob) {
-            return downloadHandler((Blob)value);
+            Blob blob = (Blob)value;
+            return handlerFor(resourceStreamFor(blob), blob);
         }
         return null;
     }
     
-    private static IRequestHandler downloadHandler(final Blob blob) {
-        ResourceRequestHandler handler = 
-            new ResourceRequestHandler(new ByteArrayResource(blob.getMimeType().toString(), blob.getBytes(), blob.getName()), null);
-        return handler;
+    private static IResourceStream resourceStreamFor(final Blob blob) {
+        IResourceStream byteArrayResource = new AbstractResourceStream() {
+            
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public InputStream getInputStream() throws ResourceStreamNotFoundException {
+                return new ByteArrayInputStream(blob.getBytes());
+            }
+            
+            @Override
+            public void close() throws IOException {
+            }
+        };
+        return byteArrayResource;
     }
-    private static IRequestHandler downloadHandler(final Clob clob) {
+
+    private static IResourceStream resourceStreamFor(final Clob clob) {
+        IResourceStream resourceStream = new StringResourceStream(clob.getChars(), clob.getMimeType().toString());
+        return resourceStream;
+    }
+
+    private static IRequestHandler handlerFor(IResourceStream resourceStream, final NamedWithMimeType namedWithMimeType) {
         ResourceStreamRequestHandler handler = 
-            new ResourceStreamRequestHandler(new StringResourceStream(clob.getChars(), clob.getMimeType().toString()), clob.getName());
+            new ResourceStreamRequestHandler(resourceStream, namedWithMimeType.getName());
         handler.setContentDisposition(ContentDisposition.ATTACHMENT);
         return handler;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/19b7c178/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
index 0402da6..99f589a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
@@ -45,6 +45,7 @@ import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponse;
+import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
 import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseType;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterToggleboxColumn;
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactory;
@@ -129,9 +130,9 @@ final class BulkActionsLinkFactory implements ActionLinkFactory {
                     if(lastReturnedAdapter != null) {
                         final ActionResultResponse resultResponse = 
                                 ActionResultResponseType.determineAndInterpretResult(actionModelHint, lastReturnedAdapter);
-                        if(resultResponse.isToPage()) {
-                            setResponsePage(resultResponse.getToPage());
-                        }
+                        final ActionResultResponseHandlingStrategy responseHandlingStrategy = 
+                                ActionResultResponseHandlingStrategy.determineFor(resultResponse);
+                        responseHandlingStrategy.handleResults(this, resultResponse);
                     }
 
                 } catch(final ConcurrencyException ex) {

http://git-wip-us.apache.org/repos/asf/isis/blob/19b7c178/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
index e31bd0c..eb00c48 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
@@ -353,7 +353,7 @@ public class CssMenuItem implements Serializable {
 
         final AbstractLink link = linkAndLabel.getLink();
         final String actionLabel = linkAndLabel.getLabel();
-        Builder builder = this.newSubMenuItem(actionLabel).link(link).prototyping(linkAndLabel.isPrototype());
+        Builder builder = this.newSubMenuItem(actionLabel).link(link).prototyping(linkAndLabel.isPrototype()).returnsBlobOrClob(linkAndLabel.isBlobOrClob());
 
         CssClassFacet cssClassFacet = objectAction.getFacet(CssClassFacet.class);
         if (cssClassFacet != null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/19b7c178/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
index 0211d01..f0682a9 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
@@ -67,7 +67,9 @@ public @interface Bulk {
 
         public static enum InvokedAs {
             BULK,
-            REGULAR
+            REGULAR;
+            public boolean isRegular() { return this == REGULAR; }
+            public boolean isBulk() { return this == BULK; }
         }
 
         /**

http://git-wip-us.apache.org/repos/asf/isis/blob/19b7c178/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index 4efb3f0..9c05b51 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -28,13 +28,14 @@ import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.value.Clob;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetFilters;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.named.NamedFacet;
@@ -268,7 +269,23 @@ public interface ObjectAction extends ObjectMember {
 
                 @Override
                 public boolean accept(ObjectAction oa) {
-                    return oa.containsDoOpFacet(BulkFacet.class);
+                    if( !oa.containsDoOpFacet(BulkFacet.class)) {
+                        return false;
+                    }
+                    if (oa.getParameterCount() != 0) {
+                        return false;
+                    } 
+                    
+                    // currently don't support returning Blobs or Clobs
+                    // (because haven't figured out how to rerender the current page, but also to do a download)
+                    ObjectSpecification returnSpec = oa.getReturnType();
+                    if(returnSpec != null) {
+                        Class<?> returnType = returnSpec.getCorrespondingClass();
+                        if(returnType == Blob.class || returnType == Clob.class) {
+                            return false;
+                        }
+                    }
+                    return true;
                 }};
         }
         

http://git-wip-us.apache.org/repos/asf/isis/blob/19b7c178/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/bulk/annotation/BulkAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/bulk/annotation/BulkAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/bulk/annotation/BulkAnnotationFacetFactory.java
index f00e8ef..27f838a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/bulk/annotation/BulkAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/bulk/annotation/BulkAnnotationFacetFactory.java
@@ -38,10 +38,6 @@ public class BulkAnnotationFacetFactory extends FacetFactoryAbstract {
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         Method method = processMethodContext.getMethod();
-        // can only annotate no-arg actions.
-        if(method.getParameterTypes().length != 0) {
-            return;
-        }
         final Bulk annotation = Annotations.getAnnotation(method, Bulk.class);
         FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
     }