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 2020/05/05 09:40:37 UTC

[isis] 02/02: ISIS-2340: fixes spec#isPojoCompatible(..) predicate

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

commit 1edc412a61a14524ee6dc422c4a9e1731f8f2ea3
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue May 5 11:40:18 2020 +0200

    ISIS-2340: fixes spec#isPojoCompatible(..) predicate
---
 .../commons/internal/collections/_Collections.java  |  7 ++++++-
 .../facets/actcoll/typeof/TypeOfFacet.java          |  5 +++--
 .../collparam/semantics/CollectionSemantics.java    | 11 +++++++++++
 .../core/metamodel/spec/ObjectSpecification.java    | 17 +++++++----------
 .../core/metamodel/spec/feature/ObjectFeature.java  |  2 +-
 .../specimpl/ObjectActionParameterAbstract.java     | 21 ++-------------------
 6 files changed, 30 insertions(+), 33 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java
index ddb4dd6..bfec124 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java
@@ -39,6 +39,7 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
 
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.base._NullSafe;
 import org.apache.isis.core.commons.internal.base._With;
 
@@ -67,6 +68,10 @@ public final class _Collections {
     public static boolean isCollectionType(@Nullable final Class<?> cls) {
         return cls!=null ? java.util.Collection.class.isAssignableFrom(cls) : false;
     }
+    
+    public static boolean isCanType(@Nullable final Class<?> cls) {
+        return cls!=null ? Can.class.isAssignableFrom(cls) : false;
+    }
 
     /**
      * For convenience also provided in {@link _Arrays}.
@@ -269,7 +274,7 @@ public final class _Collections {
             return null;
         }
 
-        if(!isCollectionType(collectionType)) {
+        if(!isCollectionType(collectionType) && !isCanType(collectionType)) {
             return null;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
index 72c457f..75f222a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
@@ -85,7 +85,7 @@ public interface TypeOfFacet extends SingleClassValueFacet {
                 final FacetHolder holder) {
 
             final Class<?> methodReturnType = method.getReturnType();
-            if (!_Collections.isCollectionType(methodReturnType)) {
+            if (!_Collections.isCollectionType(methodReturnType) && !_Collections.isCanType(methodReturnType)) {
                 return null;
             }
 
@@ -149,7 +149,8 @@ public interface TypeOfFacet extends SingleClassValueFacet {
                 final Class<?> parameterType,
                 final Type genericParameterType) {
 
-            final Class<?> elementType = _Collections.inferElementTypeIfAny(parameterType, genericParameterType);
+            Class<?> elementType = _Collections.inferElementTypeIfAny(parameterType, genericParameterType);
+            
             return elementType != null
                     ? new TypeOfFacetInferredFromGenerics(elementType, holder)
                     : null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java
index 9386fb7..a2dadbc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java
@@ -24,6 +24,8 @@ import java.util.Queue;
 import java.util.Set;
 import java.util.SortedSet;
 
+import org.apache.isis.core.commons.collections.Can;
+
 public enum CollectionSemantics {
 
     ARRAY(true),
@@ -39,6 +41,8 @@ public enum CollectionSemantics {
     SET_IMPLEMENTATION,
     SET_INTERFACE(true),
 
+    CAN,
+    
     OTHER_IMPLEMENTATION
     ;
 
@@ -53,6 +57,9 @@ public enum CollectionSemantics {
     }
 
     public static CollectionSemantics of(final Class<?> accessorReturnType) {
+        if (Can.class.isAssignableFrom(accessorReturnType)) {
+            return CAN;
+        }
         if (!Collection.class.isAssignableFrom(accessorReturnType)) {
             return ARRAY;
         }
@@ -78,6 +85,10 @@ public enum CollectionSemantics {
         return this == ARRAY;
     }
 
+    public boolean isCan() {
+        return this == CAN;
+    }
+    
     /**
      * {@link List} is assignable from the corresponding class.
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 00c53ac..1502482 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -34,7 +34,6 @@ import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.internal.base._NullSafe;
 import org.apache.isis.core.commons.internal.collections._Streams;
 import org.apache.isis.core.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.commons.internal.functions._Predicates;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -479,16 +478,14 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
                 || ClassExtensions.equalsWhenBoxing(expectedType, actualType)) {
             return true;
         }
-
-        if(getElementSpecification().isPresent()) {
-            
-            val elementSpec = getElementSpecification().get();
-
-            return !_NullSafe.streamAutodetect(pojo)
-            .anyMatch(_Predicates.not(elementSpec::isPojoCompatible));
-        }
         
-        return false;
+        // XXX rather hard to understand ...
+        // for non-scalar param types, param-spec is always the element-type spec (not the spec of any container)
+        val elementSpec = getElementSpecification()
+                .orElse(this);
+        return _NullSafe.streamAutodetect(pojo)
+                .filter(element->!Objects.equals(element, pojo)) // to prevent infinite recursion depth
+                .allMatch(elementSpec::isPojoCompatible);
     }
     
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java
index a752ddd..78c36da 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java
@@ -67,7 +67,7 @@ public interface ObjectFeature extends Specification {
      * {@link ObjectSpecification} of the type that the accessor returns.
      * <li>for a {@link OneToManyAssociation collection} it will be the type of
      * element the collection holds (not the type of collection).
-     * <li>for a {@link ObjectAction action}, will always return <tt>null</tt>.
+     * <li>for an {@link ObjectAction action}, will always return <tt>null</tt>.
      * See instead {@link ObjectAction#getReturnType()} and
      * {@link ObjectAction#getParameterTypes()}.
      * <li>for a {@link ObjectActionParameter action}, will return the type of
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 38b9b66..dbf0a81 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -94,28 +94,11 @@ implements ObjectActionParameter, FacetHolder.Delegating {
         return featureType;
     }
 
-
-    /**
-     * Gets the proposed value of the {@link ManagedObject} (downcast as a
-     * <code>MutableProposedHolder</code>, wrapping the proposed value into a
-     * {@link ManagedObject}.
-     */
     @Override
     public ManagedObject get(final ManagedObject owner, final InteractionInitiatedBy interactionInitiatedBy) {
-        throw _Exceptions.unexpectedCodeReach();
-        //FIXME[ISIS-1976] marked for removal (must be dead code, since MutableProposedHolder has no implementation)
-        //        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
-        //        final Object proposed = proposedHolder.getProposed();
-        //        return getObjectAdapterProvider().adapterFor(proposed);
+        throw _Exceptions.unexpectedCodeReach(); // not available for params
     }
 
-    //    protected MutableProposedHolder getProposedHolder(final ObjectAdapter owner) {
-    //        if (!(owner instanceof MutableProposedHolder)) {
-    //            throw new IllegalArgumentException("Instance should implement MutableProposedHolder");
-    //        }
-    //        return (MutableProposedHolder) owner;
-    //    }
-
     /**
      * Parameter number, 0-based.
      */
@@ -279,7 +262,7 @@ implements ObjectActionParameter, FacetHolder.Delegating {
         val defaultsFacet = getFacet(ActionParameterDefaultsFacet.class);
         if (defaultsFacet != null && !defaultsFacet.isFallback()) {
             final Object paramValuePojo = defaultsFacet.getDefault(pendingArgs);
-            return ManagedObject.of(paramSpec, paramValuePojo);
+            return ManagedObject.of(paramSpec, paramValuePojo);    
         }
         return pendingArgs.getParamValue(getNumber());
     }