permit cascading declaration among unrelated convergent methods

Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/f7833584
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/f7833584
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/f7833584

Branch: refs/heads/bv2
Commit: f7833584f0bef56845bd8e8258c3cfaa3980e01b
Parents: db49785
Author: Matt Benson <[email protected]>
Authored: Fri Mar 16 17:57:47 2018 -0500
Committer: Matt Benson <[email protected]>
Committed: Fri Mar 16 17:57:47 2018 -0500

----------------------------------------------------------------------
 .../main/java/org/apache/bval/jsr/metadata/Liskov.java | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/f7833584/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java 
b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
index 2440948..bbd4d2b 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
@@ -159,11 +159,16 @@ class Liskov {
     }
 
     private static void noRedeclarationOfReturnValueCascading(List<? extends 
ContainerDelegate<?>> delegates) {
-        final Set<Meta<?>> markedForCascade = 
delegates.stream().filter(ContainerDelegate::isCascade)
-            
.map(HierarchyDelegate::getHierarchyElement).collect(Collectors.toCollection(LinkedHashSet::new));
+        final Map<Class<?>, Meta<?>> cascadedReturnValues =
+            
delegates.stream().filter(ContainerDelegate::isCascade).map(HierarchyDelegate::getHierarchyElement)
+                .collect(Collectors.toMap(Meta::getDeclaringClass, 
Function.identity()));
 
-        Exceptions.raiseIf(markedForCascade.size() > 1, 
ConstraintDeclarationException::new,
-            "Multiple method return values marked @%s in hierarchy %s", 
Valid.class.getSimpleName(), markedForCascade);
+        final boolean anyRelated = 
cascadedReturnValues.keySet().stream().anyMatch(t -> 
cascadedReturnValues.keySet()
+            .stream().filter(Predicate.isEqual(t).negate()).anyMatch(t2 -> 
related(t, t2)));
+
+        Exceptions.raiseIf(anyRelated, ConstraintDeclarationException::new,
+            "Multiple method return values marked @%s in hierarchy %s", 
Valid.class.getSimpleName(),
+            cascadedReturnValues.values());
     }
 
     @SafeVarargs

Reply via email to