/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2006 satoshi akabane(akabane@logical-paradox.org)
 * $Id: RCMContentsRegisterImpl.java,v 1.6 2006/01/27 16:39:04 rampil Exp $
 */
package org.logical_paradox.rss.rcm;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.logical_paradox.rss.http.WebContents;
import org.logical_paradox.rss.rcm.accessor.ContentsAccessor;

/**
 * RCMContentsRegisterImpl
 * Webコンテンツサーバーと通信するためのコンテンツ登録クライアントオブジェクト
 * Webコンテンツサーバー上で動作する
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.6 $
 */
public class RCMContentsRegisterImpl extends UnicastRemoteObject implements RCMContentsRegister {
	/** シリアルバージョンUID */
	private static final long serialVersionUID = -3491241043496340100L;

	/** ロガー */
	private static final Log log = LogFactory.getLog(RCMContentsRegisterImpl.class);

	protected ContentsAccessor accessor = null;				// コンテンツデータにアクセスするためのインターフェースオブジェクト
	protected RSSRCMConfig cfg = null;						// コンテンツ管理システムの設定
	private final String rkey;								// このインターフェース固有のキー
	private ContentsStoreAgent[] agents = null;				// コンテンツ登録エージェント


	/**
	 * コンストラクタ
	 * 引数にはコンテンツデータへのアクセス方法を実装したインターフェースを指定する
	 */
	public RCMContentsRegisterImpl(String registerName, RSSRCMConfig conf, ContentsAccessor a) throws RemoteException {
		rkey = registerName;
		accessor = a;
		cfg = conf;

		log.info("レジスタサービス[" + rkey + "]を初期化しています");

		// コンテンツ登録エージェントを生成する
		agents = new ContentsStoreAgent[ cfg.getAgentsPerRegister() ];
		for(int i = 0; i < agents.length; i++) {
			agents[i] = new ContentsStoreAgent(a, cfg);
		}

		log.info("コンテンツ登録エージェントを" + agents.length + "個生成しました");

		log.info("レジスタサービスが[" + rkey + "]という名前で作成されました");

		// エージェントの実行を開始する
		start();
	}

	/**
	 * コンテンツ登録エージェントを開始する
	 * ※このメソッドはリモートからは使用できない
	 */
	protected void start() {
		for(int i = 0; i < agents.length; i++) {
			agents[i].start();
		}

		log.info("コンテンツ登録エージェントを開始しました");
	}
	/**
	 * コンテンツ登録エージェントを停止する
	 * ※このメソッドはリモートからは使用できない
	 */
	protected void stop() {
		try {
			for(ContentsStoreAgent agent : agents) {
				agent.done();
			}
			for(ContentsStoreAgent agent : agents) {
				agent.join();
			}
		} catch(InterruptedException ie) {}
		log.info("コンテンツ登録エージェントを停止しました");
	}

	/**
	 * コンテンツレジスタサービスの固有名を返す
	 */
	public String getRegisterName() throws RemoteException {
		return rkey;
	}
	/**
	 * コンテンツを登録する
	 * @param contents コンテンツデータ
	 * @throws RemoteException 登録に失敗した
	 */
	public void registContents(WebContents contents) throws RemoteException {
		try {
			// 登録
			cfg.getContentsQueue().enqueue(contents);
		} catch(Exception e) {
			throw new RemoteException(e.getMessage());
		}
	}

	/**
	 * コンテンツが登録されているかどうかを調べる
	 */
	public boolean isRegistered(String url) throws RemoteException {
		try {
			// 調査
			if(accessor.find(url) == null) {
				return false;
			} else {
				return true;
			}
		} catch(Exception e) {
			throw new RemoteException(e.getMessage());
		}
	}

	/**
	 * コンテンツの登録を解除する
	 */
	public void unregistContents(String url) throws RemoteException {
		try {
			accessor.unregist(url);
		} catch(Exception e) {
			throw new RemoteException(e.getMessage());
		}
	}

	/**
	 * 全てのコンテンツを削除する
	 */
	public void unregistAll() throws RemoteException {
		try {
			accessor.unregistAll();
		} catch(Exception e) {
			throw new RemoteException(e.getMessage());
		}
	}

	/**
	 * このインターフェース固有のIDを返す
	 */
	public String getRegisterKey() throws RemoteException {
		return rkey;
	}

	/**
	 * コンテンツ登録クライアントを停止する．
	 * @throws RemoteException 停止に失敗した
	 */
	public void shutdown() throws RemoteException {
		stop();
	}
}

// end of RCMContentsRegisterImpl.java
