Added depends-on-methods and depends-on-groups attributes to test-method in XML report
diff --git a/src/main/org/testng/internal/Utils.java b/src/main/org/testng/internal/Utils.java
index 5ce20c8..3dc210e 100644
--- a/src/main/org/testng/internal/Utils.java
+++ b/src/main/org/testng/internal/Utils.java
@@ -771,4 +771,17 @@
     
     return buf.append(fqn ? method.toString() : method.getMethodName()).toString(); 
   }
+
+  public static String arrayToString(String[] strings) {
+    String result = "";
+    if ((strings != null) && (strings.length > 0)) {
+      for (int i = 0; i < strings.length; i++) {
+        result += strings[i];
+        if (i < strings.length - 1) {
+          result += ", ";
+        }
+      }
+    }
+    return result;
+  }
 }
diff --git a/src/main/org/testng/reporters/XMLReporter.java b/src/main/org/testng/reporters/XMLReporter.java
index 6335a48..019db2b 100644
--- a/src/main/org/testng/reporters/XMLReporter.java
+++ b/src/main/org/testng/reporters/XMLReporter.java
@@ -168,4 +168,20 @@
   public void setTimestampFormat(String timestampFormat) {
     config.setTimestampFormat(timestampFormat);
   }
+
+  public boolean isGenerateDependsOnMethods() {
+    return config.isGenerateDependsOnMethods();
+  }
+
+  public void setGenerateDependsOnMethods(boolean generateDependsOnMethods) {
+    config.setGenerateDependsOnMethods(generateDependsOnMethods);
+  }
+
+  public void setGenerateDependsOnGroups(boolean generateDependsOnGroups) {
+    config.setGenerateDependsOnGroups(generateDependsOnGroups);
+  }
+
+  public boolean isGenerateDependsOnGroups() {
+    return config.isGenerateDependsOnGroups();
+  }
 }
diff --git a/src/main/org/testng/reporters/XMLReporterConfig.java b/src/main/org/testng/reporters/XMLReporterConfig.java
index d87b052..3a83f56 100644
--- a/src/main/org/testng/reporters/XMLReporterConfig.java
+++ b/src/main/org/testng/reporters/XMLReporterConfig.java
@@ -4,6 +4,46 @@
  * @author Hani Suleiman Date: Mar 27, 2007 Time: 9:16:28 AM
  */
 public class XMLReporterConfig {
+
+  public static final String TAG_TEST = "test";
+  public static final String TAG_TEST_METHOD = "test-method";
+  public static final String TAG_EXCEPTION = "exception";
+  public static final String TAG_MESSAGE = "message";
+  public static final String TAG_SHORT_STACKTRACE = "short-stacktrace";
+  public static final String TAG_FULL_STACKTRACE = "full-stacktrace";
+  public static final String TAG_TESTNG_RESULTS = "testng-results";
+  public static final String TAG_SUITE = "suite";
+  public static final String TAG_GROUPS = "groups";
+  public static final String TAG_GROUP = "group";
+  public static final String TAG_CLASS = "class";
+  public static final String TAG_METHOD = "method";
+  public static final String TAG_PARAMS = "params";
+  public static final String TAG_PARAM = "param";
+  public static final String TAG_PARAM_VALUE = "value";
+  public static final String TAG_REPORTER_OUTPUT = "reporter-output";
+  public static final String TAG_LINE = "line";
+
+  public static final String ATTR_URL = "url";
+  public static final String ATTR_NAME = "name";
+  public static final String ATTR_STATUS = "status";
+  public static final String ATTR_DESC = "description";
+  public static final String ATTR_METHOD_SIG = "signature";
+  public static final String ATTR_GROUPS = "groups";
+  public static final String ATTR_CLASS = "class";
+  public static final String ATTR_INDEX = "index";
+  public static final String ATTR_IS_NULL = "is-null";
+  public static final String ATTR_PACKAGE = "package";
+  public static final String ATTR_STARTED_AT = "started-at";
+  public static final String ATTR_FINISHED_AT = "finished-at";
+  public static final String ATTR_DURATION_MS = "duration-ms";
+  public static final String ATTR_IS_CONFIG = "is-config";
+  public static final String ATTR_DEPENDS_ON_METHODS = "depends-on-methods";
+  public static final String ATTR_DEPENDS_ON_GROUPS = "depends-on-groups";
+
+  public static final String TEST_PASSED = "PASS";
+  public static final String TEST_FAILED = "FAIL";
+  public static final String TEST_SKIPPED = "SKIP";
+
   /**
    * Indicates that no file fragmentation should be performed. This value indicates the XML generator to write all the
    * results in one big file. Not recommended for large test suites.
@@ -38,43 +78,6 @@
    */
   public static final int STACKTRACE_BOTH = 3;
 
-  public static final String TAG_TEST = "test";
-  public static final String TAG_TEST_METHOD = "test-method";
-  public static final String TAG_EXCEPTION = "exception";
-  public static final String TAG_MESSAGE = "message";
-  public static final String TAG_SHORT_STACKTRACE = "short-stacktrace";
-  public static final String TAG_FULL_STACKTRACE = "full-stacktrace";
-  public static final String TAG_TESTNG_RESULTS = "testng-results";
-  public static final String TAG_SUITE = "suite";
-  public static final String TAG_GROUPS = "groups";
-  public static final String TAG_GROUP = "group";
-  public static final String TAG_CLASS = "class";
-  public static final String TAG_METHOD = "method";
-  public static final String TAG_PARAMS = "params";
-  public static final String TAG_PARAM = "param";
-  public static final String TAG_PARAM_VALUE = "value";
-  public static final String TAG_REPORTER_OUTPUT = "reporter-output";
-  public static final String TAG_LINE = "line";
-
-  public static final String ATTR_URL = "url";
-  public static final String ATTR_NAME = "name";
-  public static final String ATTR_STATUS = "status";
-  public static final String ATTR_DESC = "description";
-  public static final String ATTR_METHOD_SIG = "signature";
-  public static final String ATTR_GROUPS = "groups";
-  public static final String ATTR_CLASS = "class";
-  public static final String ATTR_INDEX = "index";
-  public static final String ATTR_IS_NULL = "is-null";
-  public static final String ATTR_PACKAGE = "package";
-  public static final String ATTR_STARTED_AT = "started-at";
-  public static final String ATTR_FINISHED_AT = "finished-at";
-  public static final String ATTR_DURATION_MS = "duration-ms";
-  public static final String ATTR_IS_CONFIG = "is-config";
-
-  public static final String TEST_PASSED = "PASS";
-  public static final String TEST_FAILED = "FAIL";
-  public static final String TEST_SKIPPED = "SKIP";
-
   //note: We're hardcoding the 'Z' because Java doesn't support all the intricacies of ISO-8601.
   static final String FMT_DEFAULT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
 
@@ -110,6 +113,18 @@
   private boolean splitClassAndPackageNames = false;
 
   /**
+   * Indicates whether the <code>depends-on-methods</code> attribute should be generated for a <code>test-method</code>
+   * element
+   */
+  private boolean generateDependsOnMethods = true;
+
+  /**
+   * Indicates whether the <code>depends-on-groups</code> attribute should be generated for a <code>test-method</code>
+   * element
+   */
+  private boolean generateDependsOnGroups = true;
+
+  /**
    * The output format for timestamps
    */
   private String timestampFormat = FMT_DEFAULT;
@@ -161,4 +176,20 @@
   public void setTimestampFormat(String timestampFormat) {
     this.timestampFormat = timestampFormat;
   }
+
+  public boolean isGenerateDependsOnMethods() {
+    return generateDependsOnMethods;
+  }
+
+  public void setGenerateDependsOnMethods(boolean generateDependsOnMethods) {
+    this.generateDependsOnMethods = generateDependsOnMethods;
+  }
+
+  public boolean isGenerateDependsOnGroups() {
+    return generateDependsOnGroups;
+  }
+
+  public void setGenerateDependsOnGroups(boolean generateDependsOnGroups) {
+    this.generateDependsOnGroups = generateDependsOnGroups;
+  }
 }
diff --git a/src/main/org/testng/reporters/XMLSuiteResultWriter.java b/src/main/org/testng/reporters/XMLSuiteResultWriter.java
index a22aec0..e9e3557 100644
--- a/src/main/org/testng/reporters/XMLSuiteResultWriter.java
+++ b/src/main/org/testng/reporters/XMLSuiteResultWriter.java
@@ -152,7 +152,6 @@
 
     attributes.setProperty(XMLReporterConfig.ATTR_METHOD_SIG, removeClassName(testResult.getMethod().toString()));
 
-    //TODO: Cosmin - not finished
     SimpleDateFormat format = new SimpleDateFormat(config.getTimestampFormat());
     String startTime = format.format(testResult.getStartMillis());
     String endTime = format.format(testResult.getEndMillis());
@@ -163,11 +162,26 @@
     attributes.setProperty(XMLReporterConfig.ATTR_DURATION_MS, strDuration);
 
     if (config.isGenerateGroupsAttribute()) {
-      String groupNamesStr = getGroupNamesString(testResult);
+      String groupNamesStr = Utils.arrayToString(testResult.getMethod().getGroups());
       if (!Utils.isStringEmpty(groupNamesStr)) {
         attributes.setProperty(XMLReporterConfig.ATTR_GROUPS, groupNamesStr);
       }
     }
+
+    if (config.isGenerateDependsOnMethods()) {
+      String dependsOnStr = Utils.arrayToString(testResult.getMethod().getMethodsDependedUpon());
+      if (!Utils.isStringEmpty(dependsOnStr)) {
+        attributes.setProperty(XMLReporterConfig.ATTR_DEPENDS_ON_METHODS, dependsOnStr);
+      }
+    }
+
+    if (config.isGenerateDependsOnGroups()) {
+      String dependsOnStr = Utils.arrayToString(testResult.getMethod().getGroupsDependedUpon());
+      if (!Utils.isStringEmpty(dependsOnStr)) {
+        attributes.setProperty(XMLReporterConfig.ATTR_DEPENDS_ON_GROUPS, dependsOnStr);
+      }
+    }
+
     return attributes;
   }
 
@@ -220,8 +234,8 @@
               .STACKTRACE_SHORT) {
         xmlBuffer.addRequired(XMLReporterConfig.TAG_SHORT_STACKTRACE, stackTraces[0]);
       }
-      if ((config.getStackTraceOutputMethod() & XMLReporterConfig.STACKTRACE_FULL) == XMLReporterConfig.STACKTRACE_FULL)
-      {
+      if ((config.getStackTraceOutputMethod() & XMLReporterConfig.STACKTRACE_FULL) == XMLReporterConfig
+              .STACKTRACE_FULL) {
         xmlBuffer.addRequired(XMLReporterConfig.TAG_FULL_STACKTRACE, stackTraces[1]);
       }
 
@@ -229,17 +243,4 @@
     }
   }
 
-  private String getGroupNamesString(ITestResult testResult) {
-    String result = "";
-    String[] groupNames = testResult.getMethod().getGroups();
-    if ((groupNames != null) && (groupNames.length > 0)) {
-      for (int i = 0; i < groupNames.length; i++) {
-        result += groupNames[i];
-        if (i < groupNames.length - 1) {
-          result += ", ";
-        }
-      }
-    }
-    return result;
-  }
 }
\ No newline at end of file