implement spec wrt too many or no available value extractors
Project: http://git-wip-us.apache.org/repos/asf/bval/repo Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/a1f1f742 Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/a1f1f742 Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/a1f1f742 Branch: refs/heads/bv2 Commit: a1f1f7424dbce497739d3aa2f6c35c021a358716 Parents: c141d30 Author: Matt Benson <[email protected]> Authored: Fri Mar 16 17:55:03 2018 -0500 Committer: Matt Benson <[email protected]> Committed: Fri Mar 16 17:55:03 2018 -0500 ---------------------------------------------------------------------- .../bval/jsr/descriptor/CascadableContainerD.java | 2 +- .../bval/jsr/descriptor/ContainerElementTypeD.java | 3 ++- .../bval/jsr/valueextraction/ValueExtractors.java | 14 ++++++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bval/blob/a1f1f742/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/CascadableContainerD.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/CascadableContainerD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/CascadableContainerD.java index 7404278..a4e05fd 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/CascadableContainerD.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/CascadableContainerD.java @@ -78,7 +78,7 @@ public abstract class CascadableContainerD<P extends ElementD<?, ?>, E extends A try { return readImpl(context); } catch (Exception e) { - throw new ValidationException(e); + throw e instanceof ValidationException ? (ValidationException) e : new ValidationException(e); } } http://git-wip-us.apache.org/repos/asf/bval/blob/a1f1f742/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java index fb80802..cdae6f0 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; +import javax.validation.ConstraintDeclarationException; import javax.validation.ValidationException; import javax.validation.metadata.ContainerElementTypeDescriptor; import javax.validation.valueextraction.ValueExtractor; @@ -108,7 +109,7 @@ public class ContainerElementTypeD extends CascadableContainerD<CascadableContai @Override protected Stream<GraphContext> readImpl(GraphContext context) throws Exception { final ValueExtractor valueExtractor = context.getValidatorContext().getValueExtractors().find(key); - Exceptions.raiseIf(valueExtractor == null, ValidationException::new, "No %s found for %s", + Exceptions.raiseIf(valueExtractor == null, ConstraintDeclarationException::new, "No %s found for %s", ValueExtractor.class.getSimpleName(), key); final Receiver receiver = new Receiver(context); http://git-wip-us.apache.org/repos/asf/bval/blob/a1f1f742/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java index 3adc541..ec1cf23 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java @@ -32,6 +32,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.validation.ConstraintDeclarationException; import javax.validation.valueextraction.ValueExtractor; import javax.validation.valueextraction.ValueExtractorDeclarationException; import javax.validation.valueextraction.ValueExtractorDefinitionException; @@ -166,11 +167,16 @@ public class ValueExtractors { // search for assignable ContainerElementKey: Set<ContainerElementKey> assignableKeys = key.getAssignableKeys(); while (!assignableKeys.isEmpty()) { - final Optional<ValueExtractor<?>> found = assignableKeys.stream().filter(allValueExtractors::containsKey) - .<ValueExtractor<?>> map(allValueExtractors::get).findFirst(); - if (found.isPresent()) { - return found.get(); + final Set<ValueExtractor<?>> results = assignableKeys.stream().filter(allValueExtractors::containsKey) + .map(allValueExtractors::get).collect(Collectors.toSet()); + + final int rz = results.size(); + if (rz == 1) { + return results.iterator().next(); } + Exceptions.raiseIf(rz > 1, ConstraintDeclarationException::new, "%d maximally specific %ss found for %s", + rz, ValueExtractor.class.getSimpleName(), key); + assignableKeys = assignableKeys.stream().map(ContainerElementKey::getAssignableKeys) .flatMap(Collection::stream).collect(Collectors.toSet()); }
