/**
 * @(#)exporter.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/08/09
 */
package jp.co.nri.rid.export;

import java.io.*;
import java.util.*;
import java.text.*;
import javax.swing.*;

import org.w3c.dom.*;

import jp.co.nri.Rid;
import jp.co.nri.rid.xml.*;
import jp.co.nri.rid.table.editor.filter.*;
import jp.co.iti.fagot.doc.DocManager;
import jp.co.iti.fagot.ZApp;
import jp.co.iti.fagot.util.*;

import jp.co.iti.fagot.doc.DocDocument;
import jp.co.nri.rid.doc.RidElement;

/**
 * CSV,SVGエキスポートツール
 */
public class exporter{

    protected String            COMMENT; 
    protected Exportelement     myElement;

    /**
     * コンストラクタ
     */
    public exporter(){

        //TopElementを抽出
        Exportdocument document = new Exportdocument((Document)ZInstance.map().get(Rid.DOCUMENT_DOCUMENT));
        myElement = document.root().child("ZoneUnit");
    }

    /**
     * 値の設定
     * @param String dirname 作業ディレクトリパス
     * @param String f_name  exportファイルパス
     * @param int    id      判別ID(1:SVG 2:CSV)
     */
    public void export(String dirname, String f_name, int id){

        File filename = new File(f_name);
        if (filename.exists()==false) return;
        File dir      = new File(dirname);
        if(id == 1)       COMMENT     = "svg.comment";
        else if(id == 2)  COMMENT     = "csv.comment";
        if(null==myElement)  return;       

        //作業パスを作成
        String dirPath = dir.getAbsolutePath();
        String filePath = filename.getParent();
        String workPath = filePath.substring(dirPath.length());

        exportRecursive(workPath, myElement, filename);
    }

    /* 場所検索
     * @param File          dir      作業ディレクトリ
     * @param Exportelement element  作業エレメント
     * @param File          filename exportファイル
     */
    protected void exportRecursive(String dir, Exportelement element, File filename) {

        //\で分割
        StringTokenizer st = new StringTokenizer(dir, File.separator);
        File fileParent = filename.getParentFile();

        if (!(st.hasMoreElements())) {
            addElement(filename, element);
            return;
        } else {
            String zoneName = st.nextToken();
            Exportelement[] children = element.children("ZoneUnit");
            if (children != null) {
                for (int i = 0; i < children.length; i++) {
                    if(zoneName.equalsIgnoreCase(children[i].attribute("Name"))) {
                         //同じnameのZONEUNITが存在したのでその子供に移る
                         exportRecursive(dir.substring(zoneName.length() + 1), children[i], filename);
                    }
                }
            }
            exportRecursive(dir.substring(zoneName.length() + 1), childCreate("ZoneUnit" ,zoneName ,element), filename);
        } 
    }

    /**
     *  NODEチェック
     *　@param String        unit   ユニット名
     *  @param String        name   属性(Name)名
     *  @param Exportelement parent 親エレメント
     */
    protected Exportelement childCreate(String unit ,String name ,Exportelement parent){

        //parentの下NODEがあるかどうか調べる
        Exportelement[] children = parent.children(unit);

        if(null==children) {
            return newchild(unit ,name ,parent);
        }

        int mx = children.length;
        for(int i=0;i<mx;i++){
            //同じものがあればreturn
            if(name.equalsIgnoreCase(children[i].attribute("Name"))) {
                return children[i];
            }
        }
        return newchild(unit ,name ,parent);
    }

    /**
     * NODE作成
     * @param String        unit ZONEUNIT
     * @param String        name フォルダ名
     * @param Exportelement parent 親エレメント
     */
    protected Exportelement newchild(String unit ,String name ,Exportelement parent){
        //各属性を設定する
        Attributes attr = new Attributes();
        attr.add("Name" ,name);
        attr.add("Creator" ,"operator");
        attr.add("Comment" ,ZApp.getTheApp().getResource().getString(COMMENT));
        attr.add("Exist"   ,"true");

        return parent.add(unit ,attr);
    }

    /**
     * 属性追加
     * @param File          file     ファイル
     * @param Exportelement element　エレメント
     */
    protected void addElement(File file ,Exportelement element){

        //ファイルパスからファイル名取得
        String name = file.getName();
        Exportelement child = childCreate("DocumentUnit" ,name ,element);
        //ファイルのみの属性
        child.attribute("Size" ,String.valueOf(file.length()));
        child.attribute("Date" ,DateFormat.getDateTimeInstance().format(new Date(file.lastModified())));
    }
}