001    package org.springframework.binding.validation.support;
002    
003    import java.util.Locale;
004    
005    import org.apache.commons.lang.StringUtils;
006    import org.apache.commons.logging.Log;
007    import org.apache.commons.logging.LogFactory;
008    import org.hibernate.validator.MessageInterpolator;
009    import org.hibernate.validator.Validator;
010    import org.springframework.context.support.MessageSourceAccessor;
011    import org.springframework.richclient.application.ApplicationServicesLocator;
012    
013    /**
014     * Custom interpolator which requires a "messageSource" bean, which is a
015     * MessageSource implementation. This way the validation messages from Hibernate
016     * can be overwritten through the i18n facilities of Spring RCP.
017     *
018     * The different keys of the validators can be found in the Hibernate Reference,
019     * or you can look in the DefaultValidationMessage.properties file inside the
020     * hibernate-validator jar.
021     *
022     * @author Lieven Doclo
023     *
024     */
025    public class HibernateRulesMessageInterpolator implements MessageInterpolator {
026    
027            private MessageSourceAccessor messageSourceAccessor;
028    
029            private static Log log = LogFactory.getLog(HibernateRulesMessageInterpolator.class);
030    
031            private String annotationMessage;
032    
033            private String interpolateMessage;
034    
035            /**
036             * Initialize the MessageSourceAccessor by finding it inside the application
037             * Spring context.
038             */
039            private void initializeMessageSourceAccessor() {
040                    this.messageSourceAccessor = (MessageSourceAccessor) ApplicationServicesLocator.services().getService(
041                                    MessageSourceAccessor.class);
042            }
043    
044            /**
045             * Retrieve the message for the validator.
046             */
047            public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
048                    if (annotationMessage != null && annotationMessage.equals(message)) {
049                            // short cut
050                            return interpolateMessage;
051                    }
052                    else {
053                            message = message.replaceAll("[\\{\\}]", "");
054                            String string = null;
055                            string = messageSourceAccessor != null ? messageSourceAccessor.getMessage(message, new Object[0], Locale
056                                            .getDefault()) : null;
057                            if (StringUtils.isEmpty(string)) {
058                                    log.info("Message not found in messageSourceAccessor (it may not exist), "
059                                                    + "trying Hibernate default messages");
060                                    return defaultInterpolator.interpolate(message, validator, defaultInterpolator);
061                            }
062                            return string;
063                    }
064            }
065    
066            /**
067             * Create a new instance of the interpolator.
068             */
069            public HibernateRulesMessageInterpolator() {
070                    initializeMessageSourceAccessor();
071            }
072    }