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 2019/10/08 15:32:36 UTC

[isis] branch v2 updated: ISIS-1998: extending MixinFacet to help with early mixin-main method detection

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/v2 by this push:
     new 7f774c2  ISIS-1998: extending MixinFacet to help with early mixin-main method detection
7f774c2 is described below

commit 7f774c2320ccf3ca865f27fd747417eef012e2d9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Oct 8 17:32:28 2019 +0200

    ISIS-1998: extending MixinFacet to help with early mixin-main method
    detection
---
 .../main/java/org/apache/isis/metamodel/facets/FacetFactory.java  | 2 +-
 .../org/apache/isis/metamodel/facets/object/mixin/MixinFacet.java | 8 ++++++++
 .../isis/metamodel/facets/object/mixin/MixinFacetAbstract.java    | 7 +++++++
 .../isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java | 8 +++++++-
 .../specloader/specimpl/ObjectSpecificationAbstract.java          | 2 +-
 .../testdomain/domainmodel/DomainModelTest_usingGoodDomain.java   | 2 +-
 6 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactory.java
index 968bd9c..5fb998a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactory.java
@@ -220,7 +220,7 @@ public interface FacetFactory {
             
             super(cls, method, methodRemover, facetedMethod);
             this.featureType = featureType;
-            this.mixinMain = false;
+            this.mixinMain = isMixinMain;
         }
         
         /** JUnit support, historically not using 'isMixinMain' */
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacet.java
index 1649b4d..d376c1f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacet.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.metamodel.facets.object.mixin;
 
+import java.lang.reflect.Method;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.DomainObject;
@@ -62,6 +64,12 @@ public interface MixinFacet extends SingleValueFacet<String> {
      */
     Object instantiate(Object holderPojo);
 
+    /**
+     * Whether given method matches as a candidate for the mixin's main method. 
+     * @param method
+     * @return whether has expected name and same declaring class
+     */
+    boolean isCandidateForMain(Method method);
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java
index b4c399c..a19bdda 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java
@@ -21,6 +21,7 @@ package org.apache.isis.metamodel.facets.object.mixin;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.Map;
 
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
@@ -91,6 +92,12 @@ extends SingleValueFacetAbstract<String> implements MixinFacet {
     }
 
     @Override
+    public boolean isCandidateForMain(Method method) {
+        return method.getName().equals(super.value()) &&
+                constructor.getDeclaringClass().equals(method.getDeclaringClass());
+    }
+    
+    @Override
     public ObjectAdapter mixedIn(ManagedObject mixinAdapter, Policy policy) {
         val mixinPojo = mixinAdapter.getPojo();
         val holderPojo = holderPojoFor(mixinPojo, policy);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 4fa4b8a..4e70746 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -46,6 +46,7 @@ import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.metamodel.facets.object.facets.FacetsFacet;
+import org.apache.isis.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.metamodel.methodutils.MethodScope;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
@@ -565,9 +566,14 @@ public class FacetedMethodsBuilder {
      * @param method
      */
     private boolean isMixinMain(Method method) {
-        if(!this.inspectedTypeSpec.isMixin()) {
+        val mixinFacet = inspectedTypeSpec.getFacet(MixinFacet.class);
+        if(mixinFacet==null) {
             return false;
         }
+        if(inspectedTypeSpec.isLessThan(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED)) {
+            // members are not introspected yet, so make a guess
+            return mixinFacet.isCandidateForMain(method);
+        }
         val mixinMember = inspectedTypeSpec.getMixedInMember(inspectedTypeSpec);
         if(!mixinMember.isPresent()) {
             return false;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index fa24f6e..29c5817 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -322,7 +322,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         }
     }
 
-    private boolean isLessThan(IntrospectionState upTo) {
+    boolean isLessThan(IntrospectionState upTo) {
         return this.introspectionState.compareTo(upTo) < 0;
     }
     
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
index 87f83a6..b2391e9 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
@@ -47,7 +47,7 @@ import lombok.val;
         })
 @TestPropertySource({
     IsisPresets.DebugValidation,
-    IsisPresets.DebugProgrammingModel,
+    //IsisPresets.DebugProgrammingModel,
     
 })
 class DomainModelTest_usingGoodDomain {