/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: StandAloneContentsRegister.java,v 1.7 2006/02/21 14:54:48 akabane Exp $
 */
package org.logical_paradox.rss.lcmgr;

import static org.logical_paradox.rss.rcm.accessor.ContentsAccessorFactory.PARAM_ACCESSOR_CLASSNAME;
import static org.logical_paradox.rss.rcm.accessor.ContentsAccessorFactory.PARAM_CONTENTS_ENCODING;
import static org.logical_paradox.rss.rcm.accessor.ContentsAccessorFactory.PARAM_DSR_URI;
import static org.logical_paradox.rss.rcm.accessor.ContentsAccessorFactory.PARAM_INIT_PARAM;

import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.logical_paradox.common.util.ExceptionUtils;
import org.logical_paradox.rss.http.WebContents;
import org.logical_paradox.rss.rcm.ContentsRegister;
import org.logical_paradox.rss.rcm.accessor.ContentsAccessor;
import org.logical_paradox.rss.rcm.accessor.ContentsAccessorFactory;
import org.logical_paradox.rss.util.RandomKeyGenerator;

/**
 * StandAloneContentsRegister
 * スタンドアローン版のコンテンツ登録クライアントオブジェクト．
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.7 $
 */
public class StandAloneContentsRegister implements ContentsRegister {
	/** ロガー */
	private static final Log log = LogFactory.getLog(StandAloneContentsRegister.class);
	/** コンテンツを格納しているストレージにアクセスするためのインターフェース */
	private ContentsAccessor accessor = null;
	/** このインターフェースが有効かどうか */
	private boolean activeFlag = false;
	/** コンテンツレジスタ名 */
	private final String rkey;

	/**
	 * コンストラクタ．
	 * @param config ローカルコンテンツ管理システムのコンフィグレーション
	 * @param connstr 接続文字列
	 */
	public StandAloneContentsRegister(RSSLCConfig config) {
		try {
			Properties initparam = new Properties();
			initparam.setProperty(PARAM_ACCESSOR_CLASSNAME, config.getContentsAccessor());
			initparam.setProperty(PARAM_DSR_URI, config.getRssDsr());
			initparam.setProperty(PARAM_INIT_PARAM, config.getContentsConnStr());
			initparam.setProperty(PARAM_CONTENTS_ENCODING, config.getContentsEncoding());
			ContentsAccessorFactory factory = new ContentsAccessorFactory(initparam);
			accessor = factory.getAccessor();
			activeFlag = true;
		} catch(ClassNotFoundException e) {
			activeFlag = false;
			log.error("コンテンツアクセスのためのインターフェースを取得できませんでした");
		} finally {
			rkey = "localreg_" + RandomKeyGenerator.getUniqKey();
		}
	}

	/**
	 * コンテンツレジスタ名を返す．
	 * @return コンテンツレジスタ名
	 */
	public String getRegisterName() {
		return rkey;
	}
	/**
	 * コンテンツを登録する．
	 * @param contents コンテンツ
	 */
	public void registContents(WebContents contents) {
		if(contents == null || isActive() == false) {
			return;
		}
		try {
			accessor.regist(contents);
		} catch(Exception e) {
			log.warn("コンテンツの登録に失敗しました:" + ExceptionUtils.stackTraceToString(e));
		}
	}

	/**
	 * コンテンツが登録されているかどうかを返す．
	 * @param url URL
	 * @return true:登録されている / false:登録されていない
	 */
	public boolean isRegistered(String url) {
		if(isActive() == false) {
			return false;
		}
		try {
			return accessor.find(url) != null ? true : false;
		} catch(Exception e) {
			return false;
		}
	}

	/**
	 * コンテンツの登録を解除する．
	 * @param url 登録解除するURL
	 */
	public void unregistContents(String url) {
		if(isActive() == false) {
			return;
		}
		try {
			accessor.unregist(url);
		} catch(Exception e) {
		}
	}

	/**
	 * 登録されている全てのコンテンツを削除する．
	 */
	public void unregistAll() {
		if(isActive() == false) {
			return;
		}
		try {
			accessor.unregistAll();
		} catch(Exception e) {
		}
	}

	/**
	 * このレジスタI/Fが有効かどうかを返す
	 * @return true:有効 / false:無効
	 */
	private boolean isActive() {
		return activeFlag;
	}
	/**
	 * コンテンツ登録クライアントを停止する．
	 * @throws RemoteException 停止に失敗した
	 */
	public void shutdown() {
		accessor.close();
	}
}
