package org.jboss.windup.rules.apps.java.reporting.rules;
import java.io.FileWriter;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.jboss.forge.furnace.util.OperatingSystemUtils;
import org.jboss.windup.config.AbstractRuleProvider;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.operation.GraphOperation;
import org.jboss.windup.config.phase.ReportRenderingPhase;
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.graph.service.WindupConfigurationService;
import org.jboss.windup.graph.traversal.OnlyOnceTraversalStrategy;
import org.jboss.windup.graph.traversal.ProjectModelTraversal;
import org.jboss.windup.reporting.freemarker.problemsummary.ProblemSummary;
import org.jboss.windup.reporting.freemarker.problemsummary.ProblemSummaryService;
import org.jboss.windup.reporting.service.EffortReportService;
import org.jboss.windup.reporting.service.ReportService;
import org.jboss.windup.reporting.category.IssueCategory;
import org.jboss.windup.reporting.category.IssueCategoryRegistry;
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.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.MappingJsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jboss.windup.config.metadata.RuleMetadata;
import org.jboss.windup.reporting.service.EffortReportService.EffortLevel;
/**
* Generates a .js (javascript) file in the reports directory with detailed issue summary information.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
@RuleMetadata(phase = ReportRenderingPhase.class)
public class CreateIssueSummaryDataRuleProvider extends AbstractRuleProvider
{
public static final String ISSUE_SUMMARIES_JS = "issue_summaries.js";
@Override
public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext)
{
return ConfigurationBuilder.begin()
.addRule()
.perform(new GraphOperation()
{
@Override
public void perform(GraphRewrite event, EvaluationContext context)
{
generateDataSummary(event);
}
});
}
private void generateDataSummary(GraphRewrite event)
{
ReportService reportService = new ReportService(event.getGraphContext());
try
{
Path dataDirectory = reportService.getReportDataDirectory();
Path issueSummaryJSPath = dataDirectory.resolve(ISSUE_SUMMARIES_JS);
try (FileWriter issueSummaryWriter = new FileWriter(issueSummaryJSPath.toFile()))
{
WindupConfigurationModel windupConfiguration = WindupConfigurationService.getConfigurationModel(event.getGraphContext());
issueSummaryWriter.write("var WINDUP_ISSUE_SUMMARIES = [];" + NEWLINE);
for (FileModel inputApplicationFile : windupConfiguration.getInputPaths())
{
ProjectModel inputApplication = inputApplicationFile.getProjectModel();
ProjectModelTraversal projectModelTraversal = new ProjectModelTraversal(inputApplication, new OnlyOnceTraversalStrategy());
MappingJsonFactory jsonFactory = new MappingJsonFactory();
jsonFactory.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
Map<String, List<ProblemSummary>> summariesBySeverity =
ProblemSummaryService.getProblemSummaries(
event.getGraphContext(), projectModelTraversal.getAllProjects(true), Collections.emptySet(), Collections.emptySet())
.entrySet().stream().collect(Collectors.toMap((e) -> e.getKey().getCategoryID(), Map.Entry::getValue));
issueSummaryWriter.write("WINDUP_ISSUE_SUMMARIES['" + inputApplication.asVertex().getId() + "'] = ");
objectMapper.writeValue(issueSummaryWriter, summariesBySeverity);
issueSummaryWriter.write(";" + NEWLINE);
}
issueSummaryWriter.write("var effortToDescription = [];" + NEWLINE);
for (EffortReportService.EffortLevel level : EffortReportService.EffortLevel.values())
{
issueSummaryWriter.write("effortToDescription[" + level.getPoints() + "] = \"" + level.getShortDescription()+ "\";");
issueSummaryWriter.write(NEWLINE);
}
issueSummaryWriter.write("var effortOrder = [");
String comma = "";
for (EffortLevel level : EffortLevel.values())
{
issueSummaryWriter.write(comma);
comma = ", ";
issueSummaryWriter.write("\"");
issueSummaryWriter.write(level.getShortDescription());
issueSummaryWriter.write("\"");
}
issueSummaryWriter.write("];" + NEWLINE);
issueSummaryWriter.write("var severityOrder = [");
IssueCategoryRegistry issueCategoryRegistry = IssueCategoryRegistry.instance(event.getRewriteContext());
for (IssueCategory issueCategory : issueCategoryRegistry.getIssueCategories())
{
issueSummaryWriter.write("'" + issueCategory.getCategoryID() + "', ");
}
issueSummaryWriter.write("];" + NEWLINE);
}
}
catch (Exception e)
{
throw new WindupException("Error serializing problem details due to: " + e.getMessage(), e);
}
}
private static final String NEWLINE = OperatingSystemUtils.getLineSeparator();
}