/*******************************************************************************
 * Copyright (c) 2009 IGA Tosiki, NTT DATA BUSINESS BRAINS Corp.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    IGA Tosiki (NTT DATA BUSINESS BRAINS Corp.) - initial API and implementation
 *******************************************************************************/
/*
 * blanco Framework
 * Copyright (C) 2009 NTT DATA BUSINESS BRAINS CORPORATION
 * 
 * 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.eclipsenls;

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

import blanco.eclipsenls.valueobject.BlancoEclipseNlsFieldStructure;
import blanco.eclipsenls.valueobject.BlancoEclipseNlsStructure;
import blanco.resourcebundle.BlancoResourceBundleXml2Properties;
import blanco.resourcebundle.valueobject.BlancoResourceBundleBundleItemStructure;
import blanco.resourcebundle.valueobject.BlancoResourceBundleBundleResourceStringStructure;
import blanco.resourcebundle.valueobject.BlancoResourceBundleBundleStructure;

/**
 * 「Eclipse NLS 定義書」Excel様式からメッセージを処理するクラス・ソースコードを生成。
 * 
 * このクラスは、中間XMLファイルからソースコードを自動生成する機能を担います。
 * 
 * @author IGA Tosiki
 */
public class BlancoEclipseNlsXml2PropertiesFile {
    /**
     * 中間XMLファイルからソースコードを自動生成します。
     * 
     * @param argMetaXmlSourceFile
     *            メタ情報が含まれているXMLファイル。
     * @param argDirectoryTarget
     *            ソースコード生成先ディレクトリ (/mainを除く部分を指定します)。
     * @throws IOException
     *             入出力例外が発生した場合。
     */
    public void process(final File argMetaXmlSourceFile,
            final File argDirectoryTarget) throws IOException {
        final BlancoEclipseNlsStructure[] structures = new BlancoEclipseNlsXmlParser()
                .parse(argMetaXmlSourceFile);

        for (int index = 0; index < structures.length; index++) {
            // メタ情報の解析結果をもとにソースコード自動生成を実行します。
            structure2Properties(structures[index], argDirectoryTarget);
        }
    }

    /**
     * 指定のシートの記述内容を展開します。
     * 
     * @param argStructure
     *            タスクの構造。
     * @param argDirectoryTarget
     *            出力先ディレクトリ
     */
    public void structure2Properties(
            final BlancoEclipseNlsStructure argStructure,
            final File argDirectoryTarget) {
        // 従来と互換性を持たせるため、/mainサブフォルダに出力します。
        final File fileBlancoMain = new File(argDirectoryTarget
                .getAbsolutePath()
                + "/main");

        final BlancoResourceBundleBundleStructure structure = new BlancoResourceBundleBundleStructure();
        structure.setName(argStructure.getBaseName());
        structure.setPackage(argStructure.getPackage());

        for (int indexField = 0; indexField < argStructure.getFieldList()
                .size(); indexField++) {
            final BlancoEclipseNlsFieldStructure fieldLook = argStructure
                    .getFieldList().get(indexField);

            final BlancoResourceBundleBundleItemStructure item = new BlancoResourceBundleBundleItemStructure();
            structure.getItemList().add(item);
            item.setNo(fieldLook.getNo());
            item.setKey(fieldLook.getName());
            final BlancoResourceBundleBundleResourceStringStructure resourceStringStructure = new BlancoResourceBundleBundleResourceStringStructure();
            item.getResourceStringList().add(resourceStringStructure);
            resourceStringStructure.setResourceString(fieldLook.getMessage());
        }

        final BlancoResourceBundleXml2Properties xml2Properties = new BlancoResourceBundleXml2Properties();
        xml2Properties.setCommentTimestamp(false);
        xml2Properties.structure2Properties(structure, null, fileBlancoMain);
    }
}
