You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by mb...@apache.org on 2018/03/06 23:53:31 UTC
bval git commit: more TCK container work
Repository: bval
Updated Branches:
refs/heads/bv2 4c1e1e0b3 -> a63f3d5e0
more TCK container work
Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/a63f3d5e
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/a63f3d5e
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/a63f3d5e
Branch: refs/heads/bv2
Commit: a63f3d5e06950e3c055a36a0a97479d26a7a909d
Parents: 4c1e1e0
Author: Matt Benson <mb...@apache.org>
Authored: Tue Mar 6 14:34:25 2018 -0600
Committer: Matt Benson <mb...@apache.org>
Committed: Tue Mar 6 17:51:43 2018 -0600
----------------------------------------------------------------------
.../jsr/descriptor/ContainerElementTypeD.java | 16 +++--
.../bval/jsr/descriptor/DescriptorManager.java | 9 ++-
.../org/apache/bval/jsr/job/ValidationJob.java | 65 ++++++++++++--------
.../java/org/apache/bval/jsr/util/NodeImpl.java | 14 ++++-
.../java/org/apache/bval/jsr/util/PathImpl.java | 14 ++---
5 files changed, 73 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/bval/blob/a63f3d5e/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 51252aa..fb80802 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
@@ -30,6 +30,7 @@ import javax.validation.valueextraction.ValueExtractor;
import org.apache.bval.jsr.GraphContext;
import org.apache.bval.jsr.metadata.ContainerElementKey;
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.Validate;
@@ -48,33 +49,36 @@ public class ContainerElementTypeD extends CascadableContainerD<CascadableContai
@Override
public void value(String nodeName, Object object) {
- addChild(new NodeImpl.PropertyNodeImpl(nodeName), object);
+ addChild(new NodeImpl.ContainerElementNodeImpl(nodeName), object);
}
@Override
public void iterableValue(String nodeName, Object object) {
- final NodeImpl.PropertyNodeImpl node = new NodeImpl.PropertyNodeImpl(nodeName);
+ final NodeImpl node = new NodeImpl.ContainerElementNodeImpl(nodeName);
node.setInIterable(true);
addChild(node, object);
}
@Override
public void indexedValue(String nodeName, int i, Object object) {
- final NodeImpl.PropertyNodeImpl node = new NodeImpl.PropertyNodeImpl(nodeName);
+ final NodeImpl node = new NodeImpl.ContainerElementNodeImpl(nodeName);
node.setIndex(Integer.valueOf(i));
addChild(node, object);
}
@Override
public void keyedValue(String nodeName, Object key, Object object) {
- final NodeImpl.PropertyNodeImpl node = new NodeImpl.PropertyNodeImpl(nodeName);
+ final NodeImpl node = new NodeImpl.ContainerElementNodeImpl(nodeName);
node.setKey(key);
addChild(node, object);
}
private void addChild(NodeImpl node, Object value) {
- result.get()
- .add(context.child(node.inContainer(key.getContainerClass(), key.getTypeArgumentIndex()), value));
+ final PathImpl path = context.getPath();
+ if (node.getName() != null) {
+ path.addNode(node.inContainer(key.getContainerClass(), key.getTypeArgumentIndex()));
+ }
+ result.get().add(context.child(path, value));
}
}
http://git-wip-us.apache.org/repos/asf/bval/blob/a63f3d5e/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java
index 0f1a13a..3c7365e 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java
@@ -23,20 +23,23 @@ import java.util.concurrent.ConcurrentMap;
import javax.validation.metadata.BeanDescriptor;
import javax.validation.metadata.CascadableDescriptor;
+import javax.validation.metadata.ContainerDescriptor;
import javax.validation.metadata.ElementDescriptor;
import org.apache.bval.jsr.ApacheValidatorFactory;
import org.apache.bval.jsr.metadata.AnnotationBehaviorMergeStrategy;
import org.apache.bval.jsr.metadata.CompositeBuilder;
+import org.apache.bval.jsr.metadata.DualBuilder;
import org.apache.bval.jsr.metadata.HierarchyBuilder;
import org.apache.bval.jsr.metadata.MetadataBuilder;
-import org.apache.bval.jsr.metadata.DualBuilder;
import org.apache.bval.jsr.metadata.ReflectionBuilder;
import org.apache.bval.util.Validate;
public class DescriptorManager {
- public static <D extends ElementDescriptor & CascadableDescriptor> boolean isConstrained(D descriptor) {
- return descriptor.hasConstraints() || descriptor.isCascaded();
+ public static <D extends ElementDescriptor & CascadableDescriptor & ContainerDescriptor> boolean isConstrained(
+ D descriptor) {
+ return descriptor.hasConstraints() || descriptor.isCascaded()
+ || !descriptor.getConstrainedContainerElementTypes().isEmpty();
}
private final ApacheValidatorFactory validatorFactory;
http://git-wip-us.apache.org/repos/asf/bval/blob/a63f3d5e/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 070bdc6..088f69d 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
@@ -21,8 +21,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.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashSet;
@@ -35,7 +33,6 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
-import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -43,6 +40,7 @@ import java.util.stream.Stream;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintViolation;
+import javax.validation.ElementKind;
import javax.validation.MessageInterpolator;
import javax.validation.Path;
import javax.validation.TraversableResolver;
@@ -65,13 +63,13 @@ import org.apache.bval.jsr.descriptor.ElementD;
import org.apache.bval.jsr.descriptor.PropertyD;
import org.apache.bval.jsr.groups.Group;
import org.apache.bval.jsr.groups.Groups;
+import org.apache.bval.jsr.metadata.ContainerElementKey;
import org.apache.bval.jsr.util.NodeImpl;
import org.apache.bval.jsr.util.PathImpl;
import org.apache.bval.jsr.util.Proxies;
import org.apache.bval.util.Exceptions;
import org.apache.bval.util.Lazy;
import org.apache.bval.util.ObjectUtils;
-import org.apache.bval.util.ObjectWrapper;
import org.apache.bval.util.Validate;
import org.apache.bval.util.reflection.TypeUtils;
@@ -269,32 +267,13 @@ public abstract class ValidationJob<T> {
@Override
void recurse(Class<?> group, Consumer<ConstraintViolation<T>> sink) {
@SuppressWarnings({ "unchecked", "rawtypes" })
- final Stream<ContainerElementTypeD> containerElements =
- descriptor.getConstrainedContainerElementTypes().stream()
- .flatMap(d -> ComposedD.unwrap(d, (Class) ContainerElementTypeD.class));
-
- final ObjectWrapper<Boolean> effectiveCascade =
- new ObjectWrapper<>(Boolean.valueOf(descriptor.isCascaded()));
+ final Stream<ContainerElementTypeD> containerElements = descriptor.getConstrainedContainerElementTypes()
+ .stream().flatMap(d -> ComposedD.unwrap(d, (Class) ContainerElementTypeD.class));
- // cascade legacy containers the old way by filtering them out here:
-
- final Collection<TypeVariable<?>> wellKnown = Arrays.asList(ITERABLE_ELEMENT, MAP_VALUE);
-
- final Predicate<? super ContainerElementTypeD> isNotLegacyContainer = d -> {
- final boolean cascadedLegacyContainer =
- d.isCascaded() && wellKnown.stream().anyMatch(d.getKey()::represents);
-
- if (cascadedLegacyContainer) {
- effectiveCascade.accept(Boolean.TRUE);
- }
- return !cascadedLegacyContainer;
- };
-
- containerElements.filter(isNotLegacyContainer)
- .flatMap(d -> d.read(context).map(child -> new SproutFrame<>(this, d, child)))
+ containerElements.flatMap(d -> d.read(context).map(child -> new ContainerElementFrame(this, d, child)))
.forEach(f -> f.process(group, sink));
- if (!effectiveCascade.get().booleanValue()) {
+ if (!descriptor.isCascaded()) {
return;
}
if (descriptor instanceof PropertyDescriptor) {
@@ -358,6 +337,7 @@ public abstract class ValidationJob<T> {
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);
@@ -370,6 +350,37 @@ public abstract class ValidationJob<T> {
}
}
+ private class ContainerElementFrame extends SproutFrame<ContainerElementTypeD> {
+
+ ContainerElementFrame(ValidationJob<T>.Frame<?> parent, ContainerElementTypeD descriptor,
+ GraphContext context) {
+ super(parent, descriptor, context);
+ }
+
+ @Override
+ void recurse(Class<?> group, Consumer<ConstraintViolation<T>> sink) {
+ final PathImpl path = context.getPath();
+ final NodeImpl leafNode = path.getLeafNode();
+
+ final NodeImpl newLeaf;
+
+ if (leafNode.getKind() == ElementKind.CONTAINER_ELEMENT) {
+ // recurse using elided path:
+ path.removeLeafNode();
+ newLeaf = new NodeImpl.PropertyNodeImpl(leafNode);
+ newLeaf.setName(null);
+ } else {
+ final ContainerElementKey key = descriptor.getKey();
+ newLeaf = new NodeImpl.PropertyNodeImpl((String) null).inContainer(key.getContainerClass(),
+ key.getTypeArgumentIndex());
+ }
+ path.addNode(newLeaf);
+
+ new SproutFrame<>(parent, descriptor, context.getParent().child(path, context.getValue())).recurse(group,
+ sink);
+ }
+ }
+
private static final Comparator<Path> COMPARE_TO_STRING = Comparator.comparing(Object::toString);
protected static final TypeVariable<?> MAP_VALUE = Map.class.getTypeParameters()[1];
http://git-wip-us.apache.org/repos/asf/bval/blob/a63f3d5e/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 8e12ce3..4de46de 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
@@ -114,6 +114,14 @@ public abstract class NodeImpl implements Path.Node, Serializable {
this.inIterable = node.isInIterable();
this.index = node.getIndex();
this.key = node.getKey();
+
+ if (node instanceof NodeImpl) {
+ final NodeImpl n = (NodeImpl) node;
+ this.parameterIndex = n.parameterIndex;
+ this.parameterTypes = n.parameterTypes;
+ this.containerType = n.containerType;
+ this.typeArgumentIndex = n.typeArgumentIndex;
+ }
}
<T extends Path.Node> NodeImpl(Path.Node node, Class<T> nodeType, Consumer<T> handler) {
@@ -386,8 +394,12 @@ public abstract class NodeImpl implements Path.Node, Serializable {
@SuppressWarnings("serial")
public static class ContainerElementNodeImpl extends NodeImpl implements Path.ContainerElementNode {
- public ContainerElementNodeImpl(String name, Class<?> containerType, Integer typeArgumentIndex) {
+ public ContainerElementNodeImpl(String name) {
super(name);
+ }
+
+ public ContainerElementNodeImpl(String name, Class<?> containerType, Integer typeArgumentIndex) {
+ this(name);
inContainer(containerType, typeArgumentIndex);
}
http://git-wip-us.apache.org/repos/asf/bval/blob/a63f3d5e/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 1f5f3d0..e96a0de 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
@@ -153,6 +153,10 @@ public class PathImpl implements Path, Serializable {
return new NodeImpl.PropertyNodeImpl(cast);
}
+ private static boolean isAwaitingPropertyName(NodeImpl n) {
+ return n != null && n.getName() == null && (n.isInIterable() || n.getContainerClass() != null);
+ }
+
private final LinkedList<NodeImpl> nodeList = new LinkedList<>();
private PathImpl() {
@@ -210,7 +214,7 @@ public class PathImpl implements Path, Serializable {
public void addProperty(String name) {
if (!nodeList.isEmpty()) {
NodeImpl leaf = getLeafNode();
- if (leaf != null && leaf.isInIterable() && leaf.getName() == null) { // TODO: avoid to be here
+ if (isAwaitingPropertyName(leaf)) {
if (!PropertyNode.class.isInstance(leaf)) {
final NodeImpl tmp = new NodeImpl.PropertyNodeImpl(leaf);
removeLeafNode();
@@ -221,13 +225,7 @@ public class PathImpl implements Path, Serializable {
return;
}
}
- final NodeImpl node;
- if ("<cross-parameter>".equals(name)) {
- node = new NodeImpl.CrossParameterNodeImpl();
- } else {
- node = new NodeImpl.PropertyNodeImpl(name);
- }
- addNode(node);
+ addNode(new NodeImpl.PropertyNodeImpl(name));
}
/**