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