/**
 * HREFCollector
 * アンカータグのHREFを取得するユーティリティクラス
 */
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;

public class HREFCollector {
	/**
	 * アンカーを取得する
	 */
	public static Vector 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();
	}

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

		// 絶対URLを組み立てる
		// URLの検査器として，URLクラスを使用する
		// おかしい場合，そのURLは無視する
		Vector anchors = new Vector();
		for( int i = 0; i < a.size(); i++ ) {
			try {
				String absoluteURL = new URL( u, (String)a.elementAt(i) ).toString();

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

// end of HREFCollector.java
