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());
         }

Reply via email to