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 2022/01/24 09:36:08 UTC

[isis] branch master updated: ISIS-2944: improves MM validation message on conflicting domain-include semantics

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 09a448d  ISIS-2944: improves MM validation message on conflicting domain-include semantics
09a448d is described below

commit 09a448ddf1c76a4503dca3a62e883ca7740fbc01
Author: andi-huber <ah...@apache.org>
AuthorDate: Mon Jan 24 10:36:01 2022 +0100

    ISIS-2944: improves MM validation message on conflicting domain-include
    semantics
---
 .../isis/commons/internal/reflection/_Reflect.java |  8 ++++++--
 ...tionEnforcesMetamodelContributionValidator.java | 24 +++++++++++++++++-----
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java b/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java
index e0b7f21..0b19408 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java
@@ -245,6 +245,11 @@ public final class _Reflect {
         return _NullSafe.stream(type.getMethods());
     }
 
+    public static Stream<Method> streamInheritedMethods(final Method method) {
+        return streamAllMethods(method.getDeclaringClass(), true)
+                .filter(candidateMethod->methodsSame(candidateMethod, method));
+    }
+
     /**
      * Stream all methods of given {@code type}, up the super class hierarchy.
      * @param type (nullable)
@@ -253,8 +258,7 @@ public final class _Reflect {
      */
     public static Stream<Method> streamAllMethods(
             final @Nullable Class<?> type,
-            final boolean ignoreAccess
-            ) {
+            final boolean ignoreAccess) {
 
         return streamTypeHierarchy(type, InterfacePolicy.INCLUDE)
                 .filter(t->!t.equals(Object.class)) // do not process Object class.
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
index 02a60e5..9307686 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.methods;
 
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.TreeSet;
 import java.util.function.Predicate;
@@ -119,14 +120,14 @@ extends MetaModelVisitingValidatorAbstract {
         .forEach(methodsIntendedToBeIncludedButNotPickedUp::add);
 
         // find reasons about why these are not recognized
-        methodsIntendedToBeIncludedButNotPickedUp
+        methodsIntendedToBeIncludedButNotPickedUp.stream()
         .forEach(notPickedUpMethod->{
+
             val unmetContraints =
                     unmetContraints((ObjectSpecificationAbstract) spec, notPickedUpMethod)
                     .stream()
                     .collect(Collectors.joining("; "));
 
-            //FIXME[ISIS-2774] - update message to a more generic one
             ValidationFailure.raiseFormatted(spec,
                     "%s#%s: has annotation @%s, is assumed to support "
                             + "a property, collection or action. Unmet constraint(s): %s",
@@ -156,11 +157,24 @@ extends MetaModelVisitingValidatorAbstract {
             return unmetContraints; // don't check any further
         }
 
-        unmetContraints.add("misspelled prefix or unsupported method signature");
-        return unmetContraints;
+        // find any inherited methods that have Domain.Include semantics
+        val inheritedMethodsWithDomainIncludeSemantics =
+            _Reflect.streamInheritedMethods(method)
+            .filter(m->!Objects.equals(method.toString(), m.toString())) // exclude self
+            .filter(m->_Annotations.synthesizeInherited(m, Domain.Include.class).isPresent())
+            .collect(Collectors.toSet());
 
-    }
+        if(!inheritedMethodsWithDomainIncludeSemantics.isEmpty()) {
+            unmetContraints.add("inherited method(s) having conflicting domain-include semantics: "
+                    + inheritedMethodsWithDomainIncludeSemantics);
+            return unmetContraints; // don't check any further
+        }
 
+        // fallback message
+        unmetContraints.add("conflicting domain-include semantics, "
+                + "misspelled prefix or unsupported method signature");
+        return unmetContraints;
 
+    }
 
 }