package blanco.anttask.task;

import java.io.File;
import java.io.IOException;

import javax.xml.transform.TransformerException;

import blanco.anttask.BlancoAntTaskConstants;
import blanco.anttask.BlancoAntTaskMeta2Xml;
import blanco.anttask.BlancoAntTaskXml2JavaClass;
import blanco.anttask.resourcebundle.BlancoAntTaskMessageResourceBundle;
import blanco.anttask.task.valueobject.BlancoAntTaskBatchProcessInput;

/**
 * バッチ処理クラス。
 * 
 * バッチ処理の呼び出し例。 <code>
 * java -classpath (クラスパス) blanco.anttask.task.BlancoAntTaskBatchProcess -help
 * </code>
 */
public class BlancoAntTaskBatchProcess extends
        AbstractBlancoAntTaskBatchProcess {
    /**
     * メッセージ定義。
     */
    protected final BlancoAntTaskMessageResourceBundle fMsg = new BlancoAntTaskMessageResourceBundle();

    /**
     * 具体的なバッチ処理内容を記述するためのメソッドです。
     * 
     * このメソッドに実際の処理内容を記述します。
     * 
     * @param input
     *            バッチ処理の入力パラメータ。
     * @return バッチ処理の終了コード。END_SUCCESS, END_ILLEGAL_ARGUMENT_EXCEPTION,
     *         END_IO_EXCEPTION, END_ERROR のいずれかの値を戻します。
     * @throws IOException
     *             入出力例外が発生した場合。
     * @throws IllegalArgumentException
     *             入力値に不正が見つかった場合。
     */
    public int process(final BlancoAntTaskBatchProcessInput input)
            throws IOException, IllegalArgumentException {
        System.out.println("- " + BlancoAntTaskConstants.PRODUCT_NAME + " ("
                + BlancoAntTaskConstants.VERSION + ")");

        validateInput(input);

        try {
            final File blancoTmpAntTaskDirectory = new File(input.getTmpdir()
                    + BlancoAntTaskConstants.TARGET_SUBDIRECTORY);
            blancoTmpAntTaskDirectory.mkdirs();

            final File fileMetadir = new File(input.getMetadir());
            if (fileMetadir.exists() == false) {
                throw new IllegalArgumentException(fMsg.getMbata001(input
                        .getMetadir()));
            }

            new BlancoAntTaskMeta2Xml().processDirectory(fileMetadir,
                    blancoTmpAntTaskDirectory.getAbsolutePath());

            final File[] fileTmp = blancoTmpAntTaskDirectory.listFiles();
            if (fileTmp == null) {
                // 何かしらの理由によりファイル一覧の取得に失敗した場合。
                throw new IllegalArgumentException(fMsg
                        .getMbata002(blancoTmpAntTaskDirectory
                                .getAbsolutePath()));
            }

            for (int index = 0; index < fileTmp.length; index++) {
                if (fileTmp[index].getName().endsWith(".xml")) {
                    new BlancoAntTaskXml2JavaClass().process(fileTmp[index],
                            new File(input.getTargetdir()));
                }
            }
        } catch (TransformerException e) {
            throw new IOException("XML変換の過程で例外が発生しました: " + e.toString());
        }

        return END_SUCCESS;
    }
}
