diff --git a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractResourceServiceMessageSource.java b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractResourceServiceMessageSource.java index d3820d4..3f67919 100644 --- a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractResourceServiceMessageSource.java +++ b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractResourceServiceMessageSource.java @@ -3,19 +3,17 @@ import io.microsphere.collection.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; +import javax.annotation.Nullable; import java.util.HashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; -import static io.microsphere.collection.MapUtils.isEmpty; import static io.microsphere.text.FormatUtils.format; import static java.util.Collections.emptyMap; -import static java.util.Collections.emptySet; import static java.util.Collections.singleton; -import static java.util.Collections.unmodifiableSet; +import static java.util.Collections.unmodifiableMap; import static java.util.Objects.requireNonNull; /** @@ -27,18 +25,16 @@ public abstract class AbstractResourceServiceMessageSource extends AbstractServiceMessageSource implements ResourceServiceMessageSource { /** - * Message Resource name prefix + * The default prefix of of message resource name */ - protected static final String RESOURCE_NAME_PREFIX = "i18n_messages_"; + protected static final String DEFAULT_RESOURCE_NAME_PREFIX = "i18n_messages_"; /** - * Message Resource Name Suffix + * The default suffix of message resource name */ - protected static final String RESOURCE_NAME_SUFFIX = ".properties"; + protected static final String DEFAULT_RESOURCE_NAME_SUFFIX = ".properties"; - private volatile Map> localizedMessages = emptyMap(); - - private volatile Set initializedResources = emptySet(); + private volatile Map> localizedResourceMessages = emptyMap(); public AbstractResourceServiceMessageSource(String source) { super(source); @@ -57,19 +53,12 @@ public void initializeResource(String resource) { @Override public void initializeResources(Iterable resources) { - List supportedLocales = getSupportedLocales(); - assertSupportedLocales(supportedLocales); - - // Copy the current messages and initialized resources - Map> localizedMessages = new HashMap<>(this.localizedMessages); - Set initializedResources = new LinkedHashSet<>(this.initializedResources); - - initializeResources(resources, supportedLocales, localizedMessages, initializedResources); - - // Exchange the field synchronized (this) { - this.localizedMessages = localizedMessages; - this.initializedResources = initializedResources; + // Copy the current messages and initialized resources + Map> localizedResourceMessages = new HashMap<>(this.localizedResourceMessages); + initializeResources(resources, localizedResourceMessages); + // Exchange the field + this.localizedResourceMessages = localizedResourceMessages; } } @@ -91,43 +80,26 @@ protected String getInternalMessage(String code, String resolvedCode, Locale loc Map messages = getMessages(resolvedLocale); String messagePattern = messages.get(resolvedCode); if (messagePattern != null) { - message = formatMessage(messagePattern, args); + message = resolveMessage(messagePattern, args); logMessage(code, resolvedCode, locale, resolvedLocale, args, messagePattern, message); } return message; } - protected void logMessage(String code, String resolvedCode, Locale locale, Locale resolvedLocale, Object[] args, - String messagePattern, String message) { - if (logger.isDebugEnabled()) { - logger.debug("Source '{}' gets Message[code : '{}' , resolvedCode : '{}' , locale : '{}' , resolvedLocale : '{}', args : '{}' , pattern : '{}'] : '{}'", - source, code, resolvedCode, locale, resolvedLocale, ArrayUtils.toString(args), messagePattern, message); - } - } - - @Override - public Set getInitializeResources() { - return unmodifiableSet(initializedResources); - } - /** * Initialization */ protected final void initialize() { List supportedLocales = getSupportedLocales(); assertSupportedLocales(supportedLocales); - Map> localizedMessages = new HashMap<>(supportedLocales.size()); - Set initializedResources = new LinkedHashSet<>(); + Map> localizedResourceMessages = new HashMap<>(supportedLocales.size()); for (Locale resolveLocale : supportedLocales) { String resource = getResource(resolveLocale); - initializeResource(resource, resolveLocale, localizedMessages, initializedResources); + initializeResource(resource, localizedResourceMessages); } // Exchange the field - synchronized (this) { - this.localizedMessages = localizedMessages; - this.initializedResources = initializedResources; - } - logger.debug("Source '{}' Initialization is completed , resources : {} , localizedMessages : {}", source, initializedResources, localizedMessages); + this.localizedResourceMessages = localizedResourceMessages; + logger.debug("Source '{}' Initialization is completed , localizedResourceMessages : {}", source, localizedResourceMessages); } private void assertSupportedLocales(List supportedLocales) { @@ -137,10 +109,8 @@ private void assertSupportedLocales(List supportedLocales) { } protected final void clearAllMessages() { - this.localizedMessages.clear(); - this.initializedResources.clear(); - this.localizedMessages = null; - this.initializedResources = null; + this.localizedResourceMessages.clear(); + this.localizedResourceMessages = null; } private void validateMessages(Map messages, String resourceName) { @@ -159,60 +129,68 @@ private void validateMessageCodePrefix(String code, String resourceName) { } private String getResource(Locale locale) { - String resourceName = getResourceName(locale); + String resourceName = buildResourceName(locale); return getResource(resourceName); } - private String getResourceName(Locale locale) { - return RESOURCE_NAME_PREFIX + locale + RESOURCE_NAME_SUFFIX; + protected String buildResourceName(Locale locale) { + return DEFAULT_RESOURCE_NAME_PREFIX + locale + DEFAULT_RESOURCE_NAME_SUFFIX; } protected abstract String getResource(String resourceName); - protected abstract Map loadMessages(Locale locale, String resource); + protected abstract Map loadMessages(String resource); + @Nullable public final Map getMessages(Locale locale) { - return localizedMessages.getOrDefault(locale, emptyMap()); + String resource = getResource(locale); + return localizedResourceMessages.get(resource); } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(getClass().getSimpleName()) - .append("{source='").append(source).append('\'') - .append(", initializedResources=").append(initializedResources) - .append(", defaultLocale=").append(getDefaultLocale()) - .append(", supportedLocales=").append(getSupportedLocales()) - .append(", localizedMessages=").append(localizedMessages) - .append('}'); - return sb.toString(); + private void initializeResources(Iterable resources, Map> localizedResourceMessages) { + for (String resource : resources) { + initializeResource(resource, localizedResourceMessages); + } } - private void initializeResources(Iterable resources, List supportedLocales, - Map> localizedMessages, Set initializedResources) { - - for (Locale locale : supportedLocales) { - initializeResources(resources, locale, localizedMessages, initializedResources); + private void initializeResource(String resource, Map> localizedResourceMessages) { + Map messages = loadMessages(resource); + if (messages == null) { + logger.debug("Source '{}' Locale resource ['{}'] messages was not found", source, resource); + return; } + + logger.debug("Source '{}' loads the resource['{}'] messages : {}", source, resource, messages); + validateMessages(messages, resource); + // Override the localized message if present + localizedResourceMessages.put(resource, messages); } - private void initializeResources(Iterable resources, Locale locale, Map> localizedMessages, - Set initializedResources) { - for (String resource : resources) { - initializeResource(resource, locale, localizedMessages, initializedResources); + protected void logMessage(String code, String resolvedCode, Locale locale, Locale resolvedLocale, Object[] args, + String messagePattern, String message) { + if (logger.isDebugEnabled()) { + logger.debug("Source '{}' gets Message[code : '{}' , resolvedCode : '{}' , locale : '{}' , resolvedLocale : '{}', args : '{}' , pattern : '{}'] : '{}'", + source, code, resolvedCode, locale, resolvedLocale, ArrayUtils.toString(args), messagePattern, message); } } - private void initializeResource(String resource, Locale locale, Map> localizedMessages, - Set initializedResources) { - Map messages = loadMessages(locale, resource); - validateMessages(messages, resource); - if (!isEmpty(messages)) { - logger.debug("Source '{}' loads the Locale '{}' resource['{}'] messages : {}", source, locale, resource, messages); - } else { - logger.debug("Source '{}' Locale '{}' resource not found['{}'] messages", source, locale, resource); - } - initializedResources.add(resource); - // Override the localized message if present - localizedMessages.put(locale, messages); + public Map> getLocalizedResourceMessages() { + return unmodifiableMap(this.localizedResourceMessages); + } + + @Override + public Set getInitializeResources() { + return localizedResourceMessages.keySet(); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(getClass().getSimpleName()) + .append("{source='").append(source).append('\'') + .append(", defaultLocale=").append(getDefaultLocale()) + .append(", supportedLocales=").append(getSupportedLocales()) + .append(", localizedResourceMessages=").append(localizedResourceMessages) + .append('}'); + return sb.toString(); } } diff --git a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractServiceMessageSource.java b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractServiceMessageSource.java index 6d6924b..ec075b1 100644 --- a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractServiceMessageSource.java +++ b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/AbstractServiceMessageSource.java @@ -173,8 +173,8 @@ protected static List resolveDerivedLocales(Locale locale) { } - protected String formatMessage(String message, Object... args) { - // Using slf4j format, future subclasses may re-implement formatting + protected String resolveMessage(String message, Object... args) { + // Using FormatUtils#format, future subclasses may re-implement formatting return format(message, args); } diff --git a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/DefaultServiceMessageSource.java b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/DefaultServiceMessageSource.java index 59c4086..1244e56 100644 --- a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/DefaultServiceMessageSource.java +++ b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/DefaultServiceMessageSource.java @@ -7,7 +7,6 @@ import java.util.Enumeration; import java.util.LinkedList; import java.util.List; -import java.util.Locale; import static io.microsphere.text.FormatUtils.format; @@ -33,7 +32,7 @@ protected String getResource(String resourceName) { } @Override - protected List loadAllPropertiesResources(Locale locale, String resource) throws IOException { + protected List loadAllPropertiesResources(String resource) throws IOException { ClassLoader classLoader = getClass().getClassLoader(); Enumeration resources = classLoader.getResources(resource); List propertiesResources = new LinkedList<>(); diff --git a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/PropertiesResourceServiceMessageSource.java b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/PropertiesResourceServiceMessageSource.java index 45da6d9..2566229 100644 --- a/microsphere-i18n-core/src/main/java/io/microsphere/i18n/PropertiesResourceServiceMessageSource.java +++ b/microsphere-i18n-core/src/main/java/io/microsphere/i18n/PropertiesResourceServiceMessageSource.java @@ -4,16 +4,15 @@ import java.io.IOException; import java.io.Reader; -import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Properties; import static io.microsphere.collection.CollectionUtils.isEmpty; import static io.microsphere.text.FormatUtils.format; import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; /** * {@link Properties} Resource {@link ServiceMessageSource} Class @@ -28,22 +27,22 @@ public PropertiesResourceServiceMessageSource(String source) { } @Override - protected final Map loadMessages(Locale locale, String resource) { + protected final Map loadMessages(String resource) { Map messages = emptyMap(); try { - Properties properties = loadAllProperties(locale, resource); + Properties properties = loadAllProperties(resource); if (!MapUtils.isEmpty(properties)) { messages = new HashMap<>(properties.size()); messages.putAll((Map) properties); } } catch (IOException e) { - throw new RuntimeException(format("Source '{}' Messages Properties Resource[locale : {}, name : {}] loading is failed", source, locale, resource), e); + throw new RuntimeException(format("Source '{}' Messages Properties Resource[name : {}] loading is failed", source, resource), e); } - return Collections.unmodifiableMap(messages); + return unmodifiableMap(messages); } - private Properties loadAllProperties(Locale locale, String resource) throws IOException { - List propertiesResources = loadAllPropertiesResources(locale, resource); + private Properties loadAllProperties(String resource) throws IOException { + List propertiesResources = loadAllPropertiesResources(resource); logger.debug("Source '{}' loads {} Properties Resources['{}']", source, propertiesResources.size(), resource); if (isEmpty(propertiesResources)) { return null; @@ -60,5 +59,5 @@ private Properties loadAllProperties(Locale locale, String resource) throws IOEx protected abstract String getResource(String resourceName); - protected abstract List loadAllPropertiesResources(Locale locale, String resource) throws IOException; + protected abstract List loadAllPropertiesResources(String resource) throws IOException; } diff --git a/microsphere-i18n-spring/src/main/java/io/microsphere/i18n/spring/PropertySourcesServiceMessageSource.java b/microsphere-i18n-spring/src/main/java/io/microsphere/i18n/spring/PropertySourcesServiceMessageSource.java index c4f40d5..166fb30 100644 --- a/microsphere-i18n-spring/src/main/java/io/microsphere/i18n/spring/PropertySourcesServiceMessageSource.java +++ b/microsphere-i18n-spring/src/main/java/io/microsphere/i18n/spring/PropertySourcesServiceMessageSource.java @@ -45,7 +45,7 @@ protected Locale getInternalLocale() { } @Override - protected List loadAllPropertiesResources(Locale locale, String resource) throws IOException { + protected List loadAllPropertiesResources(String resource) throws IOException { String propertyName = resource; String propertiesContent = environment.getProperty(propertyName); return hasText(propertiesContent) ? asList(new StringReader(propertiesContent)) : emptyList();