package org.jboss.windup.rules.apps.java.reporting.rules; import java.util.Collections; import java.util.HashSet; import java.util.Set; 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.AbstractIterationOperation; import org.jboss.windup.config.phase.ReportGenerationPhase; import org.jboss.windup.config.query.Query; 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.traversal.ProjectModelTraversal; import org.jboss.windup.reporting.model.OverviewReportLineMessageModel; import org.jboss.windup.reporting.model.TaggableModel; import org.jboss.windup.reporting.model.TemplateType; import org.jboss.windup.reporting.service.ReportService; import org.jboss.windup.rules.apps.java.model.JavaApplicationOverviewReportModel; import org.jboss.windup.util.exception.WindupException; import org.ocpsoft.rewrite.config.ConditionBuilder; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.ConfigurationBuilder; import org.ocpsoft.rewrite.context.EvaluationContext; /** * Creates the main report HTML page for a Java application. */ @RuleMetadata(phase = ReportGenerationPhase.class) public class CreateJavaApplicationOverviewReportRuleProvider extends AbstractRuleProvider { public static final String DETAILS_REPORT = "Application Details"; public static final String TEMPLATE_APPLICATION_REPORT = "/reports/templates/java_application.ftl"; public static final String DESCRIPTION = "This provides a detailed overview of all resources found within the application that may need attention during the migration."; // @formatter:off @Override public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext) { ConditionBuilder applicationProjectModelsFound = Query .fromType(WindupConfigurationModel.class); AbstractIterationOperation<WindupConfigurationModel> addApplicationReport = new AbstractIterationOperation<WindupConfigurationModel>() { @Override public void perform(GraphRewrite event, EvaluationContext context, WindupConfigurationModel payload) { for (FileModel inputPath : payload.getInputPaths()) { ProjectModel application = inputPath.getProjectModel(); if (application == null) { throw new WindupException("Error, no project found in: " + inputPath.getFilePath()); } createReport(event.getGraphContext(), application); } } @Override public String toString() { return "CreateJavaApplicationOverviewReport"; } }; return ConfigurationBuilder.begin() .addRule() .when(applicationProjectModelsFound) .perform(addApplicationReport); } // @formatter:on private void createReport(GraphContext context, ProjectModel application) { GraphService<JavaApplicationOverviewReportModel> service = new GraphService<>(context, JavaApplicationOverviewReportModel.class); JavaApplicationOverviewReportModel applicationReportModel = service.create(); applicationReportModel.setReportPriority(102); applicationReportModel.setDisplayInApplicationReportIndex(true); applicationReportModel.setReportName(DETAILS_REPORT); applicationReportModel.setDescription(DESCRIPTION); applicationReportModel.setReportIconClass("glyphicon glyphicon-th-list"); applicationReportModel.setMainApplicationReport(false); applicationReportModel.setProjectModel(application); applicationReportModel.setTemplatePath(TEMPLATE_APPLICATION_REPORT); applicationReportModel.setTemplateType(TemplateType.FREEMARKER); applicationReportModel.setIncludeTags(Collections.emptySet()); applicationReportModel.setExcludeTags(Collections.singleton(TaggableModel.CATCHALL_TAG)); GraphService<OverviewReportLineMessageModel> lineNotesService = new GraphService<>(context, OverviewReportLineMessageModel.class); Iterable<OverviewReportLineMessageModel> allLines = lineNotesService.findAll(); Set<String> dupeCheck = new HashSet<>(); ProjectModelTraversal projectModelTraversal = new ProjectModelTraversal(application); Set<ProjectModel> allProjectsInApplication = projectModelTraversal.getAllProjects(true); for (OverviewReportLineMessageModel line : allLines) { if (dupeCheck.contains(line.getMessage())) continue; ProjectModel project = line.getProject(); if (allProjectsInApplication.contains(project)) { dupeCheck.add(line.getMessage()); applicationReportModel.addApplicationReportLine(line); } } // Set the filename for the report ReportService reportService = new ReportService(context); reportService.setUniqueFilename(applicationReportModel, "ApplicationDetails_" + application.getName(), "html"); } }