package org.itscool.weber.io;

import java.io.IOException;
import java.util.LinkedList;

import org.itscool.commons.document.XmlConfigReader;
import org.itscool.weber.mapping.ExceptionMapping;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * weber-config.xmlの&lt;global-exceptions&gt;要素を解析するクラスです
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
 */
public class ExceptionConfigReader extends XmlConfigReader{
    
    /**
     * XMLファイルから&lt;exceptions&gt;要素を解析します<br>
     * 解析結果はnodeListにセットします<br>
     * @param hashMap XMLの解析結果
    */
    protected void doCreate(LinkedList hashMap) throws IOException{
        /* ルートタグ名を取得 */
        Element root = document.getDocumentElement();
        if( root == null ){
            String err = "Can not root element at itscool-config.xml(" + 
                getClass().getName()+")";
            throw new IOException(err);
        }
        /* action-mappings の取得*/
        NodeList exceptionList = root.getElementsByTagName("global-exceptions");
        if( exceptionList != null ){
            Node exception = exceptionList.item(0);
            if( exception != null ){
                createExceptions(exception, hashMap);
            }
        }
    }
    
    /**
     * &lt;exception&gt;要素を解析します
     * @param exceptions &lt;exceptions&gt;要素
     * @param hashMap 解析後の&lt;exceptions&gt;要素を追加するノードリスト
     * @throws Exception
     */
    protected void createExceptions(Node exceptions, LinkedList hashMap){
        NodeList exceptionsChilds = exceptions.getChildNodes();
        
        for( int i = 0; i < exceptionsChilds.getLength(); i++) {
            Node exception = exceptionsChilds.item(i);
            if( exception.getNodeName().equals("exception")){
                createException(exception, hashMap);
            }
        }
    }
    
    /**
     * &lt;exception&gt;要素の属性を解析します
     * @param exception &lt;exception&gt;要素
     * @param hashMap 解析後の&lt;exception&gt;要素を追加するノードリスト
     * @throws Exception
     */
    protected void createException(Node exception, LinkedList hashMap){
        NamedNodeMap attributes = exception.getAttributes();
        Node path = attributes.getNamedItem("path");
        Node name = attributes.getNamedItem("name");
        
        if( path == null || name == null ){
        	return;
        }
        ExceptionMapping mapping = new ExceptionMapping(
            path.getNodeValue(), name.getNodeValue());
        hashMap.addFirst( mapping );
        
    }
}
