/*
* Copyright (c) 2002 IBM Corporation and others.
* All rights reserved.   This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
* 
* Contributors:
*   IBM - Initial API and implementation
*   Jens Lukowski/Innoopract - initial renaming/restructuring
* 
*/
package org.eclipse.wst.xml.core.internal.contentmodel.util;

import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;

// todo.. move this class to another package (perhaps xmlutility)
//
public class DOMVisitor
{         
  public void visitNode(Node node)
  {
    switch (node.getNodeType())
    {
      case Node.ATTRIBUTE_NODE :
      {
        visitAttr((Attr)node);
        break;
      }
      case Node.CDATA_SECTION_NODE :
      {
        visitCDATASection((CDATASection)node);
        break;
      }
      case Node.COMMENT_NODE :
      {
        visitComment((Comment)node);
        break;
      }
      case Node.DOCUMENT_NODE :
      {
        visitDocument((Document)node);
        break;
      }
      case Node.DOCUMENT_TYPE_NODE :
      {
        visitDocumentType((DocumentType)node);
        break;
      }
      case Node.ELEMENT_NODE :
      {
        visitElement((Element)node);
        break;
      }
      case Node.PROCESSING_INSTRUCTION_NODE :
      {
        visitProcessingInstruction((ProcessingInstruction)node);
        break;
      }
      case Node.TEXT_NODE :
      {
        visitText((Text)node);
        break;
      }
    }  
  }    
    
  protected void visitDocument(Document document)
  {                   
    visitChildNodesHelper(document);
  }

  protected void visitDocumentType(DocumentType doctype)
  {         

  }  

  protected void visitElement(Element element)
  {        
    visitAttributesHelper(element);
    visitChildNodesHelper(element);
  } 
 

  public void visitAttr(Attr attr)
  {                                  
  }

  protected void visitText(Text text)
  {    
  }

  protected void visitCDATASection(CDATASection cdataSection)
  {                       
  }     

  protected void visitComment(Comment comment)
  {                   
  }   

  protected void visitProcessingInstruction(ProcessingInstruction pi)
  {    
  }
 

  protected void visitChildNodesHelper(Node node)
  {
    NodeList children = node.getChildNodes();
    for (int i = 0; i < children.getLength(); i++)
    {
      visitNode(children.item(i));
    }
  }

  protected void visitAttributesHelper(Node node)
  {
    NamedNodeMap map = node.getAttributes();
    for (int i = 0; i < map.getLength(); i++ )
    {
      visitNode(map.item(i));
    }
  }         
}
