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);
+
+
+}