/*  OpenOlap viewer
 *  パッケージ名：openolap.viewer.dao
 *  ファイル：DAOFactory.java
 *  説明：永続化管理クラス群のオブジェクトを生成する抽象クラスです。
 *
 *  作成日: 2004/01/06
 */
package openolap.viewer.dao;

import java.sql.Connection;

import openolap.viewer.Axis;
import openolap.viewer.common.Messages;

/**
 *  抽象クラス：DAOFactory
 *  説明：永続化管理クラス群のオブジェクトを生成する抽象クラスです。
 */
public abstract class DAOFactory {

	// ********** 抽象メソッド **********

	/**
	 * Connection PoolよりConnectionを取得し、Connectionを初期化します。
	 * @return Connection オブジェクト
	 */
	public abstract Connection getConnection();

	/**
	 * ディメンションオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return DimensionDAO オブジェクト
	 */
	public abstract DimensionDAO getDimensionDAO(Connection conn);

	/**
	 * メジャーオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return MeasureDAO オブジェクト
	 */
	public abstract MeasureDAO getMeasureDAO(Connection conn);

	/**
	 * メジャーメンバーオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return MeasureMemberDAO オブジェクト
	 */
	public abstract MeasureMemberDAO getMeasureMemberDAO(Connection conn);

	/**
	 * レポートオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return ReportDAO オブジェクト
	 */
	public abstract ReportDAO getReportDAO(Connection conn);

	/**
	 * キューブオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return CubeDAO オブジェクト
	 */
	public abstract CubeDAO getCubeDAO(Connection conn);

	/**
	 * 軸レベルオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return AxisLevelDAO オブジェクト
	 */
	public abstract AxisLevelDAO getAxisLevelDAO(Connection conn);

	/**
	 * ディメンションメンバーオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return DimensionMemberDAO オブジェクト
	 */
	public abstract DimensionMemberDAO getDimensionMemberDAO(Connection conn);

	/**
	 * セルデータオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return CellDataDAO オブジェクト
	 */
	public abstract CellDataDAO getCellDataDAO(Connection conn);

	/**
	 * メジャーメンバータイプオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return MeasureMemberTypeDAO オブジェクト
	 */
	public abstract MeasureMemberTypeDAO getMeasureMemberTypeDAO(Connection conn);

	/**
	 * 軸オブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return PostgresAxisDAO オブジェクト
	 */
	public abstract AxisDAO getAxisDAO(Connection conn);

	/**
	 * 軸メンバーオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return AxisMemberDAO オブジェクト
	 */
	public abstract AxisMemberDAO getAxisMemberDAO(Connection conn);

	/**
	 * 軸メンバーオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @param axis 軸をあらわすオブジェクト
	 * @return AxisMemberDAO オブジェクト
	 */
	public abstract AxisMemberDAO getAxisMemberDAO(Connection conn, Axis axis);

	/**
	 * 色オブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return ColorDAO オブジェクト
	 */
	public abstract ColorDAO getColorDAO(Connection conn);

	/**
	 * ユーザーオブジェクトの永続化を管理するオブジェクトを求める。
	 * @param conn Connection オブジェクト
	 * @return UserDAO オブジェクト
	 */
	public abstract UserDAO getUserDAO(Connection conn); 

	// ********** メソッド **********

	/**
	 * データソースのタイプに応じたFactoryオブジェクトを求めます。
	 *   データソースのタイプ：viewer.propertiesの"DAOFactory.sourceName"で指定
	 * @return DAOFactory オブジェクト
	 */
	public static DAOFactory getDAOFactory() {
		String sourceName = Messages.getString("DAOFactory.sourceName"); //$NON-NLS-1$
		if (sourceName.equals("postgreSQL")) { //$NON-NLS-1$
			return new PostgresDAOFactory();
		} else {
			throw new UnsupportedOperationException();
		}
	}

}
