xref: /OpenGrok/opengrok-web/src/main/webapp/list.jsp (revision b5cf496828477fb7628070c20c0dd1433e5f9d05)
10d40e9d0SAdam Hornáček<%--
20d40e9d0SAdam HornáčekCDDL HEADER START
30d40e9d0SAdam Hornáček
40d40e9d0SAdam HornáčekThe contents of this file are subject to the terms of the
50d40e9d0SAdam HornáčekCommon Development and Distribution License (the "License").
60d40e9d0SAdam HornáčekYou may not use this file except in compliance with the License.
70d40e9d0SAdam Hornáček
80d40e9d0SAdam HornáčekSee LICENSE.txt included in this distribution for the specific
90d40e9d0SAdam Hornáčeklanguage governing permissions and limitations under the License.
100d40e9d0SAdam Hornáček
110d40e9d0SAdam HornáčekWhen distributing Covered Code, include this CDDL HEADER in each
120d40e9d0SAdam Hornáčekfile and include the License file at LICENSE.txt.
130d40e9d0SAdam HornáčekIf applicable, add the following below this CDDL HEADER, with the
140d40e9d0SAdam Hornáčekfields enclosed by brackets "[]" replaced with your own identifying
150d40e9d0SAdam Hornáčekinformation: Portions Copyright [yyyy] [name of copyright owner]
160d40e9d0SAdam Hornáček
170d40e9d0SAdam HornáčekCDDL HEADER END
180d40e9d0SAdam Hornáček
1956f072caSAdam HornáčekCopyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
200d40e9d0SAdam HornáčekPortions Copyright 2011 Jens Elkner.
215c931ce8SChris FrairePortions Copyright (c) 2017-2020, Chris Fraire <cfraire@me.com>.
220d40e9d0SAdam Hornáček
230d40e9d0SAdam Hornáček--%>
240d40e9d0SAdam Hornáček<%@page errorPage="error.jsp" import="
250d40e9d0SAdam Hornáčekjava.io.BufferedInputStream,
261c830032SChris Frairejava.io.File,
270d40e9d0SAdam Hornáčekjava.io.FileInputStream,
280d40e9d0SAdam Hornáčekjava.io.InputStream,
290d40e9d0SAdam Hornáčekjava.io.InputStreamReader,
301c830032SChris Frairejava.io.IOException,
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,
37e829566cSChris Frairejava.util.logging.Logger,
385c931ce8SChris Frairejava.util.Set,
395c931ce8SChris Frairejava.util.TreeSet,
40686556f2SAdam Hornáčekorg.opengrok.indexer.analysis.AnalyzerGuru,
41e829566cSChris Fraireorg.opengrok.indexer.analysis.Ctags,
42686556f2SAdam Hornáčekorg.opengrok.indexer.analysis.Definitions,
43e829566cSChris Fraireorg.opengrok.indexer.analysis.AbstractAnalyzer,
44e829566cSChris Fraireorg.opengrok.indexer.analysis.AbstractAnalyzer.Genre,
45e829566cSChris Fraireorg.opengrok.indexer.analysis.AnalyzerFactory,
46686556f2SAdam Hornáčekorg.opengrok.indexer.history.Annotation,
471c830032SChris Fraireorg.opengrok.indexer.history.HistoryGuru,
48686556f2SAdam Hornáčekorg.opengrok.indexer.index.IndexDatabase,
49e829566cSChris Fraireorg.opengrok.indexer.logger.LoggerFactory,
50686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryEntry,
51686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryExtraReader,
52686556f2SAdam Hornáčekorg.opengrok.indexer.search.FileExtra,
53686556f2SAdam Hornáčekorg.opengrok.indexer.util.FileExtraZipper,
547d004396SChris Fraireorg.opengrok.indexer.util.ForbiddenSymlinkException,
55e829566cSChris Fraireorg.opengrok.indexer.util.ObjectPool,
56686556f2SAdam Hornáčekorg.opengrok.indexer.util.IOUtils,
571c830032SChris Fraireorg.opengrok.indexer.web.QueryParameters,
5856f072caSAdam Hornáčekorg.opengrok.web.DirectoryListing,
59686556f2SAdam Hornáčekorg.opengrok.indexer.web.SearchHelper"
6057eefa47SKryštof Tulinger%>
6157eefa47SKryštof Tulinger<%
6255774b8bSChris Frairefinal String DUMMY_REVISION = "unknown";
6355774b8bSChris Fraire
640d40e9d0SAdam Hornáček{
650d40e9d0SAdam Hornáček    // need to set it here since requesting parameters
660d40e9d0SAdam Hornáček    if (request.getCharacterEncoding() == null) {
670d40e9d0SAdam Hornáček        request.setCharacterEncoding("UTF-8");
680d40e9d0SAdam Hornáček    }
690d40e9d0SAdam Hornáček
700d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
710d40e9d0SAdam Hornáček    cfg.checkSourceRootExistence();
720d40e9d0SAdam Hornáček
7355774b8bSChris Fraire    String rev = cfg.getRequestedRevision();
7455774b8bSChris Fraire    if (!cfg.isDir() && rev.length() == 0) {
7555774b8bSChris Fraire        /*
7655774b8bSChris Fraire         * Get the latest revision and redirect so that the revision number
7755774b8bSChris Fraire         * appears in the URL.
7855774b8bSChris Fraire         */
7996b0c142SChris Fraire        String latestRevision = cfg.getLatestRevision();
8096b0c142SChris Fraire        if (latestRevision != null) {
8196b0c142SChris Fraire            String location = cfg.getRevisionLocation(latestRevision);
8255774b8bSChris Fraire            response.sendRedirect(location);
8355774b8bSChris Fraire            return;
8455774b8bSChris Fraire        }
8555774b8bSChris Fraire        if (!cfg.getEnv().isGenerateHtml()) {
8655774b8bSChris Fraire            /*
8755774b8bSChris Fraire             * Economy mode is on and failed to get the last revision
8855774b8bSChris Fraire             * (presumably running with history turned off).  Use dummy
8955774b8bSChris Fraire             * revision string so that xref can be generated from the resource
9055774b8bSChris Fraire             * file directly.
9155774b8bSChris Fraire             */
9296b0c142SChris Fraire            String location = cfg.getRevisionLocation(DUMMY_REVISION);
9355774b8bSChris Fraire            response.sendRedirect(location);
9455774b8bSChris Fraire            return;
9555774b8bSChris Fraire        }
9655774b8bSChris Fraire    }
9755774b8bSChris Fraire
980d40e9d0SAdam Hornáček    Annotation annotation = cfg.getAnnotation();
990d40e9d0SAdam Hornáček    if (annotation != null) {
1000d40e9d0SAdam Hornáček        int r = annotation.getWidestRevision();
1010d40e9d0SAdam Hornáček        int a = annotation.getWidestAuthor();
1020d40e9d0SAdam Hornáček        cfg.addHeaderData("<style type=\"text/css\">"
1030d40e9d0SAdam Hornáček            + ".blame .r { width: " + (r == 0 ? 6 : Math.ceil(r * 0.7)) + "em; } "
1040d40e9d0SAdam Hornáček            + ".blame .a { width: " + (a == 0 ? 6 : Math.ceil(a * 0.7)) + "em; } "
1050d40e9d0SAdam Hornáček            + "</style>");
1060d40e9d0SAdam Hornáček    }
1070d40e9d0SAdam Hornáček}
1080d40e9d0SAdam Hornáček%><%@include
1090d40e9d0SAdam Hornáček
1100d40e9d0SAdam Hornáčekfile="mast.jsp"
1110d40e9d0SAdam Hornáček
1120d40e9d0SAdam Hornáček%><script type="text/javascript">/* <![CDATA[ */
1130d40e9d0SAdam Hornáčekdocument.pageReady.push(function() { pageReadyList();});
1140d40e9d0SAdam Hornáček/* ]]> */</script>
1150d40e9d0SAdam Hornáček<%
1160d40e9d0SAdam Hornáček/* ---------------------- list.jsp start --------------------- */
1170d40e9d0SAdam Hornáček{
118e829566cSChris Fraire    final Logger LOGGER = LoggerFactory.getLogger(getClass());
119e829566cSChris Fraire
1200d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
1210d40e9d0SAdam Hornáček    String rev = cfg.getRequestedRevision();
122e393cb49SAdam Hornáček    Project project = cfg.getProject();
1230d40e9d0SAdam Hornáček
124e393cb49SAdam Hornáček    String navigateWindowEnabled = project != null ? Boolean.toString(
125e393cb49SAdam Hornáček            project.isNavigateWindowEnabled()) : "false";
1260d40e9d0SAdam Hornáček    File resourceFile = cfg.getResourceFile();
1270d40e9d0SAdam Hornáček    String path = cfg.getPath();
1280d40e9d0SAdam Hornáček    String basename = resourceFile.getName();
1290d40e9d0SAdam Hornáček    String rawPath = request.getContextPath() + Prefix.DOWNLOAD_P + path;
1300d40e9d0SAdam Hornáček    Reader r = null;
1310d40e9d0SAdam Hornáček    if (cfg.isDir()) {
1320d40e9d0SAdam Hornáček        // valid resource is requested
1330d40e9d0SAdam Hornáček        // mast.jsp assures, that resourceFile is valid and not /
1340d40e9d0SAdam Hornáček        // see cfg.resourceNotAvailable()
1350d40e9d0SAdam Hornáček        String cookieValue = cfg.getRequestedProjectsAsString();
1365c931ce8SChris Fraire        String projectName = null;
137e393cb49SAdam Hornáček        if (project != null) {
1385c931ce8SChris Fraire            projectName = project.getName();
1390d40e9d0SAdam Hornáček            Set<String>  projects = cfg.getRequestedProjects();
1405c931ce8SChris Fraire            if (!projects.contains(projectName)) {
1415c931ce8SChris Fraire                projects.add(projectName);
1420d40e9d0SAdam Hornáček                // update cookie
1435c931ce8SChris Fraire                cookieValue = cookieValue.length() == 0 ? projectName :
1445c931ce8SChris Fraire                        projectName + ',' + cookieValue;
1450d40e9d0SAdam Hornáček                Cookie cookie = new Cookie(PageConfig.OPEN_GROK_PROJECT, URLEncoder.encode(cookieValue, "utf-8"));
1460d40e9d0SAdam Hornáček                // TODO hmmm, projects.jspf doesn't set a path
1470d40e9d0SAdam Hornáček                cookie.setPath(request.getContextPath() + '/');
1480d40e9d0SAdam Hornáček                response.addCookie(cookie);
1490d40e9d0SAdam Hornáček            }
1500d40e9d0SAdam Hornáček        }
1510d40e9d0SAdam Hornáček        // requesting a directory listing
1520d40e9d0SAdam Hornáček        DirectoryListing dl = new DirectoryListing(cfg.getEftarReader());
1530d40e9d0SAdam Hornáček        List<String> files = cfg.getResourceFileList();
1540d40e9d0SAdam Hornáček        if (!files.isEmpty()) {
1550d40e9d0SAdam Hornáček            List<FileExtra> extras = null;
1560d40e9d0SAdam Hornáček            SearchHelper searchHelper = cfg.prepareInternalSearch();
1575c931ce8SChris Fraire            /*
1585c931ce8SChris Fraire             * N.b. searchHelper.destroy() is called via
1595c931ce8SChris Fraire             * WebappListener.requestDestroyed() on presence of the following
1605c931ce8SChris Fraire             * REQUEST_ATTR.
1615c931ce8SChris Fraire             */
1620d40e9d0SAdam Hornáček            request.setAttribute(SearchHelper.REQUEST_ATTR, searchHelper);
1635c931ce8SChris Fraire            if (project != null) {
164e393cb49SAdam Hornáček                searchHelper.prepareExec(project);
1655c931ce8SChris Fraire            } else {
1665c931ce8SChris Fraire                //noinspection Convert2Diamond
1675c931ce8SChris Fraire                searchHelper.prepareExec(new TreeSet<String>());
1685c931ce8SChris Fraire            }
1690d40e9d0SAdam Hornáček
1700d40e9d0SAdam Hornáček            if (searchHelper.searcher != null) {
1715c931ce8SChris Fraire                DirectoryExtraReader extraReader = new DirectoryExtraReader();
1727d004396SChris Fraire                String primePath = path;
1737d004396SChris Fraire                try {
1745c931ce8SChris Fraire                    primePath = searchHelper.getPrimeRelativePath(projectName, path);
1757d004396SChris Fraire                } catch (IOException | ForbiddenSymlinkException ex) {
1767d004396SChris Fraire                    LOGGER.log(Level.WARNING, String.format(
1777d004396SChris Fraire                            "Error getting prime relative for %s", path), ex);
1787d004396SChris Fraire                }
1797d004396SChris Fraire                extras = extraReader.search(searchHelper.searcher, primePath);
1800d40e9d0SAdam Hornáček            }
1810d40e9d0SAdam Hornáček
1820d40e9d0SAdam Hornáček            FileExtraZipper zipper = new FileExtraZipper();
1830d40e9d0SAdam Hornáček            List<DirectoryEntry> entries = zipper.zip(resourceFile, files,
1840d40e9d0SAdam Hornáček                extras);
1850d40e9d0SAdam Hornáček
1860d40e9d0SAdam Hornáček            List<String> readMes = dl.extraListTo(
1870d40e9d0SAdam Hornáček                    Util.URIEncodePath(request.getContextPath()),
1880d40e9d0SAdam Hornáček                    resourceFile, out, path, entries);
1890d40e9d0SAdam Hornáček            File[] catfiles = cfg.findDataFiles(readMes);
1900d40e9d0SAdam Hornáček            for (int i=0; i < catfiles.length; i++) {
1910d40e9d0SAdam Hornáček                if (catfiles[i] == null) {
1920d40e9d0SAdam Hornáček                    continue;
1930d40e9d0SAdam Hornáček                }
1940d40e9d0SAdam Hornáček%>
1950d40e9d0SAdam Hornáček<%
19652dccac1SChris Fraire    String lcName = readMes.get(i).toLowerCase(Locale.ROOT);
1970d40e9d0SAdam Hornáček    if (lcName.endsWith(".md") || lcName.endsWith(".markdown")) {
1980d40e9d0SAdam Hornáček    %><div id="src<%=i%>" data-markdown>
1990d40e9d0SAdam Hornáček        <div class="markdown-heading">
2000d40e9d0SAdam Hornáček            <h3><%= readMes.get(i) %></h3>
2010d40e9d0SAdam Hornáček        </div>
2020d40e9d0SAdam Hornáček        <div class="markdown-content"
2030d40e9d0SAdam Hornáček             data-markdown-download="<%= request.getContextPath() + Prefix.DOWNLOAD_P + Util.URIEncodePath(cfg.getPath() + readMes.get(i)) %>">
2040d40e9d0SAdam Hornáček        </div>
2050d40e9d0SAdam Hornáček        <pre data-markdown-original><%
2060d40e9d0SAdam Hornáček            Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz"));
2070d40e9d0SAdam Hornáček        %></pre>
2080d40e9d0SAdam Hornáček    </div>
2090d40e9d0SAdam Hornáček<% } else { %>
2100d40e9d0SAdam Hornáček    <h3><%= readMes.get(i) %></h3>
2110d40e9d0SAdam Hornáček    <div id="src<%=i%>">
2120d40e9d0SAdam Hornáček        <pre><%
2130d40e9d0SAdam Hornáček            Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz"));
2140d40e9d0SAdam Hornáček        %></pre>
2150d40e9d0SAdam Hornáček    </div>
2160d40e9d0SAdam Hornáček<%
2170d40e9d0SAdam Hornáček    }
2180d40e9d0SAdam Hornáček
2190d40e9d0SAdam Hornáček            }
2200d40e9d0SAdam Hornáček        }
221a03922c4SAdam Hornáček    } else if (rev.length() != 0) {
222a03922c4SAdam Hornáček        // requesting a revision
22355774b8bSChris Fraire        File xrefFile;
224ee13dbaeSChris Fraire        if (cfg.isLatestRevision(rev) &&
225ee13dbaeSChris Fraire                (xrefFile = cfg.findDataFile()) != null) {
226a03922c4SAdam Hornáček            if (cfg.annotate()) {
2270d40e9d0SAdam Hornáček                // annotate
2280d40e9d0SAdam Hornáček                BufferedInputStream bin =
2290d40e9d0SAdam Hornáček                    new BufferedInputStream(new FileInputStream(resourceFile));
2300d40e9d0SAdam Hornáček                try {
23157eefa47SKryštof Tulinger                    AnalyzerFactory a = AnalyzerGuru.find(basename);
23257eefa47SKryštof Tulinger                    AbstractAnalyzer.Genre g = AnalyzerGuru.getGenre(a);
2330d40e9d0SAdam Hornáček                    if (g == null) {
2340d40e9d0SAdam Hornáček                        a = AnalyzerGuru.find(bin);
2350d40e9d0SAdam Hornáček                        g = AnalyzerGuru.getGenre(a);
2360d40e9d0SAdam Hornáček                    }
23757eefa47SKryštof Tulinger                    if (g == AbstractAnalyzer.Genre.IMAGE) {
2380d40e9d0SAdam Hornáček%>
2390d40e9d0SAdam Hornáček<div id="src">
2401c830032SChris Fraire    <img src="<%= rawPath %>" alt="Image from Source Repository"/>
2410d40e9d0SAdam Hornáček</div><%
24257eefa47SKryštof Tulinger                    } else if ( g == AbstractAnalyzer.Genre.HTML) {
2430d40e9d0SAdam Hornáček                        /**
2440d40e9d0SAdam Hornáček                         * For backward compatibility, read the OpenGrok-produced
2450d40e9d0SAdam Hornáček                         * document using the system default charset.
2460d40e9d0SAdam Hornáček                         */
2470d40e9d0SAdam Hornáček                        r = new InputStreamReader(bin);
248e393cb49SAdam Hornáček                        // dumpXref() is also useful here for translating links.
249e393cb49SAdam Hornáček                        Util.dumpXref(out, r, request.getContextPath());
25057eefa47SKryštof Tulinger                    } else if (g == AbstractAnalyzer.Genre.PLAIN) {
2510d40e9d0SAdam Hornáček%>
2520d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
2530d40e9d0SAdam Hornáček    <pre><%
2540d40e9d0SAdam Hornáček                        // We're generating xref for the latest revision, so we can
2550d40e9d0SAdam Hornáček                        // find the definitions in the index.
2560d40e9d0SAdam Hornáček                        Definitions defs = IndexDatabase.getDefinitions(resourceFile);
2570d40e9d0SAdam Hornáček                        Annotation annotation = cfg.getAnnotation();
2580d40e9d0SAdam Hornáček                        // SRCROOT is read with UTF-8 as a default.
2590d40e9d0SAdam Hornáček                        r = IOUtils.createBOMStrippedReader(bin,
2600d40e9d0SAdam Hornáček                            StandardCharsets.UTF_8.name());
261e393cb49SAdam Hornáček                        AnalyzerGuru.writeDumpedXref(request.getContextPath(), a,
262e393cb49SAdam Hornáček                                r, out, defs, annotation, project);
2630d40e9d0SAdam Hornáček    %></pre>
2640d40e9d0SAdam Hornáček</div><%
2650d40e9d0SAdam Hornáček                    } else {
2660d40e9d0SAdam Hornáček%>
2670d40e9d0SAdam HornáčekClick <a href="<%= rawPath %>">download <%= basename %></a><%
2680d40e9d0SAdam Hornáček                    }
2690d40e9d0SAdam Hornáček                } finally {
2700d40e9d0SAdam Hornáček                    if (r != null) {
271963a3f81SChris Fraire                        IOUtils.close(r);
272963a3f81SChris Fraire                        bin = null;
2730d40e9d0SAdam Hornáček                    }
2740d40e9d0SAdam Hornáček                    if (bin != null) {
275963a3f81SChris Fraire                        IOUtils.close(bin);
276963a3f81SChris Fraire                        bin = null;
2770d40e9d0SAdam Hornáček                    }
2780d40e9d0SAdam Hornáček                }
279a03922c4SAdam Hornáček
280a03922c4SAdam Hornáček            } else {
2810d40e9d0SAdam Hornáček%>
2820d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
2830d40e9d0SAdam Hornáček    <pre><%
284e393cb49SAdam Hornáček                    boolean compressed = xrefFile.getName().endsWith(".gz");
285e393cb49SAdam Hornáček                    Util.dumpXref(out, xrefFile, compressed,
286e393cb49SAdam Hornáček                            request.getContextPath());
2870d40e9d0SAdam Hornáček    %></pre>
2880d40e9d0SAdam Hornáček</div><%
2890d40e9d0SAdam Hornáček            }
2900d40e9d0SAdam Hornáček        } else {
291f3e7c6e8SVladimir Kotal            // requesting a previous revision or needed to generate xref on the fly (economy mode).
29257eefa47SKryštof Tulinger            AnalyzerFactory a = AnalyzerGuru.find(basename);
293e829566cSChris Fraire            Genre g = AnalyzerGuru.getGenre(a);
2940d40e9d0SAdam Hornáček            String error = null;
295e829566cSChris Fraire            if (g == Genre.PLAIN || g == Genre.HTML || g == null) {
2960d40e9d0SAdam Hornáček                InputStream in = null;
297e829566cSChris Fraire                File tempf = null;
2980d40e9d0SAdam Hornáček                try {
29917c862aeSVladimir Kotal                    if (rev.equals(DUMMY_REVISION)) {
30017c862aeSVladimir Kotal                        in = new FileInputStream(resourceFile);
30117c862aeSVladimir Kotal                    } else {
302e829566cSChris Fraire                        tempf = File.createTempFile("ogtags", basename);
303e829566cSChris Fraire                        if (HistoryGuru.getInstance().getRevision(tempf,
304e829566cSChris Fraire                                resourceFile.getParent(), basename, rev)) {
305e829566cSChris Fraire                            in = new BufferedInputStream(
306e829566cSChris Fraire                                    new FileInputStream(tempf));
307e829566cSChris Fraire                        } else {
308e829566cSChris Fraire                            tempf.delete();
309e829566cSChris Fraire                            tempf = null;
310e829566cSChris Fraire                        }
31117c862aeSVladimir Kotal                    }
3120d40e9d0SAdam Hornáček                } catch (Exception e) {
3130d40e9d0SAdam Hornáček                    // fall through to error message
3140d40e9d0SAdam Hornáček                    error = e.getMessage();
315e829566cSChris Fraire                    if (tempf != null) {
316e829566cSChris Fraire                        tempf.delete();
317e829566cSChris Fraire                        tempf = null;
318e829566cSChris Fraire                    }
3190d40e9d0SAdam Hornáček                }
3200d40e9d0SAdam Hornáček                if (in != null) {
3210d40e9d0SAdam Hornáček                    try {
3220d40e9d0SAdam Hornáček                        if (g == null) {
323e829566cSChris Fraire                            a = AnalyzerGuru.find(in, basename);
3240d40e9d0SAdam Hornáček                            g = AnalyzerGuru.getGenre(a);
3250d40e9d0SAdam Hornáček                        }
32657eefa47SKryštof Tulinger                        if (g == AbstractAnalyzer.Genre.DATA || g == AbstractAnalyzer.Genre.XREFABLE || g == null) {
3270d40e9d0SAdam Hornáček    %>
3280d40e9d0SAdam Hornáček    <div id="src">
3291c830032SChris Fraire    Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %>
3301c830032SChris Fraire        <%= Util.URIEncode(rev) %>"><%= basename %></a>
3310d40e9d0SAdam Hornáček    </div><%
3320d40e9d0SAdam Hornáček                        } else {
3330d40e9d0SAdam Hornáček    %>
3340d40e9d0SAdam Hornáček    <div id="src">
3350d40e9d0SAdam Hornáček        <pre><%
33657eefa47SKryštof Tulinger                            if (g == AbstractAnalyzer.Genre.PLAIN) {
3370d40e9d0SAdam Hornáček                                Definitions defs = null;
338e829566cSChris Fraire                                ObjectPool<Ctags> ctagsPool = cfg.getEnv().
339e829566cSChris Fraire                                        getIndexerParallelizer().getCtagsPool();
340e829566cSChris Fraire                                int tries = 2;
341e829566cSChris Fraire                                while (cfg.getEnv().isWebappCtags()) {
342e829566cSChris Fraire                                    Ctags ctags = ctagsPool.get();
343e829566cSChris Fraire                                    try {
344e829566cSChris Fraire                                        ctags.setTabSize(project != null ?
345e829566cSChris Fraire                                                project.getTabSize() : 0);
346e829566cSChris Fraire                                        defs = ctags.doCtags(tempf.getPath());
347e829566cSChris Fraire                                        break;
348e829566cSChris Fraire                                    } catch (InterruptedException ex) {
349e829566cSChris Fraire                                        if (--tries > 0) {
350e829566cSChris Fraire                                            LOGGER.log(Level.WARNING,
351e829566cSChris Fraire                                                    "doCtags() interrupted--{0}",
352e829566cSChris Fraire                                                    ex.getMessage());
353e829566cSChris Fraire                                            continue;
354e829566cSChris Fraire                                        }
355e829566cSChris Fraire                                        LOGGER.log(Level.WARNING, "doCtags()", ex);
356e829566cSChris Fraire                                        break;
357e829566cSChris Fraire                                    } catch (Exception ex) {
358e829566cSChris Fraire                                        LOGGER.log(Level.WARNING, "doCtags()", ex);
359e829566cSChris Fraire                                        break;
360e829566cSChris Fraire                                    } finally {
361e829566cSChris Fraire                                        ctags.reset();
362e829566cSChris Fraire                                        ctagsPool.release(ctags);
363e829566cSChris Fraire                                    }
364e829566cSChris Fraire                                }
3650d40e9d0SAdam Hornáček                                Annotation annotation = cfg.getAnnotation();
3660d40e9d0SAdam Hornáček                                //not needed yet
3670d40e9d0SAdam Hornáček                                //annotation.writeTooltipMap(out);
3680d40e9d0SAdam Hornáček                                // SRCROOT is read with UTF-8 as a default.
3690d40e9d0SAdam Hornáček                                r = IOUtils.createBOMStrippedReader(in,
3700d40e9d0SAdam Hornáček                                    StandardCharsets.UTF_8.name());
371e393cb49SAdam Hornáček                                AnalyzerGuru.writeDumpedXref(
372a03922c4SAdam Hornáček                                        request.getContextPath(),
373a03922c4SAdam Hornáček                                        a, r, out,
374e393cb49SAdam Hornáček                                        defs, annotation, project);
37557eefa47SKryštof Tulinger                            } else if (g == AbstractAnalyzer.Genre.IMAGE) {
3760d40e9d0SAdam Hornáček        %></pre>
3771c830032SChris Fraire        <img src="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %><%= Util.URIEncode(rev) %>"/>
3780d40e9d0SAdam Hornáček        <pre><%
37957eefa47SKryštof Tulinger                            } else if (g == AbstractAnalyzer.Genre.HTML) {
3800d40e9d0SAdam Hornáček                                /**
3810d40e9d0SAdam Hornáček                                 * For backward compatibility, read the
3820d40e9d0SAdam Hornáček                                 * OpenGrok-produced document using the system
3830d40e9d0SAdam Hornáček                                 * default charset.
3840d40e9d0SAdam Hornáček                                 */
3850d40e9d0SAdam Hornáček                                r = new InputStreamReader(in);
386e393cb49SAdam Hornáček                                /**
387e393cb49SAdam Hornáček                                 * dumpXref() is also useful here for
388e393cb49SAdam Hornáček                                 * translating links.
389e393cb49SAdam Hornáček                                 */
390e393cb49SAdam Hornáček                                Util.dumpXref(out, r, request.getContextPath());
3910d40e9d0SAdam Hornáček                            } else {
3921c830032SChris Fraire        %>Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %>
3931c830032SChris Fraire            <%= Util.URIEncode(rev) %>"><%= basename %></a><%
3940d40e9d0SAdam Hornáček                            }
3950d40e9d0SAdam Hornáček                        }
3960d40e9d0SAdam Hornáček                    } catch (IOException e) {
397*b5cf4968SChris Fraire                        LOGGER.log(Level.SEVERE, "Failed xref on-the-fly", e);
3980d40e9d0SAdam Hornáček                    } finally {
3990d40e9d0SAdam Hornáček                        if (r != null) {
400963a3f81SChris Fraire                            IOUtils.close(r);
401963a3f81SChris Fraire                            in = null;
4020d40e9d0SAdam Hornáček                        }
4030d40e9d0SAdam Hornáček                        if (in != null) {
404963a3f81SChris Fraire                            IOUtils.close(in);
405963a3f81SChris Fraire                            in = null;
4060d40e9d0SAdam Hornáček                        }
407e829566cSChris Fraire                        if (tempf != null) {
408e829566cSChris Fraire                            tempf.delete();
409e829566cSChris Fraire                        }
4100d40e9d0SAdam Hornáček                    }
4110d40e9d0SAdam Hornáček        %></pre>
4120d40e9d0SAdam Hornáček    </div><%
4130d40e9d0SAdam Hornáček                } else {
4140d40e9d0SAdam Hornáček    %>
4150d40e9d0SAdam Hornáček    <h3 class="error">Error reading file</h3><%
4160d40e9d0SAdam Hornáček                    if (error != null) {
4170d40e9d0SAdam Hornáček    %>
4180d40e9d0SAdam Hornáček    <p class="error"><%= error %></p><%
4190d40e9d0SAdam Hornáček                    }
4200d40e9d0SAdam Hornáček                }
42157eefa47SKryštof Tulinger            } else if (g == AbstractAnalyzer.Genre.IMAGE) {
4220d40e9d0SAdam Hornáček    %>
4230d40e9d0SAdam Hornáček    <div id="src">
4241c830032SChris Fraire        <img src="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %><%= Util.URIEncode(rev) %>"
4251c830032SChris Fraire	    alt="Image from Source Repository"/>
4260d40e9d0SAdam Hornáček    </div><%
4270d40e9d0SAdam Hornáček            } else {
4280d40e9d0SAdam Hornáček    %>
4290d40e9d0SAdam Hornáček    <div id="src">
4301c830032SChris Fraire    Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %>
4311c830032SChris Fraire        <%= Util.URIEncode(rev) %>"><%= basename %></a>
4320d40e9d0SAdam Hornáček    </div><%
4330d40e9d0SAdam Hornáček            }
4340d40e9d0SAdam Hornáček        }
4350d40e9d0SAdam Hornáček    } else {
4360d40e9d0SAdam Hornáček        // requesting cross referenced file
4370d40e9d0SAdam Hornáček
43855774b8bSChris Fraire        File xrefFile = cfg.findDataFile();
4390d40e9d0SAdam Hornáček        if (xrefFile != null) {
4400d40e9d0SAdam Hornáček%>
4410d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
4420d40e9d0SAdam Hornáček    <pre><%
443e393cb49SAdam Hornáček            boolean compressed = xrefFile.getName().endsWith(".gz");
444e393cb49SAdam Hornáček            Util.dumpXref(out, xrefFile, compressed, request.getContextPath());
4450d40e9d0SAdam Hornáček    %></pre>
4460d40e9d0SAdam Hornáček</div><%
44717c862aeSVladimir Kotal        } else {
44817c862aeSVladimir Kotal%>
4495c4b57feSVladimir Kotal<p class="error">Failed to get xref file</p><%
4500d40e9d0SAdam Hornáček        }
4510d40e9d0SAdam Hornáček    }
4520d40e9d0SAdam Hornáček}
4530d40e9d0SAdam Hornáček/* ---------------------- list.jsp end --------------------- */
4540d40e9d0SAdam Hornáček%><%@
4550d40e9d0SAdam Hornáček
4560d40e9d0SAdam Hornáčekinclude file="foot.jspf"
4570d40e9d0SAdam Hornáček
4580d40e9d0SAdam Hornáček%>
459