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

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

import java.util.ArrayList;
import java.util.List;

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


/**
 * シングルサインオン機能で使用する設定リソースアクセスクラス
 * 
 * @author Hiroshi.Ebata(INFOCITY)
 * @version $Revision: 1.2 $ $Date: 2005/11/15 18:12:24 $
 */
public class SSOConfig {

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

	/**
	 * プロバイダ名取得
	 * ※ソースID生成に使用
	 * 
	 * @return String プロバイダ名
	 * @throws ResourceParseException
	 */
	public static final String getProvider() throws ResourceParseException {
		String expression = "sso/provider";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * アサーション発行元名取得
	 * 
	 * @return String アサーション発行元名
	 * @throws ResourceParseException
	 */
	public static final String getIssuer() throws ResourceParseException {
		String expression = "sso/issuer";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * SAMLアサーションに含める属性名のリストを取得
	 * 
	 * @return List<String> アサーションに含める属性名のリスト
	 * @throws ResourceParseException
	 */
	public static final List<String> getSAMLAttributeList() throws ResourceParseException {
		String expression = "sso/saml_attribute/name";
		NodeList nodeList = ResourceUtils.getNodeSet(SSOConfig.resourcePath, expression);
		List<String> list = new ArrayList<String>();
		for(int i = 0; i < nodeList.getLength(); i++) {
			list.add(ResourceUtils.getTextContent(nodeList.item(i)));
		}
		return list;
	}

	/**
	 * アサーション有効期限（秒）を取得
	 * 
	 * @return Integer アサーション有効期限（秒）
	 * @throws ResourceParseException
	 */
	public static final Integer getAssertionLife() throws ResourceParseException {
		String expression = "sso/assertion_life";
		return new Integer(ResourceUtils.getString(SSOConfig.resourcePath, expression));
	}

	/**
	 * 認証オーソリティクラス名取得。
	 * 
	 * @return String 認証オーソリティクラス名
	 * @throws ResourceParseException
	 */
	public static final String getAuthenticationAuthorityClass() throws ResourceParseException {
		String expression = "sso/authority/authentication-class";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * 属性オーソリティクラス名取得。
	 * 
	 * @return String 属性オーソリティクラス名
	 * @throws ResourceParseException
	 */
	public static final String getAttributeAuthorityClass() throws ResourceParseException {
		String expression = "sso/authority/attribute-class";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * ポリシー決定点クラス名取得。
	 * 
	 * @return String ポリシー決定点クラス名
	 * @throws ResourceParseException
	 */
	public static final String getPolicyDecisionPointClass() throws ResourceParseException {
		String expression = "sso/authority/policy-decision-class";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * ID管理クラス名取得。
	 * 
	 * @return String ID管理クラス名
	 * @throws ResourceParseException
	 */
	public static final String getIDProviderClass() throws ResourceParseException {
		String expression = "sso/idprovider-class";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * キーストアのパス取得。
	 * 
	 * @return String キーストアのパス
	 * @throws ResourceParseException
	 */
	public static final String getKeyStorePath() throws ResourceParseException {
		String expression = "sso/signature/keystore/path";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * キーストアのエイリアス取得。
	 * 
	 * @return String キーストアのエイリアス
	 * @throws ResourceParseException
	 */
	public static final String getKeyStoreAlias() throws ResourceParseException {
		String expression = "sso/signature/keystore/alias";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * キーストアのパスワード取得。
	 * 
	 * @return String キーストアのパスワード
	 * @throws ResourceParseException
	 */
	public static final String getKeyStorePassword() throws ResourceParseException {
		String expression = "sso/signature/keystore/password";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * 証明書のパス取得。
	 * 
	 * @return String 証明書のパス
	 * @throws ResourceParseException
	 */
	public static final String getCertPath() throws ResourceParseException {
		String expression = "sso/signature/cert-path";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

	/**
	 * ログインキー名を取得する。
	 * 
	 * @return String ログインキー名
	 * @throws ResourceParseException
	 */
	public static final String getLoginKey() throws ResourceParseException {
		String expression = "sso/login-key";
		return ResourceUtils.getString(SSOConfig.resourcePath, expression);
	}

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

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

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

	/**
	 * クラスタリングサーバIPアドレス取得。
	 * 
	 * @return String クラスタリングサーバIPアドレス
	 * @throws ResourceParseException
	 */
	public static final Friend[] getFriends() throws ResourceParseException {
		String expression = "ssocluster/friends_ip";
		NodeList list = ResourceUtils.getNodeSet(SSOConfig.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();
	}

}
