xref: /OpenGrok/opengrok-web/src/main/webapp/list.jsp (revision 963a3f81841bb4742587571f143f6c44608a44ca)
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         */
7955774b8bSChris Fraire        String location = cfg.getRevisionLocation(cfg.getLatestRevision());
8055774b8bSChris Fraire        if (location != null) {
8155774b8bSChris Fraire            response.sendRedirect(location);
8255774b8bSChris Fraire            return;
8355774b8bSChris Fraire        }
8455774b8bSChris Fraire        if (!cfg.getEnv().isGenerateHtml()) {
8555774b8bSChris Fraire            /*
8655774b8bSChris Fraire             * Economy mode is on and failed to get the last revision
8755774b8bSChris Fraire             * (presumably running with history turned off).  Use dummy
8855774b8bSChris Fraire             * revision string so that xref can be generated from the resource
8955774b8bSChris Fraire             * file directly.
9055774b8bSChris Fraire             */
9155774b8bSChris Fraire            location = cfg.getRevisionLocation(DUMMY_REVISION);
9255774b8bSChris Fraire            response.sendRedirect(location);
9355774b8bSChris Fraire            return;
9455774b8bSChris Fraire        }
9555774b8bSChris Fraire    }
9655774b8bSChris Fraire
970d40e9d0SAdam Hornáček    Annotation annotation = cfg.getAnnotation();
980d40e9d0SAdam Hornáček    if (annotation != null) {
990d40e9d0SAdam Hornáček        int r = annotation.getWidestRevision();
1000d40e9d0SAdam Hornáček        int a = annotation.getWidestAuthor();
1010d40e9d0SAdam Hornáček        cfg.addHeaderData("<style type=\"text/css\">"
1020d40e9d0SAdam Hornáček            + ".blame .r { width: " + (r == 0 ? 6 : Math.ceil(r * 0.7)) + "em; } "
1030d40e9d0SAdam Hornáček            + ".blame .a { width: " + (a == 0 ? 6 : Math.ceil(a * 0.7)) + "em; } "
1040d40e9d0SAdam Hornáček            + "</style>");
1050d40e9d0SAdam Hornáček    }
1060d40e9d0SAdam Hornáček}
1070d40e9d0SAdam Hornáček%><%@include
1080d40e9d0SAdam Hornáček
1090d40e9d0SAdam Hornáčekfile="mast.jsp"
1100d40e9d0SAdam Hornáček
1110d40e9d0SAdam Hornáček%><script type="text/javascript">/* <![CDATA[ */
1120d40e9d0SAdam Hornáčekdocument.pageReady.push(function() { pageReadyList();});
1130d40e9d0SAdam Hornáček/* ]]> */</script>
1140d40e9d0SAdam Hornáček<%
1150d40e9d0SAdam Hornáček/* ---------------------- list.jsp start --------------------- */
1160d40e9d0SAdam Hornáček{
117e829566cSChris Fraire    final Logger LOGGER = LoggerFactory.getLogger(getClass());
118e829566cSChris Fraire
1190d40e9d0SAdam Hornáček    PageConfig cfg = PageConfig.get(request);
1200d40e9d0SAdam Hornáček    String rev = cfg.getRequestedRevision();
121e393cb49SAdam Hornáček    Project project = cfg.getProject();
1220d40e9d0SAdam Hornáček
123e393cb49SAdam Hornáček    String navigateWindowEnabled = project != null ? Boolean.toString(
124e393cb49SAdam Hornáček            project.isNavigateWindowEnabled()) : "false";
1250d40e9d0SAdam Hornáček    File resourceFile = cfg.getResourceFile();
1260d40e9d0SAdam Hornáček    String path = cfg.getPath();
1270d40e9d0SAdam Hornáček    String basename = resourceFile.getName();
1280d40e9d0SAdam Hornáček    String rawPath = request.getContextPath() + Prefix.DOWNLOAD_P + path;
1290d40e9d0SAdam Hornáček    Reader r = null;
1300d40e9d0SAdam Hornáček    if (cfg.isDir()) {
1310d40e9d0SAdam Hornáček        // valid resource is requested
1320d40e9d0SAdam Hornáček        // mast.jsp assures, that resourceFile is valid and not /
1330d40e9d0SAdam Hornáček        // see cfg.resourceNotAvailable()
1340d40e9d0SAdam Hornáček        String cookieValue = cfg.getRequestedProjectsAsString();
1355c931ce8SChris Fraire        String projectName = null;
136e393cb49SAdam Hornáček        if (project != null) {
1375c931ce8SChris Fraire            projectName = project.getName();
1380d40e9d0SAdam Hornáček            Set<String>  projects = cfg.getRequestedProjects();
1395c931ce8SChris Fraire            if (!projects.contains(projectName)) {
1405c931ce8SChris Fraire                projects.add(projectName);
1410d40e9d0SAdam Hornáček                // update cookie
1425c931ce8SChris Fraire                cookieValue = cookieValue.length() == 0 ? projectName :
1435c931ce8SChris Fraire                        projectName + ',' + cookieValue;
1440d40e9d0SAdam Hornáček                Cookie cookie = new Cookie(PageConfig.OPEN_GROK_PROJECT, URLEncoder.encode(cookieValue, "utf-8"));
1450d40e9d0SAdam Hornáček                // TODO hmmm, projects.jspf doesn't set a path
1460d40e9d0SAdam Hornáček                cookie.setPath(request.getContextPath() + '/');
1470d40e9d0SAdam Hornáček                response.addCookie(cookie);
1480d40e9d0SAdam Hornáček            }
1490d40e9d0SAdam Hornáček        }
1500d40e9d0SAdam Hornáček        // requesting a directory listing
1510d40e9d0SAdam Hornáček        DirectoryListing dl = new DirectoryListing(cfg.getEftarReader());
1520d40e9d0SAdam Hornáček        List<String> files = cfg.getResourceFileList();
1530d40e9d0SAdam Hornáček        if (!files.isEmpty()) {
1540d40e9d0SAdam Hornáček            List<FileExtra> extras = null;
1550d40e9d0SAdam Hornáček            SearchHelper searchHelper = cfg.prepareInternalSearch();
1565c931ce8SChris Fraire            /*
1575c931ce8SChris Fraire             * N.b. searchHelper.destroy() is called via
1585c931ce8SChris Fraire             * WebappListener.requestDestroyed() on presence of the following
1595c931ce8SChris Fraire             * REQUEST_ATTR.
1605c931ce8SChris Fraire             */
1610d40e9d0SAdam Hornáček            request.setAttribute(SearchHelper.REQUEST_ATTR, searchHelper);
1625c931ce8SChris Fraire            if (project != null) {
163e393cb49SAdam Hornáček                searchHelper.prepareExec(project);
1645c931ce8SChris Fraire            } else {
1655c931ce8SChris Fraire                //noinspection Convert2Diamond
1665c931ce8SChris Fraire                searchHelper.prepareExec(new TreeSet<String>());
1675c931ce8SChris Fraire            }
1680d40e9d0SAdam Hornáček
1690d40e9d0SAdam Hornáček            if (searchHelper.searcher != null) {
1705c931ce8SChris Fraire                DirectoryExtraReader extraReader = new DirectoryExtraReader();
1717d004396SChris Fraire                String primePath = path;
1727d004396SChris Fraire                try {
1735c931ce8SChris Fraire                    primePath = searchHelper.getPrimeRelativePath(projectName, path);
1747d004396SChris Fraire                } catch (IOException | ForbiddenSymlinkException ex) {
1757d004396SChris Fraire                    LOGGER.log(Level.WARNING, String.format(
1767d004396SChris Fraire                            "Error getting prime relative for %s", path), ex);
1777d004396SChris Fraire                }
1787d004396SChris Fraire                extras = extraReader.search(searchHelper.searcher, primePath);
1790d40e9d0SAdam Hornáček            }
1800d40e9d0SAdam Hornáček
1810d40e9d0SAdam Hornáček            FileExtraZipper zipper = new FileExtraZipper();
1820d40e9d0SAdam Hornáček            List<DirectoryEntry> entries = zipper.zip(resourceFile, files,
1830d40e9d0SAdam Hornáček                extras);
1840d40e9d0SAdam Hornáček
1850d40e9d0SAdam Hornáček            List<String> readMes = dl.extraListTo(
1860d40e9d0SAdam Hornáček                    Util.URIEncodePath(request.getContextPath()),
1870d40e9d0SAdam Hornáček                    resourceFile, out, path, entries);
1880d40e9d0SAdam Hornáček            File[] catfiles = cfg.findDataFiles(readMes);
1890d40e9d0SAdam Hornáček            for (int i=0; i < catfiles.length; i++) {
1900d40e9d0SAdam Hornáček                if (catfiles[i] == null) {
1910d40e9d0SAdam Hornáček                    continue;
1920d40e9d0SAdam Hornáček                }
1930d40e9d0SAdam Hornáček%>
1940d40e9d0SAdam Hornáček<%
19552dccac1SChris Fraire    String lcName = readMes.get(i).toLowerCase(Locale.ROOT);
1960d40e9d0SAdam Hornáček    if (lcName.endsWith(".md") || lcName.endsWith(".markdown")) {
1970d40e9d0SAdam Hornáček    %><div id="src<%=i%>" data-markdown>
1980d40e9d0SAdam Hornáček        <div class="markdown-heading">
1990d40e9d0SAdam Hornáček            <h3><%= readMes.get(i) %></h3>
2000d40e9d0SAdam Hornáček        </div>
2010d40e9d0SAdam Hornáček        <div class="markdown-content"
2020d40e9d0SAdam Hornáček             data-markdown-download="<%= request.getContextPath() + Prefix.DOWNLOAD_P + Util.URIEncodePath(cfg.getPath() + readMes.get(i)) %>">
2030d40e9d0SAdam Hornáček        </div>
2040d40e9d0SAdam Hornáček        <pre data-markdown-original><%
2050d40e9d0SAdam Hornáček            Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz"));
2060d40e9d0SAdam Hornáček        %></pre>
2070d40e9d0SAdam Hornáček    </div>
2080d40e9d0SAdam Hornáček<% } else { %>
2090d40e9d0SAdam Hornáček    <h3><%= readMes.get(i) %></h3>
2100d40e9d0SAdam Hornáček    <div id="src<%=i%>">
2110d40e9d0SAdam Hornáček        <pre><%
2120d40e9d0SAdam Hornáček            Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz"));
2130d40e9d0SAdam Hornáček        %></pre>
2140d40e9d0SAdam Hornáček    </div>
2150d40e9d0SAdam Hornáček<%
2160d40e9d0SAdam Hornáček    }
2170d40e9d0SAdam Hornáček
2180d40e9d0SAdam Hornáček            }
2190d40e9d0SAdam Hornáček        }
220a03922c4SAdam Hornáček    } else if (rev.length() != 0) {
221a03922c4SAdam Hornáček        // requesting a revision
22255774b8bSChris Fraire        File xrefFile;
223ee13dbaeSChris Fraire        if (cfg.isLatestRevision(rev) &&
224ee13dbaeSChris Fraire                (xrefFile = cfg.findDataFile()) != null) {
225a03922c4SAdam Hornáček            if (cfg.annotate()) {
2260d40e9d0SAdam Hornáček                // annotate
2270d40e9d0SAdam Hornáček                BufferedInputStream bin =
2280d40e9d0SAdam Hornáček                    new BufferedInputStream(new FileInputStream(resourceFile));
2290d40e9d0SAdam Hornáček                try {
23057eefa47SKryštof Tulinger                    AnalyzerFactory a = AnalyzerGuru.find(basename);
23157eefa47SKryštof Tulinger                    AbstractAnalyzer.Genre g = AnalyzerGuru.getGenre(a);
2320d40e9d0SAdam Hornáček                    if (g == null) {
2330d40e9d0SAdam Hornáček                        a = AnalyzerGuru.find(bin);
2340d40e9d0SAdam Hornáček                        g = AnalyzerGuru.getGenre(a);
2350d40e9d0SAdam Hornáček                    }
23657eefa47SKryštof Tulinger                    if (g == AbstractAnalyzer.Genre.IMAGE) {
2370d40e9d0SAdam Hornáček%>
2380d40e9d0SAdam Hornáček<div id="src">
2391c830032SChris Fraire    <img src="<%= rawPath %>" alt="Image from Source Repository"/>
2400d40e9d0SAdam Hornáček</div><%
24157eefa47SKryštof Tulinger                    } else if ( g == AbstractAnalyzer.Genre.HTML) {
2420d40e9d0SAdam Hornáček                        /**
2430d40e9d0SAdam Hornáček                         * For backward compatibility, read the OpenGrok-produced
2440d40e9d0SAdam Hornáček                         * document using the system default charset.
2450d40e9d0SAdam Hornáček                         */
2460d40e9d0SAdam Hornáček                        r = new InputStreamReader(bin);
247e393cb49SAdam Hornáček                        // dumpXref() is also useful here for translating links.
248e393cb49SAdam Hornáček                        Util.dumpXref(out, r, request.getContextPath());
24957eefa47SKryštof Tulinger                    } else if (g == AbstractAnalyzer.Genre.PLAIN) {
2500d40e9d0SAdam Hornáček%>
2510d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
2520d40e9d0SAdam Hornáček    <pre><%
2530d40e9d0SAdam Hornáček                        // We're generating xref for the latest revision, so we can
2540d40e9d0SAdam Hornáček                        // find the definitions in the index.
2550d40e9d0SAdam Hornáček                        Definitions defs = IndexDatabase.getDefinitions(resourceFile);
2560d40e9d0SAdam Hornáček                        Annotation annotation = cfg.getAnnotation();
2570d40e9d0SAdam Hornáček                        // SRCROOT is read with UTF-8 as a default.
2580d40e9d0SAdam Hornáček                        r = IOUtils.createBOMStrippedReader(bin,
2590d40e9d0SAdam Hornáček                            StandardCharsets.UTF_8.name());
260e393cb49SAdam Hornáček                        AnalyzerGuru.writeDumpedXref(request.getContextPath(), a,
261e393cb49SAdam Hornáček                                r, out, defs, annotation, project);
2620d40e9d0SAdam Hornáček    %></pre>
2630d40e9d0SAdam Hornáček</div><%
2640d40e9d0SAdam Hornáček                    } else {
2650d40e9d0SAdam Hornáček%>
2660d40e9d0SAdam HornáčekClick <a href="<%= rawPath %>">download <%= basename %></a><%
2670d40e9d0SAdam Hornáček                    }
2680d40e9d0SAdam Hornáček                } finally {
2690d40e9d0SAdam Hornáček                    if (r != null) {
270*963a3f81SChris Fraire                        IOUtils.close(r);
271*963a3f81SChris Fraire                        bin = null;
2720d40e9d0SAdam Hornáček                    }
2730d40e9d0SAdam Hornáček                    if (bin != null) {
274*963a3f81SChris Fraire                        IOUtils.close(bin);
275*963a3f81SChris Fraire                        bin = null;
2760d40e9d0SAdam Hornáček                    }
2770d40e9d0SAdam Hornáček                }
278a03922c4SAdam Hornáček
279a03922c4SAdam Hornáček            } else {
2800d40e9d0SAdam Hornáček%>
2810d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
2820d40e9d0SAdam Hornáček    <pre><%
283e393cb49SAdam Hornáček                    boolean compressed = xrefFile.getName().endsWith(".gz");
284e393cb49SAdam Hornáček                    Util.dumpXref(out, xrefFile, compressed,
285e393cb49SAdam Hornáček                            request.getContextPath());
2860d40e9d0SAdam Hornáček    %></pre>
2870d40e9d0SAdam Hornáček</div><%
2880d40e9d0SAdam Hornáček            }
2890d40e9d0SAdam Hornáček        } else {
290f3e7c6e8SVladimir Kotal            // requesting a previous revision or needed to generate xref on the fly (economy mode).
29157eefa47SKryštof Tulinger            AnalyzerFactory a = AnalyzerGuru.find(basename);
292e829566cSChris Fraire            Genre g = AnalyzerGuru.getGenre(a);
2930d40e9d0SAdam Hornáček            String error = null;
294e829566cSChris Fraire            if (g == Genre.PLAIN || g == Genre.HTML || g == null) {
2950d40e9d0SAdam Hornáček                InputStream in = null;
296e829566cSChris Fraire                File tempf = null;
2970d40e9d0SAdam Hornáček                try {
29817c862aeSVladimir Kotal                    if (rev.equals(DUMMY_REVISION)) {
29917c862aeSVladimir Kotal                        in = new FileInputStream(resourceFile);
30017c862aeSVladimir Kotal                    } else {
301e829566cSChris Fraire                        tempf = File.createTempFile("ogtags", basename);
302e829566cSChris Fraire                        if (HistoryGuru.getInstance().getRevision(tempf,
303e829566cSChris Fraire                                resourceFile.getParent(), basename, rev)) {
304e829566cSChris Fraire                            in = new BufferedInputStream(
305e829566cSChris Fraire                                    new FileInputStream(tempf));
306e829566cSChris Fraire                        } else {
307e829566cSChris Fraire                            tempf.delete();
308e829566cSChris Fraire                            tempf = null;
309e829566cSChris Fraire                        }
31017c862aeSVladimir Kotal                    }
3110d40e9d0SAdam Hornáček                } catch (Exception e) {
3120d40e9d0SAdam Hornáček                    // fall through to error message
3130d40e9d0SAdam Hornáček                    error = e.getMessage();
314e829566cSChris Fraire                    if (tempf != null) {
315e829566cSChris Fraire                        tempf.delete();
316e829566cSChris Fraire                        tempf = null;
317e829566cSChris Fraire                    }
3180d40e9d0SAdam Hornáček                }
3190d40e9d0SAdam Hornáček                if (in != null) {
3200d40e9d0SAdam Hornáček                    try {
3210d40e9d0SAdam Hornáček                        if (g == null) {
322e829566cSChris Fraire                            a = AnalyzerGuru.find(in, basename);
3230d40e9d0SAdam Hornáček                            g = AnalyzerGuru.getGenre(a);
3240d40e9d0SAdam Hornáček                        }
32557eefa47SKryštof Tulinger                        if (g == AbstractAnalyzer.Genre.DATA || g == AbstractAnalyzer.Genre.XREFABLE || g == null) {
3260d40e9d0SAdam Hornáček    %>
3270d40e9d0SAdam Hornáček    <div id="src">
3281c830032SChris Fraire    Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %>
3291c830032SChris Fraire        <%= Util.URIEncode(rev) %>"><%= basename %></a>
3300d40e9d0SAdam Hornáček    </div><%
3310d40e9d0SAdam Hornáček                        } else {
3320d40e9d0SAdam Hornáček    %>
3330d40e9d0SAdam Hornáček    <div id="src">
3340d40e9d0SAdam Hornáček        <pre><%
33557eefa47SKryštof Tulinger                            if (g == AbstractAnalyzer.Genre.PLAIN) {
3360d40e9d0SAdam Hornáček                                Definitions defs = null;
337e829566cSChris Fraire                                ObjectPool<Ctags> ctagsPool = cfg.getEnv().
338e829566cSChris Fraire                                        getIndexerParallelizer().getCtagsPool();
339e829566cSChris Fraire                                int tries = 2;
340e829566cSChris Fraire                                while (cfg.getEnv().isWebappCtags()) {
341e829566cSChris Fraire                                    Ctags ctags = ctagsPool.get();
342e829566cSChris Fraire                                    try {
343e829566cSChris Fraire                                        ctags.setTabSize(project != null ?
344e829566cSChris Fraire                                                project.getTabSize() : 0);
345e829566cSChris Fraire                                        defs = ctags.doCtags(tempf.getPath());
346e829566cSChris Fraire                                        break;
347e829566cSChris Fraire                                    } catch (InterruptedException ex) {
348e829566cSChris Fraire                                        if (--tries > 0) {
349e829566cSChris Fraire                                            LOGGER.log(Level.WARNING,
350e829566cSChris Fraire                                                    "doCtags() interrupted--{0}",
351e829566cSChris Fraire                                                    ex.getMessage());
352e829566cSChris Fraire                                            continue;
353e829566cSChris Fraire                                        }
354e829566cSChris Fraire                                        LOGGER.log(Level.WARNING, "doCtags()", ex);
355e829566cSChris Fraire                                        break;
356e829566cSChris Fraire                                    } catch (Exception ex) {
357e829566cSChris Fraire                                        LOGGER.log(Level.WARNING, "doCtags()", ex);
358e829566cSChris Fraire                                        break;
359e829566cSChris Fraire                                    } finally {
360e829566cSChris Fraire                                        ctags.reset();
361e829566cSChris Fraire                                        ctagsPool.release(ctags);
362e829566cSChris Fraire                                    }
363e829566cSChris Fraire                                }
3640d40e9d0SAdam Hornáček                                Annotation annotation = cfg.getAnnotation();
3650d40e9d0SAdam Hornáček                                //not needed yet
3660d40e9d0SAdam Hornáček                                //annotation.writeTooltipMap(out);
3670d40e9d0SAdam Hornáček                                // SRCROOT is read with UTF-8 as a default.
3680d40e9d0SAdam Hornáček                                r = IOUtils.createBOMStrippedReader(in,
3690d40e9d0SAdam Hornáček                                    StandardCharsets.UTF_8.name());
370e393cb49SAdam Hornáček                                AnalyzerGuru.writeDumpedXref(
371a03922c4SAdam Hornáček                                        request.getContextPath(),
372a03922c4SAdam Hornáček                                        a, r, out,
373e393cb49SAdam Hornáček                                        defs, annotation, project);
37457eefa47SKryštof Tulinger                            } else if (g == AbstractAnalyzer.Genre.IMAGE) {
3750d40e9d0SAdam Hornáček        %></pre>
3761c830032SChris Fraire        <img src="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %><%= Util.URIEncode(rev) %>"/>
3770d40e9d0SAdam Hornáček        <pre><%
37857eefa47SKryštof Tulinger                            } else if (g == AbstractAnalyzer.Genre.HTML) {
3790d40e9d0SAdam Hornáček                                /**
3800d40e9d0SAdam Hornáček                                 * For backward compatibility, read the
3810d40e9d0SAdam Hornáček                                 * OpenGrok-produced document using the system
3820d40e9d0SAdam Hornáček                                 * default charset.
3830d40e9d0SAdam Hornáček                                 */
3840d40e9d0SAdam Hornáček                                r = new InputStreamReader(in);
385e393cb49SAdam Hornáček                                /**
386e393cb49SAdam Hornáček                                 * dumpXref() is also useful here for
387e393cb49SAdam Hornáček                                 * translating links.
388e393cb49SAdam Hornáček                                 */
389e393cb49SAdam Hornáček                                Util.dumpXref(out, r, request.getContextPath());
3900d40e9d0SAdam Hornáček                            } else {
3911c830032SChris Fraire        %>Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %>
3921c830032SChris Fraire            <%= Util.URIEncode(rev) %>"><%= basename %></a><%
3930d40e9d0SAdam Hornáček                            }
3940d40e9d0SAdam Hornáček                        }
3950d40e9d0SAdam Hornáček                    } catch (IOException e) {
3960d40e9d0SAdam Hornáček                        error = e.getMessage();
3970d40e9d0SAdam Hornáček                    } finally {
3980d40e9d0SAdam Hornáček                        if (r != null) {
399*963a3f81SChris Fraire                            IOUtils.close(r);
400*963a3f81SChris Fraire                            in = null;
4010d40e9d0SAdam Hornáček                        }
4020d40e9d0SAdam Hornáček                        if (in != null) {
403*963a3f81SChris Fraire                            IOUtils.close(in);
404*963a3f81SChris Fraire                            in = null;
4050d40e9d0SAdam Hornáček                        }
406e829566cSChris Fraire                        if (tempf != null) {
407e829566cSChris Fraire                            tempf.delete();
408e829566cSChris Fraire                        }
4090d40e9d0SAdam Hornáček                    }
4100d40e9d0SAdam Hornáček        %></pre>
4110d40e9d0SAdam Hornáček    </div><%
4120d40e9d0SAdam Hornáček                } else {
4130d40e9d0SAdam Hornáček    %>
4140d40e9d0SAdam Hornáček    <h3 class="error">Error reading file</h3><%
4150d40e9d0SAdam Hornáček                    if (error != null) {
4160d40e9d0SAdam Hornáček    %>
4170d40e9d0SAdam Hornáček    <p class="error"><%= error %></p><%
4180d40e9d0SAdam Hornáček                    }
4190d40e9d0SAdam Hornáček                }
42057eefa47SKryštof Tulinger            } else if (g == AbstractAnalyzer.Genre.IMAGE) {
4210d40e9d0SAdam Hornáček    %>
4220d40e9d0SAdam Hornáček    <div id="src">
4231c830032SChris Fraire        <img src="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %><%= Util.URIEncode(rev) %>"
4241c830032SChris Fraire	    alt="Image from Source Repository"/>
4250d40e9d0SAdam Hornáček    </div><%
4260d40e9d0SAdam Hornáček            } else {
4270d40e9d0SAdam Hornáček    %>
4280d40e9d0SAdam Hornáček    <div id="src">
4291c830032SChris Fraire    Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %>
4301c830032SChris Fraire        <%= Util.URIEncode(rev) %>"><%= basename %></a>
4310d40e9d0SAdam Hornáček    </div><%
4320d40e9d0SAdam Hornáček            }
4330d40e9d0SAdam Hornáček        }
4340d40e9d0SAdam Hornáček    } else {
4350d40e9d0SAdam Hornáček        // requesting cross referenced file
4360d40e9d0SAdam Hornáček
43755774b8bSChris Fraire        File xrefFile = cfg.findDataFile();
4380d40e9d0SAdam Hornáček        if (xrefFile != null) {
4390d40e9d0SAdam Hornáček%>
4400d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>">
4410d40e9d0SAdam Hornáček    <pre><%
442e393cb49SAdam Hornáček            boolean compressed = xrefFile.getName().endsWith(".gz");
443e393cb49SAdam Hornáček            Util.dumpXref(out, xrefFile, compressed, request.getContextPath());
4440d40e9d0SAdam Hornáček    %></pre>
4450d40e9d0SAdam Hornáček</div><%
44617c862aeSVladimir Kotal        } else {
44717c862aeSVladimir Kotal%>
4485c4b57feSVladimir Kotal<p class="error">Failed to get xref file</p><%
4490d40e9d0SAdam Hornáček        }
4500d40e9d0SAdam Hornáček    }
4510d40e9d0SAdam Hornáček}
4520d40e9d0SAdam Hornáček/* ---------------------- list.jsp end --------------------- */
4530d40e9d0SAdam Hornáček%><%@
4540d40e9d0SAdam Hornáček
4550d40e9d0SAdam Hornáčekinclude file="foot.jspf"
4560d40e9d0SAdam Hornáček
4570d40e9d0SAdam Hornáček%>
458