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 */