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
