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:59 UTC

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

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()));
     }