2015年7月19日日曜日

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

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

package dao.impl;

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

import util.MetaDataComparator;
import util.PropUtil;
import util.SvFile;
import dao.MetaDataDao;
import entity.MetaData;
import exception.ApplicationInternalException;

/**
 * メタデータDAO(実装)
 */
public class MetaDataDaoImpl implements MetaDataDao {

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

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

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

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

    /** 説明インデックス */
    private static final int INDEX_DESCRIPTION = 3;

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

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

    /** メタデータID最大値 */
    private int maxMetaDataId = 0;

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

        // メタデータIDの最大値を算出する(採番のため)
        maxMetaDataId = 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_META_DATA_ID)) > maxMetaDataId) {
                maxMetaDataId = Integer
                        .parseInt(svLine.get(INDEX_META_DATA_ID));
            }
        }
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.MetaDataDao#insert(entity.MetaData)
     */
    @Override
    public int insert(MetaData metaData) {

        // メタデータIDを採番するので、メタデータID最大値をインクリメントする
        maxMetaDataId++;

        // メタデータをSV行データに変換する
        List<String> svLine = new ArrayList<String>();
        svLine.add(INDEX_TABLE_NAME, TABLE_NAME);
        svLine.add(INDEX_META_DATA_ID, Integer.toString(maxMetaDataId));
        svLine.add(INDEX_META_DATA_NAME, metaData.getMetaDataName());
        if (metaData.getDescription() == null) {
            svLine.add(INDEX_DESCRIPTION, "");
        } else {
            svLine.add(INDEX_DESCRIPTION, metaData.getDescription());
        }
        if (metaData.getDefaultValue() == null) {
            svLine.add(INDEX_DEFAULT_VALUE, "");
        } else {
            svLine.add(INDEX_DEFAULT_VALUE, metaData.getDefaultValue());
        }
        if (metaData.getParentMetaDataId() == null) {
            svLine.add(INDEX_PARENT_META_DATA_ID, "");
        } else {
            svLine.add(INDEX_PARENT_META_DATA_ID, metaData
                    .getParentMetaDataId().toString());
        }

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

        // 引数のエンティティには採番したメタデータIDを設定する
        metaData.setMetaDataId(Integer.valueOf(maxMetaDataId));

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

    /*
     * (非 Javadoc)
     *
     * @see dao.MetaDataDao#get(java.lang.Integer)
     */
    @Override
    public MetaData get(Integer metaDataId) {

        // 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_META_DATA_ID)).equals(
                            metaDataId)) {

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

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

    /*
     * (非 Javadoc)
     *
     * @see dao.MetaDataDao#hasMetaData(java.lang.String)
     */
    @Override
    public boolean hasMetaData(String metaDataName) {

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

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

            // メタデータ名が見つかった場合は、trueを戻す(2列目、index=1がメタデータ名)
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && svLine.get(INDEX_META_DATA_NAME).equals(metaDataName)) {
                return true;
            }
        }

        // それ以外の場合はfalseを戻す
        return false;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.MetaDataDao#findRootMeta()
     */
    @Override
    public List<MetaData> findRootMeta() {

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

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

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

        // メタデータのソートを行う
        Collections.sort(metaDataList, new MetaDataComparator());

        // メタデータリストを呼び出し側に戻す
        return metaDataList;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.MetaDataDao#findChildMeta(java.lang.Integer)
     */
    @Override
    public List<MetaData> findChildMeta(Integer metaDataId) {

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

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

            // 親メタデータIDが引数と一致するデータがあればリストに追加する
            if (svLine.get(INDEX_TABLE_NAME).equals(TABLE_NAME)
                    && svLine.get(INDEX_PARENT_META_DATA_ID).length() > 0
                    && Integer.valueOf(svLine.get(INDEX_PARENT_META_DATA_ID))
                            .equals(metaDataId)) {
                metaDataList.add(createEntity(svLine));
            }
        }

        // メタデータのソートを行う
        Collections.sort(metaDataList, new MetaDataComparator());

        // メタデータリストを呼び出し側に戻す
        return metaDataList;
    }

    /*
     * (非 Javadoc)
     *
     * @see dao.MetaDataDao#update(entity.MetaData)
     */
    @Override
    public void update(MetaData metaData) {

        // 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_META_DATA_ID)).equals(
                            metaData.getMetaDataId())) {

                // メタデータを引数の値で更新する
                svLine.set(INDEX_META_DATA_NAME, metaData.getMetaDataName());
                if (metaData.getDescription() == null) {
                    svLine.set(INDEX_DESCRIPTION, "");
                } else {
                    svLine.set(INDEX_DESCRIPTION, metaData.getDescription());
                }
                if (metaData.getDefaultValue() == null) {
                    svLine.set(INDEX_DEFAULT_VALUE, "");
                } else {
                    svLine.set(INDEX_DEFAULT_VALUE, metaData.getDefaultValue());
                }
            }
        }
    }

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

        // 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_META_DATA_ID)).equals(
                            metaDataId)) {

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

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

    /*
     * (非 Javadoc)
     *
     * @see dao.MetaDataDao#save(java.lang.String)
     */
    @Override
    public void save(String fileName) {

        // データベースの内容を指定されたファイル名で示されるファイルに保存する
        SvFile svFile = new SvFile();
        try {
            svFile.save(fileName, SvFileDb.getInstance().getSvLineList());

        } catch (IOException e) {
            throw new ApplicationInternalException(
                    PropUtil.get("msg.err.dbSave"));
        }
    }

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

        // 行データからエンティティを作成する
        MetaData entity = new MetaData();
        entity.setMetaDataId(Integer.valueOf(svLine.get(INDEX_META_DATA_ID)));
        entity.setMetaDataName(svLine.get(INDEX_META_DATA_NAME));
        entity.setDescription(svLine.get(INDEX_DESCRIPTION));
        entity.setDefaultValue(svLine.get(INDEX_DEFAULT_VALUE));
        if (svLine.get(INDEX_PARENT_META_DATA_ID) != null
                && svLine.get(INDEX_PARENT_META_DATA_ID).length() > 0) {
            entity.setParentMetaDataId(Integer.valueOf(svLine
                    .get(INDEX_PARENT_META_DATA_ID)));
        }

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

0 件のコメント:

コメントを投稿