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/09 19:11:54 UTC
[1/2] bval git commit: fix inverted test for log warning
Repository: bval
Updated Branches:
refs/heads/bv2 31a63ef13 -> 67b5f6800
fix inverted test for log warning
Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/67b5f680
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/67b5f680
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/67b5f680
Branch: refs/heads/bv2
Commit: 67b5f68002295ddbf66aa776f86c1485151095ec
Parents: ea55f78
Author: Matt Benson <mb...@apache.org>
Authored: Fri Mar 9 13:03:02 2018 -0600
Committer: Matt Benson <mb...@apache.org>
Committed: Fri Mar 9 13:11:40 2018 -0600
----------------------------------------------------------------------
.../java/org/apache/bval/jsr/metadata/ContainerElementKey.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/bval/blob/67b5f680/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
index 59cc90e..acf1676 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
@@ -67,9 +67,9 @@ public class ContainerElementKey implements Comparable<ContainerElementKey> {
.map(AnnotatedParameterizedType::getAnnotatedActualTypeArguments).ifPresent(args -> {
IntStream.range(0, args.length).forEach(n -> {
if (args[n].isAnnotationPresent(ExtractedValue.class)) {
- if (void.class.equals(args[n].getAnnotation(ExtractedValue.class).type())) {
+ if (!void.class.equals(args[n].getAnnotation(ExtractedValue.class).type())) {
log.warning(String.format("Ignoring non-default %s type specified for %s by %s",
- ExtractedValue.class.getSimpleName(), containerType, extractorType));
+ ExtractedValue.class.getSimpleName(), containerType.getType(), extractorType));
}
result.get().add(new ContainerElementKey(containerType, Integer.valueOf(n)));
}
[2/2] bval git commit: TCK GraphNavigationTest fixes: path
comparisons, graph recursion
Posted by mb...@apache.org.
TCK GraphNavigationTest fixes: path comparisons, graph recursion
Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/ea55f78a
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/ea55f78a
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/ea55f78a
Branch: refs/heads/bv2
Commit: ea55f78a0161b30c72293b80a00a46a760c23cd2
Parents: 31a63ef
Author: Matt Benson <mb...@apache.org>
Authored: Thu Mar 8 16:05:00 2018 -0600
Committer: Matt Benson <mb...@apache.org>
Committed: Fri Mar 9 13:11:40 2018 -0600
----------------------------------------------------------------------
.../org/apache/bval/jsr/job/ValidationJob.java | 9 +-
.../java/org/apache/bval/jsr/util/NodeImpl.java | 130 +++++++++++++++++--
.../java/org/apache/bval/jsr/util/PathImpl.java | 4 +
.../java/org/apache/bval/util/Comparators.java | 54 ++++++++
4 files changed, 178 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/bval/blob/ea55f78a/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 87542f4..70905d0 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
@@ -22,7 +22,6 @@ 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;
import java.util.List;
import java.util.Map;
@@ -120,7 +119,7 @@ public abstract class ValidationJob<T> {
@SuppressWarnings({ "rawtypes", "unchecked" })
private boolean validate(ConstraintD<?> constraint, Consumer<ConstraintViolation<T>> sink) {
if (!validatedPathsByConstraint
- .computeIfAbsent(constraint, k -> new ConcurrentSkipListSet<>(COMPARE_TO_STRING))
+ .computeIfAbsent(constraint, k -> new ConcurrentSkipListSet<>(PathImpl.PATH_COMPARATOR))
.add(context.getPath())) {
// seen, ignore:
return true;
@@ -293,8 +292,8 @@ public abstract class ValidationJob<T> {
return;
}
}
- multiplex().filter(context -> context.getValue() != null).map(context -> new BeanFrame<>(this, context))
- .forEach(b -> b.process(group, sink));
+ multiplex().filter(context -> context.getValue() != null && !context.isRecursive())
+ .map(context -> new BeanFrame<>(this, context)).forEach(b -> b.process(group, sink));
}
private Stream<GraphContext> multiplex() {
@@ -387,8 +386,6 @@ 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];
http://git-wip-us.apache.org/repos/asf/bval/blob/ea55f78a/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 4de46de..e8319f8 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
@@ -18,24 +18,62 @@
*/
package org.apache.bval.jsr.util;
-import javax.validation.ElementKind;
-import javax.validation.Path;
-import javax.validation.Path.Node;
-
-import org.apache.bval.util.Exceptions;
+import static java.util.Comparator.comparing;
+import static java.util.Comparator.naturalOrder;
+import static java.util.Comparator.nullsFirst;
import java.io.Serializable;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
+import java.util.function.Function;
-public abstract class NodeImpl implements Path.Node, Serializable {
+import javax.validation.ElementKind;
+import javax.validation.Path;
+import javax.validation.Path.BeanNode;
+import javax.validation.Path.ConstructorNode;
+import javax.validation.Path.ContainerElementNode;
+import javax.validation.Path.MethodNode;
+import javax.validation.Path.Node;
+import javax.validation.Path.ParameterNode;
+import javax.validation.Path.PropertyNode;
+
+import org.apache.bval.util.Comparators;
+import org.apache.bval.util.Exceptions;
+public abstract class NodeImpl implements Path.Node, Serializable {
private static final long serialVersionUID = 1L;
- private static final String INDEX_OPEN = "[";
- private static final String INDEX_CLOSE = "]";
+
+ /**
+ * Comparator for any path {@link Node}.
+ */
+ public static final Comparator<Path.Node> NODE_COMPARATOR =
+ nullsFirst(comparing(Node::getName, nullsFirst(naturalOrder())).thenComparing(NodeImpl::compareIterability)
+ .thenComparing(NodeImpl::compareSpecificNodeInfo));
+
+ private static final Comparator<Class<?>> CLASS_COMPARATOR = Comparator.nullsFirst(
+ Comparator.<Class<?>, Boolean> comparing(Class::isPrimitive).reversed().thenComparing(Class::getName));
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private static final Comparator<Object> KEY_COMPARATOR = nullsFirst(((Comparator<Object>) (quid, quo) -> {
+ if (quid instanceof Comparable<?> && quo instanceof Comparable<?>) {
+ try {
+ return Comparator.<Comparable> naturalOrder().compare((Comparable) quid, (Comparable) quo);
+ } catch (Exception e) {
+ // apparently not mutually comparable
+ }
+ }
+ if (quid instanceof Class<?> && quo instanceof Class<?>) {
+ return CLASS_COMPARATOR.compare((Class<?>) quid, (Class<?>) quo);
+ }
+ return 0;
+ }).thenComparing((Function<Object, String>) Objects::toString));
+
+ private static final char INDEX_OPEN = '[';
+ private static final char INDEX_CLOSE = ']';
private static <T extends Path.Node> Optional<T> optional(Class<T> type, Object o) {
return Optional.ofNullable(o).filter(type::isInstance).map(type::cast);
@@ -43,6 +81,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Append a Node to the specified StringBuilder.
+ *
* @param node
* @param to
* @return to
@@ -68,6 +107,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Get a NodeImpl indexed from the preceding node (or root).
+ *
* @param index
* @return NodeImpl
*/
@@ -79,6 +119,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Get a NodeImpl keyed from the preceding node (or root).
+ *
* @param key
* @return NodeImpl
*/
@@ -88,6 +129,66 @@ public abstract class NodeImpl implements Path.Node, Serializable {
return result;
}
+ private static int compareIterability(Node quid, Node quo) {
+ if (quid.isInIterable()) {
+ if (quo.isInIterable()) {
+ if (quid.getKey() != null) {
+ return Comparator.comparing(Node::getKey, KEY_COMPARATOR).compare(quid, quo);
+ }
+ if (quid.getIndex() == null) {
+ // this method cannot consistently order iterables without key or index; the first argument is
+ // always assumed to be less:
+ return -1;
+ }
+ return quo.getIndex() == null ? 1 : quid.getIndex().compareTo(quo.getIndex());
+ }
+ return 1;
+ }
+ return quo.isInIterable() ? -1 : 0;
+ }
+
+ private static int compareSpecificNodeInfo(Node quid, Node quo) {
+ final ElementKind kind = quid.getKind();
+ final int k = kind.compareTo(quo.getKind());
+ if (k != 0) {
+ return k;
+ }
+ final Comparator<Node> cmp;
+ switch (kind) {
+ case BEAN:
+ cmp = comparing(to(BeanNode.class), comparing(BeanNode::getContainerClass, CLASS_COMPARATOR)
+ .thenComparing(BeanNode::getTypeArgumentIndex, nullsFirst(naturalOrder())));
+ break;
+ case PROPERTY:
+ cmp = comparing(to(PropertyNode.class), comparing(PropertyNode::getContainerClass, CLASS_COMPARATOR)
+ .thenComparing(PropertyNode::getTypeArgumentIndex, nullsFirst(naturalOrder())));
+ break;
+ case CONTAINER_ELEMENT:
+ cmp = comparing(to(ContainerElementNode.class),
+ comparing(ContainerElementNode::getContainerClass, CLASS_COMPARATOR)
+ .thenComparing(ContainerElementNode::getTypeArgumentIndex, nullsFirst(naturalOrder())));
+ break;
+ case CONSTRUCTOR:
+ cmp = comparing(to(ConstructorNode.class).andThen(ConstructorNode::getParameterTypes),
+ Comparators.comparingIterables(CLASS_COMPARATOR));
+ break;
+ case METHOD:
+ cmp = comparing(to(MethodNode.class).andThen(MethodNode::getParameterTypes),
+ Comparators.comparingIterables(CLASS_COMPARATOR));
+ break;
+ case PARAMETER:
+ cmp = comparing(to(ParameterNode.class).andThen(ParameterNode::getParameterIndex));
+ break;
+ default:
+ return 0;
+ }
+ return cmp.compare(quid, quo);
+ }
+
+ private static <T> Function<Object, T> to(Class<T> type) {
+ return type::cast;
+ }
+
private String name;
private boolean inIterable;
private Integer index;
@@ -99,6 +200,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Create a new NodeImpl instance.
+ *
* @param name
*/
private NodeImpl(String name) {
@@ -107,6 +209,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Create a new NodeImpl instance.
+ *
* @param node
*/
NodeImpl(Path.Node node) {
@@ -141,7 +244,8 @@ public abstract class NodeImpl implements Path.Node, Serializable {
}
/**
- * @param name the name to set
+ * @param name
+ * the name to set
*/
public void setName(String name) {
this.name = name;
@@ -157,6 +261,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Set whether this node represents a contained value of an {@link Iterable} or {@link Map}.
+ *
* @param inIterable
*/
public void setInIterable(boolean inIterable) {
@@ -173,6 +278,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Set the index of this node, implying <code>inIterable</code>.
+ *
* @param index
*/
public void setIndex(Integer index) {
@@ -195,6 +301,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
/**
* Set the map key of this node, implying <code>inIterable</code>.
+ *
* @param key
*/
public void setKey(Object key) {
@@ -229,10 +336,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
if (o == null || !getClass().equals(o.getClass())) {
return false;
}
- final NodeImpl node = (NodeImpl) o;
-
- return inIterable == node.inIterable && Objects.equals(index, node.index) && Objects.equals(key, node.key)
- && Objects.equals(name, node.name);
+ return NODE_COMPARATOR.compare(this, (NodeImpl) o) == 0;
}
/**
http://git-wip-us.apache.org/repos/asf/bval/blob/ea55f78a/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 e96a0de..3289a47 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
@@ -19,6 +19,7 @@
package org.apache.bval.jsr.util;
import java.io.Serializable;
+import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -26,6 +27,7 @@ import java.util.Objects;
import javax.validation.Path;
+import org.apache.bval.util.Comparators;
import org.apache.bval.util.Exceptions;
/**
@@ -39,6 +41,8 @@ public class PathImpl implements Path, Serializable {
private static final long serialVersionUID = 1L;
+ public static final Comparator<Path> PATH_COMPARATOR = Comparators.comparingIterables(NodeImpl.NODE_COMPARATOR);
+
static final String PROPERTY_PATH_SEPARATOR = ".";
/**
http://git-wip-us.apache.org/repos/asf/bval/blob/ea55f78a/bval-jsr/src/main/java/org/apache/bval/util/Comparators.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/util/Comparators.java b/bval-jsr/src/main/java/org/apache/bval/util/Comparators.java
new file mode 100644
index 0000000..940612c
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/util/Comparators.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bval.util;
+
+import java.util.Comparator;
+import java.util.Iterator;
+
+/**
+ * {@link Comparator} related utilities.
+ */
+public class Comparators {
+
+ /**
+ * Get a {@link Comparator} capable of comparing {@link Iterable}s.
+ *
+ * @param each
+ * @return {@link Comparator}
+ */
+ public static <T, I extends Iterable<T>> Comparator<I> comparingIterables(Comparator<? super T> each) {
+ return (quid, quo) -> {
+ final Iterator<T> quids = quid.iterator();
+ final Iterator<T> quos = quo.iterator();
+
+ while (quids.hasNext()) {
+ if (quos.hasNext()) {
+ final int rz = each.compare(quids.next(), quos.next());
+ if (rz != 0) {
+ return rz;
+ }
+ continue;
+ }
+ return 1;
+ }
+ return quos.hasNext() ? -1 : 0;
+ };
+ }
+
+ private Comparators() {
+ }
+}