/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	XML操作ユーティリティクラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//          2006.02.13  getIndexedNodeAttribute のロジック変更
//
//	機能
//
//	このクラスはXMLを操作するユーティリティクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf;

import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * XML操作ユーティリティクラス
 * 
 * このクラスはXMLを操作するユーティリティクラスです。
 * 
 * @author 村上 靖征
 * @version 1.0
 */
public class NodeUtil
{
	/**
	 * 指定したノードを親にもつ、指定した名前のノードのリストを取得する。
	 * 
	 * @param parent 親ノード
	 * @param nodeName ノード名
	 * @return ノードのリスト
	 */
	public static List getNamedChildElementList(Node parent, String nodeName)
	{
		if (parent == null) { return null; }

		List nodeList = new ArrayList();
		NodeList list = parent.getChildNodes();
		for (int i = 0; i < list.getLength(); i++)
		{
			Node node = list.item(i);
			if (node.getNodeType() == Node.ELEMENT_NODE)
			{
				if (node.getNodeName().equals(nodeName)) nodeList.add(node);
			}
		}
		return nodeList;
	}

	/**
	 * 指定したノードを親に持つ、指定された名前をもつノードのリストを取得する。
	 * 名前を複数指定することができる。
	 * 
	 * @param parent 親ノード
	 * @param nodeNames ノード名の配列
	 * @return ノードのリスト
	 */
	public static List getNamedChildElementList(Node parent, String[] nodeNames)
	{
		if (parent == null) { return null; }

		List nodeList = new ArrayList();
		NodeList list = parent.getChildNodes();
		for (int i = 0; i < list.getLength(); i++)
		{
			Node node = list.item(i);
			if (node.getNodeType() == Node.ELEMENT_NODE)
			{
				for (int j = 0; j < nodeNames.length; j++)
				{
					if (node.getNodeName().equals(nodeNames[j]))
					{
						nodeList.add(node);
						break;
					}
				}
			}
		}
		return nodeList;
	}

	/**
	 * 指定したノードの配下にある要素ノードからなるリストを取得する。
	 * 
	 * @param parent 親ノード
	 * @return
	 */
	public static List getChildElementList(Node parent)
	{
		if (parent == null) { return null; }

		List nodeList = new ArrayList();
		NodeList list = parent.getChildNodes();
		for (int i = 0; i < list.getLength(); i++)
		{
			Node node = list.item(i);
			if (node.getNodeType() == Node.ELEMENT_NODE)
			{
				nodeList.add(node);
			}
		}
		return nodeList;
	}
	
	/**
	 * 指定したノードを親にもつノードのうち、最初の指定した名前のノードを取得する。
	 * 
	 * @param parent 親ノード
	 * @param nodeName ノード名
	 * @return ノード
	 * 			見つからなかった場合、null が返される。
	 */
	public static Node getNamedFirstChildElement(Node parent, String nodeName)
	{
		if (parent == null) { return null; }

		NodeList list = parent.getChildNodes();
		for (int i = 0; i < list.getLength(); i++)
		{
			Node node = list.item(i);
			if (node.getNodeType() == Node.ELEMENT_NODE)
			{
				if (node.getNodeName().equals(nodeName)) return node;
			}
		}
		return null;
	}

	/**
	 * 指定されたノードリストの中から、インデックスにより指定されたノードの属性値を取得する。
	 * 指定された属性名を持つ属性がなければ null を返却する。
	 * 
	 * @param nodeList ノードリスト
	 * @param index インデックス
	 * @param attrName 属性名
	 * @return 属性値
	 */
	public static String getIndexedNodeAttribute(List nodeList, int index,
			String attrName)
	{
		Node node = (Node) nodeList.get(index);
		return getAttribute(node, attrName);
	}

	/**
	 * 指定されたノードの属性値を取得する。
	 * 
	 * @param node ノード
	 * @param attrName 属性名
	 * @return 属性値
	 */
	public static String getAttribute(Node node, String attrName)
	{
		Node attr = node.getAttributes().getNamedItem(attrName);
		if (attr != null)
		{
			return attr.getNodeValue();
		}
		else
		{
			return null;
		}
	}
}