/*
 * blanco Framework
 * Copyright (C) 2004-2005 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.eclipseplugingen;

import java.io.File;

import javax.xml.transform.dom.DOMResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import blanco.commons.util.BlancoXmlUtil;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandDocumentProvider;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandEditor;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandManifest;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandPlugin;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandPluginUtil;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandPluginXml;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandWizard;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandWizardPage;
import blanco.eclipseplugingen.expand.BlancoEclipsePluginGenExpandWizardPage99;

/**
 * 中間XMLファイル(メタ情報)からJavaソースコードを自動生成します。
 * 
 * 中間XMLファイルを入力してJavaクラス・ソースコードを自動生成します。 <br>
 * 
 * @author IGA Tosiki
 */
public class BlancoEclipsePluginGenXml2JavaClass {

    /**
     * 中間XMLファイルからJavaソースコードを生成します。
     * 
     * @param fileSource
     *            中間XMLメタ入力ファイル
     * @param directoryTarget
     *            ソースコード出力ディレクトリ
     * @param directoryRoot
     *            ルートディレクトリ。plugin.xmlの出力先として利用します。
     */
    public void process(final File fileSource, final File directoryTarget,
            final File directoryRoot) {
        final DOMResult result = BlancoXmlUtil.transformFile2Dom(fileSource);

        final Node rootNode = result.getNode();
        if (rootNode instanceof Document) {
            // これが正常系。ドキュメントルートを取得
            final Document rootDocument = (Document) rootNode;
            final NodeList listSheet = rootDocument
                    .getElementsByTagName("sheet");
            final int sizeListSheet = listSheet.getLength();
            for (int index = 0; index < sizeListSheet; index++) {
                final Element elementSheet = (Element) listSheet.item(index);

                NodeList listCommon = elementSheet
                        .getElementsByTagName("blancoeclipseplugingen-common");
                if (listCommon.getLength() == 0) {
                    // commonが無い場合にはスキップします。
                    continue;
                }

                final Element elementCommon = (Element) listCommon.item(0);
                final String taskName = BlancoXmlUtil.getTextContent(
                        elementCommon, "name");
                if (taskName == null || taskName.trim().length() == 0) {
                    // タスク名が無い場合にはスキップします。
                    continue;
                }

                expandSheet(elementSheet, directoryTarget, directoryRoot);
            }
        }
    }

    /**
     * 指定のシートの記述内容を展開します。
     * 
     * @param elementSheet
     *            対象とするシート
     * @param directoryTarget
     *            出力先ディレクトリ
     * @param directoryRoot
     *            ルートディレクトリ。plugin.xmlの出力先として利用します。
     */
    static void expandSheet(final Element elementSheet,
            final File directoryTarget, final File directoryRoot) {
        final NodeList listCommon = elementSheet
                .getElementsByTagName("blancoeclipseplugingen-common");
        final Element elementCommon = (Element) listCommon.item(0);

        final NodeList listList = elementSheet
                .getElementsByTagName("blancoeclipseplugingen-list");
        if (listList.getLength() == 0) {
            return;
        }

        directoryTarget.mkdirs();
        new BlancoEclipsePluginGenExpandPlugin().expand(elementCommon,
                listList, directoryTarget);
        new BlancoEclipsePluginGenExpandDocumentProvider().expand(
                elementCommon, listList, directoryTarget);

        new BlancoEclipsePluginGenExpandEditor().expand(elementCommon,
                listList, directoryTarget);
        new BlancoEclipsePluginGenExpandPluginUtil().expand(elementCommon,
                listList, directoryTarget);

        // Wizardを展開します。
        new BlancoEclipsePluginGenExpandWizard().expand(elementCommon,
                listList, directoryTarget);
        new BlancoEclipsePluginGenExpandWizardPage().expand(elementCommon,
                listList, directoryTarget);
        new BlancoEclipsePluginGenExpandWizardPage99().expand(elementCommon,
                listList, directoryTarget);

        // XMLファイルを展開します。
        new BlancoEclipsePluginGenExpandPluginXml().expand(elementCommon,
                listList, directoryRoot);
        // MANIFEST.MFを展開します。
        new BlancoEclipsePluginGenExpandManifest().expand(elementCommon,
                listList, directoryRoot);
    }
}