improve efficiency of generated exceptions/messages
Project: http://git-wip-us.apache.org/repos/asf/bval/repo Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/7b3c58e0 Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/7b3c58e0 Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/7b3c58e0 Branch: refs/heads/bv2 Commit: 7b3c58e005f8a4741e34bab510fa97d36ba8c8c9 Parents: 2af2f5a Author: Matt Benson <[email protected]> Authored: Fri Mar 23 16:10:44 2018 -0500 Committer: Matt Benson <[email protected]> Committed: Fri Mar 23 16:10:44 2018 -0500 ---------------------------------------------------------------------- .../jsr/ConstraintAnnotationAttributes.java | 5 ++- .../org/apache/bval/jsr/ConstraintCached.java | 9 ++-- .../bval/jsr/ConstraintViolationImpl.java | 4 +- .../ComputeConstraintValidatorClass.java | 23 +++++----- .../apache/bval/jsr/descriptor/ConstraintD.java | 24 ++++++---- .../jsr/descriptor/ContainerElementTypeD.java | 7 +-- .../bval/jsr/descriptor/MetadataReader.java | 47 +++++++++++--------- .../apache/bval/jsr/groups/GroupsComputer.java | 7 ++- .../jsr/job/ConstraintValidatorContextImpl.java | 8 ++-- .../apache/bval/jsr/job/ValidateProperty.java | 25 ++++++----- .../bval/jsr/job/ValidateReturnValue.java | 6 +-- .../org/apache/bval/jsr/job/ValidationJob.java | 27 ++++++----- .../bval/jsr/metadata/CompositeBuilder.java | 18 +++++--- .../bval/jsr/metadata/ContainerElementKey.java | 7 +-- .../bval/jsr/metadata/HierarchyBuilder.java | 7 +-- .../org/apache/bval/jsr/metadata/Liskov.java | 4 +- .../bval/jsr/metadata/ReflectionBuilder.java | 11 +++-- .../jsr/metadata/ValidatorMappingProvider.java | 8 ++-- .../apache/bval/jsr/metadata/XmlBuilder.java | 7 +-- .../bval/jsr/util/AnnotationsManager.java | 22 ++++----- .../apache/bval/jsr/util/ExecutableTypes.java | 6 ++- .../java/org/apache/bval/jsr/util/NodeImpl.java | 2 +- .../jsr/valueextraction/ValueExtractors.java | 6 +-- .../apache/bval/jsr/xml/AnnotationProxy.java | 7 +-- .../java/org/apache/bval/util/Exceptions.java | 44 ++++++++++++++++++ .../java/org/apache/bval/util/Validate.java | 6 ++- 26 files changed, 215 insertions(+), 132 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java index f40e301..d9a1c69 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java @@ -126,8 +126,9 @@ public enum ConstraintAnnotationAttributes { public <V> V get(Map<? super String, ? super V> map) { @SuppressWarnings("unchecked") final V result = (V) map.get(getAttributeName()); - Exceptions.raiseUnless(TypeUtils.isInstance(result, getType()), IllegalStateException::new, - "Invalid '%s' value: %s", getAttributeName(), result); + if (!TypeUtils.isInstance(result, getType())) { + Exceptions.raise(IllegalStateException::new, "Invalid '%s' value: %s", getAttributeName(), result); + } return result; } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java index faa9144..fa9e3df 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java @@ -24,13 +24,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.validation.ConstraintDefinitionException; import javax.validation.ConstraintValidator; @@ -44,7 +42,6 @@ import org.apache.bval.jsr.metadata.ValidatorMappingProvider; import org.apache.bval.jsr.util.ToUnmodifiable; import org.apache.bval.util.Exceptions; import org.apache.bval.util.Lazy; -import org.apache.bval.util.ObjectUtils; import org.apache.bval.util.Validate; /** @@ -73,8 +70,10 @@ public class ConstraintCached { supportedTargets = svt == null ? DEFAULT_VALIDATION_TARGETS : Collections.unmodifiableSet(EnumSet.copyOf(Arrays.asList(svt.value()))); - Exceptions.raiseIf(supportedTargets.isEmpty(), ConstraintDefinitionException::new, - "Illegally specified 0-length %s value on %s", SupportedValidationTarget.class.getSimpleName(), type); + if (supportedTargets.isEmpty()) { + Exceptions.raise(ConstraintDefinitionException::new, "Illegally specified 0-length %s value on %s", + SupportedValidationTarget.class.getSimpleName(), type); + } } public Class<? extends ConstraintValidator<T, ?>> getType() { http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java index 15f754d..2bf6d3b 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java @@ -172,7 +172,9 @@ public class ConstraintViolationImpl<T> implements ConstraintViolation<T>, Seria @Override public <U> U unwrap(Class<U> type) { - Exceptions.raiseUnless(type.isInstance(this), ValidationException::new, "Type %s is not supported", type); + if (!type.isInstance(this)) { + Exceptions.raise(ValidationException::new, "Type %s is not supported", type); + } return type.cast(this); } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java index d2595ea..820a1d8 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java @@ -64,7 +64,7 @@ class ComputeConstraintValidatorClass<A extends Annotation> this.arrayDepth = d; } - Class<?> unwrap(Class<?> t) { + Class<?> unwrapArrayComponentType(Class<?> t) { Exceptions.raiseUnless(t.isAssignableFrom(componentType), IllegalArgumentException::new, "%s not assignable from %s", t, componentType); if (arrayDepth == 0) { @@ -80,8 +80,10 @@ class ComputeConstraintValidatorClass<A extends Annotation> private static Class<?> getValidatedType(Class<? extends ConstraintValidator<?, ?>> validatorType) { final Type result = TypeUtils.getTypeArguments(validatorType, ConstraintValidator.class) .get(ConstraintValidator.class.getTypeParameters()[1]); - Exceptions.raiseUnless(isSupported(result), ConstraintDefinitionException::new, - "Validated type %s declared by %s %s is unsupported", result, CV, validatorType.getName()); + if (!isSupported(result)) { + Exceptions.raise(ConstraintDefinitionException::new, "Validated type %s declared by %s %s is unsupported", + result, CV, validatorType.getName()); + } return TypeUtils.getRawType(result, null); } @@ -140,14 +142,15 @@ class ComputeConstraintValidatorClass<A extends Annotation> @SuppressWarnings("unchecked") final Class<A> constraintType = (Class<A>) constraint.annotationType(); - Exceptions.raiseIf(set.size() > 1 || !composed && set.isEmpty(), ConstraintDefinitionException::new, - "%d cross-parameter %ss found for constraint type %s", set.size(), CV, constraintType); + final int size = set.size(); + Exceptions.raiseIf(size > 1 || !composed && set.isEmpty(), ConstraintDefinitionException::new, + "%d cross-parameter %ss found for constraint type %s", size, CV, constraintType); final Class<? extends ConstraintValidator<A, ?>> result = set.iterator().next().getType(); - Exceptions.raiseUnless(TypeUtils.isAssignable(Object[].class, getValidatedType(result)), - ConstraintDefinitionException::new, - "Cross-parameter %s %s does not support the validation of an object array", CV, result.getName()); - + if (!TypeUtils.isAssignable(Object[].class, getValidatedType(result))) { + Exceptions.raise(ConstraintDefinitionException::new, + "Cross-parameter %s %s does not support the validation of an object array", CV, result.getName()); + } return result; } @@ -199,6 +202,6 @@ class ComputeConstraintValidatorClass<A extends Annotation> final TypeWrapper w = new TypeWrapper(Reflection.primitiveToWrapper(validatedType)); Stream.Builder<Class<?>> hierarchy = Stream.builder(); Reflection.hierarchy(w.componentType, Interfaces.INCLUDE).forEach(hierarchy); - return hierarchy.build().map(w::unwrap); + return hierarchy.build().map(w::unwrapArrayComponentType); } } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java index 8dd6db9..16007c5 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java @@ -197,7 +197,8 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A Optional.of(constraintType).map(attr::analyze).filter(Worker::isValid).map(w -> w.<T> read(annotation)); Exceptions.raiseUnless(optionality.isOptional() || result.isPresent(), ConstraintDefinitionException::new, - "Required attribute %s missing from constraint type %s", attr.getAttributeName(), constraintType); + "Required attribute %s missing from constraint type %s", + f -> f.args(attr.getAttributeName(), constraintType)); return result.orElse(null); } @@ -237,18 +238,21 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A private Set<Class<? extends Payload>> computePayload() { final Set<Class<? extends Payload>> result = set(() -> read(ConstraintAnnotationAttributes.PAYLOAD, Optionality.REQUIRED)); - Exceptions.raiseIf(result.containsAll(Arrays.asList(Unwrapping.Unwrap.class, Unwrapping.Skip.class)), - ConstraintDeclarationException::new, - "Constraint %s declared at %s specifies conflicting value unwrapping hints", annotation, meta.getHost()); + if (result.containsAll(Arrays.asList(Unwrapping.Unwrap.class, Unwrapping.Skip.class))) { + Exceptions.raise(ConstraintDeclarationException::new, + "Constraint %s declared at %s specifies conflicting value unwrapping hints", annotation, + meta.getHost()); + } return result; } private Class<?> computeValidatedType(ApacheValidatorFactory validatorFactory) { final Class<?> rawType = TypeUtils.getRawType(meta.getType(), null); - Exceptions.raiseIf(rawType == null, UnexpectedTypeException::new, "Could not calculate validated type from %s", - meta.getType()); - + if (rawType == null) { + Exceptions.raise(UnexpectedTypeException::new, "Could not calculate validated type from %s", + meta.getType()); + } if (payload.contains(Unwrapping.Skip.class)) { return rawType; } @@ -258,8 +262,10 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A final boolean unwrap = payload.contains(Unwrapping.Unwrap.class); if (valueExtractor == null) { - Exceptions.raiseIf(unwrap, ConstraintDeclarationException::new, "No compatible %s found for %s", - ValueExtractor.class.getSimpleName(), meta.getType()); + if (unwrap) { + Exceptions.raise(ConstraintDeclarationException::new, "No compatible %s found for %s", + ValueExtractor.class.getSimpleName(), meta.getType()); + } } else { @SuppressWarnings("unchecked") final Class<? extends ValueExtractor<?>> extractorClass = http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 f8abed2..ef00edc 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 @@ -59,9 +59,10 @@ public class ContainerElementTypeD extends CascadableContainerD<CascadableContai @Override protected Stream<GraphContext> readImpl(GraphContext context) throws Exception { final ValueExtractor<?> valueExtractor = context.getValidatorContext().getValueExtractors().find(key); - Exceptions.raiseIf(valueExtractor == null, ConstraintDeclarationException::new, "No %s found for %s", - ValueExtractor.class.getSimpleName(), key); - + if (valueExtractor == null) { + Exceptions.raise(ConstraintDeclarationException::new, "No %s found for %s", + ValueExtractor.class.getSimpleName(), key); + } return ExtractValues.extract(context, key, valueExtractor).stream(); } } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 83055a9..beb0648 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 @@ -105,9 +105,9 @@ class MetadataReader { beanBuilder.getGetters(meta).forEach((g, builder) -> { final Method getter = Methods.getter(meta.getHost(), g); - Exceptions.raiseIf(getter == null, IllegalStateException::new, - "Getter method for property %s not found", g); - + if (getter == null) { + Exceptions.raise(IllegalStateException::new, "Getter method for property %s not found", g); + } properties.computeIfAbsent(g, descriptorList).add(new PropertyD.ForMethod( new MetadataReader.ForContainer<>(new Meta.ForMethod(getter), builder), parent)); }); @@ -173,27 +173,31 @@ class MetadataReader { List<Class<?>> getGroupSequence() { List<Class<?>> result = builder.getGroupSequence(meta); + final Class<T> host = meta.getHost(); if (result == null) { // resolve group sequence/Default redefinition up class hierarchy: - final Class<?> superclass = meta.getHost().getSuperclass(); + final Class<?> superclass = host.getSuperclass(); if (superclass != null) { // attempt to mock parent sequence intent by appending this type immediately after supertype: result = ((ElementD<?, ?>) validatorFactory.getDescriptorManager().getBeanDescriptor(superclass)) .getGroupSequence(); if (result != null) { result = new ArrayList<>(result); - result.add(result.indexOf(superclass) + 1, meta.getHost()); + result.add(result.indexOf(superclass) + 1, host); } } } if (result == null) { return null; } - Exceptions.raiseUnless(result.contains(meta.getHost()), GroupDefinitionException::new, - "@%s for %s must contain %<s", GroupSequence.class.getSimpleName(), meta.getHost()); - Exceptions.raiseIf(result.contains(Default.class), GroupDefinitionException::new, - "@%s for %s must not contain %s", GroupSequence.class.getSimpleName(), meta.getHost(), - Default.class.getName()); + if (!result.contains(host)) { + Exceptions.raise(GroupDefinitionException::new, "@%s for %s must contain %<s", + GroupSequence.class.getSimpleName(), host); + } + if (result.contains(Default.class)) { + Exceptions.raise(GroupDefinitionException::new, "@%s for %s must not contain %s", + GroupSequence.class.getSimpleName(), host, Default.class.getName()); + } return Collections.unmodifiableList(result); } } @@ -211,20 +215,19 @@ class MetadataReader { Set<GroupConversion> getGroupConversions() { final Set<GroupConversion> groupConversions = builder.getGroupConversions(meta); 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()); - + if (!isCascaded()) { + Exceptions.raise(ConstraintDeclarationException::new, "@%s declared without @%s on %s", + ConvertGroup.class.getSimpleName(), Valid.class.getSimpleName(), meta.describeHost()); + } + if (groupConversions.stream().map(GroupConversion::getFrom).distinct().count() < groupConversions + .size()) { + Exceptions.raise(ConstraintDeclarationException::new, "%s has duplicate 'from' group conversions", + meta.describeHost()); + } groupConversions.stream().map(GroupConversion::getFrom) - .forEach(f -> Exceptions.raiseIf(f.isAnnotationPresent(GroupSequence.class), + .forEach(from -> Exceptions.raiseIf(from.isAnnotationPresent(GroupSequence.class), ConstraintDeclarationException::new, - "Invalid group conversion declared on %s from group sequence %s", meta.describeHost(), f)); + "Invalid group conversion declared on %s from group sequence %s", f -> f.args(meta.describeHost(), from))); } return groupConversions; } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java b/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java index 8f4cdda..30a47cd 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java @@ -137,10 +137,9 @@ public class GroupsComputer { Exceptions.raiseIf(groups.stream().anyMatch(Objects::isNull), IllegalArgumentException::new, "Null group specified"); - for (final Class<?> clazz : groups) { - Exceptions.raiseUnless(clazz.isInterface(), ValidationException::new, - "A group must be an interface. %s is not.", clazz); - } + groups.forEach(g -> Exceptions.raiseUnless(g.isInterface(), ValidationException::new, + "A group must be an interface. %s is not.", g)); + final Groups chain = new Groups(); for (Class<?> clazz : groups) { final GroupSequence anno = clazz.getAnnotation(GroupSequence.class); http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 6d4ca98..07c0c96 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 @@ -82,7 +82,7 @@ public class ConstraintValidatorContextImpl<T> implements ConstraintValidatorCon @Override public NodeBuilderDefinedContext addParameterNode(int index) { Exceptions.raiseUnless(frame.descriptor instanceof CrossParameterDescriptor, ValidationException::new, - "Cannot add parameter node for %s", frame.descriptor.getClass().getName()); + "Cannot add parameter node for %s", f -> f.args(frame.descriptor.getClass().getName())); final CrossParameterD<?, ?> crossParameter = ComposedD.unwrap(frame.descriptor, CrossParameterD.class).findFirst().get(); @@ -175,9 +175,9 @@ public class ConstraintValidatorContextImpl<T> implements ConstraintValidatorCon Set<ConstraintViolation<T>> getRequiredViolations() { if (!violations.optional().isPresent()) { - Exceptions.raiseIf(defaultConstraintViolationDisabled, ValidationException::new, - "Expected custom constraint violation(s)"); - + if (defaultConstraintViolationDisabled) { + Exceptions.raise(ValidationException::new, "Expected custom constraint violation(s)"); + } addError(getDefaultConstraintMessageTemplate(), frame.context.getPath()); } return violations.get(); http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 fa7e0f5..ce33840 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 @@ -200,8 +200,10 @@ public final class ValidateProperty<T> extends ValidationJob<T> { bean = (BeanD<?>) validatorContext.getDescriptorManager().getBeanDescriptor(element.getElementClass()); } final PropertyDescriptor property = bean.getProperty(name); - Exceptions.raiseIf(property == null, IllegalArgumentException::new, "Unknown property %s of %s", name, - bean.getElementClass()); + if (property == null) { + Exceptions.raise(IllegalArgumentException::new, "Unknown property %s of %s", name, + bean.getElementClass()); + } current = new DescriptorWrapper(property); } @@ -259,11 +261,8 @@ public final class ValidateProperty<T> extends ValidationJob<T> { Optional.ofNullable(TypeUtils.getTypeArguments(type, Iterable.class).get(ITERABLE_ELEMENT)) .orElse(ITERABLE_ELEMENT); } else { - elementType = null; + throw Exceptions.create(IllegalArgumentException::new, "Unable to resolve element type of %s", type); } - Exceptions.raiseIf(elementType == null, IllegalArgumentException::new, - "Unable to resolve element type of %s", type); - return new TypeWrapper(validatorContext, elementType); } @@ -380,7 +379,9 @@ public final class ValidateProperty<T> extends ValidationJob<T> { } else { try { final int index = Integer.parseInt(indexOrKey); - Exceptions.raiseIf(index < 0, IllegalArgumentException::new, "Invalid index %d", index); + if (index < 0) { + Exceptions.raise(IllegalArgumentException::new, "Invalid index %d", index); + } if (o != null && TypeUtils.isArrayType(o.getClass())) { if (Array.getLength(o) > index) { return Array.get(o, index); @@ -478,8 +479,9 @@ public final class ValidateProperty<T> extends ValidationJob<T> { descriptor = (ElementD<?, ?>) validatorContext.getDescriptorManager().getBeanDescriptor(t); } else { final Class<?> propertyType = descriptor.getElementClass(); - Exceptions.raiseUnless(TypeUtils.isInstance(value, propertyType), IllegalArgumentException::new, - "%s is not an instance of %s", value, propertyType); + if (!TypeUtils.isInstance(value, propertyType)) { + Exceptions.raise(IllegalArgumentException::new, "%s is not an instance of %s", value, propertyType); + } } } @@ -489,8 +491,9 @@ public final class ValidateProperty<T> extends ValidationJob<T> { this(new ForBeanProperty<>(validatorContext, bean), validatorContext, (Class<T>) Validate.notNull(bean, IllegalArgumentException::new, "bean").getClass(), property, groups); - Exceptions.raiseIf(descriptor == null, IllegalArgumentException::new, - "Could not resolve property name/path: %s", property); + if (descriptor == null) { + Exceptions.raise(IllegalArgumentException::new, "Could not resolve property name/path: %s", property); + } } public ValidateProperty<T> cascade(boolean cascade) { http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java index d477b72..8ffd5f5 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java @@ -103,9 +103,9 @@ public abstract class ValidateReturnValue<E extends Executable, T> extends Valid super(validatorContext, groups, meta); final Type type = Validate.notNull(meta, IllegalArgumentException::new, "meta").getType(); - Exceptions.raiseUnless(TypeUtils.isInstance(returnValue, type), IllegalArgumentException::new, - "%s is not an instance of %s", returnValue, type); - + if (!TypeUtils.isInstance(returnValue, type)) { + Exceptions.raise(IllegalArgumentException::new, "%s is not an instance of %s", returnValue, type); + } this.returnValue = returnValue; } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 a55b9b7..0501a8a 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 @@ -148,13 +148,15 @@ public abstract class ValidationJob<T> { .ifPresent(x -> m.put(genericKey, x)); } if (m.isEmpty()) { - Exceptions.raiseIf(valueUnwrapping == ValidateUnwrappedValue.UNWRAP, - ConstraintDeclarationException::new, "No %s found for %s", containerClass); + if (valueUnwrapping == ValidateUnwrappedValue.UNWRAP) { + Exceptions.raise(ConstraintDeclarationException::new, "No %s found for %s", containerClass); + } return Optional.empty(); } - Exceptions.raiseIf(m.size() > 1, ConstraintDeclarationException::new, - "Found generic and non-generic %ss for %s", ValueExtractor.class.getSimpleName(), containerClass); - + if (m.size() > 1) { + Exceptions.raise(ConstraintDeclarationException::new, "Found generic and non-generic %ss for %s", + ValueExtractor.class.getSimpleName(), containerClass); + } return Optional.of(m.entrySet().iterator().next()); } @@ -231,9 +233,10 @@ public abstract class ValidationJob<T> { constraint.getConstraintValidatorClass(); if (constraintValidatorClass == null) { - Exceptions.raiseIf(constraint.getComposingConstraints().isEmpty(), UnexpectedTypeException::new, - "No %s type located for non-composed constraint %s", ConstraintValidator.class.getSimpleName(), - constraint); + if (constraint.getComposingConstraints().isEmpty()) { + Exceptions.raise(UnexpectedTypeException::new, "No %s type located for non-composed constraint %s", + ConstraintValidator.class.getSimpleName(), constraint); + } return null; } ConstraintValidator constraintValidator = null; @@ -244,10 +247,10 @@ public abstract class ValidationJob<T> { } catch (Exception e) { cause = e; } - Exceptions.raiseIf(constraintValidator == null, ValidationException::new, cause, - "Unable to get %s instance from %s", constraintValidatorClass.getName(), - validatorContext.getConstraintValidatorFactory()); - + if (constraintValidator == null) { + Exceptions.raise(ValidationException::new, cause, "Unable to get %s instance from %s", + constraintValidatorClass.getName(), validatorContext.getConstraintValidatorFactory()); + } return constraintValidator; } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java index d8ac834..42d681f 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java @@ -100,8 +100,9 @@ public class CompositeBuilder { public Map<String, MetadataBuilder.ForContainer<Field>> getFields(Meta<Class<T>> meta) { return merge(b -> b.getFields(meta), (f, l) -> { final Field fld = Reflection.find(meta.getHost(), t -> Reflection.getDeclaredField(t, f)); - Exceptions.raiseIf(fld == null, IllegalStateException::new, "Could not find field %s of %s", f, - meta.getHost()); + if (fld == null) { + Exceptions.raise(IllegalStateException::new, "Could not find field %s of %s", f, meta.getHost()); + } return forContainer(l, new Meta.ForField(fld), ElementKind.PROPERTY); }); } @@ -110,8 +111,10 @@ public class CompositeBuilder { public Map<String, MetadataBuilder.ForContainer<Method>> getGetters(Meta<Class<T>> meta) { return merge(b -> b.getGetters(meta), (g, l) -> { final Method getter = Methods.getter(meta.getHost(), g); - Exceptions.raiseIf(getter == null, IllegalStateException::new, - "Could not find getter for property %s of %s", g, meta.getHost()); + if (getter == null) { + Exceptions.raise(IllegalStateException::new, "Could not find getter for property %s of %s", g, + meta.getHost()); + } return forContainer(l, new Meta.ForMethod(getter), ElementKind.PROPERTY); }); } @@ -252,9 +255,10 @@ public class CompositeBuilder { final List<String> parameterNames = getParameterNames.apply(validatorFactory.getParameterNameProvider(), meta.getHost()); - Exceptions.raiseUnless(parameterNames.size() == parameters.length, IllegalStateException::new, - "%s returned wrong number of parameter names", validatorFactory.getParameterNameProvider()); - + if (parameterNames.size() != parameters.length) { + Exceptions.raise(IllegalStateException::new, "%s returned wrong number of parameter names", + validatorFactory.getParameterNameProvider()); + } return IntStream.range(0, parameters.length) .mapToObj(n -> new Meta.ForParameter(parameters[n], parameterNames.get(n))).collect(Collectors.toList()); } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 d7b5b18..529ccda 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 @@ -61,9 +61,10 @@ public class ContainerElementKey implements Comparable<ContainerElementKey> { if (containerType.isAnnotationPresent(ExtractedValue.class)) { final Class<?> extractedType = containerType.getAnnotation(ExtractedValue.class).type(); - Exceptions.raiseIf(void.class.equals(extractedType), ValueExtractorDefinitionException::new, - "%s does not specify %s type for %s", extractorType, ExtractedValue.class.getSimpleName(), - containerType); + if (void.class.equals(extractedType)) { + Exceptions.raise(ValueExtractorDefinitionException::new, "%s does not specify %s type for %s", + extractorType, ExtractedValue.class.getSimpleName(), containerType); + } result.get().add(new ContainerElementKey(containerType, null) { public AnnotatedType getAnnotatedType() { return EmulatedAnnotatedType.wrap(extractedType); http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java index a028b59..4861c1a 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java @@ -237,9 +237,10 @@ public class HierarchyBuilder extends CompositeBuilder { } final List<Meta<Parameter>> metaParameters = getMetaParameters(hierarchyElement, getParameterNames); - Exceptions.raiseUnless(metaParameters.size() == parameterDelegates.size(), IllegalStateException::new, - "Got wrong number of parameter delegates for %s", meta.getHost()); - + if (metaParameters.size() != parameterDelegates.size()) { + Exceptions.raise(IllegalStateException::new, "Got wrong number of parameter delegates for %s", + meta.getHost()); + } return IntStream.range(0, parameterDelegates.size()) .mapToObj(n -> new ContainerDelegate<>(parameterDelegates.get(n), metaParameters.get(n))) .collect(Collectors.toList()); http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java index 3d168bc..956f937 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java @@ -166,8 +166,8 @@ class Liskov { .stream().filter(Predicate.isEqual(t).negate()).anyMatch(t2 -> related(t, t2))); Exceptions.raiseIf(anyRelated, ConstraintDeclarationException::new, - "Multiple method return values marked @%s in hierarchy %s", Valid.class.getSimpleName(), - cascadedReturnValues.values()); + "Multiple method return values marked @%s in hierarchy %s", + f -> f.args(Valid.class.getSimpleName(), cascadedReturnValues.values())); } @SafeVarargs http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 08b2b1d..419f961 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 @@ -270,10 +270,13 @@ public class ReflectionBuilder { } } else { target = impliedConstraintTarget(); - Exceptions.raiseIf(target == null, ConstraintDeclarationException::new, - "Found %d possible %s types for constraint type %s and no explicit assignment via #%s()", - supportedTargets.size(), ValidationTarget.class.getSimpleName(), constraintType.getName(), - ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getAttributeName()); + if (target == null) { + Exceptions.raise(ConstraintDeclarationException::new, + "Found %d possible %s types for constraint type %s and no explicit assignment via #%s()", + supportedTargets.size(), ValidationTarget.class.getSimpleName(), + constraintType.getName(), + ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getAttributeName()); + } } } result.computeIfAbsent(target, k -> new ArrayList<>()).add(constraint); http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java index 8a8cd3f..e5c7d07 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java @@ -38,9 +38,11 @@ public abstract class ValidatorMappingProvider { final Type constraintParameter = TypeUtils.getTypeArguments(t, ConstraintValidator.class) .get(ConstraintValidator.class.getTypeParameters()[0]); - Exceptions.raiseUnless(constraintType.equals(constraintParameter), ConstraintDefinitionException::new, - "%s %s expected first type parameter of %s, %s; source %s", ConstraintValidator.class, t, - constraintType, constraintParameter, result.get().getSource()); + if (!constraintType.equals(constraintParameter)) { + Exceptions.raise(ConstraintDefinitionException::new, + "%s %s expected first type parameter of %s, %s; source %s", ConstraintValidator.class, t, + constraintType, constraintParameter, result.get().getSource()); + } } return result.get(); } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java index a9cb7f4..7a08525 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java @@ -274,9 +274,10 @@ public class XmlBuilder { return new ContainerElementKey(annotatedType, typeArgumentIndex); }, XmlBuilder.ForContainerElementType::new)); } - Exceptions.raiseUnless(elements.isEmpty(), ValidationException::new, - "Illegally specified %d container element type(s) for %s", elements.size(), host); - + if (!elements.isEmpty()) { + Exceptions.raise(ValidationException::new, "Illegally specified %d container element type(s) for %s", + elements.size(), host); + } return Collections.emptyMap(); } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 ea2cac5..a7262d0 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 @@ -131,18 +131,19 @@ public class AnnotationsManager { if (spec.impliesSingleComposingConstraint) { Exceptions.raiseUnless(count == 1, ConstraintDefinitionException::new, "Expected a single composing %s constraint", spec.annotationType); - } else { - Exceptions.raiseUnless(count > spec.constraintIndex, ConstraintDefinitionException::new, + } else if (count <= spec.constraintIndex) { + Exceptions.raise(ConstraintDefinitionException::new, "Expected at least %s composing %s constraints", spec.constraintIndex + 1, spec.annotationType); } final Map<String, String> attributeMapping = overrides.get().computeIfAbsent(spec, k -> new HashMap<>()); - Exceptions.raiseIf(attributeMapping.containsKey(to), ConstraintDefinitionException::new, - "Attempt to override %s#%s() index %d from multiple sources", overridesAttribute.constraint(), - to, overridesAttribute.constraintIndex()); - + if (attributeMapping.containsKey(to)) { + Exceptions.raise(ConstraintDefinitionException::new, + "Attempt to override %s#%s() index %d from multiple sources", + overridesAttribute.constraint(), to, overridesAttribute.constraintIndex()); + } attributeMapping.put(to, from); } } @@ -342,10 +343,11 @@ public class AnnotationsManager { final Composition result = new Composition(annotationType); Stream.of(result.components).map(Annotation::annotationType).forEach(at -> { final Set<ValidationTarget> composingTargets = supportedTargets(at); - Exceptions.raiseIf(Collections.disjoint(composingTargets, composedTargets), - ConstraintDefinitionException::new, - "Attempt to compose %s of %s but validator types are incompatible", annotationType.getName(), - at.getName()); + if (Collections.disjoint(composingTargets, composedTargets)) { + Exceptions.raise(ConstraintDefinitionException::new, + "Attempt to compose %s of %s but validator types are incompatible", annotationType.getName(), + at.getName()); + } }); return result; }); http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 fed9d49..d94cd33 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 @@ -57,8 +57,10 @@ public class ExecutableTypes { 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()); + if (!result.isEmpty()) { + Exceptions.raise(IllegalArgumentException::new, "Mixing %s with other %ss is illegal.", + ExecutableType.IMPLICIT, ExecutableType.class.getSimpleName()); + } return IMPLICIT_TYPES; } result.remove(ExecutableType.NONE); http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 e8319f8..1d49a2a 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 @@ -313,7 +313,7 @@ public abstract class NodeImpl implements Path.Node, Serializable { @Override public <T extends Node> T as(final Class<T> nodeType) { Exceptions.raiseUnless(nodeType.isInstance(this), ClassCastException::new, "Type %s not supported by %s", - nodeType, getClass()); + f -> f.args(nodeType, getClass())); return nodeType.cast(this); } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java index 3925943..632b9da 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java @@ -95,7 +95,7 @@ public class ValueExtractors { .get(key.getContainerClass().getTypeParameters()[key.getTypeArgumentIndex().intValue()]); } Exceptions.raiseUnless(result instanceof Class<?>, ValueExtractorDefinitionException::new, - "%s did not resolve to a %s relative to %s", key, Class.class.getName(), target); + "%s did not resolve to a %s relative to %s", f -> f.args(key, Class.class.getName(), target)); return (Class<?>) result; } @@ -171,7 +171,7 @@ public class ValueExtractors { Validate.notNull(extractor); valueExtractors.get().compute(ContainerElementKey.forValueExtractor(extractor), (k, v) -> { Exceptions.raiseIf(v != null, ValueExtractorDeclarationException::new, - "Multiple context-level %ss specified for %s", ValueExtractor.class.getSimpleName(), k); + "Multiple context-level %ss specified for %s", f -> f.args(ValueExtractor.class.getSimpleName(), k)); return extractor; }); } @@ -207,7 +207,7 @@ public class ValueExtractors { .filter(Predicate.isEqual(quid).negate()).allMatch(quo -> related(quid, quo))); Exceptions.raiseUnless(allRelated, ConstraintDeclarationException::new, - "> 1 maximally specific %s found for %s", ValueExtractor.class.getSimpleName(), key); + "> 1 maximally specific %s found for %s", f -> f.args(ValueExtractor.class.getSimpleName(), key)); } return candidateMap.values().iterator().next(); } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 13678ac..44d67b8 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 @@ -64,14 +64,15 @@ class AnnotationProxy implements Annotation, InvocationHandler, Serializable { values.put(m.getName(), descriptor.getValue(m.getName())); processedValuesFromDescriptor++; } else { - Exceptions.raiseIf(m.getDefaultValue() == null, IllegalArgumentException::new, - "No value provided for %s", m.getName()); + if (m.getDefaultValue() == null) { + Exceptions.raise(IllegalArgumentException::new, "No value provided for %s", m.getName()); + } values.put(m.getName(), m.getDefaultValue()); } } Exceptions.raiseUnless(processedValuesFromDescriptor == descriptor.size() || Valid.class.equals(annotationType), IllegalArgumentException::new, "Trying to instantiate %s with unknown parameters.", - annotationType.getName()); + f -> f.args(annotationType.getName())); } /** http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/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 94073c5..2e474c0 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 @@ -18,6 +18,7 @@ package org.apache.bval.util; import java.lang.reflect.InvocationTargetException; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; @@ -26,6 +27,17 @@ import java.util.stream.Stream; * Utility class for sundry {@link Exception}-related tasks. */ public class Exceptions { + /** + * Callback interface that collects format arguments in conditional raise* method variants. + * @see Exceptions#raiseIf(boolean, Function, String, Consumer) + * @see Exceptions#raiseIf(boolean, BiFunction, Throwable, String, Consumer) + * @see Exceptions#raiseUnless(boolean, Function, String, Consumer) + * @see Exceptions#raiseUnless(boolean, BiFunction, Throwable, String, Consumer) + */ + @FunctionalInterface + public interface FormatArgs { + void args(Object... args); + } public static <E extends Exception> E create(Function<? super String, ? extends E> fn, String format, Object... args) { @@ -69,6 +81,13 @@ public class Exceptions { } public static <E extends Exception> void raiseIf(boolean condition, Function<? super String, ? extends E> fn, + String format, Consumer<FormatArgs> argsProvider) throws E { + if (condition) { + raise(fn, message(format,argsProvider)); + } + } + + public static <E extends Exception> void raiseIf(boolean condition, Function<? super String, ? extends E> fn, Supplier<String> message) throws E { if (condition) { raise(fn, message); @@ -76,6 +95,11 @@ public class Exceptions { } public static <E extends Exception> void raiseUnless(boolean condition, Function<? super String, ? extends E> fn, + String format, Consumer<FormatArgs> argsProvider) throws E { + raiseIf(!condition, fn, format, argsProvider); + } + + public static <E extends Exception> void raiseUnless(boolean condition, Function<? super String, ? extends E> fn, Supplier<String> message) throws E { raiseIf(!condition, fn, message); } @@ -103,6 +127,14 @@ public class Exceptions { } public static <E extends Exception, C extends Throwable> void raiseIf(boolean condition, + BiFunction<? super String, ? super C, ? extends E> fn, C cause, String format, + Consumer<FormatArgs> argsProvider) throws E { + if (condition) { + raise(fn, cause, message(format, argsProvider)); + } + } + + public static <E extends Exception, C extends Throwable> void raiseIf(boolean condition, BiFunction<? super String, ? super C, ? extends E> fn, C cause, Supplier<String> message) throws E { if (condition) { raise(fn, cause, message); @@ -110,6 +142,12 @@ public class Exceptions { } public static <E extends Exception, C extends Throwable> void raiseUnless(boolean condition, + BiFunction<? super String, ? super C, ? extends E> fn, C cause, String format, + Consumer<FormatArgs> argsProvider) throws E { + raiseIf(!condition, fn, cause, message(format, argsProvider)); + } + + public static <E extends Exception, C extends Throwable> void raiseUnless(boolean condition, BiFunction<? super String, ? super C, ? extends E> fn, C cause, Supplier<String> message) throws E { raiseIf(!condition, fn, cause, message); } @@ -133,6 +171,12 @@ public class Exceptions { return t; } + private static Supplier<String> message(String format, Consumer<FormatArgs> argsProvider) { + final ObjectWrapper<Object[]> args = new ObjectWrapper<>(); + argsProvider.accept(args::accept); + return () -> String.format(format, args.get()); + } + private Exceptions() { } } http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/util/Validate.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/util/Validate.java b/bval-jsr/src/main/java/org/apache/bval/util/Validate.java index 042dc1b..4958f1d 100644 --- a/bval-jsr/src/main/java/org/apache/bval/util/Validate.java +++ b/bval-jsr/src/main/java/org/apache/bval/util/Validate.java @@ -47,8 +47,10 @@ public final class Validate { Validate.notNull(array); for (int i = 0; i < array.length; i++) { - Exceptions.raiseIf(array[i] == null, IllegalArgumentException::new, message, - ObjectUtils.arrayAdd(values, Integer.valueOf(i))); + if (array[i] == null) { + Exceptions.raise(IllegalArgumentException::new, message, + ObjectUtils.arrayAdd(values, Integer.valueOf(i))); + } } return array; }
