blob: 85034b4183b8cb442167c60c2cf783ebf11f249b [file] [log] [blame]
/*
* 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.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;
/**
* <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
* production code.
* <p>
* A immutable GWT implementation of {@link ConstraintDescriptor}.
*
* @param <T> the constraint annotation to describe.
*/
public 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;
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);
}
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> 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 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) {
super();
this.annotation = annotation;
this.groups = groups;
this.payload = payload;
this.constraintValidatorClasses = constraintValidatorClasses;
this.attributes = attributes;
this.composingConstraints = composingConstraints;
this.reportAsSingleViolation = reportAsSingleViolation;
}
public T getAnnotation() {
return annotation;
}
public Map<String, Object> getAttributes() {
return attributes;
}
public Set<ConstraintDescriptor<?>> getComposingConstraints() {
return composingConstraints;
}
public List<Class<? extends ConstraintValidator<T, ?>>> getConstraintValidatorClasses() {
return constraintValidatorClasses;
}
public Set<Class<?>> getGroups() {
return groups;
}
public Set<Class<? extends Payload>> getPayload() {
return payload;
}
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);
}
}