メタデータ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 件のコメント:
コメントを投稿