package com.gh.mygreen.xlsmapper.validation.beanvalidation; import java.util.Enumeration; import java.util.Locale; import java.util.ResourceBundle; import javax.validation.MessageInterpolator; import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator; import com.gh.mygreen.xlsmapper.ArgUtils; import com.gh.mygreen.xlsmapper.validation.MessageResolver; /** * {@code MessageResolver}からメッセージを取得する {@link MessageInterpolator}。 * <p>BeanValidatorのメッセージの取得先をXlsMapper用の{@link MessageResolver}から取得するよう変更する場合に使用する。 * * @author T.TSUCHIE * */ public class MessageResolverInterpolator implements MessageInterpolator { private MessageInterpolator messageInterpolator; public MessageResolverInterpolator(final MessageResolver messageResolver) { ArgUtils.notNull("messageResolver", "messageResolver"); this.messageInterpolator = new ResourceBundleMessageInterpolator( new MessageResolverResourceBundleLocator(messageResolver)); } @Override public String interpolate(final String messageTemplate, final Context context) { return messageInterpolator.interpolate(messageTemplate, context); } @Override public String interpolate(final String messageTemplate, final Context context, Locale locale) { return messageInterpolator.interpolate(messageTemplate, context, locale); } private static class MessageResolverResourceBundleLocator implements ResourceBundleLocator { private final MessageResolver messageResolver; public MessageResolverResourceBundleLocator(final MessageResolver messageResolver) { ArgUtils.notNull(messageResolver, "messageResolver"); this.messageResolver = messageResolver; } public ResourceBundle getResourceBundle(Locale locale) { return new MessageResolverResourceBundle(this.messageResolver, locale); } } private static class MessageResolverResourceBundle extends ResourceBundle { private final MessageResolver messageResolver; private final Locale locale; public MessageResolverResourceBundle(final MessageResolver messageResolver, final Locale locale) { ArgUtils.notNull(messageResolver, "messageResolver"); this.messageResolver = messageResolver; this.locale = locale; } @Override protected Object handleGetObject(final String key) { return messageResolver.getMessage(key); } @Override public boolean containsKey(final String key) { return (messageResolver.getMessage(key) != null); } @Override public Enumeration<String> getKeys() { throw new UnsupportedOperationException( String.format("'%s' does not support enumerating its keys", getClass().getSimpleName())); } @Override public Locale getLocale() { return locale; } } }