http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidation.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidation.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidation.java deleted file mode 100644 index 5ba14ca..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidation.java +++ /dev/null @@ -1,605 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.jsr.util.NodeImpl; -import org.apache.bval.jsr.util.PathImpl; -import org.apache.bval.model.Validation; -import org.apache.bval.model.ValidationContext; -import org.apache.bval.model.ValidationListener; -import org.apache.bval.util.AccessStrategy; -import org.apache.bval.util.ObjectUtils; -import org.apache.bval.util.StringUtils; -import org.apache.bval.util.reflection.Reflection; -import org.apache.bval.util.reflection.TypeUtils; - -import javax.validation.ConstraintDefinitionException; -import javax.validation.ConstraintTarget; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorFactory; -import javax.validation.Payload; -import javax.validation.UnexpectedTypeException; -import javax.validation.ValidationException; -import javax.validation.constraintvalidation.SupportedValidationTarget; -import javax.validation.constraintvalidation.ValidationTarget; -import javax.validation.metadata.ConstraintDescriptor; -import javax.validation.metadata.ValidateUnwrappedValue; - -import java.io.Serializable; -import java.lang.annotation.Annotation; -import java.lang.reflect.Array; -import java.lang.reflect.GenericArrayType; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * Description: Adapter between Constraint (JSR303) and Validation (Core)<br/> - * this instance is immutable!<br/> - */ -public class ConstraintValidation<T extends Annotation> implements Validation, ConstraintDescriptor<T> { - private final AccessStrategy access; - private final boolean reportFromComposite; - private final Map<String, Object> attributes; - private T annotation; // for metadata request API - private volatile ConstraintValidator<T, ?> validator; - - private Set<ConstraintValidation<?>> composedConstraints; - - private boolean validated = false; - - /** - * the owner is the type where the validation comes from. it is used to - * support implicit grouping. - */ - private final Class<?> owner; - private Set<Class<?>> groups; - private Set<Class<? extends Payload>> payload; - private Class<? extends ConstraintValidator<T, ?>>[] validatorClasses; - private ConstraintTarget validationAppliesTo = null; - - public ConstraintValidation(Class<? extends ConstraintValidator<T, ?>>[] validatorClasses, T annotation, - Class<?> owner, AccessStrategy access, boolean reportFromComposite, ConstraintTarget target) { - this.attributes = new HashMap<String, Object>(); - this.validatorClasses = validatorClasses != null ? validatorClasses.clone() : null; - this.annotation = annotation; - this.owner = owner; - this.access = access; - this.reportFromComposite = reportFromComposite; - this.validationAppliesTo = target; - } - - /** - * Return a {@link Serializable} {@link ConstraintDescriptor} capturing a - * snapshot of current state. - * - * @return {@link ConstraintDescriptor} - */ - public ConstraintDescriptor<T> asSerializableDescriptor() { - return new ConstraintDescriptorImpl<T>(this); - } - - void setGroups(final Set<Class<?>> groups) { - this.groups = groups; - ConstraintAnnotationAttributes.GROUPS.put(attributes, groups.toArray(new Class<?>[groups.size()])); - } - - void setGroups(final Class<?>[] groups) { - this.groups = new HashSet<Class<?>>(); - Collections.addAll(this.groups, groups); - ConstraintAnnotationAttributes.GROUPS.put(attributes, groups); - } - - void setPayload(Set<Class<? extends Payload>> payload) { - this.payload = payload; - ConstraintAnnotationAttributes.PAYLOAD.put(attributes, payload.toArray(new Class[payload.size()])); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isReportAsSingleViolation() { - return reportFromComposite; - } - - /** - * Add a composing constraint. - * - * @param aConstraintValidation to add - */ - public void addComposed(ConstraintValidation<?> aConstraintValidation) { - if (composedConstraints == null) { - composedConstraints = new HashSet<ConstraintValidation<?>>(); - } - composedConstraints.add(aConstraintValidation); - } - - /** - * {@inheritDoc} - */ - @Override - public <L extends ValidationListener> void validate(ValidationContext<L> context) { - validateGroupContext((GroupValidationContext<?>) context); - } - - /** - * Validate a {@link GroupValidationContext}. - * - * @param context root - */ - public void validateGroupContext(final GroupValidationContext<?> context) { - if (validator == null) { - synchronized (this) { - if (validator == null) { - try { - validator = getConstraintValidator(context.getConstraintValidatorFactory(), annotation, - validatorClasses, owner, access); - if (validator != null) { - validator.initialize(annotation); - } - } catch (final RuntimeException re) { - if (ValidationException.class.isInstance(re)) { - throw re; - } - throw new ConstraintDefinitionException(re); - } - } - } - } - - context.setConstraintValidation(this); - /** - * execute unless the given validation constraint has already been - * processed during this validation routine (as part of a previous group - * match) - */ - if (!isMemberOf(context.getCurrentGroup().getGroup())) { - return; // do not validate in the current group - } - if (context.getCurrentOwner() != null && !this.owner.equals(context.getCurrentOwner())) { - return; - } - if (validator != null && !context.collectValidated(validator)) - return; // already done - - if (context.getMetaProperty() != null && !isReachable(context)) { - return; - } - - // process composed constraints - if (isReportAsSingleViolation()) { - final ConstraintValidationListener<?> listener = context.getListener(); - listener.beginReportAsSingle(); - - boolean failed = listener.hasViolations(); - try { - // stop validating when already failed and - // ReportAsSingleInvalidConstraint = true ? - for (Iterator<ConstraintValidation<?>> composed = getComposingValidations().iterator(); !failed - && composed.hasNext();) { - composed.next().validate(context); - failed = listener.hasViolations(); - } - } finally { - listener.endReportAsSingle(); - // Restore current constraint validation - context.setConstraintValidation(this); - } - - if (failed) { - // TODO RSt - how should the composed constraint error report look like? - addErrors(context, new ConstraintValidatorContextImpl(context, this)); // add defaultErrorMessage only - return; - } - } else { - for (ConstraintValidation<?> composed : getComposingValidations()) { - composed.validate(context); - } - - // Restore current constraint validation - context.setConstraintValidation(this); - } - - if (validator != null) { - @SuppressWarnings("unchecked") - final ConstraintValidator<T, Object> objectValidator = (ConstraintValidator<T, Object>) validator; - final ConstraintValidatorContextImpl jsrContext = new ConstraintValidatorContextImpl(context, this); - if (!objectValidator.isValid(context.getValidatedValue(), jsrContext)) { - addErrors(context, jsrContext); - } - } - } - - private <A extends Annotation> ConstraintValidator<A, ? super T> getConstraintValidator( - ConstraintValidatorFactory factory, A annotation, - Class<? extends ConstraintValidator<A, ?>>[] constraintClasses, Class<?> owner, AccessStrategy access) { - if (ObjectUtils.isNotEmpty(constraintClasses)) { - final Type type = determineTargetedType(owner, access); - - /** - * spec says in chapter 3.5.3.: The ConstraintValidator chosen to - * validate a declared type T is the one where the type supported by - * the ConstraintValidator is a supertype of T and where there is no - * other ConstraintValidator whose supported type is a supertype of - * T and not a supertype of the chosen ConstraintValidator supported - * type. - */ - final Map<Type, Collection<Class<? extends ConstraintValidator<A, ?>>>> validatorTypes = - getValidatorsTypes(constraintClasses); - reduceTarget(validatorTypes, access); - - final List<Type> assignableTypes = new ArrayList<Type>(constraintClasses.length); - fillAssignableTypes(type, validatorTypes.keySet(), assignableTypes); - reduceAssignableTypes(assignableTypes); - checkOneType(assignableTypes, type, owner, annotation, access); - - if ((type.equals(Object.class) || type.equals(Object[].class)) && validatorTypes.containsKey(Object.class) - && validatorTypes.containsKey(Object[].class)) { - throw new ConstraintDefinitionException( - "Only a validator for Object or Object[] should be provided for cross-parameter validators"); - } - - final Collection<Class<? extends ConstraintValidator<A, ?>>> key = - validatorTypes.get(assignableTypes.get(0)); - if (key.size() > 1) { - final String message = "Factory returned " + key.size() + " validators"; - if (ParametersAccess.class.isInstance(access)) { // cross parameter - throw new ConstraintDefinitionException(message); - } - throw new UnexpectedTypeException(message); - } - - @SuppressWarnings("unchecked") - final ConstraintValidator<A, ? super T> validator = - (ConstraintValidator<A, ? super T>) factory.getInstance(key.iterator().next()); - if (validator == null) { - throw new ValidationException("Factory returned null validator for: " + key); - - } - return validator; - // NOTE: validator initialization deferred until append phase - } - return null; - } - - private <A extends Annotation> void reduceTarget( - final Map<Type, Collection<Class<? extends ConstraintValidator<A, ?>>>> validator, - final AccessStrategy access) { - for (final Map.Entry<Type, Collection<Class<? extends ConstraintValidator<A, ?>>>> entry : validator - .entrySet()) { - final Collection<Class<? extends ConstraintValidator<A, ?>>> validators = entry.getValue(); - final Iterator<Class<? extends ConstraintValidator<A, ?>>> it = validators.iterator(); - while (it.hasNext()) { - final Type v = it.next(); - if (!Class.class.isInstance(v)) { - continue; // TODO: handle this case - } - - final Class<?> clazz = Class.class.cast(v); - final SupportedValidationTarget target = clazz.getAnnotation(SupportedValidationTarget.class); - if (target != null) { - final Collection<ValidationTarget> targets = Arrays.asList(target.value()); - final boolean isParameter = - ParameterAccess.class.isInstance(access) || ParametersAccess.class.isInstance(access); - if ((isParameter && !targets.contains(ValidationTarget.PARAMETERS)) - || (!isParameter && !targets.contains(ValidationTarget.ANNOTATED_ELEMENT))) { - it.remove(); - } - } - } - if (validators.isEmpty()) { - validator.remove(entry.getKey()); - } - } - } - - private static void checkOneType(List<Type> types, Type targetType, Class<?> owner, Annotation anno, - AccessStrategy access) { - - if (types.isEmpty()) { - final String message = "No validator could be found for type " + stringForType(targetType) + ". See: @" - + anno.annotationType().getSimpleName() + " at " + stringForLocation(owner, access); - if (Object[].class.equals(targetType)) { // cross parameter - throw new ConstraintDefinitionException(message); - } - throw new UnexpectedTypeException(message); - } - if (types.size() > 1) { - throw new UnexpectedTypeException(String.format( - "Ambiguous validators for type %s. See: @%s at %s. Validators are: %s", - stringForType(targetType), - anno.annotationType().getSimpleName(), - stringForLocation(owner, access), types.stream() - .map(Object::toString).collect(Collectors.joining(", ")))); - } - } - - private static String stringForType(Type clazz) { - if (clazz instanceof Class<?>) { - return ((Class<?>) clazz).isArray() ? ((Class<?>) clazz).getComponentType().getName() + "[]" - : ((Class<?>) clazz).getName(); - } - return clazz.toString(); - } - - private static String stringForLocation(Class<?> owner, AccessStrategy access) { - return access == null ? owner.getName() : access.toString(); - } - - private static void fillAssignableTypes(Type type, Set<Type> validatorsTypes, List<Type> suitableTypes) { - for (final Type validatorType : validatorsTypes) { - if (TypeUtils.isAssignable(type, validatorType) && !suitableTypes.contains(validatorType)) { - suitableTypes.add(validatorType); - } - } - } - - /** - * Tries to reduce all assignable classes down to a single class. - * - * @param assignableTypes The set of all classes which are assignable to the class of - * the value to be validated and which are handled by at least - * one of the validators for the specified constraint. - */ - private static void reduceAssignableTypes(List<Type> assignableTypes) { - if (assignableTypes.size() <= 1) { - return; // no need to reduce - } - boolean removed = false; - do { - final Type type = assignableTypes.get(0); - for (int i = 1; i < assignableTypes.size(); i++) { - final Type nextType = assignableTypes.get(i); - if (TypeUtils.isAssignable(nextType, type)) { - assignableTypes.remove(0); - i--; - removed = true; - } else if (TypeUtils.isAssignable(type, nextType)) { - assignableTypes.remove(i--); - removed = true; - } - } - } while (removed && assignableTypes.size() > 1); - } - - private static <A extends Annotation> Map<Type, Collection<Class<? extends ConstraintValidator<A, ?>>>> getValidatorsTypes( - Class<? extends ConstraintValidator<A, ?>>[] constraintValidatorClasses) { - final Map<Type, Collection<Class<? extends ConstraintValidator<A, ?>>>> validatorsTypes = - new HashMap<Type, Collection<Class<? extends ConstraintValidator<A, ?>>>>(); - for (Class<? extends ConstraintValidator<A, ?>> validatorType : constraintValidatorClasses) { - Type validatedType = TypeUtils.getTypeArguments(validatorType, ConstraintValidator.class) - .get(ConstraintValidator.class.getTypeParameters()[1]); - if (validatedType == null) { - throw new ValidationException(String.format("Could not detect validated type for %s", validatorType)); - } - if (validatedType instanceof GenericArrayType) { - final Type componentType = TypeUtils.getArrayComponentType(validatedType); - if (componentType instanceof Class<?>) { - validatedType = Array.newInstance((Class<?>) componentType, 0).getClass(); - } - } - if (!validatorsTypes.containsKey(validatedType)) { - validatorsTypes.put(validatedType, new ArrayList<Class<? extends ConstraintValidator<A, ?>>>()); - } - validatorsTypes.get(validatedType).add(validatorType); - } - return validatorsTypes; - } - - /** - * implements spec chapter 3.5.3. ConstraintValidator resolution algorithm. - */ - private static Type determineTargetedType(Class<?> owner, AccessStrategy access) { - // if the constraint declaration is hosted on a class or an interface, - // the targeted type is the class or the interface. - if (access == null) { - return owner; - } - final Type type = access.getJavaType(); - if (type == null) { - return Object.class; - } - return type instanceof Class<?> ? Reflection.primitiveToWrapper((Class<?>) type) : type; - } - - /** - * Initialize the validator (if not <code>null</code>) with the stored - * annotation. - */ - public void initialize() { - if (null != validator) { - try { - validator.initialize(annotation); - } catch (RuntimeException e) { - // Either a "legit" problem initializing the validator or a - // ClassCastException if the validator associated annotation is - // not a supertype of the validated annotation. - throw new ConstraintDefinitionException( - "Incorrect validator [" + validator.getClass().getCanonicalName() + "] for annotation " - + annotation.annotationType().getCanonicalName(), - e); - } - } - } - - private boolean isReachable(GroupValidationContext<?> context) { - final PathImpl path = context.getPropertyPath(); - final NodeImpl node = path.getLeafNode(); - PathImpl beanPath = path.getPathWithoutLeafNode(); - if (beanPath == null) { - beanPath = PathImpl.create(); - } - try { - if (!context.getTraversableResolver().isReachable(context.getBean(), node, - context.getRootMetaBean().getBeanClass(), beanPath, access.getElementType())) { - return false; - } - } catch (RuntimeException e) { - throw new ValidationException("Error in TraversableResolver.isReachable() for " + context.getBean(), e); - } - return true; - } - - private void addErrors(GroupValidationContext<?> context, ConstraintValidatorContextImpl jsrContext) { - for (ValidationListener.Error each : jsrContext.getErrorMessages()) { - context.getListener().addError(each, context); - } - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return "ConstraintValidation{" + validator + '}'; - } - - /** - * Get the message template used by this constraint. - * - * @return String - */ - @Override - public String getMessageTemplate() { - return ConstraintAnnotationAttributes.MESSAGE.get(attributes); - } - - public ConstraintValidator<T, ?> getValidator() { - return validator; - } - - protected boolean isMemberOf(Class<?> reqGroup) { - return groups.contains(reqGroup); - } - - public Class<?> getOwner() { - return owner; - } - - @Override - public T getAnnotation() { - return annotation; - } - - public AccessStrategy getAccess() { - return access; - } - - public void setAnnotation(T annotation) { - this.annotation = annotation; - } - - // ///////////////////////// ConstraintDescriptor implementation - - /** - * {@inheritDoc} - */ - @Override - public Map<String, Object> getAttributes() { - return attributes; - } - - /** - * {@inheritDoc} - */ - @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public Set<ConstraintDescriptor<?>> getComposingConstraints() { - if (composedConstraints == null) { - return Collections.emptySet(); - } - final Set result = composedConstraints; - return result; - } - - /** - * Get the composing {@link ConstraintValidation} objects. This is - * effectively an implementation-specific analogue to - * {@link #getComposingConstraints()}. - * - * @return {@link Set} of {@link ConstraintValidation} - */ - Set<ConstraintValidation<?>> getComposingValidations() { - return composedConstraints == null ? Collections.<ConstraintValidation<?>> emptySet() : composedConstraints; - } - - /** - * {@inheritDoc} - */ - @Override - public Set<Class<?>> getGroups() { - return groups; - } - - /** - * {@inheritDoc} - */ - @Override - public Set<Class<? extends Payload>> getPayload() { - return payload; - } - - @Override - public ConstraintTarget getValidationAppliesTo() { - return validationAppliesTo; - } - - /** - * {@inheritDoc} - */ - @Override - public List<Class<? extends ConstraintValidator<T, ?>>> getConstraintValidatorClasses() { - return validatorClasses == null ? Collections.<Class<? extends ConstraintValidator<T, ?>>> emptyList() - : Arrays.asList(validatorClasses); - } - - public void setValidationAppliesTo(final ConstraintTarget validationAppliesTo) { - this.validationAppliesTo = validationAppliesTo; - } - - public boolean isValidated() { - return validated; - } - - public void setValidated(final boolean validated) { - this.validated = validated; - } - - @Override - public ValidateUnwrappedValue getValueUnwrapping() { - // TODO Auto-generated method stub - return null; - } - - @Override - public <U> U unwrap(Class<U> arg0) { - // TODO Auto-generated method stub - return null; - } -}
http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidationListener.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidationListener.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidationListener.java deleted file mode 100644 index 7d7ec8b..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidationListener.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.jsr.util.PathImpl; -import org.apache.bval.model.ValidationContext; -import org.apache.bval.model.ValidationListener; - -import javax.validation.ConstraintViolation; -import javax.validation.ElementKind; -import javax.validation.MessageInterpolator; -import javax.validation.Path; -import javax.validation.metadata.ConstraintDescriptor; -import java.lang.annotation.ElementType; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -/** - * Description: JSR-303 {@link ValidationListener} implementation; provides {@link ConstraintViolation}s.<br/> - * - * @version $Rev: 1503686 $ $Date: 2013-07-16 14:38:56 +0200 (mar., 16 juil. 2013) $ - */ -public final class ConstraintValidationListener<T> implements ValidationListener { - private final Set<ConstraintViolation<T>> constraintViolations = new HashSet<ConstraintViolation<T>>(); - private final T rootBean; - private final Class<T> rootBeanType; - // the validation process is single-threaded and it's unlikely to change in the near future (otherwise use AtomicInteger). - private int compositeDepth = 0; - private boolean hasCompositeError; - - /** - * Create a new ConstraintValidationListener instance. - * @param aRootBean - * @param rootBeanType - */ - public ConstraintValidationListener(T aRootBean, Class<T> rootBeanType) { - this.rootBean = aRootBean; - this.rootBeanType = rootBeanType; - } - - /** - * {@inheritDoc} - */ - @Override - public <VL extends ValidationListener> void addError(String reason, ValidationContext<VL> context) { - addError(reason, null, context); - } - - /** - * {@inheritDoc} - */ - @Override - public <VL extends ValidationListener> void addError(Error error, ValidationContext<VL> context) { - if (error.getOwner() instanceof Path) { - addError(error.getReason(), (Path) error.getOwner(), context); - } else { - addError(error.getReason(), null, context); - } - } - - private void addError(String messageTemplate, Path propPath, ValidationContext<?> context) { - if (compositeDepth > 0) { - hasCompositeError |= true; - return; - } - final Object value; - - final ConstraintDescriptor<?> descriptor; - final String message; - if (context instanceof GroupValidationContext<?>) { - GroupValidationContext<?> gcontext = (GroupValidationContext<?>) context; - value = gcontext.getValidatedValue(); - if (gcontext instanceof MessageInterpolator.Context) { - message = - gcontext.getMessageResolver().interpolate(messageTemplate, (MessageInterpolator.Context) gcontext); - } else { - message = gcontext.getMessageResolver().interpolate(messageTemplate, null); - } - descriptor = gcontext.getConstraintValidation().asSerializableDescriptor(); - if (propPath == null) - propPath = gcontext.getPropertyPath(); - } else { - if (context.getMetaProperty() == null) - value = context.getBean(); - else - value = context.getPropertyValue(); - message = messageTemplate; - if (propPath == null) - propPath = PathImpl.createPathFromString(context.getPropertyName()); - descriptor = null; - } - ElementType elementType = (context.getAccess() != null) ? context.getAccess().getElementType() : null; - - final Object[] parameters; - Object leaf; - Object returnValue; - T rootBean; - if (GroupValidationContext.class.isInstance(context)) { // TODO: clean up it but it would need to rework completely our context - get rid of it would be the best - final GroupValidationContext<T> ctx = GroupValidationContext.class.cast(context); - final ElementKind elementKind = ctx.getElementKind(); - final Iterator<Path.Node> it = propPath.iterator(); - final ElementKind kind = propPath.iterator().next().getKind(); - - returnValue = ctx.getReturnValue(); - - if (ElementKind.CONSTRUCTOR.equals(kind)) { - rootBean = null; - leaf = context.getBean(); - returnValue = this.rootBean; // switch back return value and rootBean - } else if (ElementKind.METHOD.equals(kind)) { - if (ElementKind.RETURN_VALUE.equals(elementKind)) { // switch back return value and rootBean - rootBean = (T) returnValue; - if (kindOf(propPath, ElementKind.RETURN_VALUE)) { - leaf = returnValue; - returnValue = this.rootBean; - } else { - leaf = this.rootBean; - returnValue = this.rootBean; - } - } else { - rootBean = this.rootBean; - if (kindOf(propPath, ElementKind.PARAMETER, ElementKind.CROSS_PARAMETER)) { - leaf = rootBean; - } else { - leaf = context.getBean(); - } - } - } else { - rootBean = this.rootBean; - leaf = context.getBean(); - } - - if (ElementKind.CONSTRUCTOR.equals(kind) - && (ElementKind.CROSS_PARAMETER.equals(elementKind) || ElementKind.PARAMETER.equals(elementKind)) - && (it.hasNext() && it.next() != null && it.hasNext() && it.next() != null && !it.hasNext())) { // means inherited validation use real value - leaf = null; - } - - parameters = ctx.getParameters(); - } else { - leaf = context.getBean(); - returnValue = null; - parameters = null; - rootBean = this.rootBean; - } - - constraintViolations.add(new ConstraintViolationImpl<T>(messageTemplate, message, rootBean, leaf, propPath, - value, descriptor, rootBeanType, elementType, returnValue, parameters)); - } - - private static boolean kindOf(final Path propPath, final ElementKind... kinds) { - final Iterator<Path.Node> node = propPath.iterator(); - boolean isParam = false; - while (node.hasNext()) { - final ElementKind current = node.next().getKind(); - isParam = false; - for (final ElementKind k : kinds) { - if (k.equals(current)) { - isParam = true; - break; - } - } - } - return isParam; - } - - /** - * Get the {@link ConstraintViolation}s accumulated by this {@link ConstraintValidationListener}. - * @return {@link Set} of {@link ConstraintViolation} - */ - public Set<ConstraintViolation<T>> getConstraintViolations() { - return constraintViolations; - } - - /** - * Learn whether no violations were found. - * @return boolean - */ - public boolean isEmpty() { - return constraintViolations.isEmpty(); - } - - /** - * Get the root bean. - * @return T - */ - public T getRootBean() { - return rootBean; - } - - /** - * Get the root bean type of this {@link ConstraintValidationListener}. - * @return Class<T> - */ - public Class<T> getRootBeanType() { - return rootBeanType; - } - - /** - * Get the count of encountered violations. - * @return int - */ - public int violationsSize() { - return constraintViolations.size(); - } - - /** - * Learn whether there are violations available. - * If in report-as-single-violation mode, the result is scoped accordingly. - * Note that this means you must check before exiting report-as-single-violation mode - * @return boolean - */ - public boolean hasViolations() { - return compositeDepth == 0 ? !constraintViolations.isEmpty() : hasCompositeError; - } - - /** - * Signify the beginning of a report-as-single-violation composite validation. - * @return <code>true</code> as this call caused the listener to enter report-as-single-violation mode - */ - public boolean beginReportAsSingle() { - return ++compositeDepth == 1; - } - - /** - * Signify the end of a report-as-single-violation composite validation. - * @return <code>true</code> as this call caused the listener to exit report-as-single-violation mode - */ - public boolean endReportAsSingle() { - boolean endOutMostReportAsSingle = (--compositeDepth == 0); - if (endOutMostReportAsSingle) { - hasCompositeError = false; - } - return endOutMostReportAsSingle; - } -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java deleted file mode 100644 index 74c8685..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorContextImpl.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.jsr.util.LeafNodeBuilderCustomizableContextImpl; -import org.apache.bval.jsr.util.NodeBuilderCustomizableContextImpl; -import org.apache.bval.jsr.util.NodeBuilderDefinedContextImpl; -import org.apache.bval.jsr.util.NodeImpl; -import org.apache.bval.jsr.util.PathImpl; -import org.apache.bval.model.ValidationListener; - -import javax.validation.ClockProvider; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; -import javax.validation.Path; -import javax.validation.ValidationException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -/** - * Description: Short-lived {@link ConstraintValidatorContext} implementation passed by - * a {@link ConstraintValidation} to its adapted {@link ConstraintValidator}. <br/> - */ -@Deprecated -public class ConstraintValidatorContextImpl - extends org.apache.bval.jsr.job.ConstraintValidatorContextImpl<Object> - implements ConstraintValidatorContext { - private final List<ValidationListener.Error> errorMessages = new LinkedList<ValidationListener.Error>(); - - private final ConstraintValidation<?> constraintDescriptor; - private final GroupValidationContext<?> validationContext; - - private boolean defaultDisabled; - - /** - * Create a new ConstraintValidatorContextImpl instance. - * @param validationContext - * @param aConstraintValidation - */ - public ConstraintValidatorContextImpl(GroupValidationContext<?> validationContext, - ConstraintValidation<?> aConstraintValidation) { - super(); - this.validationContext = validationContext; - this.constraintDescriptor = aConstraintValidation; - } - - /** - * {@inheritDoc} - */ - @Override - public void disableDefaultConstraintViolation() { - defaultDisabled = true; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDefaultConstraintMessageTemplate() { - return constraintDescriptor.getMessageTemplate(); - } - - /** - * {@inheritDoc} - */ - @Override - public ConstraintViolationBuilder buildConstraintViolationWithTemplate(String messageTemplate) { - return new ConstraintViolationBuilderImpl(this, messageTemplate, validationContext.getPropertyPath()); - } - - @Override - public <T> T unwrap(Class<T> type) { - if (type.isInstance(this)) { - return type.cast(this); - } - throw new ValidationException("Type " + type + " not supported"); - } - - private static final class ConstraintViolationBuilderImpl - implements ConstraintValidatorContext.ConstraintViolationBuilder { - private final ConstraintValidatorContextImpl parent; - private final String messageTemplate; - private final PathImpl propertyPath; - - /** - * Create a new ConstraintViolationBuilderImpl instance. - * @param contextImpl - * @param template - * @param path - */ - ConstraintViolationBuilderImpl(ConstraintValidatorContextImpl contextImpl, String template, PathImpl path) { - parent = contextImpl; - messageTemplate = template; - propertyPath = path; - } - - /** - * {@inheritDoc} - */ - @Override - public NodeBuilderDefinedContext addNode(String name) { - PathImpl path; - if (propertyPath.isRootPath()) { - path = PathImpl.create(); - path.getLeafNode().setName(name); - } else { - path = PathImpl.copy(propertyPath); - path.addNode(new NodeImpl.PropertyNodeImpl(name)); - } - return new NodeBuilderDefinedContextImpl(parent, messageTemplate, path); - } - - @Override - public NodeBuilderCustomizableContext addPropertyNode(String name) { - return new NodeBuilderCustomizableContextImpl(parent, messageTemplate, propertyPath, name); - } - - @Override - public LeafNodeBuilderCustomizableContext addBeanNode() { - return new LeafNodeBuilderCustomizableContextImpl(parent, messageTemplate, propertyPath); - } - - @Override - public NodeBuilderDefinedContext addParameterNode(int index) { - final Method method = parent.validationContext.getMethod(); - final List<String> parameters = - parent.validationContext.getParameterNameProvider().getParameterNames(method); - final NodeImpl node = new NodeImpl.ParameterNodeImpl(parameters.get(index), index); - if (!propertyPath.isRootPath()) { - propertyPath.removeLeafNode(); - } - propertyPath.addNode(node); - return new NodeBuilderDefinedContextImpl(parent, messageTemplate, propertyPath); - } - - /** - * {@inheritDoc} - */ - @Override - public ConstraintValidatorContext addConstraintViolation() { - parent.addError(messageTemplate, propertyPath); - return parent; - } - - @Override - public ContainerElementNodeBuilderCustomizableContext addContainerElementNode( - String arg0, Class<?> arg1, Integer arg2) { - // TODO Auto-generated method stub - return null; - } - } - - /** - * Get the queued error messages. - * @return List - */ - public List<ValidationListener.Error> getErrorMessages() { - if (defaultDisabled && errorMessages.isEmpty()) { - throw new ValidationException( - "At least one custom message must be created if the default error message gets disabled."); - } - - List<ValidationListener.Error> returnedErrorMessages = new ArrayList<ValidationListener.Error>(errorMessages); - if (!defaultDisabled) { - returnedErrorMessages.add(new ValidationListener.Error(getDefaultConstraintMessageTemplate(), - validationContext.getPropertyPath(), null)); - } - return returnedErrorMessages; - } - - /** - * Get this {@link ConstraintValidatorContext}'s {@link GroupValidationContext}. - * @return {@link GroupValidationContext} - */ - public GroupValidationContext<?> getValidationContext() { - return validationContext; - } - - /** - * Add an error message to this {@link ConstraintValidatorContext}. - * @param messageTemplate - * @param propertyPath - */ - public void addError(String messageTemplate, Path propertyPath) { - errorMessages.add(new ValidationListener.Error(messageTemplate, propertyPath, null)); - } - - @Override - public ClockProvider getClockProvider() { - // TODO Auto-generated method stub - return null; - } -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorIdentity.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorIdentity.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorIdentity.java deleted file mode 100644 index 572c39a..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidatorIdentity.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * 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.jsr; - -import java.util.Objects; - -import javax.validation.ConstraintValidator; -import javax.validation.Path; - -/** - * Class that stores the needed properties to ensure that a validation is not - * checked more than once. - * <p> - * These properties are: - * <ul> - * <li>The ref of the bean to which the validation would be applied.</li> - * <li>The path of the property.</li> - * <li>The ref of the {@link ConstraintValidator}.</li> - * </ul> - * - * @author Carlos Vara - */ -final class ConstraintValidatorIdentity { - - private final Object bean; - private final Path path; - private final ConstraintValidator<?, ?> constraintValidator; - - /** - * Create a new ConstraintValidatorIdentity instance. - * @param bean - * @param path - * @param constraintValidator - */ - public ConstraintValidatorIdentity(Object bean, Path path, ConstraintValidator<?, ?> constraintValidator) { - this.bean = bean; - this.path = path; - this.constraintValidator = constraintValidator; - } - - /** - * Get the referenced bean. - * @return Object - */ - public Object getBean() { - return bean; - } - - /** - * Get the referenced property {@link Path}. - * @return Path - */ - public Path getPath() { - return path; - } - - /** - * Get the associated {@link ConstraintValidator}. - * @return {@link ConstraintValidator} - */ - public ConstraintValidator<?, ?> getConstraintValidator() { - return constraintValidator; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean equals(Object obj) { - - if (this == obj) { - return true; - } - - if (obj == null) { - return false; - } - - if (!(obj instanceof ConstraintValidatorIdentity)) { - return false; - } - - ConstraintValidatorIdentity other = (ConstraintValidatorIdentity) obj; - - // Bean ref must be the same - if (this.bean != other.bean) { - return false; - } - - // ConstraintValidator ref must be the same - if (this.constraintValidator != other.constraintValidator) { - return false; - } - - // Path must be equals - if (!this.path.equals(other.path)) { - return false; - } - - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public int hashCode() { - return Objects.hash(bean, path, constraintValidator); - } - -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/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 91ae20d..15f754d 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 @@ -83,7 +83,8 @@ public class ConstraintViolationImpl<T> implements ConstraintViolation<T>, Seria this.elementType = elementType; this.returnValue = returnValue; this.parameters = parameters; - this.hashCode = computeHashCode(); + this.hashCode = Arrays.deepHashCode(new Object[] { messageTemplate, message, rootBean, rootBeanClass, leafBean, + value, propertyPath, elementType, constraintDescriptor, returnValue, parameters }); } /** @@ -208,11 +209,4 @@ public class ConstraintViolationImpl<T> implements ConstraintViolation<T>, Seria public int hashCode() { return hashCode; } - - private int computeHashCode() { - int result = Objects.hash(messageTemplate, message, rootBean, rootBeanClass, leafBean, value, propertyPath, - elementType, constraintDescriptor, returnValue); - result = 31 * result + (parameters == null ? 0 : Arrays.hashCode(parameters)); - return result; - } } http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/ConstructorDescriptorImpl.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstructorDescriptorImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstructorDescriptorImpl.java deleted file mode 100644 index d947a92..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstructorDescriptorImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.model.MetaBean; -import org.apache.bval.model.MetaConstructor; -import org.apache.bval.model.Validation; - -import javax.validation.metadata.ConstructorDescriptor; - -/** - * Description: {@link javax.validation.metadata.ConstructorDescriptor} implementation.<br/> - */ -public class ConstructorDescriptorImpl extends InvocableElementDescriptor - implements ConstructorDescriptor, ProcedureDescriptor { - /** - * Create a new ConstructorDescriptorImpl instance. - * @param metaBean - * @param validations - */ - protected ConstructorDescriptorImpl(MetaBean metaBean, Validation[] validations) { - super(metaBean, metaBean.getBeanClass(), validations); - } - - public ConstructorDescriptorImpl(final MetaBean metaBean, final MetaConstructor metaMethod) { - super(metaBean, metaBean.getBeanClass(), new Validation[0]); - setCascaded(false); - } - - @Override - public String getName() { - return elementClass.getSimpleName(); - } - - @Override - public boolean hasConstraints() { - return false; - } - - @Override - public boolean hasConstrainedParameters() { - return super.hasConstrainedParameters(); - } - - @Override - public boolean hasConstrainedReturnValue() { - return super.hasConstrainedReturnValue(); - } -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/CrossParameterDescriptorImpl.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/CrossParameterDescriptorImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/CrossParameterDescriptorImpl.java deleted file mode 100644 index c14e102..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/CrossParameterDescriptorImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.model.MetaBean; - -import javax.validation.metadata.CrossParameterDescriptor; -import java.util.Collection; - -public class CrossParameterDescriptorImpl extends ElementDescriptorImpl implements CrossParameterDescriptor { - public CrossParameterDescriptorImpl(final MetaBean bean, final Collection<ConstraintValidation<?>> list) { - super(bean, Object[].class, list.toArray(new ConstraintValidation<?>[list.size()])); - } - - @Override - public boolean hasConstraints() { - return !getConstraintDescriptors().isEmpty(); - } -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/ElementDescriptorImpl.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ElementDescriptorImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ElementDescriptorImpl.java deleted file mode 100644 index cfcf85b..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/ElementDescriptorImpl.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.jsr.groups.Group; -import org.apache.bval.model.MetaBean; -import org.apache.bval.model.Validation; - -import javax.validation.ConstraintDeclarationException; -import javax.validation.metadata.ConstraintDescriptor; -import javax.validation.metadata.ElementDescriptor; -import javax.validation.metadata.GroupConversionDescriptor; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - -/** - * Description: MetaData class<br/> - */ -public abstract class ElementDescriptorImpl implements ElementDescriptor { - private final Set<GroupConversionDescriptor> groupConversions = - new CopyOnWriteArraySet<GroupConversionDescriptor>(); - private boolean cascaded; - private final Collection<Object> validated = new CopyOnWriteArraySet<Object>(); - - /** - * Get a set of {@link ConstraintDescriptor}s from the specified array of - * {@link Validation}s. - * - * @param validations - * @return {@link ConstraintDescriptor} set - */ - protected static Set<ConstraintDescriptor<?>> getConstraintDescriptors(final Validation[] validations) { - final Set<ConstraintDescriptor<?>> result = new HashSet<ConstraintDescriptor<?>>(validations.length); - for (Validation validation : validations) { - if (validation instanceof ConstraintValidation<?>) { - result.add((ConstraintValidation<?>) validation); - } - } - return result; - } - - /** the MetaBean of this element */ - protected final MetaBean metaBean; - - /** the raw type of this element */ - protected final Class<?> elementClass; - - private Set<ConstraintDescriptor<?>> constraintDescriptors; - - private final Map<Group, Group> groupMapping = new HashMap<Group, Group>(); - - /** - * Create a new ElementDescriptorImpl instance. - * - * @param metaBean - * @param elementClass - * @param validations - */ - protected ElementDescriptorImpl(MetaBean metaBean, Class<?> elementClass, Validation[] validations) { - this.metaBean = metaBean; - this.elementClass = elementClass; - setConstraintDescriptors(getConstraintDescriptors(validations)); - } - - /** - * Create a new ElementDescriptorImpl instance. - * - * @param elementClass - * @param validations - */ - protected ElementDescriptorImpl(Class<?> elementClass, Validation[] validations) { - this(null, elementClass, validations); - } - - /** - * {@inheritDoc} - * - * @return Statically defined returned type. - */ - @Override - public Class<?> getElementClass() { - return elementClass; - } - - /** - * {@inheritDoc} - */ - @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public ElementDescriptor.ConstraintFinder findConstraints() { - return new ConstraintFinderImpl(metaBean, new HashSet(constraintDescriptors)); - } - - /** - * {@inheritDoc} - */ - @Override - public Set<ConstraintDescriptor<?>> getConstraintDescriptors() { - return constraintDescriptors.isEmpty() ? Collections.<ConstraintDescriptor<?>> emptySet() - : Collections.unmodifiableSet(constraintDescriptors); - } - - /** - * Get the mutable {@link ConstraintDescriptor} {@link Set}. - * - * @return Set of {@link ConstraintDescriptor} - */ - public Set<ConstraintDescriptor<?>> getMutableConstraintDescriptors() { - return constraintDescriptors; - } - - /** - * {@inheritDoc} return true if at least one constraint declaration is - * present on the element. - */ - @Override - public boolean hasConstraints() { - return !getConstraintDescriptors().isEmpty(); - } - - /** - * Set the constraintDescriptors for this element. - * - * @param constraintDescriptors - * to set - */ - public void setConstraintDescriptors(Set<ConstraintDescriptor<?>> constraintDescriptors) { - this.constraintDescriptors = constraintDescriptors; - } - - /** - * Get the model {@link MetaBean} used. - * - * @return MetaBean - */ - public MetaBean getMetaBean() { - return metaBean; - } - - public void addGroupMapping(final Group from, final Group to) { - groupMapping.put(from, to); - } - - public Group mapGroup(final Group current) { - final Group mapping = groupMapping.get(current); - if (mapping != null) { - return mapping; - } - return current; - } - - public Set<GroupConversionDescriptor> getGroupConversions() { - return groupConversions; - } - - public void addGroupConversion(final GroupConversionDescriptor descriptor) { - groupConversions.add(descriptor); - final Group from = new Group(descriptor.getFrom()); - if (mapGroup(from) != from) { // ref == is fine - throw new ConstraintDeclarationException("You can't map twice from the same group"); - } - addGroupMapping(from, new Group(descriptor.getTo())); - } - - public boolean isCascaded() { - return cascaded; - } - - public void setCascaded(final boolean cascaded) { - this.cascaded = cascaded; - } - - public boolean isValidated(final Object object) { - return validated.contains(object); - } - - public void setValidated(final Object object) { - this.validated.add(object); - } -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/GraphBeanIdentity.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/GraphBeanIdentity.java b/bval-jsr/src/main/java/org/apache/bval/jsr/GraphBeanIdentity.java deleted file mode 100644 index 26391e6..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/GraphBeanIdentity.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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.jsr; - -import java.util.Objects; - -/** - * Class that stores the needed properties to avoid circular paths when - * validating an object graph. - * <p> - * These properties are: - * <ul> - * <li>The ref of the bean to which the validation would be applied.</li> - * <li>The current group being validated.</li> - * </ul> - * - * FIXME: Owner is currently not used in identity checking, and probably - * never will be. So it is likely to be deleted. - * - * @author Carlos Vara - */ -public class GraphBeanIdentity { - - private final Object bean; - private final Class<?> group; - private final Class<?> owner; - - /** - * Create a new GraphBeanIdentity instance. - * @param bean - * @param group - * @param owner - */ - public GraphBeanIdentity(Object bean, Class<?> group, Class<?> owner) { - this.bean = bean; - this.group = group; - this.owner = owner; - } - - /** - * Get the bean. - * @return Object - */ - public Object getBean() { - return bean; - } - - /** - * Get the group being validated. - * @return Class - */ - public Class<?> getGroup() { - return group; - } - - /** - * Get the owning class - * @return - */ - public Class<?> getOwner() { - return owner; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof GraphBeanIdentity)) { - return false; - } - GraphBeanIdentity other = (GraphBeanIdentity) obj; - - // Bean ref must be the same; Group ref must be the same - return bean == other.bean && group == other.group; - } - - /** - * {@inheritDoc} - */ - @Override - public int hashCode() { - return Objects.hash(bean, group); - } - -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContext.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContext.java b/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContext.java deleted file mode 100644 index fecfd8d..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContext.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.jsr.groups.Group; -import org.apache.bval.jsr.groups.Groups; -import org.apache.bval.jsr.util.PathImpl; -import org.apache.bval.model.MetaBean; -import org.apache.bval.model.ValidationContext; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorFactory; -import javax.validation.ElementKind; -import javax.validation.MessageInterpolator; -import javax.validation.ParameterNameProvider; -import javax.validation.Path; -import javax.validation.TraversableResolver; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; - -/** - * Description: JSR-303 {@link ValidationContext} extension. <br/> - */ -public interface GroupValidationContext<T> extends ValidationContext<ConstraintValidationListener<T>> { - - /** - * Get the groups of this {@link GroupValidationContext}. - * @return the groups in their sequence for validation - */ - Groups getGroups(); - - void setCurrentGroups(Groups groups); - - /** - * Set the current {@link Group}. - * @param group to set - */ - void setCurrentGroup(Group group); - - /** - * Get the current {@link Group}. - * @return Group - */ - Group getCurrentGroup(); - - /** - * Get the property path. - * @return {@link PathImpl} - */ - PathImpl getPropertyPath(); - - /** - * Get the root {@link MetaBean}. - * @return {@link MetaBean} - */ - MetaBean getRootMetaBean(); - - /** - * Set the {@link ConstraintValidation}. - * @param constraint to set - */ - void setConstraintValidation(ConstraintValidation<?> constraint); - - /** - * Get the {@link ConstraintValidation}. - * @return {@link ConstraintValidation} - */ - ConstraintValidation<?> getConstraintValidation(); - - /** - * Get the value being validated. - * @return Object - */ - Object getValidatedValue(); - - /** - * Set a fixed value for the context. - * @param value to set - */ - void setFixedValue(Object value); - - /** - * Get the message resolver. - * @return {@link MessageInterpolator} - */ - MessageInterpolator getMessageResolver(); - - /** - * Get the {@link TraversableResolver}. - * @return {@link TraversableResolver} - */ - TraversableResolver getTraversableResolver(); - - /** - * Get the {@link ConstraintValidatorFactory}. - * @return {@link ConstraintValidatorFactory} - */ - ConstraintValidatorFactory getConstraintValidatorFactory(); - - /** - * Accumulate a validated constraint. - * @param constraint - * @return true when the constraint for the object in this path was not - * already validated in this context - */ - boolean collectValidated(ConstraintValidator<?, ?> constraint); - - /** - * Get the current owning class. - * @return Class - */ - Class<?> getCurrentOwner(); - - /** - * Set the current owning class. - * @param currentOwner to set - */ - void setCurrentOwner(Class<?> currentOwner); - - void setKind(ElementKind type); - - ElementKind getElementKind(); - - Object getReturnValue(); - - Object[] getParameters(); - - void setParameters(Object[] parameters); - - void setReturnValue(Object returnValue); - - ParameterNameProvider getParameterNameProvider(); - - void setMethod(Method method); - - Method getMethod(); - - void setConstructor(Constructor<?> method); - - Constructor<?> getConstructor(); - - void moveDown(Path.Node node); -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java deleted file mode 100644 index 9ca50dc..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/GroupValidationContextImpl.java +++ /dev/null @@ -1,403 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.BeanValidationContext; -import org.apache.bval.jsr.groups.Group; -import org.apache.bval.jsr.groups.Groups; -import org.apache.bval.jsr.resolver.CachingTraversableResolver; -import org.apache.bval.jsr.util.NodeImpl; -import org.apache.bval.jsr.util.PathImpl; -import org.apache.bval.model.MetaBean; -import org.apache.bval.model.MetaProperty; -import org.apache.bval.util.AccessStrategy; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorFactory; -import javax.validation.ElementKind; -import javax.validation.MessageInterpolator; -import javax.validation.ParameterNameProvider; -import javax.validation.Path; -import javax.validation.TraversableResolver; -import javax.validation.ValidationException; -import javax.validation.metadata.ConstraintDescriptor; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -/** - * Description: instance per validation process, not thread-safe<br/> - */ -final class GroupValidationContextImpl<T> extends BeanValidationContext<ConstraintValidationListener<T>> - implements GroupValidationContext<T>, MessageInterpolator.Context { - - private final MessageInterpolator messageResolver; - private final PathImpl path; - private final MetaBean rootMetaBean; - private final ParameterNameProvider parameterNameProvider; - - /** - * the groups in the sequence of validation to take place - */ - private Groups groups; - /** - * the current group during the validation process - */ - private Group currentGroup; - - private Class<?> currentOwner; - - /** - * contains the validation constraints that have already been processed - * during this validation routine (as part of a previous group match) - */ - private HashSet<ConstraintValidatorIdentity> validatedConstraints = new HashSet<ConstraintValidatorIdentity>(); - - private ConstraintValidation<?> constraintValidation; - private final TraversableResolver traversableResolver; - private final ConstraintValidatorFactory constraintValidatorFactory; - - private Object[] parameters; - private Object returnValue; - private Method method; - private Constructor<?> constructor; - - /** - * Create a new GroupValidationContextImpl instance. - * - * @param listener - * @param aMessageResolver - * @param traversableResolver - * @param parameterNameProvider - * @param rootMetaBean - */ - public GroupValidationContextImpl(ConstraintValidationListener<T> listener, MessageInterpolator aMessageResolver, - TraversableResolver traversableResolver, ParameterNameProvider parameterNameProvider, - ConstraintValidatorFactory constraintValidatorFactory, MetaBean rootMetaBean) { - super(listener, new HashMap<GraphBeanIdentity, Set<PathImpl>>()); - this.messageResolver = aMessageResolver; - this.constraintValidatorFactory = constraintValidatorFactory; - this.traversableResolver = CachingTraversableResolver.cacheFor(traversableResolver); - this.parameterNameProvider = parameterNameProvider; - this.rootMetaBean = rootMetaBean; - this.path = PathImpl.create(); - } - - /** - * {@inheritDoc} - */ - @Override - public void setCurrentIndex(Integer index) { - NodeImpl leaf = path.getLeafNode(); - if (leaf.getName() == null) { - leaf.setIndex(index); - } else { - path.addNode(NodeImpl.atIndex(index)); - } - } - - /** - * {@inheritDoc} - */ - @Override - public void setCurrentKey(Object key) { - NodeImpl leaf = path.getLeafNode(); - if (leaf.getName() == null) { - leaf.setKey(key); - } else { - path.addNode(NodeImpl.atKey(key)); - } - } - - @Override - public void setKind(final ElementKind type) { - } - - /** - * {@inheritDoc} - */ - @Override - public void moveDown(MetaProperty prop, AccessStrategy access) { - moveDown(prop.getName()); - super.moveDown(prop, access); - } - - @Override - public void moveDown(final String prop) { - path.addProperty(prop); - } - - @Override - public void moveDown(final Path.Node node) { - path.addNode(node); - } - - /** - * {@inheritDoc} - */ - @Override - public void moveUp(Object bean, MetaBean metaBean) { - NodeImpl leaf = path.getLeafNode(); - if (leaf.isInIterable() && leaf.getName() != null) { - leaf.setName(null); - } else { - path.removeLeafNode(); - } - super.moveUp(bean, metaBean); // call super! - } - - /** - * {@inheritDoc} Here, state equates to bean identity + group. - */ - @SuppressWarnings("unchecked") - @Override - public boolean collectValidated() { - - // Combination of bean+group+owner (owner is currently ignored) - GraphBeanIdentity gbi = new GraphBeanIdentity(getBean(), getCurrentGroup().getGroup(), getCurrentOwner()); - - Set<PathImpl> validatedPathsForGBI = (Set<PathImpl>) validatedObjects.get(gbi); - if (validatedPathsForGBI == null) { - validatedPathsForGBI = new HashSet<PathImpl>(); - validatedObjects.put(gbi, validatedPathsForGBI); - } - - // If any of the paths is a subpath of the current path, there is a - // circular dependency, so return false - for (PathImpl validatedPath : validatedPathsForGBI) { - if (path.isSubPathOf(validatedPath)) { - return false; - } - } - - // Else, add the currentPath to the set of validatedPaths - validatedPathsForGBI.add(PathImpl.copy(path)); - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean collectValidated(ConstraintValidator<?, ?> constraint) { - ConstraintValidatorIdentity cvi = new ConstraintValidatorIdentity(getBean(), getPropertyPath(), constraint); - return this.validatedConstraints.add(cvi); - } - - /** - * Reset the validated constraints. - */ - public void resetValidatedConstraints() { - validatedConstraints.clear(); - } - - /** - * {@inheritDoc} If an associated object is validated, add the association - * field or JavaBeans property name and a dot ('.') as a prefix to the - * previous rules. uses prop[index] in property path for elements in - * to-many-relationships. - * - * @return the path in dot notation - */ - @Override - public PathImpl getPropertyPath() { - PathImpl currentPath = PathImpl.copy(path); - if (getMetaProperty() != null) { - currentPath.addProperty(getMetaProperty().getName()); - } - return currentPath; - } - - /** - * {@inheritDoc} - */ - @Override - public MetaBean getRootMetaBean() { - return rootMetaBean; - } - - /** - * Set the Groups. - * - * @param groups - */ - public void setGroups(Groups groups) { - this.groups = groups; - } - - /** - * {@inheritDoc} - */ - @Override - public Groups getGroups() { - return groups; - } - - @Override - public void setCurrentGroups(final Groups g) { - groups = g; - } - - /** - * {@inheritDoc} - */ - @Override - public Group getCurrentGroup() { - return currentGroup; - } - - /** - * {@inheritDoc} - */ - @Override - public void setCurrentGroup(Group currentGroup) { - this.currentGroup = currentGroup; - } - - /** - * {@inheritDoc} - */ - @Override - public void setConstraintValidation(ConstraintValidation<?> constraint) { - constraintValidation = constraint; - } - - /** - * {@inheritDoc} - */ - @Override - public ConstraintValidation<?> getConstraintValidation() { - return constraintValidation; - } - - /** - * {@inheritDoc} - */ - @Override - public ConstraintDescriptor<?> getConstraintDescriptor() { - return constraintValidation; - } - - /** - * {@inheritDoc} - */ - @Override - public Object getValidatedValue() { - if (getMetaProperty() != null) { - return getPropertyValue(constraintValidation.getAccess()); - } else { - return getBean(); - } - } - - @Override - public <U> U unwrap(Class<U> type) { - if (type.isInstance(this)) { - return type.cast(this); - } - throw new ValidationException("Type " + type + " not supported"); - } - - /** - * {@inheritDoc} - */ - @Override - public MessageInterpolator getMessageResolver() { - return messageResolver; - } - - /** - * {@inheritDoc} - */ - @Override - public TraversableResolver getTraversableResolver() { - return traversableResolver; - } - - @Override - public ConstraintValidatorFactory getConstraintValidatorFactory() { - return constraintValidatorFactory; - } - - /** - * {@inheritDoc} - */ - @Override - public Class<?> getCurrentOwner() { - return this.currentOwner; - } - - /** - * {@inheritDoc} - */ - @Override - public void setCurrentOwner(Class<?> currentOwner) { - this.currentOwner = currentOwner; - } - - @Override - public ElementKind getElementKind() { - return path.getLeafNode().getKind(); - } - - @Override - public Object getReturnValue() { - return returnValue; - } - - @Override - public Object[] getParameters() { - return parameters; - } - - @Override - public void setParameters(final Object[] parameters) { - this.parameters = parameters; - } - - @Override - public void setReturnValue(final Object returnValue) { - this.returnValue = returnValue; - } - - @Override - public ParameterNameProvider getParameterNameProvider() { - return parameterNameProvider; - } - - @Override - public void setMethod(final Method method) { - this.method = method; - } - - @Override - public Method getMethod() { - return method; - } - - @Override - public Constructor<?> getConstructor() { - return constructor; - } - - @Override - public void setConstructor(final Constructor<?> constructor) { - this.constructor = constructor; - } -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/IncompatiblePropertyValueException.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/IncompatiblePropertyValueException.java b/bval-jsr/src/main/java/org/apache/bval/jsr/IncompatiblePropertyValueException.java deleted file mode 100644 index e94a101..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/IncompatiblePropertyValueException.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.jsr; - -import javax.validation.ValidationException; - -/** - * Internal exception thrown when trying to validate a value for a property for which it is not assignment-compatible. - * - * @version $Rev: 1031833 $ $Date: 2010-11-05 16:53:03 -0500 (Fri, 05 Nov 2010) $ - * - * @author Matt Benson - */ -public class IncompatiblePropertyValueException extends ValidationException { - - private static final long serialVersionUID = 1L; - - /** - * Create a new {@link IncompatiblePropertyValueException} instance. - * - * @param message - */ - public IncompatiblePropertyValueException(String message) { - super(message); - } - - /** - * Create a new IncompatiblePropertyValueException instance. - */ - public IncompatiblePropertyValueException() { - super(); - } - - /** - * Create a new IncompatiblePropertyValueException instance. - * - * @param message - * @param cause - */ - public IncompatiblePropertyValueException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Create a new IncompatiblePropertyValueException instance. - * - * @param cause - */ - public IncompatiblePropertyValueException(Throwable cause) { - super(cause); - } - -} http://git-wip-us.apache.org/repos/asf/bval/blob/92c64b3c/bval-jsr/src/main/java/org/apache/bval/jsr/InvocableElementDescriptor.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/InvocableElementDescriptor.java b/bval-jsr/src/main/java/org/apache/bval/jsr/InvocableElementDescriptor.java deleted file mode 100644 index f54b553..0000000 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/InvocableElementDescriptor.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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.jsr; - -import org.apache.bval.model.MetaBean; -import org.apache.bval.model.Validation; - -import javax.validation.metadata.ConstraintDescriptor; -import javax.validation.metadata.CrossParameterDescriptor; -import javax.validation.metadata.ElementDescriptor; -import javax.validation.metadata.ParameterDescriptor; -import javax.validation.metadata.ReturnValueDescriptor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - -public class InvocableElementDescriptor extends ElementDescriptorImpl implements ProcedureDescriptor { - private static final CopyOnWriteArraySet<ConstraintValidation<?>> NO_CONSTRAINTS = - new CopyOnWriteArraySet<ConstraintValidation<?>>(); - - private ReturnValueDescriptor returnValueDescriptor; - private CrossParameterDescriptor crossParameterDescriptor; - private final List<ParameterDescriptor> parameterDescriptors = new ArrayList<ParameterDescriptor>(); - - protected InvocableElementDescriptor(final MetaBean metaBean, final Class<?> elementClass, - final Validation[] validations) { - super(metaBean, elementClass, validations); - } - - protected InvocableElementDescriptor(final Class<?> elementClass, final Validation[] validations) { - super(elementClass, validations); - } - - /** - * {@inheritDoc} - */ - @Override - public List<ParameterDescriptor> getParameterDescriptors() { - // index aligned - return parameterDescriptors; - } - - public void setReturnValueDescriptor(final ReturnValueDescriptor returnValueDescriptor) { - this.returnValueDescriptor = returnValueDescriptor; - } - - public CrossParameterDescriptor getCrossParameterDescriptor() { - return crossParameterDescriptor; - } - - public void setCrossParameterDescriptor(final CrossParameterDescriptor crossParameterDescriptor) { - this.crossParameterDescriptor = crossParameterDescriptor; - } - - /** - * Add the specified validations to this {@link org.apache.bval.jsr.MethodDescriptorImpl}. - * @param validations - */ - void addValidations(Collection<ConstraintValidation<?>> validations) { - getMutableConstraintDescriptors().addAll(validations); - } - - protected boolean hasConstrainedParameters() { - for (final ParameterDescriptor pd : getParameterDescriptors()) { - if (pd.isCascaded() || !pd.getConstraintDescriptors().isEmpty()) { - return true; - } - } - return getCrossParameterDescriptor().hasConstraints(); - } - - public ReturnValueDescriptor getReturnValueDescriptor() { - return returnValueDescriptor; - } - - protected boolean hasConstrainedReturnValue() { - return getReturnValueDescriptor().isCascaded() - || !getReturnValueDescriptor().getConstraintDescriptors().isEmpty(); - } - - @Override - public ElementDescriptor.ConstraintFinder findConstraints() { - return new ConstraintFinderImpl(metaBean, NO_CONSTRAINTS); - } - - @Override - public Set<ConstraintDescriptor<?>> getConstraintDescriptors() { - return Set.class.cast(NO_CONSTRAINTS); - } -}
