1 package com.github.mygreen.supercsv.cellprocessor.constraint;
2
3 import java.util.Collection;
4
5 import com.github.mygreen.supercsv.annotation.constraint.CsvWordForbid;
6 import com.github.mygreen.supercsv.builder.FieldAccessor;
7
8 /**
9 * {@link CsvWordForbid}による禁止語彙のチェックを行う際の語彙を提供するためのインタフェースです。
10 * <p>語彙を別ファイルやDBから取得する時などサービスクラスとして実装します。</p>
11 * <p>基本的な使い方は、 {@link CsvWordForbid}の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 FileForbiddenWordProvider implements ForbiddenWordProvider {
22 *
23 * {@literal @Override}
24 * public {@literal Collection<String>} getForbiddenWords(final FieldAccessor field) {
25 *
26 * final String path;
27 * if(field.getDeclaredClass().equals(AdminCsv.class)) {
28 * path = "forbbidden_word_admin.txt";
29 * } else {
30 * path = "forbbidden_word.txt";
31 * }
32 *
33 * try {
34 * return Files.readAllLines(new File(path).toPath(), Charset.forName("UTF-8"));
35 *
36 * } catch (IOException e) {
37 * throw new RuntimeException("fail reading the forbidden words file.", e);
38 * }
39 *
40 * }
41 * }
42 * </code></pre>
43 *
44 * <h3 class="description">Spring Frameworkと連携する場合</h3>
45 * <p>Spring Frameworkと連携している場合は、プロバイダクラスをSpringBeanとして登録しておくことでインジェクションされます。</p>
46 * <p>また、メソッド{@link ForbiddenWordProvider#getForbiddenWords(FieldAccessor)}は、定義したフィールド単位に呼ばれるため、
47 * 多数のフィールドで定義していると何度も呼ばれ、効率が悪くなる場合があります。
48 * <br>このようなときは、Spring Framework 3.1から追加された Cache Abstraction(キャッシュの抽象化)機能を使うと改善できます。
49 * </p>
50 *
51 * <pre class="highlight"><code class="java">
52 * // SpringBeanとして登録する場合。
53 * {@literal @Service}
54 * {@literal @Transactional}
55 * public class ForbiddenWordProviderImpl implements ForbiddenWordProvider {
56 *
57 * // リポジトリのインジェクション
58 * {@literal @Autowired}
59 * private ForbiddenWordRepository forbiddenWordRepository;
60 *
61 * {@literal @Override}
62 * public {@literal Collection<String>} getForbiddenWords(final FieldAccessor field) {
63 *
64 * final Role role;
65 * if(field.getDeclaredClass().equals(AdminCsv.class)) {
66 * role = Role.admin;
67 * } else {
68 * role = Role.normal;
69 * }
70 *
71 * return loadWords(role).stream()
72 * .map(dto {@literal ->} dto.getWord())
73 * .collect(Collectors.toList());
74 *
75 * }
76 *
77 * // リポジトリから取得した内容をキャッシュする。
78 * // 引数 role をキーにして、区別する。
79 * {@literal @Transactional(readOnly = true)}
80 * {@literal @Cacheable(cacheNames="forbbidenWords", key="#role")}
81 * public {@literal List<WordDto>} loadWords(Role role) {
82 *
83 * if(role.euals(Role.admin)) {
84 * return forbiddenWordRepository.findByRole(role);
85 * } else {
86 * return forbiddenWordRepository.findAll();
87 * }
88 *
89 * }
90 * }
91 * </code></pre>
92 *
93 * @since 2.0
94 * @author T.TSUCHIE
95 *
96 */
97 @FunctionalInterface
98 public interface ForbiddenWordProvider {
99
100 /**
101 * 語彙の一覧を取得します。
102 * @param field フィールド情報。フィールドによって取得するリソースを切り替える際に利用します。
103 * @return 語彙を返します。チェック対象の文字がない場合は、空のリストを返します。
104 */
105 Collection<String> getForbiddenWords(FieldAccessor field);
106
107 }