You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/01/09 18:20:55 UTC

[isis] branch master updated: ISIS-2940: don't replace empty non-scalars with null

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 33853d8  ISIS-2940: don't replace empty non-scalars with null
33853d8 is described below

commit 33853d8a844e07f2d2caf4c2aba418131e3ca305
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Jan 9 19:20:41 2022 +0100

    ISIS-2940: don't replace empty non-scalars with null
---
 ...ctionInvocationFacetForDomainEventAbstract.java | 18 +++++-----
 .../metamodel/objectmanager/ObjectManager.java     | 23 ++++++++++--
 .../executor/MemberExecutorServiceDefault.java     | 41 ++++++----------------
 .../repository/RepositoryServiceDefault.java       | 19 +++++-----
 4 files changed, 51 insertions(+), 50 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 2d00262..7d9b5a2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -127,14 +127,16 @@ implements ImperativeFacet {
 
         val method = methods.getFirstOrFail();
 
-        return getMemberExecutor().invokeAction(
-                owningAction,
-                head,
-                argumentAdapters,
-                interactionInitiatedBy,
-                method,
-                DomainEventMemberExecutor::new,
-                getFacetHolder());
+        val resultAdapter = getMemberExecutor()
+                .invokeAction(
+                    owningAction,
+                    head,
+                    argumentAdapters,
+                    interactionInitiatedBy,
+                    method,
+                    DomainEventMemberExecutor::new,
+                    getFacetHolder());
+        return resultAdapter;
     }
 
     private Object invokeMethodElseFromCache(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
index 1a93c84..f5f002f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.objectmanager;
 
 import java.util.Optional;
+import java.util.function.Supplier;
 
 import org.springframework.lang.Nullable;
 
@@ -39,6 +40,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.PackedManagedObject;
 
+import lombok.NonNull;
 import lombok.val;
 
 /**
@@ -120,11 +122,27 @@ public interface ObjectManager {
         boolean isMemoize() { return this == MEMOIZE_BOOKMARK;}
     }
 
+    /**
+     * Not suitable for adapting a non-scalar. Auto-memoizes the ManagedObject's bookmark, if applicable.
+     */
     public default ManagedObject adapt(final @Nullable Object pojo) {
-        return adapt(pojo, EntityAdaptingMode.MEMOIZE_BOOKMARK);
+        return adapt(pojo, ()->specForType(Object.class).orElseThrow(), EntityAdaptingMode.MEMOIZE_BOOKMARK);
     }
 
+    /**
+     * Not suitable for adapting a non-scalar.
+     */
     public default ManagedObject adapt(final @Nullable Object pojo, final EntityAdaptingMode bookmarking) {
+        return adapt(pojo, ()->specForType(Object.class).orElseThrow(), bookmarking);
+    }
+
+    /**
+     * Suitable for adapting a non-scalar.
+     */
+    public default ManagedObject adapt(
+            final @Nullable Object pojo,
+            final @NonNull Supplier<ObjectSpecification> fallbackElementType,
+            final EntityAdaptingMode bookmarking) {
         if(pojo==null) {
             return ManagedObject.unspecified();
         }
@@ -138,7 +156,8 @@ public interface ObjectManager {
                         && bookmarking.isMemoize()
                         ? memoizeEntityBookmark(spec, pojo)
                         : ManagedObject.of(spec, pojo)
-                : PackedManagedObject.pack(spec.getElementSpecification().orElse(spec),
+                : PackedManagedObject.pack(
+                        spec.getElementSpecification().orElseGet(fallbackElementType),
                         _NullSafe.streamAutodetect(pojo)
                         .map(element->adapt(element, bookmarking))
                         .collect(Can.toCan()));
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
index 5143c91..648ad2f 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
@@ -56,6 +56,7 @@ import org.apache.isis.core.metamodel.facets.members.publish.execution.Execution
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertySetterOrClearFacetForDomainEventAbstract.EditingVariant;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManager.EntityAdaptingMode;
 import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.services.ixn.InteractionDtoFactory;
 import org.apache.isis.core.metamodel.services.publishing.ExecutionPublisher;
@@ -166,7 +167,8 @@ implements MemberExecutorService {
         }
 
         val returnedPojo = priorExecution.getReturned();
-        val returnedAdapter = objectManager.adapt(returnedPojo);
+        val returnedAdapter = objectManager.adapt(
+                returnedPojo, owningAction::getElementType, EntityAdaptingMode.MEMOIZE_BOOKMARK);
 
         // sync DTO with result
         interactionDtoFactory
@@ -296,42 +298,19 @@ implements MemberExecutorService {
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         if(ManagedObjects.isNullOrUnspecifiedOrEmpty(resultAdapter)) {
-            return null;
-        }
-
-        final boolean filterForVisibility = getConfiguration().getCore().getMetaModel().isFilterVisibility();
-        if (!filterForVisibility) {
             return resultAdapter;
         }
 
-        if(resultAdapter instanceof PackedManagedObject) {
+        val isFilterForVisibility = getConfiguration().getCore().getMetaModel().isFilterVisibility();
+        if (!isFilterForVisibility
+                || resultAdapter instanceof PackedManagedObject) {
             return resultAdapter;
         }
 
-//        final Object result = resultAdapter.getPojo();
-//
-//        if(result instanceof Collection || result.getClass().isArray()) {
-//
-//            val requiredContainerType = method.getReturnType();
-//
-//            val autofittedObjectContainer = ManagedObjects.VisibilityUtil
-//                    .visiblePojosAutofit(resultAdapter, interactionInitiatedBy, requiredContainerType);
-//
-//            if (autofittedObjectContainer != null) {
-//                return getObjectManager().adapt(autofittedObjectContainer);
-//            }
-//
-//            // would be null if unable to take a copy (unrecognized return type)
-//            // fallback to returning the original adapter, without filtering for visibility
-//
-//            return resultAdapter;
-//
-//        } else {
-            boolean visible = ManagedObjects.VisibilityUtil.isVisible(resultAdapter, interactionInitiatedBy);
-            return visible ? resultAdapter : null;
-//        }
+        val isVisible = ManagedObjects.VisibilityUtil.isVisible(resultAdapter, interactionInitiatedBy);
+        return isVisible
+                ? resultAdapter
+                : null;
     }
 
-
-
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
index d2b98d5..3e81cb5 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
@@ -25,12 +25,12 @@ import java.util.Optional;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
-import org.springframework.lang.Nullable;
 import javax.annotation.PostConstruct;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotations.PriorityPrecedence;
@@ -140,19 +140,19 @@ public class RepositoryServiceDefault implements RepositoryService {
     }
 
     @Override
-    public <T> List<T> allInstances(final Class<T> type, long start, long count) {
+    public <T> List<T> allInstances(final Class<T> type, final long start, final long count) {
         return allMatches(Query.<T>allInstances(type)
                 .withRange(QueryRange.of(start, count)));
     }
 
     @Override
-    public <T> List<T> allMatches(Class<T> ofType, Predicate<? super T> predicate) {
+    public <T> List<T> allMatches(final Class<T> ofType, final Predicate<? super T> predicate) {
         return allMatches(ofType, predicate, 0L, Long.MAX_VALUE);
     }
 
 
     @Override
-    public <T> List<T> allMatches(Class<T> ofType, final Predicate<? super T> predicate, long start, long count) {
+    public <T> List<T> allMatches(final Class<T> ofType, final Predicate<? super T> predicate, final long start, final long count) {
         return _NullSafe.stream(allInstances(ofType, start, count))
                 .filter(predicate)
                 .collect(Collectors.toCollection(ArrayList::new));
@@ -178,7 +178,8 @@ public class RepositoryServiceDefault implements RepositoryService {
 
         val queryRequest = ObjectBulkLoader.Request.of(resultTypeSpec, query);
         val allMatching = objectManager.queryObjects(queryRequest);
-        return _Casts.uncheckedCast(UnwrapUtil.multipleAsList(allMatching));
+        final List<T> resultList = _Casts.uncheckedCast(UnwrapUtil.multipleAsList(allMatching));
+        return resultList;
     }
 
     @Override
@@ -214,21 +215,21 @@ public class RepositoryServiceDefault implements RepositoryService {
     }
 
     @Override
-    public <T> T refresh(T pojo) {
+    public <T> T refresh(final T pojo) {
         val managedObject = objectManager.adapt(pojo);
         objectManager.getObjectRefresher().refreshObject(managedObject);
         return _Casts.uncheckedCast(managedObject.getPojo());
     }
 
     @Override
-    public <T> T detach(T entity) {
+    public <T> T detach(final T entity) {
         val managedObject = objectManager.adapt(entity);
         val managedDetachedObject = objectManager.getObjectDetacher().detachObject(managedObject);
         return _Casts.uncheckedCast(managedDetachedObject.getPojo());
     }
 
     @Override
-    public <T> void removeAll(Class<T> cls) {
+    public <T> void removeAll(final Class<T> cls) {
         allInstances(cls).forEach(this::remove);
 
     }
@@ -241,7 +242,7 @@ public class RepositoryServiceDefault implements RepositoryService {
                 : Optional.of(instances.get(0));
     }
 
-    private Object unwrapped(Object domainObject) {
+    private Object unwrapped(final Object domainObject) {
         return wrapperFactory != null ? wrapperFactory.unwrap(domainObject) : domainObject;
     }