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 2021/12/20 09:39:27 UTC
[isis] branch master updated: ISIS-2882: fixes prev. commit
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 e58e273 ISIS-2882: fixes prev. commit
e58e273 is described below
commit e58e273a93004c37ba37b0593ab1d91763368dc2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Dec 20 10:37:28 2021 +0100
ISIS-2882: fixes prev. commit
- support for type check on non-scalar managed-objects
- support for type check on primitive managed-objects
---
.../isis/core/metamodel/spec/ManagedObjects.java | 43 +++++++++++++++-------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index fd05830..826f9bf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -33,6 +33,7 @@ import java.util.function.UnaryOperator;
import java.util.stream.Stream;
import org.springframework.lang.Nullable;
+import org.springframework.util.ClassUtils;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -126,26 +127,40 @@ public final class ManagedObjects {
// -- INSTANCE-OF CHECKS
/**
- * guard against incompatible type
+ * Whether given {@code object} is an instance of given {@code elementType}.
+ */
+ public static boolean isInstanceOf(
+ final @Nullable ManagedObject object,
+ final @NonNull ObjectSpecification elementType) {
+ val upperBound = ClassUtils.resolvePrimitiveIfNecessary(elementType.getCorrespondingClass());
+ if(ManagedObjects.isNullOrUnspecifiedOrEmpty(object)) {
+ return true;
+ }
+ if(object instanceof PackedManagedObject) {
+ return ((PackedManagedObject)object).unpack().stream()
+ .allMatch(element->isInstanceOf(element, elementType));
+ }
+ val objectActualType = ClassUtils.resolvePrimitiveIfNecessary(object.getSpecification().getCorrespondingClass());
+ return upperBound.isAssignableFrom(objectActualType);
+ }
+
+ /**
+ * Guard against incompatible type.
*/
public static @NonNull UnaryOperator<ManagedObject> assertInstanceOf(final ObjectSpecification elementType) {
- val upperBound = elementType.getCorrespondingClass();
- return newValue -> {
- if(ManagedObjects.isNullOrUnspecifiedOrEmpty(newValue)) {
- return newValue;
+ return object -> {
+ if(isInstanceOf(object, elementType)) {
+ return object;
}
- val newValueActualType = newValue.getSpecification().getCorrespondingClass();
- if(!upperBound.isAssignableFrom(newValueActualType)) {
- throw _Exceptions.illegalArgument("Proposed new value has incompatible type %s,"
- + "must be an instance of %s.",
- newValueActualType.getName(),
- upperBound.getName());
- }
- return newValue;
+ val upperBound = ClassUtils.resolvePrimitiveIfNecessary(elementType.getCorrespondingClass());
+ val objectActualType = ClassUtils.resolvePrimitiveIfNecessary(object.getSpecification().getCorrespondingClass());
+ throw _Exceptions.illegalArgument("Object has incompatible type %s,"
+ + "must be an instance of %s.",
+ objectActualType.getName(),
+ upperBound.getName());
};
}
-
// -- IDENTIFICATION
public static Optional<ObjectSpecification> spec(final @Nullable ManagedObject managedObject) {