package org.logical_paradox.rss.http;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Vector;

/**
 * HREFCollector
 * アンカータグのHREFを取得するユーティリティクラス
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class HREFCollector {
	/**
	 * アンカーを取得する．
	 * @param contents コンテンツ
	 * @return 抽出したアンカーの配列
	 */
	public static Vector<String> collect(String contents) throws NoIndexException {
		ParserGetter gtr = new ParserGetter();
		AnchorCollectionCallback cb = new AnchorCollectionCallback();

		byte[] b = contents.getBytes();

		if(b == null) {
			return null;
		}

		InputStreamReader ir = new InputStreamReader(new ByteArrayInputStream(b));

		// HTMLドキュメントの解析処理
		// エンコーディングは関係ないので無視する設定
		// ※encodingを無視しない設定にする場合，データソースと同じエンコーディングで読み込むように
		// InputStreamReaderを設定すること

		try {
			gtr.getParser().parse(ir, cb, true);
		} catch(IOException ioe) {
			return null;
		}

		return cb.getAnchors();
	}

	/**
	 * 指定されたアンカーを全て絶対パスに変換する
	 * @param URL
	 * @a アンカーの配列
	 * @return 変換されたアンカーのリスト
	 */
	public static Vector<String> getAnchorsAsABSPath(URL u, Vector<String> a) {
		if(a == null || u == null) {
			return null;
		}

		// 絶対URLを組み立てる
		Vector<String> anchors = new Vector<String>();
		for(int i = 0; i < a.size(); i++) {
			try {
				String absoluteURL = new URL(u, a.elementAt(i)).toString();

				// プロトコルはhttpのみに限定する
				if(
					absoluteURL.startsWith("http") == true &&
					absoluteURL.startsWith("https") == false
				) {
					anchors.addElement(absoluteURL);
				}
			} catch(MalformedURLException e) {}
		}
		return anchors;
	}
}
