/*
 * @(#)SSOServletConfig.java
 *
 * Copyright (C) 2006 Infocity Inc. All Rights Reserved.
 */
package info.dragonlady.sso.helper;

import java.util.HashMap;
import java.util.Map;

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

import info.dragonlady.cluster.Friend;
import info.dragonlady.sso.util.ResourceParseException;
import info.dragonlady.sso.util.ResourceUtils;

/**
 * SSOサーブレット用の設定取得クラス。
 * 
 * @author Hiroshi.Ebata(INFOCITY)
 * @version $Revision: 1.0 $ $Date: 2006/11/21 20:42:40 $
 */
public class SSOServletConfig {

	/**
	 * リソースパス。
	 */
	private static final String resourcePath = "resources/sso_lib_config.xml";

	/**
	 * 認証処理が必要かどうかを論理値で返す。
	 * 
	 * @param kind 設定種別
	 * @return boolean true：認証処理が必要／false：認証処理が不要
	 * @throws ResourceParseException
	 */
	public static final boolean isAuthRequired(String kind) throws ResourceParseException {
		String expression = "sso_lib/auth-settings/auth[@kind='"+kind+"']/@auth-required";
		return Boolean.valueOf(ResourceUtils.getString(SSOServletConfig.resourcePath, expression)).booleanValue();
	}

	/**
	 * 認証処理実装クラス名を取得する。
	 * 
	 * @param kind 設定種別
	 * @return String 認証処理実装クラス名
	 * @throws ResourceParseException
	 */
	public static final String getAuthClassName(String kind) throws ResourceParseException {
		String expression = "sso_lib/auth-settings/auth[@kind='"+kind+"']/@auth-class";
		return ResourceUtils.getString(SSOServletConfig.resourcePath, expression);
	}

	/**
	 * アサーション属性マップ生成処理実装クラス名を取得する。
	 * 
	 * @param kind 設定種別
	 * @return String アサーション属性マップ生成処理実装クラス名
	 * @throws ResourceParseException
	 */
	public static final String getAttributesClassName(String kind) throws ResourceParseException {
		String expression = "sso_lib/auth-settings/auth[@kind='"+kind+"']/@attr-class";
		return ResourceUtils.getString(SSOServletConfig.resourcePath, expression);
	}

	/**
	 * 要求パラメータの認証IDのキー名を取得する。
	 * 
	 * @return String 要求パラメータの認証IDのキー名
	 * @throws ResourceParseException
	 */
	public static final String getRequestParamLoginKey() throws ResourceParseException {
		String expression = "sso_lib/session-attributes/login-key/@request-param";
		return ResourceUtils.getString(SSOServletConfig.resourcePath, expression);
	}

	/**
	 * セッション属性に設定する認証IDのキー名を取得する。
	 * 
	 * @return String セッション属性に設定する認証IDのキー名
	 * @throws ResourceParseException
	 */
	public static final String getSessionLoginKey() throws ResourceParseException {
		String expression = "sso_lib/session-attributes/login-key";
		return ResourceUtils.getString(SSOServletConfig.resourcePath, expression);
	}

	/**
	 * 要求パラメータ名とセッション属性キー名のマッピングを取得する。
	 * 
	 * @return Map key：要求パラメータ名、value：セッション属性キー名
	 * @throws ResourceParseException
	 */
	public static final Map getSessionAttributeKeys() throws ResourceParseException {
		String expression = "sso_lib/session-attributes/key";
		NodeList nodeList = ResourceUtils.getNodeSet(SSOServletConfig.resourcePath, expression);
		Map map = new HashMap();
		for(int i = 0; i < nodeList.getLength(); i++) {
			Node node = nodeList.item(i);
			String requestParam = node.getAttributes().getNamedItem("request-param").getNodeValue();
			map.put(requestParam, ResourceUtils.getTextContent(node));
		}
		return map;
	}

	/**
	 * エラー時のリダイレクション先を取得する。
	 * 
	 * @return String リダイレクション先
	 * @throws ResourceParseException
	 */
	public static final String getRedirection() throws ResourceParseException {
		String expression = "sso_lib/redirection";
		return ResourceUtils.getString(SSOServletConfig.resourcePath, expression);
	}

	/**
	 * サーバ連携サービスアドレスを取得する。
	 * 
	 * @return String リダイレクション先
	 * @throws ResourceParseException
	 */
	public static final String getCooperationService() throws ResourceParseException {
		String expression = "sso_lib/cooperation-service";
		return ResourceUtils.getString(SSOServletConfig.resourcePath, expression);
	}

	/**
	 * スタンドアロンで動作するか否か（クラスタリングを行うか否か）。
	 * 
	 * @return boolean true：スタンドアロン（クラスタリングを行わない）／false：スタンドアロンでない（クラスタリングを行う）
	 * @throws ResourceParseException
	 */
	public static final boolean isClusterStandalone() throws ResourceParseException {
		String expression = "sso_lib/cluster/@standalone";
		return Boolean.valueOf(ResourceUtils.getString(SSOServletConfig.resourcePath, expression)).booleanValue();
	}

	/**
	 * クラスタリングサーバIPアドレス取得。
	 * 
	 * @return String クラスタリングサーバIPアドレス
	 * @throws ResourceParseException
	 */
	public static final Friend[] getFriends() throws ResourceParseException {
		String expression = "sso_lib/cluster/friends_ip";
		NodeList list = ResourceUtils.getNodeSet(SSOServletConfig.resourcePath, expression);
		Friend[] friends = new Friend[list.getLength()];
		for(int i = 0; i < list.getLength(); i++) {
			Node node = list.item(i);
			NamedNodeMap paramMap = node.getAttributes();
			String host = paramMap.getNamedItem("host").getNodeValue();
			String port = paramMap.getNamedItem("port").getNodeValue();
			Friend friend = new Friend();
			friend.setHost(host);
			friend.setPort(port);
			friends[i] = friend;
		}
		return friends;
	}

	/**
	 * RMIサービス名取得。
	 * 
	 * @param ipAddress IPアドレス
	 * @param port ポート番号
	 * @param serviceName サービス名
	 * @return String ユーザ管理サービス名
	 */
	public static final String getServiceName(String ipAddress, String port, String serviceName) {
		StringBuffer name = new StringBuffer();
		name.append("//");
		name.append(ipAddress);
		name.append(":");
		name.append(port);
		name.append("/");
		name.append(serviceName);
		return name.toString();
	}

}
