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