ObjectCell.java

package com.github.mygreen.cellformatter;

import java.util.Date;

import com.github.mygreen.cellformatter.lang.ArgUtils;


/**
 * Javaのオブジェクトを直接フォーマットするための抽象クラス。
 *
 * @since 0.6
 * @author T.TSUCHIE
 *
 */
public abstract class ObjectCell<T> implements CommonCell {
    
    /**
     * 値
     */
    protected final T value;
    
    /**
     * フォーマットのインデックス
     */
    private final short formatIndex;
    
    /**
     * フォーマットの書式
     */
    protected final String formatPattern;
    
    /**
     * 値と書式のインデックス番号を指定するコンストラクタ。
     * <p>フォーマットの書式は、{@literal null}になります。
     * @param value フォーマット対象の値。
     * @param formatIndex 書式のインデックス番号。
     * @throws IllegalArgumentException {@literal value == null}
     * @throws IllegalArgumentException {@literal formatIndex < 0}
     * 
     */
    public ObjectCell(final T value, final short formatIndex) {
        ArgUtils.notNull(value, "value");
        ArgUtils.notMin(formatIndex, (short)0, "formatIndex");
        
        this.value = value;
        this.formatIndex = formatIndex;
        this.formatPattern = null;
    }
    
    /**
     * 値とその書式を指定するコンストラクタ。
     * <p>フォーマットのインデックス番号は、存在しないことを示す{@literal -1}となります。
     * @param value フォーマット対象の値。
     * @param formatPattern Excelの書式。
     * @throws IllegalArgumentException {@literal value == null}
     * @throws IllegalArgumentException {@literal formatPattern == null || formatPatter.length() == 0}.
     */
    public ObjectCell(final T value, final String formatPattern) {
        ArgUtils.notNull(value, "value");
        ArgUtils.notEmpty(formatPattern, "formatPattern");
        this.value = value;
        this.formatIndex = (short)-1;
        this.formatPattern = formatPattern;
    }
    
    /**
     * 値と、書式のインデックス番号、書式を指定するコンストラクタ。
     * @param value フォーマット対象の値。
     * @param formatIndex フォーマットのインデックス番号。
     * @param formatPattern Excelの書式。
     * @throws IllegalArgumentException {@literal value == null}
     * @throws IllegalArgumentException {@literal formatIndex < 0}
     * @throws IllegalArgumentException {@literal formatPattern == null || formatPatter.length() == 0}.
     * 
     */
    public ObjectCell(final T value, final short formatIndex, final String formatPattern) {
        ArgUtils.notNull(value, "value");
        ArgUtils.notMin(formatIndex, (short)0, "formatIndex");
        ArgUtils.notEmpty(formatPattern, "formatPattern");
        
        this.value = value;
        this.formatIndex = formatIndex;
        this.formatPattern = formatPattern;
    }
    
    /**
     * 設定した値を取得します。
     * @return コンストラクタで渡された値。
     */
    public T getValue() {
        return value;
    }
    
    @Override
    public short getFormatIndex() {
        return formatIndex;
    }
    
    /**
     * {@inheritDoc}
     * <p>コンストラクタで指定したフォーマットを返します。
     */
    @Override
    public String getFormatPattern() {
        return formatPattern;
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isText() {
        return false;
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isBoolean() {
        return false;
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isNumber() {
        return false;
    }
    
    /**
     * 設定した値の型と一致しない場合、このメソッドを呼ぶと{@link IllegalStateException}をスローします。
     */
    @Override
    public String getTextCellValue() {
        throw new IllegalStateException("not match value type.");
    }
    
    /**
     * 設定した値の型と一致しない場合、このメソッドを呼ぶと{@link IllegalStateException}をスローします。
     */
    @Override
    public boolean getBooleanCellValue() {
        throw new IllegalStateException("not match value type.");
    }
    
    /**
     * 設定した値の型と一致しない場合、このメソッドを呼ぶと{@link IllegalStateException}をスローします。
     */
    @Override
    public double getNumberCellValue() {
        throw new IllegalStateException("not match value type.");
    }
    
    /**
     * 設定した値の型と一致しない場合、このメソッドを呼ぶと{@link IllegalStateException}をスローします。
     */
    @Override
    public Date getDateCellValue() {
        throw new IllegalStateException("not match value type.");
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isDateStart1904() {
        return false;
    }
    
    /**
     * {@inheritDoc}
     * <p>常に、'A1'を返します。
     */
    @Override
    public String getCellAddress() {
        return "A1";
    }
}