001    package org.apache.tapestry.form.translator;
002    
003    import org.apache.hivemind.ApplicationRuntimeException;
004    import org.apache.tapestry.form.IFormComponent;
005    import org.apache.tapestry.form.ValidationMessages;
006    import org.apache.tapestry.valid.ValidationConstraint;
007    import org.apache.tapestry.valid.ValidationStrings;
008    import org.apache.tapestry.valid.ValidatorException;
009    
010    import java.math.BigDecimal;
011    import java.util.Locale;
012    
013    /**
014     * Translator for {@link java.math.BigDecimal} objects. 
015     */
016    public class BigDecimalTranslator extends AbstractTranslator {
017    
018        public BigDecimalTranslator()
019        {
020        }
021    
022        // Needed until HIVEMIND-134 fix is available
023        public BigDecimalTranslator(String initializer)
024        {
025            super(initializer);
026        }
027    
028        protected String formatObject(IFormComponent field, Locale locale, Object object)
029        {
030            if (!BigDecimal.class.isInstance(object))
031                throw new ApplicationRuntimeException("BigDecimalTranslator translates values of type BigDecimal, not: " + object.getClass());
032            
033            return object.toString();
034        }
035    
036        protected Object parseText(IFormComponent field, ValidationMessages messages, String text)
037                throws ValidatorException
038        {
039            try {
040                
041                return new BigDecimal(text);
042            }
043            catch (NumberFormatException e) {
044                throw new ValidatorException(buildMessage(messages, field, ValidationStrings.INVALID_NUMBER), ValidationConstraint.NUMBER_FORMAT);
045            }
046        }
047    }