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

import info.dragonlady.sso.SSOConfig;
import info.dragonlady.sso.util.ResourceParseException;

import org.opensaml.SAMLAttributeQuery;
import org.opensaml.SAMLAuthenticationQuery;
import org.opensaml.SAMLAuthorizationDecisionQuery;
import org.opensaml.SAMLQuery;
import org.opensaml.SAMLRequest;

/**
 * SAMLオーソリティ提供クラス。
 * 
 * @author Hiroshi.Ebata(INFOCITY)
 * @version $Revision: 1.0 $ $Date: 2007/04/24 21:04:17 $
 */
public class SAMLAuthorityProvider {

	/**
	 * SAML要求に従って、SAMLオーソリティクラスインスタンスを取得。
	 * 
	 * @param request SAML要求
	 * @return SAMLAuthority SAMLオーソリティクラスインスタンス
	 * @throws ResourceParseException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 */
	public static final SAMLAuthority getAuthority(SAMLRequest request) throws ResourceParseException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		SAMLAuthority authority = null;
		SAMLQuery query = request.getQuery();
		if(query instanceof SAMLAuthenticationQuery) {
			authority = getAuthenticationAuthority();
		} else if(query instanceof SAMLAttributeQuery) {
			authority = getAttributeAuthority();
		} else if(query instanceof SAMLAuthorizationDecisionQuery) {
			authority = getPolicyDecisionPoint();
		}
		return authority;
	}

	/**
	 * 認証オーソリティインスタンス取得。
	 * 
	 * @return SAMLAuthority 認証オーソリティインスタンス
	 * @throws ResourceParseException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 */
	public static final SAMLAuthority getAuthenticationAuthority() throws ResourceParseException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		return getAuthority(SSOConfig.getAuthenticationAuthorityClass());
	}

	/**
	 * 属性オーソリティインスタンス取得。
	 * 
	 * @return SAMLAuthority 属性オーソリティインスタンス
	 * @throws ResourceParseException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 */
	public static final SAMLAuthority getAttributeAuthority() throws ResourceParseException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		return getAuthority(SSOConfig.getAttributeAuthorityClass());
	}

	/**
	 * ポリシー決定点インスタンス取得。
	 * 
	 * @return SAMLAuthority ポリシー決定点インスタンス
	 * @throws ResourceParseException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 */
	public static final SAMLAuthority getPolicyDecisionPoint() throws ResourceParseException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		return getAuthority(SSOConfig.getPolicyDecisionPointClass());
	}

	/**
	 * 指定されたクラス名のSAMLオーソリティインスタンスを取得。
	 * 
	 * @param className SAMLオーソリティクラス名
	 * @return SAMLAuthority SAMLオーソリティインスタンス
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 */
	public static final SAMLAuthority getAuthority(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		return (SAMLAuthority)Class.forName(className).newInstance();
	}

}
