/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: StandAloneContentsRegister.java,v 1.3 2005/10/17 15:12:34 rampil Exp $
 */
package org.logical_paradox.rss.lcmgr;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.3 $
 */
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 {
			ContentsAccessorFactory factory = new ContentsAccessorFactory(config.getContentsAccessor(), config.getContentsConnStr());
			accessor = factory.getAccessor();
			activeFlag = true;
		} catch(Exception e) {
			activeFlag = false;
			log.error("コンテンツアクセスのためのインターフェースを取得できませんでした");
		} finally {
			rkey = "localreg_" + RandomKeyGenerator.getUniqKey();
		}
	}

	/**
	 * コンテンツレジスタ名を返す．
	 * @return コンテンツレジスタ名
	 */
	public String getRegisterName() {
		return rkey;
	}
	/**
	 * コンテンツを登録する．
	 * @param url URL
	 * @param contents コンテンツ
	 */
	public void registContents(String url, String contents) {
		if(url == null || url.trim().length() == 0 || contents == null || contents.trim().length() == 0) {
			return;
		}
		if(isActive() == false) {
			return;
		}
		try {
			accessor.regist(url, contents);
		} catch(Exception 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();
	}
}
