/**
 * WebContents
 * サーバーからダウンロードしてきたウェブコンテンツを保有するためのオブジェクト
 */
package org.logical_paradox.rss.http;
import java.io.IOException;
import java.net.URL;
import java.util.LinkedList;

import org.logical_paradox.rss.IllegalObjectStateException;


public class WebContents {
	protected RSSHttpResponse res = null;
	protected String contents = null;
	protected LinkedList filters = new LinkedList();
	protected boolean robotstxtFlag = false;

	/**
	 * コンストラクタ
	 */
	public WebContents() {
	}

	public WebContents( RSSHttpResponse c, String ct ) throws IllegalObjectStateException, IOException {
		if( c.getResponseCode() < 0 ) {
			throw new IllegalObjectStateException( "HttpURLConnection object has no content" );
		}
		res = c;
		contents = ct;

		// URLがrobots.txtを示していた場合はフラグをセット
		if( c.getURL().toString().indexOf( "robots.txt" ) >= 0 ) {
			robotstxtFlag = true;
		}
	}

	/**
	 * robots.txtかどうかを返す
	 */
	public boolean isRobotsRule() {
		return robotstxtFlag;
	}

	/**
	 * コンテンツ変換フィルタを追加する
	 */
	public void addContentsFilter( ContentsFilter f ) {
		filters.add( f );
	}

	/**
	 * コンテンツ変換フィルタを削除する
	 */
	public void removeContentsFilter( ContentsFilter f ) {
		filters.remove( f );
	}

	/**
	 * HTTP接続オブジェクトをアタッチする
	 */
	public void attachResponse( RSSHttpResponse c ) throws IllegalObjectStateException, IOException {
		if( c.getResponseCode() < 0 ) {
			throw new IllegalObjectStateException( "HttpURLConnection object has no content" );
		}
		res = c;
	}

	/**
	 * コンテンツデータを添付する
	 */
	public void attachContents( String c ) {
		contents = new String( c );
	}

	/**
	 * コンテンツを返す
	 */
	public String getWebContents() {
		if( contents == null ) {
			return contents;
		}
		String src = new String( contents );

		// このオブジェクトにジョイントされた全てのコンテンツ変換フィルタを通す
		for( int i = 0; i < filters.size(); i++ ) {
			ContentsFilter f = (ContentsFilter)filters.get( i );
			src = new String( f.filter( src ) );
		}

		return src;
	}

	/**
	 * レスポンスコードを返す
	 */
	public int getResponseCode() throws IllegalObjectStateException, IOException {
		if( res == null ) {
			throw new IllegalObjectStateException( "no instance of HttpURLConnection" );
		}

		return res.getResponseCode();
	}

	/**
	 * レスポンスメッセージを返す
	 */
	public String getResponseMessage() throws IllegalObjectStateException, IOException {
		if( res == null ) {
			throw new IllegalObjectStateException( "no instance of HttpURLConnection" );
		}

		return res.getResponseMessage();
	}

	/**
	 * コンテンツの大きさを返す
	 */
	public int getContentLength() throws IllegalObjectStateException {
		if( res == null ) {
			throw new IllegalObjectStateException( "no instance of HttpURLConnection" );
		}

		return res.getContentLength();
	}

	/**
	 * コンテンツの種類を返す
	 */
	public String getContentType() throws IllegalObjectStateException {
		if( res == null ) {
			throw new IllegalObjectStateException( "no instance of HttpURLConnection" );
		}

		return res.getContentType();
	}

	/**
	 * このWebページのURLを返す
	 */
	public URL getURL() throws IllegalObjectStateException {
		if( res == null ) {
			throw new IllegalObjectStateException( "no instance of HttpURLConnection" );
		}

		return res.getURL();
	}

	/**
 	 * 終了
	 */
	public void close() {
		if( res != null ) {
			res = null;
		}
		if( contents != null ) {
			contents = null;
		} 
	}

	/**
	 * ファイナライザ
	 */
	public void finalize() {
		close();
	}
}

// end of WebContents.java
