package org.jboss.windup.reporting.export; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.jboss.windup.config.AbstractRuleProvider; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.loader.RuleLoaderContext; import org.jboss.windup.config.metadata.RuleMetadata; import org.jboss.windup.config.operation.Iteration; import org.jboss.windup.config.operation.iteration.AbstractIterationOperation; import org.jboss.windup.config.phase.FinalizePhase; import org.jboss.windup.config.query.Query; import org.jboss.windup.graph.model.LinkModel; import org.jboss.windup.graph.model.ProjectModel; import org.jboss.windup.graph.model.WindupConfigurationModel; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.reporting.model.ClassificationModel; import org.jboss.windup.reporting.model.InlineHintModel; import org.jboss.windup.reporting.service.ClassificationService; import org.jboss.windup.reporting.service.InlineHintService; import org.jboss.windup.util.PathUtil; import org.jboss.windup.util.exception.WindupException; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.ConfigurationBuilder; import org.ocpsoft.rewrite.context.EvaluationContext; import com.opencsv.CSVWriter; /** * RuleProvider generating optional CSV files for every application. This file will contain the main reporting information. * * @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a> */ @RuleMetadata(phase = FinalizePhase.class, haltOnException = true) public class ExportCSVFileRuleProvider extends AbstractRuleProvider { public static final int COMMIT_INTERVAL = 750; public static final int LOG_INTERVAL = 250; // @formatter:off @Override public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext) { return ConfigurationBuilder.begin() .addRule() .when(Query.fromType(WindupConfigurationModel.class).withProperty(WindupConfigurationModel.CSV_MODE, true)) .perform( Iteration.over(Iteration.DEFAULT_VARIABLE_LIST_STRING).perform( new ExportCSVReportOperation()).endIteration()); } // @formatter:on private final class ExportCSVReportOperation extends AbstractIterationOperation<WindupConfigurationModel> { @Override public void perform(GraphRewrite event, EvaluationContext context, WindupConfigurationModel config) { InlineHintService hintService = new InlineHintService(event.getGraphContext()); String outputFolderPath = config.getOutputPath().getFilePath() + File.separator; ClassificationService classificationService = new ClassificationService(event.getGraphContext()); final Map<String, CSVWriter> projectToFile = new HashMap<>(); final Iterable<InlineHintModel> hints = hintService.findAll(); final Iterable<ClassificationModel> classifications = classificationService.findAll(); //try{} in case something bad happens, we need to close files try { for (InlineHintModel hint : hints) { final ProjectModel parentRootProjectModel = hint.getFile().getProjectModel().getRootProjectModel(); String links = buildLinkString(hint.getLinks()); String ruleId = hint.getRuleID() != null ? hint.getRuleID() : ""; String title = hint.getTitle() != null ? hint.getTitle() : ""; String description = hint.getDescription() != null ? hint.getDescription() : ""; String projectNameString = ""; String fileName = ""; String filePath = ""; if (hint.getFile() != null) { if (hint.getFile().getProjectModel() != null) { projectNameString = hint.getFile().getProjectModel().getName(); } fileName = hint.getFile().getFileName(); filePath = hint.getFile().getFilePath(); } String[] strings = new String[] { ruleId, "hint", title, description, links, projectNameString, fileName, filePath, String.valueOf( hint.getLineNumber()), String.valueOf(hint.getEffort()) }; writeCsvRecordForProject(projectToFile, outputFolderPath, parentRootProjectModel, strings); } for (ClassificationModel classification : classifications) { for (FileModel fileModel : classification.getFileModels()) { final ProjectModel parentRootProjectModel = fileModel.getProjectModel().getRootProjectModel(); String links = buildLinkString(classification.getLinks()); String ruleId = classification.getRuleID() != null ? classification.getRuleID() : ""; String classificationText = classification.getClassification() != null ? classification.getClassification() : ""; String description = classification.getDescription() != null ? classification.getDescription() : ""; String projectNameString = ""; String fileName = ""; String filePath = ""; if (fileModel.getProjectModel() != null) { projectNameString = fileModel.getProjectModel().getName(); } fileName = fileModel.getFileName(); filePath = fileModel.getFilePath(); String[] strings = new String[] { ruleId, "classification", classificationText, description, links, projectNameString, fileName, filePath, "N/A", String.valueOf( classification.getEffort()) }; writeCsvRecordForProject(projectToFile, outputFolderPath, parentRootProjectModel, strings); } } } finally { for (CSVWriter csvWriter : projectToFile.values()) { try { csvWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } private String buildLinkString(Iterable<LinkModel> links) { StringBuilder linksString = new StringBuilder(); for (LinkModel linkModel : links) { linksString.append("["); linksString.append(linkModel.getLink()).append(","); linksString.append(linkModel.getDescription()); linksString.append("]"); } linksString.toString(); return linksString.toString(); } private void writeCsvRecordForProject(Map<String, CSVWriter> projectToFile, String outputFolderPath, ProjectModel projectModel, String[] line) { if (!projectToFile.containsKey(projectModel.getName())) { CSVWriter writer = initCSVWriter(outputFolderPath + PathUtil.cleanFileName(projectModel.getName()) + ".csv"); projectToFile.put(projectModel.getName(), writer); } projectToFile.get(projectModel.getName()).writeNext(line); } private CSVWriter initCSVWriter(String path) { try { CSVWriter writer = new CSVWriter( new FileWriter(path), ','); String[] headerLine = new String[] { "Rule Id", "Problem type", "Title", "Description", "Links", "Application", "File Name", "File Path", "Line", "Story points" }; writer.writeNext(headerLine); return writer; } catch (IOException e) { System.err.println("Windup was not able to create a CSV file " + path + ". CSV Export will not be generated."); throw new WindupException("Unable to create file " + path, e); } } } }