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    }