RecordOperation.java

package com.gh.mygreen.xlsmapper.fieldprocessor.impl;

import java.awt.Point;

import org.apache.poi.ss.usermodel.Cell;

import com.gh.mygreen.xlsmapper.annotation.XlsRecordOption;
import com.gh.mygreen.xlsmapper.util.ArgUtils;
import com.gh.mygreen.xlsmapper.util.CellPosition;


/**
 * シートのレコードの操作情報。
 * レコードの書き込み後、セルの入力規則やシートの名前の範囲を修正するために利用する。
 * 
 * @version 2.0
 * @since 0.3
 * @author T.TSUCHIE
 *
 */
public class RecordOperation {
    
    /** レコード操作のアノテーション */
    private final XlsRecordOption annotation;
    
    /** レコードのコピー回数 */
    private int countCopyRecord;
    
    /** レコードの挿入回数 */
    private int countInsertRecord;
    
    /** レコードの削除件数 */
    private int countDeleteRecord;
    
    /** 左上のセルの位置 */
    private Point topLeftPoisitoin;
    
    /** 右下のセルの位置 */
    private Point bottomRightPosition;
    
    public RecordOperation(final XlsRecordOption annotation) {
        this.annotation = annotation;
        this.countCopyRecord = 0;
        this.countInsertRecord = 0;
        this.countDeleteRecord = 0;
        
    }
    
    /**
     * レコードの操作用のアノテーションを取得する。
     * 
     * @since 2.0
     * @return 付与されていない場合は、属性がデフォルト値が設定される。
     */
    public XlsRecordOption getAnnotation() {
        return annotation;
    }
    
    /**
     * レコードのコピー回数を1つ増やす
     */
    public void incrementCopyRecord() {
        this.countCopyRecord++;
    }
    
    /**
     * レコードの挿入回数を1つ増やす
     */
    public void incrementInsertRecord() {
        this.countInsertRecord++;
    }
    
    /**
     * レコードの削除回数を1つ増やす
     */
    public void incrementDeleteRecord() {
        this.countDeleteRecord++;
    }
    
    /**
     * レコードの操作を行ったかどうか。
     * コピー処理、挿入処理、削除処理が該当する。
     * @return
     */
    public boolean isExecuteRecordOperation() {
        return isExecuteOverRecordOperation() || isDeleteRecord();
    }
    
    /**
     * レコードの操作を行っていないかどうか。
     * コピー処理、挿入処理、削除処理が該当する。
     * @return
     */
    public boolean isNotExecuteRecordOperation() {
        return !isExecuteRecordOperation();
    }

    
    /**
     * レコードが足りない時の操作を行ったかどうか。
     * コピー処理、挿入処理が該当する。
     * @return
     */
    public boolean isExecuteOverRecordOperation() {
        return isCopyRecord() || isInsertRecord();
    }
    
    /**
     * レコードが足りない時の操作を行っていないかどうか。
     * @return
     */
    public boolean isNotExecuteOverRecordOperation() {
        return !isExecuteOverRecordOperation();
    }
    
    /**
     * レコードの挿入回数が1以上かどうか。
     */
    public boolean isCopyRecord() {
        return countCopyRecord > 0;
    }
    
    /**
     * レコードの挿入回数が1以上かどうか。
     */
    public boolean isInsertRecord() {
        return countInsertRecord > 0;
    }
    
    /**
     * レコードの削除回数が1以上かどうか。
     */
    public boolean isDeleteRecord() {
        return countDeleteRecord > 0;
    }
    
    public int getCountInsertRecord() {
        return countInsertRecord;
    }
    
    public int getCountDeleteRecord() {
        return countDeleteRecord;
    }
    
    /**
     * セルの位置を元に左上、右下の端の位置を記憶する。
     * @param cell セル情報
     * @throws NullPointerException {@literal cell == null.}
     */
    public void setupCellPositoin(final Cell cell) {
        ArgUtils.notNull(cell, "cell");
        setupCellPositoin(cell.getRowIndex(), cell.getColumnIndex());
    }
    
    /**
     * アドレス情報を元に左上、右下の端の位置を記憶する。
     * @param address アドレス情報
     * @throws NullPointerException {@literal address == null.}
     */
    public void setupCellPositoin(final CellPosition address) {
        ArgUtils.notNull(address, "address");
        setupCellPositoin(address.getRow(), address.getColumn());
    }
    
    /**
     * セルの位置を元に左上、右下の端の位置を記憶する。
     * @param rowIndex 行番号(0から始まる)
     * @param columnIndex 列番号(0から始まる)
     */
    public void setupCellPositoin(final int rowIndex, final int columnIndex) {
        
        if(topLeftPoisitoin == null) {
            this.topLeftPoisitoin = new Point(columnIndex, rowIndex);
        }
        
        if(bottomRightPosition == null) {
            this.bottomRightPosition = new Point(columnIndex, rowIndex);
        }
        
        // 左上のセルの位置の設定
        if(topLeftPoisitoin.x > columnIndex) {
            this.topLeftPoisitoin.x = columnIndex;
        }
        
        if(topLeftPoisitoin.y > rowIndex) {
            this.topLeftPoisitoin.y = rowIndex;
        }
        
        // 右下のセルの位置の設定
        if(bottomRightPosition.x < columnIndex) {
            this.bottomRightPosition.x = columnIndex;
        }
        
        if(bottomRightPosition.y < rowIndex) {
            this.bottomRightPosition.y = rowIndex;
        }
    }
    
    /**
     * 左上端の座標を取得する。
     * @return 左上端の座標
     */
    public Point getTopLeftPoisitoin() {
        return topLeftPoisitoin;
    }
    
    /**
     * 右下端の座標を取得する。
     * @return 右下端の座標
     */
    public Point getBottomRightPosition() {
        return bottomRightPosition;
    }
    
}