package org.itscool.weber.io;

import java.io.IOException;
import java.util.HashMap;

import org.itscool.commons.file.ConfigReader;
import org.itscool.weber.user.UserRole;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * weber-config.xmlの&lt;roles&gt;要素を解析するクラスです
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
 */
public class RoleConfigReader extends ConfigReader{
    
    /**
     * XMLファイルから&lt;roles&gt;要素を解析します<br>
     * 解析結果はnodeListにセットします<br>
     * @param hashMap XMLの解析結果
    */
    protected void doCreate(HashMap 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 rolesList = root.getElementsByTagName("roles");
        if( rolesList != null ){
            Node roles = rolesList.item(0);
            if( roles != null ){
                createRoles(roles, hashMap);
            }
        }
    }
    
    /**
     * &lt;role&gt;要素を解析します
     * @param roles &lt;roles&gt;要素
     * @param hashMap 解析後の&lt;roles&gt;要素を追加するノードリスト
     * @throws Exception
     */
    protected void createRoles(Node roles, HashMap hashMap){
        NodeList rolesChilds = roles.getChildNodes();
        
        for( int i = 0; i < rolesChilds.getLength(); i++) {
            Node role = rolesChilds.item(i);
            if( role.getNodeName().equals("role")){
                createRole(i, role, hashMap);
            }
        }
    }
    
    /**
     * &lt;role&gt;要素の属性を解析します
     * @param role &lt;role&gt;要素
     * @param hashMap 解析後の&lt;role&gt;要素を追加するノードリスト
     * @throws Exception
     */
    protected void createRole(int i, Node role, HashMap hashMap){
        NamedNodeMap attributes = role.getAttributes();
        Node path = attributes.getNamedItem("path");
        Node name = attributes.getNamedItem("name");
        
        /*
        System.out.print("[" + role.getNodeName() + "] ");
        System.out.print(name.getNodeName() + ":" + name.getNodeValue() + " , ");
        System.out.println(path.getNodeName() + ":" + path.getNodeValue());
        */
        UserRole userRole = new UserRole();
        userRole.setName(name.getNodeValue());
        userRole.setPath(path.getNodeValue());
        hashMap.put( name.getNodeValue(), userRole );
        
    }
}
