package hudson.plugins.cigame.rules.plugins.violation;
import java.util.List;
import hudson.model.AbstractBuild;
import hudson.model.Result;
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.violations.ViolationsBuildAction;
public class DefaultViolationRule implements Rule {
private int pointsForAddingViolation;
private int pointsForRemovingViolation;
private String typeName;
private String violationName;
public DefaultViolationRule(String typeName, String violationName,
int pointsForAddingViolation, int pointsForRemovingViolation) {
this.typeName = typeName;
this.violationName = violationName;
this.pointsForAddingViolation = pointsForAddingViolation;
this.pointsForRemovingViolation = pointsForRemovingViolation;
}
public RuleResult evaluate(AbstractBuild<?, ?> build) {
if (new ResultSequenceValidator(Result.UNSTABLE, 2).isValid(build)) {
List<List<ViolationsBuildAction>> actionList = new ActionSequenceRetriever<ViolationsBuildAction>(ViolationsBuildAction.class, 2).getSequence(build);
if ((actionList != null)
&& containsTypeReport(actionList.get(0))
&& containsTypeReport(actionList.get(1)) ){
int diff = getTypeReportCount(actionList.get(0)) - getTypeReportCount(actionList.get(1));
if (diff > 0) {
return new RuleResult(diff * pointsForAddingViolation,
Messages.ViolationRuleSet_DefaultRule_NewViolationsCount(diff, violationName)); //$NON-NLS-1$
}
if (diff < 0) {
return new RuleResult((diff * -1) * pointsForRemovingViolation,
Messages.ViolationRuleSet_DefaultRule_FixedViolationsCount(diff * -1, violationName)); //$NON-NLS-1$
}
}
}
return RuleResult.EMPTY_RESULT;
}
private boolean containsTypeReport(List<ViolationsBuildAction> actions) {
for (ViolationsBuildAction action : actions) {
if ((action.getReport().getTypeReports().get(typeName) != null)
&& (action.getReport().getTypeSummary(typeName).getErrorMessage() == null)){
return true;
}
}
return false;
}
private int getTypeReportCount(List<ViolationsBuildAction> actions) {
int numberOfReports = 0;
for (ViolationsBuildAction action : actions) {
numberOfReports += action.getReport().typeCount(typeName);
}
return numberOfReports;
}
public String getName() {
return violationName;
}
}