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