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 <[email protected]>
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
*/