package org.logical_paradox.rss.http;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * サイト情報
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class Site {
	private RobotAcceptanceRule robotstxt = null;		// robots.txtの内容
	private String siteName = null;					// サイト名(FQDN)
	private String url = null;							// URL
	private String robotstxtURL = null;				// robots.txtのURL
	public int siteScaleIndex = 0;						// サイト規模指数

	/**
	 * コンストラクタ．
	 * @param u url
	 */
	protected Site(String u) {
		url = u;
	}

	/**
	 * サイト情報を示すオブジェクトを生成する．
	 * 生成に失敗(=そんなサイトがないとか)した場合はIOExceptionを返す
	 * @param url URL
	 * @param userAgent user-agent
	 * @throws IllegalArgumentException URLが不正だった
	 */
	public static Site getInstance(String url, String userAgent) throws IllegalArgumentException {
		Site s = new Site(url);

		// robots.txtの配置場所を作成する
		URL u = null;

		try {
			u = new URL(url);
		} catch(MalformedURLException ue) {
			throw new IllegalArgumentException(ue.getMessage());
		}
		s.siteName = u.getHost() + (u.getPort() > 0 ? ":" + u.getPort() : "");
		s.robotstxtURL = u.getProtocol() + "://" + s.siteName + "/" + "robots.txt";

		return s;
	}

	/**
	 * サイト名を返す
	 */
	public String getSiteName() {
		return siteName;
	}

	/**
	 * robots.txtのURLを返す
	 */
	public String getRobotsTxtURL() {
		return robotstxtURL;
	}
	/**
	 * URLを返す．
	 * @return url
	 */
	public String getURL() {
		return url;
	}
	/**
	 * 指定されたサイトから，robots.txtを取得する処理
	 */
	public void getRuleFromTheSite(InputStream src) throws IOException {
		robotstxt = RobotAcceptanceRule.getInstance(src);
	}

	/**
	 * このサイトがrobots.txtを持っているか
	 */
	public boolean hasRule() {
		return robotstxt == null ? false : true;
	}


	public boolean isAllowed(String url, String agent) {
		return robotstxt.isAllowed(url, agent);
	}
}
