package com.github.mygreen.supercsv.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* ライフサイクルイベントをハンドリングするためのアノテーションです。
* <p>レコードの書き込み後に、このアノテーションを付与した任意のメソッドが実行されます。</p>
*
* <ul>
* <li>戻り値なしのpublicメソッドに付与する必要があります。</li>
* <li>引数は、次の任意の値が指定可能で、定義順は関係ありません。
* <br>引数を取らないことも可能です。
* </li>
* </ul>
*
* <table class="description">
* <caption>メソッドに指定可能な引数一覧</caption>
* <thead>
* <tr>
* <th>引数のタイプ</th>
* <th>説明</th>
* </tr>
* </thead>
* <tbody>
* <tr>
* <td>{@link org.supercsv.util.CsvContext}</td>
* <td>CSVの1レコード分の情報。</td>
* </tr>
* <tr>
* <td>{@link com.github.mygreen.supercsv.validation.CsvBindingErrors}</td>
* <td>CSVの1レコード分のエラー情報。</td>
* </tr>
* <tr>
* <td>{@link Class}[]</td>
* <td>グループのクラス情報(配列)。</td>
* </tr>
* <tr>
* <td>処理対象のBeanクラス。</td>
* <td>処理対象のBeanオブジェクト。</td>
* </tr>
* </tbody>
* </table>
*
*
* <p>実装方法として、JavaBeanに直接処理を実装する方法と、リスナークラスを指定して別のクラスで実装する方法の2種類があります。</p>
*
* <h3 class="description">JavaBeanクラスに実装する場合</h3>
*
* <p>任意のメソッドにアノテーションを付与します。</p>
*
* <pre class="highlight"><code class="java">
* {@literal @CsvBean}
* public class SampleCsv {
*
* {@literal @CsvColumn(number=1)}
* private String name;
*
* {@literal @CsvPostWrite}
* public void onPostWrite(CsvContext csvContext, CsvBindingErrors bindingErrors) {
* //任意の処理の実装
*
* }
*
* // getter/setterは省略
* }
* </code></pre>
*
* <h3 class="description">リスナークラスに実装する場合</h3>
*
* <p>POJOであるリスナークラスの任意のメソッドにアノテーションを付与します。</p>
* <p>Spring Frameworkと連携している場合、リスナークラスをSpringBeanとして登録しているとでインジェクションできます。</p>
*
* <pre class="highlight"><code class="java">
* {@literal @CsvBean(listeners=SampleListener.class)} // リスナークラスの指定
* public class SampleCsv {
*
* {@literal @CsvColumn(number=1)}
* private String name;
*
* // getter/setterは省略
* }
*
* // SampleCsvに対するリスナー
* public static class SampleListener {
*
* {@literal @CsvPostWrite}
* public void onPostWrite(SampleCsv record, CsvContext csvContext, CsvBindingErrors bindingErrors) {
* //任意の処理の実装
*
* }
* }
* </code></pre>
*
* @since 2.0
* @author T.TSUCHIE
*
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CsvPostWrite {
}