Class AbstractMessageSource
- java.lang.Object
-
- com.aspectran.core.support.i18n.message.MessageSourceSupport
-
- com.aspectran.core.support.i18n.message.AbstractMessageSource
-
- All Implemented Interfaces:
HierarchicalMessageSource
,MessageSource
- Direct Known Subclasses:
ResourceBundleMessageSource
public abstract class AbstractMessageSource extends MessageSourceSupport implements HierarchicalMessageSource
(This class is a member of the Spring Framework.)
Abstract implementation of theHierarchicalMessageSource
interface, implementing common handling of message variants, making it easy to implement a specific strategy for a concrete MessageSource.Subclasses must implement the abstract
resolveCode(java.lang.String, java.util.Locale)
method. For efficient resolution of messages without arguments, theresolveCodeWithoutArguments(java.lang.String, java.util.Locale)
method should be overridden as well, resolving messages without a MessageFormat being involved.Note: By default, message texts are only parsed through MessageFormat if arguments have been passed in for the message. In case of no arguments, message texts will be returned as-is. As a consequence, you should only use MessageFormat escaping for messages with actual arguments, and keep all other messages unescaped. If you prefer to escape all messages, set the "alwaysUseMessageFormat" flag to "true".
Created: 2016. 2. 8.
-
-
Field Summary
-
Fields inherited from class com.aspectran.core.support.i18n.message.MessageSourceSupport
log
-
-
Constructor Summary
Constructors Constructor Description AbstractMessageSource()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected java.util.Properties
getCommonMessages()
Return a Properties object defining locale-independent common messages, if any.protected java.lang.String
getDefaultMessage(java.lang.String code)
Return a fallback default message for the given code, if any.java.lang.String
getMessage(java.lang.String code, java.lang.Object[] args, java.lang.String defaultMessage, java.util.Locale locale)
Try to resolve the message.java.lang.String
getMessage(java.lang.String code, java.lang.Object[] args, java.util.Locale locale)
Try to resolve the message.protected java.lang.String
getMessageFromParent(java.lang.String code, java.lang.Object[] args, java.util.Locale locale)
Try to retrieve the given message from the parent MessageSource, if any.protected java.lang.String
getMessageInternal(java.lang.String code, java.lang.Object[] args, java.util.Locale locale)
Resolve the given code and arguments as message in the given Locale, returningnull
if not found.MessageSource
getParentMessageSource()
Return the parent of this MessageSource, ornull
if none.protected boolean
isUseCodeAsDefaultMessage()
Return whether to use the message code as default message instead of throwing a NoSuchMessageException.protected abstract java.text.MessageFormat
resolveCode(java.lang.String code, java.util.Locale locale)
Subclasses must implement this method to resolve a message.protected java.lang.String
resolveCodeWithoutArguments(java.lang.String code, java.util.Locale locale)
Subclasses can override this method to resolve a message without arguments in an optimized fashion, i.e.void
setCommonMessages(java.util.Properties commonMessages)
Specify locale-independent common messages, with the message code as key and the full message String (may contain argument placeholders) as value.void
setParentMessageSource(MessageSource parent)
Set the parent that will be used to try to resolve messages that this object can't resolve.void
setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage)
Set whether to use the message code as default message instead of throwing a NoSuchMessageException.-
Methods inherited from class com.aspectran.core.support.i18n.message.MessageSourceSupport
createMessageFormat, formatMessage, isAlwaysUseMessageFormat, renderDefaultMessage, resolveArguments, setAlwaysUseMessageFormat
-
-
-
-
Method Detail
-
setParentMessageSource
public void setParentMessageSource(MessageSource parent)
Description copied from interface:HierarchicalMessageSource
Set the parent that will be used to try to resolve messages that this object can't resolve.- Specified by:
setParentMessageSource
in interfaceHierarchicalMessageSource
- Parameters:
parent
- the parent MessageSource that will be used to resolve messages that this object can't resolve. May benull
, in which case no further resolution is possible.
-
getParentMessageSource
public MessageSource getParentMessageSource()
Description copied from interface:HierarchicalMessageSource
Return the parent of this MessageSource, ornull
if none.- Specified by:
getParentMessageSource
in interfaceHierarchicalMessageSource
- Returns:
- the parent message source
-
setCommonMessages
public void setCommonMessages(java.util.Properties commonMessages)
Specify locale-independent common messages, with the message code as key and the full message String (may contain argument placeholders) as value.- Parameters:
commonMessages
- the common messages
-
getCommonMessages
protected java.util.Properties getCommonMessages()
Return a Properties object defining locale-independent common messages, if any.- Returns:
- the common messages
-
setUseCodeAsDefaultMessage
public void setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage)
Set whether to use the message code as default message instead of throwing a NoSuchMessageException. Useful for development and debugging. Default is "false".Note: In case of a MessageSourceResolvable with multiple codes (like a FieldError) and a MessageSource that has a parent MessageSource, do not activate "useCodeAsDefaultMessage" in the parent: Else, you'll get the first code returned as message by the parent, without attempts to check further codes.
To be able to work with "useCodeAsDefaultMessage" turned on in the parent, AbstractMessageSource and AbstractApplicationContext contain special checks to delegate to the internal
getMessageInternal(java.lang.String, java.lang.Object[], java.util.Locale)
method if available. In general, it is recommended to just use "useCodeAsDefaultMessage" during development and not rely on it in production in the first place, though.- Parameters:
useCodeAsDefaultMessage
- whether use code as default message- See Also:
#getMessage(String, Object[], Locale)
-
isUseCodeAsDefaultMessage
protected boolean isUseCodeAsDefaultMessage()
Return whether to use the message code as default message instead of throwing a NoSuchMessageException. Useful for development and debugging. Default is "false".Alternatively, consider overriding the
getDefaultMessage(java.lang.String)
method to return a custom fallback message for an unresolvable code.- Returns:
- whether use code as default message
- See Also:
#getDefaultMessage(String)
-
getMessage
public final java.lang.String getMessage(java.lang.String code, java.lang.Object[] args, java.lang.String defaultMessage, java.util.Locale locale)
Description copied from interface:MessageSource
Try to resolve the message. Return default message if no message was found.- Specified by:
getMessage
in interfaceMessageSource
- Parameters:
code
- the code to lookup up, such as 'calculator.noRateSet'. Users of this class are encouraged to base message names on the relevant fully qualified class name, thus avoiding conflict and ensuring maximum clarity.args
- array of arguments that will be filled in for params within the message (params look like "{0}", "{1,date}", "{2,time}" within a message), ornull
if none.defaultMessage
- String to return if the lookup failslocale
- the Locale in which to do the lookup- Returns:
- the resolved message if the lookup was successful; otherwise the default message passed as a parameter
- See Also:
MessageFormat
-
getMessage
public final java.lang.String getMessage(java.lang.String code, java.lang.Object[] args, java.util.Locale locale) throws NoSuchMessageException
Description copied from interface:MessageSource
Try to resolve the message. Treat as an error if the message can't be found.- Specified by:
getMessage
in interfaceMessageSource
- Parameters:
code
- the code to lookup up, such as 'calculator.noRateSet'args
- Array of arguments that will be filled in for params within the message (params look like "{0}", "{1,date}", "{2,time}" within a message), ornull
if none.locale
- the Locale in which to do the lookup- Returns:
- the resolved message
- Throws:
NoSuchMessageException
- if the message wasn't found- See Also:
MessageFormat
-
getMessageInternal
protected java.lang.String getMessageInternal(java.lang.String code, java.lang.Object[] args, java.util.Locale locale)
Resolve the given code and arguments as message in the given Locale, returningnull
if not found. Does not fall back to the code as default message. Invoked bygetMessage
methods.- Parameters:
code
- the code to lookup up, such as 'calculator.noRateSet'args
- array of arguments that will be filled in for params within the messagelocale
- the Locale in which to do the lookup- Returns:
- the resolved message, or
null
if not found - See Also:
#getMessage(String, Object[], String, Locale)
,#getMessage(String, Object[], Locale)
,#setUseCodeAsDefaultMessage
-
getMessageFromParent
protected java.lang.String getMessageFromParent(java.lang.String code, java.lang.Object[] args, java.util.Locale locale)
Try to retrieve the given message from the parent MessageSource, if any.- Parameters:
code
- the code to lookup up, such as 'calculator.noRateSet'args
- array of arguments that will be filled in for params within the messagelocale
- the Locale in which to do the lookup- Returns:
- the resolved message, or
null
if not found - See Also:
#getParentMessageSource()
-
getDefaultMessage
protected java.lang.String getDefaultMessage(java.lang.String code)
Return a fallback default message for the given code, if any.Default is to return the code itself if "useCodeAsDefaultMessage" is activated, or return no fallback else. In case of no fallback, the caller will usually receive a NoSuchMessageException from
getMessage
.- Parameters:
code
- the message code that we couldn't resolve and that we didn't receive an explicit default message for- Returns:
- the default message to use, or
null
if none - See Also:
#setUseCodeAsDefaultMessage
-
resolveCodeWithoutArguments
protected java.lang.String resolveCodeWithoutArguments(java.lang.String code, java.util.Locale locale)
Subclasses can override this method to resolve a message without arguments in an optimized fashion, i.e. to resolve without involving a MessageFormat.The default implementation does use MessageFormat, through delegating to the
resolveCode(java.lang.String, java.util.Locale)
method. Subclasses are encouraged to replace this with optimized resolution.Unfortunately,
java.text.MessageFormat
is not implemented in an efficient fashion. In particular, it does not detect that a message pattern doesn't contain argument placeholders in the first place. Therefore, it is advisable to circumvent MessageFormat for messages without arguments.- Parameters:
code
- the code of the message to resolvelocale
- the Locale to resolve the code for (subclasses are encouraged to support internationalization)- Returns:
- the message String, or
null
if not found - See Also:
#resolveCode
,MessageFormat
-
resolveCode
protected abstract java.text.MessageFormat resolveCode(java.lang.String code, java.util.Locale locale)
Subclasses must implement this method to resolve a message.Returns a MessageFormat instance rather than a message String, to allow for appropriate caching of MessageFormats in subclasses.
Subclasses are encouraged to provide optimized resolution for messages without arguments, not involving MessageFormat. See the
resolveCodeWithoutArguments(java.lang.String, java.util.Locale)
javadoc for details.- Parameters:
code
- the code of the message to resolvelocale
- the Locale to resolve the code for (subclasses are encouraged to support internationalization)- Returns:
- the MessageFormat for the message, or
null
if not found - See Also:
#resolveCodeWithoutArguments(String, java.util.Locale)
-
-