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/02/19 15:29:39 UTC

[isis] branch master updated: ISIS-2498: remove ActionParameterChoicesFacetFromParentedCollection's requirement for mixins to hold their mixees

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 7674de9  ISIS-2498: remove ActionParameterChoicesFacetFromParentedCollection's requirement for mixins to hold their mixees
7674de9 is described below

commit 7674de9700c0ebacb048ae8d95f089690958a525
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Feb 19 16:29:24 2021 +0100

    ISIS-2498: remove ActionParameterChoicesFacetFromParentedCollection's
    requirement for mixins to hold their
    mixees
---
 .../metamodel/facets/object/mixin/MixinFacet.java  |  7 ---
 .../facets/object/mixin/MixinFacetAbstract.java    | 68 +---------------------
 .../mixin/MixinFacetForDomainObjectAnnotation.java |  8 +--
 .../objectvalue/choices/ChoicesFacetAbstract.java  |  4 +-
 ...arameterChoicesFacetFromParentedCollection.java | 19 +++---
 .../object/mixin/MixinFacetAbstract_Test.java      |  2 +-
 6 files changed, 19 insertions(+), 89 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
index 2121dcc..727f910 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.core.metamodel.facets.SingleValueFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 /**
@@ -52,12 +51,6 @@ public interface MixinFacet extends SingleValueFacet<String> {
     }
 
     /**
-     * Returns the (adapter of the) domain object that is the <i>holder</i> of the 
-     * given mix-in adapter.
-     */
-    ManagedObject mixedIn(ManagedObject mixinAdapter, Policy policy);
-
-    /**
      * Returns the mix-in around the provided domain object (<i>holder</i>)
      */
     Object instantiate(Object holderPojo);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
index ccc3561..4bf3810 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
@@ -20,27 +20,18 @@
 package org.apache.isis.core.metamodel.facets.object.mixin;
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Map;
-import java.util.Optional;
 
-import javax.annotation.Nullable;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.commons.functional.Result;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 import lombok.val;
-import lombok.extern.log4j.Log4j2;
 
-@Log4j2
+//@Log4j2
 public abstract class MixinFacetAbstract
 extends SingleValueFacetAbstract<String>
 implements MixinFacet {
@@ -48,7 +39,6 @@ implements MixinFacet {
     private final Class<?> mixinType;
     private final Class<?> holderType;
     private final Constructor<?> constructor;
-    private final Field holderField; // XXX validators should check whether we found the field
 
     public static Class<? extends Facet> type() {
         return MixinFacet.class;
@@ -58,32 +48,13 @@ implements MixinFacet {
             final Class<?> mixinType,
             final String value,
             final Constructor<?> constructor,
-            final FacetHolder holder,
-            final @Nullable MetaModelValidatorForMixinTypes mixinTypeValidator) { //nullable for testing
+            final FacetHolder holder) {
 
         super(type(), value, holder);
         this.mixinType = mixinType;
         this.constructor = constructor;
         // by mixin convention: first constructor argument is identified as the holder type
         this.holderType = constructor.getParameterTypes()[0]; 
-        // search the type hierarchy of the mixin type for any matching (public and non-public) fields
-        this.holderField = _Reflect.streamAllFields(mixinType, true)
-                .filter(mixinField->mixinField.getType().isAssignableFrom(holderType))
-                .findFirst()
-                .orElse(null);
-        
-        if(holderField==null) {
-            
-            val msg = String.format("Could not find the 'mixed-in' domain object within %s" 
-                            + " (tried to guess by looking at all public and non-public fields "
-                            + "and matching one against the constructor parameter's type)", 
-                            mixinType.getName());
-            log.warn(msg);
-            
-            if(mixinTypeValidator!=null) {
-                mixinTypeValidator.onFailure(holder, Identifier.classIdentifier(mixinType), msg);
-            }
-        }
     }
 
     @Override
@@ -132,15 +103,6 @@ implements MixinFacet {
                     .isAssignableFrom(constructor.getDeclaringClass());
     }
 
-    @Override @Deprecated
-    public ManagedObject mixedIn(ManagedObject mixinAdapter, Policy policy) {
-        val mixinPojo = mixinAdapter.getPojo();
-        val holderPojo = holderPojoFor(mixinPojo, policy);
-        return holderPojo!=null
-                ? getObjectManager().adapt(holderPojo)
-                : null;
-    }
-
     @Override
     public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
@@ -155,31 +117,5 @@ implements MixinFacet {
     public String getMainMethodName() {
         return super.value();
     }
-    
-    // -- HELPER
 
-    private Object holderPojoFor(Object mixinPojo, Policy policy) {
-        
-        val holderPojoGetterResult = Optional.ofNullable(holderField)
-        .map(field->Result.of(()->_Reflect.getFieldOn(field, mixinPojo)))
-        .orElseGet(()->Result.failure("no such field"));
-                
-        if(holderPojoGetterResult.isFailure()) {
-            
-            val msg = String.format(
-                    "Could not %s the \"mixed-in\" domain object within %s" 
-                            + " (tried to guess by looking at all public and non-public fields "
-                            + "and matching one against the constructor parameter's type)",
-                            holderField==null ? "find" : "access",
-                            getTitleService().titleOf(mixinPojo));
-            
-            log.warn(msg);
-            
-            if(policy == Policy.FAIL_FAST) {
-                throw _Exceptions.unrecoverable(msg); 
-            }
-        }
-
-        return holderPojoGetterResult.getValue().orElse(null);
-    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
index 37dc83b..cf30a76 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -44,10 +44,9 @@ extends MixinFacetAbstract {
             final Class<?> mixinType,
             final String value, 
             final Constructor<?> constructorType,
-            final FacetHolder holder, 
-            MetaModelValidatorForMixinTypes mixinTypeValidator) {
+            final FacetHolder holder) {
 
-        super(mixinType, value, constructorType, holder, mixinTypeValidator);
+        super(mixinType, value, constructorType, holder);
     }
 
     public static MixinFacet create(
@@ -70,8 +69,7 @@ extends MixinFacetAbstract {
                         candidateMixinType, 
                         domainObject.mixinMethod(), 
                         constructor, 
-                        facetHolder,
-                        mixinTypeValidator))
+                        facetHolder))
             .orElse(null);
         })
         .orElse(null);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java
index 74eb0ae..a0c7603 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/choices/ChoicesFacetAbstract.java
@@ -23,7 +23,9 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public abstract class ChoicesFacetAbstract extends FacetAbstract implements ChoicesFacet {
+public abstract class ChoicesFacetAbstract
+extends FacetAbstract 
+implements ChoicesFacet {
 
     public static Class<? extends Facet> type() {
         return ChoicesFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
index f8e8d51..2738fad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.postprocessors.param;
 import java.util.Map;
 
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
@@ -33,7 +34,8 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
 import lombok.val;
 
-public class ActionParameterChoicesFacetFromParentedCollection extends ActionParameterChoicesFacetAbstract {
+public class ActionParameterChoicesFacetFromParentedCollection 
+extends ActionParameterChoicesFacetAbstract {
 
     private final OneToManyAssociation otma;
 
@@ -51,22 +53,21 @@ public class ActionParameterChoicesFacetFromParentedCollection extends ActionPar
             final Can<ManagedObject> pendingArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        val parentAdapter = determineParentAdapter(target);
-        val objectAdapter = otma.get(parentAdapter, interactionInitiatedBy);
-        return CollectionFacet.streamAdapters(objectAdapter).collect(Can.toCan());
+        guardAgainstMixin(target);
+        val collectionAdapter = otma.get(target, interactionInitiatedBy);
+        return CollectionFacet.streamAdapters(collectionAdapter).collect(Can.toCan());
     }
 
     /**
      * in the case of a mixin action, the target passed to the facet is actually the mixin itself, 
-     * not the mixee.
+     * not the mixee
      */
-    private ManagedObject determineParentAdapter(final ManagedObject target) {
+    private void guardAgainstMixin(final ManagedObject target) {
         val mixinFacet = target.getSpecification().getFacet(MixinFacet.class);
-        ManagedObject mixedInTarget = null;
         if(mixinFacet != null) {
-            mixedInTarget = mixinFacet.mixedIn(target, MixinFacet.Policy.FAIL_FAST);
+            _Exceptions.unrecoverable("internal error: choices facet invoked on mixin target, "
+                    + "but should be a mixee target instead");
         }
-        return mixedInTarget != null ? mixedInTarget : target;
     }
 
     @Override 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract_Test.java
index c4282bf..d338ddc 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract_Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract_Test.java
@@ -29,7 +29,7 @@ class MixinFacetAbstract_Test {
             // given
             val constructor = Collection_numberOfChildren.class.getConstructor(Object.class);
             val facet = new MixinFacetAbstract(
-                    Collection_numberOfChildren.class, "prop", constructor, null, null) {};
+                    Collection_numberOfChildren.class, "prop", constructor, null) {};
 
             val propMethodInSubclass = SimpleObject_numberOfChildren.class.getMethod("prop");