/* Copyright (c) 2007, http://www.codeviation.org project
* This program is made available under the terms of the MIT License.
*/
package hudson.plugins.codeviation;
import hudson.model.Action;
import hudson.model.Project;
import java.io.IOException;
import org.codeviation.model.Repository;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import hudson.util.ChartUtil;
import hudson.util.DataSetBuilder;
import hudson.util.ShiftedCategoryAxis;
import java.awt.BasicStroke;
import java.awt.Color;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.codeviation.model.SourceRoot;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;
import org.kohsuke.stapler.StaplerProxy;
/**
*
* @author pzajac
*/
public class MetricsAction implements Action,StaplerProxy {
Project prj;
String defaultMapping;
// String name = "namek";
public MetricsAction(Project prj) {
this.prj = prj;
}
List<SourceRoot> getSourceRoots() {
return getWrapper().getRepository().getSourceRoots();
}
public PAntWrapper getWrapper() {
return (PAntWrapper) prj.getBuildWrappers().get(hudson.plugins.codeviation.PAntWrapper.DESCRIPTOR);
}
public String getIconFileName() {
return "/plugin/codeviation/images/24x24/codeviation.png";
}
public String getDisplayName() {
return "Projects Metrics";
}
public String getUrlName() {
return "codeviation";
}
public void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException {
Repository rep = getWrapper().getRepository();
if(ChartUtil.awtProblemCause != null || rep == null) {
// not available. send out error message
rsp.sendRedirect2(req.getContextPath()+"/images/headless.png");
return;
}
//number of source roots
int max = 1;
Map<String,Integer> tagsMap = new TreeMap<String,Integer>();
for (SourceRoot src : rep.getSourceRoots()) {
for (String tag: src.getCvsTags()) {
Integer val = tagsMap.get(tag);
int newVal = 1;
if (val != null) {
newVal += val;
}
if (newVal > max) {
newVal = max;
}
tagsMap.put(tag,newVal);
}
}
DataSetBuilder<String,String> dsb = new DataSetBuilder<String,String>();
for (Map.Entry<String,Integer> entry : tagsMap.entrySet()) {
dsb.add(entry.getValue(), "number of sourceRoots", entry.getKey());
}
ChartUtil.generateGraph(req,rsp,createChart(dsb.build(),max),400,200);
}
private JFreeChart createChart(CategoryDataset dataset,int maxVal) {
final JFreeChart chart = ChartFactory.createLineChart(
null, // chart title
null, // unused
"count", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips
false // urls
);
// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
final LegendTitle legend = chart.getLegend();
legend.setPosition(RectangleEdge.RIGHT);
chart.setBackgroundPaint(Color.white);
final CategoryPlot plot = chart.getCategoryPlot();
// plot.setAxisOffset(new Spacer(Spacer.ABSOLUTE, 5.0, 5.0, 5.0, 5.0));
plot.setBackgroundPaint(Color.WHITE);
plot.setOutlinePaint(null);
plot.setRangeGridlinesVisible(true);
plot.setRangeGridlinePaint(Color.black);
CategoryAxis domainAxis = new ShiftedCategoryAxis(null);
plot.setDomainAxis(domainAxis);
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
domainAxis.setLowerMargin(0.0);
domainAxis.setUpperMargin(0.0);
domainAxis.setCategoryMargin(0.0);
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setUpperBound(maxVal);
rangeAxis.setLowerBound(0);
final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
renderer.setStroke(new BasicStroke(4.0f));
// crop extra space around the graph
plot.setInsets(new RectangleInsets(5.0,0,0,5.0));
return chart;
}
public Object getTarget() {
return new RepositoryView(getWrapper().getRepository(),prj);
}
}