View Javadoc
1   package com.github.mygreen.supercsv.validation.beanvalidation;
2   
3   import java.util.HashMap;
4   import java.util.Locale;
5   import java.util.Map;
6   import java.util.Objects;
7   
8   import javax.validation.metadata.ConstraintDescriptor;
9   
10  import com.github.mygreen.supercsv.localization.MessageInterpolator;
11  import com.github.mygreen.supercsv.localization.MessageResolver;
12  
13  /**
14   * SuperCsvAnnotationの{@link MessageInterpolator}とBeanValidationの{@link javax.validation.MessageInterpolator}をブリッジする。
15   * <p>BeanValidationのメッセージ処理をカスタマイズするために利用する。</p>
16   *
17   * @version 2.3
18   * @since 2.0
19   * @author T.TSUCHIE
20   *
21   */
22  public class MessageInterpolatorAdapter implements javax.validation.MessageInterpolator {
23      
24      private final MessageResolver messageResolver;
25      
26      private final MessageInterpolator csvMessageInterpolator;
27      
28      /**
29       * SuperCsvAnnotation用のメッセージソースとInterpolatorを指定してBeanValidationのMessageInterpolatorを作成します。
30       * 
31       * @param messageResolver SuperCsvAnnotation用のメッセージソース。
32       * @param csvMessageInterpolator SuperCsvAnnotation用のMessageInterpolator。
33       * @throws NullPointerException {@literal if messageResolver or csvMessageInterpolator is null.}
34       */
35      public MessageInterpolatorAdapter(final MessageResolver messageResolver, final MessageInterpolator csvMessageInterpolator) {
36          Objects.requireNonNull(messageResolver);
37          Objects.requireNonNull(csvMessageInterpolator);
38          
39          this.messageResolver = messageResolver;
40          this.csvMessageInterpolator = csvMessageInterpolator;
41      }
42      
43      @Override
44      public String interpolate(final String messageTemplate, final Context context) {
45          return csvMessageInterpolator.interpolate(messageTemplate, createMessageVariables(context), true, messageResolver);
46      }
47      
48      @Override
49      public String interpolate(final String messageTemplate, final Context context, final Locale locale) {
50          return csvMessageInterpolator.interpolate(messageTemplate, createMessageVariables(context), true, messageResolver);
51      }
52      
53      /**
54       * メッセージ中で利用可能な変数を作成する
55       * @param context コンテキスト
56       * @return メッセージ変数のマップ
57       */
58      private Map<String, Object> createMessageVariables(final Context context) {
59          
60          final Map<String, Object> vars = new HashMap<>();
61          
62          final ConstraintDescriptor<?> descriptor = context.getConstraintDescriptor();
63          for(Map.Entry<String, Object> entry : descriptor.getAttributes().entrySet()) {
64              final String attrName = entry.getKey();
65              final Object attrValue = entry.getValue();
66              
67              vars.put(attrName, attrValue);
68          }
69          
70          // 検証対象の値
71          vars.computeIfAbsent("validatedValue", key -> context.getValidatedValue());
72          
73          return vars;
74          
75      }
76      
77      public MessageResolver getMessageResolver() {
78          return messageResolver;
79      }
80      
81      public MessageInterpolator getCsvMessageInterpolator() {
82          return csvMessageInterpolator;
83      }
84      
85  }