View Javadoc
1   package com.github.mygreen.supercsv.cellprocessor.constraint;
2   
3   import java.util.Collection;
4   
5   import com.github.mygreen.supercsv.annotation.constraint.CsvEquals;
6   import com.github.mygreen.supercsv.builder.FieldAccessor;
7   
8   /**
9    * {@link CsvEquals}による等値かどうか比較する際の値を提供するインタフェースです。
10   * <p>値を別ファイルやDBから取得する時などサービスクラスとして実装します。</p>
11   * <p>基本的な使い方は、 {@link CsvEquals}のJavaDocを参照してください。</p>
12   * 
13   * <h3 class="description">フィールドごとにリソースを切り替えたい場合</h3>
14   * <p>フィールドごとにリソースを切り替えたい場合は、メソッドの引数{@link FieldAccessor}で判定を行います。</p>
15   * <p>また、独自のパラメータを渡したい時は、独自のアノテーションを作成し、それをフィールドに付与して、
16   *    引数{@link FieldAccessor}から取得して判定します。
17   * </p>
18   * 
19   * <pre class="highlight"><code class="java">
20   * // 読み込むリソースを定義されているフィールドやクラスで分ける場合
21   * public class FileEqualedValueProvider implements {@literal EqualedValueProvider<Integer>} {
22   *     
23   *     {@literal @Override}
24   *     public {@literal Collection<Integer>} getEqualedValues(final FieldAccessor field) {
25   *         
26   *         final String path;
27   *         if(field.getDeclaredClass().equals(AdminCsv.class)) {
28   *             path = "equaled_value_admin.txt";
29   *         } else {
30   *             path = "equaled_value.txt";
31   *         }
32   *         
33   *         String lines;
34   *         try {
35   *              lines = Files.readAllLines(new File(path).toPath(), Charset.forName("UTF-8"));
36   *              
37   *         } catch (IOException e) {
38   *             throw new RuntimeException("fail reading the equaled value file.", e);
39   *         }
40   *         
41   *         // 読み取った値をInteger型に変換します。
42   *         return lines.stream()
43   *             .map(l {@literal ->} Integer.valueOf(l))
44   *             .collect(Collectors.toList());
45   *         
46   *     }
47   * }
48   * </code></pre>
49   * 
50   * <h3 class="description">Spring Frameworkと連携する場合</h3>
51   * <p>Spring Frameworkと連携している場合は、プロバイダクラスをSpringBeanとして登録しておくことでインジェクションされます。</p>
52   * <p>また、メソッド{@link EqualedValueProvider#getEqualedValues(FieldAccessor)}は、定義したフィールド単位に呼ばれるため、
53   *   多数のフィールドで定義していると何度も呼ばれ、効率が悪くなる場合があります。
54   *   <br>このようなときは、Spring Framework 3.1から追加された Cache Abstraction(キャッシュの抽象化)機能を使うと改善できます。
55   * </p>
56   * 
57   * <pre class="highlight"><code class="java">
58   * // SpringBeanとして登録する場合。
59   * {@literal @Service}
60   * {@literal @Transactional}
61   * public class EqualedValueProviderImpl implements {@literal EqualedValueProvider<Integer>} {
62   *     
63   *     // リポジトリのインジェクション
64   *     {@literal @Autowired}
65   *     private EqualedValueRepository equaledValueRepository;
66   *     
67   *     {@literal @Override}
68   *     public {@literal Collection<Integer>} getEqualedValues(final FieldAccessor field) {
69   *         
70   *         final Role role;
71   *         if(field.getDeclaredClass().equals(AdminCsv.class)) {
72   *             role = Role.admin;
73   *         } else {
74   *             role = Role.normal;
75   *         }
76   *         
77   *         return loadWords(role).stream()
78   *             .map(dto {@literal ->} dto.getValue())
79   *             .collect(Collectors.toList());
80   *         
81   *     }
82   *     
83   *     // リポジトリから取得した内容をキャッシュする。
84   *     // 引数 role をキーにして、区別する。
85   *     {@literal @Transactional(readOnly = true)}
86   *     {@literal @Cacheable(cacheNames="equaledValues", key="#role")}
87   *     public {@literal List<EqualedDto>} loadWords(Role role) {
88   *          
89   *          if(role.euals(Role.admin)) {
90   *              return equaledValueRepository.findByRole(role);
91   *          } else {
92   *              return equaledValueRepository.findAll();
93   *          }
94   *          
95   *     }
96   * }
97   * </code></pre>
98   * 
99   * @since 2.0
100  * @author T.TSUCHIE
101  *
102  */
103 @FunctionalInterface
104 public interface EqualedValueProvider<T> {
105     
106     /**
107      * 比較対象の値を取得します。
108      * @param field フィールド情報
109      * @return 比較対処の値のリストを返します。
110      */
111     Collection<T> getEqualedValues(FieldAccessor field);
112     
113 }