Repository: bval Updated Branches: refs/heads/bv2 6140f7d1c -> 00a882f72
TCK work Project: http://git-wip-us.apache.org/repos/asf/bval/repo Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/cd6d9cac Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/cd6d9cac Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/cd6d9cac Branch: refs/heads/bv2 Commit: cd6d9caceb0e9751fba11c0d240555c77975c9ad Parents: 6140f7d Author: Matt Benson <[email protected]> Authored: Wed Mar 21 16:22:34 2018 -0500 Committer: Matt Benson <[email protected]> Committed: Wed Mar 21 16:22:34 2018 -0500 ---------------------------------------------------------------------- .../bval/jsr/ApacheValidationProvider.java | 11 ++++-- .../org/apache/bval/jsr/descriptor/BeanD.java | 10 +++--- .../bval/jsr/descriptor/MetadataReader.java | 12 +++++-- .../apache/bval/jsr/job/ValidateParameters.java | 8 +++-- .../apache/bval/jsr/util/ExecutableTypes.java | 37 ++++++++++---------- .../java/org/apache/bval/util/Exceptions.java | 13 +++++++ 6 files changed, 59 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bval/blob/cd6d9cac/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidationProvider.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidationProvider.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidationProvider.java index 52d2249..896529e 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidationProvider.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidationProvider.java @@ -25,6 +25,7 @@ import javax.validation.spi.BootstrapState; import javax.validation.spi.ConfigurationState; import javax.validation.spi.ValidationProvider; +import org.apache.bval.util.Exceptions; import org.apache.bval.util.reflection.Reflection; /** @@ -92,9 +93,13 @@ public class ApacheValidationProvider implements ValidationProvider<ApacheValida try { return validatorFactoryClass.getConstructor(ConfigurationState.class).newInstance(configuration); - } catch (final Exception ex) { - throw new ValidationException("Cannot instantiate : " + validatorFactoryClass, ex); + } catch (Exception e) { + final Throwable t = Exceptions.causeOf(e); + if (t instanceof ValidationException) { + throw (ValidationException) t; + } + throw Exceptions.create(ValidationException::new, t, "Cannot instantiate %s", + validatorFactoryClass.getName()); } } - } http://git-wip-us.apache.org/repos/asf/bval/blob/cd6d9cac/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/BeanD.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/BeanD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/BeanD.java index da221ce..5feaddf 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/BeanD.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/BeanD.java @@ -78,15 +78,15 @@ public class BeanD<T> extends ElementD<Class<T>, MetadataReader.ForBean<T>> impl @Override public MethodDescriptor getConstraintsForMethod(String methodName, Class<?>... parameterTypes) { - final Signature key = new Signature(methodName, parameterTypes); - return methods.get(key); + Exceptions.raiseIf(StringUtils.isBlank(methodName), IllegalArgumentException::new, + "method name cannot be null/empty/blank"); + return methods.get(new Signature(methodName, parameterTypes)); } @Override public Set<MethodDescriptor> getConstrainedMethods(MethodType methodType, MethodType... methodTypes) { final EnumSet<MethodType> filter = EnumSet.of(methodType, methodTypes); - return methods.values().stream().filter(DescriptorManager::isConstrained) - .filter(m -> filter.contains(m.getMethodType())).collect(ToUnmodifiable.set()); + return methods.values().stream().filter(m -> filter.contains(m.getMethodType())).collect(ToUnmodifiable.set()); } @Override @@ -96,7 +96,7 @@ public class BeanD<T> extends ElementD<Class<T>, MetadataReader.ForBean<T>> impl @Override public Set<ConstructorDescriptor> getConstrainedConstructors() { - return constructors.values().stream().filter(DescriptorManager::isConstrained).collect(ToUnmodifiable.set()); + return constructors.values().stream().collect(ToUnmodifiable.set()); } public PropertyDescriptor getProperty(String propertyName) { http://git-wip-us.apache.org/repos/asf/bval/blob/cd6d9cac/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 c0d5e78..9dba122 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 @@ -140,7 +140,11 @@ class MetadataReader { final Method m = Reflection.find(meta.getHost(), t -> Reflection.getDeclaredMethod(t, sig.getName(), sig.getParameterTypes())); - result.put(sig, new MethodD(new MetadataReader.ForMethod(new Meta.ForMethod(m), builder), parent)); + final MethodD descriptor = + new MethodD(new MetadataReader.ForMethod(new Meta.ForMethod(m), builder), parent); + if (DescriptorManager.isConstrained(descriptor)) { + result.put(sig, descriptor); + } }); return Collections.unmodifiableMap(result); } @@ -158,7 +162,11 @@ class MetadataReader { final Constructor<?> c = Reflection.getDeclaredConstructor(meta.getHost(), sig.getParameterTypes()); @SuppressWarnings({ "unchecked", "rawtypes" }) final Meta.ForConstructor<T> metaCtor = (Meta.ForConstructor) new Meta.ForConstructor<>(c); - result.put(sig, new ConstructorD<>(new MetadataReader.ForConstructor<T>(metaCtor, builder), parent)); + final ConstructorD<T> descriptor = + new ConstructorD<>(new MetadataReader.ForConstructor<T>(metaCtor, builder), parent); + if (DescriptorManager.isConstrained(descriptor)) { + result.put(sig, descriptor); + } }); return Collections.unmodifiableMap(result); } http://git-wip-us.apache.org/repos/asf/bval/blob/cd6d9cac/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 ce93eaf..5e7dc79 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 @@ -53,7 +53,8 @@ public abstract class ValidateParameters<E extends Executable, T> extends Valida ForMethod(ApacheFactoryContext validatorContext, T object, Method executable, Object[] parameterValues, Class<?>[] groups) { - super(validatorContext, object, executable, parameterValues, groups, new Meta.ForMethod(executable)); + super(validatorContext, object, Validate.notNull(executable, IllegalArgumentException::new, "null method"), + parameterValues, groups, new Meta.ForMethod(executable)); this.object = Validate.notNull(object, IllegalArgumentException::new, "object"); } @@ -84,7 +85,8 @@ public abstract class ValidateParameters<E extends Executable, T> extends Valida ForConstructor(ApacheFactoryContext validatorContext, Constructor<? extends T> executable, Object[] parameterValues, Class<?>[] groups) { - super(validatorContext, null, executable, parameterValues, groups, new Meta.ForConstructor<>(executable)); + super(validatorContext, null, Validate.notNull(executable, IllegalArgumentException::new, "null ctor"), + parameterValues, groups, new Meta.ForConstructor<>(executable)); } @Override @@ -145,7 +147,7 @@ public abstract class ValidateParameters<E extends Executable, T> extends Valida super(validatorContext, groups, meta); this.object = object; this.parameterValues = - Validate.notNull(parameterValues, IllegalArgumentException::new, "parameterValues").clone(); + Validate.notNull(parameterValues, IllegalArgumentException::new, "null parameter values").clone(); final Type[] genericParameterTypes = executable.getGenericParameterTypes(); Exceptions.raiseUnless(parameterValues.length == genericParameterTypes.length, IllegalArgumentException::new, http://git-wip-us.apache.org/repos/asf/bval/blob/cd6d9cac/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java b/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java index 664da42..fed9d49 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java @@ -22,12 +22,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Set; import javax.validation.executable.ExecutableType; +import org.apache.bval.util.Exceptions; import org.apache.bval.util.Validate; /** @@ -35,18 +34,11 @@ import org.apache.bval.util.Validate; */ public class ExecutableTypes { - private static final Map<ExecutableType, Set<ExecutableType>> INTERPRETED_EXECUTABLE_TYPES; - static { - final Map<ExecutableType, Set<ExecutableType>> m = new LinkedHashMap<>(); + private static final Set<ExecutableType> ALL_TYPES = Collections.unmodifiableSet( + EnumSet.of(ExecutableType.CONSTRUCTORS, ExecutableType.NON_GETTER_METHODS, ExecutableType.GETTER_METHODS)); - m.put(ExecutableType.ALL, Collections.unmodifiableSet( - EnumSet.of(ExecutableType.CONSTRUCTORS, ExecutableType.NON_GETTER_METHODS, ExecutableType.GETTER_METHODS))); - m.put(ExecutableType.IMPLICIT, - Collections.unmodifiableSet(EnumSet.of(ExecutableType.CONSTRUCTORS, ExecutableType.NON_GETTER_METHODS))); - m.put(ExecutableType.NONE, Collections.emptySet()); - - INTERPRETED_EXECUTABLE_TYPES = Collections.unmodifiableMap(m); - } + private static final Set<ExecutableType> IMPLICIT_TYPES = + Collections.unmodifiableSet(EnumSet.of(ExecutableType.CONSTRUCTORS, ExecutableType.NON_GETTER_METHODS)); /** * Interpret occurrences of {@link ExecutableType#ALL}, {@link ExecutableType#IMPLICIT}, and @@ -57,13 +49,20 @@ public class ExecutableTypes { */ public static Set<ExecutableType> interpret(Collection<ExecutableType> executableTypes) { Validate.notNull(executableTypes); - - for (Map.Entry<ExecutableType, Set<ExecutableType>> e : INTERPRETED_EXECUTABLE_TYPES.entrySet()) { - if (e.getValue().equals(executableTypes) || executableTypes.contains(e.getKey())) { - return e.getValue(); - } + if (executableTypes.isEmpty()) { + return Collections.emptySet(); + } + final Set<ExecutableType> result = EnumSet.copyOf(executableTypes); + if (result.contains(ExecutableType.ALL)) { + return ALL_TYPES; + } + if (result.remove(ExecutableType.IMPLICIT)) { + Exceptions.raiseUnless(result.isEmpty(), IllegalArgumentException::new, + "Mixing %s with other %ss is illegal.", ExecutableType.IMPLICIT, ExecutableType.class.getSimpleName()); + return IMPLICIT_TYPES; } - return Collections.unmodifiableSet(EnumSet.copyOf(executableTypes)); + result.remove(ExecutableType.NONE); + return result.isEmpty() ? Collections.emptySet() : Collections.unmodifiableSet(result); } /** http://git-wip-us.apache.org/repos/asf/bval/blob/cd6d9cac/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java b/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java index 9487cde..ba3fee8 100644 --- a/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java +++ b/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java @@ -16,6 +16,7 @@ */ package org.apache.bval.util; +import java.lang.reflect.InvocationTargetException; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; @@ -113,6 +114,18 @@ public class Exceptions { raiseIf(!condition, fn, cause, message); } + /** + * Extract cause from {@link InvocationTargetException}s. + * @param t to unwrap + * @return first of t, cause hierarchy not instanceof {@link InvocationTargetException} + */ + public static Throwable causeOf(Throwable t) { + while (t instanceof InvocationTargetException) { + t = t.getCause(); + } + return t; + } + private static <T extends Throwable> T elideStackTrace(T t) { final StackTraceElement[] stackTrace = t.fillInStackTrace().getStackTrace(); t.setStackTrace(Stream.of(stackTrace).filter(e -> !Exceptions.class.getName().equals(e.getClassName()))
