/*
!=======================================================================
!
!  PROGRAM  PHASE-Viewer  (PHASE-Viewer 2014.01 ver.3.3.0)
!
!  Created on ----
!  AUTHOR(S): KOGA, Junichiro
!  File : OldOutputParser.java
!  
!  Contact address :  Phase System Consortium
!                     E-mail: phase_system@nims.go.jp URL https://azuma.nims.go.jp
!
!
!   Since 2002, this program set had been intensively developed as a part of the following 
!  national projects supported by the Ministry of Education, Culture, Sports, Science and
!  Technology (MEXT) of Japan; "Frontier Simulation Software for Industrial Science
!  (FSIS)" from 2002 to 2005, "Revolutionary Simulation Software (RSS21)" from 2006 to
!  2008. "Research and Development of Innovative Simulation Software (RISS)" from 2008
!  to 2013. These projects is lead by the Center for Research on Innovative Simulation 
!  Software (CISS), the Institute of Industrial Science (IIS), the University of Tokyo.
!   Since 2013, this program set has been further developed centering on PHASE System
!  Consortium. 
!   The activity of development of this program set has been supervised by Takahisa Ohno.
!
!=======================================================================
 */
package ciss.phase_viewer.common;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Vector;

public abstract class OldOutputParser {

    public final static String CR = System.getProperty("line.separator") /*
                                                                          * !<
                                                                          * 改行コード
                                                                          */;

    /** number of columns for data */
    private int numColumns;

    /** number of rows for data */
    private int numRows;

    /** string for header info */
    private String header = new String();

    /** vector for column name */
    private Vector columnName = new Vector();

    /** vector for column data */
    private Vector dataColumn = new Vector();

    /** vector for row data (referance to dataColumn) */
    private Vector dataRow = new Vector();

    /** output filename to be parsed */
    private String filename;

    /** default constructor */
    public OldOutputParser() {
    }

    /**
     * @param filename
     *            パースすべきファイルのファイル名.
     */
    public OldOutputParser(String filename) {
        this.filename = filename;
    }

    /**
     * パースしたいファイルのファイル名をセット.
     * 
     * @param filename
     *            パースすべきファイルのファイル名.
     */
    public void setFileName(String filename) {
        this.filename = filename;
    }

    /**
     * カラム数の設定を行う.
     * 
     * @param numColumns
     *            カラム数.
     */
    public void setNumColumns(int numColumns) {
        this.numColumns = numColumns;
    }

    /**
     * カラム数の取得.
     * 
     * @return カラム数.
     */
    public int getNumColumns() {
        return this.numColumns;
    }

    /**
     * データの行数を設定する.
     * 
     * @param numRows
     *            データの行数.
     */
    public void setNumRows(int numRows) {
        this.numRows = numRows;
    }

    /**
     * データの行数を取得する.
     * 
     * @return データの行数.
     */
    public int getNumRows() {
        return this.numRows;
    }

    /**
     * ヘッダーを取得する.
     * 
     * @return ヘッダー.
     */
    public String getHeader() {
        return this.header;
    }

    /**
     * ヘッダーを設定する. ヘッダーストリングは, 順次足しこまれるだけで 改行コードが付加されるわけではない点に注意.
     * 
     * @param header_str
     *            ヘッダー
     */
    public void addHeader(String header_str) {
        this.header = this.header + header_str;
    }

    /**
     * カラムの名前を保持したVectorオブジェクトを取得.
     * 
     * @return カラム名Vector
     */
    public Vector getColumnName() {
        return this.columnName;
    }

    /**
     * カラム名ベクトルに, 新たなカラム名を足しこむ.
     * 
     * @param columnname
     *            新しいカラム名.
     */
    public void addColumnName(String columnname) {
        columnName.addElement(columnname.toString());
    }

    /**
     * 行を保持したVectorオブジェクトを取得.
     * 
     * @return 行ベクトル.
     */
    public Vector getDataRow() {
        return this.dataRow;
    }

    /**
     * 識別子の数を取得.
     * 
     * @return 識別子数.
     */
    public int getNumIdent() {
        return columnName.size();
    }

    /**
     * 新たデータ領域にカラムを足しこむ.
     * 
     * @param data_str
     *            足しこみたい文字列.
     */
    public void addDataColumn(String data_str) {
        this.dataColumn.addElement(data_str.toString());
    }

    /**
     * カラムベクトルを返す. ただし「カラムベクトル」は一時的にしか 存在しないことに注意が必要.
     * 
     * @return カラムデータ.
     */
    protected Vector getDataColumn() {
        return this.dataColumn;
    }

    /**
     * 行Vectorに, カラムベクトルを足す.
     */
    public void addDataRow() {
        this.dataRow.addElement(dataColumn.clone());
        dataColumn.clear();
    }

    /**
     * 指定のファイルを読み込み, 順次パースしていく.
     */
    public void readFile() {
        try {
            FileReader freader = new FileReader(filename);
            BufferedReader breader = new BufferedReader(freader);
            String str = new String();
            while ((str = breader.readLine()) != null) {
                parseString(str);
            }
            freader.close();
            processData();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("failed read from file " + filename);
        }
        try {
            setNumRows(dataRow.size());
        } catch (Exception e) {
            e.printStackTrace();
            setNumRows(0);
        }
    }

    /**
     * ファイル読み込み中に各行でいちいち呼ばれるメソッド. このメソッドを 適切に実装することによってファイルをパースすることができるようになる.
     */
    public abstract void parseString(String str);

    /**
     * このメソッドはファイルからの読み込みが終了してから呼ばれる. 一行一行では対応できないパース項目がある場合, このメソッドを実装する
     * ことによって対処できる.
     */
    protected void processData() {
    }

}
