// Path: src/main/java/org/bbreak/excella/reports/tag/RemoveParamParser.java
// public class RemoveParamParser extends ReportsTagParser<Object> {
// 
//     /**
//      * デフォルトタグ
//      */
//     public static final String DEFAULT_TAG = "$REMOVE";
// 
//     /**
//      * コンストラクタ
//      */
//     public RemoveParamParser() {
//         super( DEFAULT_TAG);
//     }
// 
//     /**
//      * コンストラクタ
//      * 
//      * @param tag タグ
//      */
//     public RemoveParamParser( String tag) {
//         super( tag);
//     }
// 
//     @Override
//     public ParsedReportInfo parse( Sheet sheet, Cell tagCell, Object data) throws ParseException {
//         // 解析結果の生成
//         ParsedReportInfo parsedReportInfo = new ParsedReportInfo();
//         parsedReportInfo.setRowIndex( tagCell.getRowIndex());
//         parsedReportInfo.setColumnIndex( tagCell.getColumnIndex());
//         parsedReportInfo.setDefaultRowIndex( tagCell.getRowIndex());
//         parsedReportInfo.setDefaultColumnIndex( tagCell.getColumnIndex());
//         return parsedReportInfo;
//     }
// 
//     @Override
//     public boolean useControlRow() {
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/org/bbreak/excella/reports/tag/ReportsTagParser.java
// public abstract class ReportsTagParser<T> extends TagParser<ParsedReportInfo> {
// 
//     /*
//      * (non-Javadoc)
//      * 
//      * @see org.bbreak.excella.core.tag.TagParser#parse(org.apache.poi.ss.usermodel.Sheet, org.apache.poi.ss.usermodel.Cell, java.lang.Object)
//      */
//     @Override
//     public abstract ParsedReportInfo parse( Sheet sheet, Cell tagCell, Object data) throws ParseException;
// 
//     /**
//      * コンストラクタ
//      * 
//      * @param tag タグ
//      */
//     public ReportsTagParser( String tag) {
//         super( tag);
//     }
// 
//     /**
//      * タグを制御行として扱うか否かを取得する。
//      * 
//      * @return true:制御行として削除／false:置換
//      */
//     public abstract boolean useControlRow();
// 
//     /**
//      * パラメータ情報よりパラメータ名で格納されている値を取得する。
//      * 
//      * @param paramInfo パラメータ情報
//      * @param paramName パラメータ名
//      * @return 置換する値
//      */
//     @SuppressWarnings( "unchecked")
//     public T getParamData( ParamInfo paramInfo, String paramName) {
//         if ( paramInfo == null || paramName == null) {
//             return null;
//         }
//         return ( T) paramInfo.getParam( getTag(), paramName);
//     }
// 
// }


import org.bbreak.excella.core.tag.TagParser;
import org.bbreak.excella.core.util.PoiUtil;
import org.bbreak.excella.core.util.TagUtil;
import org.bbreak.excella.reports.tag.RemoveParamParser;
import org.bbreak.excella.reports.tag.ReportsTagParser;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;
/*-
 * #%L
 * excella-reports
 * %%
 * Copyright (C) 2009 - 2019 bBreak Systems and contributors
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

package org.bbreak.excella.reports.listener;



/**
 * シート解析後にセル・列・行・制御行を削除するアダプタ
 * 
 * @since 1.0
 */
public class RemoveAdapter extends ReportProcessAdaptor {

    /**
     * 行
     */
    public static final String ROW = "row";

    /**
     * 列
     */
    public static final String COLUMN = "column";

    /**
     * セル
     */
    public static final String CELL = "cell";

    /**
     * 左方向にシフト（デフォルト）
     */
    public static final String LEFT = "left";

    /**
     * 上方向にシフト
     */
    public static final String UP = "up";

    /*
     * (non-Javadoc)
     * 
     * @see org.bbreak.excella.reports.listener.ReportProcessAdaptor#postParse(org.apache.poi.ss.usermodel.Sheet, org.bbreak.excella.core.SheetParser, org.bbreak.excella.core.SheetData)
     */
    @Override
    public void postParse( Sheet sheet, SheetParser sheetParser, SheetData sheetData) throws ParseException {

        int firstRowNum = sheet.getFirstRowNum();
        int lastRowNum = sheet.getLastRowNum();

        for ( int rowIndex = firstRowNum; rowIndex <= lastRowNum; rowIndex++) {

            Row row = sheet.getRow( rowIndex);
            if ( row != null) {
                int firstColNum = row.getFirstCellNum();
                int lastColNum = row.getLastCellNum() - 1;
                boolean isRowFlag = false;

                for ( int colIndex = firstColNum; colIndex <= lastColNum; colIndex++) {
                    Cell cell = row.getCell( colIndex);
                    if ( cell != null) {
// Path: src/main/java/org/bbreak/excella/reports/tag/RemoveParamParser.java
// public class RemoveParamParser extends ReportsTagParser<Object> {
// 
//     /**
//      * デフォルトタグ
//      */
//     public static final String DEFAULT_TAG = "$REMOVE";
// 
//     /**
//      * コンストラクタ
//      */
//     public RemoveParamParser() {
//         super( DEFAULT_TAG);
//     }
// 
//     /**
//      * コンストラクタ
//      * 
//      * @param tag タグ
//      */
//     public RemoveParamParser( String tag) {
//         super( tag);
//     }
// 
//     @Override
//     public ParsedReportInfo parse( Sheet sheet, Cell tagCell, Object data) throws ParseException {
//         // 解析結果の生成
//         ParsedReportInfo parsedReportInfo = new ParsedReportInfo();
//         parsedReportInfo.setRowIndex( tagCell.getRowIndex());
//         parsedReportInfo.setColumnIndex( tagCell.getColumnIndex());
//         parsedReportInfo.setDefaultRowIndex( tagCell.getRowIndex());
//         parsedReportInfo.setDefaultColumnIndex( tagCell.getColumnIndex());
//         return parsedReportInfo;
//     }
// 
//     @Override
//     public boolean useControlRow() {
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/org/bbreak/excella/reports/tag/ReportsTagParser.java
// public abstract class ReportsTagParser<T> extends TagParser<ParsedReportInfo> {
// 
//     /*
//      * (non-Javadoc)
//      * 
//      * @see org.bbreak.excella.core.tag.TagParser#parse(org.apache.poi.ss.usermodel.Sheet, org.apache.poi.ss.usermodel.Cell, java.lang.Object)
//      */
//     @Override
//     public abstract ParsedReportInfo parse( Sheet sheet, Cell tagCell, Object data) throws ParseException;
// 
//     /**
//      * コンストラクタ
//      * 
//      * @param tag タグ
//      */
//     public ReportsTagParser( String tag) {
//         super( tag);
//     }
// 
//     /**
//      * タグを制御行として扱うか否かを取得する。
//      * 
//      * @return true:制御行として削除／false:置換
//      */
//     public abstract boolean useControlRow();
// 
//     /**
//      * パラメータ情報よりパラメータ名で格納されている値を取得する。
//      * 
//      * @param paramInfo パラメータ情報
//      * @param paramName パラメータ名
//      * @return 置換する値
//      */
//     @SuppressWarnings( "unchecked")
//     public T getParamData( ParamInfo paramInfo, String paramName) {
//         if ( paramInfo == null || paramName == null) {
//             return null;
//         }
//         return ( T) paramInfo.getParam( getTag(), paramName);
//     }
// 
// }


// Path: src/main/java/org/bbreak/excella/reports/listener/RemoveAdapter.java
import org.bbreak.excella.core.tag.TagParser;
import org.bbreak.excella.core.util.PoiUtil;
import org.bbreak.excella.core.util.TagUtil;
import org.bbreak.excella.reports.tag.RemoveParamParser;
import org.bbreak.excella.reports.tag.ReportsTagParser;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;

/*-
 * #%L
 * excella-reports
 * %%
 * Copyright (C) 2009 - 2019 bBreak Systems and contributors
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

package org.bbreak.excella.reports.listener;



/**
 * シート解析後にセル・列・行・制御行を削除するアダプタ
 * 
 * @since 1.0
 */
public class RemoveAdapter extends ReportProcessAdaptor {

    /**
     * 行
     */
    public static final String ROW = "row";

    /**
     * 列
     */
    public static final String COLUMN = "column";

    /**
     * セル
     */
    public static final String CELL = "cell";

    /**
     * 左方向にシフト（デフォルト）
     */
    public static final String LEFT = "left";

    /**
     * 上方向にシフト
     */
    public static final String UP = "up";

    /*
     * (non-Javadoc)
     * 
     * @see org.bbreak.excella.reports.listener.ReportProcessAdaptor#postParse(org.apache.poi.ss.usermodel.Sheet, org.bbreak.excella.core.SheetParser, org.bbreak.excella.core.SheetData)
     */
    @Override
    public void postParse( Sheet sheet, SheetParser sheetParser, SheetData sheetData) throws ParseException {

        int firstRowNum = sheet.getFirstRowNum();
        int lastRowNum = sheet.getLastRowNum();

        for ( int rowIndex = firstRowNum; rowIndex <= lastRowNum; rowIndex++) {

            Row row = sheet.getRow( rowIndex);
            if ( row != null) {
                int firstColNum = row.getFirstCellNum();
                int lastColNum = row.getLastCellNum() - 1;
                boolean isRowFlag = false;

                for ( int colIndex = firstColNum; colIndex <= lastColNum; colIndex++) {
                    Cell cell = row.getCell( colIndex);
                    if ( cell != null) {
                        if ( cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains( RemoveParamParser.DEFAULT_TAG)) {