xref: /OpenGrok/opengrok-web/src/main/webapp/search.jsp (revision 56f072caf7d2bfa8d9934d1e7cbac3987de2dc17)
10d40e9d0SAdam Hornáček<%--
20d40e9d0SAdam Hornáček$Id$
30d40e9d0SAdam Hornáček
40d40e9d0SAdam HornáčekCDDL HEADER START
50d40e9d0SAdam Hornáček
60d40e9d0SAdam HornáčekThe contents of this file are subject to the terms of the
70d40e9d0SAdam HornáčekCommon Development and Distribution License (the "License").
80d40e9d0SAdam HornáčekYou may not use this file except in compliance with the License.
90d40e9d0SAdam Hornáček
100d40e9d0SAdam HornáčekSee LICENSE.txt included in this distribution for the specific
110d40e9d0SAdam Hornáčeklanguage governing permissions and limitations under the License.
120d40e9d0SAdam Hornáček
130d40e9d0SAdam HornáčekWhen distributing Covered Code, include this CDDL HEADER in each
140d40e9d0SAdam Hornáčekfile and include the License file at LICENSE.txt.
150d40e9d0SAdam HornáčekIf applicable, add the following below this CDDL HEADER, with the
160d40e9d0SAdam Hornáčekfields enclosed by brackets "[]" replaced with your own identifying
170d40e9d0SAdam Hornáčekinformation: Portions Copyright [yyyy] [name of copyright owner]
180d40e9d0SAdam Hornáček
190d40e9d0SAdam HornáčekCDDL HEADER END
200d40e9d0SAdam Hornáček
21*56f072caSAdam HornáčekCopyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
220d40e9d0SAdam HornáčekPortions Copyright 2011 Jens Elkner.
23a804b2d7SAdam HornáčekPortions Copyright (c) 2017-2018, Chris Fraire <cfraire@me.com>.
240d40e9d0SAdam Hornáček
250d40e9d0SAdam Hornáček--%>
26a804b2d7SAdam Hornáček<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
270d40e9d0SAdam Hornáček<%@page import="javax.servlet.http.HttpServletResponse"%>
280d40e9d0SAdam Hornáček<%@page session="false" errorPage="error.jsp" import="
29*56f072caSAdam Hornáčekorg.opengrok.search.Results,
30*56f072caSAdam Hornáčekorg.opengrok.web.SearchHelper,
31*56f072caSAdam Hornáčekorg.opengrok.web.SortOrder,
32*56f072caSAdam Hornáčekorg.opengrok.web.Suggestion"
330d40e9d0SAdam Hornáček%><%
340d40e9d0SAdam Hornáček{
350d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
360d40e9d0SAdam Hornáček    cfg.checkSourceRootExistence();
370d40e9d0SAdam Hornáček}
380d40e9d0SAdam Hornáček%><%@
390d40e9d0SAdam Hornáček
400d40e9d0SAdam Hornáčekinclude file="projects.jspf"
410d40e9d0SAdam Hornáček
420d40e9d0SAdam Hornáček%><%!
430d40e9d0SAdam Hornáček    private StringBuilder createUrl(HttpServletRequest request, SearchHelper sh, boolean menu) {
440d40e9d0SAdam Hornáček        StringBuilder url = new StringBuilder(64);
450d40e9d0SAdam Hornáček        QueryBuilder qb = sh.builder;
460d40e9d0SAdam Hornáček        if (menu) {
470d40e9d0SAdam Hornáček            url.append("search?");
480d40e9d0SAdam Hornáček        } else {
490d40e9d0SAdam Hornáček            Util.appendQuery(url, "sort", sh.order.toString());
500d40e9d0SAdam Hornáček        }
510d40e9d0SAdam Hornáček        if (qb != null) {
520d40e9d0SAdam Hornáček            Util.appendQuery(url, "q", qb.getFreetext());
530d40e9d0SAdam Hornáček            Util.appendQuery(url, "defs", qb.getDefs());
540d40e9d0SAdam Hornáček            Util.appendQuery(url, "refs", qb.getRefs());
550d40e9d0SAdam Hornáček            Util.appendQuery(url, "path", qb.getPath());
560d40e9d0SAdam Hornáček            Util.appendQuery(url, "hist", qb.getHist());
570d40e9d0SAdam Hornáček            Util.appendQuery(url, "type", qb.getType());
580d40e9d0SAdam Hornáček        }
590d40e9d0SAdam Hornáček        if (sh.projects != null && sh.projects.size() != 0) {
600d40e9d0SAdam Hornáček            Util.appendQuery(url, "project", PageConfig.get(request).getRequestedProjectsAsString());
610d40e9d0SAdam Hornáček        }
620d40e9d0SAdam Hornáček        return url;
630d40e9d0SAdam Hornáček    }
640d40e9d0SAdam Hornáček%><%
650d40e9d0SAdam Hornáček/* ---------------------- search.jsp start --------------------- */
660d40e9d0SAdam Hornáček{
670d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
680d40e9d0SAdam Hornáček
690d40e9d0SAdam Hornáček    long starttime = System.currentTimeMillis();
700d40e9d0SAdam Hornáček
710d40e9d0SAdam Hornáček    SearchHelper searchHelper = cfg.prepareSearch();
720d40e9d0SAdam Hornáček    // N.b. searchHelper.destroy() is called via
730d40e9d0SAdam Hornáček    // WebappListener.requestDestroyed() on presence of the following
740d40e9d0SAdam Hornáček    // REQUEST_ATTR.
750d40e9d0SAdam Hornáček    request.setAttribute(SearchHelper.REQUEST_ATTR, searchHelper);
760d40e9d0SAdam Hornáček    request.setAttribute("search.jsp-query-start-time", starttime);
770d40e9d0SAdam Hornáček    searchHelper.prepareExec(cfg.getRequestedProjects()).executeQuery().prepareSummary();
780d40e9d0SAdam Hornáček    if (searchHelper.redirect != null) {
790d40e9d0SAdam Hornáček        response.sendRedirect(searchHelper.redirect);
800d40e9d0SAdam Hornáček    }
810d40e9d0SAdam Hornáček    if (searchHelper.errorMsg != null) {
820d40e9d0SAdam Hornáček        cfg.setTitle("Search Error");
830d40e9d0SAdam Hornáček        // Set status to Internal error. This should help to avoid caching
840d40e9d0SAdam Hornáček        // the page by some proxies.
850d40e9d0SAdam Hornáček        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
860d40e9d0SAdam Hornáček    } else {
870d40e9d0SAdam Hornáček        cfg.setTitle(cfg.getSearchTitle());
880d40e9d0SAdam Hornáček    }
890d40e9d0SAdam Hornáček    response.addCookie(new Cookie("OpenGrokSorting", URLEncoder.encode(searchHelper.order.toString(), "utf-8")));
900d40e9d0SAdam Hornáček}
910d40e9d0SAdam Hornáček%><%@
920d40e9d0SAdam Hornáček
930d40e9d0SAdam Hornáčekinclude file="httpheader.jspf"
940d40e9d0SAdam Hornáček
950d40e9d0SAdam Hornáček%><body>
960d40e9d0SAdam Hornáček<div id="page">
970d40e9d0SAdam Hornáček    <div id="whole_header">
980d40e9d0SAdam Hornáček        <div id="header"><%@
990d40e9d0SAdam Hornáček
1000d40e9d0SAdam Hornáčekinclude file="pageheader.jspf"
1010d40e9d0SAdam Hornáček
1020d40e9d0SAdam Hornáček%>
1030d40e9d0SAdam Hornáček        </div>
1040d40e9d0SAdam Hornáček        <div id="Masthead">
1050d40e9d0SAdam Hornáček            <a href="<%= request.getContextPath() %>/"><span id="home"></span>Home</a>
1060d40e9d0SAdam Hornáček            <%-- TODO: jel: IMHO it should be move to menu.jspf as combobox --%>
1070d40e9d0SAdam Hornáček            <div id="sortfield">
1080d40e9d0SAdam Hornáček                <label for="sortby">Sort by</label>
1090d40e9d0SAdam Hornáček                <%
1100d40e9d0SAdam Hornáček{
1110d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
1120d40e9d0SAdam Hornáček    SearchHelper searchHelper = (SearchHelper) request.getAttribute(SearchHelper.REQUEST_ATTR);
1130d40e9d0SAdam Hornáček    StringBuilder url = createUrl(request, searchHelper, true).append("&amp;sort=");
1140d40e9d0SAdam Hornáček    int ordcnt = 0;
1150d40e9d0SAdam Hornáček    for (SortOrder o : SortOrder.values()) {
1160d40e9d0SAdam Hornáček        if (searchHelper.order == o) {
1170d40e9d0SAdam Hornáček                    %><span class="active"><%= o.getDesc() %></span><%
1180d40e9d0SAdam Hornáček        } else {
1190d40e9d0SAdam Hornáček                    %><a href="<%= url %><%= o %>"><%= o.getDesc() %></a><%
1200d40e9d0SAdam Hornáček        }
1210d40e9d0SAdam Hornáček        ordcnt++;
1220d40e9d0SAdam Hornáček        if (ordcnt != (SortOrder.values().length)) {
1230d40e9d0SAdam Hornáček            %> | <%
1240d40e9d0SAdam Hornáček        }
1250d40e9d0SAdam Hornáček    }
1260d40e9d0SAdam Hornáček}
1270d40e9d0SAdam Hornáček                %>
1280d40e9d0SAdam Hornáček            </div>
1290d40e9d0SAdam Hornáček        </div>
1300d40e9d0SAdam Hornáček        <div id="bar">
1310d40e9d0SAdam Hornáček        </div>
1320d40e9d0SAdam Hornáček        <div id="menu"><%@
1330d40e9d0SAdam Hornáček
1340d40e9d0SAdam Hornáčekinclude file="menu.jspf"
1350d40e9d0SAdam Hornáček
1360d40e9d0SAdam Hornáček%>
1370d40e9d0SAdam Hornáček        </div>
1380d40e9d0SAdam Hornáček    </div>
1390d40e9d0SAdam Hornáček
1400d40e9d0SAdam Hornáček    <div id="results"> <%
1410d40e9d0SAdam Hornáček{
1420d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
1430d40e9d0SAdam Hornáček    SearchHelper searchHelper = (SearchHelper) request.getAttribute(SearchHelper.REQUEST_ATTR);
1440d40e9d0SAdam Hornáček    Long starttime = (Long) request.getAttribute("search.jsp-query-start-time");
1450d40e9d0SAdam Hornáček    // TODO spellchecking cycle below is not that great and we only create
1460d40e9d0SAdam Hornáček    // suggest links for every token in query, not for a query as whole
1470d40e9d0SAdam Hornáček    if (searchHelper.errorMsg != null) {
1480d40e9d0SAdam Hornáček        %><h3>Error</h3><p class="pagetitle"><%
1490d40e9d0SAdam Hornáček        if (searchHelper.errorMsg.startsWith((SearchHelper.PARSE_ERROR_MSG))) {
1500d40e9d0SAdam Hornáček            %><%= Util.htmlize(SearchHelper.PARSE_ERROR_MSG) %>
1510d40e9d0SAdam Hornáček            <br/>You might try to enclose your search term in quotes,
1520d40e9d0SAdam Hornáček            <a href="help.jsp#escaping">escape special characters</a>
1530d40e9d0SAdam Hornáček            with <b>\</b>, or read the <a href="help.jsp">Help</a>
1540d40e9d0SAdam Hornáček            on the query language. Error message from parser:<br/>
1550d40e9d0SAdam Hornáček            <%= Util.htmlize(searchHelper.errorMsg.substring(
1560d40e9d0SAdam Hornáček                        SearchHelper.PARSE_ERROR_MSG.length())) %><%
1570d40e9d0SAdam Hornáček        } else {
1580d40e9d0SAdam Hornáček            %><%= Util.htmlize(searchHelper.errorMsg) %><%
1590d40e9d0SAdam Hornáček        }%></p><%
1600d40e9d0SAdam Hornáček    } else if (searchHelper.hits == null) {
1610d40e9d0SAdam Hornáček        %><p class="pagetitle">No hits</p><%
1620d40e9d0SAdam Hornáček    } else if (searchHelper.hits.length == 0) {
1630d40e9d0SAdam Hornáček        List<Suggestion> hints = searchHelper.getSuggestions();
1640d40e9d0SAdam Hornáček        for (Suggestion hint : hints) {
1650d40e9d0SAdam Hornáček        %><p class="suggestions"><font color="#cc0000">Did you mean (for <%= hint.name %>)</font>:<%
1660d40e9d0SAdam Hornáček	  if (hint.freetext!=null) {
1670d40e9d0SAdam Hornáček	    for (String word : hint.freetext) {
1680d40e9d0SAdam Hornáček            %> <a href="search?q=<%= Util.URIEncode(word) %>"><%=
1690d40e9d0SAdam Hornáček                Util.htmlize(word) %></a> &nbsp; <%
1700d40e9d0SAdam Hornáček	    }
1710d40e9d0SAdam Hornáček	  }
1720d40e9d0SAdam Hornáček	  if (hint.refs!=null)  {
1730d40e9d0SAdam Hornáček	    for (String word : hint.refs) {
1740d40e9d0SAdam Hornáček            %> <a href="search?refs=<%= Util.URIEncode(word) %>"><%=
1750d40e9d0SAdam Hornáček                Util.htmlize(word) %></a> &nbsp; <%
1760d40e9d0SAdam Hornáček	    }
1770d40e9d0SAdam Hornáček	  }
1780d40e9d0SAdam Hornáček	  if (hint.defs!=null) {
1790d40e9d0SAdam Hornáček	    for (String word : hint.defs) {
1800d40e9d0SAdam Hornáček            %> <a href="search?defs=<%= Util.URIEncode(word) %>"><%=
1810d40e9d0SAdam Hornáček                Util.htmlize(word) %></a> &nbsp; <%
1820d40e9d0SAdam Hornáček            }
1830d40e9d0SAdam Hornáček	  }
1840d40e9d0SAdam Hornáček        %></p><%
1850d40e9d0SAdam Hornáček        }
1860d40e9d0SAdam Hornáček        %>
1870d40e9d0SAdam Hornáček        <p class="pagetitle"> Your search <b><%
1880d40e9d0SAdam Hornáček            Util.htmlize(searchHelper.query.toString(), out); %></b>
1890d40e9d0SAdam Hornáček            did not match any files.
1900d40e9d0SAdam Hornáček            <br/> Suggestions:<br/>
1910d40e9d0SAdam Hornáček        </p>
1920d40e9d0SAdam Hornáček        <ul>
1930d40e9d0SAdam Hornáček            <li>Make sure all terms are spelled correctly.</li>
1940d40e9d0SAdam Hornáček            <li>Try different keywords.</li>
1950d40e9d0SAdam Hornáček            <li>Try more general keywords.</li>
1960d40e9d0SAdam Hornáček            <li>Use 'wil*' cards if you are looking for partial match.</li>
1970d40e9d0SAdam Hornáček        </ul>
1980d40e9d0SAdam Hornáček        <p><b>Completed in <%= System.currentTimeMillis() - starttime
1990d40e9d0SAdam Hornáček            %> milliseconds</b></p>
2000d40e9d0SAdam Hornáček	<%
2010d40e9d0SAdam Hornáček    } else {
2020d40e9d0SAdam Hornáček        int start = searchHelper.start;
2030d40e9d0SAdam Hornáček        int max = searchHelper.maxItems;
2040d40e9d0SAdam Hornáček        long totalHits = searchHelper.totalHits;
2050d40e9d0SAdam Hornáček        long thispage = Math.min(totalHits - start, max);  // number of items to display on the current page
2060d40e9d0SAdam Hornáček        // We have a lots of results to show: create a slider for
2070d40e9d0SAdam Hornáček        String slider = Util.createSlider(start, max, totalHits, request);
2080d40e9d0SAdam Hornáček        %>
2090d40e9d0SAdam Hornáček        <p class="pagetitle">Searched <b><%
2100d40e9d0SAdam Hornáček            Util.htmlize(searchHelper.query.toString(), out);
211a804b2d7SAdam Hornáček            %></b> (Results <b> <%= start + 1 %> – <%= thispage + start
2120d40e9d0SAdam Hornáček            %></b> of <b><%= totalHits %></b>) sorted by <%=
2130d40e9d0SAdam Hornáček            searchHelper.order.getDesc() %></p><%
2140d40e9d0SAdam Hornáček        if (slider.length() > 0) {
2150d40e9d0SAdam Hornáček        %>
2160d40e9d0SAdam Hornáček        <p class="slider"><%= slider %></p><%
2170d40e9d0SAdam Hornáček        }
2180d40e9d0SAdam Hornáček        %>
2190d40e9d0SAdam Hornáček        <table><%
2200d40e9d0SAdam Hornáček        Results.prettyPrint(out, searchHelper, start, start + thispage);
2210d40e9d0SAdam Hornáček        %>
2220d40e9d0SAdam Hornáček        </table>
2230d40e9d0SAdam Hornáček        <p><b>Completed in <%= System.currentTimeMillis() - starttime
2240d40e9d0SAdam Hornáček            %> milliseconds</b></p><%
2250d40e9d0SAdam Hornáček        if (slider.length() > 0) {
2260d40e9d0SAdam Hornáček        %>
2270d40e9d0SAdam Hornáček        <p class="slider"><%= slider %></p><%
2280d40e9d0SAdam Hornáček        }
2290d40e9d0SAdam Hornáček        %>
2300d40e9d0SAdam Hornáček    </div><%
2310d40e9d0SAdam Hornáček    }
2320d40e9d0SAdam Hornáček    // Note that searchHelper.destroy() is called via WebappListener.requestDestroyed().
2330d40e9d0SAdam Hornáček}
2340d40e9d0SAdam Hornáček/* ---------------------- search.jsp end --------------------- */
2350d40e9d0SAdam Hornáček%><%@
2360d40e9d0SAdam Hornáček
2370d40e9d0SAdam Hornáčekinclude file="foot.jspf"
2380d40e9d0SAdam Hornáček
2390d40e9d0SAdam Hornáček%>
240