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/05/13 16:43:16 UTC

[isis] branch master updated: ISIS-2674: include abstract methods when assembling the MM

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 2cb13df  ISIS-2674: include abstract methods when assembling the MM
2cb13df is described below

commit 2cb13df4c3dafd876dff1381424523b00fc3d35e
Author: ahuber@apache.org <ah...@luna>
AuthorDate: Thu May 13 18:42:55 2021 +0200

    ISIS-2674: include abstract methods when assembling the MM
---
 .../_testing/MethodRemoverForTesting.java          |  9 +++-
 .../core/metamodel/facetapi/MethodRemover.java     | 12 +++++
 .../isis/core/metamodel/facets/FacetFactory.java   | 12 ++++-
 .../ignore/javalang/RemoveMethodsFacetFactory.java |  5 +-
 .../specloader/specimpl/FacetedMethodsBuilder.java |  7 ++-
 .../DomainModelTest_usingGoodDomain.java           | 26 ++++++++--
 .../testdomain/model/good/ProperInterface.java     | 56 ++++++++++++++++++++++
 .../testdomain/model/good/ProperInterface2.java    | 41 ++++++++++++++++
 8 files changed, 156 insertions(+), 12 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MethodRemoverForTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MethodRemoverForTesting.java
index 4f48387..187de85 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MethodRemoverForTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MethodRemoverForTesting.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.commons.CanBeVoid;
 import org.apache.isis.core.metamodel.facetapi.MethodRemover;
 
@@ -71,12 +72,16 @@ public class MethodRemoverForTesting implements MethodRemover {
         public int paramCount;
     }
 
-
-
     @Override
     public void removeMethods(Predicate<Method> filter, Consumer<Method> onRemoval) {
         removeMethodArgsCalls.add(new RemoveMethodArgs("", void.class, new Class[0]));
     }
 
+    @Override
+    public Can<Method> snapshot() {
+        // creates a defensive copy, but as far as I know is not thread-safe
+        return Can.ofStream(removedMethodMethodCalls.stream());
+    }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MethodRemover.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MethodRemover.java
index 714371e..9a7f84c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MethodRemover.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/MethodRemover.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.commons.MethodUtil;
 
 /**
@@ -62,6 +63,12 @@ public interface MethodRemover {
     }
 
     void removeMethod(Method method);
+    
+    /**
+     * Returns a defensive copy of the current internal state.
+     * @apiNote introduced for debugging purposes
+     */
+    Can<Method> snapshot();
 
     // -- NOOP IMPLEMENTATION
 
@@ -75,6 +82,11 @@ public interface MethodRemover {
         public void removeMethods(Predicate<Method> filter, Consumer<Method> onRemoval) {
         }
 
+        @Override
+        public Can<Method> snapshot() {
+            return Can.empty();
+        }
+
     };
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
index e142037..5eb457d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
@@ -26,6 +26,7 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.reflection._Annotations;
@@ -143,6 +144,11 @@ public interface FacetFactory {
             methodRemover.removeMethods(filter, onRemoval);
         }
 
+        @Override
+        public Can<Method> snapshot() {
+            return methodRemover.snapshot();
+        }
+
     }
 
     public interface ProcessContextWithMetadataProperties<T extends FacetHolder> {
@@ -180,7 +186,6 @@ public interface FacetFactory {
             this.methodRemover = methodRemover;
         }
 
-
         @Override
         public void removeMethod(final Method method) {
             methodRemover.removeMethod(method);
@@ -191,6 +196,11 @@ public interface FacetFactory {
             methodRemover.removeMethods(filter, onRemoval);
         }
 
+        @Override
+        public Can<Method> snapshot() {
+            return methodRemover.snapshot();
+        }
+
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
index 505a7ca..42b203b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.object.ignore.javalang;
 
 import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Action;
@@ -81,8 +80,8 @@ public class RemoveMethodsFacetFactory extends FacetFactoryAbstract {
         val isExplicitAction = config.getApplib().getAnnotation().getAction().isExplicit();
 
         for (Method method : methods) {
-            // removeSyntheticOrAbstractMethods(processClassContext);
-            if (method.isSynthetic() || Modifier.isAbstract(method.getModifiers())) {
+            // remove synthetic methods
+            if (method.isSynthetic()) {
                 processClassContext.removeMethod(method);
             }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index c64f0d8..e9640f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -35,6 +35,7 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.exceptions.UnrecoverableException;
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
@@ -99,6 +100,11 @@ public class FacetedMethodsBuilder {
             return methodsRemaining.stream();
         }
 
+        @Override
+        public Can<Method> snapshot() {
+            return Can.ofCollection(methodsRemaining);
+        }
+
     }
 
     private final ObjectSpecificationAbstract inspectedTypeSpec;
@@ -172,7 +178,6 @@ public class FacetedMethodsBuilder {
 
         // process facets at object level
         // this will also remove some methods, such as the superclass methods.
-
         getFacetProcessor().process(introspectedClass, methodRemover, inspectedTypeSpec);
 
         // if this class has additional facets (as per @Facets), then process
diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
index ce4505c..71f5d18 100644
--- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
+++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
@@ -29,11 +29,6 @@ import org.junit.jupiter.params.provider.MethodSource;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.metamodel.Config;
@@ -56,12 +51,18 @@ import org.apache.isis.testdomain.model.good.ElementTypeAbstract;
 import org.apache.isis.testdomain.model.good.ElementTypeConcrete;
 import org.apache.isis.testdomain.model.good.ElementTypeInterface;
 import org.apache.isis.testdomain.model.good.ProperElementTypeVm;
+import org.apache.isis.testdomain.model.good.ProperInterface2;
 import org.apache.isis.testdomain.model.good.ProperMemberInheritanceInterface;
 import org.apache.isis.testdomain.model.good.ProperMemberInheritance_usingAbstract;
 import org.apache.isis.testdomain.model.good.ProperMemberInheritance_usingInterface;
 import org.apache.isis.testdomain.model.good.ProperMemberSupport;
 import org.apache.isis.testing.integtestsupport.applib.validate.DomainModelValidator;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 import lombok.val;
 
 @SpringBootTest(
@@ -351,6 +352,21 @@ class DomainModelTest_usingGoodDomain {
 
     }
 
+    @Test
+    void interfaces_shouldSupport_inheritedMembers() {
+
+        val i2Spec = specificationLoader.loadSpecification(ProperInterface2.class,
+                IntrospectionState.FULLY_INTROSPECTED);
+
+        assertEquals(BeanSort.ABSTRACT, i2Spec.getBeanSort());
+        assertHasProperty(i2Spec, "a");
+        assertHasProperty(i2Spec, "b");
+        assertHasProperty(i2Spec, "c");
+        assertHasProperty(i2Spec, "d");
+        assertHasProperty(i2Spec, "e");
+        assertHasProperty(i2Spec, "f");
+    }
+
     // -- HELPER
 
     private void assertHasProperty(ObjectSpecification spec, String propertyId) {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface.java
new file mode 100644
index 0000000..733546c
--- /dev/null
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface.java
@@ -0,0 +1,56 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.testdomain.model.good;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Property;
+
+@DomainObject(objectType = "isis.testdomain.ProperInterface")
+public interface ProperInterface {
+
+    // -- read/write exemplar
+    
+    @Property
+    default String getA() {
+        return "a";
+    }
+    default void setA(String prop) {
+        // no-op, just testing meta-data
+    }
+    
+    // -- read only exemplar
+    
+    @Property
+    default String getB() {
+        return "b";
+    }
+
+    // -- read/write exemplar (no implementation)
+    
+    @Property
+    String getC();
+    void setC(String prop);
+    
+    // -- read only exemplar (no implementation)
+    
+    @Property
+    String getD();
+
+    
+}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface2.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface2.java
new file mode 100644
index 0000000..635b8c2
--- /dev/null
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface2.java
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.testdomain.model.good;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Property;
+
+@DomainObject(objectType = "isis.testdomain.ProperInterface2")
+public interface ProperInterface2 
+extends ProperInterface {
+
+    @Property
+    default String getE() {
+        return "e";
+    }
+    default void setE(String prop) {
+        // no-op, just testing meta-data
+    }
+    
+    @Property
+    String getF();
+    void setF(String prop);
+    
+    
+}