/*
 * $Id: RSSHttpResponse.java,v 1.5 2006/02/06 15:32:50 rampil Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.rss.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Enumeration;

import HTTPClient.HTTPResponse;
import HTTPClient.ModuleException;

/**
 * RSS/1b用HTTPレスポンスオブジェクト．<br>
 * HTTPClientクラスセット内の，HTTPResponseをラッピングしています
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class RSSHttpResponse {
	/** コンテンツの文字列表現 */
	private String contentAsString;
	/** レスポンス */
	private HTTPResponse _resp;
	/** エンコーディング形式 */
	private String _encodingType;


	/**
	 * コンストラクタ．
	 * @param r レスポンスオブジェクト
	 * @param encodingType エンコーディング形式
	 */
	public RSSHttpResponse(HTTPResponse r, String encodingType) {
		_resp = r;
		_encodingType = encodingType;
	}
	/**
	 * エンコーディング形式を返す．
	 * @return エンコーディング形式
	 */
	public String getEncodingType() {
		return _encodingType;
	}
	/**
	 * レスポンスコードを返す．
	 * @return レスポンスコード
	 */
	public int getResponseCode() {
		int rc = 0;
		try {
			rc = _resp.getStatusCode();
		} catch(Exception e) {
			rc = -1;
		}
		return rc;
	}
	/**
	 * レスポンスコードの文字列表現を返す．
	 * @return レスポンスコードの文字列表現
	 */
	public String getResponseMessage() {
		String s = null;
		try {
			s = _resp.getReasonLine();
		} catch(Exception e) {
			s = null;
		}

		return s;
	}
	/**
	 * コンテンツそのものを返す．
	 * @return コンテンツ
	 * @throws IOException 取得に失敗
	 * @throws ModuleException よくわからない理由で失敗
	 */
	public String getText() throws IOException, ModuleException {
		if(contentAsString == null) {
			InputStream in = _resp.getInputStream();
			if(in == null) {
				return "";
			}

			// HTMLソースはunicodeに変換しつつ読み取る
			BufferedReader reader = new BufferedReader(new InputStreamReader(in, "JISAutoDetect"));
			String line = "";
			StringBuffer buf = new StringBuffer();
			while((line = reader.readLine()) != null) {
				buf.append(line);
			}
			reader.close();

			// 最後に指定されたエンコーディングに変換して出力する
			contentAsString = new String(buf.toString());//.getBytes("8859_1"), _encodingType);
		}

		return contentAsString;
	}
	/**
	 * コンテンツの総バイト数を返す．
	 * @return バイト数
	 */
	public int getContentLength() {
		if(contentAsString == null) {
			return 0;
		} else {
			return contentAsString.length();
		}
	}
	/**
	 * Content-Typeを返す．
	 * @return Content-Type
	 */
	public String getContentType() {
		String s = null;
		try {
			s = _resp.getHeader("Content-Type");
		} catch(Exception e) {
			s = null;
		}

		return s;
	}
	/**
	 * 最終的に確定したURLを返す．
	 * @return 最終的に確定したURL(Locationヘッダによるforwardなどの転送結果)
	 */
	public URL getEffectiveURL() {
		URL u = null;
		try {
			u = _resp.getEffectiveURI().toURL();
		} catch(Exception e) {
			u = null;
		}
		return u;
	}
	/**
	 * リクエスト時のURLを返す．
	 * @return リクエスト時のURL
	 */
	public URL getURL() {
		URL u = null;
		try {
			u = _resp.getOriginalURI().toURL();
		} catch(Exception e) {
			u = null;
		}
		return u;
	}
	/**
	 * HTTPレスポンスヘッダのキーを返す．
	 * @return HTTPレスポンスヘッダ
	 */
	public Enumeration getHeaderKeys() {
		Enumeration e = null;
		try {
			e = _resp.listHeaders();
		} catch(Exception ioe) {
			e = null;
		}
		return e;
	}
	/**
	 * 指定キーに対応するHTTPレスポンスヘッダ値を返す．
	 * @param key ヘッダ名
	 * @return HTTPレスポンスヘッダ値
	 */
	public String getHeader(String key) {
		String s = null;
		try {
			s = _resp.getHeader(key);
		} catch(Exception e) {
			s = null;
		}
		return s;
	}
}
