package hudson.plugins.analysis.dashboard;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.google.common.collect.Lists;
import hudson.model.Job;
import hudson.plugins.analysis.core.ResultAction;
import hudson.plugins.analysis.core.AbstractProjectAction;
import hudson.plugins.analysis.graph.BuildResultGraph;
import hudson.plugins.analysis.graph.GraphConfiguration;
import hudson.plugins.analysis.graph.NullGraph;
import hudson.util.Graph;
/**
* A portlet that shows a trend graph of the warnings in the selected jobs.
*
* @author Ulli Hafner
*/
public abstract class AbstractWarningsGraphPortlet extends AbstractPortlet {
/** The configuration of the graph. */
private transient GraphConfiguration configuration;
/** Width of the graph. */
private final String width;
/** Height of the graph. */
private final String height;
/** Number of days to consider. */
private final String dayCountString;
/**
* Creates a new instance of {@link AbstractWarningsGraphPortlet}. Note that
* each instance must configure its graph in the constructor.
*
* @param name
* the name of the portlet
* @param width
* width of the graph
* @param height
* height of the graph
* @param dayCountString
* number of days to consider
* @see #configureGraph(BuildResultGraph) configures the graph
*/
public AbstractWarningsGraphPortlet(final String name, final String width, final String height, final String dayCountString) {
super(name);
this.width = width;
this.height = height;
this.dayCountString = dayCountString;
configureGraph(new NullGraph());
}
/**
* Configures the graph configuration.
*
* @param graph
* the graph to show
*/
protected final void configureGraph(final BuildResultGraph graph) {
configuration = new GraphConfiguration(graph);
configuration.initializeFrom(width, height, dayCountString);
}
/**
* Returns the description of the trend graph.
*
* @return the description
*/
public String getDescription() {
return String.format("[%s ...]",
StringUtils.defaultString(getDescriptor().getDisplayName()));
}
/**
* Restores the configuration after deserialization.
*
* @return this instance
*/
private Object readResolve() {
configureGraph(getGraphType());
return this;
}
/**
* Returns the graph type of this portlet.
*
* @return the graph type of this portlet
*/
protected abstract BuildResultGraph getGraphType();
/**
* Returns the trend graph for specified jobs.
*
* @return the trend graph
*/
public Graph getWarningsGraph() {
List<ResultAction<?>> results = getActions();
BuildResultGraph graph;
if (results.isEmpty()) {
graph = new NullGraph();
}
else {
graph = configuration.getGraphType();
}
return graph.getGraph(-1, configuration, getPluginName(), results);
}
/**
* Returns the name of the plug-in that is used to create the link to the results.
*
* @return the name of the plug-in
*/
protected abstract String getPluginName();
/**
* Checks if the results are empty.
*
* @return <code>true</code> if the results are empty, <code>false</code> otherwise
*/
public boolean isEmpty() {
return getActions().isEmpty();
}
/**
* Returns the actions that should be used as base for the graph.
*
* @return the actions that should be used as base for the graph
*/
private List<ResultAction<?>> getActions() {
List<ResultAction<?>> results = Lists.newArrayList();
for (Job<?, ?> job : getDashboard().getJobs()) {
AbstractProjectAction<?> action = selectAction(job);
if (action != null && action.hasValidResults()) {
results.add(action.getLastAction());
}
}
return results;
}
/**
* Selects the action to show the results from. This default implementation
* simply returns the first action that matches the given type.
*
* @param job
* the job to get the action from
* @return the action
*/
protected AbstractProjectAction<?> selectAction(final Job<?, ?> job) {
return job.getAction(getAction());
}
/**
* Returns the height.
*
* @return the height
*/
public int getHeight() {
return configuration.getHeight();
}
/**
* Returns the width.
*
* @return the width
*/
public int getWidth() {
return configuration.getWidth();
}
/**
* Returns the number of days to consider.
*
* @return the number of days to consider
*/
public String getDayCountString() {
return configuration.getDayCount() > 0 ? Integer.toString(configuration.getDayCount()) : StringUtils.EMPTY;
}
}