001    package org.trails.i18n;
002    
003    import java.util.Locale;
004    
005    import org.trails.descriptor.IClassDescriptor;
006    import org.trails.descriptor.IDescriptor;
007    import org.trails.descriptor.IPropertyDescriptor;
008    
009    public abstract class AbstractMessageSource implements TrailsMessageSource
010    {
011    
012            public String getMessageWithDefaultValue(String key, String defaultMessage)
013            {
014                    return getMessageOrDefaultValue(getMessage(key), defaultMessage);
015            }
016    
017            public String getMessageWithDefaultValue(String key, Object[] args, String defaultMessage)
018            {
019                    return getMessageOrDefaultValue(getMessage(key, args), defaultMessage);
020            }
021    
022            public String getMessageWithDefaultValue(String key, Locale locale, String defaultMessage)
023            {
024                    return getMessageOrDefaultValue(getMessage(key, locale), defaultMessage);
025            }
026    
027            public String getMessageWithDefaultValue(String key, Object[] args, Locale locale, String defaultMessage)
028            {
029                    return getMessageOrDefaultValue(getMessage(key, args, locale), defaultMessage);
030            }
031    
032            private String getMessageOrDefaultValue(String message, String defaultMessage)
033            {
034                    return (message != null) ? message : defaultMessage;
035            }
036    
037            public String getDisplayName(IDescriptor descriptor, String defaultMessage)
038            {
039                    String fullName;
040                    String shortName;
041                    if (descriptor instanceof IPropertyDescriptor)
042                    {
043                            IPropertyDescriptor property = (IPropertyDescriptor) descriptor;
044                            fullName = property.getBeanType().getName() + "." + property.getName();
045                            shortName = property.getName();
046                    } else if (descriptor instanceof IClassDescriptor)
047                    {
048                            IClassDescriptor clazz = (IClassDescriptor) descriptor;
049                            fullName = clazz.getType().getName();
050                            shortName = clazz.getType().getSimpleName();
051                    } else
052                    {
053                            return defaultMessage;
054                    }
055    
056                    return selectDisplayName(fullName, shortName, defaultMessage);
057            }
058    
059            public String getPluralDislayName(IClassDescriptor clazz, String defaultMessage)
060            {
061                    String fullName = clazz.getType().getName() + "__plural";
062                    String shortName = clazz.getType().getSimpleName() + "__plural";
063    
064                    return selectDisplayName(fullName, shortName, defaultMessage);
065            }
066    
067            /**
068             * Select a locale message, given two keys and a default value in case no message is found.
069             */
070            private String selectDisplayName(String firstKey, String secondKey, String defValue)
071            {
072                    String message;
073    
074                    message = getMessage(firstKey);
075                    if (message == null)
076                    {
077                            message = getMessage(secondKey);
078                            if (message == null)
079                            {
080                                    message = defValue;
081                            }
082                    }
083                    return message;
084            }
085    }