/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	メニューカスタマイズ定義マネージャー
//
//		変更履歴
//			2005.02.19  新規作成  梅原 浩司
//
//	機能
//
//	このクラスはメニューカスタマイズ定義マネージャークラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.xml.sax.SAXException;

/**
* メニューカスタマイズ定義マネージャークラス
* 
* @author yasu
* @version 1.0
*/
public class CustomMenuManager
{
	// 結果を表す定数
	public static final int RESULT_USERDEF = 0;
	public static final int RESULT_GROUPDEF = 1;
	public static final int RESULT_DEFAULTDEF = 2;
	public static final int RESULT_ERROR = 3;
	
	private static final String DEFAULT_BASE_DIR_KEY = "jp.co.ntt.lms.xmf.customizemenu.basedir";

	// カスタムメニュー定義オブジェクト
	private CustomMenuDef customMenuDef;
	
	private String baseDir = null;
	
	/**
	 * デフォルト定義の読み込みを行う。
	 * 
	 * @param servletContext ServletContextオブジェクト
	 * @return int 結果を表す定数
	 */
	public int loadDefaultDef(ServletContext servletContext)
	{
		return loadDef(servletContext, "", "");
	}

	/**
	 * 定義ファイルの読み込みを行う。
	 * 
	 * @param servletContext ServletContextオブジェクト
	 * @param userId 定義ファイルを読み込むユーザID
	 * @param groupId 定義ファイルを読み込むグループID
	 * @return int 結果を表す定数
	 */
	public int loadDef(ServletContext servletContext, String userId, String groupId)
	{
		return loadDef(servletContext, DEFAULT_BASE_DIR_KEY, userId, groupId);
	}
	
	/**
	 * 定義ファイルの読み込みを行う。
	 * 
	 * @param servletContext ServletContextオブジェクト
	 * @param baseDirKey ベースディレクトリのキー
	 * @param userId 定義ファイルを読み込むユーザID
	 * @param groupId 定義ファイルを読み込むグループID
	 * @return int 結果を表す定数
	 */
	protected int loadDef(ServletContext servletContext, String baseDirKey, String userId, String groupId)
	{
		int result = RESULT_ERROR;
		DocumentBuilder parser = null;
		try
		{
			parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			baseDir = servletContext.getInitParameter(baseDirKey);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return result;
		}
		if (baseDir == null)
		{
			return result;
		}
		else
		{
			if (!baseDir.endsWith("/"))
			{
				baseDir = baseDir.concat("/");
			}
		}
		try
		{
			//デフォルト定義の読み込み
			loadDefaultDef(parser, servletContext, baseDir, userId, groupId);
			result = RESULT_DEFAULTDEF;
			if (userId == null) userId = "";
			if (groupId == null) groupId = "";
			if (userId.length() == 0 && groupId.length() == 0)
			{
				return result;
			}
			//グループ定義の読み込み
			loadGroupDef(parser, servletContext, baseDir, userId, groupId);
			result = RESULT_GROUPDEF;
			//ユーザー定義の読み込み
			loadUserDef(parser, servletContext, baseDir, userId, groupId);
			result = RESULT_USERDEF;
		}
		catch (IOException ex1)
		{
			switch (result)
			{
			case 3:
				//デフォルト定義読み込み時にエラー
				//異常終了とする
				break;
			case 2:
				//グループ定義読み込み時にエラー
				try
				{
					//ユーザー定義の読み込み
					loadUserDef(parser, servletContext, baseDir, userId, groupId);
					result = RESULT_USERDEF;
				}
				catch (SAXException ex)
				{
					ex.printStackTrace();
					result = RESULT_ERROR;
				}
				catch (IOException ex)
				{
					//グループ定義もユーザー定義もない。
				}
				break;
			case 1:
				break;
			}
		}
		catch (SAXException e)
		{
			e.printStackTrace();
			result = 3;
		}
		return result;
	}
	
	/**
	 * カスタムメニュー定義オブジェクトを取得する。
	 * 
	 * @return CustomMenuDef カスタムメニュー定義オブジェクト
	 */
	public CustomMenuDef getCustomMenuDef()
	{
		return customMenuDef;
	}

	/**
	 * デフォルト定義の読み込みを行う。
	 * 
	 * @param parser DocumentBuilderオブジェクト
	 * @param servletContext ServletContextオブジェクト
	 * @param baseDir ベースディレクトリキー
	 * @param userId ユーザーID
	 * @param groupId グループID
	 * @throws SAXException
	 * @throws IOException
	 */
	protected void loadDefaultDef(DocumentBuilder parser,
			ServletContext servletContext, String baseDir, String userId, String groupId) throws SAXException,
			IOException
	{
		CustomMenuDef menuDef = new CustomMenuDef(CustomMenuDef.DEFTYPE_DEFAULT, userId, groupId);
		String path = baseDir + "custom-menudef.xml";
		menuDef.loadMenuDef(parser, servletContext.getResourceAsStream(path));
		customMenuDef = menuDef;
	}

	/**
	 * グループ定義の読み込みを行う。
	 * 
	 * @param parser DocumentBuilderオブジェクト
	 * @param servletContext ServletContextオブジェクト
	 * @param baseDir ベースディレクトリキー
	 * @param userId ユーザーID
	 * @param groupId グループID
	 * @throws SAXException
	 * @throws IOException
	 */
	protected void loadGroupDef(DocumentBuilder parser,
			ServletContext servletContext, String baseDir, String userId, String groupId) throws SAXException,
			IOException
	{
		CustomMenuDef menuDef = new CustomMenuDef(CustomMenuDef.DEFTYPE_GROUP, userId, groupId);
		String path = "";
		if (groupId != null && groupId.length() > 0)
		{
			path = baseDir + "groups/" + groupId + "/custom-menudef.xml";
		}
		else
		{
			path = baseDir + "groups/custom-menudef.xml";
		}
		menuDef.loadMenuDef(parser, servletContext.getResourceAsStream(path));
		customMenuDef = menuDef;
	}

	/**
	 * ユーザー定義の読み込みを行う。
	 * 
	 * @param parser DocumentBuilderオブジェクト
	 * @param servletContext ServletContextオブジェクト
	 * @param baseDir ベースディレクトリキー
	 * @param userId ユーザーID
	 * @param groupId グループID
	 * @throws SAXException
	 * @throws IOException
	 */
	protected void loadUserDef(DocumentBuilder parser,
			ServletContext servletContext, String baseDir, String userId, String groupId) throws SAXException,
			IOException
	{
		CustomMenuDef menuDef = new CustomMenuDef(CustomMenuDef.DEFTYPE_USER, userId, groupId);
		String path = "";
		if (userId != null && userId.length() > 0)
		{
			path = baseDir + "users/" + userId + "/custom-menudef.xml";
		}
		else
		{
			path = baseDir + "users/custom-menudef.xml";
		}
		menuDef.loadMenuDef(parser, servletContext.getResourceAsStream(path));
		customMenuDef = menuDef;
	}
	
	/**
	 * カスタムメニュー定義をファイルに出力する。
	 * 
	 * @param servletContext ServletContextオブジェクト
	 * @throws IOException IOエラー例外
	 */
	public void saveDefaultDef(ServletContext servletContext)
		throws IOException
	{
		String path = baseDir + "custom-menudef.xml";
		customMenuDef.saveMenuDef(servletContext.getRealPath(path));
	}
	
	/**
	 * カスタムメニュー定義をファイルに出力する。
	 * 
	 * @param servletContext ServletContextオブジェクト
	 * @param CustomMenuDef カスタムメニュー定義オブジェクト
	 * @throws IOException IOエラー例外
	 */
	public void saveDefaultDef(ServletContext servletContext, CustomMenuDef menuDef)
		throws IOException
	{
		customMenuDef = menuDef;
		baseDir = servletContext.getInitParameter(DEFAULT_BASE_DIR_KEY);
		if (!baseDir.endsWith("/"))
		{
			baseDir = baseDir.concat("/");
		}
		saveDefaultDef(servletContext);
	}
		
}
