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;
}