package hudson.plugins.cigame.rules.plugins.pmd;
import hudson.model.AbstractBuild;
import hudson.model.Result;
import hudson.plugins.analysis.util.model.Priority;
import hudson.plugins.cigame.model.Rule;
import hudson.plugins.cigame.model.RuleResult;
import hudson.plugins.cigame.util.ActionSequenceRetriever;
import hudson.plugins.cigame.util.ResultSequenceValidator;
import hudson.plugins.pmd.PmdResultAction;
import java.util.List;
public class DefaultPmdRule implements Rule {
private int pointsForAddingAnAnnotation;
private int pointsForRemovingAnAnnotation;
private Priority tasksPriority;
public DefaultPmdRule(Priority tasksPriority, int pointsForAddingAnAnnotation, int pointsForRemovingAnAnnotation) {
this.tasksPriority = tasksPriority;
this.pointsForAddingAnAnnotation = pointsForAddingAnAnnotation;
this.pointsForRemovingAnAnnotation = pointsForRemovingAnAnnotation;
}
public RuleResult evaluate(AbstractBuild<?, ?> build) {
if (new ResultSequenceValidator(Result.UNSTABLE, 2).isValid(build)) {
List<List<PmdResultAction>> sequence = new ActionSequenceRetriever<PmdResultAction>(PmdResultAction.class, 2).getSequence(build);
if ((sequence != null)
&& hasNoErrors(sequence.get(0)) && hasNoErrors(sequence.get(1))){
int delta = getNumberOfAnnotations(sequence.get(0)) - getNumberOfAnnotations(sequence.get(1));
if (delta < 0) {
return new RuleResult(Math.abs(delta) * pointsForRemovingAnAnnotation,
Messages.PmdRuleSet_DefaultRule_FixedWarningsCount(Math.abs(delta), tasksPriority.name())); //$NON-NLS-1$
}
if (delta > 0) {
return new RuleResult(Math.abs(delta) * pointsForAddingAnAnnotation,
Messages.PmdRuleSet_DefaultRule_NewWarningsCount(Math.abs(delta), tasksPriority.name())); //$NON-NLS-1$
}
}
}
return RuleResult.EMPTY_RESULT;
}
private boolean hasNoErrors(List<PmdResultAction> actions) {
for (PmdResultAction action : actions) {
if (action.getResult().hasError()) {
return false;
}
}
return true;
}
private int getNumberOfAnnotations(List<PmdResultAction> actions) {
int numberOfAnnotations = 0;
for (PmdResultAction action : actions) {
numberOfAnnotations += action.getResult().getNumberOfAnnotations(tasksPriority);
}
return numberOfAnnotations;
}
public String getName() {
return Messages.PmdRuleSet_DefaultRule_Name(tasksPriority.name()); //$NON-NLS-1$
}
}