package com.gh.mygreen.xlsmapper.validation; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.ResourceBundle; /** * Default implementation that resolves messages based on the registered resource bundles. * * @author T.TSUCHIE * */ public class ResourceBundleMessageResolver implements MessageResolver { /** * ユーザ提供のメッセージファイルの名称。 */ public static final String USER_VALIDATION_MESSAGES = "SheetValidationMessages"; /** * 標準のメッセージファイルの名称。 */ public static final String DEFAULT_VALIDATION_MESSAGES = String.format("%s.%s", ResourceBundleMessageResolver.class.getPackage().getName(), USER_VALIDATION_MESSAGES); private final Map<ResourceBundle, List<String>> messageBundleKeys = new HashMap<ResourceBundle, List<String>>(8); private final LinkedList<ResourceBundle> messageBundles = new LinkedList<ResourceBundle>(); public static final ResourceBundleMessageResolver INSTANCE = new ResourceBundleMessageResolver(); public ResourceBundleMessageResolver() { // add the message bundle for the pre-built constraints in the default locale addMessageBundle(ResourceBundle.getBundle(DEFAULT_VALIDATION_MESSAGES)); try { // ローカルのメッセージファイルの読み込み addMessageBundle(ResourceBundle.getBundle(USER_VALIDATION_MESSAGES)); } catch(Throwable e) { } } public ResourceBundleMessageResolver(final ResourceBundle messageBundle) { this(); addMessageBundle(messageBundle); } /** * {@inheritDoc} */ public String getMessage(final String code) { for (final ResourceBundle bundle : messageBundles) { final List<String> keys = messageBundleKeys.get(bundle); if (keys.contains(code)) return bundle.getString(code); } return null; } /** * Adds a message bundle * * @param messageBundle * @return true if the bundle was registered and false if it was already registered */ public final boolean addMessageBundle(final ResourceBundle messageBundle) { if (messageBundles.contains(messageBundle)) return false; messageBundles.addFirst(messageBundle); final List<String> keys = new ArrayList<String>(); for (final Enumeration<String> keysEnum = messageBundle.getKeys(); keysEnum.hasMoreElements();) { keys.add(keysEnum.nextElement()); } messageBundleKeys.put(messageBundle, keys); return true; } /** * Removes the message bundle * * @param messageBundle * @return true if the bundle was registered and false if it wasn't registered */ public boolean removeMessageBundle(final ResourceBundle messageBundle) { if (!messageBundles.contains(messageBundle)) return false; messageBundles.remove(messageBundle); return true; } }