001 package org.tynamo.hibernate.validation;
002
003 import org.apache.tapestry5.ValidationTracker;
004 import org.apache.tapestry5.ioc.MessageFormatter;
005 import org.apache.tapestry5.ioc.Messages;
006 import org.apache.tapestry5.ioc.services.ThreadLocale;
007 import org.apache.tapestry5.services.ValidationMessagesSource;
008 import org.hibernate.validator.InvalidStateException;
009 import org.hibernate.validator.InvalidValue;
010 import org.tynamo.descriptor.TynamoClassDescriptor;
011 import org.tynamo.descriptor.TynamoPropertyDescriptor;
012 import org.tynamo.util.DisplayNameUtils;
013
014
015 public class HibernateValidationDelegate //extends TynamoValidationDelegate
016 {
017
018 private ValidationMessagesSource messagesSource;
019 private ThreadLocale threadLocale;
020
021 public HibernateValidationDelegate(ValidationMessagesSource messagesSource, ThreadLocale threadLocale)
022 {
023 this.messagesSource = messagesSource;
024 this.threadLocale = threadLocale;
025 }
026
027 /**
028 * Records error messages for all the class level or method level constraints violations.
029 */
030 public void record(TynamoClassDescriptor descriptor, InvalidStateException invalidStateException, ValidationTracker validationTracker, Messages componentMessages)
031 {
032 for (InvalidValue invalidValue : invalidStateException.getInvalidValues())
033 {
034 String key = invalidValue.getMessage();
035 TynamoPropertyDescriptor propertyDescriptor = descriptor.getPropertyDescriptor(invalidValue.getPropertyName());
036 MessageFormatter messageFormatter = messagesSource.getValidationMessages(threadLocale.getLocale()).getFormatter(key);
037 if (propertyDescriptor != null)
038 {
039 validationTracker.recordError(messageFormatter.format(DisplayNameUtils.getDisplayName(propertyDescriptor, componentMessages), invalidValue.getValue()));
040 } else
041 {
042 // This error is an "unassociated (with any field) error".
043 validationTracker.recordError(messageFormatter.format());
044 }
045 }
046
047 }
048
049 }