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 2018/02/28 12:38:36 UTC

[isis] 05/06: ISIS-1882: extends DomainObjectList to contain details of the action invocation.

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch maint-1.16.2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 804f103b0a1852a5a4cf20953e8142b3a0de9254
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Feb 28 12:34:22 2018 +0000

    ISIS-1882: extends DomainObjectList to contain details of the action invocation.
---
 .../isis/applib/domain/DomainObjectList.java       | 59 +++++++++++++++++++++-
 .../domainobjects/ObjectAndActionInvocation.java   |  9 ++++
 ...entNegotiationServiceForRestfulObjectsV1_0.java | 49 ++++++++++++++++--
 .../server/resources/DomainResourceHelper.java     |  2 +-
 4 files changed, 114 insertions(+), 5 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java b/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
index 9b7a41c..34e485b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.schema.utils.jaxbadapters.PersistentEntitiesAdapter;
 
@@ -39,6 +40,9 @@ import org.apache.isis.schema.utils.jaxbadapters.PersistentEntitiesAdapter;
 @XmlType(
         propOrder = {
                 "title",
+                "actionOwningType",
+                "actionId",
+                "actionArguments",
                 "elementObjectType",
                 "objects"
         }
@@ -71,9 +75,17 @@ public class DomainObjectList {
     //region > constructors
     public DomainObjectList() {
     }
-    public DomainObjectList(final String title, final String elementObjectType) {
+    public DomainObjectList(
+            final String title,
+            final String elementObjectType,
+            final String actionOwningType,
+            final String actionId,
+            final String actionArguments) {
         this.title = title;
         this.elementObjectType = elementObjectType;
+        this.actionOwningType = actionOwningType;
+        this.actionId = actionId;
+        this.actionArguments = actionArguments;
     }
     //endregion
 
@@ -97,6 +109,51 @@ public class DomainObjectList {
     }
     //endregion
 
+    //region > property: actionOwningType
+    public static class ActionOwningTypeDomainEvent extends PropertyDomainEvent<String> { }
+
+    private String actionOwningType;
+
+    @Property(
+            domainEvent = ActionOwningTypeDomainEvent.class,
+            optionality = Optionality.OPTIONAL,
+            editing = Editing.DISABLED
+    )
+    public String getActionOwningType() {
+        return actionOwningType;
+    }
+    //endregion
+
+    //region > property: actionId
+    public static class ActionIdDomainEvent extends PropertyDomainEvent<String> { }
+
+    private String actionId;
+
+    @Property(
+            domainEvent = ActionIdDomainEvent.class,
+            optionality = Optionality.OPTIONAL,
+            editing = Editing.DISABLED
+    )
+    public String getActionId() {
+        return actionId;
+    }
+    //endregion
+
+    //region > property: actionArguments
+    public static class ActionArgumentsDomainEvent extends PropertyDomainEvent<String> { }
+
+    private String actionArguments;
+
+    @Property(
+            domainEvent = ActionArgumentsDomainEvent.class,
+            optionality = Optionality.OPTIONAL,
+            editing = Editing.DISABLED
+    )
+    public String getActionArguments() {
+        return actionArguments;
+    }
+    //endregion
+
     //region > collection: objects
     public static class ObjectsDomainEvent extends CollectionDomainEvent<Object> { }
 
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
index f009d3f..70b695e 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
@@ -31,6 +33,7 @@ public class ObjectAndActionInvocation {
     private final ObjectAdapter objectAdapter;
     private final ObjectAction action;
     private final JsonRepresentation arguments;
+    private final List<ObjectAdapter> argAdapters;
     private final ObjectAdapter returnedAdapter;
     private final ActionResultReprRenderer.SelfLink selfLink;
 
@@ -38,11 +41,13 @@ public class ObjectAndActionInvocation {
             final ObjectAdapter objectAdapter,
             final ObjectAction action,
             final JsonRepresentation arguments,
+            final List<ObjectAdapter> argAdapters,
             final ObjectAdapter returnedAdapter,
             final ActionResultReprRenderer.SelfLink selfLink) {
         this.objectAdapter = objectAdapter;
         this.action = action;
         this.arguments = arguments;
+        this.argAdapters = argAdapters;
         this.returnedAdapter = returnedAdapter;
         this.selfLink = selfLink;
     }
@@ -59,6 +64,10 @@ public class ObjectAndActionInvocation {
         return arguments;
     }
 
+    public List<ObjectAdapter> getArgAdapters() {
+        return argAdapters;
+    }
+
     public ObjectAdapter getReturnedAdapter() {
         return returnedAdapter;
     }
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
index 6a81810..90f35c8 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
@@ -36,6 +36,7 @@ import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
@@ -214,7 +215,10 @@ public class ContentNegotiationServiceForRestfulObjectsV1_0 implements ContentNe
 
             if(collectionAdapters != null) {
                 final ObjectSpecification elementSpec = elementSpecFrom(objectAndActionInvocation);
-                final DomainObjectList list = domainObjectListFrom(collectionAdapters, elementSpec);
+                final String actionOwningType = actionOwningTypeFrom(objectAndActionInvocation);
+                final String actionId = actionIdFrom(objectAndActionInvocation);
+                final String actionArguments = actionArgumentsFrom(objectAndActionInvocation);
+                final DomainObjectList list = domainObjectListFrom(collectionAdapters, elementSpec, actionOwningType, actionId, actionArguments);
 
                 adapter = rendererContext.getPersistenceSession().adapterFor(list);
 
@@ -232,13 +236,52 @@ public class ContentNegotiationServiceForRestfulObjectsV1_0 implements ContentNe
         return responseBuilder(responseBuilder);
     }
 
+    private static String actionOwningTypeFrom(final ObjectAndActionInvocation objectAndActionInvocation) {
+        return objectAndActionInvocation.getAction().getOnType().getSpecId().asString();
+    }
+
+    private static String actionIdFrom(final ObjectAndActionInvocation objectAndActionInvocation) {
+        return objectAndActionInvocation.getAction().getId();
+    }
+
+    private static String actionArgumentsFrom(final ObjectAndActionInvocation objectAndActionInvocation) {
+        final StringBuilder buf = new StringBuilder();
+        final List<ObjectActionParameter> parameters = objectAndActionInvocation.getAction().getParameters();
+        final List<ObjectAdapter> argAdapters = objectAndActionInvocation.getArgAdapters();
+        if(parameters.size() == argAdapters.size()) {
+            for (int i = 0; i < parameters.size(); i++) {
+                final ObjectActionParameter param = parameters.get(i);
+                final ObjectAdapter argAdapter = argAdapters.get(i);
+
+                if(buf.length() > 0) {
+                    buf.append(",");
+                }
+                buf.append(param.getName()).append("=");
+                buf.append(abbreviated(titleOf(argAdapter), 8));
+            }
+        }
+
+        return buf.toString();
+    }
+
+    private static String titleOf(final ObjectAdapter argumentAdapter) {
+        return argumentAdapter!=null?argumentAdapter.titleString(null):"";
+    }
+
+    private static String abbreviated(final String str, final int maxLength) {
+        return str.length() < maxLength ? str : str.substring(0, maxLength - 3) + "...";
+    }
+
     private static DomainObjectList domainObjectListFrom(
             final Collection<ObjectAdapter> collectionAdapters,
-            final ObjectSpecification elementSpec) {
+            final ObjectSpecification elementSpec,
+            final String actionOwningType,
+            final String actionId,
+            final String actionArguments) {
 
         final String title = titleFrom(collectionAdapters, elementSpec);
 
-        final DomainObjectList list = new DomainObjectList(title, elementSpec.getSpecId().asString());
+        final DomainObjectList list = new DomainObjectList(title, elementSpec.getSpecId().asString(), actionOwningType, actionId, actionArguments);
         for (final ObjectAdapter adapter : collectionAdapters) {
             list.getObjects().add(adapter.getObject());
         }
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index da57bcd..40385c4 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -372,7 +372,7 @@ public class DomainResourceHelper {
                 InteractionInitiatedBy.USER);
 
         final ObjectAndActionInvocation objectAndActionInvocation =
-                new ObjectAndActionInvocation(objectAdapter, action, arguments, returnedAdapter, selfLink);
+                new ObjectAndActionInvocation(objectAdapter, action, arguments, argAdapters, returnedAdapter, selfLink);
 
         // response
         transactionService.flushTransaction();

-- 
To stop receiving notification emails like this one, please contact
danhaywood@apache.org.