You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/01/21 23:12:19 UTC

[isis] 02/02: ISIS-1628: no longer requires method to be overridden in mixin subclass.

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

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

commit 01b627e8085cf8a29aa4ace57056886cb7c91a8b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jan 21 23:11:49 2021 +0000

    ISIS-1628: no longer requires method to be overridden in mixin subclass.
---
 .../facets/object/mixin/MixinFacetAbstract.java    | 26 +++++++-----
 .../object/mixin/MixinFacetAbstract_Test.java      | 48 +++++++++++++++++++++-
 testing/fixtures/applib/pom.xml                    |  6 +++
 3 files changed, 67 insertions(+), 13 deletions(-)

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 cbc0708..caff110 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
@@ -33,8 +33,8 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 import lombok.val;
 
-public abstract class MixinFacetAbstract 
-extends SingleValueFacetAbstract<String> 
+public abstract class MixinFacetAbstract
+extends SingleValueFacetAbstract<String>
 implements MixinFacet {
 
     private final Class<?> mixinType;
@@ -47,7 +47,7 @@ implements MixinFacet {
 
     public MixinFacetAbstract(
             final Class<?> mixinType,
-            final String value, 
+            final String value,
             final Constructor<?> constructor,
             final FacetHolder holder) {
 
@@ -76,7 +76,7 @@ implements MixinFacet {
         }
         if(!isMixinFor(domainPojo.getClass())) {
             throw _Exceptions.unrecoverableFormatted(
-                    "invalid mix-in declaration of type %s, unexpect owner type %s", 
+                    "invalid mix-in declaration of type %s, unexpect owner type %s",
                     mixinType, domainPojo.getClass());
         }
         try {
@@ -91,10 +91,14 @@ implements MixinFacet {
 
     @Override
     public boolean isCandidateForMain(Method method) {
-        return method.getName().equals(super.value()) &&
-                constructor.getDeclaringClass().equals(method.getDeclaringClass());
+        if (method.getName().equals(super.value())) {
+            final Class<?> constructorDeclaringClass = constructor.getDeclaringClass();
+            final Class<?> methodDeclaringClass = method.getDeclaringClass();
+            if (methodDeclaringClass.isAssignableFrom(constructorDeclaringClass)) return true;
+        }
+        return false;
     }
-    
+
     @Override
     public ManagedObject mixedIn(ManagedObject mixinAdapter, Policy policy) {
         val mixinPojo = mixinAdapter.getPojo();
@@ -104,17 +108,17 @@ implements MixinFacet {
                         : null;
     }
 
-    @Override 
+    @Override
     public void appendAttributesTo(final Map<String, Object> attributeMap) {
         super.appendAttributesTo(attributeMap);
         attributeMap.put("mixinType", mixinType);
         attributeMap.put("constructorType", constructorType);
     }
-    
+
     // -- HELPER
-    
+
     private Object holderPojoFor(Object mixinPojo, Policy policy) {
-        val mixinFields = mixinType.getDeclaredFields();
+        val mixinFields = mixinType.getFields();
         for (val mixinField : mixinFields) {
             if(mixinField.getType().isAssignableFrom(constructorType)) {
                 try {
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 49575cb..9da5819 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
@@ -1,4 +1,48 @@
+package org.apache.isis.core.metamodel.facets.object.mixin;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
 import static org.junit.jupiter.api.Assertions.*;
-class MixinFacetAbstract_isCandidateForMain_Test {
-  
+
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.val;
+
+class MixinFacetAbstract_Test {
+
+    public abstract static class Collection_numberOfChildren {
+        public Collection_numberOfChildren(Object contributee) {}
+        public int prop() { return 0; }
+    }
+
+    public static class SimpleObject {}
+    public static class SimpleObject_numberOfChildren extends Collection_numberOfChildren {
+        public SimpleObject_numberOfChildren(SimpleObject contributee) { super(contributee); }
+    }
+
+    @Nested
+    class isCandidateForMain {
+
+        @SneakyThrows
+        @Test
+        public void happy_case() {
+
+            // given
+            val constructor = Collection_numberOfChildren.class.getConstructor(Object.class);
+            val facet = new MixinFacetAbstract(Collection_numberOfChildren.class, "prop", constructor, null) {};
+
+            val propMethodInSubclass = SimpleObject_numberOfChildren.class.getMethod("prop");
+
+            // when
+            val candidate = facet.isCandidateForMain(propMethodInSubclass);
+
+            // then
+            Assertions.assertThat(candidate).isTrue();
+        }
+    }
 }
diff --git a/testing/fixtures/applib/pom.xml b/testing/fixtures/applib/pom.xml
index f39f5ff..9142a1b 100644
--- a/testing/fixtures/applib/pom.xml
+++ b/testing/fixtures/applib/pom.xml
@@ -72,6 +72,12 @@
 		</dependency>
 
 		<dependency>
+			<groupId>org.apache.isis.persistence</groupId>
+			<artifactId>isis-persistence-jpa-applib</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
 			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-core-runtime</artifactId>
 			<scope>provided</scope>