James Moger
2012-03-17 e28b2f68fc38e4976a0e8bc11af45834bbde940c
src/com/gitblit/wicket/pages/LucenePage.java
@@ -15,6 +15,7 @@
 */
package com.gitblit.wicket.pages;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
@@ -28,20 +29,20 @@
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.Model;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import com.gitblit.Constants.SearchType;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.SearchResult;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.LuceneUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.StringChoiceRenderer;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.PagerPanel;
public class LucenePage extends RootPage {
@@ -61,12 +62,16 @@
      // default values
      ArrayList<String> repositories = new ArrayList<String>();            
      String query = "";
      int page = 1;
      int pageSize = GitBlit.getInteger(Keys.web.itemsPerPage, 50);
      if (params != null) {
         String repository = WicketUtils.getRepositoryName(params);
         if (!StringUtils.isEmpty(repository)) {
            repositories.add(repository);
         }
         page = WicketUtils.getPage(params);
         
         if (params.containsKey("repositories")) {
            String value = params.getString("repositories", "");
@@ -90,9 +95,30 @@
         }
      }
      
      // display user-accessible selections
      UserModel user = GitBlitWebSession.get().getUser();
      List<String> availableRepositories = new ArrayList<String>();
      for (RepositoryModel model : GitBlit.self().getRepositoryModels(user)) {
         if (model.hasCommits && !ArrayUtils.isEmpty(model.indexedBranches)) {
            availableRepositories.add(model.name);
         }
      }
      if (availableRepositories.size() == 0) {
         info(getString("gb.noIndexedRepositoriesWarning"));
      }
      // enforce user-accessible repository selections
      ArrayList<String> searchRepositories = new ArrayList<String>();
      for (String selectedRepository : repositories) {
         if (availableRepositories.contains(selectedRepository)) {
            searchRepositories.add(selectedRepository);
         }
      }
      // search form
      final Model<String> queryModel = new Model<String>(query);
      final Model<ArrayList<String>> repositoriesModel = new Model<ArrayList<String>>(repositories);
      final Model<ArrayList<String>> repositoriesModel = new Model<ArrayList<String>>(searchRepositories);
      StatelessForm<Void> form = new StatelessForm<Void>("searchForm") {
         
         private static final long serialVersionUID = 1L;
@@ -101,11 +127,11 @@
         public void onSubmit() {
            String q = queryModel.getObject();
            if (StringUtils.isEmpty(q)) {
               error("Query is empty!");
               error(getString("gb.undefinedQueryWarning"));
               return;
            }            
            if (repositoriesModel.getObject().size() == 0) {
               error("Please select one or more repositories!");
               error(getString("gb.noSelectedRepositoriesWarning"));
               return;
            }
            PageParameters params = new PageParameters();
@@ -114,14 +140,7 @@
            setResponsePage(LucenePage.class, params);
         }
      };
      UserModel user = GitBlitWebSession.get().getUser();
      List<String> availableRepositories = new ArrayList<String>();
      for (RepositoryModel model : GitBlit.self().getRepositoryModels(user)) {
         if (model.hasCommits) {
            availableRepositories.add(model.name);
         }
      }
      ListMultipleChoice<String> selections = new ListMultipleChoice<String>("repositories", 
            repositoriesModel, availableRepositories, new StringChoiceRenderer());
      selections.setMaxRows(10);
@@ -131,7 +150,20 @@
            
      // execute search
      final List<SearchResult> results = new ArrayList<SearchResult>();
      results.addAll(search(repositories, query));
      if (!ArrayUtils.isEmpty(searchRepositories) && !StringUtils.isEmpty(query)) {
         results.addAll(GitBlit.self().search(query, page, pageSize, searchRepositories));
      }
      // results header
      if (results.size() == 0) {
         add(new Label("resultsHeader").setVisible(false));
         add(new Label("resultsCount").setVisible(false));
      } else {
         add(new Label("resultsHeader", query).setRenderBodyOnly(true));
         add(new Label("resultsCount", MessageFormat.format("results {0} - {1} ({2} hits)",
               results.get(0).hitId, results.get(results.size() - 1).hitId, results.get(0).totalHits)).
               setRenderBodyOnly(true));
      }
      
      // search results view
      ListDataProvider<SearchResult> resultsDp = new ListDataProvider<SearchResult>(results);
@@ -164,26 +196,74 @@
            }
            item.add(new Label("fragment", sr.fragment).setEscapeModelStrings(false).setVisible(!StringUtils.isEmpty(sr.fragment)));
            item.add(new LinkPanel("repository", null, sr.repository, SummaryPage.class, WicketUtils.newRepositoryParameter(sr.repository)));
            item.add(new LinkPanel("branch", "branch", StringUtils.getRelativePath(Constants.R_HEADS, sr.branch), LogPage.class, WicketUtils.newObjectParameter(sr.repository, sr.branch)));
            if (StringUtils.isEmpty(sr.branch)) {
               item.add(new Label("branch", "null"));
            } else {
               item.add(new LinkPanel("branch", "branch", StringUtils.getRelativePath(Constants.R_HEADS, sr.branch), LogPage.class, WicketUtils.newObjectParameter(sr.repository, sr.branch)));
            }
            item.add(new Label("author", sr.author));
            item.add(WicketUtils.createDatestampLabel("date", sr.date, getTimeZone()));
         }
      };
      add(resultsView.setVisible(results.size() > 0));
      PageParameters pagerParams = new PageParameters();
      pagerParams.put("repositories", StringUtils.flattenStrings(repositoriesModel.getObject()));
      pagerParams.put("query", queryModel.getObject());
      int totalPages = 0;
      if (results.size() > 0) {
         totalPages = (results.get(0).totalHits / pageSize) + (results.get(0).totalHits % pageSize > 0 ? 1 : 0);
      }
      add(new PagerPanel("topPager", page, totalPages, LucenePage.class, pagerParams));
      add(new PagerPanel("bottomPager", page, totalPages, LucenePage.class, pagerParams));
   }
   
   private List<SearchResult> search(List<String> repositories, String query) {
      if (ArrayUtils.isEmpty(repositories) || StringUtils.isEmpty(query)) {
         return new ArrayList<SearchResult>();
      }
      List<Repository> repos = new ArrayList<Repository>();
      for (String r : repositories) {
         repos.add(GitBlit.self().getRepository(r));
      }
      List<SearchResult> srs = LuceneUtils.search(query, 100, repos.toArray(new Repository[repos.size()]));
      for (Repository r : repos) {
         r.close();
      }
      return srs;
   }
//   private String buildPager(int currentPage, int count, int total) {
//      int pages = (total / count) + (total % count == 0 ? 0 : 1);
//
//      // pages are 1-indexed
//      // previous page link
//      if (currentPage <= 1) {
//         sb.append(MessageFormat.format(li, "disabled", "#", "&larr;"));
//      } else {
//         List<String> parameters = new ArrayList<String>();
//         if (!StringUtils.isEmpty(penString)) {
//            parameters.add(penString);
//         }
//         parameters.add(MessageFormat.format(pg, currentPage - 1));
//         sb.append(MessageFormat.format(li, "", StringUtils.flattenStrings(parameters, "&"), "&larr;"));
//      }
//
//      // page links in middle
//      int minpage = Math.max(1, currentPage - Math.min(2, 2));
//      int maxpage = Math.min(pages, minpage + 4);
//      for (int i = minpage; i <= maxpage; i++) {
//         String cssClass = "";
//         if (i == currentPage) {
//            cssClass = "active";
//         }
//         List<String> parameters = new ArrayList<String>();
//         if (!StringUtils.isEmpty(penString)) {
//            parameters.add(penString);
//         }
//         parameters.add(MessageFormat.format(pg, i));
//         sb.append(MessageFormat.format(li, cssClass, StringUtils.flattenStrings(parameters, "&"), i));
//      }
//
//      // next page link
//      if (currentPage == pages) {
//         sb.append(MessageFormat.format(li, "disabled", "#", "&rarr;"));
//      } else {
//         List<String> parameters = new ArrayList<String>();
//         if (!StringUtils.isEmpty(penString)) {
//            parameters.add(penString);
//         }
//         parameters.add(MessageFormat.format(pg, currentPage + 1));
//         sb.append(MessageFormat.format(li, "", StringUtils.flattenStrings(parameters, "&"), "&rarr;"));
//      }
//      return sb.toString();
//   }
}