package org.testng.xml.dom;

import org.testng.xml.XMLParser;
import org.testng.xml.XmlSuite;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;

import java.io.IOException;
import java.io.InputStream;

public class DomXmlParser extends XMLParser<XmlSuite> {
  @Override
  public XmlSuite parse(String currentFile, InputStream inputStream, boolean loadClasses) {
    XmlSuite result = null;
    try {
      result = parse2(currentFile, inputStream, loadClasses);
    } catch (Exception e) {
      e.printStackTrace();
    }

    return result;
  }

  public XmlSuite parse2(String currentFile, InputStream inputStream,
      boolean loadClasses) throws ParserConfigurationException, SAXException,
      IOException, XPathExpressionException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true); // never forget this!
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(inputStream);

    DomUtil xpu = new DomUtil(doc);
    XmlSuite result = new XmlSuite();
    xpu.populate(result);
//    XPathFactory xpathFactory = XPathFactory.newInstance();
//    XPath xpath = xpathFactory.newXPath();
//
//    {
//      XPathExpression expr = xpath.compile("//suite");
//      Object result = expr.evaluate(doc, XPathConstants.NODESET);
//      NodeList nodes = (NodeList) result;
//      for (int i = 0; i < nodes.getLength(); i++) {
//        Node node = nodes.item(i);
//        for (int j = 0; j < node.getAttributes().getLength(); j++) {
//          System.out.println(node.getAttributes().item(j));
//        }
//      }
//    }

//    {
//      XPathExpression expr = xpath.compile("//suite/@name");
//      Object result = expr.evaluate(doc, XPathConstants.STRING);
//      System.out.println("NAME:" + result);
//    }
    System.out.println(result.toXml());
    return result;
  }
}
