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

//
//機能名称 
//			データモデル　配列ノードクラス
//	変更履歴
//				2003.11.28	lcg  新規作成		
//
package jp.co.ntt.lms.lo.scorm.cbtcom;

import java.util.Vector;
import java.util .Iterator;
//import java.util.StringTokenizer;

/**
 * データモデル　配列ノードクラス
 * @author lcg
 */
public class CMIArrayNode extends CMINode {
   
	/**
     * CMIArrayNode クラスの初期処理<br>
     * @param proto プロトタイプ・データ
     */
	public CMIArrayNode(CMIElementProto proto) {
		super(proto);
	}
	
	/**
     * CMIArrayNode クラスの初期処理<br>
     */
	public CMIArrayNode() {
    
	}
 
	/**
	 * クラスの終了処理 <BR>
	 */
	public void finalize() {
		
	}
	   
	/**
     * データを設定する<br>
     * @param name エレメント名前
     * @param value 設定値
     */			
	public void localSetValue(String name, String value) {
		localSetValue( name, value, true );
	}
   
	/**
     * データを設定する<br>
     * @param name エレメント名前
     * @param value 設定値
     * @param doCheck チェックフラグ
     */
	public void localSetValue(String name, String value, boolean doCheck) {
   	
		CMIParameterPath param = new CMIParameterPath( name );
		String strTheName = param.popFirstElement();
	
		//バージョン情報の取得
		int intVersion = getVersion();
		
		String strName = getName();
		
		if ( strTheName.equals( strName ) ) {
			//該当leafの場合
			String strChildName = param.getNthElement(1);
			if ( strChildName == null || "".equals( strChildName ) ) {
				//パス指定が空の場合
				if ( isWritable() ) {
					if ( 3400 <= intVersion ) {
						//書き込み許可あり
						
						//LocalValue に値をセットする
						m_value.setLocalValue(value);
						
						//NULL フラグを偽にする
						m_value.setLocalIsNull(false);
						
						//setValue による設定フラグを真にする
						m_bySetValue = true;	
					}
	
					//バージョンが3.4以前の場合は、データ型のチェックを行わない
					else {
						//LocalValue に値をセットする
						m_value.setLocalValue(value);
						
						//NULL フラグを偽にする
						m_value.setLocalIsNull(false);

						//setValue による設定フラグを真にする
						m_bySetValue = true;
					}
				} else {
					//書き込み許可なし
	
					//バージョン情報によりエラー情報を変更する
					//バージョン情報が3.4以降の場合
					if ( 3400 <= intVersion ) {
	
						//エレメントがキーワードかチェック
						if ( checkParamKeyword( strTheName ) ) {
							//エラー：エレメントはキーワード
							setError( CMIError.ERR_INVALID_SETVALUE_CMI_KEYWORD );
						} else {
							//エラー ： 読み込み専用のエレメントに値をセットしようとした
							setError( CMIError.ERR_ELEMENT_IS_READ_ONLY );
						}
					}
					//バージョン情報が3.4以前の場合
					else{
						//エラー(CMI) 引数エラー(理由：書き込み許可なし)
						setError( CMIError.ERR_ELEMENT_CANNAT_HAVE_A_VALUE );
					}
					setVendorError(getVendorData("CMIArrayNode.localSetValue", this ) );
				}
			}
			else {

				// パス指定が残っている場合
				CMIElement child = null;
				// childNameが正当な数字かのチェック
				boolean blnIsNumber = CMIUtil.isNumber( strChildName );
				if ( blnIsNumber ){
					// 正当な数字の場合
					int index;
					try {
						index = Integer.parseInt(strChildName);
					} catch (NumberFormatException e) {
						e.printStackTrace();
						index = 0;
					}
					
					if ( index < m_children.size() ) {
						// 既存(最新以外)のエレメントの場合
						// child = m_children[index];
						child = getChild(strChildName);
					} else if ( index == m_children.size() ) {
						// 既存(最新)のエレメントの場合
						child = addArrayElement(index);
					} else {
						// 配列指定エラー
						// パス指定の子エレメントがない場合
						setError(CMIError.ERR_INVALID_AURGUMENT_ERROR);
						setVendorError(getVendorData("CMIArrayNode.localSetValue", this));
					}
				}


				if ( child != null ) {
					//パス指定の子エレメントがある場合
					//子のsetValueをコールする
					child.localSetValue( param.getPath(), value, doCheck );
				} else {
					//子エレメントのパス指定が "_children" "_count" "_version"
					//いずれかである場合
					if ( "_children".equals(strChildName) || "_count".equals(strChildName)||
					   "_version".equals(strChildName) ) {
						//バージョンにより、エラーメッセージが変更される
						if ( 3400 <= intVersion ) {
							//バージョン3.4以降のエラーメッセージ
							setError( CMIError.ERR_INVALID_SETVALUE_CMI_KEYWORD );
						} else {
							//バージョン3.4以前のエラーメッセージ
							setError( CMIError.ERR_INVALID_AURGUMENT_ERROR );
						}
					} else {
						//パス指定の子エレメントがない場合
						//エラー(CMI) 引数エラー(理由：無効パスを指定した)
						setError( CMIError.ERR_INVALID_AURGUMENT_ERROR );
					}
					setVendorError(getVendorData("CMIArrayNode.localSetValue", this ) );
				}
			}
		} 
	}
   
	/**
	 * データを取得する<br>
	 * @param name エレメント名前
	 * @return 取得のデータ
	 */
	public String localGetValue(String name) {
    	return localGetValue(name, true);
   	}
   
	/**
     * データを取得する<br>
     * @param name エレメント名前
     * @param doCheck チェックフラグ
     * @return 取得のデータ
     */
	public String localGetValue(String name, boolean doCheck) {
   	
		String strRet = null;
		
		CMIParameterPath param = new CMIParameterPath( name );
		String strTheName = param.popFirstElement();
		String strName = getName();
		
		if ( strTheName.equals( strName ) ) {
			String strChildName = param.getNthElement(1);
			if ( strChildName == null || "".equals(strChildName) ) {
				if ( isReadable() ) {
					//読み込み許可ありの場合
					if ( isSession() ) {
						//セッションの場合
						if ( !m_value.getLessonIsNull() ) {
							//LessonValue を返す
							strRet = m_value.getLessonValue();
						}
					} else {
						//固定の場合
						if ( !m_value.getLessonIsNull() ) {
							//LessonValue を返す
							strRet = m_value.getLessonValue();	
						} else {
							if ( !m_value.getLocalIsNull() ) {
								//LocalValue を返す
								strRet = m_value.getLocalValue();
							}
						}
					}
				} else {
					//読み込み許可なしの場合
	
					//バージョン情報の取得
					int intVersion = getVersion();
	
					//バージョン情報によりエラー情報を変更する
					
					//バージョン情報が3.4 以降の場合
					if ( 3400 <= intVersion ) {
						// エラー ： 書込みのみエラー
						setError( CMIError.ERR_ELEMENT_IS_WRITE_ONLY );
					}
					//バージョン情報が3.4以前の場合
					else {
						setError( CMIError.ERR_INVALID_AURGUMENT_ERROR );
					}
					setVendorError(getVendorData("CMIArrayNode.localGetValue", this ) );
				}
			} else {
				if ( "_children".equals(strChildName) ) {
					if ( 0 < getChildCount()) {
						CMIElement cmiElement = getChild(0);
						
						CMINode cmiNode = null;
						if ( ( cmiElement ) instanceof CMINode ) {
							cmiNode = (CMINode)cmiElement;
						}

						if (cmiNode != null) {
							m_childrenStr = cmiNode.getChildList();
							strRet = m_childrenStr;
						} else {
							setError(CMIError.ERR_ELEMENT_CANNAT_HAVE_A_CHILDREN);
							setVendorError(getVendorData("CMIArrayNode.localGetValue", this));
						}
					}
				} else if ("_version".equals(strChildName) ) {
					String strPath = null;
					strPath = getPath();
					if ( "cmi.core".equals( strPath ) ) {
						strRet = m_CBT.getVersionStr();
					} else {
						setError(CMIError.ERR_INVALID_AURGUMENT_ERROR);
						setVendorError(getVendorData ("CMIArrayNode.localGetValue", this));
					}
				} else if ("_count".equals(strChildName)) {
					StringBuffer sbStream = new StringBuffer();
					sbStream.append(getChildCount());
					strRet = sbStream.toString();
				} else {
					strRet = super.localGetValue(name, doCheck);
				}
			}
		}
		return strRet;			
	}
   
	/**
     * 配列要素エレメントを追加する<br>
     * @param index　エレメントのインデックス
     * @return 生成のエレメント
     */
	public CMIElement addArrayElement(int index) {
   	
		CMIElement element = null;
	
		// メンバーテーブルがヌルでない場合
		Vector vtrTable = m_proto.getMemberTable();
		if ( vtrTable != null ) {
			//memberTable でループしているが実装上一つしかない
			Iterator iterator = vtrTable.iterator();
			while ( iterator.hasNext() ) {
				CMIElementProto memberProto = 
										(CMIElementProto)iterator.next();
				if ( null != memberProto ) {
					CMIElementProto proto = new CMIElementProto();
					proto.setIsGlobal( memberProto.getIsGlobal() );
					proto.setIsSession( memberProto.getIsSession() );
					proto.setIsLeaf( memberProto.getIsLeaf() );
					proto.setIsArray( memberProto.getIsArray() );
					proto.setIsReadable( memberProto.getIsReadable() );
					proto.setIsWritable( memberProto.getIsWritable() );
					proto.setIsSerializable( memberProto.getIsSerializable() );
					proto.setValueType( memberProto.getValueType() );
					proto.setCanBeBlank( memberProto.getCanBeBlank() );
					proto.setMemberTable(memberProto.getMemberTable());
					proto.setKeyWord(memberProto.getKeyWord());
					proto.setDefaultData( memberProto.getDefaultData() );
					proto.setInitializer( memberProto.getInitializer() );
					proto.setBeforeInitializer(memberProto.getBeforeInitializer());
					proto.setMaintenancePutParam(memberProto.getMaintenancePutParam());
					proto.setMaintenanceGetParam(memberProto.getMaintenanceGetParam());
					proto.setMaintenanceSetValue(memberProto.getMaintenanceSetValue());
					proto.setMaintenanceGetValue(memberProto.getMaintenanceGetValue());
					proto.setMaintenanceGetPutParam(memberProto.getMaintenanceGetPutParam());
					
					//10進の数字に変換
					String strName = String.valueOf( index );
					proto.setName( strName );
					
					//インスタンスを生成する
					element = CMIUtil.makeInstance(proto, this);
					//proto 要解放フラグをセット
					element.setIsProtoAllocated(true);
					//配列インデックスをセットする
					element.setArrayIndex(index);
				}
			}
		} else {
			// プロトデータエラー
		}
		return element;
	}
   
	/**
     * 配列要素エレメントを追加(トップ)する<br>
     * @return 生成のエレメント
     */
	public CMIElement addTopArrayElement() {
		CMIElement element = null;
		int intIndex = 0;
		
		// メンバーテーブルがヌルでない場合
		Vector vtrTable = m_proto.getMemberTable();
		
		if ( vtrTable  != null ) {
			//子エレメントカウントを取得する。
			int intChildCount = m_children.size();
			//index カウントをシフトする(i-1 を i にシフトする)
			for (int i=intChildCount; 0 < i; i--) {
				CMIElement idxelement = (CMIElement)m_children.get(i-1);
				// プロトデータのname(n)をindex+1番号に書き換える。
				CMIElementProto proto = idxelement.getElementProto();
				//10進の数字に変換
				String strName = String.valueOf( intIndex );
				proto.setName(strName);
				
				// 配列インデックスを index+1 に書き換える。
				// 配列インデックスをセットする
				idxelement.setArrayIndex(i);
			}
			
			// トップに 0 の配列エレメントを追加する。
			// プロトタイプデータをコピーする。
			
			//プロトバッファを生成する
			CMIElementProto proto = new CMIElementProto();
			
			//プロトデータをコピーする
			//HashMap hsMemberTbl = m_proto.getMemberTable();
			
			CMIElementProto memberProto = (CMIElementProto)vtrTable.get(0);
			proto.setIsGlobal( memberProto.getIsGlobal() );
			proto.setIsSession( memberProto.getIsSession() );
			proto.setIsLeaf( memberProto.getIsLeaf() );
			proto.setIsArray( memberProto.getIsArray() );
			proto.setIsReadable( memberProto.getIsReadable() );
			proto.setIsWritable( memberProto.getIsWritable() );
			proto.setIsSerializable( memberProto.getIsSerializable() );
			proto.setValueType( memberProto.getValueType() );
			proto.setCanBeBlank( memberProto.getCanBeBlank() );
			proto.setMemberTable(memberProto.getMemberTable());
			proto.setKeyWord(memberProto.getKeyWord());
			proto.setDefaultData( memberProto.getDefaultData() );
			proto.setInitializer( memberProto.getInitializer() );
			proto.setBeforeInitializer(memberProto.getBeforeInitializer());
			proto.setMaintenancePutParam(memberProto.getMaintenancePutParam());
			proto.setMaintenanceGetParam(memberProto.getMaintenanceGetParam());
			proto.setMaintenanceSetValue(memberProto.getMaintenanceSetValue());
			proto.setMaintenanceGetValue(memberProto.getMaintenanceGetValue());
			proto.setMaintenanceGetPutParam(memberProto.getMaintenanceGetPutParam());
	
			//10進の数字に変換
			String strName = String.valueOf(intIndex);
			proto.setName( strName );
		
			//インスタンスを生成する
			element = CMIUtil.makeInstance(proto, this);
			
			//proto 要解放フラグをセット
			element.setIsProtoAllocated(true);
			
			//配列インデックスをセットする
			element.setArrayIndex(intIndex);
		} else {
			// プロトデータエラー
		}
		return element;
	}
   
	/**
     * localValue の値を設定する<br>
     * @param name 名前
     * @param value 設定値
     */	
	public void setLocalValue(String name, String value) {
		if ( null == name || "".equals(name) ) {
			m_value.setLocalValue( value );
			m_value.setLocalIsNull( false );
		} else {
			CMIParameterPath param = new CMIParameterPath(name);
			String strChildName = param.popFirstElement();
			
			CMIElement child = null;
			// strChildName.c_str()が正当な数字かのチェック
			if ( CMIUtil.isNumber( strChildName ) ) {
				int intIndex = Integer.parseInt( strChildName );
				if ( intIndex < m_children.size() ) {
					for ( int i = 0; i < m_children.size(); i++) {
						CMIElement element = (CMIElement)m_children.get(i);
						String strName = element.getName();
						if ( strName.equals(String.valueOf( intIndex ) ) ) {
							child = (CMIElement)m_children.get(i);
							break;
						}
					}
				} else if ( intIndex == m_children.size() ) {
					child = addArrayElement(intIndex);
				} else {
					// error;
				}
			}

			if ( child != null) {
				child.setLocalValue(param.getPath(), value);
			} else {
				// 指定されたパラメータ名が存在しない。
				setError(CMIError.ERR_INVALID_AURGUMENT_ERROR);
				setVendorError(getVendorData( new String("CMIArrayNode.setLocalValue"), this));
			}
		}
	}
   
	/**
     * lessonValue の値を設定する<br>
     * @param name 名前
     * @param value 設定値
     */
	public void setLessonValue(String name, String value) {
		if ( null == name || "".equals(name) ) {
			m_value.setLessonValue( value );
			m_value.setLessonIsNull( false );
		} else {
			CMIParameterPath param = new CMIParameterPath(name);
			String strChildName = param.popFirstElement();
			CMIElement child = null;
			// strChildName.c_str()が正当な数字かのチェック
			if ( CMIUtil.isNumber( strChildName ) ) {
				int intIndex = Integer.parseInt( strChildName );
				if ( intIndex < m_children.size() ) {
					for ( int i = 0; i < m_children.size(); i++) {
						CMIElement element = (CMIElement)m_children.get(i);
						String strName = element.getName();
						if ( strName.equals(String.valueOf( intIndex ) ) ) {
							child = (CMIElement)m_children.get(i);
							break;
						}
					}
				} else if ( intIndex == m_children.size() ) {
					child = addArrayElement(intIndex);
				} else {
					// error;
				}
			}
			if ( child != null ) {
				child.setLessonValue(param.getPath(), value);
			} else {
					// 指定されたパラメータ名が存在しない。
					setError(CMIError.ERR_INVALID_AURGUMENT_ERROR);
					setVendorError(getVendorData( new String("CMIArrayNode.setLessonValue"), this));
			}
		}
	}
   
	/**
     * 値からシリアライズデータを生成する<br>
     * @param buf シリアライズデータ
     */
	public void serialize(StringBuffer buf) {
		if ( buf == null ) {
			buf = new StringBuffer();
		}
		
		int intChildCount = getChildCount();
		buf.append( getName() );
		buf.append( "=(" );
		if (isSerializable()) {
			buf.append( serializeCMIValue() );
			buf.append( "," );
		}
		buf.append( intChildCount );
		buf.append(";");
	
		serializeChildren(buf);
		buf.append(")");
	}
   
	/**
     * @param inString
     */
	public void deserialize (String inString) {
		String strName = null;
		StringBuffer sbValue = new StringBuffer();
		int intHead = 0;
		int intTail = 0;

		try {
			CMITokenizer tokenizer = new CMITokenizer(inString, ";");
			String ownValues = null;
			String childrenValues = null;
			String countStr = null;

			ownValues = tokenizer.nextToken();
			
			int intOwnEnd = inString.indexOf(";");
			if ( intOwnEnd == -1 ) {
				childrenValues = "";
			} else {
				childrenValues = inString.substring( intOwnEnd+1);
			}
					
			if (isSerializable()) {
				CMITokenizer ownTokenizer = new CMITokenizer(ownValues, ",");
				String ownValue = null;
				ownValue = ownTokenizer.nextToken();
				int intEnd = ownValues.indexOf(",");
				if ( intEnd == -1 ) {
					countStr = "";
				} else {
					countStr = ownValues.substring( intEnd+1);
				}				
				deserializeCMIValue(ownValue);
			} else {
				countStr = ownValues;
			}
			int count = 0;
			try{
				count = Integer.parseInt(countStr);
			}catch(NumberFormatException nfe){
				count = 0;
			}		 	
		
		 	int childCount = getChildCount();
		 	// 足りない子供を追加
		 	for (int i = childCount; i < count; i++) {
			 	addArrayElement(i);
		 	}
		
			 for(int j = 0 ; j < count && intHead != -1; j++) {
				 // 要素データの名前と値を取り出す。
				intTail = childrenValues.indexOf("=", intHead);
				 if (intTail == -1) {
					 CMIError err = new CMIError(CMIError.ERR_PROGRAM_ERROR);
					 setVendorError(getVendorData(new String("CMIArrayNode.deserialize: no '='."),this));
					 throw new Exception();
				 } else {
			
					strName = childrenValues.substring(intHead, intTail);
					intHead = intTail + 1;	// '=' の次
					intHead = getNestedValue(childrenValues, intHead, sbValue);
				
				}
				CMIElement child = getChild(j);
				if ( child != null ) {
					 // 下位メンバに指定された名前のインスタンスがあれば、そのsetAllValue(値)を実行する。
					 child.deserialize(sbValue.toString());
				} else {
					 // メンバが存在しなければ、エラーとする。
					 // ;error
				}
			}
		} catch ( Exception ex ){
			// setError(err.getErrorNumber());
			// setVendorError();は、throw前に実施済み。
			setError(CMIError.ERR_INVALID_AURGUMENT_ERROR);
			setVendorError(getVendorData(new String("CMIArrayNode.deserialize"),this));
			//delete err;
		}
	}
   
	/**
	 * パラメータの取得<br>
     * @param value StringBuffer データバッファ
     * @return int エラーコード
     */
	public int getParamSub(StringBuffer value) {
		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		return intErrCode;
	}
   
	/**
     * パラメータの設定<br>
     * @param name 名前
     * @param inString 設定された値
     * @return エラーコード
     */
	public int putParamSub(String name, String inString) {
		int intErrCode = HACPError.HACP_ERR_SUCCESSFUL;
		CMITokenizer strTokenizer = new CMITokenizer (name, ".");
		String strMyName = null;
		String strChildName = null;
		
		try {
			strMyName = strTokenizer.nextToken();
			strChildName = strTokenizer.nextToken();
		} catch(Exception ex){
			return HACPError.HACP_ERR_INVALID_COMMAND;
		}
		
		if ( CMIUtil.isNumber( strChildName ) ) {
			int intIndex = Integer.parseInt(strChildName);
			
			CMIElement child = getChild( intIndex );
			if ( child != null ) {
				child.putParam( strChildName, inString);
			} else {
				intErrCode = HACPError.HACP_ERR_INVALID_COMMAND;
			}
		} else {
			intErrCode = HACPError.HACP_ERR_INVALID_COMMAND;
		}
		return intErrCode;
	}
   
	/**
     * デバッグ(CMIデータ)を取得する<br>
     * @return デバッグ(CMIデータ)
	 */
	public String getDebugCMIData() {
	//パスを取得する。
		String strPath = getPath();
		String strVal = null;
		StringBuffer sbRet = new StringBuffer();

		sbRet.append( strPath );
		sbRet.append("：(");
		sbRet.append(String.valueOf(m_LinkCount));
		sbRet.append(")\n");
		sbRet.append("    Array  Value=");
		sbRet.append("[");
		String strSet = m_bySetValue ? " SET ": " --- ";
		sbRet.append(strSet);
		sbRet.append("]");
		StringBuffer value = new StringBuffer();
		value.append(m_value.getLocalIsNull()?"(null)":"");

		value.append("[");
		value.append( m_value.getLocalValue() );
		value.append("]");
		String strValue = value.toString();
		sbRet.append(value.toString());

		for ( int i = 0; i < ( 40 - strValue.length() ); i++ ) {
			sbRet.append(" ");
		}

		StringBuffer lessonValue = new StringBuffer();
		lessonValue.append(" / ");
		strValue = m_value.getLessonIsNull()?"(null)":"";
		lessonValue.append(strValue);
		lessonValue.append("[");
		lessonValue.append(m_value.getLessonValue());
		lessonValue.append("]");

		sbRet.append(lessonValue.toString());
		sbRet.append("\n");
		int intSize = m_children.size();
		for( int i = 0; i < intSize; i++ ) {
			CMIElement element = ( CMIElement )m_children.get(i);
			String strChild = element.getDebugCMIData();
			sbRet.append(strChild);
		}
		return sbRet.toString();
	}
   
	/**
     * デバッグ(プロトタイプ)<br>
     * @return デバッグ(CMIデータ)
     */
	public String getDebugProto() {
		String strPath = null;
	
		//パスを取得する。
		strPath = getPath();	
	
		//末端 判定を取得する。
		String strLeaf = null;
		if ( isLeaf() ){
			strLeaf = "1";
		} else {
			strLeaf = "0";
		}
	
		//配列 判定を取得する。
		String strArray = null;
		if ( isArray( ) ) {
			strArray = "1";
		} else {
			strArray = "0";
		}
	
		//Get 可否判定を取得する。
		String strRead = null;
		if ( isReadable() ) {
			strRead = "1";
		} else {
			strRead = "0";
		}
	
		//Set 可否判定を取得する。
		String strWrite = null;
		if ( isWritable() ) {
			strWrite = "1";
		} else {
			strWrite = "0";
		}
	
		//必須 判定を取得する。
		String strMandatory = null;
		if ( isMandatory() ) {
			strMandatory = "1";
		} else {
			strMandatory = "0";
		}
	
		//シリアライズ判定を取得する。
		String strSerializable = null;
		if ( isSerializable() ){
			strSerializable = "1";
		} else {
			strSerializable = "0";
		}
	
		StringBuffer sbBuffer = new StringBuffer();
	
		sbBuffer.append(strPath);
		sbBuffer.append("：(");
		String strLinkCount = null;
		
		strLinkCount = String.valueOf( m_LinkCount );
		
		sbBuffer.append(strLinkCount);
		sbBuffer.append(")\n");
		sbBuffer.append("    ");
	
		sbBuffer.append("Array");
		sbBuffer.append(" Leaf="+strLeaf+"/");
		sbBuffer.append("Array="+strArray+"/");
		sbBuffer.append("Readable="+strRead+"/");
		sbBuffer.append("Write="+strWrite+"/");
		sbBuffer.append("Man="+strMandatory+"/");
		sbBuffer.append("Serial="+strSerializable+"\n");
	
		int intCount = m_children.size();
		for ( int i = 0; i < intCount; i++ ) {
			CMIElement element = ( CMIElement ) m_children.get(i);
			String strChild = element.getDebugProto();
			sbBuffer.append(strChild);
		}
		return sbBuffer.toString();
	}

	/**
	 * 値からXMLデータを生成する<br>
	 * @param buf シリアライズデータ（XML形式）
	 */
	public void serializeXMLLog(StringBuffer buf) {
		if ( buf == null ) {
			buf = new StringBuffer();
		}
		
		int intChildCount = getChildCount();
		buf.append( "<" );
		buf.append( getName() );
		buf.append( ">" );
		if (intChildCount > 0) {
			serializeXMLChildren(buf);
		}
		buf.append( "</" );
		buf.append( getName() );
		buf.append( ">" );
		buf.append( "\n" );
		
	}

}
