/*
 * blanco Framework
 * Copyright(C) 2006-2008 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.soap.terasoluna.rich;

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

import javax.xml.transform.TransformerException;

import blanco.commons.io.Native2AsciiWriter;
import blanco.wsdl.parser.BlancoWsdlParser;
import blanco.wsdl.valueobject.BlancoWsdlWebService;
import blanco.wsdl.valueobject.BlancoWsdlWebServiceOperation;

/**
 * WSDLからTERASOLUNAが利用するプロパティファイルを自動生成するクラス。
 * 
 * このクラスは、blancoSOAPのTERASOLUNA Rich対応拡張の一部となります。
 * 
 * @author IGA Tosiki
 * @version 1.0
 */
public class TerasolunaBLogicWsdl2NamespacesProperties {
    /**
     * プロパティファイルのファイル名。
     */
    public static final String FILE_NAME = "namespaces.properties";

    /**
     * 入力クラスのリストを保持する。
     */
    private final ArrayList listInputClass = new ArrayList();

    /**
     * WSDLファイルの解析結果
     */
    private BlancoWsdlWebService fWsdl = null;

    /**
     * 集まった情報をもとに propertiesファイルを生成する。
     * 
     * ファイルは 既にnative2asciiがされた後の状態で作成される。
     * 
     * @param outStream
     *            propertiesファイルを出力するストリーム。
     * @throws IOException
     *             入出力例外が発生した場合。
     */
    public void generate(final OutputStream outStream) throws IOException {
        final Native2AsciiWriter writer = new Native2AsciiWriter(
                new BufferedWriter(new OutputStreamWriter(outStream, "8859_1")));
        try {
            writer
                    .writeComment("############################################################################");
            writer.writeComment(" 電文−受信クラスマッピング設定");
            writer
                    .writeComment("############################################################################");
            for (int index = 0; index < listInputClass.size(); index++) {
                String[] value = (String[]) listInputClass.get(index);
                writer.writeProperty(value[0], value[1]);
            }
        } finally {
            writer.close();
        }
    }

    /**
     * 与えられたWSDLファイルを解析する。
     * 
     * WSDLファイルをきっかけに XSDファイルを読み込み、あるいは名前空間を記憶などの処理を行う。
     * 
     * @param fileSource
     *            WSDLファイル
     * @throws IOException
     *             入出力例外が発生した場合。
     * @throws TransformerException
     *             XML変換エラーが発生した場合。
     */
    public void parse(final File fileSource) throws IOException,
            TransformerException {
        fWsdl = new BlancoWsdlParser().parse(fileSource);

        // おのおののoperationに対して処理を行う。
        final ArrayList listOperation = fWsdl.getOperationList();
        for (int indexOperation = 0; indexOperation < listOperation.size(); indexOperation++) {
            final BlancoWsdlWebServiceOperation operation = (BlancoWsdlWebServiceOperation) listOperation
                    .get(indexOperation);

            // 指定されたoperationの情報を記憶する。
            remenberOperation(operation);
        }
    }

    /**
     * WSDLのoperationについて記憶を行う。
     * 
     * WSDLのoperationについて記憶を行う。記憶したoperationを元に
     * propertiesを作成されるが、ここでpropertiesに関する名前変形なども行う。
     * 
     * @param operation
     *            WSDL内のオペレーション
     * @throws IOException
     *             入出力例外が発生した場合。
     */
    private void remenberOperation(final BlancoWsdlWebServiceOperation operation)
            throws IOException {
        final String[] valueNameSpace = new String[] {
                operation.getInput().getTypeOfJava() + ".Namespace",
                operation.getInput().getTargetNamespace() };
        listInputClass.add(valueNameSpace);
    }
}
