package org.jboss.windup.reporting.rules.generation;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.jboss.windup.config.AbstractRuleProvider;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.RuleProvider;
import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.metadata.RuleMetadata;
import org.jboss.windup.config.metadata.RuleProviderRegistry;
import org.jboss.windup.config.operation.GraphOperation;
import org.jboss.windup.config.phase.PostFinalizePhase;
import org.jboss.windup.config.phase.RulePhase;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.reporting.model.rule.ExecutionPhaseModel;
import org.jboss.windup.reporting.model.rule.RuleExecutionModel;
import org.jboss.windup.reporting.model.rule.RuleProviderModel;
import org.jboss.windup.reporting.ruleexecution.RuleExecutionInformation;
import org.jboss.windup.reporting.ruleexecution.RuleExecutionResultsListener;
import org.jboss.windup.reporting.rules.rendering.ExecutionTimeReportRuleProvider;
import org.jboss.windup.reporting.service.rule.ExecutionPhaseService;
import org.jboss.windup.reporting.service.rule.RuleExecutionService;
import org.jboss.windup.reporting.service.rule.RuleProviderService;
import org.jboss.windup.util.Logging;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;
/**
* Stores information about executed rules into graph
*
* @author <a href="mailto:dklingenberg@gmail.com">David Klingenberg</a>
*/
@RuleMetadata(phase = PostFinalizePhase.class, after = ExecutionTimeReportRuleProvider.class)
public class CreateRuleProviderReportRuleProvider extends AbstractRuleProvider
{
private static final Logger LOG = Logging.get(CreateRuleProviderReportRuleProvider.class);
@Override
public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext)
{
GraphOperation addRuleReports = new GraphOperation()
{
Map<String, ExecutionPhaseModel> phaseModelMap;
GraphContext graphContext;
RuleProviderService ruleProviderService;
RuleExecutionService ruleExecutionService;
ExecutionPhaseService executionPhaseService;
private void initialize(GraphContext graphContext)
{
this.graphContext = graphContext;
this.ruleProviderService = new RuleProviderService(this.graphContext);
this.ruleExecutionService = new RuleExecutionService(this.graphContext);
this.executionPhaseService = new ExecutionPhaseService(this.graphContext);
this.phaseModelMap = new HashMap<>();
}
@Override
public void perform(GraphRewrite event, EvaluationContext context)
{
this.initialize(event.getGraphContext());
List<RuleProvider> ruleProviderList = RuleProviderRegistry.instance(event).getProviders();
for (RuleProvider ruleProvider : ruleProviderList)
{
if (ruleProvider instanceof RulePhase)
{
this.addPhase(ruleProvider.getMetadata().getID());
continue;
}
RuleProviderModel ruleProviderModel = this.ruleProviderService.create();
ruleProviderModel.setRuleProviderID(ruleProvider.getMetadata().getID());
ExecutionPhaseModel executionPhaseModel = this.getPhaseModel(ruleProvider);
executionPhaseModel.addRuleProvider(ruleProviderModel);
List<RuleExecutionInformation> ruleProviderInfo = RuleExecutionResultsListener.instance(event)
.getRuleExecutionInformation((AbstractRuleProvider) ruleProvider);
for (RuleExecutionInformation ruleInfo : ruleProviderInfo)
{
RuleExecutionModel ruleExecutionModel = this.ruleExecutionService.create();
ruleExecutionModel.setDataFromRuleInfo(ruleInfo);
ruleProviderModel.addRule(ruleExecutionModel);
}
}
this.graphContext.commit();
}
private void addPhase(String name)
{
if (!this.phaseModelMap.containsKey(name))
{
ExecutionPhaseModel phaseModel = executionPhaseService.create();
phaseModel.setName(name);
this.phaseModelMap.put(name, phaseModel);
}
}
private ExecutionPhaseModel getPhaseModel(RuleProvider ruleProvider)
{
Class<? extends RulePhase> phase = ruleProvider.getMetadata().getPhase();
String name = phase.getSimpleName();
if (!this.phaseModelMap.containsKey(name))
{
ExecutionPhaseModel phaseModel = executionPhaseService.create();
phaseModel.setName(name);
this.phaseModelMap.put(name, phaseModel);
}
ExecutionPhaseModel phaseModel = this.phaseModelMap.get(name);
return phaseModel;
}
@Override
public String toString()
{
return "AddRuleReports";
}
};
return ConfigurationBuilder.begin()
.addRule()
.perform(addRuleReports);
}
}