package jp.co.denso.fa.jmscaosql;

import java.util.List;

import jp.co.denso.fa.jmscaosql.jms.JmsCaoSQLProducer;
import jp.co.denso.fa.jmscaosql.util.JmsCaoSQLConfigurator;

import org.springframework.beans.factory.annotation.Autowired;

/**
 * jmsCaoSQLクライアントの抽象クラス
 *
 * @author DENSO WAVE
 * @version 1.00
 */
public abstract class AbstructJmsClient {
	/**
	 * プロパティファイルのコントローラー名のKEY文字列
	 */
	protected final String KEY_CONTROLLER_NAMES = "event.listen.target";

	/**
	 * Topicの区切り文字を取得するためのKEY文字列
	 */
	protected final String KEY_TOPIC_DELIMITER = "jms.topic.delimiter";

	/**
	 * Topic名の前に付与する文字列
	 */
	protected final String KEY_TOPIC_PREFIX = "jms.topic.prefix";

	/**
	 * イベント監視状態。
	 */
	protected boolean isRunning = false;

	/**
	 * 設定情報管理クラス。
	 */
	protected JmsCaoSQLConfigurator config = JmsCaoSQLConfigurator.getInstance();

	/**
	 * JMSメッセージ送信実行オブジェクト
	 */
	@Autowired
	protected JmsCaoSQLProducer producer;

	/**
	 * JMSメッセージ送信実行オブジェクトを返します。
	 *
	 * @return JMSメッセージ送信実行オブジェクト
	 */
	public JmsCaoSQLProducer getProducer() {
		return producer;
	}

	/**
	 * JMSメッセージ送信実行オブジェクトを設定します。
	 *
	 * @param producer JMSメッセージ送信実行オブジェクト
	 */
	public void setProducer(JmsCaoSQLProducer producer) {
		this.producer = producer;
	}

	/**
	 * イベント監視状態を返します。
	 *
	 * @return イベント監視状態
	 */
	public boolean isRunning() {
		return this.isRunning;
	}

	/**
	 * 初期化処理を行います。<br>
	 * jmscaosql.propertiesで指定されたCaoSQLControllerに対して、イベント監視を開始します。
	 *
	 * @return イベント開始エラーとなったコントローラー名のリスト
	 * @throws Exception
	 */
	abstract public List<String> init() throws Exception;

	/**
	 * CaoSQLControllerのイベント監視を終了し、リソースを解放します。
	 */
	abstract public void stop();

	/**
	 * イベント監視対象コントローラーを追加 <br>
	 *
	 * @param ctrlName コントローラー名
	 * @throws Exception
	 */
	abstract public void attachListener(final String ctrlName) throws Exception;

	/**
	 * コントローラーのイベント監視を解除します。 <br>
	 *
	 * @param ctrlName コントローラー名
	 * @throws Exception
	 */
	abstract public void detatchListener(final String ctrlName) throws Exception;

	/**
	 * 同期状態でスレッドを待機します。
	 *
	 * @param time 待機時間(ミリ秒)
	 */
	protected synchronized void sleep(int time) {
		try {
			wait(time);
		} catch (InterruptedException e) {
		}
	}
}
