1f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beustpackage org.testng.xml.dom;
2f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
3a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport org.testng.collections.Lists;
4a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport org.testng.collections.Maps;
5a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport org.testng.xml.XmlClass;
6f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beustimport org.testng.xml.XmlSuite;
7a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport org.testng.xml.XmlTest;
8f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beustimport org.w3c.dom.Document;
9a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport org.w3c.dom.Element;
10f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beustimport org.w3c.dom.Node;
11f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beustimport org.w3c.dom.NodeList;
12f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
1373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beustimport javax.xml.xpath.XPath;
1473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beustimport javax.xml.xpath.XPathExpressionException;
1573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beustimport javax.xml.xpath.XPathFactory;
1673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust
17a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport java.lang.reflect.InvocationTargetException;
18a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport java.lang.reflect.Method;
1973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beustimport java.util.Iterator;
20a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport java.util.List;
21a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beustimport java.util.Map;
22a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust
23f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beustpublic class DomUtil {
24f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
25f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  private XPath m_xpath;
26f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  private Document m_document;
27f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
28f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  public DomUtil(Document doc) {
29f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    XPathFactory xpathFactory = XPathFactory.newInstance();
30f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    m_xpath = xpathFactory.newXPath();
31f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    m_document = doc;
32f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  }
33f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
3473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  public void populate(final XmlSuite xmlSuite) throws XPathExpressionException {
35f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    NodeList nodes = m_document.getChildNodes();
3673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    final Map<String, String> parameters = Maps.newHashMap();
37f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    for (int i = 0; i < nodes.getLength(); i++) {
38a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust      Node item1 = nodes.item(i);
3973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust
4073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      Map<String, NodeProcessor> map = Maps.newHashMap();
4173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      map.put("parameter", new NodeProcessor() {
4273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        @Override
4373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        public void process(Node node) {
4473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          Element e = (Element) node;
4573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          parameters.put(e.getAttribute("name"), e.getAttribute("value"));
4673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        }
4773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      });
4873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      map.put("test", new NodeProcessor() {
4973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        @Override
5073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        public void process(Node node) {
5173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          XmlTest xmlTest = new XmlTest(xmlSuite);
5273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          populateTest(xmlTest, node);
5373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        }
5473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      });
5573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      map.put("suite-files", new NodeProcessor() {
5673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        @Override
5773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        public void process(Node node) {
5873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          NodeList item2Children = node.getChildNodes();
5973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          List<String> suiteFiles = Lists.newArrayList();
6073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          for (int k = 0; k < item2Children.getLength(); k++) {
6173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust            Node item3 = item2Children.item(k);
6273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust            if (item3 instanceof Element) {
6373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust              Element e = (Element) item3;
6473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust              if ("suite-file".equals(item3.getNodeName())) {
6573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust                suiteFiles.add(e.getAttribute("path"));
66a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust              }
67a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust            }
68a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust          }
6973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          xmlSuite.setSuiteFiles(suiteFiles);
70a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust        }
7173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      });
7273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      parseNodeAndChildren("suite", item1, xmlSuite, map);
7373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust
7473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//      if ("suite".equals(item1.getNodeName()) && item1.getAttributes() != null) {
7573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//        populateAttributes(item1, xmlSuite);
7673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//        NodeList item1Children = item1.getChildNodes();
7773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//        for (int j = 0; j < item1Children.getLength(); j++) {
7873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//          Node item2 = item1Children.item(j);
7973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//          if ("parameter".equals(item2.getNodeName())) {
8073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            Element e = (Element) item2;
8173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            parameters.put(e.getAttribute("name"), e.getAttribute("value"));
8273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//          } else if ("test".equals(item2.getNodeName())) {
8373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            XmlTest xmlTest = new XmlTest(xmlSuite);
8473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            populateTest(xmlTest, item2);
8573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//          } else if ("suite-files".equals(item2.getNodeName())) {
8673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            NodeList item2Children = item2.getChildNodes();
8773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            List<String> suiteFiles = Lists.newArrayList();
8873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            for (int k = 0; k < item2Children.getLength(); k++) {
8973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//              Node item3 = item2Children.item(k);
9073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//              if (item3 instanceof Element) {
9173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//                Element e = (Element) item3;
9273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//                if ("suite-file".equals(item3.getNodeName())) {
9373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//                  suiteFiles.add(e.getAttribute("path"));
9473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//                }
9573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//              }
9673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            }
9773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//            xmlSuite.setSuiteFiles(suiteFiles);
9873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//          }
9973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//        }
10073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//      }
101f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    }
102f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
103a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust    xmlSuite.setParameters(parameters);
104f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust//    XPathExpression expr = m_xpath.compile("//suite/test");
105f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust//    NodeList tests = (NodeList) expr.evaluate(m_document, XPathConstants.NODESET);
106f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust//    for (int i = 0; i < tests.getLength(); i++) {
107f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust//      Node node = tests.item(i);
108f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust//      System.out.println("<test>:" + node);
109f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust//    }
110f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  }
111f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
11273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  public static interface NodeProcessor {
11373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    void process(Node node);
11473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  }
11573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust
11673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  private void parseNodeAndChildren(String name, Node root, Object object,
11773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      Map<String, NodeProcessor> processors) throws XPathExpressionException {
11873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    if (name.equals(root.getNodeName()) && root.getAttributes() != null) {
11973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      populateAttributes(root, object);
12073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      NodeList children = root.getChildNodes();
12173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      for (int j = 0; j < children.getLength(); j++) {
12273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        Node item2 = children.item(j);
12373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        String nodeName = item2.getNodeName();
12473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        NodeProcessor proc = processors.get(nodeName);
12573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        if (proc != null) {
12673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          proc.process(item2);
12773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        } else if (! nodeName.startsWith("#")){
12873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust          throw new RuntimeException("No processor found for " + nodeName);
12973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        }
13073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//        if ("parameter".equals(item2.getNodeName())) {
13173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//          Element e = (Element) item2;
13273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//          parameters.put(e.getAttribute("name"), e.getAttribute("value"));
13373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust//        }
13473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      }
13573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    }
13673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  }
13773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust
13873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    public static Iterator<Node> findChildren(Node node, String name) {
13973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    List<Node> result = Lists.newArrayList();
14073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    NodeList children = node.getChildNodes();
14173251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    for (int i = 0; i < children.getLength(); i++) {
14273251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      Node n = children.item(i);
14373251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      if (name.equals(n.getNodeName())) {
14473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust        result.add(n);
14573251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust      }
14673251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    }
14773251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust    return result.iterator();
14873251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  }
14973251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust
15073251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  private void populateTest(XmlTest xmlTest, Node item) {
151314926c3532cedb21569bb70d4b1237541aac42bCédric Beust    Map<String, String> testParameters = Maps.newHashMap();
152314926c3532cedb21569bb70d4b1237541aac42bCédric Beust    populateAttributes(item, xmlTest);
153314926c3532cedb21569bb70d4b1237541aac42bCédric Beust    NodeList itemChildren = item.getChildNodes();
154314926c3532cedb21569bb70d4b1237541aac42bCédric Beust    for (int k = 0; k < itemChildren.getLength(); k++) {
155314926c3532cedb21569bb70d4b1237541aac42bCédric Beust      Node item2 = itemChildren.item(k);
156314926c3532cedb21569bb70d4b1237541aac42bCédric Beust      if ("parameter".equals(item2.getNodeName())) {
157314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        Element e = (Element) item2;
158314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        testParameters.put(e.getAttribute("name"), e.getAttribute("value"));
159314926c3532cedb21569bb70d4b1237541aac42bCédric Beust      } else if ("classes".equals(item2.getNodeName())) {
160314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        NodeList item2Children = item2.getChildNodes();
161314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        for (int l = 0; l < item2Children.getLength(); l++) {
162314926c3532cedb21569bb70d4b1237541aac42bCédric Beust          Node item4 = item2Children.item(l);
163314926c3532cedb21569bb70d4b1237541aac42bCédric Beust          if ("class".equals(item4.getNodeName())) {
164314926c3532cedb21569bb70d4b1237541aac42bCédric Beust            XmlClass xmlClass = new XmlClass();
165314926c3532cedb21569bb70d4b1237541aac42bCédric Beust            populateAttributes(item4, xmlClass);
166314926c3532cedb21569bb70d4b1237541aac42bCédric Beust            xmlTest.getClasses().add(xmlClass);
167df63c536af90c5cce8b30b278c929d216e62caddCédric Beust
168df63c536af90c5cce8b30b278c929d216e62caddCédric Beust            // TODO: excluded/included methods
169314926c3532cedb21569bb70d4b1237541aac42bCédric Beust          }
170314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        }
171314926c3532cedb21569bb70d4b1237541aac42bCédric Beust      } else if ("groups".equals(item2.getNodeName())) {
172314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        NodeList item2Children = item2.getChildNodes();
173314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        List<String> includes = Lists.newArrayList();
174df63c536af90c5cce8b30b278c929d216e62caddCédric Beust        List<String> excludes = Lists.newArrayList();
175314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        for (int l = 0; l < item2Children.getLength(); l++) {
176314926c3532cedb21569bb70d4b1237541aac42bCédric Beust          Node item3 = item2Children.item(l);
177314926c3532cedb21569bb70d4b1237541aac42bCédric Beust          if ("run".equals(item3.getNodeName())) {
178314926c3532cedb21569bb70d4b1237541aac42bCédric Beust            NodeList item3Children = item3.getChildNodes();
179314926c3532cedb21569bb70d4b1237541aac42bCédric Beust            for (int m = 0; m < item3Children.getLength(); m++) {
180314926c3532cedb21569bb70d4b1237541aac42bCédric Beust              Node item4 = item3Children.item(m);
181314926c3532cedb21569bb70d4b1237541aac42bCédric Beust              if ("include".equals(item4.getNodeName())) {
182df63c536af90c5cce8b30b278c929d216e62caddCédric Beust                includes.add(((Element) item4).getAttribute("name"));
183df63c536af90c5cce8b30b278c929d216e62caddCédric Beust              } else if ("exclude".equals(item4.getNodeName())) {
184df63c536af90c5cce8b30b278c929d216e62caddCédric Beust                excludes.add(((Element) item4).getAttribute("name"));
185df63c536af90c5cce8b30b278c929d216e62caddCédric Beust              }
186df63c536af90c5cce8b30b278c929d216e62caddCédric Beust            }
187df63c536af90c5cce8b30b278c929d216e62caddCédric Beust          } else if ("dependencies".equals(item3.getNodeName())) {
188df63c536af90c5cce8b30b278c929d216e62caddCédric Beust            NodeList item3Children = item3.getChildNodes();
189df63c536af90c5cce8b30b278c929d216e62caddCédric Beust            for (int m = 0; m < item3Children.getLength(); m++) {
190df63c536af90c5cce8b30b278c929d216e62caddCédric Beust              Node item4 = item3Children.item(m);
191df63c536af90c5cce8b30b278c929d216e62caddCédric Beust              if ("group".equals(item4.getNodeName())) {
192314926c3532cedb21569bb70d4b1237541aac42bCédric Beust                Element e = (Element) item4;
193df63c536af90c5cce8b30b278c929d216e62caddCédric Beust                xmlTest.addXmlDependencyGroup(e.getAttribute("name"), e.getAttribute("depends-on"));
194314926c3532cedb21569bb70d4b1237541aac42bCédric Beust              }
195314926c3532cedb21569bb70d4b1237541aac42bCédric Beust            }
196df63c536af90c5cce8b30b278c929d216e62caddCédric Beust          } else if ("define".equals(item3.getNodeName())) {
197df63c536af90c5cce8b30b278c929d216e62caddCédric Beust            xmlDefine(xmlTest, item3);
198df63c536af90c5cce8b30b278c929d216e62caddCédric Beust          }
199314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        }
200314926c3532cedb21569bb70d4b1237541aac42bCédric Beust        xmlTest.setIncludedGroups(includes);
201df63c536af90c5cce8b30b278c929d216e62caddCédric Beust        xmlTest.setExcludedGroups(excludes);
202314926c3532cedb21569bb70d4b1237541aac42bCédric Beust      } // TODO: (method-selectors?,packages?) >
203314926c3532cedb21569bb70d4b1237541aac42bCédric Beust    }
204314926c3532cedb21569bb70d4b1237541aac42bCédric Beust
205314926c3532cedb21569bb70d4b1237541aac42bCédric Beust    xmlTest.setParameters(testParameters);
206314926c3532cedb21569bb70d4b1237541aac42bCédric Beust  }
207314926c3532cedb21569bb70d4b1237541aac42bCédric Beust
208df63c536af90c5cce8b30b278c929d216e62caddCédric Beust  /**
209df63c536af90c5cce8b30b278c929d216e62caddCédric Beust   * Parse the <define> tag.
210df63c536af90c5cce8b30b278c929d216e62caddCédric Beust   */
211df63c536af90c5cce8b30b278c929d216e62caddCédric Beust  private void xmlDefine(XmlTest xmlTest, Node item) {
212df63c536af90c5cce8b30b278c929d216e62caddCédric Beust    NodeList item3Children = item.getChildNodes();
213df63c536af90c5cce8b30b278c929d216e62caddCédric Beust    List<String> groups = Lists.newArrayList();
214df63c536af90c5cce8b30b278c929d216e62caddCédric Beust    for (int m = 0; m < item3Children.getLength(); m++) {
215df63c536af90c5cce8b30b278c929d216e62caddCédric Beust      Node item4 = item3Children.item(m);
216df63c536af90c5cce8b30b278c929d216e62caddCédric Beust      if ("include".equals(item4.getNodeName())) {
217df63c536af90c5cce8b30b278c929d216e62caddCédric Beust        Element e = (Element) item4;
218df63c536af90c5cce8b30b278c929d216e62caddCédric Beust        groups.add(e.getAttribute("name"));
219df63c536af90c5cce8b30b278c929d216e62caddCédric Beust      }
220df63c536af90c5cce8b30b278c929d216e62caddCédric Beust    }
221df63c536af90c5cce8b30b278c929d216e62caddCédric Beust    xmlTest.addMetaGroup(((Element) item).getAttribute("name"), groups);
222df63c536af90c5cce8b30b278c929d216e62caddCédric Beust  }
223df63c536af90c5cce8b30b278c929d216e62caddCédric Beust
22473251f30e7ada47dd0ec82b2e18a2e0848f38581Cédric Beust  private void populateAttributes(Node node, Object object) {
225f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    for (int j = 0; j < node.getAttributes().getLength(); j++) {
226f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      Node item = node.getAttributes().item(j);
227a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust      p(node.getAttributes().item(j).toString());
228f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      setProperty(object, item.getLocalName(), item.getNodeValue());
229f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    }
230f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  }
231f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
232f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  private void setProperty(Object object, String name, Object value) {
233f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    String methodName = toCamelCaseSetter(name);
234f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    Method foundMethod = null;
235f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    for (Method m : object.getClass().getDeclaredMethods()) {
236f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      if (m.getName().equals(methodName)) {
237f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        foundMethod = m;
238f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        break;
239f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      }
240f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    }
241f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
242f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    if (foundMethod == null) {
243f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      p("Warning: couldn't find setter method " + methodName);
244f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    } else {
245f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      try {
246f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        p("Invoking " + methodName + " with " + value);
247f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        Class<?> type = foundMethod.getParameterTypes()[0];
248f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        if (type == Boolean.class || type == boolean.class) {
249f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust          foundMethod.invoke(object, Boolean.parseBoolean(value.toString()));
250f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        } else if (type == Integer.class || type == int.class) {
251f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust          foundMethod.invoke(object, Integer.parseInt(value.toString()));
252f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        } else {
253f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust          foundMethod.invoke(object, value.toString());
254f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        }
255a3f78c5debcd03e7755f5ff2956a6f325e41d0b7Ryan Schmitt      } catch (IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
256f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        e.printStackTrace();
257f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      }
258f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    }
259f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  }
260f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
261f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  private void p(String string) {
262a751b1cb19165aac5a15f0911a64294b79f4c3c9Cédric Beust//    System.out.println("[XPathUtil] " + string);
263f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  }
264f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust
265f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  private String toCamelCaseSetter(String name) {
266f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    StringBuilder result = new StringBuilder("set" + name.substring(0, 1).toUpperCase());
267f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    for (int i = 1; i < name.length(); i++) {
268f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      if (name.charAt(i) == '-') {
269f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        result.append(Character.toUpperCase(name.charAt(i + 1)));
270f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        i++;
271f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      } else {
272f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust        result.append(name.charAt(i));
273f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust      }
274f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    }
275f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust    return result.toString();
276f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust  }
277f03e2cb0b3b7efbd5c9a40e702bcd99e618c7f53Cédric Beust}
278