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