Paul Martin
2016-04-30 a502d96a860456ec5e8c96761db70f7cabb74751
src/main/java/com/gitblit/wicket/pages/ActivityPage.java
@@ -27,31 +27,34 @@
import org.apache.wicket.PageParameters;
import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Fragment;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.Activity;
import com.gitblit.models.Menu.ParameterMenuItem;
import com.gitblit.models.NavLink.DropDownPageMenuNavLink;
import com.gitblit.models.Metric;
import com.gitblit.models.NavLink;
import com.gitblit.models.RepositoryModel;
import com.gitblit.utils.ActivityUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.PageRegistration;
import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.CacheControl.LastModified;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.charting.GoogleChart;
import com.gitblit.wicket.charting.GoogleCharts;
import com.gitblit.wicket.charting.GoogleLineChart;
import com.gitblit.wicket.charting.GooglePieChart;
import com.gitblit.wicket.charting.Chart;
import com.gitblit.wicket.charting.Charts;
import com.gitblit.wicket.charting.Flotr2Charts;
import com.gitblit.wicket.panels.ActivityPanel;
/**
 * Activity Page shows a list of recent commits across all visible Gitblit
 * repositories.
 *
 *
 * @author James Moger
 *
 *
 */
@CacheControl(LastModified.ACTIVITY)
public class ActivityPage extends RootPage {
   public ActivityPage(PageParameters params) {
@@ -61,19 +64,42 @@
      // parameters
      int daysBack = WicketUtils.getDaysBack(params);
      if (daysBack < 1) {
         daysBack = 14;
         daysBack = app().settings().getInteger(Keys.web.activityDuration, 7);
      }
      String objectId = WicketUtils.getObject(params);
      // determine repositories to view and retrieve the activity
      List<RepositoryModel> models = getRepositories(params);
      List<Activity> recentActivity = ActivityUtils.getRecentActivity(models,
            daysBack, objectId, getTimeZone());
      List<Activity> recentActivity = ActivityUtils.getRecentActivity(
            app().settings(),
            app().repositories(),
            models,
            daysBack,
            objectId,
            getTimeZone());
      String headerPattern;
      if (daysBack == 1) {
         // today
         if (recentActivity.size() == 0) {
            headerPattern = getString("gb.todaysActivityNone");
         } else {
            headerPattern = getString("gb.todaysActivityStats");
         }
      } else {
         // multiple days
         if (recentActivity.size() == 0) {
            headerPattern = getString("gb.recentActivityNone");
         } else {
            headerPattern = getString("gb.recentActivityStats");
         }
      }
      if (recentActivity.size() == 0) {
         // no activity, skip graphs and activity panel
         add(new Label("subheader", MessageFormat.format(getString("gb.recentActivityNone"),
         add(new Label("subheader", MessageFormat.format(headerPattern,
               daysBack)));
         add(new Label("chartsPanel").setVisible(false));
         add(new Label("activityPanel"));
      } else {
         // calculate total commits and total authors
@@ -86,12 +112,17 @@
         int totalAuthors = uniqueAuthors.size();
         // add the subheader with stat numbers
         add(new Label("subheader", MessageFormat.format(getString("gb.recentActivityStats"),
         add(new Label("subheader", MessageFormat.format(headerPattern,
               daysBack, totalCommits, totalAuthors)));
         // create the activity charts
         GoogleCharts charts = createCharts(recentActivity);
         add(new HeaderContributor(charts));
         if (app().settings().getBoolean(Keys.web.generateActivityGraph, true)) {
            Charts charts = createCharts(recentActivity);
            add(new HeaderContributor(charts));
            add(new Fragment("chartsPanel", "chartsFragment", this));
         } else {
            add(new Label("chartsPanel").setVisible(false));
         }
         // add activity panel
         add(new ActivityPanel("activityPanel", recentActivity));
@@ -104,12 +135,12 @@
   }
   @Override
   protected void addDropDownMenus(List<PageRegistration> pages) {
      DropDownMenuRegistration filters = new DropDownMenuRegistration("gb.filters",
   protected void addDropDownMenus(List<NavLink> navLinks) {
      DropDownPageMenuNavLink filters = new DropDownPageMenuNavLink("gb.filters",
            ActivityPage.class);
      PageParameters currentParameters = getPageParameters();
      int daysBack = GitBlit.getInteger(Keys.web.activityDuration, 14);
      int daysBack = app().settings().getInteger(Keys.web.activityDuration, 7);
      if (currentParameters != null && !currentParameters.containsKey("db")) {
         currentParameters.put("db", daysBack);
      }
@@ -122,19 +153,19 @@
      if (filters.menuItems.size() > 0) {
         // Reset Filter
         filters.menuItems.add(new DropDownMenuItem(getString("gb.reset"), null, null));
         filters.menuItems.add(new ParameterMenuItem(getString("gb.reset")));
      }
      pages.add(filters);
      navLinks.add(filters);
   }
   /**
    * Creates the daily activity line chart, the active repositories pie chart,
    * and the active authors pie chart
    *
    *
    * @param recentActivity
    * @return
    */
   private GoogleCharts createCharts(List<Activity> recentActivity) {
   private Charts createCharts(List<Activity> recentActivity) {
      // activity metrics
      Map<String, Metric> repositoryMetrics = new HashMap<String, Metric>();
      Map<String, Metric> authorMetrics = new HashMap<String, Metric>();
@@ -161,45 +192,41 @@
         }
      }
      // build google charts
      int w = 310;
      int h = 150;
      GoogleCharts charts = new GoogleCharts();
      // build charts
      Charts charts = new Flotr2Charts();
      // sort in reverse-chronological order and then reverse that
      Collections.sort(recentActivity);
      Collections.reverse(recentActivity);
      // daily line chart
      GoogleChart chart = new GoogleLineChart("chartDaily", getString("gb.dailyActivity"), "day",
      Chart chart = charts.createLineChart("chartDaily", getString("gb.dailyActivity"), "day",
            getString("gb.commits"));
      SimpleDateFormat df = new SimpleDateFormat("MMM dd");
      df.setTimeZone(getTimeZone());
      for (Activity metric : recentActivity) {
         chart.addValue(df.format(metric.startDate), metric.getCommitCount());
         chart.addValue(metric.startDate, metric.getCommitCount());
      }
      chart.setWidth(w);
      chart.setHeight(h);
      charts.addChart(chart);
      // active repositories pie chart
      chart = new GooglePieChart("chartRepositories", getString("gb.activeRepositories"),
      chart = charts.createPieChart("chartRepositories", getString("gb.activeRepositories"),
            getString("gb.repository"), getString("gb.commits"));
      for (Metric metric : repositoryMetrics.values()) {
         chart.addValue(metric.name, metric.count);
      }
      chart.setWidth(w);
      chart.setHeight(h);
      chart.setShowLegend(false);
      String url = urlFor(SummaryPage.class, null).toString() + "?r=";
      chart.setClickUrl(url);
      charts.addChart(chart);
      // active authors pie chart
      chart = new GooglePieChart("chartAuthors", getString("gb.activeAuthors"),
      chart = charts.createPieChart("chartAuthors", getString("gb.activeAuthors"),
            getString("gb.author"), getString("gb.commits"));
      for (Metric metric : authorMetrics.values()) {
         chart.addValue(metric.name, metric.count);
      }
      chart.setWidth(w);
      chart.setHeight(h);
      chart.setShowLegend(false);
      charts.addChart(chart);
      return charts;