package jp.co.nri.rid.search;

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

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


/**
 * 利用されていないリソースを探索する
 */
class SPTableModelUnused extends SPTableModel{
    /** SCCS ID */
    private static final String SCCSID = "@(#)SPTableModelUnused.java";

    /** RCS ID */
    private static final String RCSID =
	"$Id: SPTableModelUnused.java,v 1.5 2003-07-17 15:41:42+09 nsmr Exp $";

    /**
     * コンストラクタ:
     */
    SPTableModelUnused() {
        target = SPTableModel.UNUSED;
        count = 0;

        /* 結果表示テーブルのデータを初期化 */
        resultVector = new Vector();

        /* site.xml の PaegUnit をすべて取得 */
        elementBooster[] pageUnits =
            getElementsFromDocument("PageUnit", Rid.DOCUMENT_SITE);
        SPElementHash pageUnitHash = new SPElementHash(pageUnits, true);

        /* resource.xml の ResourceUnit をすべて取得 */
        elementBooster[] resourceUnits =
            getElementsFromDocument("ResourceUnit", Rid.DOCUMENT_RESOURCE);
        if (resourceUnits == null) {
            return;
        }
        SPElementStatusHash resourceUnitHash =
            new SPElementStatusHash(resourceUnits, true);
        if (resourceUnitHash.size() <= 0) { 
            return;
        }

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

        /*
         * LinkedPageUnits を全探索し、
         * 現れた ResourceUnit にチェック済みフラグを立てる。
         * ただし、リンク元の PageUnit が存在しなければフラグは立てない。
         */
        if (linkedPageUnits != null) {
            for (int i = 0; i < linkedPageUnits.length; i++) {
                /* 参照元の page を取得 */
                String pageName = linkedPageUnits[i].attribute("Page");
                if (pageName == null) {
                    continue;
                }
                /*
                 * 参照元の PageUnit が無かったり、page の実体が無ければ、
                 * その resource は unused とみなす
                 */
                elementBooster pageUnit = pageUnitHash.get(pageName, true);
                if (pageUnit == null) {
                    continue;
                }

                /* 参照先の resource を取得 */
                String resource = linkedPageUnits[i].attribute("Resource");
                if (resource == null) {
                    continue;
                }
                SPElementStatus es = resourceUnitHash.get(resource, true);
                if (es == null) {
                    continue;
                }

                /* resource に used フラグを立てる */
                es.setStatus(SPElementStatus.DONE);
            }
        }

        /*
         * チェック済みフラグの立っていない ResourceUnit (= 孤立リソース) 
         * の表示
         */
        count = 0;
        for (Enumeration e = resourceUnitHash.keys(); e.hasMoreElements();) {
            String resource = (String)e.nextElement();
            SPElementStatus es = resourceUnitHash.get(resource);
            if (es.getStatus() != SPElementStatus.DONE) {
                resultVector.add(new SPElementAndStrings(es.getElement()));
                count++;
            }
        }
        sort(SPColumnNames.getColumnIndex(target, SPColumnNames.FILE), false);
    } /* コンストラクタ */
} /* class SPTableModelUnused */
