search.jsp revision daba8f127bde81db38efd27fa72e7a0554de4987
e01a15b71e18bf2008aec7e75041ffa42eb80b80Kay SieversCDDL HEADER START
ebcd5d3acd4c470668bbcd945a5aa42f0af5ccf0Kay SieversThe contents of this file are subject to the terms of the
ebcd5d3acd4c470668bbcd945a5aa42f0af5ccf0Kay SieversCommon Development and Distribution License (the "License").
80037e4d17d0c8f28d0ff610902babc9e2b4e2f9Kay SieversYou may not use this file except in compliance with the License.
7c66aeba0f28cb82027d6015405ed71afa3b6059Kay SieversSee LICENSE.txt included in this distribution for the specific
7c66aeba0f28cb82027d6015405ed71afa3b6059Kay Sieverslanguage governing permissions and limitations under the License.
c904f64d84db8c4eebedf210ba10893f19ba05edLennart PoetteringWhen distributing Covered Code, include this CDDL HEADER in each
05677bb78079c3fa0283101aac2c07581f4873f1Lennart Poetteringfile and include the License file at LICENSE.txt.
73090dc815390f4fca4e3ed8a7e1d3806605daaaLennart PoetteringIf applicable, add the following below this CDDL HEADER, with the
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poetteringfields enclosed by brackets "[]" replaced with your own identifying
ddd88763921a1534081ed28e36f6712a85449005Lennart Poetteringinformation: Portions Copyright [yyyy] [name of copyright owner]
f957632b960a0a42999b38ded7089fa602b41745Kay SieversCDDL HEADER END
f957632b960a0a42999b38ded7089fa602b41745Kay SieversCopyright 2005 Sun Microsystems, Inc. All rights reserved.
9a36607584bbd1d78775353e022a51794b4e27b1Lennart PoetteringUse is subject to license terms.
a40593a0d0d740efa387e35411e1e456a6c5aba7Lennart Poetteringident "%Z%%M% %I% %E% SMI"
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering--%><%@ page import = "javax.servlet.*,
a0a3844815b0f346dba03f41245c620f432e462fLennart Poetteringorg.apache.lucene.search.spell.LuceneDictionary,
a0a3844815b0f346dba03f41245c620f432e462fLennart Poetteringorg.apache.lucene.search.spell.SpellChecker,
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart Poettering%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart PoetteringDate starttime = new Date();
a0a3844815b0f346dba03f41245c620f432e462fLennart PoetteringString defs = request.getParameter("defs");
25016cb67f22db15b6d2625177a5a2429dcaab66Lennart PoetteringString refs = request.getParameter("refs");
25016cb67f22db15b6d2625177a5a2429dcaab66Lennart PoetteringString hist = request.getParameter("hist");
4ee717820208a4c8e92383d0dbefa401827fab38Kay SieversString path = request.getParameter("path");
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers<%@ include file="projects.jspf" %>
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay SieversString sort = null;
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sieversfinal String LASTMODTIME = "lastmodtime";
b8217b7bd5fd171916a095b150fad4c3a37f5a41Kay Sieversfinal String RELEVANCY = "relevancy";
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay SieversCookie[] cookies = request.getCookies();
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sieversif (cookies != null) {
b8217b7bd5fd171916a095b150fad4c3a37f5a41Kay Sievers for (Cookie cookie : cookies) {
b8217b7bd5fd171916a095b150fad4c3a37f5a41Kay Sievers if (cookie.getName().equals("OpenGrok/sorting")) {
512dabcdc65eece0bcebb4f971ec34794be8d35dKay Sievers if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort)) {
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers sort = null;
3cc588803dba3530cd39000d299353a31e4c068bLennart PoetteringString sortParam = request.getParameter("sort");
3cc588803dba3530cd39000d299353a31e4c068bLennart Poetteringif (sortParam != null) {
3cc588803dba3530cd39000d299353a31e4c068bLennart Poettering if (LASTMODTIME.equals(sortParam)) {
3cc588803dba3530cd39000d299353a31e4c068bLennart Poettering sort = LASTMODTIME;
18b754d345ecb0b15e369978aaffa72e9814b86aKay Sievers } else if (RELEVANCY.equals(sortParam)) {
068665b6fd9839f27bcace7e8f56c0baa6935272Lennart Poettering sort = RELEVANCY;
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering if (sort != null) {
231931ffba1bca9d8759bbd6f797e56f8c6971faLennart Poettering Cookie cookie = new Cookie("OpenGrok/sorting", sort);
6ba383fa49e01302dfeae1f5083bb942b055628bLennart PoetteringHits hits = null;
bd08f2422491169e92dc0899d5ba848fcae4c15cLennart PoetteringString errorMsg = null;
71100051c5d351daac20610f3a4b8c14901088d8Lennart Poetteringif( q!= null && q.equals("")) q = null;
d3c7d7dd77b2b72315164b672462825cef6c0f9aKay Sieversif( defs != null && defs.equals("")) defs = null;
71100051c5d351daac20610f3a4b8c14901088d8Lennart Poetteringif( refs != null && refs.equals("")) refs = null;
fb0864e7b9c6d26269ccea6ec5c0fd921c029781Lennart Poetteringif( hist != null && hist.equals("")) hist = null;
fb0864e7b9c6d26269ccea6ec5c0fd921c029781Lennart Poetteringif( path != null && path.equals("")) path = null;
18da49531e4c6b31bd2439b4d738dc1bb9660af1Lennart Poetteringif (project != null && project.equals("")) project = null;
8af0fcdb909b87ef4dcef34d50df814656acec81Lennart Poetteringif (q != null || defs != null || refs != null || hist != null || path != null) {
8af0fcdb909b87ef4dcef34d50df814656acec81Lennart Poettering Searcher searcher = null; //the searcher used to open/search the index
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering IndexReader ireader = null; //the reader used to open/search the index
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering Query query = null, defQuery = null; //the Query created by the QueryParser
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering int start = 0; //the first index displayed on this page
6b80b9b8ee6d372e00ece51e6a11c6d31899aaecLennart Poettering int max = 25; //the maximum items displayed on this page
6b80b9b8ee6d372e00ece51e6a11c6d31899aaecLennart Poettering int thispage = 0; //used for the for/next either max or
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering String moreUrl = null;
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering CompatibleAnalyser analyzer = new CompatibleAnalyser();
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering String qstr = "";
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering String result = "";
7d900eb6f58ca76a0f742c6e1823aa7317d4471fLennart Poettering String DATA_ROOT = env.getDataRootPath();
101f077676e9fbe1a66c8b2dc4864a8d7a94c372Lennart Poettering throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
f7f964eb3625e4cca7f16377fa12aa7a760243e7Lennart Poettering File data_root = new File(DATA_ROOT);
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering ireader = IndexReader.open(DATA_ROOT + "/index");
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering searcher = new IndexSearcher(ireader);
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering //String date = request.getParameter("date");
6edd7ca1624f89c9a36067b721a0280e748acb17Kay Sievers start = Integer.parseInt(request.getParameter("start")); //parse the max results first
6edd7ca1624f89c9a36067b721a0280e748acb17Kay Sievers max = Integer.parseInt(request.getParameter("n")); //then the start index
15e9fbd851c15ecaad4888932584f37dcd26111aLennart Poettering if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
15e9fbd851c15ecaad4888932584f37dcd26111aLennart Poettering if(start < 0 ) start = 0;
53ed2eeb2e709a6c0d152d7bdf2d9a4b9f997a16Lennart Poettering } catch (Exception e) { }
353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1bLennart Poettering StringBuilder sb = new StringBuilder();
353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1bLennart Poettering if (q != null) {
7e64c73a93cdcc7068280f3e3ba8adbd6c6f8f84Lennart Poettering if (defs != null) {
b61c90514e134dc781617d172961f25e7352f53bLennart Poettering if (refs != null) {
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering if (path != null) {
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering if (hist != null) {
31ed59c51126fce7d958c188772a397e2a1ed010Lennart Poettering if (project != null) {
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering boolean first = true;
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering for (String s : project.split(" ")) {
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering first = false;
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering QueryParser qparser = new QueryParser("full", analyzer);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering qparser.setDefaultOperator(QueryParser.AND_OPERATOR);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering qparser.setAllowLeadingWildcard(env.isAllowLeadingWildcard());
4cbd9ecf45f64c3a9acc99d473fbf3be3687ae24Lennart Poettering query = qparser.parse(qstr); //parse the
25d6283acfeb87730c2c0c4c2ef76a66fa397e87Lennart Poettering if ("lastmodtime".equals(sort)) {
25d6283acfeb87730c2c0c4c2ef76a66fa397e87Lennart Poettering hits = searcher.search(query, new Sort("date", true));
b011116d1829bde044a638cbabfb070a7e0e8fa7Kay Sievers thispage = max;
7d441ddb5ca090b5a97f58ac4b4d97b3e84fa81eLennart Poettering } catch (BooleanQuery.TooManyClauses e) {
65c0cf7108ae3537a357c74b4586a783baba82f9Lennart Poettering errorMsg = "<b>Error:</b> Too many results for wildcard!";
65c0cf7108ae3537a357c74b4586a783baba82f9Lennart Poettering } catch (ParseException e) {
7ef5875d142f01ab4fe8d35412d48c10723ae2d4Lennart Poettering errorMsg = "<b>Error:</b><br/>" + Util.Htmlize(qstr) + "<br/>" + Util.Htmlize(e.getMessage());
7ef5875d142f01ab4fe8d35412d48c10723ae2d4Lennart Poettering } catch (FileNotFoundException e) {
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers errorMsg = "<b>Error:</b> Index database not found";
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers } catch (Exception e) {
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers errorMsg = "<b>Error:</b> " + Util.Htmlize(e.getMessage());
a2f5666d06fe8233025738047115bb9e3959df3eLennart Poettering // @TODO fix me. I should try to figure out where the exact hit is instead
ad740100d108282d0244d5739d4dcc86fe4c5fdeLennart Poettering // of returning a page with just _one_ entry in....
ad740100d108282d0244d5739d4dcc86fe4c5fdeLennart Poettering if (hits != null && hits.length() == 1 && request.getServletPath().equals("/s") && (query != null && query instanceof TermQuery)) {
c821bd28c2ecce8d35248d61949fe1c0c3030b6cLennart Poettering File file = new File(hits.doc(0).get("path"));
c821bd28c2ecce8d35248d61949fe1c0c3030b6cLennart Poettering String parent = file.getParent();
7d441ddb5ca090b5a97f58ac4b4d97b3e84fa81eLennart Poettering StringBuilder url = new StringBuilder(context);
14e639ae7a1dbf156273ce697d30fbc6c6594209Lennart Poettering if (parent != null) {
72b9ed828bd22f3ddd74b6853c183eebf006d6d8Lennart Poettering url.append(Util.URIEncode(file.getName());
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering sb.append(((TermQuery)query).getTerm().text());;
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering String pageTitle = "Search";
0a55b298d930543c8065bb9e708dd112562b1736Lennart Poettering RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
97f73ffb04947acf0a5854e3a7bdbb7a0105f6faLennart Poettering %><%@ include file="httpheader.jspf" %>
85f248b26653f5322c26735661d63d4e8460c30eLennart Poettering<div id="page">
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering <div id="header"><%@ include file="pageheader.jspf" %></div>
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering<div id="Masthead"></div>
a4c279f87451186b8beb1b8cc21c7cad561ecf4bLennart Poettering <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
d3fc81bd6a5a046b22600ac1204df220c93d2c15Lennart Poettering StringBuffer url = request.getRequestURL();
d3fc81bd6a5a046b22600ac1204df220c93d2c15Lennart Poettering String querys = request.getQueryString();
d3fc81bd6a5a046b22600ac1204df220c93d2c15Lennart Poettering if (querys != null) {
7c697168102cb64c5cb65a542959684014da99c7Lennart Poettering int idx = querys.indexOf("sort=");
253ee27a0c7a410d27d490bb79ea97caed6a2b68Lennart Poettering if (idx == -1) {
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering if (sort == null || RELEVANCY.equals(sort)) {
916abb21d0a6653e0187b91591e492026886b0a4Lennart Poettering %><b>Sort by relevance</b> <a href="<%=url.toString()%>">Sort by last modified time</a><%
b23de6af893c11da4286bc416455cd0926d1532eLennart Poettering %><a href="<%=url.toString()%>">Sort by relevance</a> <b>Sort by last modified time</b><%
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering } %></td></tr></table>
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering<div id="menu">
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering <%@ include file="menu.jspf"%>
9534ce54858c67363b841cdbdc315140437bfdb4Lennart Poettering<div id="results">
c798c40ec957a35cd4b7d04a196a9e58880c6ff3Lennart Poetteringif( hits == null || errorMsg != null) {
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering %><%=errorMsg%><%
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering } else if (hits.length() == 0) {
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering File spellIndex = new File(env.getDataRootPath(), "spellIndex");
5d0fcd7c8d29340ac9425c309e8ac436a9af699cLennart Poettering FSDirectory spellDirectory = FSDirectory.getDirectory(spellIndex);
5d0fcd7c8d29340ac9425c309e8ac436a9af699cLennart Poettering SpellChecker checker = new SpellChecker(spellDirectory);
73090dc815390f4fca4e3ed8a7e1d3806605daaaLennart Poettering Date sstart = new Date();
3d57c6ab801f4437f12948e29589e3d00c3ad9dbLennart Poettering %><p><font color="#cc0000">Did you mean</font>:<%
b9a2a36b519ccd79c4198e7dda4e657d597a14adLennart Poettering String[] toks;
b9a2a36b519ccd79c4198e7dda4e657d597a14adLennart Poettering if(q != null) {
ba1a55152c50dfbcd3d4a64353b95f4a2f37985eLennart Poettering toks = q.split("[\t ]+");
9408a2d295a312a5472345090e28e0502570494bLennart Poettering if(toks != null){
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering for(int j=0; j<toks.length; j++) {
3f7a8c4e9f1d3ce48919e24eb2c9d56dd6fd88d8Kay Sievers if(toks[j].length() > 3) {
f9276855a1d270b6c3f857cdaf2c4b49920c2228Lennart Poettering String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 3);
f9276855a1d270b6c3f857cdaf2c4b49920c2228Lennart Poettering for(int i = 0;i < ret.length; i++) {
260abb780a135e4cae8c10715c7e85675efc345aLennart Poettering %> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> <%
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering if(refs != null) {
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering toks = refs.split("[\t ]+");
c32e0c40f7e706e3ebcd101187d5ced96f083491Lennart Poettering if(toks != null){
c32e0c40f7e706e3ebcd101187d5ced96f083491Lennart Poettering for(int j=0; j<toks.length; j++) {
35f10fccb06a0c7b4f26a28746db387aac376cb3Lennart Poettering if(toks[j].length() > 3) {