2015年7月19日日曜日

[メタデータエディタ]SubstanceDaoImpl

サブスタンスDAOの実装クラス。
メタデータDAOと同じく、TSVファイルとのやり取りを記述している。

package dao.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import util.SubstanceComparator;
import dao.MetaDataDao;
import dao.SubstanceDao;
import entity.Substance;

public class SubstanceDaoImpl implements SubstanceDao {

    /** メタデータDAO */
    private MetaDataDao metaDataDao = null;

    public MetaDataDao getMetaDataDao() {
        return metaDataDao;
    }

    public void setMetaDataDao(MetaDataDao metaDataDao) {
        this.metaDataDao = metaDataDao;
    }

    /** テーブル名 */
    private static final String TABLE_NAME = "SUBSTANCE";

    /** テーブル名インデックス */
    private static final int INDEX_TABLE_NAME = 0;

    /** サブスタンスIDインデックス */
    private static final int INDEX_SUBSTANCE_ID = 1;

    /** データインデックス */
    private static final int INDEX_DATA = 2;

    /** デフォルト値インデックス */
    private static final int INDEX_DEFAULT_VALUE = 3;

    /** 親サブスタンスIDインデックス */
    private static final int INDEX_PARENT_SUBSTANCE_ID = 4;

    /** メタデータIDインデックス */
    private static final int INDEX_META_DATA_ID = 5;

    /** サブスタンスID最大値 */
    private int maxSubstanceId = 0;

    /**
     * コンストラクタ
     */
    public SubstanceDaoImpl() {

        // サブスタンスIDの最大値を算出する(採番のため)
        maxSubstanceId = 0;
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();
        for (List<String> svLine : svLineList) {
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && Integer.parseInt(svLine.get(INDEX_SUBSTANCE_ID)) > maxSubstanceId) {
                maxSubstanceId = Integer.parseInt(svLine
                        .get(INDEX_SUBSTANCE_ID));
            }
        }
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.SubstanceDao#insert(entity.Substance)
     */
    @Override
    public int insert(Substance substance) {

        // サブスタンスIDを採番するので、サブスタンスID最大値をインクリメントする
        maxSubstanceId++;

        // サブスタンスをSV行データに変換する
        List<String> svLine = new ArrayList<String>();
        svLine.add(INDEX_TABLE_NAME, TABLE_NAME);
        svLine.add(INDEX_SUBSTANCE_ID, Integer.toString(maxSubstanceId));
        svLine.add(INDEX_DATA, substance.getData());
        if (substance.getDefaultValue() == null) {
            svLine.add(INDEX_DEFAULT_VALUE, "");
        } else {
            svLine.add(INDEX_DEFAULT_VALUE, substance.getDefaultValue());
        }
        if (substance.getParentSubstanceId() == null) {
            svLine.add(INDEX_PARENT_SUBSTANCE_ID, "");
        } else {
            svLine.add(INDEX_PARENT_SUBSTANCE_ID, substance
                    .getParentSubstanceId().toString());
        }
        if (substance.getMetaDataId() == null) {
            svLine.add(INDEX_META_DATA_ID, "");
        } else {
            svLine.add(INDEX_META_DATA_ID, substance.getMetaDataId().toString());
        }

        // 作成した行データを追加する
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();
        svLineList.add(svLine);

        // 引数のエンティティには採番したサブスタンスIDを設定する
        substance.setSubstanceId(Integer.valueOf(maxSubstanceId));

        // 戻り値は常に1とする
        return 1;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.SubstanceDao#get(java.lang.Integer)
     */
    @Override
    public Substance get(Integer substanceId) {

        // SV行データリストを取得する
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();

        // 全てのSV行を処理するまでループ
        for (List<String> svLine : svLineList) {

            // 該当データを発見した場合
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && Integer.valueOf(svLine.get(INDEX_SUBSTANCE_ID)).equals(
                            substanceId)) {

                // 行データからエンティティを作成し、呼び出し側に戻す
                return createEntity(svLine);
            }
        }

        // データが見つからない場合はnullを戻す
        return null;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.SubstanceDao#findRootSubstance()
     */
    @Override
    public List<Substance> findRootSubstance() {

        // SV行データリストを取得する
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();

        // 全てのSV行を処理するまでループ
        List<Substance> substanceList = new ArrayList<Substance>();
        for (List<String> svLine : svLineList) {

            // 親サブスタンスIDがnullもしくは空のデータがあればリストに追加する
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && (svLine.get(INDEX_PARENT_SUBSTANCE_ID) == null || svLine
                            .get(INDEX_PARENT_SUBSTANCE_ID).length() == 0)) {
                substanceList.add(createEntity(svLine));
            }
        }

        // サブスタンスのソートを行う
        Collections.sort(substanceList, new SubstanceComparator());

        // サブスタンスリストを呼び出し側に戻す
        return substanceList;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.SubstanceDao#findChildSubstance(java.lang.Integer)
     */
    @Override
    public List<Substance> findChildSubstance(Integer substanceId) {

        // SV行データリストを取得する
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();

        // 全てのSV行を処理するまでループ
        List<Substance> substanceList = new ArrayList<Substance>();
        for (List<String> svLine : svLineList) {

            // 親サブスタンスIDが引数と一致するデータがあればリストに追加する
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && svLine.get(INDEX_PARENT_SUBSTANCE_ID) != null
                    && svLine.get(INDEX_PARENT_SUBSTANCE_ID).length() > 0
                    && Integer.valueOf(svLine.get(INDEX_PARENT_SUBSTANCE_ID))
                            .equals(substanceId)) {
                substanceList.add(createEntity(svLine));
            }
        }

        // サブスタンスのソートを行う
        Collections.sort(substanceList, new SubstanceComparator());

        // サブスタンスリストを呼び出し側に戻す
        return substanceList;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.SubstanceDao#findSubstanceByMetaDataId(java.lang.Integer)
     */
    @Override
    public List<Substance> findSubstanceByMetaDataId(Integer metaDataId) {

        // SV行データリストを取得する
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();

        // 全てのSV行を処理するまでループ
        List<Substance> substanceList = new ArrayList<Substance>();
        for (List<String> svLine : svLineList) {

            // 該当データを発見した場合
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && svLine.get(INDEX_META_DATA_ID) != null
                    && svLine.get(INDEX_META_DATA_ID).length() > 0
                    && Integer.valueOf(svLine.get(INDEX_META_DATA_ID)).equals(
                            metaDataId)) {

                // 行データからエンティティを作成し、呼び出し側に戻す
                substanceList.add(createEntity(svLine));
            }
        }

        // サブスタンスのソートを行う
        Collections.sort(substanceList, new SubstanceComparator());

        // サブスタンスリストを呼び出し側に戻す
        return substanceList;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.SubstanceDao#update(entity.Substance)
     */
    @Override
    public void update(Substance substance) {

        // SV行データリストを取得する
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();

        // 全てのSV行を処理するまでループ
        for (List<String> svLine : svLineList) {

            // 更新対象のサブスタンスを見つけた場合
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && Integer.valueOf(svLine.get(INDEX_SUBSTANCE_ID)).equals(
                            substance.getSubstanceId())) {

                // サブスタンスを引数の値で更新する
                svLine.set(INDEX_DATA, substance.getData());
                if (substance.getDefaultValue() == null) {
                    svLine.set(INDEX_DEFAULT_VALUE, "");
                } else {
                    svLine.set(INDEX_DEFAULT_VALUE, substance.getDefaultValue());
                }
            }
        }
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.SubstanceDao#delete(java.lang.Integer)
     */
    @Override
    public void delete(Integer substanceId) {

        // SV行データリストを取得する
        List<List<String>> svLineList = SvFileDb.getInstance().getSvLineList();

        // 全てのSV行を処理するまでループ
        for (List<String> svLine : svLineList) {

            // 削除対象のメタデータを見つけた場合
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && Integer.valueOf(svLine.get(INDEX_SUBSTANCE_ID)).equals(
                            substanceId)) {

                // メタデータを削除する
                svLineList.remove(svLine);

                // ループを抜ける
                break;
            }
        }
    }

    /**
     * SV行データからエンティティを作成します。
     *
     * @param svLine
     *            SV行データ
     * @return SV行データから作成したエンティティ
     */
    private Substance createEntity(List<String> svLine) {

        // 行データからエンティティを作成する
        Substance entity = new Substance();
        entity.setSubstanceId(Integer.valueOf(svLine.get(INDEX_SUBSTANCE_ID)));
        entity.setData(svLine.get(INDEX_DATA));
        if (svLine.get(INDEX_DEFAULT_VALUE) != null
                && svLine.get(INDEX_DEFAULT_VALUE).length() > 0) {
            entity.setDefaultValue(svLine.get(INDEX_DEFAULT_VALUE));
        }
        if (svLine.get(INDEX_PARENT_SUBSTANCE_ID) != null
                && svLine.get(INDEX_PARENT_SUBSTANCE_ID).length() > 0) {
            entity.setParentSubstanceId(Integer.valueOf(svLine
                    .get(INDEX_PARENT_SUBSTANCE_ID)));
        }
        entity.setMetaDataId(Integer.valueOf(svLine.get(INDEX_META_DATA_ID)));

        // メタデータDAOが存在する場合は、メタデータも読み込む
        if (metaDataDao != null) {
            entity.setMetaData(metaDataDao.get(entity.getMetaDataId()));
        }

        // エンティティを呼び出し側に戻す
        return entity;
    }
}

0 件のコメント:

コメントを投稿