/*
 * blanco Framework
 * Copyright (C) 2004-2006 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.batchprocess.task;

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

import javax.xml.transform.TransformerException;

import blanco.batchprocess.BlancoBatchProcessConstants;
import blanco.batchprocess.BlancoBatchProcessMeta2Xml;
import blanco.batchprocess.BlancoBatchProcessXml2SourceFile;
import blanco.batchprocess.resourcebundle.BlancoBatchProcessMessageResourceBundle;
import blanco.batchprocess.task.valueobject.BlancoBatchProcessBatchProcessInput;

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

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

        // 入力パラメータをチェックします。
        validateInput(input);

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

            // テンポラリディレクトリを作成。
            new File(input.getTmpdir()
                    + BlancoBatchProcessConstants.TARGET_SUBDIRECTORY).mkdirs();

            // 指定されたメタディレクトリを処理します。
            new BlancoBatchProcessMeta2Xml().processDirectory(fileMetadir,
                    input.getTmpdir()
                            + BlancoBatchProcessConstants.TARGET_SUBDIRECTORY);

            // XML化された中間ファイルからソースコードを生成
            final File[] fileMeta2 = new File(input.getTmpdir()
                    + BlancoBatchProcessConstants.TARGET_SUBDIRECTORY)
                    .listFiles();
            for (int index = 0; index < fileMeta2.length; index++) {
                if (fileMeta2[index].getName().endsWith(".xml") == false) {
                    continue;
                }

                new BlancoBatchProcessXml2SourceFile().process(
                        fileMeta2[index], input.getRuntimepackage(), input
                                .getTargetlang(),
                        new File(input.getTargetdir()));
            }

            return END_SUCCESS;
        } catch (TransformerException ex) {
            throw new IOException("XML変換の過程で例外が発生しました: " + ex.toString());
        }
    }
}
