package hudson.plugins.performance.parsers; import hudson.EnvVars; import hudson.FilePath; import hudson.model.Run; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.Hashtable; import java.util.Map; public class ParserFactory { protected static final Map<String, String> defaultGlobPatterns = new Hashtable<String, String>(); static { defaultGlobPatterns.put("parrot-server-stats.log", IagoParser.class.getSimpleName()); defaultGlobPatterns.put("**/*.csv", JMeterCsvParser.class.getSimpleName()); defaultGlobPatterns.put("**/*.jtl", JMeterParser.class.getSimpleName()); defaultGlobPatterns.put("**/*.log", JmeterSummarizerParser.class.getSimpleName()); defaultGlobPatterns.put("**/TEST-*.xml", JUnitParser.class.getSimpleName()); defaultGlobPatterns.put("**/*.xml", TaurusParser.class.getSimpleName()); defaultGlobPatterns.put("**/*.wrk", WrkSummarizerParser.class.getSimpleName()); } public static PerformanceReportParser getParser(Run<?, ?> build, FilePath workspace, PrintStream logger, String glob, EnvVars env) throws IOException, InterruptedException { if (defaultGlobPatterns.containsKey(glob)) { return getParser(defaultGlobPatterns.get(glob), glob); } String expandGlob = env.expand(glob); try { FilePath[] pathList = workspace.list(expandGlob); for (FilePath src : pathList) { // copy file (it can be on remote slave) to "../build/../temp/" folder final File localReport = new File(build.getRootDir(), "/temp/" + src.getName()); if (src.isDirectory()) { logger.println("Performance: File '" + src.getName() + "' is a directory, not a Performance Report"); continue; } src.copyTo(new FilePath(localReport)); return getParser(ParserDetector.detect(localReport.getPath()), glob); } } catch (IOException ignored) { } File report = new File(workspace.getRemote() + '/' + glob); if (!report.exists()) { // if report on remote slave FilePath localReport = new FilePath(new File(build.getRootDir(), "/temp/" + glob)); localReport.copyFrom(new FilePath(workspace, glob)); return getParser(ParserDetector.detect(localReport.getRemote()), glob); } return getParser(ParserDetector.detect(workspace.getRemote() + '/' + glob), workspace.getRemote() + '/' + glob); } private static PerformanceReportParser getParser(String parserName, String glob) { if (parserName.equals(JMeterParser.class.getSimpleName())) { return new JMeterParser(glob); } else if (parserName.equals(JMeterCsvParser.class.getSimpleName())) { return new JMeterCsvParser(glob); } else if (parserName.equals(JUnitParser.class.getSimpleName())) { return new JUnitParser(glob); } else if (parserName.equals(TaurusParser.class.getSimpleName())) { return new TaurusParser(glob); } else if (parserName.equals(WrkSummarizerParser.class.getSimpleName())) { return new WrkSummarizerParser(glob); } else if (parserName.equals(JmeterSummarizerParser.class.getSimpleName())) { return new JmeterSummarizerParser(glob); } else if (parserName.equals(IagoParser.class.getSimpleName())) { return new IagoParser(glob); } else { throw new IllegalArgumentException("Unknown parser type: " + parserName); } } }