James Moger
2011-05-11 dfb88962fdbd29f59abe92178bb042738d57c3e1
commit | author | age
5fe7df 1 package com.gitblit.wicket.pages;
JM 2
45c0d6 3 import java.awt.Color;
fc8426 4 import java.awt.Dimension;
45c0d6 5 import java.text.MessageFormat;
5fe7df 6 import java.util.List;
JM 7
8 import org.apache.wicket.PageParameters;
9 import org.apache.wicket.markup.html.basic.Label;
10 import org.eclipse.jgit.lib.Repository;
531cd2 11 import org.wicketstuff.googlecharts.AbstractChartData;
JM 12 import org.wicketstuff.googlecharts.Chart;
13 import org.wicketstuff.googlecharts.ChartAxis;
14 import org.wicketstuff.googlecharts.ChartAxisType;
15 import org.wicketstuff.googlecharts.ChartProvider;
16 import org.wicketstuff.googlecharts.ChartType;
17 import org.wicketstuff.googlecharts.IChartData;
18 import org.wicketstuff.googlecharts.LineStyle;
19 import org.wicketstuff.googlecharts.MarkerType;
20 import org.wicketstuff.googlecharts.ShapeMarker;
f5d0ad 21
87cc1e 22 import com.gitblit.GitBlit;
155bf7 23 import com.gitblit.Keys;
5fe7df 24 import com.gitblit.utils.JGitUtils;
45c0d6 25 import com.gitblit.utils.TimeUtils;
5fe7df 26 import com.gitblit.wicket.RepositoryPage;
bc10f9 27 import com.gitblit.wicket.WicketUtils;
fc8426 28 import com.gitblit.wicket.models.Metric;
698678 29 import com.gitblit.wicket.panels.BranchesPanel;
JM 30 import com.gitblit.wicket.panels.LogPanel;
31 import com.gitblit.wicket.panels.TagsPanel;
5fe7df 32
JM 33 public class SummaryPage extends RepositoryPage {
34
35     public SummaryPage(PageParameters params) {
cebf45 36         super(params);
155bf7 37
fb01c9 38         int numCommitsDef = 20;
JM 39         int numRefsDef = 5;
155bf7 40
87cc1e 41         int numberCommits = GitBlit.self().settings().getInteger(Keys.web.summaryCommitCount, numCommitsDef);
fb01c9 42         if (numberCommits <= 0) {
JM 43             numberCommits = numCommitsDef;
44         }
5fe7df 45
87cc1e 46         int numberRefs = GitBlit.self().settings().getInteger(Keys.web.summaryRefsCount, numRefsDef);
fb01c9 47         if (numberRefs <= 0) {
JM 48             numberRefs = numRefsDef;
49         }
155bf7 50
JM 51         Repository r = getRepository();
45c0d6 52         List<Metric> metrics = null;
JM 53         Metric metricsTotal = null;
54         if (GitBlit.self().settings().getBoolean(Keys.web.generateActivityGraph, true)) {
55             metrics = JGitUtils.getDateMetrics(r);
56             metricsTotal = metrics.remove(0);
ef5c58 57         }
5fe7df 58
JM 59         // repository description
f97bf0 60         add(new Label("repositoryDescription", getRepositoryModel().description));
JM 61         add(new Label("repositoryOwner", getRepositoryModel().owner));
155bf7 62
bc10f9 63         add(WicketUtils.createTimestampLabel("repositoryLastChange", JGitUtils.getLastChange(r), getTimeZone()));
45c0d6 64         if (metricsTotal == null) {
JM 65             add(new Label("repositoryStats", ""));
66         } else {
67             add(new Label("repositoryStats", MessageFormat.format("{0} commits and {1} tags in {2}", metricsTotal.count, metricsTotal.tag, TimeUtils.duration(metricsTotal.duration))));
68         }
87cc1e 69         add(new Label("repositoryCloneUrl", GitBlit.self().getCloneUrl(repositoryName)));
5fe7df 70
ef5c58 71         add(new LogPanel("commitsPanel", repositoryName, null, r, numberCommits, 0));
698678 72         add(new TagsPanel("tagsPanel", repositoryName, r, numberRefs));
cf9550 73         add(new BranchesPanel("branchesPanel", getRepositoryModel(), r, numberRefs));
155bf7 74
fc8426 75         // Display an activity line graph
ef5c58 76         insertActivityGraph(metrics);
5fe7df 77     }
155bf7 78
cebf45 79     @Override
JM 80     protected String getPageName() {
1e47ab 81         return getString("gb.summary");
cebf45 82     }
fc8426 83
ef5c58 84     private void insertActivityGraph(List<Metric> metrics) {
f5d0ad 85         if (metrics.size() > 0 && GitBlit.self().settings().getBoolean(Keys.web.generateActivityGraph, true)) {
ef5c58 86             IChartData data = getChartData(metrics);
fc8426 87
45c0d6 88             ChartProvider provider = new ChartProvider(new Dimension(400, 100), ChartType.LINE, data);
fc8426 89             ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
ef5c58 90             dateAxis.setLabels(new String[] { metrics.get(0).name, metrics.get(metrics.size() / 2).name, metrics.get(metrics.size() - 1).name });
fc8426 91             provider.addAxis(dateAxis);
JM 92
93             ChartAxis commitAxis = new ChartAxis(ChartAxisType.LEFT);
ef5c58 94             commitAxis.setLabels(new String[] { "", String.valueOf((int) maxValue(metrics)) });
fc8426 95             provider.addAxis(commitAxis);
JM 96
45c0d6 97             provider.setLineStyles(new LineStyle[] {new LineStyle(2, 4, 0), new LineStyle(0, 4, 1)});    
f5d0ad 98             provider.addShapeMarker(new ShapeMarker(MarkerType.CIRCLE, Color.BLUE, 1, -1, 5));
45c0d6 99             
fc8426 100             add(new Chart("commitsChart", provider));
JM 101         } else {
1e8390 102             add(WicketUtils.newBlankImage("commitsChart"));
fc8426 103         }
JM 104     }
105
ef5c58 106     protected IChartData getChartData(List<Metric> metrics) {
45c0d6 107         final double[] commits = new double[metrics.size()];
JM 108         final double[] tags = new double[metrics.size()];
fc8426 109         int i = 0;
JM 110         double max = 0;
ef5c58 111         for (Metric m : metrics) {
45c0d6 112             commits[i] = m.count;
JM 113             if (m.tag > 0) {
114                 tags[i] = m.count;
115             } else {
116                 tags[i] = -1d;
117             }
fc8426 118             max = Math.max(max, m.count);
45c0d6 119             i++;
fc8426 120         }
45c0d6 121         IChartData data = new AbstractChartData(max) {
fc8426 122             private static final long serialVersionUID = 1L;
JM 123
124             public double[][] getData() {
45c0d6 125                 return new double[][] { commits, tags };
fc8426 126             }
JM 127         };
128         return data;
129     }
130
131     protected String[] getNames(List<Metric> results) {
132         String[] names = new String[results.size()];
133         for (int i = 0; i < results.size(); i++) {
134             names[i] = results.get(i).name;
135         }
136         return names;
137     }
138
139     protected double maxValue(List<Metric> metrics) {
140         double max = Double.MIN_VALUE;
141         for (Metric m : metrics) {
142             if (m.count > max) {
143                 max = m.count;
144             }
145         }
146         return max;
147     }
5fe7df 148 }