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

//
//	LumpParserクラス
//			変更履歴
//				2004.01.08	新規作成    五木田 泰史
//
package jp.co.ntt.lms.xmo.LumpInsert;

import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.XMOPropertyDef;
import jp.co.ntt.lms.xmo.util.FileControl;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.util.XMOString;

import java.io.IOException;
import java.io.StringReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.*;


import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import org.xml.sax.InputSource;

/**
 * LumpParserクラスです。<BR>
 * 一括登録XMLファイルを解析します。<BR>
 * 解析結果としてLumpTreeクラスを戻します。<BR>
 *
 * @author Y.Gokita
 * @version 0.0.0.1 2004/01/08
 */
public class LumpParser
	implements LumpInsertMessage
{

	// 一括登録ファイルのタグ名定義値
	static final String TAG_ROOT       = "Lump";
	static final String TAG_GROUP      = "group";
	static final String TAG_FOREIGNID  = "foreign_id";
	static final String TAG_GROUP_NAME = "group_name";
	static final String TAG_PEOPLE     = "people";
	static final String TAG_LOGINID    = "login_id";
	static final String TAG_USER_NAME  = "user_name";
	static final String TAG_PASSWORD   = "password";
	static final String TAG_ADDRESS    = "contact_address";
	static final String TAG_SEX        = "sex";
	static final String TAG_EMAIL1     = "contact_email";
	static final String TAG_EMAIL2     = "contact_email2";
	static final String TAG_KANA       = "reading_name";
	static final String TAG_BIRTHDAY   = "birthday";
	static final String TAG_TEL        = "contact_tel";
	static final String TAG_COMMENT    = "comment";

	static final String TAG_OID        = "oid";
	static final String TAG_AD_DN      = "ad_dn";
	static final String TAG_AD_USER_ID = "ad_user_id";
	static final String ATTR_TYPE    = "type";
	static final String ATTR_UPFLAG    = "up_flag";


	// メール送信フラグ
	private boolean mblMailFlag = false;


	private String mstrLumpRootGroup = null;

	// グループのオブジェクトIDの重複チェック用のハッシュテーブルです。
	private Hashtable mhtbOid = new Hashtable();

	public LumpParser(String strLumpRootGroup ){
		mstrLumpRootGroup = strLumpRootGroup;
	}

	/**
	 * 一括登録ファイル展開処理<BR>
	 * 指定された一括登録ファイルを<BR>
	 * LumpTreeオブジェクトに全ての情報を展開する。<BR>
	 *
	 * @param String 一括登録ファイル文字列
	 * @return LumpTree グループと人のツリー先頭クラス
	 * @exception XMOException
	 */
	public LumpTree parse(String strXML, boolean blMailFlag)
		throws XMOException
	{
		LumpTree objTree = null;
		try
		{
			//メールフラグを設定
			mblMailFlag = blMailFlag;

			// ルートノードの取得
			Node objRootNode = load(strXML);

			// ルートノードからLumpGroupクラスツリー作成
			LumpGroup objTop = new LumpGroup();
			objTop.setType(LumpGroupAndPeople.TYPE_GROUP);

			makeTree((Element)objRootNode, objTop);

			// 先頭LumpGroupAndPeopleクラスをツリークラスに設定
			objTree = new LumpTree();

			objTree.setTop(objTop);
		}
		catch(SAXException se)
		{
			// @LOG >err >1
			DebugLog.write(this.getClass(), se, DebugLog.HIGHT);
			throw new XMOException(PARSE_WAR);
		}
		catch(IOException ie)
		{
			// @LOG >err >1
			DebugLog.write(this.getClass(), ie, DebugLog.HIGHT);
			throw new XMOException(PARSE_ERR);
		}
		catch(ParserConfigurationException pe)
		{
			// @LOG >err >1
			DebugLog.write(this.getClass(), pe, DebugLog.HIGHT);
			throw new XMOException(PARSE_ERR);
		}
		// 一括登録インタフェースである
		// ツリークラスを戻す
		return objTree;
	}

	/**
	 * アップロードファイル書込み処理<BR>
	 * 指定されたアップロードファイルを<BR>
	 * 指定されたフォルダに書き込む。<BR>
	 *
	 * @param String アップロードファイル名
	 * @param String ログインID
	 * @return String 一括登録ファイル名
	 * @exception XMOException
	 */
	public String save(String strXML, String strLoginID)
		throws XMOException
	{
		String strDir      = "";
		String strFileName = "";

		try
		{
			// ファイル名作成
			SimpleDateFormat objFormat = new SimpleDateFormat("yyyyMMdd");
			Date objNow                = new Date();
			String strDate             = objFormat.format(objNow);			//現在時刻取得
			// ログインIDを日付の前に追加する
			strDate = strLoginID + strDate;

			LumpInsertEnv objEnv = LumpInsertEnv.getInstance();
			strDir               = objEnv.getLumpDir();

			// フォルダ内同名ファイル数取得
			FileControl objFc = new FileControl();
			String[] strList  = objFc.getFileList(strDir, 1);
			int i             = 0;
			int intXmlIndex   = 0;
			int intFileCount  = 0;
			String strFullFileName = "";
			String strTempName     = "";
			for(i = 0; i < strList.length; i++)
			{
				strFullFileName = strList[i];
				if(strFullFileName != null)
				{
					intXmlIndex = strFullFileName.indexOf(".xml");
					// ファイル名が一致したならば
					if(intXmlIndex > 0)
					{
						strTempName = strFullFileName.substring(0, intXmlIndex);
					}
					// 先頭から日付データが一致したならば
					if(strTempName.indexOf(strDate) == 0)
					{
						intFileCount++;
					}
				}
			}
			if(intFileCount == 0)
			{
				strFileName = strDate + ".xml";
			}
			else
			{
				strFileName = strDate + "_" +
								String.valueOf(intFileCount) + ".xml";
			}

			File objFile         = new File(strDir + "/" + strFileName);

			// 出力先フォルダを作成する
			File objParentDir = objFile.getParentFile();
			objParentDir.mkdirs();

				// 必ずファイルを生成する
				if(!objFile.createNewFile())
				{
					throw new XMOException(FILE_MAKE_ERR);
				}
			FileOutputStream objFos = new FileOutputStream(objFile);
			OutputStreamWriter objPw = new OutputStreamWriter(objFos,"Windows-31J");
			

			objPw.write(strXML);
			objPw.close();
			objFos.close();
		}
		catch(XMOException xe)
		{
			// @LOG >err >1
			DebugLog.write(this.getClass(), xe, DebugLog.HIGHT);
			throw xe;
		}
		catch(Exception e)
		{
			// @LOG >err >1
			DebugLog.write(this.getClass(), e, DebugLog.HIGHT);
			throw new XMOException(SAVE_WAR);
		}
		return strFileName;
	}


	/**
	 * 解析を行いRootのNodeオブジェクトを取得します<BR>
	 * ここではメモリ上のXML形式データを解析します。
	 * @param String XML文字列
	 * @return Node RootのNodeオブジェクト
	 * @exception SAXException
	 */
	private Node load(String strXML)
		throws SAXException,IOException,ParserConfigurationException
	{

		DocumentBuilder objDocumentBuilder;

		// 一括登録ファイルを読み込みＤＯＭツリーを作成する
		// 作成失敗した場合には、上位ＡＰにExceptionをthrowする
		// 空行及びコメントは無効とする
		DocumentBuilderFactory objDocumentBuilderFactory = DocumentBuilderFactory.newInstance();
		objDocumentBuilderFactory.setIgnoringElementContentWhitespace(true);
		objDocumentBuilderFactory.setIgnoringComments(true);

		try
		{
			objDocumentBuilder = objDocumentBuilderFactory.newDocumentBuilder();
		}
		catch(ParserConfigurationException ex)
		{
			throw ex;
		}

		Document objXmlDoc;

		try
		{
			StringReader objStream = new StringReader(strXML);
			InputSource objInput = new InputSource(objStream);		// DOMツリー作成
			objXmlDoc = objDocumentBuilder.parse(objInput);
			objStream.close();
		}
		catch(SAXException ex)
		{
			throw ex;
		}
		catch(IOException ex) {
			throw ex;
		}

		// ルートノードの取得を行う
		return objXmlDoc.getDocumentElement();
	}

	/**
	 * LumpGroupAndPeopleツリー作成処理<BR>
	 * NodeからLumpGroupAndPeopleツリーを作成します<BR>
	 *
	 * @param Element ルートエレメントクラス
	 * @param LumpGroup 先頭LumpGroupクラス
	 * @return void
	 * @exception SAXException
	 * @exception IOException
	 * @exception ParserConfigurationException
	 * @exception XMOException
	 */
	private void makeTree(Element objRootNode, LumpGroup objTopGroup)
		throws SAXException,IOException,ParserConfigurationException,
				XMOException
	{
		// @LOG >debug >10 一括登録：同期XMLのツリー作成を開始します。
		DebugLog.write( this.getClass(), "一括登録：同期XMLのツリー作成を開始します", DebugLog.ROW );

		// ルートタグがあるかチェックします。
		if(!objRootNode.getNodeName().equalsIgnoreCase(TAG_ROOT))
		{
			// @LOG >err >1 ルートタグがないエラー
			DebugLog.write(this.getClass(), "NOT ROOT TAG : " + objRootNode.getNodeName(), DebugLog.HIGHT);
			throw new XMOException(NOROOT_WAR);
		}

		// ルートを設定します。
		LumpGroupAndPeople objNull = null;
		objTopGroup.setParent(objNull);							// 親クラスにNULLを設定

		if ( mstrLumpRootGroup == null ){
			// @LOG >err >1 パラメータエラー 内部エラー
			DebugLog.write(this.getClass(), "一括登録：内部エラー: ROOTGROUPID is NULL", DebugLog.HIGHT);
			throw new XMOException(PARAM_WAR);
		}
		else{

			// lumpタグのtype属性を取得します。
			String strType = objRootNode.getAttribute( ATTR_TYPE );
			if( strType == null || strType.equals( "" ) ) {
				// デフォルト値 (1)を設定
				strType = XMOPropertyDef.XMS_TYPE;
			}
			// タイプ属性のチェックを行います。
			if( !checkType( strType ) ) {

				// @LOG >err >1 一括登録：種別属性(type)が不正です。
				DebugLog.write(this.getClass(), "一括登録：種別属性(type)が不正です。" + strType, DebugLog.HIGHT );
				// タグ不正エラーとしてスローする。
				throw new XMOException(TAG_WAR);
			}
			objTopGroup.setGroupType(strType);				// グループ種別を設定

			objTopGroup.setGroupID(mstrLumpRootGroup);				// グループIDを設定
			objTopGroup.setGroupName("ルート");						// グループ名を"ルート"固定
		}

		// ルートの子供を設定します。
		for(Node objChild = objRootNode.getFirstChild();
			objChild != null;
			objChild = objChild.getNextSibling())
		{
			// #TEXT型のインデントは読み飛ばす
			if(objChild.getNodeType() != Node.TEXT_NODE)
			{
				// グループならば
				if(objChild.getNodeName().equalsIgnoreCase(TAG_GROUP))
				{
					LumpGroup objGroup = new LumpGroup();		// 子供グループ作成
					objTopGroup.addChild(objGroup);				// 子供グループ追加
					// 親の種別を子にも設定
					objGroup.setGroupType( objTopGroup.getGroupType() );
					objGroup.setType(LumpGroupAndPeople.TYPE_GROUP);

					makeGroup((Element)objChild, objGroup);		// 子供グループ要素設定処理へ
				}
				else if( objChild.getNodeName().equalsIgnoreCase(TAG_PEOPLE) )
				{
					LumpPeople objPeople = new LumpPeople();			// 子供個人クラス作成
					objTopGroup.addChild(objPeople);						// 子供個人追加
					// 親の種別を子にも設定
					objPeople.setUserType( objTopGroup.getGroupType() );
					// メール送信設定
					objPeople.mblMailFlag = mblMailFlag;
					objPeople.setType(LumpGroupAndPeople.TYPE_PEOPLE);	// 個人種別(=0)設定
					objPeople.setParent(objTopGroup);						// 子供個人に親グループ設定
					makePeople((Element)objChild, objPeople);			// 子供個人要素設定処理
				}
				else{
					// ルートの子供が<group>タグ・<people>タグではない場合はエラー
					// @LOG >err >1 ルートの子供が<group>タグ・<people>タグではない。
					DebugLog.write(this.getClass(), "NOT GROUP OR PEOPLE TAG : " + objChild.getNodeName(), DebugLog.HIGHT);
					throw new XMOException(ROOT_WAR);
				}
			}
		}

		// @LOG  >debug >10 一括登録：同期XMLのツリー作成が終了しました。
		DebugLog.write( this.getClass(), "一括登録：同期XMLのツリー作成が終了しました。", DebugLog.ROW );
	}

	/**
	 * グループクラス作成処理<BR>
	 * グループエレメントからグループクラスを<BR>
	 * 作成します<BR>
	 *
	 * @param Element グループエレメント
	 * @param LumpGroup グループクラス
	 * @return void
	 * @exception SAXException
	 * @exception IOException
	 * @exception ParserConfigurationException
	 * @exception XMOException
	 */
	private void makeGroup(Element objElGroup, LumpGroup objGroup)
		throws SAXException,IOException,ParserConfigurationException,
				XMOException
	{

		// @LOG >debug >10 一括登録：グループの作成を開始します。
		DebugLog.write( this.getClass(), "一括登録：グループの作成を開始します。", DebugLog.ROW );

		// 子ノード保持ベクター
		Vector vecChildNode = new Vector();

		for(Node objChild = objElGroup.getFirstChild();
			objChild != null;
			objChild = objChild.getNextSibling())
		{
			//#TEXT型のインデントは読み飛ばす
			if(objChild.getNodeType() != Node.TEXT_NODE)
			{
				// タグ名称
				String strNodeName = objChild.getNodeName();

				// グループ要素ならば
				if(strNodeName.equalsIgnoreCase(TAG_GROUP))
				{
					// 子ノードベクターに保持する。
					vecChildNode.add( objChild );
				}
				// 個人要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_PEOPLE))
				{
					// 子ノードベクターに保持する。
					vecChildNode.add( objChild );
				}
				// 外部キー要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_FOREIGNID))
				{
					// 外部キー要素値取得
					objGroup.setForeignID(getElementValue(objChild));

					// 更新フラグの取得
					objGroup.mblForeignIDUpFlag = getUpFlag((Element)objChild);

				}
				// グループ名要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_GROUP_NAME))
				{
					// グループ名要素値取得
					objGroup.setGroupName(getElementValue(objChild));

					// 更新フラグの取得
					objGroup.mblGroupNameUpFlag = getUpFlag((Element)objChild);
				}
				// コメント要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_COMMENT))
				{
					// コメント名要素値取得
					objGroup.setCustomMsgDir(getElementValue(objChild));
				}
				// オブジェクトID要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_OID))
				{
					String strOid = getElementValue( objChild );
					// グループのオブジェクトID重複チェックを行います。
					if( mhtbOid.get( strOid ) == null ) {
						// 重複していない場合は重複チェックハッシュテーブルに格納する。
						mhtbOid.put( strOid, strOid );
						// オブジェクトID要素値取得
						objGroup.setOid(getElementValue(objChild));
					}
					else {
						// LOG >err >1
						DebugLog.write( this.getClass(), "グループのオブジェクトIDが重複しています。:: " + strOid, DebugLog.HIGHT );
						// 重複していた場合はエラーとする。
						throw new XMOException( DUPLICATION_OID_WAR );
					}
				}
				// ADDN要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_AD_DN))
				{
					// コメント名要素値取得
					objGroup.setADDN(getElementValue(objChild));
				}
				else
				{
					// 指定タグ以外
					throw new XMOException(TAG_WAR);
				}
			}
		}

		// 所属グループのパラメータチェック
		if(objGroup.checkParseParameter()) {
			// 配下のグループ・ユーザの作成
			for( int i = 0; i < vecChildNode.size(); i++ ) {
				Element objChildNode = (Element)vecChildNode.get(i);
				String strNodeName = objChildNode.getNodeName();

				if( strNodeName.equals( TAG_GROUP ) ) {
					LumpGroup objGroupChild = new LumpGroup();			// 子供グループクラス作成
					objGroup.addChild(objGroupChild);					// 子供グループ追加
					// 親の種別を子にも設定
					objGroupChild.setGroupType( objGroup.getGroupType() );
					objGroup.setType(LumpGroupAndPeople.TYPE_GROUP);	// グループ種別(=1)設定
					makeGroup(objChildNode, objGroupChild);		// 子供グループ要素設定処理(再帰呼出し)
				}
				else {
					LumpPeople objPeople = new LumpPeople();			// 子供個人クラス作成
					objGroup.addChild(objPeople);						// 子供個人追加
					// 親の種別を子にも設定
					objPeople.setUserType( objGroup.getGroupType() );
					objPeople.setType(LumpGroupAndPeople.TYPE_PEOPLE);	// 個人種別(=0)設定
					objPeople.setParent(objGroup);						// 子供個人に親グループ設定
					makePeople(objChildNode, objPeople);			// 子供個人要素設定処理
				}
			}
		}
		else {
			objGroup.boolFailFlag = true;
			// @LOG >err >1
			DebugLog.write(this.getClass(), "グループの必須パラメータが不正です。", DebugLog.HIGHT);
			DebugLog.write(this.getClass(), "ForeignID : " + objGroup.getForeignID(), DebugLog.HIGHT);
			DebugLog.write(this.getClass(), "GroupName : " + objGroup.getGroupName(), DebugLog.HIGHT);
		}


		// @LOG >debug >10 一括登録：グループの作成が終了しました。
		DebugLog.write( this.getClass(), "一括登録：グループの作成が終了しました。" + objGroup.getGroupName(), DebugLog.ROW );
	}

	/**
	 * 個人クラス作成処理<BR>
	 * 個人エレメントから個人クラスを<BR>
	 * 作成します<BR>
	 *
	 * @param Element 個人エレメント
	 * @param LumpPeople 個人クラス
	 * @return void
	 * @exception SAXException
	 * @exception IOException
	 * @exception ParserConfigurationException
	 * @exception XMOException
	 */
	private void makePeople(Element objElPeople, LumpPeople objPeople)
		throws SAXException,IOException,ParserConfigurationException,
				XMOException
	{
		// @LOG >debug >10 一括登録：ユーザの作成を開始します。
		DebugLog.write( this.getClass(), "一括登録：ユーザの作成を開始します。", DebugLog.ROW );

		for(Node objChild = objElPeople.getFirstChild();
			objChild != null;
			objChild = objChild.getNextSibling())
		{
			//#TEXT型のインデントは読み飛ばす
			if(objChild.getNodeType() != Node.TEXT_NODE)
			{
				// タグ名称
				String strNodeName = objChild.getNodeName();

				// 外部キー要素ならば
				if(strNodeName.equalsIgnoreCase(TAG_FOREIGNID))
				{
					// 外部キー要素値取得
					objPeople.setForeignID(getElementValue(objChild));
					// 更新フラグの取得
					objPeople.mblForeignIDUpFlag = getUpFlag((Element)objChild);
				}
				// ログインID要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_LOGINID))
				{
					objPeople.setLoginID(getElementValue(objChild));
					// 更新フラグの取得
					objPeople.mblLoginIDUpFlag = getUpFlag((Element)objChild);
				}
				// ユーザ名要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_USER_NAME))
				{
					objPeople.setUserName(getElementValue(objChild));
					// 更新フラグの取得
					objPeople.mblUserNameUpFlag = getUpFlag((Element)objChild);
				}
				// パスワード要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_PASSWORD))
				{
					objPeople.setEncryptPassword(getElementValue(objChild));
					// 更新フラグの取得
					objPeople.mblPasswordUpFlag = getUpFlag((Element)objChild);
				}
				// 住所要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_ADDRESS))
				{
					objPeople.setContactAddress(getElementValue(objChild));
				}
				// 性別要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_SEX))
				{
					objPeople.setSex(getElementValue(objChild));
				}
				// Eメール1要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_EMAIL1))
				{
					objPeople.setContactEmail(getElementValue(objChild));
				}
				// Eメール2要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_EMAIL2))
				{
					objPeople.setContactEmail2(getElementValue(objChild));
				}
				// カナ要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_KANA))
				{
					objPeople.setReadingName(getElementValue(objChild));
				}
				// 誕生日要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_BIRTHDAY))
				{
					objPeople.setBirthday(getElementValue(objChild));
				}
				// 電話番号要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_TEL))
				{
					objPeople.setContactTel(getElementValue(objChild));
				}
				// コメント要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_COMMENT))
				{
					objPeople.setCustomMsgDir(XMOString.escapeLF(getElementValue(objChild)));
				}
				// オブジェクトID要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_OID))
				{
					// オブジェクトID要素値取得
					objPeople.setOid(getElementValue(objChild));
				}
				// ADDN要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_AD_DN))
				{
					// コメント名要素値取得
					objPeople.setADDN(getElementValue(objChild));
				}
				// ADユーザID要素ならば
				else if(strNodeName.equalsIgnoreCase(TAG_AD_USER_ID))
				{
					// ADユーザID要素値取得
					objPeople.setADUserID(getElementValue(objChild));
				}
				else
				{
					// 項目が不正ですエラー出力
					throw new XMOException(TAG_WAR);
				}
			}
		}

		// @LOG >debug >10 一括登録：ユーザの作成が終了しました。
		DebugLog.write( this.getClass(), "一括登録：ユーザの作成が終了しました。" + objPeople.getUserName(), DebugLog.ROW );

	}

	/**
	 * 要素値取得
	 * @param objElementNode ノードオブジェクト
	 * @return String ノード値
	 */
	private String getElementValue(Node objElementNode)
	{
		String strRet = "";
		Node objTextNode = objElementNode.getFirstChild();
		if(objTextNode != null)
		{
			if(objTextNode.getNodeName().equals("#text"))
			{
				// 空白をとりのぞいた値を設定
				strRet = objTextNode.getNodeValue().trim();
			}
		}
		return strRet;
	}

	/**
	 * 種別属性のチェックを行います。<BR>
	 * 種別属性は4桁の１以上の整数でなければいけません。
	 * @param strType 種別
	 * @return boolean trur: 正しい false: 不正
	 */
	private boolean checkType( String strType ) {
		try {
			int intType = Integer.parseInt( strType );
			if( intType < 1 || intType > 9999 ) {
				return false;
			}
		}
		catch( NumberFormatException ne  ){
			return false;
		}

		return true;
	}

	/**
	 * 更新フラグ属性を取得し、更新フラグを返します。
	 * @param Element
	 * @return boolean true: 更新フラグON false: 更新フラグOFF
	 */
	private boolean getUpFlag( Element objNode )
		throws XMOException
	{
		String strFlag = objNode.getAttribute( ATTR_UPFLAG );
		if( strFlag == null || strFlag.equals( "" ) ) {
			return true;
		}
		else {

			if( strFlag.equals( "on" ) ) {
				return true;
			}
			else if( strFlag.equals( "off" ) ) {
				return false;
			}
			else {
				// LOG >err >1
				DebugLog.write( this.getClass(), "一括登録:更新フラグ(up_flag)には\"on\"または\"off\"を指定してください。", DebugLog.HIGHT );
				// 指定タグ以外
				throw new XMOException(TAG_WAR);
			}
		}
	}
}

