/*
 * @(#)MapperBase.java
 *
 * RID-X : Mapper
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/02/15
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 */

package jp.co.nri.rid.mapper;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import java.util.Vector;

import org.w3c.dom.*;
import org.xml.sax.InputSource;

import jp.co.iti.fagot.doc.DocManager;

import jp.co.iti.fagot.doc.DocManager;
import jp.co.iti.fagot.util.ZProperties;
import jp.co.iti.fagot.util.ZString;

/**
  * Mapper のベースクラス
  **/
public class MapperBase {
    /** Mapのクラス **/
    class MapItem {
        String  srcTag;
        String  srcKey;
        String  dataTag;
        String  dataKey;
        String  inTag;
        String  outAttr;
    }

    /** Dataのクラス  **/
    class DataItem {
        String  tagName;
        String  keyName;
        String  outAttr;
        String  inData;
        Vector  mapData_lst;
    }

    /** タグクラス  **/
    class TagItem {
        String  tagName;
        String  keyName;
        String  tagString;
        int     sPos;
        int     ePos;
    }

    /** MapRepeatタグのクラス **/
    class MapRepeat {
        String  name;
        Vector  mapData;
    }


    /** MapDataのクラス **/
    class MapData {
        String  name;
        String  data;
    }


    public MapperBase() {}


/**
  * Xml　Fileをパースし、Documentを戻す
  *
  * @param  String      xml_file        XMLファイル名
  * @return Document
  */
    public Document xmlFile2Document(String xml_file) throws Exception {

        Document document = null;
        // Parse
        org.apache.xerces.parsers.DOMParser
            parser = new org.apache.xerces.parsers.DOMParser();
        parser.setFeature("http://xml.org/sax/features/validation", true);
        //日本語のﾌｧｲﾙ名対応
        InputSource in = DocManager.createInputSource(xml_file);
        parser.parse(in);

        //ドキュメントオブジェクト生成
        document = parser.getDocument();
        return document;
    }



/**
  * Xml　Fileをパースし、RootElemenを戻す
  *
  * @param  String      xml_file        XMLファイル名
  * @param  String      roor_element    ルートエレメント名
  * @return Element
  */
    public Element xmlFile2RootElement(String xml_file, String roor_element) throws Exception {

        Document doc = null;
        Element root_elem = null;

        // MAP XML ファイルをDOMに変換
        doc = xmlFile2Document(xml_file);

        //
        if(doc != null) {
            //ルートのエレメント取得
            root_elem = doc.getDocumentElement();
            if (!checkRootElement(root_elem, roor_element)) {
                return null;
            }
            return root_elem;
        }
        return null;
    }

/**
  * XMLファイルがRID用のXMLファイルか、ルートタグ名でチェツクを行う
  *
  * @param  Element     root_elem       ルートエレメント
  * @param  String      root_tag        ルートタグ名
  *
  * @return boolean true / false
  */
    public boolean checkRootElement(Element root_elem, String root_tag)  {

        if ( root_elem.getNodeName().compareTo(root_tag) != 0 ) {
            return false;
        }
        return true;
    }


/**
  * HTML Parser
  *     タグを解析して、タグオブジェクトの配列（Vector）を戻す
  *
  * @param  String      filename        HTMLファイル名
  * @param  Vector      tmpEl           Template Element
  * @return void
  */
    public boolean htmlParser(String filename, Vector mLstTag) throws Exception {

        boolean ret = false;

        boolean intag = false;        // タグの中=true、タグの外=false
        int pos = 0;                  // ファイルの位置
        int start = 0;                // タグ開始位置
        int end = 0;                  // タグ終了位置
        char str[] = new char[256];   // BUFF
        String data = "";             // タグの内容

        InputStreamReader InData = new InputStreamReader(new FileInputStream(filename));

        // HTMLファイルを1文字ずつ読み込み、解析する
        while ((InData.read(str,0,1))!=-1){
            if (!intag) {
                if (str[0] == '<'){
                    intag = true;           //タグの開始位置を検出
                    start = pos;            //開始位置
                    data = data + str[0];   //文字をコピー
                }
            } else {
                data = data + str[0];       //文字をコピー
                if (str[0] == '>') {
                    intag = false;          //HTMLタグの中なら、タグの終了位置を検出
                    end = pos;              //終了位置

                    TagItem item = new TagItem();
                    item.tagString  = data;
                    item.sPos       = start;
                    item.ePos       = end;
                    mLstTag.add(item);
                    data = "";
                    start = 0;
                    end = 0;
                }
            }
            pos++;
        }
        InData.close();
        return true;
    }



/**
  * 指定された属性の値を取得する
  *
  * @param  String      tag             タグの文字列
  * @param  String      name            属性名
  * @return String      属性値
  */
    public String getAttrValue(String tag, String name) {

        String  retValue = "";
        int     pos = -1;
        int     sPos = -1;
        char    eChar = ' ';

        String buff = tag.toUpperCase();

        if ((pos = buff.indexOf(name.toUpperCase())) != -1) {
            buff = tag.substring(pos + name.length());

            // 前後のスペースを削除
            buff = buff.trim();

            // 先頭文字が[=]か判断
            if (buff.charAt(0) == '=') {
                boolean inquote = false;
                int ind = 1;
                while (ind < buff.length()) {
                    char ch = buff.charAt(ind);
                    // Value
                    if (!inquote) {
                        // "又は、スペースでないでない場合
                        if (ch == '"' || ch !=' ') {
                            inquote = !inquote;
                            if (ch == '"') {
                                eChar = '"';
                                sPos = ind + 1;
                            } else if (ch != ' ') {
                                if (ch == '\'') {
                                    eChar = '\'';
                                    sPos = ind + 1;
                                } else {
                                    eChar = ' ';
                                    sPos = ind;
                                }
                            }
                        }
                    } else {
                        if (ch == eChar) break;
                    }
                    ind++;

                }
                retValue = buff.substring(sPos, ind);
            }
        }
        return retValue;
    }

/**
  * 指定されたファイルが存在するかどうか、読み込み可能かどうかを確認する
  *
  * @param  String      filename        ファイル名
  *
  * @return boolean true(存在する) / false (存在しない)
  */
    public boolean isFile(String filename) {

        File file = new File(filename);

        if (!file.exists() || !file.isFile()) {
            return false;
        }
        return true;
    }

/**
  * パスの区切り文字を"/"に変換する
  *
  * @param  String      navitePath      パス文字列
  * @return void
  */
    public String replaceWebSeparator(String path) {
        return path.replace(File.separatorChar, '/');
    }

}
