From 3d0494ad6db80843add9bf9d6eac783a691ac5a1 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 09 Mar 2012 20:45:52 -0500
Subject: [PATCH] More Lucene progress

---
 src/com/gitblit/wicket/pages/LucenePage.java |   80 ++++++++++++++++++++++++++++++++++-----
 1 files changed, 69 insertions(+), 11 deletions(-)

diff --git a/src/com/gitblit/wicket/pages/LucenePage.java b/src/com/gitblit/wicket/pages/LucenePage.java
index 47f731c..c269c8e 100644
--- a/src/com/gitblit/wicket/pages/LucenePage.java
+++ b/src/com/gitblit/wicket/pages/LucenePage.java
@@ -20,7 +20,8 @@
 
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.ListMultipleChoice;
+import org.apache.wicket.markup.html.form.StatelessForm;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.data.DataView;
@@ -29,6 +30,7 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Repository;
 
+import com.gitblit.Constants.SearchType;
 import com.gitblit.GitBlit;
 import com.gitblit.models.SearchResult;
 import com.gitblit.utils.LuceneUtils;
@@ -50,6 +52,18 @@
 
 	private void setup(PageParameters params) {
 		setupPage("", "");
+		
+		String repository = null;		
+		String value = null;
+		com.gitblit.Constants.SearchType searchType = null;
+
+		if (params != null) {
+			repository = WicketUtils.getRepositoryName(params);
+			value = WicketUtils.getSearchString(params);
+			String type = WicketUtils.getSearchType(params);
+			searchType = com.gitblit.Constants.SearchType.forName(type);
+		}
+		
 		final List<SearchResult> results = new ArrayList<SearchResult>();
 		ListDataProvider<SearchResult> resultsDp = new ListDataProvider<SearchResult>(results);
 		final DataView<SearchResult> resultsView = new DataView<SearchResult>("searchResults", resultsDp) {
@@ -86,26 +100,70 @@
 			}
 		};		
 		
+		// initial query
 		final Model<String> fragment = new Model<String>();
-		Form<Void> form = new Form<Void>("searchForm") {
+		if (!StringUtils.isEmpty(value)) {
+			if (searchType == SearchType.COMMIT) {
+				fragment.setObject("type:" + searchType.name().toLowerCase() + " AND \"" + value + "\"");	
+			} else {
+				fragment.setObject(searchType.name().toLowerCase() + ":\"" + value + "\"");
+			}
+		}
+		
+		// selected repositories
+		final Model<ArrayList<String>> repositories = new Model<ArrayList<String>>();
+		if (!StringUtils.isEmpty(repository)) {			
+			ArrayList<String> list = new ArrayList<String>();
+			list.add(repository);
+			repositories.setObject(list);
+		}
+		
+		// search form
+		StatelessForm<Void> form = new StatelessForm<Void>("searchForm") {
+			
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onSubmit() {
 				String f = fragment.getObject();
-				List<Repository> repositories = new ArrayList<Repository>();
-				for (String r : GitBlit.self().getRepositoryList()) {
-					repositories.add(GitBlit.self().getRepository(r));
+				if (StringUtils.isEmpty(f)) {
+					error("Query is empty!");
+					return;
+				}				
+				if (repositories.getObject().size() == 0) {
+					error("Please select one or more repositories!");
+					return;
 				}
-				List<SearchResult> srs = LuceneUtils.search(f, 100, repositories.toArray(new Repository[repositories.size()]));
 				results.clear();
-				results.addAll(srs);
-				for (Repository r : repositories) {
-					r.close();
-				}
+				results.addAll(search(repositories, fragment));
 				resultsView.setVisible(true);
 			}
 		};
+		ListMultipleChoice<String> selections = new ListMultipleChoice<String>("repositories", repositories, GitBlit.self().getRepositoryList());
+		selections.setMaxRows(11);
+		form.add(selections);
 		form.add(new TextField<String>("fragment", fragment));
 		add(form);
-		add(resultsView.setVisible(false));
+		if (!StringUtils.isEmpty(repository) && !StringUtils.isEmpty(fragment.getObject())) {
+			// search is defined by url parameters
+			results.clear();
+			results.addAll(search(repositories, fragment));
+			add(resultsView.setVisible(true));
+		} else {
+			// no pre-defined search
+			add(resultsView.setVisible(false));
+		}
+	}
+	
+	private List<SearchResult> search(Model<ArrayList<String>> repositories, Model<String> fragment) {
+		List<Repository> repos = new ArrayList<Repository>();
+		for (String r : repositories.getObject()) {
+			repos.add(GitBlit.self().getRepository(r));
+		}
+		List<SearchResult> srs = LuceneUtils.search(fragment.getObject(), 100, repos.toArray(new Repository[repos.size()]));
+		for (Repository r : repos) {
+			r.close();
+		}
+		return srs;
 	}
 }

--
Gitblit v1.9.1