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/21 23:11:44 UTC

bval git commit: some cleanups

Repository: bval
Updated Branches:
  refs/heads/bv2 00a882f72 -> 339ada646


some cleanups


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

Branch: refs/heads/bv2
Commit: 339ada64661c0865a8f04322b274174b531beccb
Parents: 00a882f
Author: Matt Benson <mb...@apache.org>
Authored: Wed Mar 21 18:11:38 2018 -0500
Committer: Matt Benson <mb...@apache.org>
Committed: Wed Mar 21 18:11:38 2018 -0500

----------------------------------------------------------------------
 .../bval/jsr/descriptor/MetadataReader.java     | 29 ++++----
 .../apache/bval/jsr/job/ValidateParameters.java |  4 +-
 .../org/apache/bval/jsr/job/ValidationJob.java  |  5 +-
 .../bval/jsr/metadata/ReflectionBuilder.java    |  3 +-
 .../bval/jsr/util/AnnotationsManager.java       |  6 --
 .../java/org/apache/bval/jsr/util/Methods.java  |  3 +-
 .../apache/bval/jsr/xml/AnnotationProxy.java    | 74 +++++++++++++++++++-
 .../bval/jsr/xml/AnnotationProxyBuilder.java    |  1 +
 .../java/org/apache/bval/util/ObjectUtils.java  | 39 +++++++++++
 .../java/org/apache/bval/util/StringUtils.java  | 44 +++++++++++-
 10 files changed, 180 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
index 9dba122..83055a9 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
@@ -210,19 +210,22 @@ class MetadataReader {
 
         Set<GroupConversion> getGroupConversions() {
             final Set<GroupConversion> groupConversions = builder.getGroupConversions(meta);
-            Exceptions.raiseUnless(groupConversions.isEmpty() || isCascaded(), ConstraintDeclarationException::new,
-                "@%s declared without @%s on %s", ConvertGroup.class.getSimpleName(), Valid.class.getSimpleName(),
-                meta.describeHost());
-
-            Exceptions.raiseIf(
-                groupConversions.stream().map(GroupConversion::getFrom).distinct().count() < groupConversions.size(),
-                ConstraintDeclarationException::new, "%s has duplicate 'from' group conversions", meta.describeHost());
-
-            groupConversions.stream().map(GroupConversion::getFrom)
-                .forEach(f -> Exceptions.raiseIf(f.isAnnotationPresent(GroupSequence.class),
-                    ConstraintDeclarationException::new,
-                    "Invalid group conversion declared on %s from group sequence %s", meta.describeHost(), f));
-
+            if (!groupConversions.isEmpty()) {
+                Exceptions.raiseUnless(isCascaded(), ConstraintDeclarationException::new,
+                    "@%s declared without @%s on %s", ConvertGroup.class.getSimpleName(), Valid.class.getSimpleName(),
+                    meta.describeHost());
+
+                Exceptions.raiseIf(
+                    groupConversions.stream().map(GroupConversion::getFrom).distinct().count() < groupConversions
+                        .size(),
+                    ConstraintDeclarationException::new, "%s has duplicate 'from' group conversions",
+                    meta.describeHost());
+
+                groupConversions.stream().map(GroupConversion::getFrom)
+                    .forEach(f -> Exceptions.raiseIf(f.isAnnotationPresent(GroupSequence.class),
+                        ConstraintDeclarationException::new,
+                        "Invalid group conversion declared on %s from group sequence %s", meta.describeHost(), f));
+            }
             return groupConversions;
         }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/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 5e7dc79..c80937f 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
@@ -49,13 +49,11 @@ public abstract class ValidateParameters<E extends Executable, T> extends Valida
 
     public static class ForMethod<T> extends ValidateParameters<Method, T> {
 
-        private final T object;
-
         ForMethod(ApacheFactoryContext validatorContext, T object, Method executable, Object[] parameterValues,
             Class<?>[] groups) {
             super(validatorContext, object, Validate.notNull(executable, IllegalArgumentException::new, "null method"),
                 parameterValues, groups, new Meta.ForMethod(executable));
-            this.object = Validate.notNull(object, IllegalArgumentException::new, "object");
+            Validate.notNull(object, IllegalArgumentException::new, "object");
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/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 3c74ce0..b8f22c1 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
@@ -514,8 +514,9 @@ public abstract class ValidationJob<T> {
     private boolean each(Stream<Class<?>> groupSequence, BiConsumer<Class<?>, Consumer<ConstraintViolation<T>>> closure,
         Consumer<ConstraintViolation<T>> sink) {
         final Lazy<Set<ConstraintViolation<T>>> sequenceViolations = new Lazy<>(LinkedHashSet::new);
-        for (Class<?> g : (Iterable<Class<?>>) () -> groupSequence.iterator()) {
-            closure.accept(g, sequenceViolations.consumer(Set::add));
+        final Consumer<ConstraintViolation<T>> addSequenceViolation = sequenceViolations.consumer(Set::add);
+        for (Class<?> g : (Iterable<Class<?>>) groupSequence::iterator) {
+            closure.accept(g, addSequenceViolation);
             if (sequenceViolations.optional().isPresent()) {
                 sequenceViolations.get().forEach(sink);
                 return false;

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
index ea396a0..08b2b1d 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
@@ -24,6 +24,7 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Executable;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.Parameter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -81,7 +82,7 @@ public class ReflectionBuilder {
             if (declaredFields.length == 0) {
                 return Collections.emptyMap();
             }
-            return Stream.of(declaredFields).collect(
+            return Stream.of(declaredFields).filter(f -> !Modifier.isStatic(f.getModifiers())).collect(
                 Collectors.toMap(Field::getName, f -> new ReflectionBuilder.ForContainer<>(new Meta.ForField(f))));
         }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java b/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
index 4436bb7..ea2cac5 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
@@ -40,7 +40,6 @@ import java.util.stream.Stream;
 
 import javax.validation.Constraint;
 import javax.validation.ConstraintDefinitionException;
-import javax.validation.ConstraintTarget;
 import javax.validation.OverridesAttribute;
 import javax.validation.Payload;
 import javax.validation.ValidationException;
@@ -160,10 +159,6 @@ public class AnnotationsManager {
             final Class<? extends Payload>[] payload =
                 ConstraintAnnotationAttributes.PAYLOAD.analyze(source.annotationType()).read(source);
 
-            final Optional<ConstraintTarget> constraintTarget =
-                Optional.of(source.annotationType()).map(ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO::analyze)
-                    .filter(ConstraintAnnotationAttributes.Worker::isValid).map(w -> w.read(source));
-
             final Map<Class<? extends Annotation>, AtomicInteger> constraintCounts = new HashMap<>();
 
             return Stream.of(components).map(c -> {
@@ -174,7 +169,6 @@ public class AnnotationsManager {
 
                 proxyBuilder.setGroups(groups);
                 proxyBuilder.setPayload(payload);
-                constraintTarget.ifPresent(proxyBuilder::setValidationAppliesTo);
 
                 overrides.optional().map(o -> o.get(new OverriddenAnnotationSpecifier(c.annotationType(), index)))
                     .ifPresent(m -> {

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java b/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java
index 4b5ce45..ce83c73 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java
@@ -18,6 +18,7 @@ package org.apache.bval.jsr.util;
 
 import java.beans.Introspector;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.stream.Stream;
 
 import org.apache.bval.util.Validate;
@@ -28,7 +29,7 @@ import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
 @Privilizing(@CallTo(Reflection.class))
 public final class Methods {
     public static boolean isGetter(Method m) {
-        if (m.getParameterCount() > 0) {
+        if (Modifier.isStatic(m.getModifiers()) || m.getParameterCount() > 0) {
             return false;
         }
         // TODO look for capital letter after verb?

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
index 96a2b46..13678ac 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
@@ -19,14 +19,20 @@ package org.apache.bval.jsr.xml;
 import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.Arrays;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 
 import javax.validation.Valid;
 
+import org.apache.bval.jsr.metadata.Signature;
 import org.apache.bval.util.Exceptions;
+import org.apache.bval.util.ObjectUtils;
+import org.apache.bval.util.StringUtils;
+import org.apache.bval.util.reflection.Reflection;
 
 /**
  * Description: <br/>
@@ -37,6 +43,8 @@ class AnnotationProxy implements Annotation, InvocationHandler, Serializable {
 
     /** Serialization version */
     private static final long serialVersionUID = 1L;
+    
+    private Signature EQUALS = new Signature("equals", Object.class);
 
     private final Class<? extends Annotation> annotationType;
     private final SortedMap<String, Object> values;
@@ -74,6 +82,9 @@ class AnnotationProxy implements Annotation, InvocationHandler, Serializable {
         if (values.containsKey(method.getName())) {
             return values.get(method.getName());
         }
+        if (EQUALS.equals(Signature.of(method))) {
+            return equalTo(args[0]);
+        }
         return method.invoke(this, args);
     }
 
@@ -90,7 +101,68 @@ class AnnotationProxy implements Annotation, InvocationHandler, Serializable {
      */
     @Override
     public String toString() {
-        return values.entrySet().stream().map(e -> String.format("%s=%s", e.getKey(), e.getValue()))
+        return values.entrySet().stream()
+            .map(e -> String.format("%s=%s", e.getKey(), StringUtils.valueOf(e.getValue())))
             .collect(Collectors.joining(", ", String.format("@%s(", annotationType().getName()), ")"));
     }
+
+    @Override
+    public int hashCode() {
+        return values.entrySet().stream().mapToInt(e -> {
+            return (127 * e.getKey().hashCode()) ^ ObjectUtils.hashCode(e.getValue());
+        }).sum();
+    }
+
+    private boolean equalTo(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (obj instanceof Annotation) {
+            final Annotation other = (Annotation) obj;
+            return other.annotationType().equals(annotationType)
+                && values.entrySet().stream().allMatch(e -> memberEquals(other, e.getKey(), e.getValue()));
+        }
+        return false;
+    }
+
+    private boolean memberEquals(Annotation other, String name, Object value) {
+        final Method member = Reflection.getDeclaredMethod(annotationType, name);
+        final Object otherValue;
+        try {
+            otherValue = member.invoke(other);
+        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+            throw new IllegalStateException(e);
+        }
+        Exceptions.raiseIf(otherValue == null || !otherValue.getClass().equals(value.getClass()),
+            IllegalStateException::new, "Unexpected value %s for member %s of %s", otherValue, name, other);
+
+        if (value instanceof Object[]) {
+            return Arrays.equals((Object[]) value, (Object[]) otherValue);
+        }
+        if (value instanceof byte[]) {
+            return Arrays.equals((byte[]) value, (byte[]) otherValue);
+        }
+        if (value instanceof short[]) {
+            return Arrays.equals((short[]) value, (short[]) otherValue);
+        }
+        if (value instanceof int[]) {
+            return Arrays.equals((int[]) value, (int[]) otherValue);
+        }
+        if (value instanceof char[]) {
+            return Arrays.equals((char[]) value, (char[]) otherValue);
+        }
+        if (value instanceof long[]) {
+            return Arrays.equals((long[]) value, (long[]) otherValue);
+        }
+        if (value instanceof float[]) {
+            return Arrays.equals((float[]) value, (float[]) otherValue);
+        }
+        if (value instanceof double[]) {
+            return Arrays.equals((double[]) value, (double[]) otherValue);
+        }
+        if (value instanceof boolean[]) {
+            return Arrays.equals((boolean[]) value, (boolean[]) otherValue);
+        }
+        return value.equals(otherValue);
+    }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java
index 02383cb..fa6dab6 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java
@@ -214,6 +214,7 @@ public final class AnnotationProxyBuilder<A extends Annotation> {
     public boolean setValidationAppliesTo(ConstraintTarget constraintTarget) {
         return setValue(ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getAttributeName(), constraintTarget);
     }
+
     public boolean isChanged() {
         return changed;
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/util/ObjectUtils.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/util/ObjectUtils.java b/bval-jsr/src/main/java/org/apache/bval/util/ObjectUtils.java
index 1c5a728..2ccf90d 100644
--- a/bval-jsr/src/main/java/org/apache/bval/util/ObjectUtils.java
+++ b/bval-jsr/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.Arrays;
 import java.util.Objects;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
@@ -95,4 +96,42 @@ public final class ObjectUtils {
 
         return newArray;
     }
+
+    /**
+     * Get hashcode of {@code o}, taking into account array values.
+     * @param o
+     * @return {@code int}
+     * @see Arrays
+     * @see Objects#hashCode(Object)
+     */
+    public static int hashCode(Object o) {
+        if (o instanceof Object[]) {
+            return Arrays.hashCode((Object[]) o);
+        }
+        if (o instanceof byte[]) {
+            return Arrays.hashCode((byte[]) o);
+        }
+        if (o instanceof short[]) {
+            return Arrays.hashCode((short[]) o);
+        }
+        if (o instanceof int[]) {
+            return Arrays.hashCode((int[]) o);
+        }
+        if (o instanceof char[]) {
+            return Arrays.hashCode((char[]) o);
+        }
+        if (o instanceof long[]) {
+            return Arrays.hashCode((long[]) o);
+        }
+        if (o instanceof float[]) {
+            return Arrays.hashCode((float[]) o);
+        }
+        if (o instanceof double[]) {
+            return Arrays.hashCode((double[]) o);
+        }
+        if (o instanceof boolean[]) {
+            return Arrays.hashCode((boolean[]) o);
+        }
+        return Objects.hashCode(o);
+    }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/339ada64/bval-jsr/src/main/java/org/apache/bval/util/StringUtils.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/util/StringUtils.java b/bval-jsr/src/main/java/org/apache/bval/util/StringUtils.java
index 6b9c25d..3328a2c 100644
--- a/bval-jsr/src/main/java/org/apache/bval/util/StringUtils.java
+++ b/bval-jsr/src/main/java/org/apache/bval/util/StringUtils.java
@@ -17,6 +17,7 @@
 package org.apache.bval.util;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public final class StringUtils {
@@ -113,6 +114,8 @@ public final class StringUtils {
 
     /**
      * <p>Splits the provided text into an array, separator is whitespace.
+     * @param str
+     * @return {@link String}[]
      */
     public static String[] split(String str) {
         return split(str, null);
@@ -120,12 +123,14 @@ public final class StringUtils {
 
     /**
      * <p>Splits the provided text into an array, separator is whitespace.
+     * @param str
+     * @param token
+     * @return {@link String}[]
      */
     public static String[] split(String str, Character token) {
         if (str == null || str.isEmpty()) {
             return ObjectUtils.EMPTY_STRING_ARRAY;
         }
-
         // split on token
         List<String> ret = new ArrayList<>();
         StringBuilder sb = new StringBuilder(str.length());
@@ -146,4 +151,41 @@ public final class StringUtils {
         return ret.toArray(new String[ret.size()]);
     }
 
+    /**
+     * Return a {@link String} representation of {@code o}, accounting for array types.
+     * @param o
+     * @return {@link String}
+     * @see Arrays
+     * @see String#valueOf(Object)
+     */
+    public static String valueOf(Object o) {
+        if (o instanceof Object[]) {
+            return Arrays.toString((Object[]) o);
+        }
+        if (o instanceof byte[]) {
+            return Arrays.toString((byte[]) o);
+        }
+        if (o instanceof short[]) {
+            return Arrays.toString((short[]) o);
+        }
+        if (o instanceof int[]) {
+            return Arrays.toString((int[]) o);
+        }
+        if (o instanceof char[]) {
+            return Arrays.toString((char[]) o);
+        }
+        if (o instanceof long[]) {
+            return Arrays.toString((long[]) o);
+        }
+        if (o instanceof float[]) {
+            return Arrays.toString((float[]) o);
+        }
+        if (o instanceof double[]) {
+            return Arrays.toString((double[]) o);
+        }
+        if (o instanceof boolean[]) {
+            return Arrays.toString((boolean[]) o);
+        }
+        return String.valueOf(o);
+    }
 }
\ No newline at end of file