package jp.cssj.cti;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

/**
 * クライアント側のファイル、URL、ストリームを送るためのユーティリティです。
 * 
 * @author <a href="mailto:miyabe at gnn.co.jp">MIYABE Tatsuhiko </a>
 * @version $Id: CTIUtils.java,v 1.2 2005/08/18 04:51:26 harumanx Exp $
 */
public final class CTIUtils {
	private CTIUtils() {
		// unused
	}

	/** データの移動に使うバッファのサイズです。 */
	private static final int BUFFER_SIZE = 1024;

	/**
	 * リソースとしてファイルを送信します。
	 * 
	 * @param session
	 *            セッション
	 * @param file
	 *            ファイル
	 * @param mimeType
	 *            MIME型(省略する場合はnull)
	 * @param encoding
	 *            エンコーディング(省略する場合はnull)
	 * @throws IOException
	 */
	public static void sendResourceFile(CTISession session, File file,
			String mimeType, String encoding) throws IOException {
		InputStream in = new FileInputStream(file);
		try {
			sendResourceStream(session, in, file.toURI().toASCIIString(),
					mimeType, encoding);
		} finally {
			in.close();
		}
	}

	/**
	 * リソースとしてURLを送信します。
	 * 
	 * @param session
	 *            セッション
	 * @param url
	 *            URL
	 * @param mimeType
	 *            MIME型(省略する場合はnull)
	 * @param encoding
	 *            エンコーディング(省略する場合はnull)
	 * @throws IOException
	 */
	public static void sendResourceURL(CTISession session, URL url,
			String mimeType, String encoding) throws IOException {
		InputStream in = url.openStream();
		try {
			sendResourceStream(session, in, url.toString(), mimeType, encoding);
		} finally {
			in.close();
		}
	}

	/**
	 * リソースとしてストリームから取り出されるデータを送信します。
	 * 
	 * @param session
	 *            セッション
	 * @param in
	 *            入力ストリーム
	 * @param mimeType
	 *            MIME型(省略する場合はnull)
	 * @param encoding
	 *            エンコーディング(省略する場合はnull)
	 * @throws IOException
	 */
	public static void sendResourceStream(CTISession session, InputStream in,
			String uri, String mimeType, String encoding) throws IOException {
		OutputStream out = session.sendResource(uri, mimeType, encoding);
		try {
			byte[] buff = new byte[BUFFER_SIZE];
			for (int len = in.read(buff); len != -1; len = in.read(buff)) {
				out.write(buff, 0, len);
			}
		} finally {
			out.close();
		}
	}

	/**
	 * リソースとして、ディレクトリ内のファイルを全て送信します。 このメソッドは子ディレクトリも再帰的に処理します。
	 * 
	 * @param session
	 *            セッション
	 * @param dir
	 *            ディレクトリ
	 * @param mimeType
	 *            MIME型(省略する場合はnull)
	 * @param encoding
	 *            エンコーディング(省略する場合はnull)
	 * @throws IOException
	 */
	public static void sendResourceDir(CTISession session, File dir,
			String mimeType, String encoding) throws IOException {
		if (dir.isDirectory()) {
			File[] files = dir.listFiles();
			if (files != null) {
				for (int i = 0; i < files.length; ++i) {
					sendResourceDir(session, files[i], mimeType, encoding);
				}
			}
		} else {
			sendResourceFile(session, dir, mimeType, encoding);
		}
	}

	/**
	 * 本体としてファイルを送信します。
	 * 
	 * @param session
	 *            セッション
	 * @param file
	 *            ファイル
	 * @param mimeType
	 *            MIME型(省略する場合はnull)
	 * @param encoding
	 *            エンコーディング(省略する場合はnull)
	 * @throws IOException
	 */
	public static void sendMainFile(CTISession session, File file,
			String mimeType, String encoding) throws IOException {
		InputStream in = new FileInputStream(file);
		try {
			sendMainStream(session, in, file.toURI().toASCIIString(), mimeType,
					encoding);
		} finally {
			in.close();
		}
	}

	/**
	 * 本体としてURLを送信します。
	 * 
	 * @param session
	 *            セッション
	 * @param url
	 *            URL
	 * @param mimeType
	 *            MIME型(省略する場合はnull)
	 * @param encoding
	 *            エンコーディング(省略する場合はnull)
	 * @throws IOException
	 */
	public static void sendMainURL(CTISession session, URL url,
			String mimeType, String encoding) throws IOException {
		InputStream in = url.openStream();
		try {
			sendMainStream(session, in, url.toString(), mimeType, encoding);
		} finally {
			in.close();
		}
	}

	/**
	 * 本体としてストリームから取り出されるデータを送信します。
	 * 
	 * @param session
	 *            セッション
	 * @param in
	 *            入力ストリーム
	 * @param mimeType
	 *            MIME型(省略する場合はnull)
	 * @param encoding
	 *            エンコーディング(省略する場合はnull)
	 * @throws IOException
	 */
	public static void sendMainStream(CTISession session, InputStream in,
			String uri, String mimeType, String encoding) throws IOException {
		OutputStream out = session.sendMain(uri, mimeType, encoding);
		try {
			byte[] buff = new byte[BUFFER_SIZE];
			for (int len = in.read(buff); len != -1; len = in.read(buff)) {
				out.write(buff, 0, len);
			}
		} finally {
			out.close();
		}
	}
}