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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 4e5bd8ce3a ISIS-3281: properly distinguish between singular and plural 
cases
4e5bd8ce3a is described below

commit 4e5bd8ce3ad2f78f0c7aa007390ae7df9f9c706a
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Tue Nov 22 09:12:34 2022 +0100

    ISIS-3281: properly distinguish between singular and plural cases
---
 .../domainobjects/ObjectAndActionInvocation.java   | 12 ++++++++
 ...entNegotiationServiceForRestfulObjectsV1_0.java | 34 +++++++---------------
 2 files changed, 23 insertions(+), 23 deletions(-)

diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
index 898ced1d5e..198bbac125 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
@@ -18,9 +18,12 @@
  */
 package org.apache.causeway.viewer.restfulobjects.rendering.domainobjects;
 
+import java.util.List;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.functional.Either;
 import org.apache.causeway.commons.internal.base._Lazy;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ActionInteraction;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -123,6 +126,15 @@ public class ObjectAndActionInvocation {
         return getAction().getReturnType();
     }
 
+    // -- UTILITY
+
+    public Either<ManagedObject, List<ManagedObject>> 
asEitherSingularOrPlural() {
+        return getReturnTypeSpecification().isPlural()
+                ? 
Either.right(Facets.collectionStream(getReturnTypeSpecification(), 
getReturnedAdapter())
+                        .collect(Collectors.toList()))
+                : Either.left(getReturnedAdapter());
+    }
+
     // -- HELPER
 
     private final _Lazy<Can<ManagedObject>> elementAdapters = 
_Lazy.threadSafe(this::initElementAdapters);
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
index 7060e3011b..42fe932d99 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
@@ -21,7 +21,6 @@ package 
org.apache.causeway.viewer.restfulobjects.rendering.service.conneg;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -43,7 +42,6 @@ import 
org.apache.causeway.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
-import org.apache.causeway.core.metamodel.util.Facets;
 import 
org.apache.causeway.viewer.restfulobjects.applib.CausewayModuleViewerRestfulObjectsApplib;
 import org.apache.causeway.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.causeway.viewer.restfulobjects.applib.RepresentationType;
@@ -197,25 +195,30 @@ implements ContentNegotiationService {
             final IResourceContext resourceContext,
             final ObjectAndActionInvocation objectAndActionInvocation) {
 
+        final List<MediaType> acceptableMediaTypes = 
resourceContext.getAcceptableMediaTypes();
+
         val returnTypeCompileTimeSpecification = 
objectAndActionInvocation.getReturnTypeSpecification();
 
         val isDomainObjectOrCollection = 
returnTypeCompileTimeSpecification.isEntityOrViewModelOrAbstract()
                 || returnTypeCompileTimeSpecification.isPlural();
 
-        final List<MediaType> acceptableMediaTypes = 
resourceContext.getAcceptableMediaTypes();
         if(isDomainObjectOrCollection
                 && isAccepted(RepresentationType.DOMAIN_OBJECT, 
acceptableMediaTypes)) {
 
-            final Collection<ManagedObject> collectionAdapters = 
objectAdaptersFrom(objectAndActionInvocation);
-
-            if(collectionAdapters != null) {
+            return objectAndActionInvocation.asEitherSingularOrPlural()
+            .fold(singularActionResult->{
+                return responseBuilder(
+                        buildResponse(
+                                resourceContext,
+                                singularActionResult));
+            }, pluralActionResult->{
                 final ObjectSpecification elementSpec =
                         objectAndActionInvocation.getAction().getElementType();
                 final ObjectSpecification actionOwnerSpec = 
actionOwnerSpecFrom(objectAndActionInvocation);
                 final String actionId = 
actionIdFrom(objectAndActionInvocation);
                 final String actionArguments = 
actionArgumentsFrom(objectAndActionInvocation);
                 final DomainObjectList listAsViewmodel = domainObjectListFrom(
-                        collectionAdapters, elementSpec, actionOwnerSpec, 
actionId, actionArguments);
+                        pluralActionResult, elementSpec, actionOwnerSpec, 
actionId, actionArguments);
 
                 val domainObjectListSpec = 
resourceContext.getMetaModelContext().getSpecificationLoader()
                     .specForType(DomainObjectList.class)
@@ -228,14 +231,7 @@ implements ContentNegotiationService {
                         buildResponse(
                                 resourceContext,
                                 listAdapter));
-
-            } else {
-
-                return responseBuilder(
-                        buildResponse(
-                                resourceContext,
-                                
objectAndActionInvocation.getReturnedAdapter()));
-            }
+            });
 
         }
 
@@ -341,14 +337,6 @@ implements ContentNegotiationService {
         return title;
     }
 
-    private Collection<ManagedObject> objectAdaptersFrom(final 
ObjectAndActionInvocation objectAndActionInvocation) {
-        val returnedAdapter = objectAndActionInvocation.getReturnedAdapter();
-        val returnTypeSpec = 
objectAndActionInvocation.getAction().getReturnType();
-
-        return Facets.collectionStream(returnTypeSpec, returnedAdapter)
-                .collect(Collectors.toList());
-    }
-
     /**
      * Not API
      */

Reply via email to