/*
 * Copyright (c) 2009 OrangeSignal.com All rights reserved.
 *
 * これは Apache ライセンス Version 2.0 (以下、このライセンスと記述) に
 * 従っています。このライセンスに準拠する場合以外、このファイルを使用
 * してはなりません。このライセンスのコピーは以下から入手できます。
 *
 * http://www.apache.org/licenses/LICENSE-2.0.txt
 *
 * 適用可能な法律がある、あるいは文書によって明記されている場合を除き、
 * このライセンスの下で配布されているソフトウェアは、明示的であるか暗黙の
 * うちであるかを問わず、「保証やあらゆる種類の条件を含んでおらず」、
 * 「あるがまま」の状態で提供されるものとします。
 * このライセンスが適用される特定の許諾と制限については、このライセンス
 * を参照してください。
 */

package jp.sf.orangesignal.csv.manager;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

import jp.gr.java_conf.dangan.util.lha.LhaFile;
import jp.gr.java_conf.dangan.util.lha.LhaInputStream;
import jp.sf.orangesignal.csv.LhaEntryFilter;
import jp.sf.orangesignal.csv.ZipEntryFilter;

/**
 * 区切り文字形式データの統合入力インタフェースです。
 *
 * @param <T> 区切り文字形式データの型
 * @author 杉澤 浩二
 */
public interface CsvLoader<T> {

	/**
	 * 指定された文字入力ストリームを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param reader 文字入力ストリーム
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(Reader reader) throws IOException;

	/**
	 * 指定された入力ストリームを指定されたエンコーディングで読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param in 入力ストリーム
	 * @param encoding エンコーディング
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(InputStream in, String encoding) throws IOException;

	/**
	 * 指定された入力ストリームをプラットフォームのデフォルトエンコーディングで読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param in 入力ストリーム
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(InputStream in) throws IOException;

	/**
	 * 指定されたファイルを指定されたエンコーディングで読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param file 入力ファイル
	 * @param encoding エンコーディング
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(File file, String encoding) throws IOException;

	/**
	 * 指定されたファイルをプラットフォームのデフォルトエンコーディングで読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param file 入力ファイル
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(File file) throws IOException;

	// ------------------------------------------------------------------------
	// static load (compress support)

	/**
	 * 指定された LHA 入力ストリームから指定されたフィルタの基準を満たす LHA エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param in LHA 入力ストリーム
	 * @param filter LHA エントリフィルタ
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(LhaInputStream in, LhaEntryFilter filter) throws IOException;

	/**
	 * 指定された LHA 入力ストリームからすべての LHA エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param in LHA 入力ストリーム
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(LhaInputStream in) throws IOException;

	/**
	 * 指定された LHA ファイルから指定されたフィルタの基準を満たす LHA エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param lhaFile LHA ファイル
	 * @param filter LHA エントリフィルタ
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(LhaFile lhaFile, LhaEntryFilter filter) throws IOException;

	/**
	 * 指定された LHA ファイルからすべての LHA エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param lhaFile LHA ファイル
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(LhaFile lhaFile) throws IOException;

	/**
	 * 指定された ZIP 入力ストリームから指定されたフィルタの基準を満たす ZIP エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param in ZIP 入力ストリーム
	 * @param filter ZIP エントリフィルタ
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(ZipInputStream in, ZipEntryFilter filter) throws IOException;

	/**
	 * 指定された ZIP 入力ストリームからすべての ZIP エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param in ZIP 入力ストリーム
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(ZipInputStream in) throws IOException;

	/**
	 * 指定された ZIP ファイルから指定されたフィルタの基準を満たす ZIP エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param zipFile ZIP ファイル
	 * @param filter ZIP エントリフィルタ
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(ZipFile zipFile, ZipEntryFilter filter) throws IOException;

	/**
	 * 指定された ZIP ファイルからすべての ZIP エントリを読込み、
	 * 変換された区切り文字形式データのインスタンスを返します。
	 *
	 * @param zipFile ZIP ファイル
	 * @return 変換された区切り文字形式データのインスタンス
	 * @throws IOException 入出力エラーが発生した場合
	 */
	public List<T> from(ZipFile zipFile) throws IOException;

}
