1336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpackage org.testng.xml; 2336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 33e72adb9019ffef6cd2308b85608207b71188407Stefan Birknerimport static org.testng.internal.Utils.isStringBlank; 43e72adb9019ffef6cd2308b85608207b71188407Stefan Birkner 5ed65240afc7792175d9fe09bb9bb553360798ae8Cédric Beustimport org.testng.ITestObjectFactory; 63a2388761f218881b6d39f76a16f4ed57f07d4dbthe.mindstormimport org.testng.TestNGException; 7dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beustimport org.testng.collections.Lists; 80f6db64c011bc71dcdb432d7d27730b04f5ef2c1Cédric Beustimport org.testng.collections.Maps; 9dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beustimport org.testng.internal.Utils; 10f55c6664563496bcd95dd492ae8f63e9fabcfe05Julien Herrimport org.testng.log4testng.Logger; 11336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.xml.sax.Attributes; 12336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.xml.sax.InputSource; 13336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.xml.sax.SAXException; 14336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.xml.sax.SAXParseException; 15336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.xml.sax.helpers.DefaultHandler; 16336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 17dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beustimport java.io.IOException; 18dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beustimport java.io.InputStream; 19dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beustimport java.util.ArrayList; 20dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beustimport java.util.List; 21dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beustimport java.util.Map; 2266aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beustimport java.util.Stack; 23dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust 24336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust/** 25336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Suite definition parser utility. 260f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin * 27336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * @author Cedric Beust 28336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * @author <a href='mailto:the_mindstorm@evolva.ro'>Alexandru Popescu</a> 29336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 30336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpublic class TestNGContentHandler extends DefaultHandler { 31336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private XmlSuite m_currentSuite = null; 32336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private XmlTest m_currentTest = null; 33336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private List<String> m_currentDefines = null; 34336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private List<String> m_currentRuns = null; 35336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private List<XmlClass> m_currentClasses = null; 3624215389671eeb04764ee673748987ef2c0fb367Cédric Beust private int m_currentTestIndex = 0; 37682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust private int m_currentClassIndex = 0; 38cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust private int m_currentIncludeIndex = 0; 39336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private List<XmlPackage> m_currentPackages = null; 40336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private XmlPackage m_currentPackage = null; 41ed0917f31f0b66158bc786cd018fd95175f76f29Cédric Beust private List<XmlSuite> m_suites = Lists.newArrayList(); 42336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private List<String> m_currentIncludedGroups = null; 43336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private List<String> m_currentExcludedGroups = null; 44336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private Map<String, String> m_currentTestParameters = null; 45336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private Map<String, String> m_currentSuiteParameters = null; 467dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust private Map<String, String> m_currentClassParameters = null; 4766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust private Include m_currentInclude; 480a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust private List<String> m_currentMetaGroup = null; 49336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private String m_currentMetaGroupName; 5066aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust 5166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust enum Location { 5266aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust SUITE, 5366aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust TEST, 545d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust CLASS, 55f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu INCLUDE, 56f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu EXCLUDE 5766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 5810c223b7aa6bf34778079bb5ee1a494c83cd1239Ryan Schmitt private Stack<Location> m_locations = new Stack<>(); 5966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust 60336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private XmlClass m_currentClass = null; 61dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust private ArrayList<XmlInclude> m_currentIncludedMethods = null; 620a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust private List<String> m_currentExcludedMethods = null; 63336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private ArrayList<XmlMethodSelector> m_currentSelectors = null; 64336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private XmlMethodSelector m_currentSelector = null; 65336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private String m_currentLanguage = null; 66336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private String m_currentExpression = null; 670a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust private List<String> m_suiteFiles = Lists.newArrayList(); 681ca016606bba51c7038ef555fa6faa2635107038the.mindstorm private boolean m_enabledTest; 69509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust private List<String> m_listeners; 700f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 71336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private String m_fileName; 72b3515ae0025dc9296d09b056b5df6fd7fe7821ebCédric Beust private boolean m_loadClasses; 73d92547e8106155b37ac132380710bd805db63421Julien Herr private boolean m_validate = false; 74f55c6664563496bcd95dd492ae8f63e9fabcfe05Julien Herr private boolean m_hasWarn = false; 75336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 76b3515ae0025dc9296d09b056b5df6fd7fe7821ebCédric Beust public TestNGContentHandler(String fileName, boolean loadClasses) { 77336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_fileName = fileName; 78b3515ae0025dc9296d09b056b5df6fd7fe7821ebCédric Beust m_loadClasses = loadClasses; 79336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 800f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 81336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust static private void ppp(String s) { 82336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust System.out.println("[TestNGContentHandler] " + s); 83336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 84336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 85336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /* 86336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * (non-Javadoc) 870f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin * 88336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, 89336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * java.lang.String) 90336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 91336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust @Override 92b3515ae0025dc9296d09b056b5df6fd7fe7821ebCédric Beust public InputSource resolveEntity(String systemId, String publicId) 93b3515ae0025dc9296d09b056b5df6fd7fe7821ebCédric Beust throws IOException, SAXException { 94336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust InputSource result = null; 95336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (Parser.DEPRECATED_TESTNG_DTD_URL.equals(publicId) 96336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust || Parser.TESTNG_DTD_URL.equals(publicId)) { 97d92547e8106155b37ac132380710bd805db63421Julien Herr m_validate = true; 98fd3d62963585c7d537041ba7ed53ebda5eef31c4the.mindstorm InputStream is = getClass().getClassLoader().getResourceAsStream(Parser.TESTNG_DTD); 99336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null == is) { 100fd3d62963585c7d537041ba7ed53ebda5eef31c4the.mindstorm is = Thread.currentThread().getContextClassLoader().getResourceAsStream(Parser.TESTNG_DTD); 101336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null == is) { 102336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust System.out.println("WARNING: couldn't find in classpath " + publicId 103336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust + "\n" + "Fetching it from the Web site."); 104336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust result = super.resolveEntity(systemId, publicId); 105336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 106336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 107336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust result = new InputSource(is); 108336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 109336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 110336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 111336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust result = new InputSource(is); 112336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 113336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 114336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 115336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust result = super.resolveEntity(systemId, publicId); 116336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 117336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 118336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust return result; 119336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 1200f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 121e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust /** 122e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust * Parse <suite-file> 123e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust */ 124e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust private void xmlSuiteFile(boolean start, Attributes attributes) { 125e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust if (start) { 126e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust String path = attributes.getValue("path"); 12766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust pushLocation(Location.SUITE); 128e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust m_suiteFiles.add(path); 129e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust } 130e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust else { 131e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust m_currentSuite.setSuiteFiles(m_suiteFiles); 1324281b0254278c68e073c9adb0016def110226fbbCédric Beust popLocation(Location.SUITE); 133e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust } 134e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust } 135336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 136336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 137336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <suite> 138336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 139336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private void xmlSuite(boolean start, Attributes attributes) { 140336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 14166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust pushLocation(Location.SUITE); 142336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String name = attributes.getValue("name"); 143b4d24d82cfcf72f98b9eb82061ee2d404e51010dCédric Beust if (isStringBlank(name)) { 144b4d24d82cfcf72f98b9eb82061ee2d404e51010dCédric Beust throw new TestNGException("The <suite> tag must define the name attribute"); 145b4d24d82cfcf72f98b9eb82061ee2d404e51010dCédric Beust } 146336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSuite = new XmlSuite(); 147336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSuite.setFileName(m_fileName); 148336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSuite.setName(name); 1490f6db64c011bc71dcdb432d7d27730b04f5ef2c1Cédric Beust m_currentSuiteParameters = Maps.newHashMap(); 1500f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 151336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String verbose = attributes.getValue("verbose"); 152336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != verbose) { 1536e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada m_currentSuite.setVerbose(Integer.parseInt(verbose)); 154336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 15518d27ed3c7882a8b76d97fc98b7ccbacf1f30a68Cédric Beust String jUnit = attributes.getValue("junit"); 15618d27ed3c7882a8b76d97fc98b7ccbacf1f30a68Cédric Beust if (null != jUnit) { 1570cd523e46e71bb9a1340432eb43c521cadf3dc71Ryan Schmitt m_currentSuite.setJUnit(Boolean.valueOf(jUnit)); 15818d27ed3c7882a8b76d97fc98b7ccbacf1f30a68Cédric Beust } 159336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String parallel = attributes.getValue("parallel"); 160aa48f783c5e1ccdc0f58136387cd30ebaa4191bbCédric Beust if (parallel != null) { 16124ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr XmlSuite.ParallelMode mode = XmlSuite.ParallelMode.getValidParallel(parallel); 16224ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr if (mode != null) { 16324ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr m_currentSuite.setParallel(mode); 16424ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr } else { 165fd3d62963585c7d537041ba7ed53ebda5eef31c4the.mindstorm Utils.log("Parser", 1, "[WARN] Unknown value of attribute 'parallel' at suite level: '" + parallel + "'."); 166fd3d62963585c7d537041ba7ed53ebda5eef31c4the.mindstorm } 167336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 16821c6d08b4857e3c9d3d2d21934f35cf787e013a5Dariusz Luksza String parentModule = attributes.getValue("parent-module"); 16921c6d08b4857e3c9d3d2d21934f35cf787e013a5Dariusz Luksza if (parentModule != null) { 17021c6d08b4857e3c9d3d2d21934f35cf787e013a5Dariusz Luksza m_currentSuite.setParentModule(parentModule); 17121c6d08b4857e3c9d3d2d21934f35cf787e013a5Dariusz Luksza } 1721f23509ed2d8806b5bb8c85497fe7027eeee7745cguillaume String guiceStage = attributes.getValue("guice-stage"); 1731f23509ed2d8806b5bb8c85497fe7027eeee7745cguillaume if (guiceStage != null) { 1741f23509ed2d8806b5bb8c85497fe7027eeee7745cguillaume m_currentSuite.setGuiceStage(guiceStage); 1751f23509ed2d8806b5bb8c85497fe7027eeee7745cguillaume } 17662a82c6aa5725c9e9d600af5ee06a5852100208cnullin String configFailurePolicy = attributes.getValue("configfailurepolicy"); 17762a82c6aa5725c9e9d600af5ee06a5852100208cnullin if (null != configFailurePolicy) { 17862a82c6aa5725c9e9d600af5ee06a5852100208cnullin if (XmlSuite.SKIP.equals(configFailurePolicy) || XmlSuite.CONTINUE.equals(configFailurePolicy)) { 17962a82c6aa5725c9e9d600af5ee06a5852100208cnullin m_currentSuite.setConfigFailurePolicy(configFailurePolicy); 18062a82c6aa5725c9e9d600af5ee06a5852100208cnullin } 18162a82c6aa5725c9e9d600af5ee06a5852100208cnullin } 1828c68a68e17e85e97da8ebce4425fc7287f8fc21eCédric Beust String groupByInstances = attributes.getValue("group-by-instances"); 1838c68a68e17e85e97da8ebce4425fc7287f8fc21eCédric Beust if (groupByInstances!= null) { 1840cd523e46e71bb9a1340432eb43c521cadf3dc71Ryan Schmitt m_currentSuite.setGroupByInstances(Boolean.valueOf(groupByInstances)); 1858c68a68e17e85e97da8ebce4425fc7287f8fc21eCédric Beust } 1866cf2e96a6b18fe7eecc44cac44bb0690a162f416Cédric Beust String skip = attributes.getValue("skipfailedinvocationcounts"); 1876cf2e96a6b18fe7eecc44cac44bb0690a162f416Cédric Beust if (skip != null) { 1886cf2e96a6b18fe7eecc44cac44bb0690a162f416Cédric Beust m_currentSuite.setSkipFailedInvocationCounts(Boolean.valueOf(skip)); 1896cf2e96a6b18fe7eecc44cac44bb0690a162f416Cédric Beust } 190336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String threadCount = attributes.getValue("thread-count"); 191336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != threadCount) { 192336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSuite.setThreadCount(Integer.parseInt(threadCount)); 193336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 1945e1ddea36a6179568a22fcf79a3939f44478f074Cédric Beust String dataProviderThreadCount = attributes.getValue("data-provider-thread-count"); 1955e1ddea36a6179568a22fcf79a3939f44478f074Cédric Beust if (null != dataProviderThreadCount) { 1965e1ddea36a6179568a22fcf79a3939f44478f074Cédric Beust m_currentSuite.setDataProviderThreadCount(Integer.parseInt(dataProviderThreadCount)); 1975e1ddea36a6179568a22fcf79a3939f44478f074Cédric Beust } 198d58f5987454b45b835fc0659dce0d33106b5e112Cédric Beust String timeOut = attributes.getValue("time-out"); 199d58f5987454b45b835fc0659dce0d33106b5e112Cédric Beust if (null != timeOut) { 200d58f5987454b45b835fc0659dce0d33106b5e112Cédric Beust m_currentSuite.setTimeOut(timeOut); 201d58f5987454b45b835fc0659dce0d33106b5e112Cédric Beust } 202df7f78b6a19dcc515afbb928a22e0de6295eefadbileblog String objectFactory = attributes.getValue("object-factory"); 2039fddfc48273480d4874a7a87ed3b3482dd715cf6Cédric Beust if (null != objectFactory && m_loadClasses) { 204df7f78b6a19dcc515afbb928a22e0de6295eefadbileblog try { 205ed65240afc7792175d9fe09bb9bb553360798ae8Cédric Beust m_currentSuite.setObjectFactory((ITestObjectFactory)Class.forName(objectFactory).newInstance()); 206df7f78b6a19dcc515afbb928a22e0de6295eefadbileblog } 207df7f78b6a19dcc515afbb928a22e0de6295eefadbileblog catch(Exception e) { 208df7f78b6a19dcc515afbb928a22e0de6295eefadbileblog Utils.log("Parser", 1, "[ERROR] Unable to create custom object factory '" + objectFactory + "' :" + e); 209df7f78b6a19dcc515afbb928a22e0de6295eefadbileblog } 210df7f78b6a19dcc515afbb928a22e0de6295eefadbileblog } 21124215389671eeb04764ee673748987ef2c0fb367Cédric Beust String preserveOrder = attributes.getValue("preserve-order"); 21224215389671eeb04764ee673748987ef2c0fb367Cédric Beust if (preserveOrder != null) { 21324215389671eeb04764ee673748987ef2c0fb367Cédric Beust m_currentSuite.setPreserveOrder(preserveOrder); 21424215389671eeb04764ee673748987ef2c0fb367Cédric Beust } 2155ccc31db8bf8ef85881f7ceaaa19dc7cfd3a32d8Cédric Beust String allowReturnValues = attributes.getValue("allow-return-values"); 2165ccc31db8bf8ef85881f7ceaaa19dc7cfd3a32d8Cédric Beust if (allowReturnValues != null) { 2175ccc31db8bf8ef85881f7ceaaa19dc7cfd3a32d8Cédric Beust m_currentSuite.setAllowReturnValues(Boolean.valueOf(allowReturnValues)); 2185ccc31db8bf8ef85881f7ceaaa19dc7cfd3a32d8Cédric Beust } 219336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 220336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 221336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSuite.setParameters(m_currentSuiteParameters); 222336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_suites.add(m_currentSuite); 223336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSuiteParameters = null; 2244281b0254278c68e073c9adb0016def110226fbbCédric Beust popLocation(Location.SUITE); 225336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 226336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 227336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 228336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 229336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <define> 230336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 231336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private void xmlDefine(boolean start, Attributes attributes) { 232336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 233336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String name = attributes.getValue("name"); 2340a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust m_currentDefines = Lists.newArrayList(); 2350a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust m_currentMetaGroup = Lists.newArrayList(); 236336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentMetaGroupName = name; 237336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 238336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 239336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentTest.addMetaGroup(m_currentMetaGroupName, m_currentMetaGroup); 240336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentDefines = null; 241336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 242336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 243336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 244336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 245336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <script> 246336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 247336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private void xmlScript(boolean start, Attributes attributes) { 248336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 249336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust// ppp("OPEN SCRIPT"); 250336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentLanguage = attributes.getValue("language"); 251fe77fdffade076bfd89ecb054b8ff6a569af50ecgkorland m_currentExpression = ""; 252336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 253336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 254336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust// ppp("CLOSE SCRIPT:@@" + m_currentExpression + "@@"); 255336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSelector.setExpression(m_currentExpression); 256336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSelector.setLanguage(m_currentLanguage); 25766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust if (m_locations.peek() == Location.TEST) { 258336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentTest.setBeanShellExpression(m_currentExpression); 259336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 260336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentLanguage = null; 261336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentExpression = null; 262336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 263336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 264336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 265336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 266336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <test> 267336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 268336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private void xmlTest(boolean start, Attributes attributes) { 269336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 27024215389671eeb04764ee673748987ef2c0fb367Cédric Beust m_currentTest = new XmlTest(m_currentSuite, m_currentTestIndex++); 27166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust pushLocation(Location.TEST); 2720f6db64c011bc71dcdb432d7d27730b04f5ef2c1Cédric Beust m_currentTestParameters = Maps.newHashMap(); 2733a2388761f218881b6d39f76a16f4ed57f07d4dbthe.mindstorm final String testName= attributes.getValue("name"); 2743e72adb9019ffef6cd2308b85608207b71188407Stefan Birkner if(isStringBlank(testName)) { 275b4d24d82cfcf72f98b9eb82061ee2d404e51010dCédric Beust throw new TestNGException("The <test> tag must define the name attribute"); 2763a2388761f218881b6d39f76a16f4ed57f07d4dbthe.mindstorm } 2771ca016606bba51c7038ef555fa6faa2635107038the.mindstorm m_currentTest.setName(attributes.getValue("name")); 278336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String verbose = attributes.getValue("verbose"); 279336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != verbose) { 280336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentTest.setVerbose(Integer.parseInt(verbose)); 281336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 282336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String jUnit = attributes.getValue("junit"); 283336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != jUnit) { 2840cd523e46e71bb9a1340432eb43c521cadf3dc71Ryan Schmitt m_currentTest.setJUnit(Boolean.valueOf(jUnit)); 285336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 2866cf2e96a6b18fe7eecc44cac44bb0690a162f416Cédric Beust String skip = attributes.getValue("skipfailedinvocationcounts"); 2876cf2e96a6b18fe7eecc44cac44bb0690a162f416Cédric Beust if (skip != null) { 2880cd523e46e71bb9a1340432eb43c521cadf3dc71Ryan Schmitt m_currentTest.setSkipFailedInvocationCounts(Boolean.valueOf(skip)); 2896cf2e96a6b18fe7eecc44cac44bb0690a162f416Cédric Beust } 2908c68a68e17e85e97da8ebce4425fc7287f8fc21eCédric Beust String groupByInstances = attributes.getValue("group-by-instances"); 2918c68a68e17e85e97da8ebce4425fc7287f8fc21eCédric Beust if (groupByInstances!= null) { 2920cd523e46e71bb9a1340432eb43c521cadf3dc71Ryan Schmitt m_currentTest.setGroupByInstances(Boolean.valueOf(groupByInstances)); 2938c68a68e17e85e97da8ebce4425fc7287f8fc21eCédric Beust } 294682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust String preserveOrder = attributes.getValue("preserve-order"); 295682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust if (preserveOrder != null) { 296deff646647f15e5302dbba79958c1a04a42d6160Cédric Beust m_currentTest.setPreserveOrder(preserveOrder); 297682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust } 298336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String parallel = attributes.getValue("parallel"); 299aa48f783c5e1ccdc0f58136387cd30ebaa4191bbCédric Beust if (parallel != null) { 30024ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr XmlSuite.ParallelMode mode = XmlSuite.ParallelMode.getValidParallel(parallel); 30124ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr if (mode != null) { 30224ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr m_currentTest.setParallel(mode); 30324ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr } else { 304aa48f783c5e1ccdc0f58136387cd30ebaa4191bbCédric Beust Utils.log("Parser", 1, "[WARN] Unknown value of attribute 'parallel' for test '" 305aa48f783c5e1ccdc0f58136387cd30ebaa4191bbCédric Beust + m_currentTest.getName() + "': '" + parallel + "'"); 306fd3d62963585c7d537041ba7ed53ebda5eef31c4the.mindstorm } 307336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 30839c426dd4271716a2246d44a774702132e66fbe1the.mindstorm String threadCount = attributes.getValue("thread-count"); 30939c426dd4271716a2246d44a774702132e66fbe1the.mindstorm if(null != threadCount) { 31039c426dd4271716a2246d44a774702132e66fbe1the.mindstorm m_currentTest.setThreadCount(Integer.parseInt(threadCount)); 31139c426dd4271716a2246d44a774702132e66fbe1the.mindstorm } 3126bf0a7dfff25a8fecd8b57577d5f244ae5eb8003Cédric Beust String timeOut = attributes.getValue("time-out"); 3136bf0a7dfff25a8fecd8b57577d5f244ae5eb8003Cédric Beust if (null != timeOut) { 314d97cad54fdbd836db7749d6ed78464cb31ecaceaCédric Beust m_currentTest.setTimeOut(Long.parseLong(timeOut)); 3156bf0a7dfff25a8fecd8b57577d5f244ae5eb8003Cédric Beust } 3163b4b5443ad9aee88d812d8e94572eea9d1cf3d4fthe.mindstorm m_enabledTest= true; 3171ca016606bba51c7038ef555fa6faa2635107038the.mindstorm String enabledTestString = attributes.getValue("enabled"); 3181ca016606bba51c7038ef555fa6faa2635107038the.mindstorm if(null != enabledTestString) { 3191ca016606bba51c7038ef555fa6faa2635107038the.mindstorm m_enabledTest = Boolean.valueOf(enabledTestString); 3201ca016606bba51c7038ef555fa6faa2635107038the.mindstorm } 321336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 322336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 323336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != m_currentTestParameters && m_currentTestParameters.size() > 0) { 324336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentTest.setParameters(m_currentTestParameters); 325336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 326336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != m_currentClasses) { 327336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentTest.setXmlClasses(m_currentClasses); 328336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 329336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentClasses = null; 330336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentTest = null; 331336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentTestParameters = null; 3324281b0254278c68e073c9adb0016def110226fbbCédric Beust popLocation(Location.TEST); 3331ca016606bba51c7038ef555fa6faa2635107038the.mindstorm if(!m_enabledTest) { 3341ca016606bba51c7038ef555fa6faa2635107038the.mindstorm List<XmlTest> tests= m_currentSuite.getTests(); 3351ca016606bba51c7038ef555fa6faa2635107038the.mindstorm tests.remove(tests.size() - 1); 3361ca016606bba51c7038ef555fa6faa2635107038the.mindstorm } 337336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 338336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 339336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 340336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 341336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <classes> 342336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 343336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void xmlClasses(boolean start, Attributes attributes) { 344336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 34501e59f7bdf6515f065bd697832db53253ca78b1aCédric Beust m_currentClasses = Lists.newArrayList(); 346682629c7059fca8adc2cc2eacdb2d372d7a28c3dCédric Beust m_currentClassIndex = 0; 347336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 348336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 349309a30eeb4e9c080ed09e3e3244f2071990f09adcquezel m_currentTest.setXmlClasses(m_currentClasses); 350336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentClasses = null; 351336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 352336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 3530f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 354509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust /** 355509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust * Parse <listeners> 356509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust */ 357509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust public void xmlListeners(boolean start, Attributes attributes) { 358509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust if (start) { 3590a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust m_listeners = Lists.newArrayList(); 360509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 361509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust else { 362509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust if (null != m_listeners) { 363509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust m_currentSuite.setListeners(m_listeners); 364509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust m_listeners = null; 365509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 366509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 367509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 3680f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 369509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust /** 370509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust * Parse <listener> 371509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust */ 372509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust public void xmlListener(boolean start, Attributes attributes) { 373509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust if (start) { 374509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust String listener = attributes.getValue("class-name"); 375509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust m_listeners.add(listener); 376509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 377509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 378336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 379336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 380336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <packages> 381336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 382336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void xmlPackages(boolean start, Attributes attributes) { 383336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 38401e59f7bdf6515f065bd697832db53253ca78b1aCédric Beust m_currentPackages = Lists.newArrayList(); 385336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 386336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 387336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != m_currentPackages) { 38866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust switch(m_locations.peek()) { 38966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust case TEST: 39066aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_currentTest.setXmlPackages(m_currentPackages); 39166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust break; 39266aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust case SUITE: 39366aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_currentSuite.setXmlPackages(m_currentPackages); 39466aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust break; 3957dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust case CLASS: 3967dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust throw new UnsupportedOperationException("CLASS"); 397336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 398336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 3990f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 400336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentPackages = null; 401336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentPackage = null; 402336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 403336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 404336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 405336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 406336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <method-selectors> 407336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 408336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void xmlMethodSelectors(boolean start, Attributes attributes) { 409336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 41010c223b7aa6bf34778079bb5ee1a494c83cd1239Ryan Schmitt m_currentSelectors = new ArrayList<>(); 411336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 412336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 41366aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust switch(m_locations.peek()) { 41466aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust case TEST: 41566aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_currentTest.setMethodSelectors(m_currentSelectors); 41666aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust break; 41766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust default: 41866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_currentSuite.setMethodSelectors(m_currentSelectors); 41966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust break; 420336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 4210f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 422336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSelectors = null; 423336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 424336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 425336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 426336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 427336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <selector-class> 428336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 429336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void xmlSelectorClass(boolean start, Attributes attributes) { 430336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 431e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust m_currentSelector.setName(attributes.getValue("name")); 432e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust String priority = attributes.getValue("priority"); 433e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust if (priority == null) { 434e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust priority = "0"; 435e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust } 4366e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada m_currentSelector.setPriority(Integer.parseInt(priority)); 437336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 438336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 439336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // do nothing 440336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 441336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 4420f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 443336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 444336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <method-selector> 445336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 446336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void xmlMethodSelector(boolean start, Attributes attributes) { 447336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 448336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSelector = new XmlMethodSelector(); 449336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 450336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 451336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSelectors.add(m_currentSelector); 452336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentSelector = null; 453336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 454336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 455336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 456336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private void xmlMethod(boolean start, Attributes attributes) { 457336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 45810c223b7aa6bf34778079bb5ee1a494c83cd1239Ryan Schmitt m_currentIncludedMethods = new ArrayList<>(); 4590a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust m_currentExcludedMethods = Lists.newArrayList(); 460cf753a79f1b41890174042aad9bec6d50618fd27Cédric Beust m_currentIncludeIndex = 0; 461336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 462336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 463336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentClass.setIncludedMethods(m_currentIncludedMethods); 464336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentClass.setExcludedMethods(m_currentExcludedMethods); 465336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentIncludedMethods = null; 466336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentExcludedMethods = null; 467336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 468336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 469336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 470336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 471336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Parse <run> 472336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 473d16c4e583b46fe587bb43a4ee3020fa6932bef90nalin.makar@gmail.com public void xmlRun(boolean start, Attributes attributes) throws SAXException { 474336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (start) { 4750a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust m_currentRuns = Lists.newArrayList(); 476336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 477336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else { 478ba016b8e709f9707040c03a1fef711df9f5cd168Cédric Beust if (m_currentTest != null) { 479ba016b8e709f9707040c03a1fef711df9f5cd168Cédric Beust m_currentTest.setIncludedGroups(m_currentIncludedGroups); 480ba016b8e709f9707040c03a1fef711df9f5cd168Cédric Beust m_currentTest.setExcludedGroups(m_currentExcludedGroups); 481ba016b8e709f9707040c03a1fef711df9f5cd168Cédric Beust } else { 482ba016b8e709f9707040c03a1fef711df9f5cd168Cédric Beust m_currentSuite.setIncludedGroups(m_currentIncludedGroups); 483ba016b8e709f9707040c03a1fef711df9f5cd168Cédric Beust m_currentSuite.setExcludedGroups(m_currentExcludedGroups); 484d16c4e583b46fe587bb43a4ee3020fa6932bef90nalin.makar@gmail.com } 485a00e18927b60ffb4da1ef5cc8a8620f3eb096475Cédric Beust m_currentRuns = null; 486336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 487336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 488336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 4895c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust 4905c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust /** 4915c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust * Parse <group> 4925c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust */ 4935c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust public void xmlGroup(boolean start, Attributes attributes) throws SAXException { 4945c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust if (start) { 4955c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust m_currentTest.addXmlDependencyGroup(attributes.getValue("name"), 4965c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust attributes.getValue("depends-on")); 4975c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust } 4985c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust } 4995c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust 500336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust /** 501336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * NOTE: I only invoke xml*methods (e.g. xmlSuite()) if I am acting on both 502336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * the start and the end of the tag. This way I can keep the treatment of 503336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * this tag in one place. If I am only doing something when the tag opens, 504336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * the code is inlined below in the startElement() method. 505336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 506336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust @Override 507fd3d62963585c7d537041ba7ed53ebda5eef31c4the.mindstorm public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 508f55c6664563496bcd95dd492ae8f63e9fabcfe05Julien Herr if (!m_validate && !m_hasWarn) { 509f55c6664563496bcd95dd492ae8f63e9fabcfe05Julien Herr Logger.getLogger(TestNGContentHandler.class).warn("It is strongly recommended to add " + 510f55c6664563496bcd95dd492ae8f63e9fabcfe05Julien Herr "\"<!DOCTYPE suite SYSTEM \"http://testng.org/testng-1.0.dtd\" >\" at the top of your file, " + 511def4c569704623bdde13ff3a238f6a7305951bf6Cédric Beust "otherwise TestNG may fail or not work as expected."); 512f55c6664563496bcd95dd492ae8f63e9fabcfe05Julien Herr m_hasWarn = true; 513f55c6664563496bcd95dd492ae8f63e9fabcfe05Julien Herr } 514336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String name = attributes.getValue("name"); 515336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 516336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // ppp("START ELEMENT uri:" + uri + " sName:" + localName + " qName:" + qName + 517336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // " " + attributes); 518336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if ("suite".equals(qName)) { 519336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlSuite(true, attributes); 520336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 521e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust else if ("suite-file".equals(qName)) { 522e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust xmlSuiteFile(true, attributes); 523e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust } 524336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("test".equals(qName)) { 525336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlTest(true, attributes); 526336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 527336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("script".equals(qName)) { 528336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlScript(true, attributes); 529336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 530336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("method-selector".equals(qName)) { 531336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlMethodSelector(true, attributes); 532336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 533336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("method-selectors".equals(qName)) { 534336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlMethodSelectors(true, attributes); 535336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 536336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("selector-class".equals(qName)) { 537336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlSelectorClass(true, attributes); 538336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 539336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("classes".equals(qName)) { 540336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlClasses(true, attributes); 541336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 542336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("packages".equals(qName)) { 543336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlPackages(true, attributes); 544336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 545509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust else if ("listeners".equals(qName)) { 546509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust xmlListeners(true, attributes); 547509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 548509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust else if ("listener".equals(qName)) { 549509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust xmlListener(true, attributes); 550509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 551336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("class".equals(qName)) { 552336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // If m_currentClasses is null, the XML is invalid and SAX 553336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // will complain, but in the meantime, dodge the NPE so SAX 554336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // can finish parsing the file. 555336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != m_currentClasses) { 556b3515ae0025dc9296d09b056b5df6fd7fe7821ebCédric Beust m_currentClass = new XmlClass(name, m_currentClassIndex++, m_loadClasses); 5570ee92573fbcdbb8855394f41b36ca020205ff09aCédric Beust m_currentClass.setXmlTest(m_currentTest); 5587dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust m_currentClassParameters = Maps.newHashMap(); 559336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentClasses.add(m_currentClass); 5607dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust pushLocation(Location.CLASS); 561336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 562336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 563336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("package".equals(qName)) { 564336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != m_currentPackages) { 565336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentPackage = new XmlPackage(); 566336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentPackage.setName(name); 567336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentPackages.add(m_currentPackage); 568336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 569336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 570336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("define".equals(qName)) { 571336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlDefine(true, attributes); 572336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 573336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("run".equals(qName)) { 574336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlRun(true, attributes); 575336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 5765c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust else if ("group".equals(qName)) { 5775c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust xmlGroup(true, attributes); 5785c10ec0ace583f43750bd4ba280df7d2c638db04Cédric Beust } 579336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("groups".equals(qName)) { 5800a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust m_currentIncludedGroups = Lists.newArrayList(); 5810a050892401fb27d1c7629e37fe9c8796ea5a349Cédric Beust m_currentExcludedGroups = Lists.newArrayList(); 582336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 583336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("methods".equals(qName)) { 584336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlMethod(true, attributes); 585336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 586336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("include".equals(qName)) { 58766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust xmlInclude(true, attributes); 58866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 58966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust else if ("exclude".equals(qName)) { 590f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu xmlExclude(true, attributes); 59166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 59266aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust else if ("parameter".equals(qName)) { 59381b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun String value = expandValue(attributes.getValue("value")); 59466aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust switch(m_locations.peek()) { 59566aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust case TEST: 59666aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_currentTestParameters.put(name, value); 59766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust break; 59866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust case SUITE: 59966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_currentSuiteParameters.put(name, value); 60066aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust break; 6017dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust case CLASS: 6027dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust m_currentClassParameters.put(name, value); 6035d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust break; 6045d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust case INCLUDE: 6055d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust m_currentInclude.parameters.put(name, value); 6065d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust break; 60766aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 60866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 60966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 61066aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust 6116e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada private static class Include { 61266aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust String name; 61366aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust String invocationNumbers; 61466aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust String description; 6155d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust Map<String, String> parameters = Maps.newHashMap(); 6165d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust 6175d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust public Include(String name, String numbers) { 6185d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust this.name = name; 6195d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust this.invocationNumbers = numbers; 6205d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust } 62166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 62266aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust 62366aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust private void xmlInclude(boolean start, Attributes attributes) { 62466aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust if (start) { 6255d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust m_locations.push(Location.INCLUDE); 6265d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust m_currentInclude = new Include(attributes.getValue("name"), 6275d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust attributes.getValue("invocation-numbers")); 62866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } else { 62966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust String name = m_currentInclude.name; 630336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != m_currentIncludedMethods) { 63166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust String in = m_currentInclude.invocationNumbers; 632053375160c334e5420cb383c1c5a558e23ff275aCédric Beust XmlInclude include; 633dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust if (!Utils.isStringEmpty(in)) { 634053375160c334e5420cb383c1c5a558e23ff275aCédric Beust include = new XmlInclude(name, stringToList(in), m_currentIncludeIndex++); 635dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust } else { 636053375160c334e5420cb383c1c5a558e23ff275aCédric Beust include = new XmlInclude(name, m_currentIncludeIndex++); 637dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust } 6385d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust for (Map.Entry<String, String> entry : m_currentInclude.parameters.entrySet()) { 6395d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust include.addParameter(entry.getKey(), entry.getValue()); 6405d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust } 6415d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust 64266aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust include.setDescription(m_currentInclude.description); 643053375160c334e5420cb383c1c5a558e23ff275aCédric Beust m_currentIncludedMethods.add(include); 644336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 645336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if (null != m_currentDefines) { 646336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentMetaGroup.add(name); 647336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 648336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if (null != m_currentRuns) { 649336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentIncludedGroups.add(name); 650336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 651336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if (null != m_currentPackage) { 652336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentPackage.getInclude().add(name); 653336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 6545d19da43a9242c6ee79c59c8f345dbd2064a34f9Cédric Beust 6552fc90467f1388cdc683d918d82bb34854336a8c5Cédric Beust popLocation(Location.INCLUDE); 65666aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_currentInclude = null; 657336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 658336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 659336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 660f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu private void xmlExclude(boolean start, Attributes attributes) { 661f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu if (start) { 662f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu m_locations.push(Location.EXCLUDE); 663f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu String name = attributes.getValue("name"); 664f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu if (null != m_currentExcludedMethods) { 665f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu m_currentExcludedMethods.add(name); 666f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu } 667f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu else if (null != m_currentRuns) { 668f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu m_currentExcludedGroups.add(name); 669f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu } 670f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu else if (null != m_currentPackage) { 671f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu m_currentPackage.getExclude().add(name); 672f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu } 673f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu } else { 674f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu popLocation(Location.EXCLUDE); 675f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu } 676f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu } 677f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu 67866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust private void pushLocation(Location l) { 67966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust m_locations.push(l); 68066aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 68166aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust 6824281b0254278c68e073c9adb0016def110226fbbCédric Beust private Location popLocation(Location location) { 68366aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust return m_locations.pop(); 68466aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 68566aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust 686dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust private List<Integer> stringToList(String in) { 687dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust String[] numbers = in.split(" "); 688dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust List<Integer> result = Lists.newArrayList(); 689dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust for (String n : numbers) { 690dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust result.add(Integer.parseInt(n)); 691dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust } 692dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust return result; 693dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust } 694dd84c4f1673772d6b1febb72add6a2ae40f4e4ccCédric Beust 695336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust @Override 696fd3d62963585c7d537041ba7ed53ebda5eef31c4the.mindstorm public void endElement(String uri, String localName, String qName) throws SAXException { 697336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if ("suite".equals(qName)) { 698336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlSuite(false, null); 699336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 700e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust else if ("suite-file".equals(qName)) { 701e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust xmlSuiteFile(false, null); 702e145a050263d7943e88e05803b3eaffa329213a2Cédric Beust } 703336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("test".equals(qName)) { 704336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlTest(false, null); 705336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 706336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("define".equals(qName)) { 707336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlDefine(false, null); 708336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 709336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("run".equals(qName)) { 710336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlRun(false, null); 711336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 712336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("methods".equals(qName)) { 713336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlMethod(false, null); 714336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 715336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("classes".equals(qName)) { 716336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlClasses(false, null); 717336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 718cff7c37d6be5469872521ac0f7d64046aac5c06fCédric Beust else if ("packages".equals(qName)) { 719336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlPackages(false, null); 720336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 7217dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust else if ("class".equals(qName)) { 7227dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust m_currentClass.setParameters(m_currentClassParameters); 7237dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust m_currentClassParameters = null; 7247dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust popLocation(Location.CLASS); 7257dacf6d55f558c0c9eee87eec63daf8ff2ac160aCédric Beust } 726509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust else if ("listeners".equals(qName)) { 727509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust xmlListeners(false, null); 728509aca53357e59e6f06a14261dd4452bec315a98Cédric Beust } 729336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("method-selector".equals(qName)) { 730336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlMethodSelector(false, null); 731336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 732336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("method-selectors".equals(qName)) { 733336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlMethodSelectors(false, null); 734336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 735336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("selector-class".equals(qName)) { 736336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlSelectorClass(false, null); 737336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 738336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("script".equals(qName)) { 739336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlScript(false, null); 740336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 741336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust else if ("packages".equals(qName)) { 742336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust xmlPackages(false, null); 743336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 74466aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust else if ("include".equals(qName)) { 74566aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust xmlInclude(false, null); 746f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu } else if ("exclude".equals(qName)){ 747f69437b51799221cb2aaa3dd7a72ff0914a28dd1etigwuu xmlExclude(false, null); 74866aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust } 749336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 750336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 751336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust @Override 752336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void error(SAXParseException e) throws SAXException { 753d92547e8106155b37ac132380710bd805db63421Julien Herr if (m_validate) { 754d92547e8106155b37ac132380710bd805db63421Julien Herr throw e; 755d92547e8106155b37ac132380710bd805db63421Julien Herr } 756336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 757336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 758336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private boolean areWhiteSpaces(char[] ch, int start, int length) { 759336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust for (int i = start; i < start + length; i++) { 760336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust char c = ch[i]; 7610f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin if (c != '\n' && c != '\t' && c != ' ') { 7620f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin return false; 7630f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin } 7640f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin } 7650f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 766336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust return true; 767336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 7680f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 769336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust @Override 770336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void characters(char ch[], int start, int length) { 771336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != m_currentLanguage && ! areWhiteSpaces(ch, start, length)) { 772336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_currentExpression += new String(ch, start, length); 773336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 774336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 775336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 776336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public XmlSuite getSuite() { 777336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust return m_currentSuite; 778336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 77966aec6c16d8782f01933c0b45e1c5b3976e04dd6Cédric Beust 78081b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun private static String expandValue(String value) 78181b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun { 78281b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun StringBuffer result = null; 78381b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun int startIndex = 0; 78481b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun int endIndex = 0; 78581b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun int startPosition = 0; 78681b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun String property = null; 78781b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun while ((startIndex = value.indexOf("${", startPosition)) > -1 && (endIndex = value.indexOf("}", startIndex + 3)) > -1) { 78881b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun property = value.substring(startIndex + 2, endIndex); 78981b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun if (result == null) { 79081b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun result = new StringBuffer(value.substring(startPosition, startIndex)); 79181b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } else { 79281b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun result.append(value.substring(startPosition, startIndex)); 79381b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } 79481b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun String propertyValue = System.getProperty(property); 79581b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun if (propertyValue == null) { 79681b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun propertyValue = System.getenv(property); 79781b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } 79881b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun if (propertyValue != null) { 79981b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun result.append(propertyValue); 80081b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } else { 80181b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun result.append("${"); 80281b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun result.append(property); 80381b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun result.append("}"); 80481b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } 80581b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun startPosition = startIndex + 3 + property.length(); 80681b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } 80781b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun if (result != null) { 80881b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun result.append(value.substring(startPosition)); 80981b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun return result.toString(); 81081b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } else { 81181b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun return value; 81281b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } 81381b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun } 81481b1859a4e6a531348026341f50ca07360159600Xiaoguang Sun} 815