package hudson.plugins.testabilityexplorer.report;
import hudson.model.AbstractProject;
import hudson.model.AbstractBuild;
import hudson.model.ProminentProjectAction;
import hudson.plugins.testabilityexplorer.helpers.AbstractProjectAction;
import hudson.plugins.testabilityexplorer.report.costs.Statistic;
import hudson.plugins.testabilityexplorer.PluginImpl;
import java.util.Collections;
import java.util.Collection;
import java.io.IOException;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import javax.servlet.http.HttpServletResponse;
/**
* Base class for project reports.
*
* @author reik.schatz
*/
public abstract class AbstractProjectReport<T extends AbstractProject<?, ?>> extends AbstractProjectAction<T> implements ProminentProjectAction
{
public AbstractProjectReport(T project)
{
super(project);
}
/** {@inheritDoc} */
public String getIconFileName()
{
AbstractBuildReport action = getApplicableBuildAction();
return action != null ? PluginImpl.ICON_FILE_NAME : null;
}
/** {@inheritDoc} */
public String getDisplayName()
{
AbstractBuildReport action = getApplicableBuildAction();
return action != null ? PluginImpl.DISPLAY_NAME : null;
}
/** {@inheritDoc} */
public String getUrlName()
{
AbstractBuildReport action = getApplicableBuildAction();
return action != null ? PluginImpl.URL : null;
}
/** {@inheritDoc} */
public String getSearchUrl()
{
return PluginImpl.URL;
}
public Collection<Statistic> getResults()
{
AbstractBuildReport action = getApplicableBuildAction();
return action != null ? action.getResults() : Collections.emptySet();
}
public int getTotals()
{
AbstractBuildReport action = getApplicableBuildAction();
return action != null ? action.getTotals() : 0;
}
/**
* Returns the first applicable {@link AbstractBuildReport} action in any of the
* previous build. May return {@code null}.
*
* @return AbstractBuildReport or {@code null}
*/
protected AbstractBuildReport getApplicableBuildAction()
{
for (AbstractBuild<?, ?> build = getProject().getLastBuild(); build != null; build = build.getPreviousBuild())
{
final AbstractBuildReport action = build.getAction(getBuildActionClass());
if (action != null)
{
return action;
}
}
return null;
}
/**
* Returns a {@link AbstractBuildReport} for rendering.
* @return AbstractBuildReport
*/
protected abstract Class<? extends AbstractBuildReport> getBuildActionClass();
}