サブスタンス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 件のコメント:
コメントを投稿