package addressbook;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class SearchAddressbookBean {

	ConnectXprioriBean xcon = null; // ConnectXprioriBeanクラス

	/**
	 * コンストラクタ ConnectXprioriBeanクラスを呼び出しXprioriとの接続を確立する
	 */
	public SearchAddressbookBean() {
		// Xprioriとの接続を確立
		xcon = new ConnectXprioriBean();
	}

	/**
	 * アイテムの総数を取得する
	 * 
	 * @return アイテム総数
	 */
	public int CountAllItem() {
		// アイテム数の初期化
		int item_num = 0;
		// アイテム総数を取得するXPath
		String xpath = "count(/ND/address_book/item)";
		// 検索結果を取得する
		String tmpItem_xml = xcon.query(xpath);
		// XMLを解析する
		Document doc = AddressbookUtils.loadXMLFromString(tmpItem_xml);

		/*
		 * 検索結果として 
		 * <?xml version="1.0" encoding="UTF-8" ?>
		 * <Query-Results>
		 * 100
		 * </Query-Results>
		 * という改行(\n)が入った文字列が返ってるので、
		 * Query-Results要素の値から\nを取り除いた値を取得する
		 */
		Element element = (Element) doc.getElementsByTagName("Query-Results")
				.item(0);
		String nodevalue = element.getFirstChild().getNodeValue().replace("\n",	"");
		// 文字列から整数値にキャストする
		item_num = Integer.parseInt(nodevalue);
		return item_num;
	}

	/**
	 * アイテムを指定した位置から、オフセット分取得する
	 * 
	 * @param start
	 *            取得開始番号
	 * @param offset
	 *            オフセット
	 * @return ItemBeanの配列
	 */
	public ItemBean[] getItems(int start, int offset) {
		// オフセット分のItemBean配列を定義する
		ItemBean[] items = new ItemBean[offset];

		// 引数からXPathの条件をつくる
		String xpathCondition = "position() >= " + start + " and "
				+ "position() < " + (start + offset);

		// 指定した範囲の位置iのitemノードを取得するXPathを問い合わせ検索結果を取得する
		String itemsXML = xcon.query("/ND/address_book/item[" + xpathCondition
				+ "]");
		
		// 検索結果XMLからDOM Documentを作成する
		Document doc = AddressbookUtils.loadXMLFromString(itemsXML);
		NodeList itemnodeList = doc.getElementsByTagName("item");
		for (int i = 0; i < itemnodeList.getLength(); i++) {
			items[i] = new ItemBean(itemnodeList.item(i));
		}
		return items;
	}

	/**
	 * 指定したIDを持つアイテムを取得する
	 * 
	 * @param id
	 * @return ItemBean
	 */
	public ItemBean getItemById(String id) {
		// 引数idと同じID属性値を持つitemノードを取得するXPathを問い合わせ、検索結果を取得する
		String itemXML = xcon.query("/ND/address_book/item[@id = " + id + "]");
		// 検索結果XMLからDOM Documentを作成する
		Document doc = AddressbookUtils.loadXMLFromString(itemXML);
		// DOM Documentから先頭のitemノードを取り出しItemBeanを作成する
		ItemBean item = new ItemBean(doc.getElementsByTagName("item").item(0));
		return item;
	}

	/**
	 * ログアウトする
	 * 
	 */
	public void logout() {
		xcon.logout();
	}

}

