Repository: bval
Updated Branches:
  refs/heads/bv2 ebc06167b -> f1e8de164


pass TCK CustomPropertyPathTest


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

Branch: refs/heads/bv2
Commit: f1e8de16429deb38a190703ad0db5e6dfa1a2d4f
Parents: ebc0616
Author: Matt Benson <[email protected]>
Authored: Sun Feb 25 12:15:23 2018 -0600
Committer: Matt Benson <[email protected]>
Committed: Sun Feb 25 12:15:23 2018 -0600

----------------------------------------------------------------------
 .../java/org/apache/bval/util/ObjectUtils.java  | 10 ++++
 .../jsr/ConstraintValidatorContextImpl.java     |  2 +-
 .../bval/jsr/GroupValidationContextImpl.java    |  1 -
 .../jsr/descriptor/ContainerElementTypeD.java   |  5 +-
 .../jsr/job/ConstraintValidatorContextImpl.java |  2 +-
 .../apache/bval/jsr/job/ValidateParameters.java | 16 ++++++
 .../apache/bval/jsr/job/ValidateProperty.java   |  4 --
 .../org/apache/bval/jsr/job/ValidationJob.java  | 52 ++++++++++++++++----
 ...ementNodeBuilderCustomizableContextImpl.java |  1 +
 .../NodeBuilderCustomizableContextImpl.java     |  8 ++-
 .../java/org/apache/bval/jsr/util/NodeImpl.java | 29 ++++-------
 .../java/org/apache/bval/jsr/util/PathImpl.java |  7 +--
 .../org/apache/bval/jsr/util/PathImplTest.java  |  6 +--
 13 files changed, 93 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
----------------------------------------------------------------------
diff --git a/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java 
b/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
index b7f2fac..1c5a728 100644
--- a/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
+++ b/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
@@ -18,6 +18,7 @@ package org.apache.bval.util;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Array;
+import java.util.Objects;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
@@ -73,6 +74,15 @@ public final class ObjectUtils {
         return Stream.of(array).anyMatch(Predicate.isEqual(objectToFind));
     }
 
+    public static int indexOf(final Object[] array, final Object objectToFind) 
{
+        for (int i = 0; i < array.length; i++) {
+            if (Objects.equals(array[i], objectToFind)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
     public static <T> T[] arrayAdd(T[] array, T objectToAdd) {
         if (array == null && objectToAdd == null) {
             throw new IllegalArgumentException("Arguments cannot both be 
null");

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java
----------------------------------------------------------------------
diff --git 
a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java
 
b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java
index 930170d..74c8685 100644
--- 
a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java
+++ 
b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java
@@ -123,7 +123,7 @@ public class ConstraintValidatorContextImpl
                 path.getLeafNode().setName(name);
             } else {
                 path = PathImpl.copy(propertyPath);
-                path.addNode(new NodeImpl(name));
+                path.addNode(new NodeImpl.PropertyNodeImpl(name));
             }
             return new NodeBuilderDefinedContextImpl(parent, messageTemplate, 
path);
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java
----------------------------------------------------------------------
diff --git 
a/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java 
b/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java
index 3217d0e..9ca50dc 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java
@@ -127,7 +127,6 @@ final class GroupValidationContextImpl<T> extends 
BeanValidationContext<Constrai
 
     @Override
     public void setKind(final ElementKind type) {
-        path.getLeafNode().setKind(type);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/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 7cacff3..51252aa 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
@@ -37,7 +37,7 @@ import org.apache.bval.util.Validate;
 public class ContainerElementTypeD extends 
CascadableContainerD<CascadableContainerD<?, ?>, AnnotatedType>
     implements ContainerElementTypeDescriptor {
 
-    private static class Receiver implements ValueExtractor.ValueReceiver {
+    private class Receiver implements ValueExtractor.ValueReceiver {
         private final GraphContext context;
         private Lazy<List<GraphContext>> result = new Lazy<>(ArrayList::new);
 
@@ -73,7 +73,8 @@ public class ContainerElementTypeD extends 
CascadableContainerD<CascadableContai
         }
 
         private void addChild(NodeImpl node, Object value) {
-            result.get().add(context.child(node, value));
+            result.get()
+                .add(context.child(node.inContainer(key.getContainerClass(), 
key.getTypeArgumentIndex()), value));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
----------------------------------------------------------------------
diff --git 
a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
 
b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
index c3cc3a7..6d4ca98 100644
--- 
a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
+++ 
b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
@@ -64,7 +64,7 @@ public class ConstraintValidatorContextImpl<T> implements 
ConstraintValidatorCon
                 p.getLeafNode().setName(name);
             } else {
                 p = PathImpl.copy(path);
-                p.addNode(new NodeImpl(name));
+                p.addNode(new NodeImpl.PropertyNodeImpl(name));
             }
             return new 
NodeBuilderDefinedContextImpl(ConstraintValidatorContextImpl.this, template, p);
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateParameters.java
----------------------------------------------------------------------
diff --git 
a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateParameters.java 
b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateParameters.java
index b7b88c8..dab98b0 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateParameters.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateParameters.java
@@ -22,6 +22,7 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Executable;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.stream.IntStream;
@@ -29,6 +30,7 @@ import java.util.stream.IntStream;
 import javax.validation.ConstraintViolation;
 import javax.validation.ParameterNameProvider;
 import javax.validation.Path;
+import javax.validation.Path.Node;
 import javax.validation.metadata.ExecutableDescriptor;
 
 import org.apache.bval.jsr.ApacheFactoryContext;
@@ -77,6 +79,11 @@ public abstract class ValidateParameters<E extends 
Executable, T> extends Valida
         protected T getRootBean() {
             return object;
         }
+
+        @Override
+        protected Node executableNode() {
+            return new NodeImpl.MethodNodeImpl(executable.getName(), 
Arrays.asList(executable.getParameterTypes()));
+        }
     }
 
     public static class ForConstructor<T> extends 
ValidateParameters<Constructor<? extends T>, T> {
@@ -107,6 +114,12 @@ public abstract class ValidateParameters<E extends 
Executable, T> extends Valida
         protected T getRootBean() {
             return null;
         }
+
+        @Override
+        protected Node executableNode() {
+            return new 
NodeImpl.ConstructorNodeImpl(executable.getDeclaringClass().getSimpleName(),
+                Arrays.asList(executable.getParameterTypes()));
+        }
     }
 
     class ParametersFrame extends Frame<CrossParameterD<?, ?>> {
@@ -159,12 +172,15 @@ public abstract class ValidateParameters<E extends 
Executable, T> extends Valida
     @Override
     protected Frame<?> computeBaseFrame() {
         final PathImpl cp = PathImpl.create();
+        cp.addNode(executableNode());
         cp.addNode(new NodeImpl.CrossParameterNodeImpl());
         return new ParametersFrame(describe(), new 
GraphContext(validatorContext, cp, parameterValues));
     }
 
     protected abstract ExecutableDescriptor describe();
 
+    protected abstract Path.Node executableNode();
+
     protected abstract List<String> getParameterNames(ParameterNameProvider 
parameterNameProvider);
 
     protected abstract T getRootBean();

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
----------------------------------------------------------------------
diff --git 
a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java 
b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
index 8d8ddc8..59bd636 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
@@ -20,7 +20,6 @@ package org.apache.bval.jsr.job;
 
 import java.lang.reflect.Array;
 import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -437,9 +436,6 @@ public final class ValidateProperty<T> extends 
ValidationJob<T> {
         }
     }
 
-    private static final TypeVariable<?> MAP_VALUE = 
Map.class.getTypeParameters()[1];
-    private static final TypeVariable<?> ITERABLE_ELEMENT = 
Iterable.class.getTypeParameters()[0];
-
     private final Strategy<T> strategy;
     private final Class<T> rootBeanClass;
     private final PathImpl propertyPath;

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/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 d0e4ec7..c97cbfd 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
@@ -19,6 +19,8 @@
 package org.apache.bval.jsr.job;
 
 import java.lang.reflect.Array;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.LinkedHashSet;
@@ -64,7 +66,9 @@ import org.apache.bval.jsr.util.NodeImpl;
 import org.apache.bval.jsr.util.PathImpl;
 import org.apache.bval.util.Exceptions;
 import org.apache.bval.util.Lazy;
+import org.apache.bval.util.ObjectUtils;
 import org.apache.bval.util.Validate;
+import org.apache.bval.util.reflection.TypeUtils;
 
 public abstract class ValidationJob<T> {
 
@@ -287,26 +291,53 @@ public abstract class ValidationJob<T> {
             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)));
+            }
             if (Map.class.isInstance(value)) {
                 return ((Map<?, ?>) value).entrySet().stream()
-                    .map(e -> context.child(NodeImpl.atKey(e.getKey()), 
e.getValue()));
-            }
-            if (value.getClass().isArray()) {
-                return IntStream.range(0, Array.getLength(value))
-                    .mapToObj(i -> context.child(NodeImpl.atIndex(i), 
Array.get(value, i)));
+                    .map(e -> context.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(NodeImpl.atIndex(i), l.get(i)));
+                return IntStream.range(0, l.size())
+                    .mapToObj(i -> context.child(
+                        setContainerInformation(NodeImpl.atIndex(i), 
ITERABLE_ELEMENT, descriptor.getElementClass()),
+                        l.get(i)));
             }
             if (Iterable.class.isInstance(value)) {
                 final Stream.Builder<Object> b = Stream.builder();
                 ((Iterable<?>) value).forEach(b);
-                return b.build().map(o -> 
context.child(NodeImpl.atIndex(null), o));
+                return b.build()
+                    .map(o -> context.child(
+                        setContainerInformation(NodeImpl.atIndex(null), 
ITERABLE_ELEMENT, descriptor.getElementClass()),
+                        o));
             }
             return Stream.of(context);
         }
 
+        // RI apparently wants to use e.g. Set for Iterable containers, so use 
declared type + assigned type
+        // variable if present. not sure I agree, FWIW
+        private NodeImpl setContainerInformation(NodeImpl node, 
TypeVariable<?> originalTypeVariable,
+            Class<?> containerType) {
+            final TypeVariable<?> tv;
+            if 
(containerType.equals(originalTypeVariable.getGenericDeclaration())) {
+                tv = originalTypeVariable;
+            } else {
+                final Type assignedType =
+                    TypeUtils.getTypeArguments(containerType, (Class<?>) 
originalTypeVariable.getGenericDeclaration())
+                        .get(originalTypeVariable);
+                tv = assignedType instanceof TypeVariable<?> ? 
(TypeVariable<?>) assignedType : null;
+            }
+            final int i = tv == null ? -1 : 
ObjectUtils.indexOf(containerType.getTypeParameters(), tv);
+            return node.inContainer(containerType, i < 0 ? null : 
Integer.valueOf(i));
+        }
+
         @Override
         Object getBean() {
             return 
Optional.ofNullable(parent).map(Frame::getBean).orElse(null);
@@ -315,6 +346,9 @@ public abstract class ValidationJob<T> {
 
     private static final Comparator<Path> COMPARE_TO_STRING = 
Comparator.comparing(Object::toString);
 
+    protected static final TypeVariable<?> MAP_VALUE = 
Map.class.getTypeParameters()[1];
+    protected static final TypeVariable<?> ITERABLE_ELEMENT = 
Iterable.class.getTypeParameters()[0];
+
     protected final ApacheFactoryContext validatorContext;
 
     private final Groups groups;
@@ -377,8 +411,8 @@ public abstract class ValidationJob<T> {
         return createViolation(messageTemplate, interpolate(messageTemplate, 
context), context, propertyPath);
     }
 
-    abstract ConstraintViolationImpl<T> createViolation(String messageTemplate,
-        String message, ConstraintValidatorContextImpl<T> context, Path 
propertyPath);
+    abstract ConstraintViolationImpl<T> createViolation(String 
messageTemplate, String message,
+        ConstraintValidatorContextImpl<T> context, Path propertyPath);
 
     protected abstract Frame<?> computeBaseFrame();
 

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/util/ContainerElementNodeBuilderCustomizableContextImpl.java
----------------------------------------------------------------------
diff --git 
a/bval-jsr/src/main/java/org/apache/bval/jsr/util/ContainerElementNodeBuilderCustomizableContextImpl.java
 
b/bval-jsr/src/main/java/org/apache/bval/jsr/util/ContainerElementNodeBuilderCustomizableContextImpl.java
index c0cff10..13c3365 100644
--- 
a/bval-jsr/src/main/java/org/apache/bval/jsr/util/ContainerElementNodeBuilderCustomizableContextImpl.java
+++ 
b/bval-jsr/src/main/java/org/apache/bval/jsr/util/ContainerElementNodeBuilderCustomizableContextImpl.java
@@ -70,6 +70,7 @@ public class 
ContainerElementNodeBuilderCustomizableContextImpl
 
     @Override
     public ConstraintValidatorContext addConstraintViolation() {
+        path.addNode(node);
         context.addError(template, path);
         return context;
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeBuilderCustomizableContextImpl.java
----------------------------------------------------------------------
diff --git 
a/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeBuilderCustomizableContextImpl.java
 
b/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeBuilderCustomizableContextImpl.java
index 6ec977c..d349cb5 100644
--- 
a/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeBuilderCustomizableContextImpl.java
+++ 
b/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeBuilderCustomizableContextImpl.java
@@ -21,7 +21,6 @@ package org.apache.bval.jsr.util;
 import javax.validation.ConstraintValidatorContext;
 import 
javax.validation.ConstraintValidatorContext.ConstraintViolationBuilder.ContainerElementNodeBuilderCustomizableContext;
 import 
javax.validation.ConstraintValidatorContext.ConstraintViolationBuilder.NodeBuilderCustomizableContext;
-import javax.validation.ElementKind;
 
 import org.apache.bval.jsr.job.ConstraintValidatorContextImpl;
 
@@ -48,12 +47,11 @@ public final class NodeBuilderCustomizableContextImpl
         this.template = template;
         this.path = path;
 
-        if (path.isRootPath() || path.getLeafNode().getKind() != null) {
+        if (path.isRootPath() || path.getLeafNode().getName() != null) {
             node = new NodeImpl.PropertyNodeImpl(name);
         } else {
-            node = path.removeLeafNode();
+            node = new NodeImpl.PropertyNodeImpl(path.removeLeafNode());
             node.setName(name);
-            node.setKind(ElementKind.PROPERTY); // enforce it
         }
     }
 
@@ -101,7 +99,7 @@ public final class NodeBuilderCustomizableContextImpl
 
     @Override
     public NodeBuilderCustomizableContext inContainer(Class<?> containerClass, 
Integer typeArgumentIndex) {
-        path.getLeafNode().inContainer(containerClass, typeArgumentIndex);
+        node.inContainer(containerClass, typeArgumentIndex);
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java 
b/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
index 96f9421..8e12ce3 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
@@ -31,7 +31,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Consumer;
 
-public class NodeImpl implements Path.Node, Serializable {
+public abstract class NodeImpl implements Path.Node, Serializable {
 
     private static final long serialVersionUID = 1L;
     private static final String INDEX_OPEN = "[";
@@ -72,7 +72,7 @@ public class NodeImpl implements Path.Node, Serializable {
      * @return NodeImpl
      */
     public static NodeImpl atIndex(Integer index) {
-        final NodeImpl result = new NodeImpl();
+        final NodeImpl result = new NodeImpl.PropertyNodeImpl((String) null);
         result.setIndex(index);
         return result;
     }
@@ -83,7 +83,7 @@ public class NodeImpl implements Path.Node, Serializable {
      * @return NodeImpl
      */
     public static NodeImpl atKey(Object key) {
-        final NodeImpl result = new NodeImpl();
+        final NodeImpl result = new NodeImpl.PropertyNodeImpl((String) null);
         result.setKey(key);
         return result;
     }
@@ -93,7 +93,6 @@ public class NodeImpl implements Path.Node, Serializable {
     private Integer index;
     private int parameterIndex;
     private Object key;
-    private ElementKind kind;
     private List<Class<?>> parameterTypes;
     private Class<?> containerType;
     private Integer typeArgumentIndex;
@@ -102,7 +101,7 @@ public class NodeImpl implements Path.Node, Serializable {
      * Create a new NodeImpl instance.
      * @param name
      */
-    public NodeImpl(String name) {
+    private NodeImpl(String name) {
         this.name = name;
     }
 
@@ -115,7 +114,6 @@ public class NodeImpl implements Path.Node, Serializable {
         this.inIterable = node.isInIterable();
         this.index = node.getIndex();
         this.key = node.getKey();
-        this.kind = node.getKind();
     }
 
     <T extends Path.Node> NodeImpl(Path.Node node, Class<T> nodeType, 
Consumer<T> handler) {
@@ -198,17 +196,9 @@ public class NodeImpl implements Path.Node, Serializable {
     }
 
     @Override
-    public ElementKind getKind() {
-        return kind;
-    }
-
-    public void setKind(ElementKind kind) {
-        this.kind = kind;
-    }
-
-    @Override
     public <T extends Node> T as(final Class<T> nodeType) {
-        Exceptions.raiseUnless(nodeType.isInstance(this), 
ClassCastException::new, "Type %s not supported", nodeType);
+        Exceptions.raiseUnless(nodeType.isInstance(this), 
ClassCastException::new, "Type %s not supported by %s",
+            nodeType, getClass());
         return nodeType.cast(this);
     }
 
@@ -234,7 +224,7 @@ public class NodeImpl implements Path.Node, Serializable {
         final NodeImpl node = (NodeImpl) o;
 
         return inIterable == node.inIterable && Objects.equals(index, 
node.index) && Objects.equals(key, node.key)
-            && Objects.equals(name, node.name) && kind == node.kind;
+            && Objects.equals(name, node.name);
     }
 
     /**
@@ -242,7 +232,7 @@ public class NodeImpl implements Path.Node, Serializable {
      */
     @Override
     public int hashCode() {
-        return Objects.hash(name, Boolean.valueOf(inIterable), index, key, 
kind);
+        return Objects.hash(name, Boolean.valueOf(inIterable), index, key, 
getKind());
     }
 
     public int getParameterIndex() {
@@ -265,9 +255,10 @@ public class NodeImpl implements Path.Node, Serializable {
         return typeArgumentIndex;
     }
 
-    public void inContainer(Class<?> containerType, Integer typeArgumentIndex) 
{
+    public NodeImpl inContainer(Class<?> containerType, Integer 
typeArgumentIndex) {
         this.containerType = containerType;
         this.typeArgumentIndex = typeArgumentIndex;
+        return this;
     }
 
     @SuppressWarnings("serial")

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/main/java/org/apache/bval/jsr/util/PathImpl.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/PathImpl.java 
b/bval-jsr/src/main/java/org/apache/bval/jsr/util/PathImpl.java
index 430d257..1f5f3d0 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/PathImpl.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/PathImpl.java
@@ -129,9 +129,6 @@ public class PathImpl implements Path, Serializable {
     }
 
     private static NodeImpl newNode(final Node cast) {
-        if (PropertyNode.class.isInstance(cast)) {
-            return new NodeImpl.PropertyNodeImpl(cast);
-        }
         if (BeanNode.class.isInstance(cast)) {
             return new NodeImpl.BeanNodeImpl(cast);
         }
@@ -153,7 +150,7 @@ public class PathImpl implements Path, Serializable {
         if (ContainerElementNode.class.isInstance(cast)) {
             return new NodeImpl.ContainerElementNodeImpl(cast);
         }
-        return new NodeImpl(cast);
+        return new NodeImpl.PropertyNodeImpl(cast);
     }
 
     private final LinkedList<NodeImpl> nodeList = new LinkedList<>();
@@ -247,7 +244,7 @@ public class PathImpl implements Path, Serializable {
             return nodeList.removeLast();
         } finally {
             if (nodeList.isEmpty()) {
-                nodeList.add(new NodeImpl((String) null));
+                nodeList.add(new NodeImpl.BeanNodeImpl());
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/f1e8de16/bval-jsr/src/test/java/org/apache/bval/jsr/util/PathImplTest.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/test/java/org/apache/bval/jsr/util/PathImplTest.java 
b/bval-jsr/src/test/java/org/apache/bval/jsr/util/PathImplTest.java
index 5f8313f..85137b5 100644
--- a/bval-jsr/src/test/java/org/apache/bval/jsr/util/PathImplTest.java
+++ b/bval-jsr/src/test/java/org/apache/bval/jsr/util/PathImplTest.java
@@ -166,13 +166,13 @@ public class PathImplTest {
     @Test
     public void testToString() {
         PathImpl path = PathImpl.create();
-        path.addNode(new NodeImpl("firstName"));
+        path.addNode(new NodeImpl.PropertyNodeImpl("firstName"));
         assertEquals("firstName", path.toString());
 
         path = PathImpl.create();
         path.getLeafNode().setIndex(2);
         assertEquals("[2]", path.toString());
-        path.addNode(new NodeImpl("firstName"));
+        path.addNode(new NodeImpl.PropertyNodeImpl("firstName"));
         assertEquals("[2].firstName", path.toString());
     }
 
@@ -181,7 +181,7 @@ public class PathImplTest {
         PathImpl path = PathImpl.createPathFromString("");
         assertTrue(path.isRootPath());
         assertEquals(1, countNodes(path));
-        path.addNode(new NodeImpl("foo"));
+        path.addNode(new NodeImpl.PropertyNodeImpl("foo"));
         assertFalse(path.isRootPath());
         assertEquals(1, countNodes(path));
         path.removeLeafNode();

Reply via email to