/*
 * $Id: RSSHttpURLConnectionFactory.java,v 1.3 2005/10/23 12:31:35 rampil Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.rss.http;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import HTTPClient.ModuleException;
import HTTPClient.ProtocolNotSuppException;

/**
 * HTTP接続オブジェクトファクトリ
 * 主にテスト用のスタブを生成するため
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class RSSHttpURLConnectionFactory {
	/** ローカルホスト名 */
	public static final String LOCALHOST = "localhost";
	/** HTTPポート番号 */
	public static final int HTTP_PORT = 80;

	/** 現在のローカルホスト設定 */
	private static String localhostSetting = LOCALHOST;
	/** 現在のポート番号設定 */
	private static int httpPort = HTTP_PORT;
	/** スタブ用のインターフェースを返すかどうか */
	private static boolean stub = false;

	/**
	 * テストモードかどうかを設定する．
	 * テストモードとした場合，どんなURLを与えてもlocalhostに変換して接続する．
	 * @param m テストモード(true:テストモード / false:本番モード)
	 */
	public static void enableTestMode(boolean m) {
		stub = m;
	}
	/**
	 * デフォルトの接続先を設定する．
	 * @param hostname ホスト名(テスト用httpdが起動しているホスト)
	 * @param port ポート番号(通常80, テスト用のhttpdがlisteningしているポート番号)
	 */
	public static final void setLocalhostSetting(String hostname, int port) {
		localhostSetting = hostname;
		httpPort = port;
	}
	/**
	 * 接続オブジェクトを生成して返す．
	 * 生成時に自動的に接続する．
	 * @param dest 接続先
	 * @return 生成された接続オブジェクト
	 * @throws ProtocolNotSuppException そんなプロトコルサポートしていません
	 */
	public static final RSSHttpURLConnection getConnection(URL dest) throws ProtocolNotSuppException, MalformedURLException {
		if(stub == false) {
			// 本番用
			return new RSSHttpURLConnection(dest);
		} else {
			// テスト用
			return new RSSHttpURLConnectionStub(dest, localhostSetting, httpPort);
		}
	}
	/**
	 * レスポンスオブジェクトを生成して返す．
	 * @param con HTTPレスポンスオブジェクト
	 * @param encoding エンコーディング形式
	 * @return 生成されたレスポンスオブジェクト
	 */
	public static final RSSHttpResponse getResponse(RSSHttpURLConnection con, String encoding) throws IOException, ModuleException {
		RSSHttpResponse res = null;
		if(stub == false) {
			res = new RSSHttpResponse(con.get(), encoding);
		} else {
			res = new RSSHttpResponseStub(con.get(), encoding, con.getURL());
		}

		return res;
	}
}
