/* 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.ModelObject; import hudson.model.Project; import hudson.util.ChartUtil; import hudson.util.DataSetBuilder; import hudson.util.ShiftedCategoryAxis; import java.awt.BasicStroke; import java.awt.Color; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import org.codeviation.model.CompilationStatus; import org.codeviation.model.Repository; 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.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; /** * * @author pzajac */ public class RepositoryView implements ModelObject { public Repository repository; public Project project; public List<SourceRootView> getSourceRootViews() { List<SourceRootView> srcRoots = new ArrayList<SourceRootView>(); for (SourceRoot srcRoot : repository.getSourceRoots()) { srcRoots.add(new SourceRootView(srcRoot,project)); } return srcRoots; } public RepositoryView(Repository repository,Project project) { this.repository = repository; this.project = project; } public static String getSourceRootUrl(String name) { return name.replace('/', '.'); } public String getDisplayName() { return (repository != null) ? repository.getName() : "Invalid repository" ; } public Set<String> getTags() { if (repository != null) { return repository.getAllTags() ; } else { return Collections.emptySet(); } } public SourceRootView getDynamic(String token, StaplerRequest req, StaplerResponse rsp ) throws IOException { String path = req.getOriginalRequestURI(); int index2 = path.lastIndexOf('/'); int index = path.lastIndexOf('/',index2 - 1); JavaFileIterableView.updateGraphType(req, rsp); String decodedToken = SourceRootView.decodeUrl(token); SourceRoot srcRoot = null; if (decodedToken != null && repository != null) { srcRoot = repository.getSourceRoot(decodedToken); } return (srcRoot != null) ? new SourceRootView(srcRoot,project) : null; } static Logger getLogger() { return Logger.getLogger(Repository.class.getName()); } public void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException { CompilationStatus cs = repository.getCompilationStatus(); List<String> tags = new ArrayList<String>(cs.getTags()); // sort tags Collections.sort(tags,new Comparator<String>() { public int compare(String o1, String o2) { Date date1 = repository.getTagDate(o2); Date date2 = repository.getTagDate(o2); if (date1 != null) { return date1.compareTo(date2); } return 0; } }); // create charts DataSetBuilder<String,String> dsb = new DataSetBuilder<String,String>(); int max = 1; int passed = 0; int failures = 0; for( String tag : tags ) { passed = 0; failures = 0; Map<String,Boolean> statuses = cs.getSourceRootCompilationStatuses(tag); for (Map.Entry<String,Boolean> entry : statuses.entrySet()) { if (entry.getValue()) { passed++; } else { failures++; } } dsb.add( passed, "passed", tag); dsb.add( failures, "errors", tag); } max = Math.max(max, passed); max = Math.max(max,failures); ChartUtil.generateGraph(req,rsp,createChart(dsb.build(),max),400,200); } private JFreeChart createChart(CategoryDataset dataset,int max) { final JFreeChart chart = ChartFactory.createLineChart( null, // chart title null, // unused "counts", // 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(max*1.2); 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; } }