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

package jp.co.nri.rid.mapper;

import org.w3c.dom.*;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.StringTokenizer;
import jp.co.iti.fagot.ZApp;
import jp.co.iti.fagot.doc.DocDocument;
import jp.co.iti.fagot.doc.DocManager;
import jp.co.iti.fagot.util.ZDebug;
import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.util.ZProperties;
import jp.co.iti.fagot.util.ZString;

import jp.co.nri.rid.error.RidException;


/**
 * Mapper AccessLog
 */
public class MapperAccessLog {

    /** テンプレートディレクトリ **/
    static final String RID_TEMPLATE_DIR = "rid.template.dir";
    /**map.xml **/
    static final String puMapXml    = "accesslog_map.xml";
    /** RidProjectタグ名の定義 **/
    static final String puRootTag   = "RidProject";
    /** Pageタグ名の定義 **/
    static final String puPageTag   = "Page";
    /** Fileタグ名の定義 **/
    static final String puFileTag   = "File";
    /** accesscountタグ名 **/
    static final String puAccessTag = "accesscount";

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


/**
  *
  * アクセスログ（CSV形式)をSITE.XMLの<PageUnit>にAccessCount属性としてを追加する
  *
  * @param  String      project_dir     プロジェクトディレクトリ
  * @param  Document    doc             SITE.XMLのドキュメント
  * @param  String      csvfile         アクセスログファイル名（CSV形式)
  *
  * @return boolean     true(成功) / false(失敗)
  */
  public boolean accesslog(String project_dir, Document doc, String csvfile)  throws RidException, Exception {

      boolean ret = true;

      // CSV形式のアクセスログをMapper(Type1)のデータ形式（DOM形式）に変換
      Document date_doc = makeDOM(csvfile);

      // テンプレートディレクトリ
      ZResource res = ZApp.getTheApp().getResource();
      String template_dir = res.getString(RID_TEMPLATE_DIR);
      String mapfile = project_dir + File.separator + template_dir + File.separator + puMapXml;

      //Mapper <PageUnit>に AccessCount属性追加
      MapperType1 mt1 = new MapperType1();
      ret  = mt1.Type1Xml(doc.getDocumentElement(), mapfile, date_doc.getDocumentElement());

      return ret;
  }

/**
  *
  * CSVファイルをDOM形式に変換する
  *
  * <RidProject>
  *   <Page File="url">
  *     <accesscount>accesscount</accesscount>
  *   </Page>
  *                     ....<Page>タグの繰返し
  * </RidProject>
  *
  * @param  String      csvfile         CSVファイル名
  *
  * @return boolean     Document
  */
  public Document makeDOM(String csvfile)  throws RidException, Exception {

      XmlUtil xu = new XmlUtil();
      Element page_elem;
//      Attr attr;
      String line = null;

      // CSVファイルオープン
      BufferedReader bufreader = new BufferedReader(new FileReader(csvfile));

      // ドュメント生成
      Document doc = new org.apache.xerces.dom.DocumentImpl();
      Element topElem = doc.createElement(puRootTag);
      doc.appendChild(topElem);

      /* CSVデータからDOMツリーを作成 */
      while((line =bufreader.readLine()) != null){
            StringTokenizer tokens= new StringTokenizer(line,",");

            //トークンを取り出せる回数の取得
            int count = tokens.countTokens(); 

            if (count != 0) {
                //1件目のページ名を取得
                String url = tokens.nextToken();

                //アクセスカウント取得 (URLの+１からコピー)
                String ac_buff = line.substring(Math.max(0,url.length()+1));

                //アクセスカウントの["]は取り除く
                StringTokenizer tokens2 = new StringTokenizer(ac_buff,"\"");
                String accesscount = "";
                while (tokens2.hasMoreTokens()) {
                    accesscount = accesscount + tokens2.nextToken();
                }

                // 値がNULL値の場合は ""にする
                if (isNullString(url))  url = "";
                if (isNullString(accesscount)) accesscount = "";

                // urlの先頭の[ / ]を削除する
                if (url.length() > 0 )  url = url.substring(1);

                //DOM Write
                page_elem = xu.createSubElement(topElem, puPageTag);
				page_elem.setAttribute(puFileTag, url);
//                attr = xu.createOrGetAttribute(page_elem, puFileTag);
//                xu.createOrSetTextValue((Node)attr, url);
                xu.createOrSetTextValue(page_elem, puAccessTag, accesscount);
            }
      }
      return doc;
    }

/**
  * String型がＮＵＬＬか判断する
  *
  * @param  String      str           ファイル名
  * @return boolean     true (null)/false(not null)
  */
    public boolean isNullString(String str) throws Exception {

        boolean ret;
        if ((str == null) || (str == ""))
            ret = true;
        else
            ret = false;
        return ret;
    }

}