/*
 * Copyright (C) 2005 NTT DATA Corporation
 * 
 */
package org.postgresforest.tool.action;

import java.util.ArrayList;
import java.util.Iterator;

import org.postgresforest.tool.ForestToolCommandLine;
import org.postgresforest.tool.db.DbBase;
import org.postgresforest.tool.db.ErrInfo;
import org.postgresforest.tool.db.GSCdata;
import org.postgresforest.tool.util.MessagesCommandLine;
import org.postgresforest.tool.util.StringReplaceUtil;

/**
 * アクション基底クラス
 * 
 * アクションクラスでの共通定義、処理を定義
 * 
 */
abstract public class ActionBase {

	protected GSCdata m_gsc = null;

	/**
	 * @param gsc
	 */
	public ActionBase(GSCdata gsc) {
		super();
		m_gsc = gsc;
	}
	
	/**
	 * データベース接続処理
	 * 
	 * データベースアクセスクラスのconnectメソッドを呼び出し、データベースへ接続する。
	 * 失敗時には、リクエストクラスにエラー情報をセットする。
	 * 
	 * @param db データベースアクセスクラス
	 * @param request	リクエストクラス
	 * @return	true:接続成功.false:接続失敗
	 */
	protected boolean connect(DbBase db) {


		return 	connect(db,false);

	}

	/**
	 * データベース接続処理
	 * 
	 * データベースアクセスクラスのconnectメソッドを呼び出し、データベースへ接続する。
	 * 失敗時には、リクエストクラスにエラー情報をセットする。
	 * 
	 * @param db データベースアクセスクラス
	 * @param request	リクエストクラス
	 * @return	true:接続成功.false:接続失敗
	 */
	protected boolean connect(DbBase db, boolean autocommit) {

		if (!db.connect(autocommit)) {

			setAccessErrs("errors.db.connect", db);

			return false;
		}

		return true;

	}

	
	/**
	 * templateデータベース接続処理
	 * 
	 * データベースアクセスクラスのconnectTemlateメソッドを呼び出し、
	 * "template1"データベースへ接続する。
	 * 失敗時には、リクエストクラスにエラー情報をセットする。
	 * 
	 * @param db データベースアクセスクラス
	 * @param request	リクエストクラス
	 * @return	true:接続成功.false:接続失敗
	 */
	protected boolean connectTemlate(DbBase db) {

		if (!db.connectTemplate()) {

			setAccessErrs("errors.db.connect", db);

			return false;
		}

		return true;

	}

	/**
	 * 検索用データベース接続処理
	 * 
	 * データベースアクセスクラスのconnectSelectメソッドを呼び出し、
	 * データベースへ接続する。
	 * 失敗時には、リクエストクラスにエラー情報をセットする。
	 * 
	 * @param db データベースアクセスクラス
	 * @param request	リクエストクラス
	 * @return	true:接続成功.false:接続失敗
	 */
	protected boolean connectSelect(DbBase db) {
		//TODOMASU ほんとにこんなことしていいの？
		if(db == null){
			return false;
		}
		if (!db.connectSELECT()) {

			setAccessErrs("errors.db.connect", db);

			return false;
		}

		return true;

	}

	/**
	 * データベースアクセスエラー処理
	 * 
	 * メッセージのkeyを”errors.db”でActionErrorsの設定
	 * 
	 * @param db データベースアクセスクラス
	 * @param request	リクエストクラス
	 */
	protected void setAccessErrs(DbBase db) {
		setAccessErrs("errors.db", db);
	}

	/**
	 * データベースアクセスエラー処理
	 * 
	 * エラーメッセージのkeyでActionErrorを生成し、
	 * データベースアクセスクラスからエラー情報を取り出し、
	 * 接続先と、エラーメッセージのActionErrorを生成。
	 * ActionErroesに格納し、リクエストクラスへ登録する。
	 * 
	 * @param key　エラーメッセージのkey	
	 * @param db データベースアクセスクラス
	 * @param request	リクエストクラス
	 */
	protected void setAccessErrs(
		String key,
		DbBase db) {
		
//		ForestToolPlugin plugin = ForestToolPlugin.getDefault();
		ForestToolCommandLine plugin = ForestToolCommandLine.getDefault();

//		try{
//			Exception exception = null;
			String errMessage = "";
			
			ArrayList errInfoList = db.getErrInfoList();
			for (Iterator iter = errInfoList.iterator(); iter.hasNext();) {
				ErrInfo errInfo = (ErrInfo) iter.next();
				
				StringReplaceUtil strUtil =
					new StringReplaceUtil(MessagesCommandLine.getString("errors.db.detail"));
				strUtil.set(1, errInfo.getUrl());
				strUtil.set(2, errInfo.getErrMessage());
				errMessage = errMessage + strUtil.get() + "\n";
			}
			// @@@ Todo
			System.out.println(errMessage);
			
			/*
			IStatus status = new Status(IStatus.ERROR,
					plugin.getBundle().getSymbolicName(),
					0,
					errMessage,
					exception);
		
			throw new CoreException(status);
			
		} catch (CoreException e){
			//エラーダイアログ表示
			MsgDialogUtil.err( 
					Messages.getString(key), 
					e.getStatus());
			
			//エラーログ出力
			IStatus status = new Status(IStatus.ERROR,
					plugin.getBundle().getSymbolicName(),
					0,
					Messages.getString(key),
					e);
			plugin.getLog().log(status);
		} finally{
*/
			db.clearErrInfoList();
//		}
	}

}
