James Moger
2011-12-29 bc57cd86db78fccf6b981375425d74bab540ad7b
Integrated selectable days back filtering in filters menu
6 files modified
251 ■■■■ changed files
src/com/gitblit/wicket/GitBlitWebApp.properties 3 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/PageRegistration.java 30 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ActivityPage.java 38 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoriesPage.java 34 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RootPage.java 143 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/DropDownMenu.java 3 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -207,4 +207,5 @@
gb.accessPermissionsForUserDescription = set team memberships or grant access to specific restricted repositories
gb.accessPermissionsForTeamDescription = set team members and grant access to specific restricted repositories
gb.federationRepositoryDescription = share this repository with other Gitblit servers
gb.hookScriptsDescription = run Groovy scripts on pushes to this Gitblit server
gb.hookScriptsDescription = run Groovy scripts on pushes to this Gitblit server
gb.reset = reset
src/com/gitblit/wicket/PageRegistration.java
@@ -76,6 +76,7 @@
        private static final long serialVersionUID = 1L;
        final PageParameters params;
        final String displayText;
        final String parameter;
        final String value;
@@ -87,6 +88,7 @@
            displayText = null;
            parameter = null;
            value = null;
            params = null;
        }
        /**
@@ -97,9 +99,33 @@
         * @param value
         */
        public DropDownMenuItem(String displayText, String parameter, String value) {
            this(displayText, parameter, value, null);
        }
        /**
         * Standard Menu Item constructor that preserves aggregate parameters.
         *
         * @param displayText
         * @param parameter
         * @param value
         */
        public DropDownMenuItem(String displayText, String parameter, String value,
                PageParameters params) {
            this.displayText = displayText;
            this.parameter = parameter;
            this.value = value;
            if (params == null) {
                this.params = new PageParameters();
            } else {
                this.params = new PageParameters(params);
            }
            if (!StringUtils.isEmpty(parameter)) {
                if (StringUtils.isEmpty(value)) {
                    this.params.remove(parameter);
                } else {
                    this.params.put(parameter, value);
                }
            }
        }
        public String formatParameter() {
@@ -109,6 +135,10 @@
            return parameter + "=" + value;
        }
        public PageParameters getPageParameters() {
            return params;
        }
        public boolean isDivider() {
            return displayText == null && value == null && parameter == null;
        }
src/com/gitblit/wicket/pages/ActivityPage.java
@@ -30,11 +30,13 @@
import org.apache.wicket.markup.html.basic.Label;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.Activity;
import com.gitblit.models.Metric;
import com.gitblit.models.RepositoryModel;
import com.gitblit.utils.ActivityUtils;
import com.gitblit.wicket.PageRegistration;
import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.charting.GoogleChart;
@@ -94,12 +96,37 @@
            add(new ActivityPanel("activityPanel", recentActivity));
        }
    }
    @Override
    protected boolean reusePageParameters() {
        return true;
    }
    @Override
    protected void addDropDownMenus(List<PageRegistration> pages) {
        DropDownMenuRegistration menu = new DropDownMenuRegistration("gb.filters", ActivityPage.class);
        menu.menuItems.addAll(getFilterMenuItems());
        pages.add(menu);
        DropDownMenuRegistration filters = new DropDownMenuRegistration("gb.filters",
                ActivityPage.class);
        PageParameters currentParameters = getPageParameters();
        int daysBack = GitBlit.getInteger(Keys.web.activityDuration, 14);
        if (currentParameters.containsKey("db")) {
            daysBack = currentParameters.getInt("db");
        }
        if (daysBack < 1) {
            daysBack = 14;
        }
        // preserve time filter options on repository choices
        filters.menuItems.addAll(getRepositoryFilterItems(new PageParameters("db=" + daysBack)));
        // preserve repository filter options on time choices
        filters.menuItems.addAll(getTimeFilterItems(currentParameters));
        if (filters.menuItems.size() > 0) {
            // Reset Filter
            filters.menuItems.add(new DropDownMenuItem(getString("gb.reset"), null, null));
        }
        pages.add(filters);
    }
    /**
@@ -178,7 +205,7 @@
        return charts;
    }
    @Override
    protected void onBeforeRender() {
        if (GitBlit.isDebugMode()) {
@@ -187,6 +214,7 @@
        }
        super.onBeforeRender();
    }
    @Override
    protected void onAfterRender() {
        if (GitBlit.isDebugMode()) {
src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -35,6 +35,7 @@
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.PageRegistration;
import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.RepositoriesPanel;
@@ -49,6 +50,11 @@
    public RepositoriesPage(PageParameters params) {
        super(params);
        setup(params);
    }
    @Override
    protected boolean reusePageParameters() {
        return true;
    }
    private void setup(PageParameters params) {
@@ -85,8 +91,29 @@
    @Override
    protected void addDropDownMenus(List<PageRegistration> pages) {
        DropDownMenuRegistration menu = new DropDownMenuRegistration("gb.filters", RepositoriesPage.class);
        menu.menuItems.addAll(getFilterMenuItems());
        int daysBack = 0;
        PageParameters currentParameters = getPageParameters();
        if (currentParameters != null && currentParameters.containsKey("db")) {
            daysBack = currentParameters.getInt("db");
        }
        PageParameters params = null;
        if (daysBack > 0) {
            params = new PageParameters("db=" + daysBack);
        }
        DropDownMenuRegistration menu = new DropDownMenuRegistration("gb.filters",
                RepositoriesPage.class);
        // preserve time filter option on repository choices
        menu.menuItems.addAll(getRepositoryFilterItems(params));
        // preserve repository filter option on time choices
        menu.menuItems.addAll(getTimeFilterItems(currentParameters));
        if (menu.menuItems.size() > 0) {
            // Reset Filter
            menu.menuItems.add(new DropDownMenuItem(getString("gb.reset"), null, null));
        }
        pages.add(menu);
    }
@@ -129,7 +156,7 @@
        }
        return message;
    }
    @Override
    protected void onBeforeRender() {
        if (GitBlit.isDebugMode()) {
@@ -138,6 +165,7 @@
        }
        super.onBeforeRender();
    }
    @Override
    protected void onAfterRender() {
        if (GitBlit.isDebugMode()) {
src/com/gitblit/wicket/pages/RootPage.java
@@ -17,8 +17,12 @@
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -94,7 +98,8 @@
        // navigation links
        List<PageRegistration> pages = new ArrayList<PageRegistration>();
        pages.add(new PageRegistration("gb.repositories", RepositoriesPage.class, getRootPageParameters()));
        pages.add(new PageRegistration("gb.repositories", RepositoriesPage.class,
                getRootPageParameters()));
        pages.add(new PageRegistration("gb.activity", ActivityPage.class, getRootPageParameters()));
        if (showAdmin) {
            pages.add(new PageRegistration("gb.users", UsersPage.class));
@@ -163,14 +168,21 @@
        super.setupPage(repositoryName, pageName);
    }
    private PageParameters getRootPageParameters() {
        PageParameters params = getPageParameters();
        if (params != null) {
            // remove named repository parameter
            params.remove("r");
        if (reusePageParameters()) {
            PageParameters params = getPageParameters();
            if (params != null) {
                // remove named repository parameter
                params.remove("r");
            }
            return params;
        }
        return params;
        return null;
    }
    protected boolean reusePageParameters() {
        return false;
    }
    private void loginUser(UserModel user) {
@@ -195,7 +207,7 @@
    }
    protected List<DropDownMenuItem> getFilterMenuItems() {
    protected List<DropDownMenuItem> getRepositoryFilterItems(PageParameters params) {
        final UserModel user = GitBlitWebSession.get().getUser();
        Set<DropDownMenuItem> filters = new LinkedHashSet<DropDownMenuItem>();
        List<RepositoryModel> repositories = GitBlit.self().getRepositoryModels(user);
@@ -217,7 +229,7 @@
            Collections.sort(sets);
            for (String set : sets) {
                filters.add(new DropDownMenuItem(MessageFormat.format("{0} ({1})", set,
                        setMap.get(set).get()), "set", set));
                        setMap.get(set).get()), "set", set, params));
            }
            // divider
            filters.add(new DropDownMenuItem());
@@ -229,7 +241,7 @@
            Collections.sort(teams);
            for (TeamModel team : teams) {
                filters.add(new DropDownMenuItem(MessageFormat.format("{0} ({1})", team.name,
                        team.repositories.size()), "team", team.name));
                        team.repositories.size()), "team", team.name, params));
            }
            // divider
            filters.add(new DropDownMenuItem());
@@ -243,22 +255,33 @@
            for (String expression : expressions) {
                if (!StringUtils.isEmpty(expression)) {
                    addedExpression = true;
                    filters.add(new DropDownMenuItem(null, "x", expression));
                    filters.add(new DropDownMenuItem(null, "x", expression, params));
                }
            }
            // if we added any custom expressions, add a divider
            if (addedExpression) {
                filters.add(new DropDownMenuItem());
            }
        }
        if (filters.size() > 0) {
            // add All Repositories
            filters.add(new DropDownMenuItem(MessageFormat.format("{0} ({1})",
                    getString("gb.tokenJurDescription"), repositories.size()), null, null));
        }
        }
        return new ArrayList<DropDownMenuItem>(filters);
    }
    protected List<DropDownMenuItem> getTimeFilterItems(PageParameters params) {
        // days back choices - additive parameters
        int daysBack = GitBlit.getInteger(Keys.web.activityDuration, 14);
        if (daysBack < 1) {
            daysBack = 14;
        }
        List<DropDownMenuItem> items = new ArrayList<DropDownMenuItem>();
        Set<Integer> choicesSet = new HashSet<Integer>(Arrays.asList(daysBack, 14, 28, 60, 90, 180));
        List<Integer> choices = new ArrayList<Integer>(choicesSet);
        Collections.sort(choices);
        for (Integer db : choices) {
            String txt = "last " + db + (db.intValue() > 1 ? " days" : "day");
            items.add(new DropDownMenuItem(txt, "db", db.toString(), params));
        }
        items.add(new DropDownMenuItem());
        return items;
    }
    protected List<RepositoryModel> getRepositories(PageParameters params) {
@@ -267,74 +290,96 @@
            return GitBlit.self().getRepositoryModels(user);
        }
        boolean hasParameter = false;
        String repositoryName = WicketUtils.getRepositoryName(params);
        String set = WicketUtils.getSet(params);
        String regex = WicketUtils.getRegEx(params);
        String team = WicketUtils.getTeam(params);
        int daysBack = params.getInt("db", 0);
        List<RepositoryModel> models = null;
        List<RepositoryModel> availableModels = GitBlit.self().getRepositoryModels(user);
        Set<RepositoryModel> models = new HashSet<RepositoryModel>();
        if (!StringUtils.isEmpty(repositoryName)) {
            // try named repository
            models = new ArrayList<RepositoryModel>();
            RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
            if (user.canAccessRepository(model)) {
                models.add(model);
            hasParameter = true;
            for (RepositoryModel model : availableModels) {
                if (model.name.equalsIgnoreCase(repositoryName)) {
                    models.add(model);
                    break;
                }
            }
        }
        // get all user accessible repositories
        if (models == null) {
            models = GitBlit.self().getRepositoryModels(user);
        }
        if (!StringUtils.isEmpty(regex)) {
            // filter the repositories by the regex
            List<RepositoryModel> accessible = GitBlit.self().getRepositoryModels(user);
            List<RepositoryModel> matchingModels = new ArrayList<RepositoryModel>();
            hasParameter = true;
            Pattern pattern = Pattern.compile(regex);
            for (RepositoryModel aModel : accessible) {
                if (pattern.matcher(aModel.name).find()) {
                    matchingModels.add(aModel);
            for (RepositoryModel model : availableModels) {
                if (pattern.matcher(model.name).find()) {
                    models.add(model);
                }
            }
            models = matchingModels;
        } else if (!StringUtils.isEmpty(set)) {
        }
        if (!StringUtils.isEmpty(set)) {
            // filter the repositories by the specified sets
            hasParameter = true;
            List<String> sets = StringUtils.getStringsFromValue(set, ",");
            List<RepositoryModel> matchingModels = new ArrayList<RepositoryModel>();
            for (RepositoryModel model : models) {
            for (RepositoryModel model : availableModels) {
                for (String curr : sets) {
                    if (model.federationSets.contains(curr)) {
                        matchingModels.add(model);
                        models.add(model);
                    }
                }
            }
            models = matchingModels;
        } else if (!StringUtils.isEmpty(team)) {
        }
        if (!StringUtils.isEmpty(team)) {
            // filter the repositories by the specified teams
            hasParameter = true;
            List<String> teams = StringUtils.getStringsFromValue(team, ",");
            // need TeamModels first
            List<TeamModel> teamModels = new ArrayList<TeamModel>();
            for (String name : teams) {
                TeamModel model = GitBlit.self().getTeamModel(name);
                if (model != null) {
                    teamModels.add(model);
                TeamModel teamModel = GitBlit.self().getTeamModel(name);
                if (teamModel != null) {
                    teamModels.add(teamModel);
                }
            }
            // brute-force our way through finding the matching models
            List<RepositoryModel> matchingModels = new ArrayList<RepositoryModel>();
            for (RepositoryModel repositoryModel : models) {
            for (RepositoryModel repositoryModel : availableModels) {
                for (TeamModel teamModel : teamModels) {
                    if (teamModel.hasRepository(repositoryModel.name)) {
                        matchingModels.add(repositoryModel);
                        models.add(repositoryModel);
                    }
                }
            }
            models = matchingModels;
        }
        return models;
        if (!hasParameter) {
            models.addAll(availableModels);
        }
        // time-filter the list
        if (daysBack > 0) {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);
            cal.add(Calendar.DATE, -1 * daysBack);
            Date threshold = cal.getTime();
            Set<RepositoryModel> timeFiltered = new HashSet<RepositoryModel>();
            for (RepositoryModel model : models) {
                if (model.lastChange.after(threshold)) {
                    timeFiltered.add(model);
                }
            }
            models = timeFiltered;
        }
        return new ArrayList<RepositoryModel>(models);
    }
}
src/com/gitblit/wicket/panels/DropDownMenu.java
@@ -15,7 +15,6 @@
 */
package com.gitblit.wicket.panels;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
@@ -46,7 +45,7 @@
                    WicketUtils.setCssClass(item, "divider");
                } else {
                    item.add(new LinkPanel("menuItem", null, entry.toString(), menu.pageClass,
                            new PageParameters(entry.formatParameter())).setRenderBodyOnly(true));
                            entry.getPageParameters()).setRenderBodyOnly(true));
                }
            }
        };