package org.jboss.windup.rules.apps.java.ip;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.GraphOperation;
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.WindupVertexFrame;
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.config.projecttraversal.ProjectTraversalCache;
import org.jboss.windup.reporting.model.ApplicationReportModel;
import org.jboss.windup.reporting.model.TemplateType;
import org.jboss.windup.reporting.model.WindupVertexListModel;
import org.jboss.windup.reporting.service.ApplicationReportService;
import org.jboss.windup.reporting.service.ReportService;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;
/**
* Finds files that contain potential hard-coded IP addresses, determined by regular expression.
*
* @author <a href="mailto:bradsdavis@gmail.com">Brad Davis</a>
*/
@RuleMetadata(phase = ReportGenerationPhase.class)
public class CreateHardcodedIPAddressReportRuleProvider extends AbstractRuleProvider
{
private static final String TITLE = "Hard-coded IP Addresses";
public static final String TEMPLATE_REPORT = "/reports/templates/hardcoded_ip_addresses.ftl";
public static final String REPORT_DESCRIPTION = "The Hard-coded IP report provides a list of all hard-coded IP addresses that were found in the application. These often require review during migration.";
@Override
public Configuration getConfiguration(final RuleLoaderContext ruleLoaderContext)
{
return ConfigurationBuilder
.begin()
.addRule()
// when a IP Location Model exists...
.when(Query.fromType(HardcodedIPLocationModel.class))
// perform the write of this report once (GraphOperation)...
.perform(new GraphOperation()
{
@Override
public void perform(GraphRewrite event, EvaluationContext context)
{
// configuration of current execution
WindupConfigurationModel configurationModel = WindupConfigurationService.getConfigurationModel(event.getGraphContext());
for (FileModel inputPath : configurationModel.getInputPaths())
{
// reference to input project model
ProjectModel projectModel = inputPath.getProjectModel();
createIPReport(event.getGraphContext(), projectModel);
}
}
});
}
private void createIPReport(GraphContext context, ProjectModel rootProjectModel)
{
GraphService<HardcodedIPLocationModel> ipLocationModelService = new GraphService<>(context, HardcodedIPLocationModel.class);
List<HardcodedIPLocationModel> hardcodedIPArrayList = new ArrayList<>();
// find all IPLocationModels
for (HardcodedIPLocationModel location : ipLocationModelService.findAll())
{
Set<ProjectModel> applicationsForFile = ProjectTraversalCache.getApplicationsForProject(context, location.getFile().getProjectModel());
if (applicationsForFile.contains(rootProjectModel))
hardcodedIPArrayList.add(location);
}
// There were not hardcoded IPs for this application
if (hardcodedIPArrayList.isEmpty())
return;
ApplicationReportService applicationReportService = new ApplicationReportService(context);
// create a reference in the graph to the static ip location report.
ApplicationReportModel applicationReport = applicationReportService.create();
applicationReport.setReportPriority(600);
applicationReport.setReportName(TITLE);
applicationReport.setDescription(REPORT_DESCRIPTION);
applicationReport.setTemplatePath(TEMPLATE_REPORT);
applicationReport.setDisplayInApplicationReportIndex(true);
applicationReport.setReportIconClass("glyphicon glyphicon-map-marker");
applicationReport.setTemplateType(TemplateType.FREEMARKER);
applicationReport.setProjectModel(rootProjectModel);
Map<String, WindupVertexFrame> relatedData = new HashMap<>(1);
@SuppressWarnings("unchecked")
WindupVertexListModel<HardcodedIPLocationModel> hardcodedIPListModel = new GraphService<>(context, WindupVertexListModel.class).create();
hardcodedIPListModel.addAll(hardcodedIPArrayList);
relatedData.put("hardcodedIPLocations", hardcodedIPListModel);
applicationReport.setRelatedResource(relatedData);
// performs methods on the graph to create a unique file name.
ReportService reportService = new ReportService(context);
// uses project model's name for the report name.
reportService.setUniqueFilename(applicationReport, "hardcoded_ips" + rootProjectModel.getName(), "html");
}
}