提交 2971bce8 编写于 作者: V Vincent Latombe

Improved search to search within ItemGroups by looking at all items

contained in Jenkins instead of only direct members.

SuggestedItem has been modified to display more information about the
hierarchy of items where results are stored.
上级 f0192091
...@@ -25,9 +25,9 @@ ...@@ -25,9 +25,9 @@
package hudson.search; package hudson.search;
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
import hudson.Util; import hudson.Util;
import hudson.util.EditDistance; import hudson.util.EditDistance;
import java.io.IOException; import java.io.IOException;
import java.util.AbstractList; import java.util.AbstractList;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -39,6 +39,7 @@ import java.util.logging.Level; ...@@ -39,6 +39,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import org.kohsuke.stapler.Ancestor; import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
...@@ -340,7 +341,7 @@ public class Search { ...@@ -340,7 +341,7 @@ public class Search {
items.clear(); items.clear();
m.find(index,token,items); m.find(index,token,items);
for (SearchItem si : items) { for (SearchItem si : items) {
paths[w].add(new SuggestedItem(si)); paths[w].add(SuggestedItem.build(si));
LOGGER.log(Level.FINE, "found search item: {0}", si.getSearchName()); LOGGER.log(Level.FINE, "found search item: {0}", si.getSearchName());
} }
w++; w++;
......
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
*/ */
package hudson.search; package hudson.search;
import hudson.model.Item;
import hudson.model.ItemGroup;
/** /**
* One item of a search result. * One item of a search result.
* *
...@@ -76,6 +79,29 @@ public class SuggestedItem { ...@@ -76,6 +79,29 @@ public class SuggestedItem {
return buf.toString(); return buf.toString();
} }
private static SuggestedItem build(Item top) {
ItemGroup<? extends Item> parent = top.getParent();
if (parent instanceof Item) {
Item parentItem = (Item)parent;
return new SuggestedItem(build(parentItem), top);
}
return new SuggestedItem(top);
}
/**
* Given a SearchItem, builds a SuggestedItem hierarchy by looking up parent items (if applicable).
* This allows search results for items not contained within the same ItemGroup to be distinguished.
* @param si
* @return
* @since XXX
*/
public static SuggestedItem build(SearchItem si) {
if (si instanceof Item) {
return build((Item)si);
}
return new SuggestedItem(si);
}
private void getUrl(StringBuilder buf) { private void getUrl(StringBuilder buf) {
if(parent!=null) { if(parent!=null) {
parent.getUrl(buf); parent.getUrl(buf);
......
...@@ -1821,8 +1821,8 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro ...@@ -1821,8 +1821,8 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro
.add("manage") .add("manage")
.add("log") .add("log")
.add(new CollectionSearchIndex<TopLevelItem>() { .add(new CollectionSearchIndex<TopLevelItem>() {
protected SearchItem get(String key) { return getItem(key); } protected SearchItem get(String key) { return getItemByFullName(key, TopLevelItem.class); }
protected Collection<TopLevelItem> all() { return getItems(); } protected Collection<TopLevelItem> all() { return getAllItems(TopLevelItem.class); }
}) })
.add(getPrimaryView().makeSearchIndex()) .add(getPrimaryView().makeSearchIndex())
.add(new CollectionSearchIndex() {// for computers .add(new CollectionSearchIndex() {// for computers
......
...@@ -43,6 +43,7 @@ import org.junit.Test; ...@@ -43,6 +43,7 @@ import org.junit.Test;
import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.JenkinsRule.WebClient;
import org.jvnet.hudson.test.MockFolder;
import com.gargoylesoftware.htmlunit.AlertHandler; import com.gargoylesoftware.htmlunit.AlertHandler;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
...@@ -257,6 +258,17 @@ public class SearchTest { ...@@ -257,6 +258,17 @@ public class SearchTest {
assertTrue(suggest(j.jenkins.getSearchIndex(),"foo").contains(p)); assertTrue(suggest(j.jenkins.getSearchIndex(),"foo").contains(p));
} }
@Test
public void testSearchWithinFolders() throws Exception {
MockFolder folder1 = j.createFolder("folder1");
FreeStyleProject p1 = folder1.createProject(FreeStyleProject.class, "myjob");
MockFolder folder2 = j.createFolder("folder2");
FreeStyleProject p2 = folder2.createProject(FreeStyleProject.class, "myjob");
List<SearchItem> suggest = suggest(j.jenkins.getSearchIndex(), "myjob");
assertTrue(suggest.contains(p1));
assertTrue(suggest.contains(p2));
}
private List<SearchItem> suggest(SearchIndex index, String term) { private List<SearchItem> suggest(SearchIndex index, String term) {
List<SearchItem> result = new ArrayList<SearchItem>(); List<SearchItem> result = new ArrayList<SearchItem>();
index.suggest(term, result); index.suggest(term, result);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册