| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Licensed 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 com.google.gwt.validation.client.impl; |
| |
| import java.lang.annotation.Annotation; |
| import java.lang.annotation.ElementType; |
| import java.util.Arrays; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import javax.validation.ConstraintValidator; |
| import javax.validation.Payload; |
| import javax.validation.metadata.ConstraintDescriptor; |
| |
| /** |
| * A immutable GWT implementation of {@link ConstraintDescriptor}. |
| * |
| * @param <T> the constraint annotation to describe. |
| */ |
| public final class ConstraintDescriptorImpl<T extends Annotation> implements |
| ConstraintDescriptor<T> { |
| |
| /** |
| * Builder for {@link ConstraintDescriptorImpl}. |
| * |
| * @param <T> the constraint annotation to describe. |
| */ |
| public static class Builder<T extends Annotation> { |
| private T annotation; |
| private Set<Class<?>> groups; |
| private Set<Class<? extends Payload>> payload; |
| private List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses; |
| private Map<String, Object> attributes; |
| private Set<ConstraintDescriptor<?>> composingConstraints = |
| new HashSet<ConstraintDescriptor<?>>(); |
| private boolean reportAsSingleViolation; |
| private ElementType elementType; |
| private ConstraintOrigin definedOn; |
| |
| public Builder<T> addComposingConstraint( |
| ConstraintDescriptor<?> composingConstraint) { |
| this.composingConstraints.add(composingConstraint); |
| return this; |
| } |
| |
| public ConstraintDescriptorImpl<T> build() { |
| return new ConstraintDescriptorImpl<T>(// |
| annotation, // |
| groups, // |
| payload, // |
| constraintValidatorClasses, // |
| attributes, // |
| composingConstraints, // |
| reportAsSingleViolation, // |
| elementType, // |
| definedOn); |
| } |
| |
| public Builder<T> setAnnotation(T annotation) { |
| this.annotation = annotation; |
| return this; |
| } |
| |
| public Builder<T> setAttributes(Map<String, Object> attributes) { |
| this.attributes = attributes; |
| return this; |
| } |
| |
| public Builder<T> setConstraintValidatorClasses( |
| Class<? extends ConstraintValidator<T, ?>>[] constraintValidatorClasses) { |
| List<Class<? extends ConstraintValidator<T, ?>>> list = Arrays.asList(constraintValidatorClasses); |
| setConstraintValidatorClasses(list); |
| return this; |
| } |
| |
| public Builder<T> setConstraintValidatorClasses( |
| List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses) { |
| this.constraintValidatorClasses = constraintValidatorClasses; |
| return this; |
| } |
| |
| public Builder<T> setDefinedOn(ConstraintOrigin definedOn) { |
| this.definedOn = definedOn; |
| return this; |
| } |
| |
| public Builder<T> setElementType(ElementType elementType) { |
| this.elementType = elementType; |
| return this; |
| } |
| |
| public Builder<T> setGroups(Class<?>[] classes) { |
| setGroups(new HashSet<Class<?>>(Arrays.asList(classes))); |
| return this; |
| } |
| |
| public Builder<T> setGroups(Set<Class<?>> groups) { |
| this.groups = groups; |
| return this; |
| } |
| |
| public Builder<T> setPayload(Class<? extends Payload>[] classes) { |
| setPayload(new HashSet<Class<? extends Payload>>(Arrays.asList(classes))); |
| return this; |
| } |
| |
| public Builder<T> setPayload(Set<Class<? extends Payload>> payload) { |
| this.payload = payload; |
| return this; |
| } |
| |
| public Builder<T> setReportAsSingleViolation(boolean reportAsSingleViolation) { |
| this.reportAsSingleViolation = reportAsSingleViolation; |
| return this; |
| } |
| } |
| |
| public static <T extends Annotation> Builder<T> builder() { |
| return new Builder<T>(); |
| } |
| |
| private final T annotation; |
| private final Set<Class<?>> groups; |
| private final Set<Class<? extends Payload>> payload; |
| private final List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses; |
| private final Map<String, Object> attributes; |
| private final Set<ConstraintDescriptor<?>> composingConstraints; |
| private final boolean reportAsSingleViolation; |
| private final ElementType elementType; |
| private final ConstraintOrigin definedOn; |
| |
| private ConstraintDescriptorImpl( |
| T annotation, |
| Set<Class<?>> groups, |
| Set<Class<? extends Payload>> payload, |
| List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses, |
| Map<String, Object> attributes, |
| Set<ConstraintDescriptor<?>> composingConstraints, |
| boolean reportAsSingleViolation, |
| ElementType elementType, |
| ConstraintOrigin definedOn) { |
| super(); |
| this.annotation = annotation; |
| this.groups = groups; |
| this.payload = payload; |
| this.constraintValidatorClasses = constraintValidatorClasses; |
| this.attributes = attributes; |
| this.composingConstraints = composingConstraints; |
| this.reportAsSingleViolation = reportAsSingleViolation; |
| this.elementType = elementType; |
| this.definedOn = definedOn; |
| } |
| |
| @Override |
| public T getAnnotation() { |
| return annotation; |
| } |
| |
| @Override |
| public Map<String, Object> getAttributes() { |
| return attributes; |
| } |
| |
| @Override |
| public Set<ConstraintDescriptor<?>> getComposingConstraints() { |
| return composingConstraints; |
| } |
| |
| @Override |
| public List<Class<? extends ConstraintValidator<T, ?>>> getConstraintValidatorClasses() { |
| return constraintValidatorClasses; |
| } |
| |
| public ConstraintOrigin getDefinedOn() { |
| return definedOn; |
| } |
| |
| public ElementType getElementType() { |
| return elementType; |
| } |
| |
| @Override |
| public Set<Class<?>> getGroups() { |
| return groups; |
| } |
| |
| @Override |
| public Set<Class<? extends Payload>> getPayload() { |
| return payload; |
| } |
| |
| @Override |
| public boolean isReportAsSingleViolation() { |
| return reportAsSingleViolation; |
| } |
| |
| /** |
| * For debugging only. Do not rely on the format. It can change at any time. |
| */ |
| @Override |
| public String toString() { |
| return String.valueOf(annotation); |
| } |
| } |