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 }