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