package com.nifty.cloud.ncs;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5ダイジェストの計算用クラスです。
 *
 */
public class NiftyCloudMD5InputStream extends FilterInputStream
{
	private MessageDigest md5Digest;

	/**
	 * 指定した入力ストリームを使用してNiftyCloudMD5InputStreamを生成します。
	 *
	 * @param in
	 *  入力ストリーム
	 *
	 * @throws NoSuchAlgorithmException
	 */
	public NiftyCloudMD5InputStream(InputStream in) throws NoSuchAlgorithmException
	{
		super(in);

		md5Digest = MessageDigest.getInstance("MD5");
	}

	/**
	 * MD5ダイジェストを取得します。
	 *
	 * @return
	 *  MD5ダイジェスト
	 */
	public byte[] getMd5Digest()
	{
		return (md5Digest.digest());
	}

	/**
	 * @see java.io.InputStream#read()
	 */
	@Override
	public synchronized void reset() throws IOException
	{
		try {
			md5Digest = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			/* NOP */
		}

		in.reset();
	}

	/**
	 * @see java.io.InputStream#read()
	 */
	@Override
	public int read() throws IOException
	{
		int c = in.read();

		if (c != -1) {
			md5Digest.update((byte)c);
		}

		return (c);
	}

	/**
	 * @see java.io.InputStream#read(byte[], int, int)
	 */
	@Override
	public int read(byte[] b, int off, int len) throws IOException
	{
		int length = in.read(b, off, len);

		if (length != -1) {
			md5Digest.update(b, off, length);
		}

		return (length);
	}
}
