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