/*
このファイルの中身は、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) ______________________________________.
*/

//
//	ツリー構造ノードクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo;

import java.util.*;

/**
 * XMOツリー構造ノードクラスです。<BR>
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class XMONode implements java.io.Serializable {

	/** 親ノードを保持します */
	private XMONode mobjParentNode;

	/** 親IDを保持します */
	private String mstrParentID = "";

	/** 子ノードを保持します */
	private Vector mvecChildList = new Vector();

	/** 子ノードリストのインデックスを保持します */
	private int mintIndex = -1;

	/** タイプを保持します。 */
	private String mstrType = null;

	/**
	 * コンストラクタです。<BR>
	 */
	public XMONode() {
	}

	/**
	 * コンストラクタです。<BR>
	 * 親ノードと親IDを指定してインスタンス化します
	 * @param strParentID 親ID
	 * @param objParentNode 親ノード
	 */
	public XMONode( String strParentID, XMONode objParentNode ) {
		mobjParentNode = objParentNode;
		mstrParentID = strParentID;
	}

	/**
	 * 親ノードを設定します
	 * @param objParentNode 親ノードオブジェクト
	 */
	public void setParentNode( XMONode objParentNode ) {
		mobjParentNode = objParentNode;
	}

	/**
	 * 親ノードを取得します
	 * @return XMONode 親ノードオブジェクト
	 */
	public XMONode getParentNode() {
		return mobjParentNode;
	}

	/**
	 * 親IDを設定します
	 * @param strParentID 親ID
	 */
	public void setParentID( String strParentID ) {
		mstrParentID = strParentID;
	}

	/**
	 * 親IDを取得します
	 * @return String 親ID
	 */
	public String getParentID() {
		return mstrParentID;
	}

	/**
	 * IDを取得します
	 * @return String ID
	 */
	public String getID() {
		return mobjParentNode.getParentID() + mstrParentID;
	}

	/**
	 * 子ノードを追加します
	 * @param objChildNode 子ノード
	 */
	public void addChild( XMONode objChildNode ) {
		mvecChildList.add( objChildNode );
		// 追加した子ノードの親ノードを設定
		objChildNode.setParentNode( this );
	}

	/**
	 * タイプを設定します。
	 * @param strType タイプ
	 */
	public void setType( String strType ) {
		mstrType = strType;
	}

	/**
	 * タイプを取得します。
	 * @return String タイプ
	 */
	public String getType() {
		return mstrType;
	}
	/**
	 * 子ノードを追加する。
	 * 追加位置がVectorの最大値の場合は最後に追加する。
	 * @param intIndex 		追加位置
	 * @param objChildNode	追加する子ノード
	 */
	public void addChild( int intIndex, XMONode objChildNode )
	{
		//指定した位置にノードを追加する
		if( intIndex == mvecChildList.size() ) {
			mvecChildList.add( objChildNode );
		}
		else {
			mvecChildList.add(intIndex, objChildNode );
		}
		//追加した子ノードの親ノードを設定する
		objChildNode.setParentNode( this );
	}

	/**
	 * IDを指定して子ノードを削除します
	 * @param strDeleteID 削除ID
	 * @return 削除されるIDが存在した場合はtrue、存在しない場合はfalse
	 */
	public boolean deleteChild( String strDeleteID ) {
		int intCount = mvecChildList.size();
		for( int i = 0; i < intCount; i++ ) {
			XMONode objNode = (XMONode)mvecChildList.get(i);
			if( objNode.getParentID().equals( strDeleteID ) ) {
				mvecChildList.remove(i);
				return true;
			}
		}
		return false;
	}

	/**
	 * ノードを指定して子ノードを削除します
	 * @param objDeleteNode 削除ノード
	 * @return 削除されるノードが存在した場合はtrue、存在しない場合はfalse
	 */
	public boolean deleteChild( XMONode objDeleteNode ) {
		return mvecChildList.remove(objDeleteNode);
	}

	/**
	 * 子ノード数を返します
	 * @param int 子ノード数
	 */
	public int getChildCount() {
		return mvecChildList.size();
	}

	/**
	 * 子ノードのカーソルを先頭に移動します
	 */
	public void first() {
		mintIndex = -1;
	}

	/**
	 * 次の子ノードが存在する場合はtrueを返します
	 * @return boolean true: 存在する false: 存在しない
	 */
	public boolean next() {
		mintIndex++;
		if( mvecChildList.size() > mintIndex ) {
			return true;
		}
		else {
			// カーソルを先頭に戻します。
			first();
			return false;
		}
	}

	/**
	 * 現在のインデックスの子ノードを取得します
	 * @return XMONode 子ノード 取得できない場合はnullを返します
	 */
	public XMONode getChildNode() {
		return getChildNode( mintIndex );
	}

	/**
	 * 子ノードリストを設定します
	 * @param vecChildList 子ノードリスト
	 */
	public void setChildList( Vector vecChildList ) {
		mvecChildList = vecChildList;
	}

	/**
	 * 子ノードリストを返します
	 * @return Vector 子ノードリスト
	 */
	public Vector getChildList() {
		return mvecChildList;
	}

	/**
	 * 指定したインデックスの子ノードを取得します
	 * @param intIndex インデックス
	 * @return XMONode 子ノード 取得できない場合はnullを返す
	 */
	public XMONode getChildNode( int intIndex ) {
		XMONode objChildNode = null;
		try {
			objChildNode =  (XMONode)mvecChildList.get( intIndex );
		}
		catch( ArrayIndexOutOfBoundsException e ) {
			return null;
		}

		return objChildNode;
	}

	/**
	 * 指定したChildIDの子ノードを取得します
	 * @param strChildID
	 * @return XMONode 子ノード 取得できない場合はnullを返す
	 */
	public XMONode getChildNode( String strChildID )
	{
		XMONode objChildNode = null;
		XMONode objResult = null;
		try
		{
			for (int i = 0; i < mvecChildList.size(); i++)
			{
				objChildNode =  (XMONode)mvecChildList.get( i );
				if ( objChildNode.getParentID().equals( strChildID ) )
				{
					objResult =  (XMONode)mvecChildList.get( i );
					break;
				}
			}
		}
		catch( ArrayIndexOutOfBoundsException e )
		{
			return null;
		}

		return objResult;
	}

	/**
	 * 指定したChildIDの子ノードの位置(Index)を取得します
	 * @param strChildID
	 * @return 位置(Index)を取得できない場合は0を返す
	 */
	public int getChildNodeIndex( String strChildID )
	{
		XMONode objChildNode = null;
		int intChildNodeIndex = 0;
		try
		{
			for (int i = 0; i < mvecChildList.size(); i++)
			{
				objChildNode =  (XMONode)mvecChildList.get( i );
				if ( objChildNode.getParentID().equals( strChildID ) )
				{
					intChildNodeIndex =  i;
					break;
				}
			}
		}
		catch( ArrayIndexOutOfBoundsException e )
		{
			return intChildNodeIndex;
		}

		return intChildNodeIndex;
	}

	/**
	 * 自分以下の複製を作成します。
	 * 自分より上のノードは複製されません。
	 * @return XMONode 複製
	 */
	public XMONode copySelf() {

		XMONode objCopyNode = new XMONode();
		// ID設定
		objCopyNode.setParentID( mstrParentID );
		// このコピー
		for( int i = 0; i < mvecChildList.size(); i++ ) {
			XMONode objChildNode = (XMONode)mvecChildList.get(i);
			objCopyNode.addChild( objChildNode.copySelf() );
		}

		return objCopyNode;

	}

	/**
	 * 指定した親IDを持つノードを引数で渡されたノードで入れ替えます。
	 * @param strParentID 親ID
	 * @param objNode 入れ替えるノード
	 */
	public void switchNode( String strParentID, XMONode objNode ) {
		int intCount = mvecChildList.size();
		for( int i = 0; i < intCount; i++ ) {
			XMONode objChildNode = (XMONode)mvecChildList.get(i);
			if( objChildNode.getParentID().equals( strParentID ) ) {
				mvecChildList.remove(i);
				mvecChildList.add(i, objNode);
				objNode.setParentNode( this );
				return;
			}
		}
	}
}

