search.jsp revision 850
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay SieversCDDL HEADER START
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay SieversThe contents of this file are subject to the terms of the
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay SieversCommon Development and Distribution License (the "License").
762f91fa600b3b2887e3b088cd700216a85e3c81Kay SieversYou may not use this file except in compliance with the License.
71092d70af35567dd154d3de2ce04ce62e157a7cLennart PoetteringSee LICENSE.txt included in this distribution for the specific
ebcd5d3acd4c470668bbcd945a5aa42f0af5ccf0Kay Sieverslanguage governing permissions and limitations under the License.
80037e4d17d0c8f28d0ff610902babc9e2b4e2f9Kay SieversWhen distributing Covered Code, include this CDDL HEADER in each
ebcd5d3acd4c470668bbcd945a5aa42f0af5ccf0Kay Sieversfile and include the License file at LICENSE.txt.
7c66aeba0f28cb82027d6015405ed71afa3b6059Kay SieversIf applicable, add the following below this CDDL HEADER, with the
7c66aeba0f28cb82027d6015405ed71afa3b6059Kay Sieversfields enclosed by brackets "[]" replaced with your own identifying
c904f64d84db8c4eebedf210ba10893f19ba05edLennart Poetteringinformation: Portions Copyright [yyyy] [name of copyright owner]
05677bb78079c3fa0283101aac2c07581f4873f1Lennart PoetteringCDDL HEADER END
71092d70af35567dd154d3de2ce04ce62e157a7cLennart PoetteringCopyright 2009 Sun Microsystems, Inc. All rights reserved.
ddd88763921a1534081ed28e36f6712a85449005Lennart PoetteringUse is subject to license terms.
f957632b960a0a42999b38ded7089fa602b41745Kay Sieversident "%Z%%M% %I% %E% SMI"
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers--%><%@ page import = "javax.servlet.*,
6b17d77e3e9eb80786f685e161515a07e0d8c4b8Lennart Poetteringorg.opensolaris.opengrok.index.IndexDatabase,
ec8927ca5940e809f0b72f530582c76f1db4f065Lennart Poetteringorg.opensolaris.opengrok.search.context.*,
7b63bde1ed0d4f30c799c9b4737fa926465929f9Lennart Poetteringorg.apache.lucene.search.spell.LuceneDictionary,
7b63bde1ed0d4f30c799c9b4737fa926465929f9Lennart Poetteringorg.apache.lucene.search.spell.SpellChecker,
f7f21d33db5dfe88dc8175c61dada44013347729Lennart Poettering%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
f7f21d33db5dfe88dc8175c61dada44013347729Lennart PoetteringDate starttime = new Date();
1ab27db89064b7f9f2f6d50566642fce803a2617Lennart PoetteringString defs = request.getParameter("defs");
27b5482cc08b7fac1b6b15d980d42ae04f3ae1caLennart PoetteringString refs = request.getParameter("refs");
27b5482cc08b7fac1b6b15d980d42ae04f3ae1caLennart PoetteringString hist = request.getParameter("hist");
27b5482cc08b7fac1b6b15d980d42ae04f3ae1caLennart PoetteringString path = request.getParameter("path");
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poettering%><%@ include file="projects.jspf" %><%
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart PoetteringString sort = null;
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringfinal String LASTMODTIME = "lastmodtime";
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringfinal String RELEVANCY = "relevancy";
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringfinal String BY_PATH = "fullpath";
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart PoetteringCookie[] cookies = request.getCookies();
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringif (cookies != null) {
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poettering for (Cookie cookie : cookies) {
a26336da875a6657d404d1e44b86ae067c34b110Kay Sievers if (cookie.getName().equals("OpenGrok/sorting")) {
e85647f73e235c2a6ea412cb8d841e092c373501Lennart Poettering if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = RELEVANCY;
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart PoetteringString sortParam = request.getParameter("sort");
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poetteringif (sortParam != null) {
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poettering if (LASTMODTIME.equals(sortParam)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = LASTMODTIME;
d889a2069a87e4617b32ddbdeace5a53a12c699dLennart Poettering } else if (RELEVANCY.equals(sortParam)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = RELEVANCY;
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering } else if (BY_PATH.equals(sortParam)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = BY_PATH;
06dab8e18aebf822392c7ca66c5bf3c1200fdec8Lennart Poettering if (sort != null) {
06dab8e18aebf822392c7ca66c5bf3c1200fdec8Lennart Poettering Cookie cookie = new Cookie("OpenGrok/sorting", sort);
7e2668c6fd5720ae4d2d55eb8a062739687516afLennart Poettering} else { sort = RELEVANCY; }
e85647f73e235c2a6ea412cb8d841e092c373501Lennart Poettering//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
e85647f73e235c2a6ea412cb8d841e092c373501Lennart PoetteringString errorMsg = null;
a888b352eb53b07daa24fa859ceeb254336b293dLennart Poetteringif( q!= null && q.equals("")) q = null;
3b2d5b02ae231f1d3eb0d96eb980155d7797304eLennart Poetteringif( defs != null && defs.equals("")) defs = null;
3b2d5b02ae231f1d3eb0d96eb980155d7797304eLennart Poetteringif( refs != null && refs.equals("")) refs = null;
0f0dbc46ccf5aaaf3131446d0a4d78bc97a37295Lennart Poetteringif( hist != null && hist.equals("")) hist = null;
0f0dbc46ccf5aaaf3131446d0a4d78bc97a37295Lennart Poetteringif( path != null && path.equals("")) path = null;
3d9a412243035beeaaf3465a62065444a5adf21cLennart Poetteringif (project != null && project.size()<1) project = null;
88f642c00b1708c5e0203c1753a9ef91d1de5442Kay Sieversif (q != null || defs != null || refs != null || hist != null || path != null) {
88f642c00b1708c5e0203c1753a9ef91d1de5442Kay Sievers Searcher searcher = null; //the searcher used to open/search the index
20ffc4c4a9226b0e45cc02ad9c0108981626c0bbKay Sievers TopDocCollector collector=null; // the collector used
f25626edf4c39bb9409cb165e6ce9551dd130661Lennart Poettering ScoreDoc[] hits = null; // list of documents which result from the query
a0a3844815b0f346dba03f41245c620f432e462fLennart Poettering IndexReader ireader = null; //the reader used to open/search the index
a0a3844815b0f346dba03f41245c620f432e462fLennart Poettering Query query = null, defQuery = null; //the Query created by the QueryParser
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart Poettering boolean allCollected=false;
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart Poettering int totalHits=0;
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart Poettering int start = 0; //the first index displayed on this page
4ee717820208a4c8e92383d0dbefa401827fab38Kay Sievers //TODO deprecate max this and merge with paging and param n - TEST needed
4ee717820208a4c8e92383d0dbefa401827fab38Kay Sievers //int max = 25; //the maximum items displayed on this page
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers int max=RuntimeEnvironment.getInstance().getHitsPerPage();
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers int hitsPerPage = RuntimeEnvironment.getInstance().getHitsPerPage();
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers int cachePages= RuntimeEnvironment.getInstance().getCachePages();
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers int thispage = 0; //used for the for/next either max or
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers String moreUrl = null;
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers CompatibleAnalyser analyzer = new CompatibleAnalyser();
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers String qstr = "";
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers String result = "";
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers String DATA_ROOT = env.getDataRootPath();
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
08f23fd29c9df9c8b4e874933eb39711f069754bLennart Poettering File data_root = new File(DATA_ROOT);
18b754d345ecb0b15e369978aaffa72e9814b86aKay Sievers throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering //String date = request.getParameter("date");
231931ffba1bca9d8759bbd6f797e56f8c6971faLennart Poettering //TODO merge paging hitsPerPage with parameter n (has to reflect the search if changed so proper number is cached first time)
231931ffba1bca9d8759bbd6f797e56f8c6971faLennart Poettering start = Integer.parseInt(request.getParameter("start")); //parse the max results first
169c4f65131fbc7bcb51e7d5487a715cdcd0e0ebLennart Poettering max = Integer.parseInt(request.getParameter("n")); //then the start index
169c4f65131fbc7bcb51e7d5487a715cdcd0e0ebLennart Poettering if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
6ba383fa49e01302dfeae1f5083bb942b055628bLennart Poettering if(start < 0 ) start = 0;
6ba383fa49e01302dfeae1f5083bb942b055628bLennart Poettering } catch (Exception e) { }
bd08f2422491169e92dc0899d5ba848fcae4c15cLennart Poettering qstr = Util.buildQueryString(q, defs, refs, path, hist);
d3c7d7dd77b2b72315164b672462825cef6c0f9aKay Sievers QueryParser qparser = new QueryParser("full", analyzer);
71100051c5d351daac20610f3a4b8c14901088d8Lennart Poettering qparser.setDefaultOperator(QueryParser.AND_OPERATOR);
fb0864e7b9c6d26269ccea6ec5c0fd921c029781Lennart Poettering qparser.setAllowLeadingWildcard(env.isAllowLeadingWildcard());
18da49531e4c6b31bd2439b4d738dc1bb9660af1Lennart Poettering query = qparser.parse(qstr); //parse the
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering if (RuntimeEnvironment.getInstance().hasProjects()) {
6b80b9b8ee6d372e00ece51e6a11c6d31899aaecLennart Poettering if (project == null) {
6b80b9b8ee6d372e00ece51e6a11c6d31899aaecLennart Poettering errorMsg = "<b>Error:</b> You must select a project!";
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering if (project.size() > 1) { //more projects
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering IndexSearcher[] searchables = new IndexSearcher[project.size()];
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
101f077676e9fbe1a66c8b2dc4864a8d7a94c372Lennart Poettering //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
f7f964eb3625e4cca7f16377fa12aa7a760243e7Lennart Poettering for (String proj : project) {
f7f964eb3625e4cca7f16377fa12aa7a760243e7Lennart Poettering ireader = (IndexReader.open(new File(droot, proj)));
144f0fc0c8a5e2f6b72179e2b5fb992474da24adLennart Poettering searchables[ii++] = new IndexSearcher(ireader);
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering if (Runtime.getRuntime().availableProcessors() > 1) {
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering searcher = new ParallelMultiSearcher(searchables);
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering searcher = new MultiSearcher(searchables);
15e9fbd851c15ecaad4888932584f37dcd26111aLennart Poettering } else { // just 1 project selected
53ed2eeb2e709a6c0d152d7bdf2d9a4b9f997a16Lennart Poettering root = new File(root, project.get(0));
353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1bLennart Poettering searcher = new IndexSearcher(ireader);
680a1dbc354b2f437b4e06e27d4c43217977efdfLennart Poettering } else { //no project setup
7e64c73a93cdcc7068280f3e3ba8adbd6c6f8f84Lennart Poettering searcher = new IndexSearcher(ireader);
36e43bddd0a4526e77cdae2c922bb29f67bd74adLennart Poettering //TODO check if below is somehow reusing sessions so we don't requery again and again, I guess 2min timeout sessions could be usefull, since you click on the next page within 2mins, if not, then wait ;)
36e43bddd0a4526e77cdae2c922bb29f67bd74adLennart Poettering if (errorMsg == null) {
b61c90514e134dc781617d172961f25e7352f53bLennart Poettering collector = new TopDocCollector(hitsPerPage*cachePages);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering Sort sortf = new Sort("date", true);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering fdocs=searcher.search(query, null, totalHits, sortf);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering allCollected=true;
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering } else if (BY_PATH.equals(sort)) {
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering Sort sortf = new Sort(BY_PATH);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering fdocs=searcher.search(query, null,totalHits, sortf);
05aa9edde0f9f4077b8120389c93cb0134eda9c5Lennart Poettering allCollected=true;
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering searcher.search(query,collector);
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering collector = new TopDocCollector(totalHits);
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering searcher.search(query,collector);
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering allCollected=true;
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering hits=collector.topDocs().scoreDocs;
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering //below will get all the documents
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering// for (int i = 0; i < hits.length; i++) {
0716c60e37d2083325cd5316caf4310f0acc9a89Lennart Poettering// int docId = hits[i].doc;
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering// Document d = searcher.doc(docId);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering thispage = max;
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering } catch (BooleanQuery.TooManyClauses e) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering errorMsg = "<b>Error:</b> Too many results for wildcard!";
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering } catch (ParseException e) {
4cbd9ecf45f64c3a9acc99d473fbf3be3687ae24Lennart Poettering errorMsg = "<b>Error parsing your query:</b><br/>" + Util.htmlize(qstr) +
4cbd9ecf45f64c3a9acc99d473fbf3be3687ae24Lennart Poettering "<p/>You might try to enclose your search term in quotes: <br/>" +
a6eb9147a820d1c08b315867373a21bd0ece2f05Lennart Poettering "<a href=search?q=\"" + Util.URIEncode(qstr) + "\">\"" + Util.htmlize(qstr) +
a6eb9147a820d1c08b315867373a21bd0ece2f05Lennart Poettering "\"</a><p/> or read the <a href=\"help.jsp\">Help</a> on query language(eventually <a href=\"help.jsp#escaping\">escape special characters</a> with <b>\\</b>)<p/>" +
b011116d1829bde044a638cbabfb070a7e0e8fa7Kay Sievers "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
b011116d1829bde044a638cbabfb070a7e0e8fa7Kay Sievers } catch (FileNotFoundException e) {
7d441ddb5ca090b5a97f58ac4b4d97b3e84fa81eLennart Poettering errorMsg = "<b>Error:</b> Index database not found";
65c0cf7108ae3537a357c74b4586a783baba82f9Lennart Poettering } catch (Exception e) {
65c0cf7108ae3537a357c74b4586a783baba82f9Lennart Poettering errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers // @TODO fix me. I should try to figure out where the exact hit is instead
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers // of returning a page with just _one_ entry in....
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers if (hits != null && hits.length == 1 && request.getServletPath().equals("/s") && (query != null && query instanceof TermQuery)) {
a2f5666d06fe8233025738047115bb9e3959df3eLennart Poettering String preFragmentPath = Util.URIEncodePath(context + "/xref" + searcher.doc(hits[0].doc).get("path"));
a2f5666d06fe8233025738047115bb9e3959df3eLennart Poettering String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
ad740100d108282d0244d5739d4dcc86fe4c5fdeLennart Poettering StringBuilder url = new StringBuilder(preFragmentPath);
14e639ae7a1dbf156273ce697d30fbc6c6594209Lennart Poettering String pageTitle = "Search";
ff01d048b4c1455241c894cf7982662c9d28fd34Lennart Poettering RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
d3c7d7dd77b2b72315164b672462825cef6c0f9aKay Sievers %><%@ include file="httpheader.jspf" %>
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering<div id="page">
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering <div id="header"><%@ include file="pageheader.jspf" %></div>
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering<div id="Masthead"></div>
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
0a55b298d930543c8065bb9e708dd112562b1736Lennart Poettering String url = "s?";
97f73ffb04947acf0a5854e3a7bdbb7a0105f6faLennart Poettering url = url + (q == null ? "" : "&q=" + Util.URIEncode(q)) +
97f73ffb04947acf0a5854e3a7bdbb7a0105f6faLennart Poettering (defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
85f248b26653f5322c26735661d63d4e8460c30eLennart Poettering (refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
85f248b26653f5322c26735661d63d4e8460c30eLennart Poettering (path == null ? "" : "&path=" + Util.URIEncode(path)) +
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering (hist == null ? "" : "&hist=" + Util.URIEncode(hist));
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering if (hasProjects) {
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering url = url + "&project=";
a4c279f87451186b8beb1b8cc21c7cad561ecf4bLennart Poettering for (Iterator it = project.iterator(); it.hasNext();) {
a4c279f87451186b8beb1b8cc21c7cad561ecf4bLennart Poettering url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
7c697168102cb64c5cb65a542959684014da99c7Lennart Poettering url=url+("&sort=");
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering if (sort == null || RELEVANCY.equals(sort)) {
8d0e38a2b966799af884e78a54fd6a2dffa44788Lennart Poettering %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering } else if (LASTMODTIME.equals(sort)) {
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering } else if (BY_PATH.equals(sort)) {
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
916abb21d0a6653e0187b91591e492026886b0a4Lennart Poettering } %></td></tr></table>
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering<div id="menu">
916abb21d0a6653e0187b91591e492026886b0a4Lennart Poettering <%@ include file="menu.jspf"%>
b23de6af893c11da4286bc416455cd0926d1532eLennart Poettering<div id="results">
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering//TODO spellchecking cycle below is not that great and we only create suggest links for every token in query, not for a query as whole
9534ce54858c67363b841cdbdc315140437bfdb4Lennart Poetteringif( hits == null || errorMsg != null) {
9534ce54858c67363b841cdbdc315140437bfdb4Lennart Poettering %><%=errorMsg%><%
c798c40ec957a35cd4b7d04a196a9e58880c6ff3Lennart Poettering } else if (hits.length == 0) {
c798c40ec957a35cd4b7d04a196a9e58880c6ff3Lennart Poettering File spellIndex = new File(env.getDataRootPath(), "spellIndex");
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering File[] spellIndexes=null;
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering if (RuntimeEnvironment.getInstance().hasProjects()) {
7a2a0b907b5cc60f5d9a871997d7d6e7f62bf4d8Lennart Poettering if (project.size() > 1) { //more projects
253ee27a0c7a410d27d490bb79ea97caed6a2b68Lennart Poettering spellIndexes = new File[project.size()];
5d0fcd7c8d29340ac9425c309e8ac436a9af699cLennart Poettering //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
acb14d318b84bda00d1e666d7dab6794d5bbeb3fLennart Poettering for (String proj : project) {
8bbabc447b1d913bd21faf97c7b17d20d315d2b4Lennart Poettering spellIndexes[ii++] = new File(spellIndex,proj);
8bbabc447b1d913bd21faf97c7b17d20d315d2b4Lennart Poettering } else { // just 1 project selected
73090dc815390f4fca4e3ed8a7e1d3806605daaaLennart Poettering spellIndex = new File(spellIndex, project.get(0));
ba1a55152c50dfbcd3d4a64353b95f4a2f37985eLennart Poettering if (spellIndexes!=null) {count=spellIndexes.length;}
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering for (int idx = 0; idx < count; idx++) {
f9276855a1d270b6c3f857cdaf2c4b49920c2228Lennart Poettering if (spellIndexes!=null) spellIndex = spellIndexes[idx];
260abb780a135e4cae8c10715c7e85675efc345aLennart Poettering FSDirectory spellDirectory = FSDirectory.getDirectory(spellIndex);
260abb780a135e4cae8c10715c7e85675efc345aLennart Poettering SpellChecker checker = new SpellChecker(spellDirectory);
a8f11321c209830a35edd0357e8def5d4437d854Lennart Poettering Date sstart = new Date();
a8f11321c209830a35edd0357e8def5d4437d854Lennart Poettering boolean printHeader = true;
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering String[] toks;
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering if(q != null) {