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 2013/06/26 08:55:47 UTC

git commit: ISIS-445: actions can return Blob or Clob

Updated Branches:
  refs/heads/master 050e9e32f -> 59c5479b0


ISIS-445: actions can return Blob or Clob

- will be downloaded
- the veil is suppressed (otherwise is never cleared)


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

Branch: refs/heads/master
Commit: 59c5479b059cc5d4c714d8a979b2b1a37eee210c
Parents: 050e9e3
Author: Dan Haywood <da...@apache.org>
Authored: Wed Jun 26 07:55:26 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Wed Jun 26 07:55:26 2013 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/links/LinkAndLabel.java |  8 +++-
 .../additionallinks/AdditionalLinksPanel.java   |  5 +++
 .../cssmenu/AppActionsCssMenuLinkFactory.java   |  4 +-
 .../ajaxtable/BulkActionsLinkFactory.java       |  3 +-
 .../entity/EntityActionLinkFactory.java         |  4 +-
 .../components/value/StandaloneValuePanel.java  | 34 +++++++++++++---
 .../components/widgets/cssmenu/CssMenuItem.java | 41 ++++++++++++++++++--
 .../ui/pages/jquery.isis.wicket.viewer.js       |  6 +--
 8 files changed, 88 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
index e037774..9aca2ea 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
@@ -29,11 +29,13 @@ public class LinkAndLabel implements Serializable {
     private final AbstractLink link;
     private final String label;
     private final String disabledReasonIfAny;
+    private final boolean blobOrClob;
 
-    public LinkAndLabel(final AbstractLink link, final String label, String disabledReasonIfAny) {
+    public LinkAndLabel(final AbstractLink link, final String label, String disabledReasonIfAny, boolean blobOrClob) {
         this.link = link;
         this.label = label;
         this.disabledReasonIfAny = disabledReasonIfAny;
+        this.blobOrClob = blobOrClob;
     }
 
     public AbstractLink getLink() {
@@ -47,4 +49,8 @@ public class LinkAndLabel implements Serializable {
     public String getDisabledReasonIfAny() {
         return disabledReasonIfAny;
     }
+
+    public boolean isBlobOrClob() {
+        return blobOrClob;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
index 259b9a6..434b6b1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/AdditionalLinksPanel.java
@@ -21,12 +21,14 @@ package org.apache.isis.viewer.wicket.ui.components.additionallinks;
 
 import java.util.List;
 
+import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.Model;
 
 import org.apache.isis.core.commons.lang.StringUtils;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -74,6 +76,9 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
                 if(disabledReasonIfAny != null) {
                     viewTitleLabel.add(new AttributeAppender("title", disabledReasonIfAny));
                 }
+                if(linkAndLabel.isBlobOrClob()) {
+                    link.add(new AttributeModifier("class", Model.of("noVeil")));
+                }
                 viewTitleLabel.add(new CssClassAppender(StringUtils.toLowerDashed(linkAndLabel.getLabel())));
                 link.addOrReplace(viewTitleLabel);
                 item.addOrReplace(link);

http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
index 8e3964b..d6df1a5 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
@@ -31,6 +31,7 @@ import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.PageType;
+import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuItem;
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuLinkFactory;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
@@ -49,7 +50,8 @@ class AppActionsCssMenuLinkFactory implements CssMenuLinkFactory {
         final AbstractLink link = Links.newBookmarkablePageLink(linkId, pageParameters, pageClass);
         final String actionLabel = ObjectActions.nameFor(action);
 
-        return new LinkAndLabel(link, actionLabel, null);
+        boolean blobOrClob = CssMenuItem.returnsBlobOrClob(action);
+        return new LinkAndLabel(link, actionLabel, null, blobOrClob);
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/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 53aafb5..e2481de 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
@@ -35,6 +35,7 @@ import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuItem;
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuLinkFactory;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
 
@@ -100,6 +101,6 @@ final class BulkActionsLinkFactory implements CssMenuLinkFactory {
 
         };
         link.add(new JGrowlBehaviour());
-        return new LinkAndLabel(link, objectAction.getName(), null);
+        return new LinkAndLabel(link, objectAction.getName(), null, false);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
index 2d5f70a..14714e3 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
@@ -43,6 +43,7 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.PageType;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
+import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuItem;
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuLinkFactory;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
@@ -81,7 +82,8 @@ public final class EntityActionLinkFactory implements CssMenuLinkFactory {
             link.setEnabled(false);
         }
 
-        return new LinkAndLabel(link, label, disabledReasonIfAny);
+        boolean blobOrClob = CssMenuItem.returnsBlobOrClob(action);
+        return new LinkAndLabel(link, label, disabledReasonIfAny, blobOrClob);
     }
 
     private AbstractLink createLink(final ObjectAdapterMemento adapterMemento, final ObjectAction action, final String linkId, final ObjectAdapter adapter) {

http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java
index 19fb147..a0748de 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java
@@ -20,7 +20,14 @@
 package org.apache.isis.viewer.wicket.ui.components.value;
 
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.request.handler.resource.ResourceRequestHandler;
+import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
+import org.apache.wicket.request.resource.ByteArrayResource;
+import org.apache.wicket.request.resource.ContentDisposition;
+import org.apache.wicket.util.resource.StringResourceStream;
 
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.value.Clob;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.model.models.ValueModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
@@ -37,12 +44,27 @@ public class StandaloneValuePanel extends PanelAbstract<ValueModel> {
 
     public StandaloneValuePanel(final String id, final ValueModel valueModel) {
         super(id, valueModel);
-        buildGui();
-    }
-    
-    private void buildGui() {
-        ObjectAdapter objectAdapter = getModel().getObject();
-        add(new Label(ID_STANDALONE_VALUE, objectAdapter.titleString()));
+        final ObjectAdapter objectAdapter = getModel().getObject();
+        final Object value = objectAdapter.getObject();
+        final String label;
+        
+        if(value instanceof Clob) {
+            final Clob clob = (Clob) value;
+            ResourceStreamRequestHandler handler = 
+                new ResourceStreamRequestHandler(new StringResourceStream(clob.getChars(), clob.getMimeType().toString()), clob.getName());
+            handler.setContentDisposition(ContentDisposition.ATTACHMENT);
+            getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
+            label = "Downloading: " + clob.getName();
+        } else if(value instanceof Blob) {
+            final Blob blob = (Blob) value;
+            ResourceRequestHandler handler = 
+                    new ResourceRequestHandler(new ByteArrayResource(blob.getMimeType().toString(), blob.getBytes(), blob.getName()), null);
+            getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
+            label = "Downloading: " + blob.getName();
+        } else {
+            label = objectAdapter.titleString(null);
+        }
+        add(new Label(ID_STANDALONE_VALUE, label));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/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 e2c1a3c..4f6417b 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
@@ -27,7 +27,6 @@ import java.util.List;
 
 import com.google.common.collect.Lists;
 
-import org.apache.wicket.Application;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
@@ -38,12 +37,14 @@ import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.applib.annotation.Where;
+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.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -87,6 +88,12 @@ public class CssMenuItem implements Serializable {
             return this;
         }
 
+
+        public Builder returnsBlobOrClob(boolean blobOrClob) {
+            cssMenuItem.setReturnsBlobOrClob(blobOrClob);
+            return this;
+        }
+
         /**
          * Access the {@link CssMenuItem} before it is attached to its parent.
          * 
@@ -114,13 +121,14 @@ public class CssMenuItem implements Serializable {
 
     private AbstractLink link;
     private boolean enabled = true; // unless disabled
-
     private String disabledReason;
+    private boolean blobOrClob = false; // unless set otherwise
 
     static final String ID_MENU_LABEL = "menuLabel";
 
     static final String ID_SUB_MENU_ITEMS = "subMenuItems";
 
+
     /**
      * Factory method returning {@link Builder builder}.
      */
@@ -172,6 +180,11 @@ public class CssMenuItem implements Serializable {
         this.enabled = enabled;
     }
 
+    public void setReturnsBlobOrClob(boolean blobOrClob) {
+        this.blobOrClob = blobOrClob;
+    }
+
+
     /**
      * Only populated if not {@link #isEnabled() enabled}.
      */
@@ -223,10 +236,26 @@ public class CssMenuItem implements Serializable {
         // check whether enabled
         final Consent usability = objectAction.isUsable(session, adapter, where);
         final String reasonDisabledIfAny = usability.getReason();
+        
+        // check if returns blob or clob (if so, then add CSS to suppress veil)
+        boolean blobOrClob = returnsBlobOrClob(objectAction);
 
-        return newSubMenuItem(actionLabel).link(link).enabled(reasonDisabledIfAny);
+        return newSubMenuItem(actionLabel).link(link).enabled(reasonDisabledIfAny).returnsBlobOrClob(blobOrClob);
     }
 
+    public static boolean returnsBlobOrClob(final ObjectAction objectAction) {
+        boolean blobOrClob = false;
+        final ObjectSpecification returnType = objectAction.getReturnType();
+        if(returnType != null) {
+            Class<?> cls = returnType.getCorrespondingClass();
+            if (Blob.class.isAssignableFrom(cls) || Clob.class.isAssignableFrom(cls)) {
+                blobOrClob = true;
+            }
+        }
+        return blobOrClob;
+    }
+
+    
     /**
      * Creates a {@link Builder} for a submenu item where the provided {@link CssMenuLinkFactory} is able to provide the target adapter. 
      */
@@ -260,6 +289,10 @@ public class CssMenuItem implements Serializable {
             // show link...
             markupContainer.add(link);
             link.add(label);
+            
+            if(this.blobOrClob) {
+                link.add(new AttributeModifier("class", Model.of("noVeil")));
+            }
             // .. and hide label
             Components.permanentlyHide(markupContainer, CssMenuItem.ID_MENU_LABEL);
             return link;

http://git-wip-us.apache.org/repos/asf/isis/blob/59c5479b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
index 50ffffc..ce6e0e6 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
@@ -21,7 +21,7 @@ $(document).ready(function() {
         $('#veil').show(); 
     };
     
-    $('.buttons .okButton').click(showVeil);
-    $('.buttons .ok').click(showVeil);
-    $('.cssSubMenuItemsPanel .cssSubMenuItem a').click(showVeil);
+    $('.buttons .okButton:not(.noVeil)').click(showVeil);
+    $('.buttons .ok:not(.noVeil)').click(showVeil);
+    $('.cssSubMenuItemsPanel .cssSubMenuItem a:not(.noVeil)').click(showVeil);
 });