/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/
package jp.co.ntt.lms.installer.core;

import java.io.File;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import jp.co.ntt.lms.installer.util.LoggerUtil;
import jp.co.ntt.lms.installer.util.StringUtil;
import jp.co.ntt.lms.installer.util.XmlUtil;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * インストーラ共通データ・オブジェクト。
 * ユーザが入力したデータや設定ファイルの値を一元管理するためのクラス。<br>
 *
 * @author T.Nishiki
 */
public class InstallerValues {
	/**
	 * ログ出力オブジェクト。
	 */
	private static Logger _logger;

	/**
	 * スタティック・イニシャライザ。<br>
	 * ログ出力オブジェクトを取得します。
	 */
	static {
		_logger = LoggerUtil.getLogger(InstallerControl.class);
	}

	/**
	 * インストーラ・プロパティＸＭＬのDOM Document。
	 */
	private Document _propertiesDoc;

	/**
	 * メッセージＸＭＬのDOM Document。
	 */
	private Document _messagesDoc;

	/**
	 * 各アクションで設定する値を保持するフィールド。
	 */
	private Map _actionValueMap;

	/**
	 * プロジェクトのベースとなるディレクトリ。
	 */
	private File _projectBaseDir;

	/**
	 * インストーラが存在するディレクトリ。
	 */
	private File _installerDir;

	/**
	 * インストーラの一時ファイル保存先ディレクトリ。
	 */
	private File _installerTempDir;

	/**
	 * リソースの基点となるパス。
	 */
	private String _resourceBasePath;

	/**
	 * インストーラで作成するディレクトリ・リスト。
	 */
	private List _madeDirectoriesList;

	/**
	 * 選択LOの選択状態。<br>
	 * 「LOを識別するキー名称文字列」をキーとし、
	 * 「そのLOを選択する場合はtrue、選択しない場合をfalseとするbooleanを
	 * ラップしたBooleanオブジェクト」を値とします。<br>
	 * また、このMapに登録されていないLOは、選択扱いとします。<br>
	 */
	private Map _optionLOSelcted;

	/**
	 * データベース種別。<br>
	 */
	private String _dbCategory;

	/**
	 * コンストラクタ。
	 * @param document インストーラ・プロパティＸＭＬのDOM Document。
	 * @throws InstallerException documentがnullの場合、
	 *          メッセージリソースを取得できない場合。
	 */
	InstallerValues(Document document)
			throws InstallerException {
		// メソッド開始ログ
		LoggerUtil.methodHead(_logger, "InstallerValues(" + document + ")");

		try {
			_propertiesDoc = document;
			_actionValueMap = Collections.synchronizedMap(new HashMap());
			// =================================================================
			// メッセージプロパティXMLの取得
			String messagesXmlURI = getProperty("resource.messages");
			// URIの指定がない場合はインストーラ・プロパティが兼任
			if (StringUtil.isEmpty(messagesXmlURI)) {
				_messagesDoc = _propertiesDoc;
			}
			// URIの指定がある場合、DOM Document化
			else {
				_messagesDoc
					= XmlUtil.convertXmlResourceToDocument(
						messagesXmlURI);
			}
			// =================================================================
			// インストーラがあるディレクトリ
			String userDir = System.getProperty("user.dir");
			_installerDir = new File(userDir);
			// =================================================================
			// プロジェクトのベースディレクトリ
			String projectPath = getProperty("path.project");
			_projectBaseDir
				= new File(_installerDir, projectPath).getCanonicalFile();
			// =================================================================
			// インストーラの一時ファイルを保存するディレクトリ
			String tempPath = getProperty("path.dir.installer.temp");
			_installerTempDir
				= new File(_installerDir, tempPath).getCanonicalFile();
			// =================================================================
			// インストーラの一時ファイルを保存するディレクトリ
			_resourceBasePath = getProperty("path.dir.resources");
			// =================================================================
			// インストーラで作成するディレクトリ・リスト
			_madeDirectoriesList = new ArrayList();
			// =================================================================
			// オプションLO選択状態
			_optionLOSelcted = new HashMap();
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
			throw new InstallerException(e);
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger, "InstallerValues(" + document + ")");
	}

	/**
	 * 各アクションで登録した値を取得します。
	 * @param name 登録したときの名称。
	 * @return nameに対応する値を登録していればその値を戻します。
	 *          登録されていなければnullを戻します。
	 */
	public InstallerActionValue getActionValue(String name) {
		return (InstallerActionValue)_actionValueMap.get(name);
	}

	/**
	 * 各アクション値を登録します。
	 * @param action actionValueを生成したクラス。
	 * @param actionValue 登録する値。
	 */
	void setActionValue(InstallerAction action,
			InstallerActionValue actionValue) {
		_logger.info("setActionValue(" + action + "," + actionValue + ")");
		_actionValueMap.put(action.getClass().getName(), actionValue);
	}

	/**
	 * 設定ファイルの内容に基づきアクションクラスを配列で取得します。
	 * @return 実行候補となるアクションクラスの配列。
	 * @throws InstallerException 取得処理中にエラーが発生した場合。
	 */
	public InstallerAction[] getActions()
			throws InstallerException {
		// メソッド開始ログ
		LoggerUtil.methodHead(_logger, "getActions()");
		InstallerAction[] actions = getActions("actions");
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger, "getActions()", actions);
		return actions;
	}

	/**
	 * 設定ファイルの内容に基づき復元用アクションクラスを配列で取得します。
	 * @return 実行候補となるアクションクラスの配列。
	 * @throws InstallerException 取得処理中にエラーが発生した場合。
	 */
	public InstallerAction[] getRestreActions()
			throws InstallerException {
		// メソッド開始ログ
		LoggerUtil.methodHead(_logger, "getRestreActions()");
		InstallerAction[] actions = getActions("restoreActions");
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger, "getRestreActions()", actions);
		return actions;
	}


	/**
	 * 設定ファイルの内容に基づきアクションクラスを配列で取得します。
	 * @param actionsTagName 取得するアクションを定義してある要素名。
	 * @return 実行候補となるアクションクラスの配列。
	 * @throws InstallerException 取得処理中にエラーが発生した場合。
	 */
	private InstallerAction[] getActions(String actionsTagName)
			throws InstallerException {
		// メソッド開始ログ
		LoggerUtil.methodHead(_logger, "getActions(" + actionsTagName + ")");

		InstallerAction[] actions = null;
		try {
			List list = new ArrayList();
			// アクションを定義しているノードリストの取得
			NodeList actionClassNodes = XPathAPI.selectNodeList(
				_propertiesDoc,
				"/installer/" + actionsTagName + "/action/@name" );
			// アクション数の取得
			int nodeLength = actionClassNodes.getLength();
			if (_logger.isLoggable(Level.INFO)) {
				_logger.log(Level.INFO,
					"Number of action classes:" + nodeLength);
			}
			// 全ノードについて、定義してあるクラスをロード
			for (int i = 0; i < nodeLength; i++) {
				Node actionClassNode = actionClassNodes.item(i);
				String actionClassName = actionClassNode.getNodeValue();
				if (_logger.isLoggable(Level.INFO)) {
					_logger.log(Level.INFO,
						"actionClassName[" + i + "]:" + actionClassName);
				}
				Class actionClass = Class.forName(actionClassName);
				InstallerAction action =
					(InstallerAction)actionClass.newInstance();
				list.add(action);
			}
			// リストを配列化
			actions = new InstallerAction[list.size()];
			list.toArray(actions);
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
			throw new InstallerException(e);
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getActions(" + actionsTagName + ")", actions);
		return actions;
	}

	/**
	 * メッセージを取得します。<br>
	 * @param messageKey メッセージを取得するためのキー文字列。
	 * @return messageKeyに対応するメッセージ。取得できない場合は空文字列。
	 */
	public String getMessage(String messageKey) {
		// メソッド開始ログ
		LoggerUtil.methodHead(_logger, "getMessage(" + messageKey + ")");
		String message = getMessage(messageKey, null);
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getMessage(" + messageKey + ")", message);
		return message;
	}

	/**
	 * メッセージを取得します。<br>
	 * メッセージ設定ファイルから、キーに対応するメッセージを取得し、
	 * 取得できた場合は、MessageFormatと渡された置換配列を利用して、
	 * メッセージを生成して戻します。
	 * @param messageKey メッセージを取得するためのキー文字列。
	 * @param params 置換配列。
	 * @return messageKeyに対応するメッセージ。取得できない場合は空文字列。
	 * @see java.text.MessageFormat
	 */
	public String getMessage(String messageKey, Object[] params) {
		// メソッド開始ログ
		String logMessage = null;
		if (LoggerUtil.isLoggableMethod(_logger)) {
			logMessage = "getMessage(" + messageKey
				+ "," + StringUtil.toString(params) + ")";
			LoggerUtil.methodHead(_logger, logMessage);
		}

		// このメソッドの戻り値
		String message = null;
		try {
			// 設定ファイルからメッセージ文字列を取得します。
			String messagePath =
				"/installer/messages/message[@id=\""
					+  messageKey + "\"]/text()";
			String messageProperty
				= XmlUtil.getNodeValue( _messagesDoc, messagePath );
			if (StringUtil.isEmpty(messageProperty)) {
				message = "";
			}
			else if (params == null) {
				message = messageProperty;
			}
			// 取得でき、かつ、置換配列も取得できた場合、整形します。
			else {
				message = MessageFormat.format(messageProperty, params);
			}
		}
		catch (Exception e) {
		}
		// NULLは返却しない。
		if (message == null) {
			message = "";
		}
		// メソッド終了ログ
		if (LoggerUtil.isLoggableMethod(_logger)) {
			LoggerUtil.methodTail(_logger, logMessage, message);
		}
		return message;
	}

	/**
	 * プロジェクトのベースとなるディレクトリを取得します。<br>
	 * @return プロジェクトのベースとなるディレクトリを表すFileオブジェクト。
	 * @throws InstallerException 取得に失敗した場合。
	 */
	public File getProjectBaseDir() throws InstallerException {
		return _projectBaseDir;
	}

	/**
	 * インストーラが存在するディレクトリを取得します。<br>
	 * @return インストーラが存在するディレクトリを表すFileオブジェクト。
	 * @throws InstallerException 取得に失敗した場合。
	 */
	public File getInstallerDir() throws InstallerException {
		return _installerDir;
	}

	/**
	 * インストーラの一時ファイル保存先ディレクトリを取得します。<br>
	 * @return インストーラの一時ファイル保存先ディレクトリを表すFileオブジェクト。
	 * @throws InstallerException 取得に失敗した場合。
	 */
	public File getInstallerTempDir() throws InstallerException {
		return _installerTempDir;
	}


	/**
	 * 一時的にコピーするファイルを取得します。<br>
	 * 一時的にコピーするファイルを、
	 * プロジェクトのベースを基点とするパスと、
	 * インストーラの一時ファイル保存先ディレクトリを基点とするパスとの組で戻します。
	 * @return 以下の形式にFile配列の配列。
	 * <table border="1">
	 * 	<tr>
	 * 		<td>インデックス</td>
	 * 		<td>内容</td>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>0</td>
	 * 		<td>プロジェクトのベースを基点とするパス</td>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>1</td>
	 * 		<td>インストーラの一時ファイル保存先ディレクトリを基点とするパス</td>
	 * 	</tr>
	 * </table>
	 * @throws InstallerException 取得に失敗した場合。
	 */
	public File[][] getCopiedFiles()
			throws InstallerException {
		// メソッド終了ログ
		LoggerUtil.methodHead(_logger, "getCopiedFiles()");
		// メソッドの戻り値
		File[][] returnFiles = null;
		try {
			String[] filePathes = XmlUtil.getNodeValues(
				_propertiesDoc, "/installer/files/file/@path");
			List list = new ArrayList();
			for (int i = 0; i < filePathes.length; i++) {
				File fileOnBase	= new File(
					_projectBaseDir, filePathes[i]).getCanonicalFile();
				File fileOnTemp = new File(
					_installerTempDir, filePathes[i]).getCanonicalFile();
				File[] files = new File[] {
					fileOnBase, fileOnTemp
				};
				list.add(files);
			}
			returnFiles = new File[list.size()][];
			list.toArray(returnFiles);
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
			throw new InstallerException(e);
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger, "getCopiedFiles()", returnFiles);
		return returnFiles;
	}

	/**
	 * 既存システムに存在している指定されたファイルを取得します。<br>
	 * @param fileKey ファイルを取得するためのキー文字列。
	 * @return プロジェクトのベースを基点として、
	 *          fileKeyが示す相対パスで取得したファイル。
	 * @throws InstallerException ファイルの取得に失敗した場合。
	 */
	public File getFileOnSystem(String fileKey) throws InstallerException {
		// メソッド終了ログ
		LoggerUtil.methodHead(_logger,
			"getFileOnSystem(" + fileKey + ")");
		// メソッドの戻り値
		File file = null;
		try {
			String filePath = XmlUtil.getNodeValue(
				_propertiesDoc,
				"/installer/files/file[@name=\"" + fileKey + "\"]/@path");
			file = new File(
				_projectBaseDir, filePath).getCanonicalFile();
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
			throw new InstallerException(e);
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getFileOnSystem(" + fileKey + ")", file);
		return file;
	}

	/**
	 * システムURLを取得します。<br>
	 * @param hostName ホスト名称。
	 * @return 指定されたホスト名に基づく、システムURL。
	 */
	public String getSystemURL(String hostName) {
		String systemURL = null;
		String property = getProperty("systemurl");
		systemURL = MessageFormat.format(property, new Object[] {hostName});
		return systemURL;
	}

	/**
	 * インストーラで作成するディレクトリの一覧を追加します。<br>
	 * @param directory 追加するディレクトリ。
	 */
	public void addMadeDirectory(File directory) {
		if (directory != null) {
			_madeDirectoriesList.add(directory);
		}
	}

	/**
	 * インストーラで作成するディレクトリの一覧を取得します。<br>
	 * @return インストーラで作成するディレクトリを表すFileオブジェクトの配列。
	 */
	public File[] getMadeDirectories() {
		File[] madeDirectories = new File[ _madeDirectoriesList.size() ];
		_madeDirectoriesList.toArray(madeDirectories);
		return madeDirectories;
	}

	/**
	 * 指定されたリソースキーの入力ストリームを取得します。<br>
	 * @param resourceKey 取得するリソースの位置を取得するためのキー文字列。
	 * @return resourceKeyが指し示すパスのリソースの入力ストリーム。
	 *          取得できない場合は、nullを戻します。
	 * @throws InstallerException リソース情報取得に失敗した場合。
	 */
	public InputStream getResourceKeyStream(String resourceKey)
			throws InstallerException {
		// メソッド終了ログ
		LoggerUtil.methodHead(_logger,
			"getResourceKeyStream(" + resourceKey + ")");
		// メソッドの戻り値
		InputStream resourceStream = null;
		try {
			// リソースのパスを取得
			String resourcePath = getResourcePath(resourceKey);
			resourceStream = getResourcePathStream(resourcePath);
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getResourceKeyStream(" + resourceKey + ")", resourceStream);
		return resourceStream;
	}

	/**
	 * 指定されたリソース・パスの入力ストリームを取得します。<br>
	 * @param resourcePath 取得するリソースのパス。
	 * @return resourcePathが示すリソースの入力ストリーム。
	 *          取得できない場合は、nullを戻します。
	 * @throws InstallerException リソース情報取得に失敗した場合。
	 */
	public InputStream getResourcePathStream(String resourcePath)
			throws InstallerException {
		// メソッド終了ログ
		LoggerUtil.methodHead(_logger,
			"getResourcePathStream(" + resourcePath + ")");
		// メソッドの戻り値
		InputStream resourceStream = null;
		try {
			// クラス・ローダを介してストリームを取得
			ClassLoader loader = ClassLoader.getSystemClassLoader();
			resourceStream = loader.getResourceAsStream(resourcePath);
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getResourcePathStream(" + resourcePath + ")", resourceStream);
		return resourceStream;
	}

	/**
	 * 指定されたリソースの文字コードを取得します。<br>
	 * @param resourceKey 取得するリソースの位置を取得するためのキー文字列。
	 * @return resourceKeyで取得したリソースのencode属性を戻します。
	 *          取得できない場合はUTF-8を戻します。
	 * @throws InstallerException 取得に失敗した場合。
	 */
	public String getResourceKeyEncode(String resourceKey)
			throws InstallerException {
		// メソッド終了ログ
		LoggerUtil.methodHead(_logger,
			"getResourceKeyEncode(" + resourceKey + ")");
		// メソッドの戻り値
		String encode = null;
		try {
			// 相対パスを取得
			encode = XmlUtil.getNodeValue( _propertiesDoc,
					"/installer/files/file"
					+ "[@name=\"" + resourceKey + "\"]/@encode");
			// 取得できない場合はパスを設定
			if (StringUtil.isEmpty(encode) == true) {
				encode = "UTF-8";
			}
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
			encode = "UTF-8";
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getResourceKeyEncode(" + resourceKey + ")", encode);
		return encode;
	}


	/**
	 * 指定されたリソースのパスを取得します。<br>
	 * @param resourceKey 取得するリソースの位置を取得するためのキー文字列。
	 * @return resourceKeyで取得した相対パスに、基点パスを付加したパス。
	 *          取得できない場合はnullを戻します。
	 * @throws InstallerException 取得に失敗した場合。
	 */
	private String getResourcePath(String resourceKey)
			throws InstallerException {
		// メソッド終了ログ
		LoggerUtil.methodHead(_logger,
			"getResourcePath(" + resourceKey + ")");
		// メソッドの戻り値
		String resourcePath = null;
		try {
			// 相対パスを取得
			String resourceRelativePath
				= XmlUtil.getNodeValue( _propertiesDoc,
					"/installer/files/file"
					+ "[@name=\"" + resourceKey + "\"]/@path");
			// 取得できない場合はパスを設定
			if (StringUtil.isEmpty(resourceRelativePath) == false) {
				resourcePath = _resourceBasePath;
				if (resourcePath.charAt(resourcePath.length() - 1) != '/') {
					resourcePath += "/";
				}
				resourcePath += resourceRelativePath;
			}
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
		}
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getResourcePath(" + resourceKey + ")", resourcePath);
		return resourcePath;
	}

	/**
	 * 指定した名称に対応したプロパティを取得する。<br>
	 * @param propertyName 取得するプロパティの名称。
	 * @return propertyNameに対応したプロパティ値。
	 *          取得できない場合は空文字列を戻します。
	 */
	public String getProperty(String propertyName) {
		String propertyValue = null;
		try {
			propertyValue = XmlUtil.getNodeValue(
				_propertiesDoc,
				"/installer/properties/property"
				 + "[@name=\"" + propertyName + "\"]/@value");
		}
		catch (Exception e) {
			propertyValue = "";
		}
		return propertyValue;
	}

	/**
	 * LO選択対象のLOを識別するためのキー文字列を取得する。
	 * @return LOを識別するためのキー文字列の配列。
	 */
	public String[] getOptionLOKeys() {
		String[] optionLOKeys = null;
		try {
			optionLOKeys = XmlUtil.getNodeValues(
				_propertiesDoc,
				"/installer/optionLOs/optionLO/@name");
		}
		catch (Exception e) {
			optionLOKeys = new String[0];
		}
		return optionLOKeys;
	}

	/**
	 * データベース関連プロパティを取得します。
	 * @param propertyName プロパティ名。
	 * @return propertyNameに対応したプロパティ値。
	 *          取得できない場合は空文字列を戻します。
	 */
	public String getDbProperty(String propertyName) {
		String propertyValue = getDbProperty(propertyName, _dbCategory);
		return propertyValue;
	}

	/**
	 * データベース関連プロパティを取得します。
	 * @param propertyName プロパティ名。
	 * @param dbCategory データベースの種別。
	 * @return propertyNameに対応したプロパティ値。
	 *          取得できない場合は空文字列を戻します。
	 */
	public String getDbProperty(String propertyName, String dbCategory) {
		String propertyValue = null;
		try {
			propertyValue = XmlUtil.getNodeValue(
				_propertiesDoc,
				"/installer/dbscripts/database"
				 + "[@category=\"" + dbCategory + "\"]"
				 + "/property[@name=\"" + propertyName + "\"]"
				 + "/@value");
		}
		catch (Exception e) {
			propertyValue = "";
		}
		return propertyValue;
	}

	/**
	 * LOの選択を登録します。<br>
	 * @param loKey LOを識別するためのキー文字列。
	 * @param selected 選択する場合はtrue、未選択の場合はfalse。
	 */
	public void setOptionLOSelected(String loKey, boolean selected) {
		if (loKey != null) {
			_optionLOSelcted.put(loKey, Boolean.valueOf(selected));
		}
	}

	/**
	 * LOの選択を取得します。<br>
	 * @param loKey LOを識別するためのキー文字列。
	 * @return 選択している場合はtrue、未選択の場合はfalse。
	 */
	public boolean getOptionLOSelected(String loKey) {
		// このメソッドの戻り値
		boolean selected = false;

		// キーの指定がない場合、未選択扱い
		if (loKey == null) {
			selected = false;
		}
		else {
			Boolean selectedBoolean = (Boolean)_optionLOSelcted.get(loKey);
			// 登録がない場合、選択扱い
			if (selectedBoolean == null) {
				selected = true;
			}
			// 登録がある場合、登録内容に基づく
			else {
				selected = selectedBoolean.booleanValue();
			}
		}
		return selected;
	}

	////////////////////////////////////////////////////////////////////////////
	// データベース初期化関連メソッド
	/**
	 * データベース種別を取得します。
	 * @return データベース種別を戻します。
	 */
	public String getDbCategory() {
		return _dbCategory;
	}

	/**
	 * データベース種別を設定します。
	 * @param dbCategory 設定するデータベース種別。
	 */
	public void setDbCategory(String dbCategory) {
		_dbCategory = dbCategory;
	}

	/**
	 * データベース独自のプロパティ名称を取得します。
	 * @return データベース独自のプロパティ名称の配列を戻します。
	 *          設定がない場合は空文字列を戻します。
	 */
	public String[] getDbExtendPropetyName() {
		String[] propertyNames = null;
		try {
			String path = "/installer/dbscripts"
				+ "/database[@category=\"" + getDbCategory() + "\"]"
				+ "/extendProperties/extendProperty/@name";
			propertyNames = XmlUtil.getNodeValues(_propertiesDoc, path);
		}
		catch (Exception e) {
			propertyNames = new String[0];
		}
		return propertyNames;
	}

	/**
	 * クエリー文を取得するための情報を取得します。<br>
	 * @param queryType 取得するクエリのタイプの識別子。
	 * @return 以下の構成の文字列配列の配列を戻します。
	 * 取得できない場合は要素数０の配列を戻します。<br>
	 * <table border="1">
	 * 	<tr>
	 * 		<th>添え字</th>
	 * 		<th>内容</th>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>0</td>
	 * 		<td>クエリー文があるリソースのパス</td>
	 * 	</tr>
	 * 	<tr>
	 * 		<td>1</td>
	 * 		<td>リソースのエンコード</td>
	 * 	</tr>
	 * </table>
	 * @throws InstallerException 取得中にエラーが発生した場合。
	 */
	public String[][] getQueryResources(String queryType)
			throws InstallerException {
		// メソッド開始ログ
		LoggerUtil.methodHead(_logger, "getQueryResources(" + queryType + ")");
		List queryResourcesList = new ArrayList();
		try {
			// <queries>要素を取得
			String queriesPath = "/installer/dbscripts"
				+ "/database[@category=\"" + getDbCategory() + "\"]"
				+ "/queries[@type=\"" + queryType + "\"]";
			_logger.info("queriesPath=" + queriesPath);
			Element queriesElement = (Element)XPathAPI.selectSingleNode(
					_propertiesDoc, queriesPath);
			if (queriesElement != null) {
				String commonEncode = queriesElement.getAttribute("encode");
				// <query>要素のリストを取得
				NodeList queryElements
					= XPathAPI.selectNodeList(queriesElement, "./query");
				// 各クエリのリソースとエンコードを取得して、リスト化
				for (int i = 0; i < queryElements.getLength(); i++) {
					Element queryElement = (Element)queryElements.item(i);
					String resourcePath
						= queryElement.getAttribute("resourcePath");
					String encode = queryElement.getAttribute("encode");
					if (StringUtil.isEmpty(encode)) {
						encode = commonEncode;
					}
					String[] queryResource = new String[] {
						resourcePath, encode
					};
					queryResourcesList.add(queryResource);
				}
			}
		}
		catch (Exception e) {
			LoggerUtil.throwable(_logger, e);
		}
		// メソッドの戻り値生成
		String[][] queryResources = null;
		queryResources = new String[queryResourcesList.size()][];
		queryResourcesList.toArray(queryResources);
		// メソッド終了ログ
		LoggerUtil.methodTail(_logger,
			"getQueryResources(" + queryType + ")", queryResources);
		return queryResources;
	}
}
