1package org.testng;
2
3import com.beust.jcommander.JCommander;
4import com.beust.jcommander.Parameter;
5import com.beust.jcommander.ParameterException;
6
7import org.testng.collections.Sets;
8import org.testng.internal.Yaml;
9import org.testng.xml.Parser;
10import org.testng.xml.XmlSuite;
11import org.xml.sax.SAXException;
12
13import javax.xml.parsers.ParserConfigurationException;
14
15import java.io.File;
16import java.io.FileWriter;
17import java.io.IOException;
18import java.util.Arrays;
19import java.util.Collection;
20import java.util.List;
21import java.util.Set;
22
23/**
24 * Convert XML files to YAML and vice versa.
25 *
26 * @author cbeust
27 */
28public class Converter {
29
30  @Parameter(description = "file1 [file2 file3...]", required = true)
31  private List<String> m_files;
32
33  @Parameter(names = "-d", description = "The directory where the file(s) will be created")
34  private String m_outputDirectory = ".";
35
36  public static void main(String[] args)
37      throws ParserConfigurationException, SAXException, IOException {
38    Converter c = new Converter();
39    c.run(args);
40  }
41
42  private void findAllSuites(Collection<XmlSuite> suites, Set<XmlSuite> result) {
43    for (XmlSuite s : suites) {
44      result.add(s);
45      for (XmlSuite xs : s.getChildSuites()) {
46        findAllSuites(Arrays.asList(xs), result);
47      }
48    }
49  }
50
51  private void run(String[] args)
52      throws ParserConfigurationException, SAXException, IOException {
53    JCommander jc = new JCommander(this);
54    try {
55      jc.parse(args);
56      File f = new File(m_outputDirectory);
57      if (! f.exists()) f.mkdir();
58
59      for (String file : m_files) {
60        Set<XmlSuite> allSuites = Sets.newHashSet();
61        Parser parser = new Parser(file);
62        parser.setLoadClasses(false);  // we might not have these classes on the classpath
63        findAllSuites(parser.parse(), allSuites);
64
65        for (XmlSuite suite : allSuites) {
66          String fileName = suite.getFileName();
67          int ind = fileName.lastIndexOf(".");
68          String bn = fileName.substring(0, ind);
69          int ind2 = bn.lastIndexOf(File.separatorChar);
70          String baseName = bn.substring(ind2 + 1);
71
72          if (file.endsWith(".xml")) {
73            File newFile = new File(m_outputDirectory, baseName + ".yaml");
74            writeFile(newFile, Yaml.toYaml(suite).toString());
75          }
76          else if (file.endsWith(".yaml")) {
77            File newFile = new File(m_outputDirectory, baseName + ".xml");
78            writeFile(newFile, suite.toXml());
79          }
80          else {
81            throw new TestNGException("Unknown file type:" + file);
82          }
83        }
84      }
85    }
86    catch(ParameterException ex) {
87      System.out.println("Error: " + ex.getMessage());
88      jc.usage();
89    }
90  }
91
92  private void writeFile(File newFile, String content) throws IOException {
93    try (FileWriter bw = new FileWriter(newFile)) {
94      bw.write(content);
95    }
96    System.out.println("Wrote " + newFile);
97  }
98}
99