package org.logical_paradox.rss.rcm.df;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.logical_paradox.common.io.ExpandableBuffer;
import org.logical_paradox.common.security.Digester;

/**
 * GZIPでコンテンツを圧縮するタイプのデータフィルタ
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class GZIPDataFilter implements DataFilter {

	/**
	 * 指定されたURLを128bitの16進文字列に変換して返すフィルタ．
	 * ハッシュキーとして使用するため
	 * 
	 * @param URL
	 * @return 変換された16進文字列
	 * @throws Exception 何か例外が発生した
	 */
	public String filterURL(String url) {
		return Digester.getInstance(Digester.MD5).getDigest(url);
	}

	/**
	 * 指定されたコンテンツをGZIPで圧縮されたバイト列に変換して返すフィルタ．
	 * 
	 * @param コンテンツ
	 * @return 圧縮されたバイト列
	 * @throws Exception 何か例外が発生した
	 */
	public byte[] compressContents(byte[] contents) throws Exception {
		ExpandableBuffer buffer = new ExpandableBuffer();
		GZIPOutputStream gout = new GZIPOutputStream(buffer.getOutputStream());

		// GZIPで圧縮してバイトバッファへ書き込む
		gout.write(contents);
		gout.finish();
		gout.close();

		return buffer.byteStream();
	}

	/**
	 * 指定された圧縮済みコンテンツを伸張する
	 * 
	 * @param 圧縮済みコンテンツ
	 * @return 伸張されたコンテンツ(文字列)
	 * @throws Exception 何か例外が発生した
	 */
	public byte[] decompressContents(byte[] b) throws Exception {
		BufferedInputStream reader = new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(b)));
		ExpandableBuffer buffer = new ExpandableBuffer();

		int bf = 0;
		while((bf = reader.read()) >= 0) {
			buffer.write(bf);
		}
		reader.close();

		return buffer.byteStream();
	}
}
