package jp.co.nri.rid.search;

/* misc */
import java.util.Arrays;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Vector;

/* Rid */
import jp.co.nri.Rid;
import jp.co.nri.rid.xml.elementBooster;

/**
 * HTML とその中に含まれるインラインリソースのバイト数を合計し、
 * 大きい順に表示する。
 */
class SPTableModelLarge extends SPTableModel{
    /** SCCS ID */
    private static final String SCCSID = "@(#)SPTableModelLarge.java";

    /** RCS ID */
    private static final String RCSID =
	"$Id: SPTableModelLarge.java,v 1.10 2003-08-06 18:29:58+09 nsmr Exp $";

    SPElementStatusHash pageUnitHash;

    /**
     * コンストラクタ:
     */
    SPTableModelLarge() {
        target = SPTableModel.LARGE;

        /* 結果表示テーブルのデータを初期化 */
        resultVector = new Vector();
	    
        /* DOCUMENT_SITE の PaegUnit をすべて取得 */
        elementBooster[] pageUnits =
            getElementsFromDocument("PageUnit", Rid.DOCUMENT_SITE);
        if (pageUnits.length == 0) {
            /* ページがなければ、検索結果は 0 件 */
            count = 0;
            return;
        }

        /* 存在しないページは pageUnitHash に含まれない */
        pageUnitHash = new SPElementStatusHash(pageUnits, true);

        /* DOCUMENT_RESOURCE の ResourceUnit をすべて取得 */
        elementBooster[] resourceUnits =
            getElementsFromDocument("ResourceUnit", Rid.DOCUMENT_RESOURCE);
        SPElementHash resourceUnitHash =
            new SPElementHash(resourceUnits, true);

        /* DOCUMENT_RESOURCE の LinkedPageUnit をすべて取得 */
        elementBooster[] linkedPageUnits =
            getElementsFromDocument("LinkedPageUnit", Rid.DOCUMENT_RESOURCE);

        /** 1 行分のデータを含む文字列の配列 */
        String[] rowStrings;

        int[] columnIDs = SPColumnNames.get(target);
        if (columnIDs == null){
            count = -1;
            return;
        }

        /* ページが利用しているリソースのサイズを計算 */
        for (int i = 0; i < linkedPageUnits.length; i++) {
            elementBooster linkedPageUnit = linkedPageUnits[i];
            String pageName = linkedPageUnit.attribute("Page");
            if (pageName == null) {
                continue;
            }
            SPElementStatus elementStatus = pageUnitHash.get(pageName, true);
            if (elementStatus == null) {
                continue;
            }
            int resourceSize = elementStatus.getStatus();

            String resource = linkedPageUnit.attribute("Resource");
            if (resource == null) {
                continue;
            }

            elementBooster element = resourceUnitHash.get(resource, true);
            if (element == null) {
                continue;
            }
            resourceSize += getFileSize(element);
            elementStatus.setStatus(resourceSize);
        }


        count = 0;
        for (Enumeration e = pageUnitHash.keys(); e.hasMoreElements();) {
            String fileName = (String)e.nextElement();
            SPElementStatus elementStatus = pageUnitHash.get(fileName);
            elementBooster pageUnit = elementStatus.getElement();

            /* ページ単体のファイルサイズを計算 */
            int pageSize = getFileSize(pageUnit);

            /* すでに計算済みの、リソースの合計を取得 */
            int resourceSize = elementStatus.getStatus();

            /* 行データを初期化 */
            rowStrings = new String[columnIDs.length];

            /* 行に値を設定 */
            rowStrings = addStringToRowStrings(rowStrings, target,
                                               SPColumnNames.TOTAL,
                                               String.valueOf(resourceSize
                                                              + pageSize));
            rowStrings = addStringToRowStrings(rowStrings, target,
                                               SPColumnNames.HTML_ONLY,
                                               String.valueOf(pageSize));
            rowStrings = addStringToRowStrings(rowStrings, target,
                                               SPColumnNames.RESOURCES,
                                               String.valueOf(resourceSize));

            /* 1行分のデータを追加 */
            resultVector.add(new SPElementAndStrings(pageUnit, rowStrings));
            count++;
        } /* for (Enumeration e = pageUnitHash.keys(); e.hasMoreElements();) */

        /* resultVector を TOTAL をキーにしてソート */
        int columnOfTotal =
            SPColumnNames.getColumnIndex(target, SPColumnNames.TOTAL);
        if (columnOfTotal != -1) {
            sort(columnOfTotal, false, DESCENDING);
        }
    } /* コンストラクタ */


    /**
     * ユニットのファイルサイズを返す
     * @param ユニットを表す要素
     * @return ファイルサイズ
     */
    int getFileSize(elementBooster element) {
        int fileSize;

        if (element == null) {
            return 0;
        }

        String fileSizeStr = element.attribute("Size");
        if (fileSizeStr == null) {
            return 0;
        }

        try {
            fileSize = Integer.parseInt(fileSizeStr);
        } catch (NumberFormatException e) {
            fileSize = 0;
        }
        return fileSize;
    } /* getFileSize */
} /* class SPTableModelLarge */
