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>