package com.gh.mygreen.xlsmapper.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;
import com.gh.mygreen.xlsmapper.cellconvert.CellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.DefaultCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.TypeBindException;
/**
* トリミングや初期値の設定、独自のクラスタイプを指定するためのアノテーションです。
*
* @author T.TSUCHIE
*
*/
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface XlsConverter {
/**
* 読み込み時、書き込み時にトリミングします。
* <ul>
* <li>シート上のセルのタイプ(分類)が数値などの文字列以外の場合は、トリム処理は行われません。
* <br>ただし、シートのセルタイプが文字列型で、Javaの型がString型以外の数値型やDate型などの場合は、変換する前にトリム処理を行います。
* </li>
* <li>値が空のセルをString型に読み込む場合、{@link #trim()}がfalseのときはnull設定されますが、
* トリムを有効にしていると空文字が設定されます。</li>
* </ul>
*
* <pre class="highlight"><code class="java">
* public class SampleRecord {
*
* {@literal @XlsColumn(columnName="ID")}
* {@literal @XlsConverter(defaultValue=" 123 ", trim=true)} // 属性defaultValueもトリム対象となる。
* private int id;
*
* {@literal @XlsColumn(columnName="名前")}
* {@literal @XlsConverter(trim=true)} // 空のセルを読み込むと空文字が設定される。
* private String name;
*
* }
* </code></pre>
*
* @return
*/
boolean trim() default false;
/**
* 'true'のとき書き込み時にセルの「折り返し設定」を有効にします。
* 'false'の場合は、既存の折り返し設定は変更せずに、テンプレートファイルの設定を引き継ぎます。</p>
* <p>属性{@link #wrapText()}と{@link #shrinkToFit()}の両方の値をtrueに指定する場合、
* {@link #shrinkToFit()}の設定が優先され、「縮小して全体を表示する」が有効になります。
* </p>
*
* <pre class="highlight"><code class="java">
* public class SampleRecord {
*
* {@literal @XlsColumn(columnName="ID")}
* {@literal @XlsConverter(wrapText=true)} // 「縮小して全体を表示する」が有効になる。
* private int id;
*
* }
* </code></pre>
*
* @return
*/
boolean wrapText() default false;
/**
* 'true'のとき書き込み時にセルの「縮小して表示」を有効にします。
* 'false'の場合は、既存の縮小して表示は変更せずに、テンプレートファイルの設定を引き継ぎます。
* <p>属性{@link #wrapText()}と{@link #shrinkToFit()}の両方の値をtrueに指定する場合、
* {@link #shrinkToFit()}の設定が優先され、「縮小して全体を表示する」が有効になります。
* </p>
*
* <pre class="highlight"><code class="java">
* public class SampleRecord {
*
* {@literal @XlsColumn(columnName="名前")}
* {@literal @XlsConverter(shrinkToFit=true)} //「折り返して全体を表示する」が有効になる。
* private String name;
*
* {@literal @XlsColumn(columnName="備考")}
* {@literal @XlsConverter(shrinkToFit=false)} // 設定しない場合は、テンプレート設定が有効になる。
* private String comment;
*
* }
* </code></pre>
*
* @return
*/
boolean shrinkToFit() default false;
/**
* 読み込み時または書き込み時のデフォルト値を指定します。
* <ul>
* <li>日付などの書式がある場合、専用のアノテーションで指定した書式{@link XlsDateConverter#javaPattern()}を元に、
* 文字列をそのオブジェクトに変換し処理します。
* </li>
* <li>指定したデフォルト値がマッピング先の型として不正な場合は、
* 通常の型変換エラーと同様に、例外 {@link TypeBindException} がスローされます。
* </li>
* <li>属性{@link #defaultValue()}を指定しない場合、プリミティブ型に対して読み込むと、その型の初期値が設定されます。
* 例えば、int型は0、doubleは0.0、booleanはfalse。char型は、'{@literal \}u0000'。
* <br>プリミティブ型のラッパークラスや参照型の場合は、nullが設定されます。
* </li>
* <li>char型にマッピングする場合、デフォルト値が2文字以上でも、先頭の位置文字がマッピングされます。</li>
* </ul>
*
* <pre class="highlight"><code class="java">
* public class SampleRecord {
*
* {@literal @XlsColumn(columnName="ID")}
* {@literal @XlsConverter(defaultValue="-1")}
* private int id;
*
* {@literal @XlsColumn(columnName="更新日時")}
* {@literal @XlsConverter(defaultValue="2010/01/01")} // 属性javaPatternで指定した書式に沿った値を指定します。
* {@literal @XlsDateConverter(javaPattern="yyyy/MM/dd")}
* private Date updateTime;
*
* }
* </code></pre>
* @return
*/
String defaultValue() default"";
/**
* 独自のConverterで処理したい場合に指定します。
* <p>本ライブラリで対応していない型に変換したい時など、属性{@link #converterClass()}で独自のConverter用クラスを指定します。</p>
* <p>Converterクラスは、インタフェース {@link CellConverter}を実装する必要があります。</p>
* <p>詳細なサンプルは、本プログラムのパッケージ「com.gh.mygreen.xlsmapper.cellconvert.converter」以下のクラスを参照してください。
* <br>または、マニュアル <a href="/xlsmapper/sphinx/extension_cellconverter.html" target="_blank">CellConverterの拡張</a>を参照してください。
* </p>
*
* <pre class="highlight"><code class="java">
* // CellConverterの定義
* public class LocaleDateConverter extends {@literal CellConverter<LocaleDate>} {
*
* // シート読み込み時のExcel Cell => Javaオブジェクトに変換する。
* {@literal @Override}
* public LocaleDate toObject(final Cell cell, final FieldAdaptor adaptor, final XlsMapperConfig config)
* throws XlsMapperException {
* {@literal //TODO:} 実装する
* }
*
* //シート書き込み時のJavaオブジェクト => Excel Cellに変換する。
* {@literal @Override}
* Cell toCell(FieldAdaptor adaptor, LocaleDate targetValue, Sheet sheet, int column, int row, XlsMapperConfig config) throws XlsMapperException;
* {@literal //TODO:} 実装する
* }
* }
*
* // 独自CellConverterの指定
* public class SampleRecord {
*
* // フィールド独自のCellConveterの設定
* {@literal @XlsColumn(columnName="更新日付")}
* {@literal @XlsConverter(converterClass=LocaleDateConvereter.class)}
* private LocaleDate localeDate;
*
* }
* </code></pre>
*
* @return {@link CellConverter}の実装クラスを指定します。
*/
@SuppressWarnings("rawtypes")
Class<? extends CellConverter> converterClass() default DefaultCellConverter.class;
}