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

import java.io.File;
import java.io.IOException;
import java.util.List;

import blanco.commons.util.BlancoStringUtil;
import blanco.jsf.task.valueobject.BlancoJsfProcessInput;
import blanco.jsf.valueobject.BlancoJsfStructure;
import blanco.valueobject.BlancoValueObjectXml2JavaClass;
import blanco.valueobject.valueobject.BlancoValueObjectClassStructure;
import blanco.valueobject.valueobject.BlancoValueObjectFieldStructure;

/**
 * 処理(blancoJsf)のためのプロキシ・クラス。
 */
class BlancoJsfExpandDownloadInfo {
    private BlancoJsfProcessInput fInput = null;

    /**
     * 収集された情報を元に、ソースコードを自動生成します。
     * 
     * @param argProcessStructureList
     *            メタファイルから収集できた処理構造データ。
     * @param argRuntimePackage
     *            ランタイムパッケージ。nullおよび長さ0の文字列の場合は定義書ごとにランタイムクラスを生成。
     * @param argTargetLang
     *            出力対象プログラミング言語。
     * @param argDirectoryTarget
     *            ソースコードの出力先フォルダ。
     */
    public void expandSourceFile(final BlancoJsfStructure structure,
            final List<BlancoJsfStructure> listJsfStructure,
            final BlancoJsfProcessInput input) {
        fInput = input;

        expandSourceFileInternal(structure, listJsfStructure, input);
    }

    public void expandSourceFileInternal(final BlancoJsfStructure structure,
            final List<BlancoJsfStructure> listJsfStructure,
            final BlancoJsfProcessInput input) {

        // 従来と互換性を持たせるため、/mainサブフォルダに出力します。
        final File fileBlanco = new File(new File(input.getTargetdirjee())
                .getAbsolutePath());

        String runtimePackage = structure.getPackage();
        if (BlancoStringUtil.null2Blank(fInput.getRuntimepackage()).length() > 0) {
            runtimePackage = fInput.getRuntimepackage();
        }

        final BlancoValueObjectClassStructure classStructure = new BlancoValueObjectClassStructure();
        classStructure.setName("BlancoJsfDownloadInfo");
        classStructure.setDescription("ダウンロード情報クラス。");
        classStructure.setPackage(runtimePackage);

        {
            final BlancoValueObjectFieldStructure field = new BlancoValueObjectFieldStructure();
            classStructure.getFieldList().add(field);
            field.setName("ContentType");
            field.setType("java.lang.String");
            field.setDefault("application/octet-stream");
        }

        {
            final BlancoValueObjectFieldStructure field = new BlancoValueObjectFieldStructure();
            classStructure.getFieldList().add(field);
            field.setName("filename");
            field.setType("java.lang.String");
        }

        {
            final BlancoValueObjectFieldStructure field = new BlancoValueObjectFieldStructure();
            classStructure.getFieldList().add(field);
            field.setName("attachment");
            field.setType("boolean");
            field.setDefault("false");
        }

        try {
            BlancoValueObjectXml2JavaClass xml2JavaClass = new BlancoValueObjectXml2JavaClass();
            xml2JavaClass.setEncoding(input.getEncoding());
            xml2JavaClass.structure2Source(classStructure, fileBlanco);
        } catch (IOException e) {
            throw new IllegalArgumentException("ソースコード出力時に例外が発生。", e);
        }
    }
}
