/* * 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.io.Serializable; import java.lang.annotation.ElementType; import javax.validation.ConstraintViolation; import javax.validation.Path; import javax.validation.metadata.ConstraintDescriptor; /** * An implementation of {@link ConstraintViolation}. * * @param <T> the type of bean validated. */ public final class ConstraintViolationImpl<T> implements ConstraintViolation<T>, Serializable { /** * Builder for ConstraintViolations. * * @param <T> the type of bean validated. */ public static class Builder<T> { private String message; private String messageTemplate; private T rootBean; private Class<T> rootBeanClass; private Object leafBean; private Path propertyPath; private Object invalidValue; private ElementType elementType; private ConstraintDescriptor<?> constraintDescriptor; public ConstraintViolationImpl<T> build() { return new ConstraintViolationImpl<T>(message, messageTemplate, rootBean, rootBeanClass, leafBean, propertyPath, invalidValue, elementType, constraintDescriptor); } public Builder<T> setConstraintDescriptor( ConstraintDescriptor<?> constraintDescriptor) { this.constraintDescriptor = constraintDescriptor; return this; } public Builder<T> setElementType(ElementType elementType) { this.elementType = elementType; return this; } public Builder<T> setInvalidValue(Object invalidValue) { this.invalidValue = invalidValue; return this; } public Builder<T> setLeafBean(Object leafBean) { this.leafBean = leafBean; return this; } public Builder<T> setMessage(String message) { this.message = message; return this; } public Builder<T> setMessageTemplate(String messageTemplate) { this.messageTemplate = messageTemplate; return this; } public Builder<T> setPropertyPath(Path propertyPath) { this.propertyPath = propertyPath; return this; } public Builder<T> setRootBean(T rootBean) { this.rootBean = rootBean; return this; } public Builder<T> setRootBeanClass(Class<T> rootBeanClass) { this.rootBeanClass = rootBeanClass; return this; } } private static final long serialVersionUID = 1L; public static <T> Builder<T> builder() { return new Builder<T>(); } private final String message; private final String messageTemplate; private final T rootBean; private final Class<T> rootBeanClass; private final Object leafBean; private final Path propertyPath; private final Object invalidValue; private final ElementType elementType; private final ConstraintDescriptor<?> constraintDescriptor; /** * @param message * @param messageTemplate * @param rootBean * @param rootBeanClass * @param leafBean * @param propertyPath * @param invalidValue * @param constraintDescriptor */ private ConstraintViolationImpl(String message, String messageTemplate, T rootBean, Class<T> rootBeanClass, Object leafBean, Path propertyPath, Object invalidValue, ElementType elementType, ConstraintDescriptor<?> constraintDescriptor) { super(); this.message = message; this.messageTemplate = messageTemplate; this.rootBean = rootBean; this.rootBeanClass = rootBeanClass; this.leafBean = leafBean; this.propertyPath = propertyPath; this.invalidValue = invalidValue; this.elementType = elementType; this.constraintDescriptor = constraintDescriptor; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof ConstraintViolationImpl)) { return false; } ConstraintViolationImpl<?> other = (ConstraintViolationImpl<?>) o; return (message == null ? other.message == null : message.equals(other.message) && propertyPath == null ? other.propertyPath == null : propertyPath.equals(other.propertyPath) && rootBean == null ? other.rootBean == null : rootBean.equals(other.rootBean) && leafBean == null ? other.leafBean == null : leafBean.equals(other.leafBean) && elementType == null ? other.elementType == null : elementType.equals(other.elementType) && invalidValue == null ? other.invalidValue == null : invalidValue.equals(other.invalidValue)); } @Override public ConstraintDescriptor<?> getConstraintDescriptor() { return constraintDescriptor; } @Override public Object getInvalidValue() { return invalidValue; } @Override public Object getLeafBean() { return leafBean; } @Override public String getMessage() { return message; } @Override public String getMessageTemplate() { return messageTemplate; } @Override public Path getPropertyPath() { return propertyPath; } @Override public T getRootBean() { return rootBean; } @Override public Class<T> getRootBeanClass() { return rootBeanClass; } @Override public int hashCode() { int result = message != null ? message.hashCode() : 0; result = 31 * result + (propertyPath != null ? propertyPath.hashCode() : 0); result = 31 * result + (rootBean != null ? rootBean.hashCode() : 0); result = 31 * result + (leafBean != null ? leafBean.hashCode() : 0); result = 31 * result + (elementType != null ? elementType.hashCode() : 0); result = 31 * result + (invalidValue != null ? invalidValue.hashCode() : 0); return result; } /** * For debugging only. Do not rely on the format. It can change at any time. */ @Override public String toString() { return "ConstraintViolationImpl(message= " + message // + ", path= " + propertyPath // + ", invalidValue=" + invalidValue // + ", desc=" + constraintDescriptor // + ", elementType=" + elementType + ")"; } }