package com.coverity.ps.sac.io; import java.io.FileWriter; import java.io.IOException; import java.util.List; /** * Formats a list of defects into the Coverity C# directory format * * @author rhollines */ public class CoveritySaFormatter { public static final String OUTPUT_PATH = "output/intdir/cs"; List<Defect> defects; private String functionMetrics; /** * This class is a holder for Coverity defect information. */ public static class Defect { private String fileName; private String rule; private String eventTag; private int line; private String function; private String descritpion; /** * Defect constructor. */ public Defect(String fileName, String rule, String eventTag, String line, String function, String descritpion) { this.fileName = fileName; this.eventTag = eventTag; this.rule = rule; this.line = Integer.parseInt(line); this.function = function; this.descritpion = descritpion; } public String getRule() { return this.rule; } public String getEventTag() { return this.eventTag; } public String getFileName() { return this.fileName; } public String getFunction() { return this.function; } public String getDescritpion() { return this.descritpion; } public int getLine() { if (this.line < 1) { return 1; } return this.line; } } /** * CoveritySaFormatter constructor. * * @param defects * list of defects * @param functionMetrics */ public CoveritySaFormatter(List<Defect> defects, String functionMetrics) { this.defects = defects; this.functionMetrics = functionMetrics; } /** * Writes defect information to the intermediate directory * * @throws IOException */ public void write() throws IOException { FileWriter errorsWriter = null; FileWriter metricsWriter = null; try { StringBuilder errors = new StringBuilder(); for (int i = 0; i < defects.size(); i++) { // generate errors XML errors.append("<error><checker>"); errors.append(defects.get(i).getRule()); errors.append("</checker><file>"); errors.append(defects.get(i).getFileName()); errors.append("</file>"); errors.append("<function>"); errors.append(defects.get(i).getFunction().equals("unknown") ? "unknown" : defects.get(i).getFunction()); errors.append("</function>"); errors.append("<event><main>true</main><tag>"); errors.append(defects.get(i).getEventTag()); errors.append("</tag><description>"); errors.append(defects.get(i).getDescritpion()); errors.append("</description><line>"); errors.append(defects.get(i).getLine()); errors.append("</line><file>"); errors.append(defects.get(i).getFileName()); errors.append("</file></event><extra></extra><subcategory>none</subcategory></error>"); } /* // generate metrics xml metrics.append("<fnmetric><file>"); metrics.append(defects.get(i).getFileName()); metrics.append("</file><fnmet>"); metrics.append(defects.get(i).getFunction()); metrics.append("</fnmet></fnmetric>"); */ errorsWriter = new FileWriter(OUTPUT_PATH + "/output/defects.errors.xml"); errorsWriter.write(errors.toString()); metricsWriter = new FileWriter(OUTPUT_PATH + "/output/METRICS.errors.xml"); metricsWriter.write(this.functionMetrics); } finally { try { if (errorsWriter != null) { errorsWriter.close(); } if (metricsWriter != null) { metricsWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } } }