xref: /OpenGrok/opengrok-web/src/main/webapp/list.jsp (revision 55774b8b04f7385d4f8a76f3d3a19985563b732d)
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
2156f072caSAdam HornáčekCopyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
220d40e9d0SAdam HornáčekPortions Copyright 2011 Jens Elkner.
237d004396SChris FrairePortions Copyright (c) 2017-2019, Chris Fraire <cfraire@me.com>.
240d40e9d0SAdam Hornáček
250d40e9d0SAdam Hornáček--%>
260d40e9d0SAdam Hornáček<%@page errorPage="error.jsp" import="
270d40e9d0SAdam Hornáčekjava.io.BufferedInputStream,
280d40e9d0SAdam Hornáčekjava.io.FileInputStream,
290d40e9d0SAdam Hornáčekjava.io.InputStream,
300d40e9d0SAdam Hornáčekjava.io.InputStreamReader,
310d40e9d0SAdam Hornáčekjava.io.Reader,
320d40e9d0SAdam Hornáčekjava.net.URLEncoder,
330d40e9d0SAdam Hornáčekjava.nio.charset.StandardCharsets,
340d40e9d0SAdam Hornáčekjava.util.List,
3552dccac1SChris Frairejava.util.Locale,
36e829566cSChris Frairejava.util.logging.Level,
370d40e9d0SAdam Hornáčekjava.util.Set,
38e829566cSChris Frairejava.util.logging.Logger,
39686556f2SAdam Hornáčekorg.opengrok.indexer.analysis.AnalyzerGuru,
40e829566cSChris Fraireorg.opengrok.indexer.analysis.Ctags,
41686556f2SAdam Hornáčekorg.opengrok.indexer.analysis.Definitions,
42e829566cSChris Fraireorg.opengrok.indexer.analysis.AbstractAnalyzer,
43e829566cSChris Fraireorg.opengrok.indexer.analysis.AbstractAnalyzer.Genre,
44e829566cSChris Fraireorg.opengrok.indexer.analysis.AnalyzerFactory,
45686556f2SAdam Hornáčekorg.opengrok.indexer.history.Annotation,
46686556f2SAdam Hornáčekorg.opengrok.indexer.index.IndexDatabase,
47e829566cSChris Fraireorg.opengrok.indexer.logger.LoggerFactory,
48686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryEntry,
49686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryExtraReader,
50686556f2SAdam Hornáčekorg.opengrok.indexer.search.FileExtra,
51686556f2SAdam Hornáčekorg.opengrok.indexer.util.FileExtraZipper,
527d004396SChris Fraireorg.opengrok.indexer.util.ForbiddenSymlinkException,
53e829566cSChris Fraireorg.opengrok.indexer.util.ObjectPool,
54686556f2SAdam Hornáčekorg.opengrok.indexer.util.IOUtils,
5556f072caSAdam Hornáčekorg.opengrok.web.DirectoryListing,
56686556f2SAdam Hornáčekorg.opengrok.indexer.web.SearchHelper"
5757eefa47SKryštof Tulinger%>
5857eefa47SKryštof Tulinger<%
59*55774b8bSChris Frairefinal String DUMMY_REVISION = "unknown";
60*55774b8bSChris Fraire
610d40e9d0SAdam Hornáček{
620d40e9d0SAdam Hornáček    // need to set it here since requesting parameters
630d40e9d0SAdam Hornáček    if (request.getCharacterEncoding() == null) {
640d40e9d0SAdam Hornáček        request.setCharacterEncoding("UTF-8");
650d40e9d0SAdam Hornáček    }
660d40e9d0SAdam Hornáček
670d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
680d40e9d0SAdam Hornáček    cfg.checkSourceRootExistence();
690d40e9d0SAdam Hornáček
70*55774b8bSChris Fraire    String rev = cfg.getRequestedRevision();
71*55774b8bSChris Fraire    if (!cfg.isDir() && rev.length() == 0) {
72*55774b8bSChris Fraire        /*
73*55774b8bSChris Fraire         * Get the latest revision and redirect so that the revision number
74*55774b8bSChris Fraire         * appears in the URL.
75*55774b8bSChris Fraire         */
76*55774b8bSChris Fraire        String location = cfg.getRevisionLocation(cfg.getLatestRevision());
77*55774b8bSChris Fraire        if (location != null) {
78*55774b8bSChris Fraire            response.sendRedirect(location);
79*55774b8bSChris Fraire            return;
80*55774b8bSChris Fraire        }
81*55774b8bSChris Fraire        if (!cfg.getEnv().isGenerateHtml()) {
82*55774b8bSChris Fraire            /*
83*55774b8bSChris Fraire             * Economy mode is on and failed to get the last revision
84*55774b8bSChris Fraire             * (presumably running with history turned off).  Use dummy
85*55774b8bSChris Fraire             * revision string so that xref can be generated from the resource
86*55774b8bSChris Fraire             * file directly.
87*55774b8bSChris Fraire             */
88*55774b8bSChris Fraire            location = cfg.getRevisionLocation(DUMMY_REVISION);
89*55774b8bSChris Fraire            response.sendRedirect(location);
90*55774b8bSChris Fraire            return;
91*55774b8bSChris Fraire        }
92*55774b8bSChris Fraire    }
93*55774b8bSChris Fraire
940d40e9d0SAdam Hornáček    Annotation annotation = cfg.getAnnotation();
950d40e9d0SAdam Hornáček    if (annotation != null) {
960d40e9d0SAdam Hornáček        int r = annotation.getWidestRevision();
970d40e9d0SAdam Hornáček        int a = annotation.getWidestAuthor();
980d40e9d0SAdam Hornáček        cfg.addHeaderData("<style type=\"text/css\">"
990d40e9d0SAdam Hornáček            + ".blame .r { width: " + (r == 0 ? 6 : Math.ceil(r * 0.7)) + "em; } "
1000d40e9d0SAdam Hornáček            + ".blame .a { width: " + (a == 0 ? 6 : Math.ceil(a * 0.7)) + "em; } "
1010d40e9d0SAdam Hornáček            + "</style>");
1020d40e9d0SAdam Hornáček    }
1030d40e9d0SAdam Hornáček}
1040d40e9d0SAdam Hornáček%><%@include
1050d40e9d0SAdam Hornáček
1060d40e9d0SAdam Hornáčekfile="mast.jsp"
1070d40e9d0SAdam Hornáček
1080d40e9d0SAdam Hornáček%><script type="text/javascript">/* <![CDATA[ */
1090d40e9d0SAdam Hornáčekdocument.pageReady.push(function() { pageReadyList();});
1100d40e9d0SAdam Hornáček/* ]]> */</script>
1110d40e9d0SAdam Hornáček<%
1120d40e9d0SAdam Hornáček/* ---------------------- list.jsp start --------------------- */
1130d40e9d0SAdam Hornáček{
114e829566cSChris Fraire    final Logger LOGGER = LoggerFactory.getLogger(getClass());
115e829566cSChris Fraire
1160d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
1170d40e9d0SAdam Hornáček    String rev = cfg.getRequestedRevision();
118e393cb49SAdam Hornáček    Project project = cfg.getProject();
1190d40e9d0SAdam Hornáček
120e393cb49SAdam Hornáček    String navigateWindowEnabled = project != null ? Boolean.toString(
121e393cb49SAdam Hornáček            project.isNavigateWindowEnabled()) : "false";
1220d40e9d0SAdam Hornáček    File resourceFile = cfg.getResourceFile();
1230d40e9d0SAdam Hornáček    String path = cfg.getPath();
1240d40e9d0SAdam Hornáček    String basename = resourceFile.getName();
1250d40e9d0SAdam Hornáček    String rawPath = request.getContextPath() + Prefix.DOWNLOAD_P + path;
1260d40e9d0SAdam Hornáček    Reader r = null;
1270d40e9d0SAdam Hornáček    if (cfg.isDir()) {
1280d40e9d0SAdam Hornáček        // valid resource is requested
1290d40e9d0SAdam Hornáček        // mast.jsp assures, that resourceFile is valid and not /
1300d40e9d0SAdam Hornáček        // see cfg.resourceNotAvailable()
1310d40e9d0SAdam Hornáček        String cookieValue = cfg.getRequestedProjectsAsString();
132e393cb49SAdam Hornáček        if (project != null) {
1330d40e9d0SAdam Hornáček            Set<String>  projects = cfg.getRequestedProjects();
134e393cb49SAdam Hornáček            if (!projects.contains(project.getName())) {
135e393cb49SAdam Hornáček                projects.add(project.getName());
1360d40e9d0SAdam Hornáček                // update cookie
1370d40e9d0SAdam Hornáček                cookieValue = cookieValue.length() == 0
138e393cb49SAdam Hornáček                    ? project.getName()
139e393cb49SAdam Hornáček                    : project.getName() + ',' + cookieValue;
1400d40e9d0SAdam Hornáček                Cookie cookie = new Cookie(PageConfig.OPEN_GROK_PROJECT, URLEncoder.encode(cookieValue, "utf-8"));
1410d40e9d0SAdam Hornáček                // TODO hmmm, projects.jspf doesn't set a path
1420d40e9d0SAdam Hornáček                cookie.setPath(request.getContextPath() + '/');
1430d40e9d0SAdam Hornáček                response.addCookie(cookie);
1440d40e9d0SAdam Hornáček            }
1450d40e9d0SAdam Hornáček        }
1460d40e9d0SAdam Hornáček        // requesting a directory listing
1470d40e9d0SAdam Hornáček        DirectoryListing dl = new DirectoryListing(cfg.getEftarReader());
1480d40e9d0SAdam Hornáček        List<String> files = cfg.getResourceFileList();
1490d40e9d0SAdam Hornáček        if (!files.isEmpty()) {
1500d40e9d0SAdam Hornáček            List<FileExtra> extras = null;
151e393cb49SAdam Hornáček            if (project != null) {
1520d40e9d0SAdam Hornáček                SearchHelper searchHelper = cfg.prepareInternalSearch();
1530d40e9d0SAdam Hornáček                // N.b. searchHelper.destroy() is called via
1540d40e9d0SAdam Hornáček                // WebappListener.requestDestroyed() on presence of the
1550d40e9d0SAdam Hornáček                // following REQUEST_ATTR.
1560d40e9d0SAdam Hornáček                request.setAttribute(SearchHelper.REQUEST_ATTR, searchHelper);
157e393cb49SAdam Hornáček                searchHelper.prepareExec(project);
1580d40e9d0SAdam Hornáček
1590d40e9d0SAdam Hornáček                if (searchHelper.searcher != null) {
1600d40e9d0SAdam Hornáček                    DirectoryExtraReader extraReader =
1610d40e9d0SAdam Hornáček                        new DirectoryExtraReader();
1627d004396SChris Fraire                    String primePath = path;
1637d004396SChris Fraire                    try {
1647d004396SChris Fraire                        primePath = searchHelper.getPrimeRelativePath(project.getName(), path);
1657d004396SChris Fraire                    } catch (IOException | ForbiddenSymlinkException ex) {
1667d004396SChris Fraire                        LOGGER.log(Level.WARNING, String.format(
1677d004396SChris Fraire                                "Error getting prime relative for %s", path), ex);
1687d004396SChris Fraire                    }
1697d004396SChris Fraire                    extras = extraReader.search(searchHelper.searcher, primePath);
1700d40e9d0SAdam Hornáček                }
1710d40e9d0SAdam Hornáček            }
1720d40e9d0SAdam Hornáček
1730d40e9d0SAdam Hornáček            FileExtraZipper zipper = new FileExtraZipper();
1740d40e9d0SAdam Hornáček            List<DirectoryEntry> entries = zipper.zip(resourceFile, files,
1750d40e9d0SAdam Hornáček                extras);
1760d40e9d0SAdam Hornáček
1770d40e9d0SAdam Hornáček            List<String> readMes = dl.extraListTo(
1780d40e9d0SAdam Hornáček                    Util.URIEncodePath(request.getContextPath()),
1790d40e9d0SAdam Hornáček                    resourceFile, out, path, entries);
1800d40e9d0SAdam Hornáček            File[] catfiles = cfg.findDataFiles(readMes);
1810d40e9d0SAdam Hornáček            for (int i=0; i < catfiles.length; i++) {
1820d40e9d0SAdam Hornáček                if (catfiles[i] == null) {
1830d40e9d0SAdam Hornáček                    continue;
1840d40e9d0SAdam Hornáček                }
1850d40e9d0SAdam Hornáček%>
1860d40e9d0SAdam Hornáček<%
18752dccac1SChris Fraire    String lcName = readMes.get(i).toLowerCase(Locale.ROOT);
1880d40e9d0SAdam Hornáček    if (lcName.endsWith(".md") || lcName.endsWith(".markdown")) {
1890d40e9d0SAdam Hornáček    %><div id="src<%=i%>" data-markdown>
1900d40e9d0SAdam Hornáček        <div class="markdown-heading">
1910d40e9d0SAdam Hornáček            <h3><%= readMes.get(i) %></h3>
1920d40e9d0SAdam Hornáček        </div>
1930d40e9d0SAdam Hornáček        <div class="markdown-content"
1940d40e9d0SAdam Hornáček             data-markdown-download="<%= request.getContextPath() + Prefix.DOWNLOAD_P + Util.URIEncodePath(cfg.getPath() + readMes.get(i)) %>">
1950d40e9d0SAdam Hornáček        </div>
1960d40e9d0SAdam Hornáček        <pre data-markdown-original><%
1970d40e9d0SAdam Hornáček            Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz"));
1980d40e9d0SAdam Hornáček        %></pre>
1990d40e9d0SAdam Hornáček    </div>
2000d40e9d0SAdam Hornáček<% } else { %>
2010d40e9d0SAdam Hornáček    <h3><%= readMes.get(i) %></h3>
2020d40e9d0SAdam Hornáček    <div id="src<%=i%>">
2030d40e9d0SAdam Hornáček        <pre><%
2040d40e9d0SAdam Hornáček            Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz"));
2050d40e9d0SAdam Hornáček        %></pre>
2060d40e9d0SAdam Hornáček    </div>
2070d40e9d0SAdam Hornáček<%
2080d40e9d0SAdam Hornáček    }
2090d40e9d0SAdam Hornáček
2100d40e9d0SAdam Hornáček            }
2110d40e9d0SAdam Hornáček        }
212a03922c4SAdam Hornáček    } else if (rev.length() != 0) {
213a03922c4SAdam Hornáček        // requesting a revision
214*55774b8bSChris Fraire        File xrefFile;
215ee13dbaeSChris Fraire        if (cfg.isLatestRevision(rev) &&
216ee13dbaeSChris Fraire                (xrefFile = cfg.findDataFile()) != null) {
217a03922c4SAdam Hornáček            if (cfg.annotate()) {
2180d40e9d0SAdam Hornáček                // annotate
2190d40e9d0SAdam Hornáček                BufferedInputStream bin =
2200d40e9d0SAdam Hornáček                    new BufferedInputStream(new FileInputStream(resourceFile));
2210d40e9d0SAdam Hornáček                try {
22257eefa47SKryštof Tulinger                    AnalyzerFactory a = AnalyzerGuru.find(basename);
22357eefa47SKryštof Tulinger                    AbstractAnalyzer.Genre g = AnalyzerGuru.getGenre(a);
2240d40e9d0SAdam Hornáček                    if (g == null) {
2250d40e9d0SAdam Hornáček                        a = AnalyzerGuru.find(bin);
2260d40e9d0SAdam Hornáček                        g = AnalyzerGuru.getGenre(a);
2270d40e9d0SAdam Hornáček                    }
22857eefa47SKryštof Tulinger                    if (g == AbstractAnalyzer.Genre.IMAGE) {
2290d40e9d0SAdam Hornáček%>
2300d40e9d0SAdam Hornáček<div id="src">
2310d40e9d0SAdam Hornáček    <img src="<%= rawPath %>"/>
2320d40e9d0SAdam Hornáček</div><%
23357eefa47SKryštof Tulinger                    } else if ( g == AbstractAnalyzer.Genre.HTML) {
2340d40e9d0SAdam Hornáček                        /**
2350d40e9d0SAdam Hornáček                         * For backward compatibility, read the OpenGrok-produced
2360d40e9d0SAdam Hornáček                         * document using the system default charset.
2370d40e9d0SAdam Hornáček                         */
2380d40e9d0SAdam Hornáček                        r = new InputStreamReader(bin);
239e393cb49SAdam Hornáček                        // dumpXref() is also useful here for translating links.
240e393cb49SAdam Hornáček                        Util.dumpXref(out, r, request.getContextPath());
24157eefa47SKryštof Tulinger                    } else if (g == AbstractAnalyzer.Genre.PLAIN) {
2420d40e9d0SAdam Hornáček%>
2430d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
2440d40e9d0SAdam Hornáček    <pre><%
2450d40e9d0SAdam Hornáček                        // We're generating xref for the latest revision, so we can
2460d40e9d0SAdam Hornáček                        // find the definitions in the index.
2470d40e9d0SAdam Hornáček                        Definitions defs = IndexDatabase.getDefinitions(resourceFile);
2480d40e9d0SAdam Hornáček                        Annotation annotation = cfg.getAnnotation();
2490d40e9d0SAdam Hornáček                        // SRCROOT is read with UTF-8 as a default.
2500d40e9d0SAdam Hornáček                        r = IOUtils.createBOMStrippedReader(bin,
2510d40e9d0SAdam Hornáček                            StandardCharsets.UTF_8.name());
252e393cb49SAdam Hornáček                        AnalyzerGuru.writeDumpedXref(request.getContextPath(), a,
253e393cb49SAdam Hornáček                                r, out, defs, annotation, project);
2540d40e9d0SAdam Hornáček    %></pre>
2550d40e9d0SAdam Hornáček</div><%
2560d40e9d0SAdam Hornáček                    } else {
2570d40e9d0SAdam Hornáček%>
2580d40e9d0SAdam HornáčekClick <a href="<%= rawPath %>">download <%= basename %></a><%
2590d40e9d0SAdam Hornáček                    }
2600d40e9d0SAdam Hornáček                } finally {
2610d40e9d0SAdam Hornáček                    if (r != null) {
2620d40e9d0SAdam Hornáček                        try { r.close(); bin = null; }
2630d40e9d0SAdam Hornáček                        catch (Exception e) { /* ignore */ }
2640d40e9d0SAdam Hornáček                    }
2650d40e9d0SAdam Hornáček                    if (bin != null) {
2660d40e9d0SAdam Hornáček                        try { bin.close(); }
2670d40e9d0SAdam Hornáček                        catch (Exception e) { /* ignore */ }
2680d40e9d0SAdam Hornáček                    }
2690d40e9d0SAdam Hornáček                }
270a03922c4SAdam Hornáček
271a03922c4SAdam Hornáček            } else {
2720d40e9d0SAdam Hornáček%>
2730d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
2740d40e9d0SAdam Hornáček    <pre><%
275e393cb49SAdam Hornáček                    boolean compressed = xrefFile.getName().endsWith(".gz");
276e393cb49SAdam Hornáček                    Util.dumpXref(out, xrefFile, compressed,
277e393cb49SAdam Hornáček                            request.getContextPath());
2780d40e9d0SAdam Hornáček    %></pre>
2790d40e9d0SAdam Hornáček</div><%
2800d40e9d0SAdam Hornáček            }
2810d40e9d0SAdam Hornáček        } else {
282f3e7c6e8SVladimir Kotal            // requesting a previous revision or needed to generate xref on the fly (economy mode).
28357eefa47SKryštof Tulinger            AnalyzerFactory a = AnalyzerGuru.find(basename);
284e829566cSChris Fraire            Genre g = AnalyzerGuru.getGenre(a);
2850d40e9d0SAdam Hornáček            String error = null;
286e829566cSChris Fraire            if (g == Genre.PLAIN || g == Genre.HTML || g == null) {
2870d40e9d0SAdam Hornáček                InputStream in = null;
288e829566cSChris Fraire                File tempf = null;
2890d40e9d0SAdam Hornáček                try {
29017c862aeSVladimir Kotal                    if (rev.equals(DUMMY_REVISION)) {
29117c862aeSVladimir Kotal                        in = new FileInputStream(resourceFile);
29217c862aeSVladimir Kotal                    } else {
293e829566cSChris Fraire                        tempf = File.createTempFile("ogtags", basename);
294e829566cSChris Fraire                        if (HistoryGuru.getInstance().getRevision(tempf,
295e829566cSChris Fraire                                resourceFile.getParent(), basename, rev)) {
296e829566cSChris Fraire                            in = new BufferedInputStream(
297e829566cSChris Fraire                                    new FileInputStream(tempf));
298e829566cSChris Fraire                        } else {
299e829566cSChris Fraire                            tempf.delete();
300e829566cSChris Fraire                            tempf = null;
301e829566cSChris Fraire                        }
30217c862aeSVladimir Kotal                    }
3030d40e9d0SAdam Hornáček                } catch (Exception e) {
3040d40e9d0SAdam Hornáček                    // fall through to error message
3050d40e9d0SAdam Hornáček                    error = e.getMessage();
306e829566cSChris Fraire                    if (tempf != null) {
307e829566cSChris Fraire                        tempf.delete();
308e829566cSChris Fraire                        tempf = null;
309e829566cSChris Fraire                    }
3100d40e9d0SAdam Hornáček                }
3110d40e9d0SAdam Hornáček                if (in != null) {
3120d40e9d0SAdam Hornáček                    try {
3130d40e9d0SAdam Hornáček                        if (g == null) {
314e829566cSChris Fraire                            a = AnalyzerGuru.find(in, basename);
3150d40e9d0SAdam Hornáček                            g = AnalyzerGuru.getGenre(a);
3160d40e9d0SAdam Hornáček                        }
31757eefa47SKryštof Tulinger                        if (g == AbstractAnalyzer.Genre.DATA || g == AbstractAnalyzer.Genre.XREFABLE || g == null) {
3180d40e9d0SAdam Hornáček    %>
3190d40e9d0SAdam Hornáček    <div id="src">
3200d40e9d0SAdam Hornáček    Binary file [Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">here</a> to download]
3210d40e9d0SAdam Hornáček    </div><%
3220d40e9d0SAdam Hornáček                        } else {
3230d40e9d0SAdam Hornáček    %>
3240d40e9d0SAdam Hornáček    <div id="src">
3250d40e9d0SAdam Hornáček        <pre><%
32657eefa47SKryštof Tulinger                            if (g == AbstractAnalyzer.Genre.PLAIN) {
3270d40e9d0SAdam Hornáček                                Definitions defs = null;
328e829566cSChris Fraire                                ObjectPool<Ctags> ctagsPool = cfg.getEnv().
329e829566cSChris Fraire                                        getIndexerParallelizer().getCtagsPool();
330e829566cSChris Fraire                                int tries = 2;
331e829566cSChris Fraire                                while (cfg.getEnv().isWebappCtags()) {
332e829566cSChris Fraire                                    Ctags ctags = ctagsPool.get();
333e829566cSChris Fraire                                    try {
334e829566cSChris Fraire                                        ctags.setTabSize(project != null ?
335e829566cSChris Fraire                                                project.getTabSize() : 0);
336e829566cSChris Fraire                                        defs = ctags.doCtags(tempf.getPath());
337e829566cSChris Fraire                                        break;
338e829566cSChris Fraire                                    } catch (InterruptedException ex) {
339e829566cSChris Fraire                                        if (--tries > 0) {
340e829566cSChris Fraire                                            LOGGER.log(Level.WARNING,
341e829566cSChris Fraire                                                    "doCtags() interrupted--{0}",
342e829566cSChris Fraire                                                    ex.getMessage());
343e829566cSChris Fraire                                            continue;
344e829566cSChris Fraire                                        }
345e829566cSChris Fraire                                        LOGGER.log(Level.WARNING, "doCtags()", ex);
346e829566cSChris Fraire                                        break;
347e829566cSChris Fraire                                    } catch (Exception ex) {
348e829566cSChris Fraire                                        LOGGER.log(Level.WARNING, "doCtags()", ex);
349e829566cSChris Fraire                                        break;
350e829566cSChris Fraire                                    } finally {
351e829566cSChris Fraire                                        ctags.reset();
352e829566cSChris Fraire                                        ctagsPool.release(ctags);
353e829566cSChris Fraire                                    }
354e829566cSChris Fraire                                }
3550d40e9d0SAdam Hornáček                                Annotation annotation = cfg.getAnnotation();
3560d40e9d0SAdam Hornáček                                //not needed yet
3570d40e9d0SAdam Hornáček                                //annotation.writeTooltipMap(out);
3580d40e9d0SAdam Hornáček                                // SRCROOT is read with UTF-8 as a default.
3590d40e9d0SAdam Hornáček                                r = IOUtils.createBOMStrippedReader(in,
3600d40e9d0SAdam Hornáček                                    StandardCharsets.UTF_8.name());
361e393cb49SAdam Hornáček                                AnalyzerGuru.writeDumpedXref(
362a03922c4SAdam Hornáček                                        request.getContextPath(),
363a03922c4SAdam Hornáček                                        a, r, out,
364e393cb49SAdam Hornáček                                        defs, annotation, project);
36557eefa47SKryštof Tulinger                            } else if (g == AbstractAnalyzer.Genre.IMAGE) {
3660d40e9d0SAdam Hornáček        %></pre>
3670d40e9d0SAdam Hornáček        <img src="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>"/>
3680d40e9d0SAdam Hornáček        <pre><%
36957eefa47SKryštof Tulinger                            } else if (g == AbstractAnalyzer.Genre.HTML) {
3700d40e9d0SAdam Hornáček                                /**
3710d40e9d0SAdam Hornáček                                 * For backward compatibility, read the
3720d40e9d0SAdam Hornáček                                 * OpenGrok-produced document using the system
3730d40e9d0SAdam Hornáček                                 * default charset.
3740d40e9d0SAdam Hornáček                                 */
3750d40e9d0SAdam Hornáček                                r = new InputStreamReader(in);
376e393cb49SAdam Hornáček                                /**
377e393cb49SAdam Hornáček                                 * dumpXref() is also useful here for
378e393cb49SAdam Hornáček                                 * translating links.
379e393cb49SAdam Hornáček                                 */
380e393cb49SAdam Hornáček                                Util.dumpXref(out, r, request.getContextPath());
3810d40e9d0SAdam Hornáček                            } else {
3820d40e9d0SAdam Hornáček        %> Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">download <%= basename %></a><%
3830d40e9d0SAdam Hornáček                            }
3840d40e9d0SAdam Hornáček                        }
3850d40e9d0SAdam Hornáček                    } catch (IOException e) {
3860d40e9d0SAdam Hornáček                        error = e.getMessage();
3870d40e9d0SAdam Hornáček                    } finally {
3880d40e9d0SAdam Hornáček                        if (r != null) {
3890d40e9d0SAdam Hornáček                            try { r.close(); in = null;}
3900d40e9d0SAdam Hornáček                            catch (Exception e) { /* ignore */ }
3910d40e9d0SAdam Hornáček                        }
3920d40e9d0SAdam Hornáček                        if (in != null) {
3930d40e9d0SAdam Hornáček                            try { in.close(); }
3940d40e9d0SAdam Hornáček                            catch (Exception e) { /* ignore */ }
3950d40e9d0SAdam Hornáček                        }
396e829566cSChris Fraire                        if (tempf != null) {
397e829566cSChris Fraire                            tempf.delete();
398e829566cSChris Fraire                        }
3990d40e9d0SAdam Hornáček                    }
4000d40e9d0SAdam Hornáček        %></pre>
4010d40e9d0SAdam Hornáček    </div><%
4020d40e9d0SAdam Hornáček                } else {
4030d40e9d0SAdam Hornáček    %>
4040d40e9d0SAdam Hornáček    <h3 class="error">Error reading file</h3><%
4050d40e9d0SAdam Hornáček                    if (error != null) {
4060d40e9d0SAdam Hornáček    %>
4070d40e9d0SAdam Hornáček    <p class="error"><%= error %></p><%
4080d40e9d0SAdam Hornáček                    }
4090d40e9d0SAdam Hornáček                }
41057eefa47SKryštof Tulinger            } else if (g == AbstractAnalyzer.Genre.IMAGE) {
4110d40e9d0SAdam Hornáček    %>
4120d40e9d0SAdam Hornáček    <div id="src">
4130d40e9d0SAdam Hornáček        <img src="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>"/>
4140d40e9d0SAdam Hornáček    </div><%
4150d40e9d0SAdam Hornáček            } else {
4160d40e9d0SAdam Hornáček    %>
4170d40e9d0SAdam Hornáček    <div id="src">
4180d40e9d0SAdam Hornáček    Binary file [Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">here</a> to download]
4190d40e9d0SAdam Hornáček    </div><%
4200d40e9d0SAdam Hornáček            }
4210d40e9d0SAdam Hornáček        }
4220d40e9d0SAdam Hornáček    } else {
4230d40e9d0SAdam Hornáček        // requesting cross referenced file
4240d40e9d0SAdam Hornáček
425*55774b8bSChris Fraire        File xrefFile = cfg.findDataFile();
4260d40e9d0SAdam Hornáček        if (xrefFile != null) {
4270d40e9d0SAdam Hornáček%>
4280d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
4290d40e9d0SAdam Hornáček    <pre><%
430e393cb49SAdam Hornáček            boolean compressed = xrefFile.getName().endsWith(".gz");
431e393cb49SAdam Hornáček            Util.dumpXref(out, xrefFile, compressed, request.getContextPath());
4320d40e9d0SAdam Hornáček    %></pre>
4330d40e9d0SAdam Hornáček</div><%
43417c862aeSVladimir Kotal        } else {
43517c862aeSVladimir Kotal%>
4365c4b57feSVladimir Kotal<p class="error">Failed to get xref file</p><%
4370d40e9d0SAdam Hornáček        }
4380d40e9d0SAdam Hornáček    }
4390d40e9d0SAdam Hornáček}
4400d40e9d0SAdam Hornáček/* ---------------------- list.jsp end --------------------- */
4410d40e9d0SAdam Hornáček%><%@
4420d40e9d0SAdam Hornáček
4430d40e9d0SAdam Hornáčekinclude file="foot.jspf"
4440d40e9d0SAdam Hornáček
4450d40e9d0SAdam Hornáček%>
446