package org.jboss.windup.rules.apps.java.reporting.rules; 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.GraphOperation; import org.jboss.windup.config.phase.ReportGenerationPhase; import org.jboss.windup.graph.GraphContext; 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.GraphService; import org.jboss.windup.graph.service.WindupConfigurationService; import org.jboss.windup.graph.traversal.ProjectModelTraversal; import org.jboss.windup.reporting.model.TemplateType; import org.jboss.windup.reporting.service.ReportService; 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 java.util.ArrayList; import java.util.List; /** * Creates the main report HTML page for a Java application. */ @RuleMetadata(phase = ReportGenerationPhase.class) public class CreateUnparsableFilesReportRuleProvider extends AbstractRuleProvider { public static final String REPORT_NAME = "Unparsable"; public static final String TEMPLATE_UNPARSABLE = "/reports/templates/unparsable_files.ftl"; public static final String DESCRIPTION = "This report shows all files that Windup could not parse in the expected format.\n" + " For instance, a file with a <code>.xml</code> or <code>.wsdl</code> suffix\n" + " is assumed to be an XML file. If the XML parser fails on it, you'll see that here.\n" + " Besides that, the information about parsing failure is also present wherever the individual file is listed."; // @formatter:off @Override public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext) { // Create the ReportModel. GraphOperation createReportModel = new GraphOperation() { @Override public void perform(GraphRewrite event, EvaluationContext context) { WindupConfigurationModel windupConfiguration = WindupConfigurationService.getConfigurationModel(event.getGraphContext()); for(FileModel fileModel : windupConfiguration.getInputPaths()) { ProjectModel application = fileModel.getProjectModel(); if (application == null) throw new WindupException("Error, no project found in: " + fileModel.getFilePath()); createReportModel(event.getGraphContext(), application); } } public String toString() { return "addReport"; } }; // For each FileModel... return ConfigurationBuilder.begin() .addRule() .perform(createReportModel); } // @formatter:on private List<ProjectModel> getProjectsWithUnparsableFiles(ProjectModelTraversal traversal) { List<ProjectModel> results = new ArrayList<>(); for (FileModel fileModel : traversal.getCanonicalProject().getUnparsableFiles()) { if (fileModel.getOnParseError() != FileModel.OnParseError.IGNORE) { results.add(traversal.getCanonicalProject()); break; } } for (ProjectModelTraversal child : traversal.getChildren()) { results.addAll(getProjectsWithUnparsableFiles(child)); } return results; } private void createReportModel(GraphContext context, ProjectModel application) { ProjectModelTraversal traversal = new ProjectModelTraversal(application); List<ProjectModel> projects = getProjectsWithUnparsableFiles(traversal); if (projects.isEmpty()) return; GraphService<UnparsablesAppReportModel> service = new GraphService<>(context, UnparsablesAppReportModel.class); UnparsablesAppReportModel reportModel = service.create(); reportModel.setReportPriority(120); reportModel.setDisplayInApplicationReportIndex(true); reportModel.setReportName(REPORT_NAME); reportModel.setDescription(DESCRIPTION); reportModel.setReportIconClass("glyphicon glyphicon-warning-sign"); reportModel.setMainApplicationReport(false); reportModel.setProjectModel(application); reportModel.setTemplatePath(TEMPLATE_UNPARSABLE); reportModel.setTemplateType(TemplateType.FREEMARKER); reportModel.setAllSubProjects(projects); // Set the filename for the report ReportService reportService = new ReportService(context); reportService.setUniqueFilename(reportModel, REPORT_NAME + "_" + application.getName(), "html"); } }