/*
 * @(#)GenerateCSV.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : Generator CSVファイルの出力
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/01/23
 */

package jp.co.nri.rid.generator;

import java.io.*;
import java.util.*;
import java.text.*;
import java.net.URL;
import java.util.Random;
import org.w3c.dom.*;


/**
 * Rid CSVファイル出力
 */
public class GenerateCSV extends GenerateParser {

    /** サイトのXMLファイル名「Site.xml」           **/
    final static public String SITE_XML      = "Site.xml";
    /** リソースのXMLファイル名「Resource.xml」     **/
    final static public String RESOURCE_XML  = "Resource.xml";
    /** ドキュメントのXMLファイル名「Document.xml」 **/
    final static public String DOCUMENT_XML  = "Document.xml";

    /** ZoneUnitの定義 **/
    final static public String ZONE_UNIT     = "<ZoneUnit>";
    /** PageUnitの定義 **/
    final static public String PAGE_UNIT     = "<PageUnit>";
    /** ResourceUnitの定義 **/
    final static public String RESOURCE_UNIT = "<ResourceUnit>";
    /** DocumentUnitの定義 **/
    final static public String DOCUMENT_UNIT = "<DocumentUnit>";

    /** 出力ファイルのFileOutputStream **/
    protected FileOutputStream    outFileStream = null;
    /** 出力ファイルのOutputStreamWriter **/
    protected OutputStreamWriter  outWriter = null;

/**
  * デフォルトコンストラクタ
  */
    public GenerateCSV() {}



/**
  * Site.XMLをCSV形式で出力
  *
  * @param  Document    doc             Site.XMLのドキュメント
  * @param  String      out_file        出力ファイル名（フルパス）
  * @return void
  */
    public boolean csvSite(Document doc, String out_file) throws Exception {
        return (csv(SITE_XML, doc, out_file));
    }

/**
  * Resource.XMLをCSV形式で出力
  *
  * @param  Document    doc             Resource.xmlのドキュメント
  * @param  String      out_file        出力ファイル名（フルパス）
  * @return void
  */
    public boolean csvResource(Document doc, String out_file) throws Exception {
        return (csv(RESOURCE_XML, doc, out_file));
    }

/**
  * Document.XMLをCSV形式で出力
  *
  * @param  Document    doc             Document.xmlのドキュメント
  * @param  String      out_file        出力ファイル名（フルパス）
  * @return void
  */
    public boolean csvDocument(Document doc, String out_file) throws Exception {
        return (csv(DOCUMENT_XML, doc, out_file));
    }

/**
  * ＸＭＬファイルをＣＳＶ形式で出力
  *
  * @param  String      xml_type        XMLファイルタイプ[Site.xml/Resource.xml/Document.xml]
  * @param  Document    doc             ドキュメント
  * @param  String      out_file        出力ファイル名（フルパス）
  */
    private boolean csv(String xml_type, Document doc, String out_file) throws Exception {

        //XMLのDocumentの解析
        ProjectInfo  project_info = documentParser(doc, "", "");

        //のCSVファイル生成
        return (generateCSV(xml_type, project_info, out_file));

    }

/**
  * CSVの生成
  *
  * @param  Document    doc             ドキュメント
  * @param  String      out_file        出力ファイル名
  * @return void
  */
    private boolean generateCSV(String xml_type, ProjectInfo project_info, String out_file) throws Exception {

        boolean ret = false;

        // FILE OPEN
        outFileStream = new FileOutputStream(out_file);
        outWriter = new OutputStreamWriter(outFileStream);
            
        // WRITE CSV
        writeCSV(xml_type, project_info.zone);

        // FILE CLOSE
        outWriter.close();

        return true;
    }

/**
  * カンマ形式で出力
  *
  * @param  String    xml_type          XMLのタイプ
  * @param  ZoneInfo    zone            ZONE情報
  * @return void
  */
    private void writeCSV(String xml_type, ZoneInfo zone) throws Exception {

        // Zoneの全属性をカンマ形式で出力
        writeUnit(ZONE_UNIT, zone.attr_lst);

        // XMLのタイプを判断
        if (xml_type.compareTo(SITE_XML) == 0) {

            //[Site.XML]をCSVで出力   ...PageUnitの出力
            for ( int i = 0; i < zone.page_lst.size(); i++ ) {
                PageInfo page_info = (PageInfo)zone.page_lst.elementAt(i);
                writeUnit(PAGE_UNIT, page_info.attr_lst);
            }
        
        } else if (xml_type.compareTo(RESOURCE_XML) == 0) {

            //[Resource.XML]をCSVで出力 ...ResourceUnitの出力
            for ( int i = 0; i < zone.resource_lst.size(); i++ ) {
                ResourceInfo resource_info = (ResourceInfo)zone.resource_lst.elementAt(i);
                writeUnit(RESOURCE_UNIT, resource_info.attr_lst);
            }

        } else if (xml_type.compareTo(DOCUMENT_XML) == 0) {

            //[Document.XML]をCSVで出力 ...DocumentUnitの出力
            for ( int i = 0; i < zone.document_lst.size(); i++ ) {
                DocumentInfo document_info = (DocumentInfo)zone.document_lst.elementAt(i);
                writeUnit(DOCUMENT_UNIT, document_info.attr_lst);
            }

        }

        //カンマ形式で出力
        for ( int n = 0; n < zone.zone_lst.size(); n++ ) {
            ZoneInfo zone_info = (ZoneInfo)zone.zone_lst.elementAt(n);
            writeCSV(xml_type, zone_info);
        }
    }


/**
  * UNIT単位でカンマ形式で出力
  *
  * @param  String    　unitType        UNIT名
  * @param  Vector    　attr_lst        属性リスト
  * @return void
  */
    private void writeUnit(String unitType, Vector attr_lst) throws Exception {

        String  buff = "";

        // カンマ形式で出力
        buff = unitType;
        for ( int i = 0; i < attr_lst.size(); i++ ) {
            Attribute attr = (Attribute)attr_lst.elementAt(i);
            if (attr.value.indexOf(",") != -1) {
                buff = buff + "," + "\"" + attr.value + "\"";
            } else {
                buff = buff + "," + attr.value;
            }
        }
        buff = buff + "\n";

        //出力ファイルに出力
        outWriter.write(buff, 0, buff.length());
    }

}
