Paul Martin
2016-04-30 a502d96a860456ec5e8c96761db70f7cabb74751
src/main/java/com/gitblit/wicket/pages/MetricsPage.java
@@ -15,34 +15,32 @@
 */
package com.gitblit.wicket.pages;
import java.awt.Color;
import java.awt.Dimension;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.basic.Label;
import org.eclipse.jgit.lib.Repository;
import org.wicketstuff.googlecharts.Chart;
import org.wicketstuff.googlecharts.ChartAxis;
import org.wicketstuff.googlecharts.ChartAxisType;
import org.wicketstuff.googlecharts.ChartProvider;
import org.wicketstuff.googlecharts.ChartType;
import org.wicketstuff.googlecharts.IChartData;
import org.wicketstuff.googlecharts.LineStyle;
import org.wicketstuff.googlecharts.MarkerType;
import org.wicketstuff.googlecharts.ShapeMarker;
import com.gitblit.models.Metric;
import com.gitblit.utils.MetricUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.CacheControl.LastModified;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.charting.Chart;
import com.gitblit.wicket.charting.Charts;
import com.gitblit.wicket.charting.Flotr2Charts;
@CacheControl(LastModified.REPOSITORY)
public class MetricsPage extends RepositoryPage {
   public MetricsPage(PageParameters params) {
@@ -63,73 +61,71 @@
               MessageFormat.format(getString("gb.branchStats"), metricsTotal.count,
                     metricsTotal.tag, getTimeUtils().duration(metricsTotal.duration))));
      }
      insertLinePlot("commitsChart", metrics);
      insertBarPlot("dayOfWeekChart", getDayOfWeekMetrics(r, objectId));
      insertPieChart("authorsChart", getAuthorMetrics(r, objectId));
      Charts charts =  new Flotr2Charts();
      add(WicketUtils.newBlankImage("commitsChart"));
      add(WicketUtils.newBlankImage("dayOfWeekChart"));
      add(WicketUtils.newBlankImage("authorsChart"));
      createLineChart(charts, "commitsChart", metrics);
      createBarChart(charts, "dayOfWeekChart", getDayOfWeekMetrics(r, objectId));
      createPieChart(charts, "authorsChart", getAuthorMetrics(r, objectId));
      add(new HeaderContributor(charts));
   }
   private void insertLinePlot(String wicketId, List<Metric> metrics) {
   private void createLineChart(Charts charts, String id, List<Metric> metrics) {
      if ((metrics != null) && (metrics.size() > 0)) {
         IChartData data = WicketUtils.getChartData(metrics);
         ChartProvider provider = new ChartProvider(new Dimension(400, 100), ChartType.LINE,
               data);
         ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
         dateAxis.setLabels(new String[] { metrics.get(0).name,
               metrics.get(metrics.size() / 2).name, metrics.get(metrics.size() - 1).name });
         provider.addAxis(dateAxis);
         ChartAxis commitAxis = new ChartAxis(ChartAxisType.LEFT);
         commitAxis.setLabels(new String[] { "",
               String.valueOf((int) WicketUtils.maxValue(metrics)) });
         provider.addAxis(commitAxis);
         provider.setLineStyles(new LineStyle[] { new LineStyle(2, 4, 0), new LineStyle(0, 4, 1) });
         provider.addShapeMarker(new ShapeMarker(MarkerType.CIRCLE, Color.decode("#002060"), 1, -1, 5));
         add(new Chart(wicketId, provider));
      } else {
         add(WicketUtils.newBlankImage(wicketId));
         Chart chart = charts.createLineChart(id, "", "day",
               getString("gb.commits"));
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
         String displayFormat = "MMM dd";
         if(metrics.size() > 0 && metrics.get(0).name.length() == 7){
            df = new SimpleDateFormat("yyyy-MM");
            displayFormat = "yyyy MMM";
         }
         df.setTimeZone(getTimeZone());
         chart.setDateFormat(displayFormat);
         for (Metric metric : metrics) {
            Date date;
            try {
               date = df.parse(metric.name);
            } catch (ParseException e) {
               logger.error("Unable to parse date: " + metric.name);
               return;
            }
            chart.addValue(date, (int)metric.count);
            if(metric.tag > 0 ){
               chart.addHighlight(date, (int)metric.count);
            }
         }
         charts.addChart(chart);
      }
   }
   private void insertBarPlot(String wicketId, List<Metric> metrics) {
   private void createPieChart(Charts charts, String id, List<Metric> metrics) {
      if ((metrics != null) && (metrics.size() > 0)) {
         IChartData data = WicketUtils.getChartData(metrics);
         ChartProvider provider = new ChartProvider(new Dimension(400, 100),
               ChartType.BAR_VERTICAL_SET, data);
         ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
         List<String> labels = new ArrayList<String>();
         Chart chart = charts.createPieChart(id, "", "day",
               getString("gb.commits"));
         for (Metric metric : metrics) {
            labels.add(metric.name);
            chart.addValue(metric.name, (int)metric.count);
         }
         dateAxis.setLabels(labels.toArray(new String[labels.size()]));
         provider.addAxis(dateAxis);
         ChartAxis commitAxis = new ChartAxis(ChartAxisType.LEFT);
         commitAxis.setLabels(new String[] { "",
               String.valueOf((int) WicketUtils.maxValue(metrics)) });
         provider.addAxis(commitAxis);
         add(new Chart(wicketId, provider));
      } else {
         add(WicketUtils.newBlankImage(wicketId));
         charts.addChart(chart);
      }
   }
   private void insertPieChart(String wicketId, List<Metric> metrics) {
   private void createBarChart(Charts charts, String id, List<Metric> metrics) {
      if ((metrics != null) && (metrics.size() > 0)) {
         IChartData data = WicketUtils.getChartData(metrics);
         List<String> labels = new ArrayList<String>();
         Chart chart = charts.createBarChart(id, "", "day",
               getString("gb.commits"));
         for (Metric metric : metrics) {
            labels.add(metric.name);
            chart.addValue(metric.name, (int)metric.count);
         }
         ChartProvider provider = new ChartProvider(new Dimension(800, 200), ChartType.PIE, data);
         provider.setPieLabels(labels.toArray(new String[labels.size()]));
         add(new Chart(wicketId, provider));
      } else {
         add(WicketUtils.newBlankImage(wicketId));
         charts.addChart(chart);
      }
   }
@@ -181,7 +177,12 @@
   protected String getPageName() {
      return getString("gb.metrics");
   }
   @Override
   protected boolean isCommitPage() {
      return true;
   }
   @Override
   protected Class<? extends BasePage> getRepoNavPageClass() {
      return SummaryPage.class;