package org.eclipse.jst.jsf.validation.internal.appconfig;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

/**
 * Visits an app config DOM tree and calls validators based on the
 * configured validator tree
 * 
 * @author cbateman
 *
 */
public abstract class NodeValidationVisitor 
{
    private final short     _nodeType;
    private final String    _nodeName;
    private final Map       _attributeVisitors;
    private final Map       _elementVisitors;
    
    /**
     * Used to indicate no child nodes
     */
    protected final static NodeValidationVisitor[] EMPTY_CHILDREN = new NodeValidationVisitor[0];
    
    /**
     * @param nodeType
     * @param nodeName
     */
    public NodeValidationVisitor(short nodeType, String nodeName)
    {
        _nodeType = nodeType;
        _nodeName = nodeName;
        _attributeVisitors = new HashMap();
        _elementVisitors = new HashMap();
        
        NodeValidationVisitor[] childVisitors = getChildNodeValidators();
        
        for (int i = 0; i < childVisitors.length; i++)
        {
            final NodeValidationVisitor visitor = childVisitors[i];
            
            switch(visitor.getNodeType())
            {
                case Node.ATTRIBUTE_NODE:
                    _attributeVisitors.put(visitor.getNodeName(), visitor);
                break;
                
                case Node.ELEMENT_NODE:
                    _elementVisitors.put(visitor.getNodeName(), visitor);
                break;
            }
        }
    }
    
    /**
     * @param node
     * @param messages
     * @param file 
     */
    public final void validate(Node node, List messages, IFile file)
    {
        doValidate(node, messages, file);
        
        final NamedNodeMap attributes = node.getAttributes();
        
        for (int i = 0; attributes != null && i < attributes.getLength(); i++)
        {
            final Node attr = attributes.item(i);
            final NodeValidationVisitor  visitor = 
                (NodeValidationVisitor) _attributeVisitors.get(attr.getNodeName());
            if (visitor != null)
            {
                visitor.validate(attr, messages, file);
            }
        }
        
        for (int i = 0; i < node.getChildNodes().getLength(); i++)
        {
            final Node child = node.getChildNodes().item(i);
            final NodeValidationVisitor  visitor = 
                (NodeValidationVisitor) _elementVisitors.get(child.getNodeName());
            if (visitor != null)
            {
                visitor.validate(child, messages, file);
            }
        }
    }

    /**
     * Do the validation for this visitor on this node.  Add any Message's to
     * the messages list
     * 
     * @param node
     * @param messages
     * @param file 
     */
    protected abstract void doValidate(Node node, List messages, IFile file);
    
    /**
     * @return an array of visitors that validate children of the current node
     */
    protected abstract NodeValidationVisitor[] getChildNodeValidators();
    
    /**
     * @return the node type for this validator
     */
    protected short getNodeType()
    {
        return _nodeType;
    }
    
    /**
     * @return the node name for this validator
     */
    protected String getNodeName()
    {
        return _nodeName;
    }
}
