1336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpackage org.testng.xml;
2336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust
3e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beustimport org.testng.TestNGException;
4336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.testng.reporters.XMLStringBuffer;
53dbf8e37229e25f8914dd85757ab8fbeec56aeacCédric Beustimport org.testng.xml.dom.OnElement;
6336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust
7f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beustimport java.util.Properties;
8f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust
9336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust/**
10336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * This class describes the tag <method-selector>  in testng.xml.
110f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin *
12336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * Created on Sep 26, 2005
13336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * @author cbeust
14336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
15336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */
16336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpublic class XmlMethodSelector {
17336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  // Either this:
18336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  private String m_className;
19336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  private int m_priority;
200f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
21336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  // Or that:
227a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust  private XmlScript m_script = new XmlScript();
230f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
24d84bc064a317bfb8f82d9808175fae2b342a4db8Cédric Beust  // For YAML
25d84bc064a317bfb8f82d9808175fae2b342a4db8Cédric Beust  public void setClassName(String s) {
26d84bc064a317bfb8f82d9808175fae2b342a4db8Cédric Beust    m_className = s;
27d84bc064a317bfb8f82d9808175fae2b342a4db8Cédric Beust  }
28d84bc064a317bfb8f82d9808175fae2b342a4db8Cédric Beust
29336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public String getClassName() {
30336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    return m_className;
31336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
32f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust
33f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust  // For YAML
347a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust  @OnElement(tag = "selector-class", attributes = { "name", "priority" })
357a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust  public void setElement(String name, String priority) {
36f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust    setName(name);
377a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    setPriority(Integer.parseInt(priority));
38f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust  }
39f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust
40336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public void setName(String name) {
41336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    m_className = name;
42336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
430f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
447a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust  public void setScript(XmlScript script) {
457a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    m_script = script;
467a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust  }
477a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust
48336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  /**
49336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   * @return Returns the expression.
50336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   */
51336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public String getExpression() {
527a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    return m_script.getScript();
53336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
540f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
55336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  /**
56336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   * @param expression The expression to set.
57336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   */
58336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public void setExpression(String expression) {
597a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    m_script.setScript(expression);
60336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
610f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
62336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  /**
63336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   * @return Returns the language.
64336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   */
65336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public String getLanguage() {
667a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    return m_script.getLanguage();
67336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
680f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
69336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  /**
70336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   * @param language The language to set.
71336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust   */
727a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust//  @OnElement(tag = "script", attributes = "language")
73336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public void setLanguage(String language) {
747a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    m_script.setLanguage(language);
757a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust//    m_language = language;
76336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
770f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
78336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public int getPriority() {
79336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    return m_priority;
80336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
810f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
82336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public void setPriority(int priority) {
83336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    m_priority = priority;
84336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
850f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
86e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust  private void ppp(String s) {
87e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust    System.out.println("[XmlMethodSelector] " + s);
88e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust  }
890f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
90336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  public String toXml(String indent) {
91336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    XMLStringBuffer xsb = new XMLStringBuffer(indent);
92336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust
93336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    xsb.push("method-selector");
940f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
95e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust    if (null != m_className) {
96336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      Properties clsProp = new Properties();
97336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      clsProp.setProperty("name", getClassName());
98336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      if(getPriority() != -1) {
99336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust        clsProp.setProperty("priority", String.valueOf(getPriority()));
100336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      }
101336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      xsb.addEmptyElement("selector-class", clsProp);
102336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    }
103e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust    else if (getLanguage() != null) {
104336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      Properties scriptProp = new Properties();
105336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      scriptProp.setProperty("language", getLanguage());
106336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      xsb.push("script", scriptProp);
107336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      xsb.addCDATA(getExpression());
108336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust      xsb.pop("script");
109336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    }
110e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust    else {
111e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust      throw new TestNGException("Invalid Method Selector:  found neither class name nor language");
112e58af1ddece98c14592d1fde0ec75ed2b304be4dCédric Beust    }
1130f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin
114336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    xsb.pop("method-selector");
115336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust
116336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust    return xsb.toXML();
117336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust  }
118c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust
119c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust  @Override
120c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust  public int hashCode() {
121c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    final int prime = 31;
122c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    int result = 1;
123c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    result = prime * result
124c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust        + ((m_className == null) ? 0 : m_className.hashCode());
125c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    result = prime * result
1267a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust        + ((getExpression() == null) ? 0 : getExpression().hashCode());
127c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    result = prime * result
1287a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust        + ((getLanguage() == null) ? 0 : getLanguage().hashCode());
129c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    result = prime * result + m_priority;
130c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    return result;
131c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust  }
132c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust
133c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust  @Override
134c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust  public boolean equals(Object obj) {
135c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    if (this == obj)
136c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      return true;
137c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    if (obj == null)
138c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      return XmlSuite.f();
139c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    if (getClass() != obj.getClass())
140c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      return XmlSuite.f();
141c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    XmlMethodSelector other = (XmlMethodSelector) obj;
142c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    if (m_className == null) {
143c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      if (other.m_className != null)
144c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust        return XmlSuite.f();
145c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    } else if (!m_className.equals(other.m_className))
146c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      return XmlSuite.f();
1477a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    if (getExpression() == null) {
1487a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust      if (other.getExpression() != null)
149c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust        return XmlSuite.f();
1507a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    } else if (!getExpression().equals(other.getExpression()))
151c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      return XmlSuite.f();
1527a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    if (getLanguage() == null) {
1537a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust      if (other.getLanguage() != null)
154c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust        return XmlSuite.f();
1557a080568c67272b4c9615f8205cebb6c39893b65Cédric Beust    } else if (!getLanguage().equals(other.getLanguage()))
156c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      return XmlSuite.f();
157c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    if (m_priority != other.m_priority)
158c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      return XmlSuite.f();
159c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust    return true;
160c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust  }
161336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust}
162