package org.jenkinsci.plugins.codedx;
import hudson.model.AbstractBuild;
import hudson.model.Action;
import java.io.Serializable;
import java.util.*;
import org.jenkinsci.plugins.codedx.model.CodeDxReportStatistics;
import org.kohsuke.stapler.StaplerProxy;
/**
*
* @author ademartini This file is heavily derived from the sloccount-plugin (author: lordofthepigs)
*/
public class CodeDxBuildAction implements Action, Serializable, StaplerProxy {
/** Serial version UID. */
private static final long serialVersionUID = 0L;
public static final String URL_NAME = "codedxResult";
private AbstractBuild<?,?> build;
private CodeDxResult result;
public CodeDxBuildAction(AbstractBuild<?,?> build, CodeDxResult result){
this.build = build;
this.result = result;
}
public String getIconFileName() {
return null;
}
public String getDisplayName() {
return null;
}
public String getUrlName() {
return URL_NAME;
}
private class DiffGroupComparator implements Comparator<CodeDxDiffGroup>{
List<String> groupOrdering = new ArrayList<String>();
public DiffGroupComparator(List<String> groupOrdering){
this.groupOrdering = groupOrdering;
}
public int compare(CodeDxDiffGroup o1, CodeDxDiffGroup o2) {
int index1 = groupOrdering.indexOf(o1.getName());
int index2 = groupOrdering.indexOf(o2.getName());
return Integer.compare(index1, index2);
}
}
/**
* Get differences between two severity statistics.
*
* @return the differences
*/
public CodeDxDiffSummary getSeverityDiffSummary() {
List<String> order = new ArrayList<String>();
order.add("Critical");
order.add("High");
order.add("Medium");
order.add("Low");
order.add("Info");
order.add("Unspecified");
Map<String,String> iconMap = new HashMap<String,String>();
iconMap.put("Critical", "/plugin/codedx/icons/critical.png");
iconMap.put("High", "/plugin/codedx/icons/high.png");
iconMap.put("Medium", "/plugin/codedx/icons/medium.png");
iconMap.put("Low", "/plugin/codedx/icons/low.png");
iconMap.put("Info", "/plugin/codedx/icons/info.png");
iconMap.put("Unspecified", "/plugin/codedx/icons/unspecified.png");
return CodeDxDiffSummary.getDiffSummary(getPreviousSeverityStats(),
result.getStatistics("severity"), "Severity",new DiffGroupComparator(order),iconMap);
}
/**
* Get differences between two status statistics.
*
* @return the differences
*/
public CodeDxDiffSummary getStatusDiffSummary() {
List<String> order = new ArrayList<String>();
order.add("Fixed");
order.add("Mitigated");
order.add("Ignored");
order.add("False Positive");
order.add("Unresolved");
order.add("Escalated");
order.add("Assigned");
order.add("New");
order.add("Gone");
return CodeDxDiffSummary.getDiffSummary(getPreviousStatusStats(),
result.getStatistics("status"), "Status", new DiffGroupComparator(order), new HashMap<String,String>());
}
public CodeDxResult getResult(){
return this.result;
}
private CodeDxReportStatistics getPreviousSeverityStats(){
CodeDxResult previous = this.getPreviousResult();
if(previous == null){
return null;
}else{
return previous.getStatistics("severity");
}
}
private CodeDxReportStatistics getPreviousStatusStats(){
CodeDxResult previous = this.getPreviousResult();
if(previous == null){
return null;
}else{
return previous.getStatistics("status");
}
}
CodeDxResult getPreviousResult(){
CodeDxBuildAction previousAction = this.getPreviousAction();
CodeDxResult previousResult = null;
if(previousAction != null){
previousResult = previousAction.getResult();
}
return previousResult;
}
/**
* Get the previous valid and non-empty action.
*
* @return the action or null
*/
CodeDxBuildAction getPreviousAction(){
if(this.build == null){
return null;
}
AbstractBuild<?,?> previousBuild = this.build.getPreviousBuild();
while(previousBuild != null){
CodeDxBuildAction action = previousBuild
.getAction(CodeDxBuildAction.class);
if (action != null) {
CodeDxResult result = action.getResult();
if(result != null && !result.isEmpty()) {
return action;
}
}
previousBuild = previousBuild.getPreviousBuild();
}
return null;
}
public AbstractBuild<?,?> getBuild(){
return this.build;
}
public Object getTarget() {
return this.result;
}
}