only elide container element paths when traversing the value itself, NOT on ITS 
container elements: passes 23 more TCK tests with one fell swoop


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

Branch: refs/heads/bv2
Commit: eab5a0123cc24be45aed20a974fe6e9fa584f073
Parents: 8c270a8
Author: Matt Benson <[email protected]>
Authored: Thu Mar 22 14:25:14 2018 -0500
Committer: Matt Benson <[email protected]>
Committed: Thu Mar 22 14:25:14 2018 -0500

----------------------------------------------------------------------
 .../org/apache/bval/jsr/job/ValidationJob.java  | 24 ++++++++++++--------
 1 file changed, 14 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/eab5a012/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java 
b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
index 61dcd39..a55b9b7 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
@@ -355,27 +355,32 @@ public abstract class ValidationJob<T> {
                 .map(context -> new BeanFrame<>(this, context)).forEach(b -> 
b.process(group, sink));
         }
 
+        protected GraphContext getMultiplexContext() {
+            return context;
+        }
+
         private Stream<GraphContext> multiplex() {
-            final Object value = context.getValue();
+            final GraphContext multiplexContext = getMultiplexContext();
+            final Object value = multiplexContext.getValue();
             if (value == null) {
                 return Stream.empty();
             }
             if (value.getClass().isArray()) {
                 // inconsistent: use Object[] here but specific type for 
Iterable? RI compatibility
                 final Class<?> arrayType = value instanceof Object[] ? 
Object[].class : value.getClass();
-                return IntStream.range(0, Array.getLength(value)).mapToObj(i 
-> context
-                    .child(NodeImpl.atIndex(i).inContainer(arrayType, null), 
Array.get(value, i)));
+                return IntStream.range(0, Array.getLength(value)).mapToObj(
+                    i -> 
multiplexContext.child(NodeImpl.atIndex(i).inContainer(arrayType, null), 
Array.get(value, i)));
             }
             if (Map.class.isInstance(value)) {
                 return ((Map<?, ?>) value).entrySet().stream()
-                    .map(e -> context.child(
+                    .map(e -> multiplexContext.child(
                         setContainerInformation(NodeImpl.atKey(e.getKey()), 
MAP_VALUE, descriptor.getElementClass()),
                         e.getValue()));
             }
             if (List.class.isInstance(value)) {
                 final List<?> l = (List<?>) value;
                 return IntStream.range(0, l.size())
-                    .mapToObj(i -> context.child(
+                    .mapToObj(i -> multiplexContext.child(
                         setContainerInformation(NodeImpl.atIndex(i), 
ITERABLE_ELEMENT, descriptor.getElementClass()),
                         l.get(i)));
             }
@@ -383,11 +388,11 @@ public abstract class ValidationJob<T> {
                 final Stream.Builder<Object> b = Stream.builder();
                 ((Iterable<?>) value).forEach(b);
                 return b.build()
-                    .map(o -> context.child(
+                    .map(o -> multiplexContext.child(
                         setContainerInformation(NodeImpl.atIndex(null), 
ITERABLE_ELEMENT, descriptor.getElementClass()),
                         o));
             }
-            return Stream.of(context);
+            return Stream.of(multiplexContext);
         }
 
         // RI apparently wants to use e.g. Set for Iterable containers, so use 
declared type + assigned type
@@ -422,7 +427,7 @@ public abstract class ValidationJob<T> {
         }
 
         @Override
-        protected void recurseSingleExpandedGroup(Class<?> group, 
Consumer<ConstraintViolation<T>> sink) {
+        protected GraphContext getMultiplexContext() {
             final PathImpl path = context.getPath();
             final NodeImpl leafNode = path.getLeafNode();
 
@@ -440,8 +445,7 @@ public abstract class ValidationJob<T> {
             }
             path.addNode(newLeaf);
 
-            new SproutFrame<>(parent, descriptor, 
context.getParent().child(path, context.getValue())).recurse(group,
-                sink);
+            return context.getParent().child(path, context.getValue());
         }
     }
 

Reply via email to