/*
 * @(#)HtmlMapper.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.*;
import java.util.*;
import java.net.URL;
import org.w3c.dom.*;
import jp.co.nri.rid.error.*;
import jp.co.nri.rid.snapshot.*;

/**
 * Mapper HTML用
 */
public class HtmlMapper extends MapperBase {


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

/**
  * 入力HTMLファイルを指定タグの属性値を置換し、出力する
  *
  * @param  String      in_file         入力ファイル名
  * @param  String      out_file        出力ファイル名
  * @param  String      tagName         タグ名
  * @param  String      attrName        属性名
  * @param  String      value           値
  * @return void
  */
    public boolean replaceHtmlTagAttribute(String in_file, String out_file, String tagName, String attrName, String value)  throws RidException, Exception {

        boolean ret = false;
        Vector tagName_lst = new Vector();

        // INFILEからHTMLタグを取り出す
        Vector tag_lst = new Vector();
        htmlParser(in_file, tag_lst);

        // タグ名が指定された tagNameのみにする
        for (int n = 0; n < tag_lst.size(); n ++ ) {
            // HTMLタグ情報の取得
            TagItem htmlTag = (TagItem)tag_lst.elementAt(n);
            String compare = htmlTag.tagString.substring(1, Math.min(tagName.length()+1, htmlTag.tagString.length()) );
            
            if ( compare.equalsIgnoreCase(tagName) ) {
                htmlTag.keyName = getAttrValue(htmlTag.tagString, attrName);
                tagName_lst.add(htmlTag);
            }
        }

        if (tagName_lst.size() == 0) {
            // 指定されたtagNameがない場合は通常のコピー
            xcopy xc = new xcopy();
            ret = xc.file(in_file, out_file);
        } else {
            // 
            ret = replaceGenerate(in_file, out_file, tagName_lst, attrName, value);
        }
        return true;
    }




/**
  * 入力HTMLファイルを指定タグの属性値を置換し、出力する
  *
  * @param  String      in_file         入力ファイル名
  * @param  String      out_file        出力ファイル名
  * @param  Vector      replaceTag_lst  タグ名リスト
  * @param  String      attrName        属性名
  * @param  String      value           値
  *
  * @return boolean     true(成功) / false(失敗)
  */
    private boolean replaceGenerate(String in_file, String out_file, Vector replaceTag_lst,  String attrName, String value)  throws Exception{

        boolean ret = false;
        char str[]=new char[256];

        //ファイルのオープン
        InputStreamReader inData = new InputStreamReader(new FileInputStream(in_file));
        OutputStreamWriter outWriter = new OutputStreamWriter(new FileOutputStream(out_file));

        int pos = 0;
        for ( int n = 0; n < replaceTag_lst.size(); n ++ ) {

            TagItem replaceTag = (TagItem)replaceTag_lst.elementAt(n);

            // タグの最初の位置まで出力する
            while ((inData.read(str, 0, 1)) != -1) {
                if (pos < replaceTag.sPos) {
                    outWriter.write(str, 0, 1);
                } else {
                    pos++;
                    break;
                }
                pos++;
            }
            
            String replace = replaceString(replaceTag, attrName, value);
            outWriter.write(replace, 0, replace.length());

            // </MapRepeat>タグまでを読飛ばす
            while ((inData.read(str, 0, 1)) != -1) {
                if (pos < replaceTag.ePos) {
                    //読み飛ばし
                } else {
                    pos++;
                    break;
                }
                pos++;
            }
        }
        // 最後まで読込む
        while ((inData.read(str, 0, 1)) != -1) {
          outWriter.write(str, 0, 1);
        }

        // ファイルクローズ
        inData.close();
        outWriter.close();

        return true;
   }

/**
  * 指定タグの属性値を置換する
  *
  * @param  TagItem     repeatTag       タグ情報
  * @param  String      attrName        属性名
  * @param  String      value           値
  *
  * @return boolean     true(成功) / false(失敗)
  */
    private String replaceString(TagItem repeatTag, String attrName, String value) throws Exception {

        String tagString = "";

        if (repeatTag.keyName != "") {
            String lowerTagString = repeatTag.tagString.toLowerCase();
            int pos  = lowerTagString.indexOf(attrName.toLowerCase());
            int sPos = repeatTag.tagString.indexOf(repeatTag.keyName, pos);
            int ePos = sPos + repeatTag.keyName.length();
            tagString = repeatTag.tagString.substring(0,sPos) + value + repeatTag.tagString.substring(ePos);
        } else {
            int end = repeatTag.tagString.length()-1;
            tagString = repeatTag.tagString.substring(0,end) + " " + attrName + "=\"" + value + "\">";
        }
        
        return tagString;
    }
}
