/*
 * @(#)RCleanup.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : Cleanup
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/12/10
 */
package jp.co.nri.rid.cleanup;

import jp.co.iti.fagot.doc.DocDocument;
import jp.co.iti.fagot.util.ZInstance;
import jp.co.iti.fagot.util.ZDebug;
import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.ZApp;

import jp.co.nri.Rid;
import org.w3c.dom.NodeList;
import jp.co.nri.rid.doc.RidElement;


/**
 * Exist="false"のユニットを削除する
 */
public class RCleanup {

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

    //## Cleanup ######################################################
    /**
     * クリーンアップのエントリーポイント
     */
    /**
     * site.xmlのクリーンアップ
     * clean対象ユニット：ZoneUnit,PageUnit,LinkUnit
     * @param doc site.xmlのドキュメント
     */
    public boolean cleanupSite( DocDocument doc ) {
        RidElement rootelm = (RidElement)doc.getDocumentElement();
        searchTop(rootelm);
    return true;
    }

    /**
     * resource.xmlのクリーンアップ
     * clean対象ユニット：ZoneUnit,PageUnit,LinkUnit
     * @param doc resource.xmlのドキュメント
     */
    public boolean cleanupResource( DocDocument doc ) {
        RidElement rootelm = (RidElement)doc.getDocumentElement();
        searchTop(rootelm);
    return true;
    }

    /**
     * document.xmlのクリーンアップ
     * clean対象ユニット：ZoneUnit,PageUnit,LinkUnit
     * @param doc document.xmlのドキュメント
     */
    public boolean cleanupDocument( DocDocument doc ) {
        RidElement rootelm = (RidElement)doc.getDocumentElement();
        searchTop(rootelm);
    return true;
    }

    /**
     * topZone抽出
     * @param  RidElement element ルートエレメント
     * @return RidElement element トップエレメント
     */
    protected void searchTop(RidElement element) {
        if (element.getNodeType() == RidElement.ELEMENT_NODE) {
            NodeList list = element.getChildNodes();
            for (int i = 0; i < list.getLength(); i++) {
                if (list.item(i) instanceof RidElement ) {
                    removeNode((RidElement)list.item(i));
                }
            }
        }
    }

    /**
     * 個別削除ルーチン(_top以下)
     */
    protected void removeNode(RidElement element) { 
        if (element.getNodeType() == RidElement.ELEMENT_NODE) {

            /*再帰処理*/
            NodeList list = element.getChildNodes();

            for (int i = 0; i < list.getLength(); i++) {
                if ( list.item(i) instanceof RidElement ) {
                    RidElement ridelm = (RidElement)list.item(i);
                    /*属性(Exist)の調査*/
                    String szExist = ((RidElement)ridelm).getAttribute("Exist");
                    if (szExist.equals("false")) {

						// *** change fuku 2002/04/15 ***
						((RidElement)ridelm).removeFromDocTree();

                        /*親ノードの取得*/
//                      RidElement parentnode = (RidElement)ridelm.getParentNode();

                        /*ノード削除*/
//                      parentnode.removeChild(ridelm);
                        /*子ノードの数を減らす*/
                        i--;
                    }
                    removeNode(ridelm);
                }
            }
        }
    }
    //## アトリビュート ###############################################
}
