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 19b13c5a0eSAdam HornacekCopyright (c) 2005, 2021, 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, 4641351de3SChris Fraireorg.opengrok.indexer.analysis.NullableNumLinesLOC, 47686556f2SAdam Hornáčekorg.opengrok.indexer.history.Annotation, 481c830032SChris Fraireorg.opengrok.indexer.history.HistoryGuru, 49686556f2SAdam Hornáčekorg.opengrok.indexer.index.IndexDatabase, 50e829566cSChris Fraireorg.opengrok.indexer.logger.LoggerFactory, 51686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryEntry, 52686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryExtraReader, 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) { 81eeb95924SChris Fraire cfg.evaluateMatchOffset(); 8296b0c142SChris Fraire String location = cfg.getRevisionLocation(latestRevision); 8355774b8bSChris Fraire response.sendRedirect(location); 8455774b8bSChris Fraire return; 8555774b8bSChris Fraire } 8655774b8bSChris Fraire if (!cfg.getEnv().isGenerateHtml()) { 87eeb95924SChris Fraire cfg.evaluateMatchOffset(); 8855774b8bSChris Fraire /* 8955774b8bSChris Fraire * Economy mode is on and failed to get the last revision 9055774b8bSChris Fraire * (presumably running with history turned off). Use dummy 9155774b8bSChris Fraire * revision string so that xref can be generated from the resource 9255774b8bSChris Fraire * file directly. 9355774b8bSChris Fraire */ 9496b0c142SChris Fraire String location = cfg.getRevisionLocation(DUMMY_REVISION); 9555774b8bSChris Fraire response.sendRedirect(location); 9655774b8bSChris Fraire return; 9755774b8bSChris Fraire } 98eeb95924SChris Fraire 99eeb95924SChris Fraire if (cfg.evaluateMatchOffset()) { 100eeb95924SChris Fraire /* 101eeb95924SChris Fraire * If after calling, a match offset has been translated to a 102eeb95924SChris Fraire * fragment identifier (specifying a line#), then redirect to self. 103eeb95924SChris Fraire * This block will not be activated again the second time. 104eeb95924SChris Fraire */ 105eeb95924SChris Fraire String location = cfg.getRevisionLocation(""); // empty 10655774b8bSChris Fraire response.sendRedirect(location); 10755774b8bSChris Fraire return; 10855774b8bSChris Fraire } 10955774b8bSChris Fraire } 11055774b8bSChris Fraire 1110d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 1120d40e9d0SAdam Hornáček if (annotation != null) { 1130d40e9d0SAdam Hornáček int r = annotation.getWidestRevision(); 1140d40e9d0SAdam Hornáček int a = annotation.getWidestAuthor(); 1150d40e9d0SAdam Hornáček cfg.addHeaderData("<style type=\"text/css\">" 1160d40e9d0SAdam Hornáček + ".blame .r { width: " + (r == 0 ? 6 : Math.ceil(r * 0.7)) + "em; } " 1170d40e9d0SAdam Hornáček + ".blame .a { width: " + (a == 0 ? 6 : Math.ceil(a * 0.7)) + "em; } " 1180d40e9d0SAdam Hornáček + "</style>"); 1190d40e9d0SAdam Hornáček } 1200d40e9d0SAdam Hornáček} 1210d40e9d0SAdam Hornáček%><%@include 1220d40e9d0SAdam Hornáček 1230d40e9d0SAdam Hornáčekfile="mast.jsp" 1240d40e9d0SAdam Hornáček 1250d40e9d0SAdam Hornáček%><script type="text/javascript">/* <![CDATA[ */ 1260d40e9d0SAdam Hornáčekdocument.pageReady.push(function() { pageReadyList();}); 1270d40e9d0SAdam Hornáček/* ]]> */</script> 1280d40e9d0SAdam Hornáček<% 1290d40e9d0SAdam Hornáček/* ---------------------- list.jsp start --------------------- */ 1300d40e9d0SAdam Hornáček{ 131e829566cSChris Fraire final Logger LOGGER = LoggerFactory.getLogger(getClass()); 132e829566cSChris Fraire 1330d40e9d0SAdam Hornáček PageConfig cfg = PageConfig.get(request); 1340d40e9d0SAdam Hornáček String rev = cfg.getRequestedRevision(); 135e393cb49SAdam Hornáček Project project = cfg.getProject(); 1360d40e9d0SAdam Hornáček 137e393cb49SAdam Hornáček String navigateWindowEnabled = project != null ? Boolean.toString( 138e393cb49SAdam Hornáček project.isNavigateWindowEnabled()) : "false"; 1390d40e9d0SAdam Hornáček File resourceFile = cfg.getResourceFile(); 1400d40e9d0SAdam Hornáček String path = cfg.getPath(); 1410d40e9d0SAdam Hornáček String basename = resourceFile.getName(); 1420d40e9d0SAdam Hornáček String rawPath = request.getContextPath() + Prefix.DOWNLOAD_P + path; 1430d40e9d0SAdam Hornáček Reader r = null; 1440d40e9d0SAdam Hornáček if (cfg.isDir()) { 1450d40e9d0SAdam Hornáček // valid resource is requested 1460d40e9d0SAdam Hornáček // mast.jsp assures, that resourceFile is valid and not / 1470d40e9d0SAdam Hornáček // see cfg.resourceNotAvailable() 1480d40e9d0SAdam Hornáček String cookieValue = cfg.getRequestedProjectsAsString(); 1495c931ce8SChris Fraire String projectName = null; 150e393cb49SAdam Hornáček if (project != null) { 1515c931ce8SChris Fraire projectName = project.getName(); 1520d40e9d0SAdam Hornáček Set<String> projects = cfg.getRequestedProjects(); 1535c931ce8SChris Fraire if (!projects.contains(projectName)) { 1545c931ce8SChris Fraire projects.add(projectName); 1550d40e9d0SAdam Hornáček // update cookie 1565c931ce8SChris Fraire cookieValue = cookieValue.length() == 0 ? projectName : 1575c931ce8SChris Fraire projectName + ',' + cookieValue; 158b13c5a0eSAdam Hornacek Cookie cookie = new Cookie(PageConfig.OPEN_GROK_PROJECT, URLEncoder.encode(cookieValue, StandardCharsets.UTF_8)); 1590d40e9d0SAdam Hornáček // TODO hmmm, projects.jspf doesn't set a path 1600d40e9d0SAdam Hornáček cookie.setPath(request.getContextPath() + '/'); 1610d40e9d0SAdam Hornáček response.addCookie(cookie); 1620d40e9d0SAdam Hornáček } 1630d40e9d0SAdam Hornáček } 1640d40e9d0SAdam Hornáček // requesting a directory listing 1650d40e9d0SAdam Hornáček DirectoryListing dl = new DirectoryListing(cfg.getEftarReader()); 1660d40e9d0SAdam Hornáček List<String> files = cfg.getResourceFileList(); 1670d40e9d0SAdam Hornáček if (!files.isEmpty()) { 16841351de3SChris Fraire List<NullableNumLinesLOC> extras = null; 1690d40e9d0SAdam Hornáček SearchHelper searchHelper = cfg.prepareInternalSearch(); 1705c931ce8SChris Fraire /* 1715c931ce8SChris Fraire * N.b. searchHelper.destroy() is called via 1725c931ce8SChris Fraire * WebappListener.requestDestroyed() on presence of the following 1735c931ce8SChris Fraire * REQUEST_ATTR. 1745c931ce8SChris Fraire */ 1750d40e9d0SAdam Hornáček request.setAttribute(SearchHelper.REQUEST_ATTR, searchHelper); 1765c931ce8SChris Fraire if (project != null) { 177e393cb49SAdam Hornáček searchHelper.prepareExec(project); 1785c931ce8SChris Fraire } else { 1795c931ce8SChris Fraire //noinspection Convert2Diamond 1805c931ce8SChris Fraire searchHelper.prepareExec(new TreeSet<String>()); 1815c931ce8SChris Fraire } 1820d40e9d0SAdam Hornáček 1830d40e9d0SAdam Hornáček if (searchHelper.searcher != null) { 1845c931ce8SChris Fraire DirectoryExtraReader extraReader = new DirectoryExtraReader(); 1857d004396SChris Fraire String primePath = path; 1867d004396SChris Fraire try { 1875c931ce8SChris Fraire primePath = searchHelper.getPrimeRelativePath(projectName, path); 1887d004396SChris Fraire } catch (IOException | ForbiddenSymlinkException ex) { 1897d004396SChris Fraire LOGGER.log(Level.WARNING, String.format( 1907d004396SChris Fraire "Error getting prime relative for %s", path), ex); 1917d004396SChris Fraire } 1927d004396SChris Fraire extras = extraReader.search(searchHelper.searcher, primePath); 1930d40e9d0SAdam Hornáček } 1940d40e9d0SAdam Hornáček 1950d40e9d0SAdam Hornáček FileExtraZipper zipper = new FileExtraZipper(); 1960d40e9d0SAdam Hornáček List<DirectoryEntry> entries = zipper.zip(resourceFile, files, 1970d40e9d0SAdam Hornáček extras); 1980d40e9d0SAdam Hornáček 1990d40e9d0SAdam Hornáček List<String> readMes = dl.extraListTo( 2000d40e9d0SAdam Hornáček Util.URIEncodePath(request.getContextPath()), 2010d40e9d0SAdam Hornáček resourceFile, out, path, entries); 2020d40e9d0SAdam Hornáček File[] catfiles = cfg.findDataFiles(readMes); 2030d40e9d0SAdam Hornáček for (int i=0; i < catfiles.length; i++) { 2040d40e9d0SAdam Hornáček if (catfiles[i] == null) { 2050d40e9d0SAdam Hornáček continue; 2060d40e9d0SAdam Hornáček } 2070d40e9d0SAdam Hornáček%> 2080d40e9d0SAdam Hornáček<% 20952dccac1SChris Fraire String lcName = readMes.get(i).toLowerCase(Locale.ROOT); 2100d40e9d0SAdam Hornáček if (lcName.endsWith(".md") || lcName.endsWith(".markdown")) { 2110d40e9d0SAdam Hornáček %><div id="src<%=i%>" data-markdown> 2120d40e9d0SAdam Hornáček <div class="markdown-heading"> 2130d40e9d0SAdam Hornáček <h3><%= readMes.get(i) %></h3> 2140d40e9d0SAdam Hornáček </div> 2150d40e9d0SAdam Hornáček <div class="markdown-content" 2160d40e9d0SAdam Hornáček data-markdown-download="<%= request.getContextPath() + Prefix.DOWNLOAD_P + Util.URIEncodePath(cfg.getPath() + readMes.get(i)) %>"> 2170d40e9d0SAdam Hornáček </div> 2180d40e9d0SAdam Hornáček <pre data-markdown-original><% 2190d40e9d0SAdam Hornáček Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz")); 2200d40e9d0SAdam Hornáček %></pre> 2210d40e9d0SAdam Hornáček </div> 2220d40e9d0SAdam Hornáček<% } else { %> 2230d40e9d0SAdam Hornáček <h3><%= readMes.get(i) %></h3> 2240d40e9d0SAdam Hornáček <div id="src<%=i%>"> 2250d40e9d0SAdam Hornáček <pre><% 2260d40e9d0SAdam Hornáček Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz")); 2270d40e9d0SAdam Hornáček %></pre> 2280d40e9d0SAdam Hornáček </div> 2290d40e9d0SAdam Hornáček<% 2300d40e9d0SAdam Hornáček } 2310d40e9d0SAdam Hornáček 2320d40e9d0SAdam Hornáček } 2330d40e9d0SAdam Hornáček } 234a03922c4SAdam Hornáček } else if (rev.length() != 0) { 235a03922c4SAdam Hornáček // requesting a revision 23655774b8bSChris Fraire File xrefFile; 237*1532fde5SVladimir Kotal if (cfg.isLatestRevision(rev) && (xrefFile = cfg.findDataFile()) != null) { 238a03922c4SAdam Hornáček if (cfg.annotate()) { 2390d40e9d0SAdam Hornáček // annotate 240*1532fde5SVladimir Kotal BufferedInputStream bin = new BufferedInputStream(new FileInputStream(resourceFile)); 2410d40e9d0SAdam Hornáček try { 24257eefa47SKryštof Tulinger AnalyzerFactory a = AnalyzerGuru.find(basename); 24357eefa47SKryštof Tulinger AbstractAnalyzer.Genre g = AnalyzerGuru.getGenre(a); 2440d40e9d0SAdam Hornáček if (g == null) { 2450d40e9d0SAdam Hornáček a = AnalyzerGuru.find(bin); 2460d40e9d0SAdam Hornáček g = AnalyzerGuru.getGenre(a); 2470d40e9d0SAdam Hornáček } 24857eefa47SKryštof Tulinger if (g == AbstractAnalyzer.Genre.IMAGE) { 2490d40e9d0SAdam Hornáček%> 2500d40e9d0SAdam Hornáček<div id="src"> 2511c830032SChris Fraire <img src="<%= rawPath %>" alt="Image from Source Repository"/> 2520d40e9d0SAdam Hornáček</div><% 25357eefa47SKryštof Tulinger } else if ( g == AbstractAnalyzer.Genre.HTML) { 2540d40e9d0SAdam Hornáček /** 2550d40e9d0SAdam Hornáček * For backward compatibility, read the OpenGrok-produced 2560d40e9d0SAdam Hornáček * document using the system default charset. 2570d40e9d0SAdam Hornáček */ 2580d40e9d0SAdam Hornáček r = new InputStreamReader(bin); 259e393cb49SAdam Hornáček // dumpXref() is also useful here for translating links. 260e393cb49SAdam Hornáček Util.dumpXref(out, r, request.getContextPath()); 26157eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.PLAIN) { 2620d40e9d0SAdam Hornáček%> 2630d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 2640d40e9d0SAdam Hornáček <pre><% 2650d40e9d0SAdam Hornáček // We're generating xref for the latest revision, so we can 2660d40e9d0SAdam Hornáček // find the definitions in the index. 2670d40e9d0SAdam Hornáček Definitions defs = IndexDatabase.getDefinitions(resourceFile); 2680d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 2690d40e9d0SAdam Hornáček // SRCROOT is read with UTF-8 as a default. 2700d40e9d0SAdam Hornáček r = IOUtils.createBOMStrippedReader(bin, 2710d40e9d0SAdam Hornáček StandardCharsets.UTF_8.name()); 272e393cb49SAdam Hornáček AnalyzerGuru.writeDumpedXref(request.getContextPath(), a, 273e393cb49SAdam Hornáček r, out, defs, annotation, project); 2740d40e9d0SAdam Hornáček %></pre> 2750d40e9d0SAdam Hornáček</div><% 2760d40e9d0SAdam Hornáček } else { 2770d40e9d0SAdam Hornáček%> 2780d40e9d0SAdam HornáčekClick <a href="<%= rawPath %>">download <%= basename %></a><% 2790d40e9d0SAdam Hornáček } 2800d40e9d0SAdam Hornáček } finally { 2810d40e9d0SAdam Hornáček if (r != null) { 282963a3f81SChris Fraire IOUtils.close(r); 283963a3f81SChris Fraire bin = null; 2840d40e9d0SAdam Hornáček } 2850d40e9d0SAdam Hornáček if (bin != null) { 286963a3f81SChris Fraire IOUtils.close(bin); 287963a3f81SChris Fraire bin = null; 2880d40e9d0SAdam Hornáček } 2890d40e9d0SAdam Hornáček } 290a03922c4SAdam Hornáček 291a03922c4SAdam Hornáček } else { 2920d40e9d0SAdam Hornáček%> 2930d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 2940d40e9d0SAdam Hornáček <pre><% 295e393cb49SAdam Hornáček boolean compressed = xrefFile.getName().endsWith(".gz"); 296e393cb49SAdam Hornáček Util.dumpXref(out, xrefFile, compressed, 297e393cb49SAdam Hornáček request.getContextPath()); 2980d40e9d0SAdam Hornáček %></pre> 2990d40e9d0SAdam Hornáček</div><% 3000d40e9d0SAdam Hornáček } 3010d40e9d0SAdam Hornáček } else { 302*1532fde5SVladimir Kotal // requesting a previous revision or needed to generate xref on the fly 303*1532fde5SVladimir Kotal // (either economy mode is enabled or the cfg.findDataFile() call above failed). 30457eefa47SKryštof Tulinger AnalyzerFactory a = AnalyzerGuru.find(basename); 305e829566cSChris Fraire Genre g = AnalyzerGuru.getGenre(a); 3060d40e9d0SAdam Hornáček String error = null; 307e829566cSChris Fraire if (g == Genre.PLAIN || g == Genre.HTML || g == null) { 3080d40e9d0SAdam Hornáček InputStream in = null; 309e829566cSChris Fraire File tempf = null; 3100d40e9d0SAdam Hornáček try { 31117c862aeSVladimir Kotal if (rev.equals(DUMMY_REVISION)) { 3124f99ffafSChris Fraire in = new BufferedInputStream(new FileInputStream(resourceFile)); 31317c862aeSVladimir Kotal } else { 314e829566cSChris Fraire tempf = File.createTempFile("ogtags", basename); 315e829566cSChris Fraire if (HistoryGuru.getInstance().getRevision(tempf, 316e829566cSChris Fraire resourceFile.getParent(), basename, rev)) { 3174f99ffafSChris Fraire in = new BufferedInputStream(new FileInputStream(tempf)); 318e829566cSChris Fraire } else { 319e829566cSChris Fraire tempf.delete(); 320e829566cSChris Fraire tempf = null; 321e829566cSChris Fraire } 32217c862aeSVladimir Kotal } 3230d40e9d0SAdam Hornáček } catch (Exception e) { 3240d40e9d0SAdam Hornáček // fall through to error message 3250d40e9d0SAdam Hornáček error = e.getMessage(); 326e829566cSChris Fraire if (tempf != null) { 327e829566cSChris Fraire tempf.delete(); 328e829566cSChris Fraire tempf = null; 329e829566cSChris Fraire } 3300d40e9d0SAdam Hornáček } 3310d40e9d0SAdam Hornáček if (in != null) { 3320d40e9d0SAdam Hornáček try { 3330d40e9d0SAdam Hornáček if (g == null) { 334e829566cSChris Fraire a = AnalyzerGuru.find(in, basename); 3350d40e9d0SAdam Hornáček g = AnalyzerGuru.getGenre(a); 3360d40e9d0SAdam Hornáček } 33757eefa47SKryštof Tulinger if (g == AbstractAnalyzer.Genre.DATA || g == AbstractAnalyzer.Genre.XREFABLE || g == null) { 3380d40e9d0SAdam Hornáček %> 3390d40e9d0SAdam Hornáček <div id="src"> 3401c830032SChris Fraire Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %> 3411c830032SChris Fraire<%= Util.URIEncode(rev) %>"><%= basename %></a> 3420d40e9d0SAdam Hornáček </div><% 3430d40e9d0SAdam Hornáček } else { 3440d40e9d0SAdam Hornáček %> 3450d40e9d0SAdam Hornáček <div id="src"> 3460d40e9d0SAdam Hornáček <pre><% 34757eefa47SKryštof Tulinger if (g == AbstractAnalyzer.Genre.PLAIN) { 3480d40e9d0SAdam Hornáček Definitions defs = null; 349e829566cSChris Fraire ObjectPool<Ctags> ctagsPool = cfg.getEnv(). 350e829566cSChris Fraire getIndexerParallelizer().getCtagsPool(); 351e829566cSChris Fraire int tries = 2; 352e829566cSChris Fraire while (cfg.getEnv().isWebappCtags()) { 353e829566cSChris Fraire Ctags ctags = ctagsPool.get(); 354e829566cSChris Fraire try { 355e829566cSChris Fraire ctags.setTabSize(project != null ? 356e829566cSChris Fraire project.getTabSize() : 0); 357e829566cSChris Fraire defs = ctags.doCtags(tempf.getPath()); 358e829566cSChris Fraire break; 359e829566cSChris Fraire } catch (InterruptedException ex) { 360e829566cSChris Fraire if (--tries > 0) { 361e829566cSChris Fraire LOGGER.log(Level.WARNING, 362e829566cSChris Fraire "doCtags() interrupted--{0}", 363e829566cSChris Fraire ex.getMessage()); 364e829566cSChris Fraire continue; 365e829566cSChris Fraire } 366e829566cSChris Fraire LOGGER.log(Level.WARNING, "doCtags()", ex); 367e829566cSChris Fraire break; 368e829566cSChris Fraire } catch (Exception ex) { 369e829566cSChris Fraire LOGGER.log(Level.WARNING, "doCtags()", ex); 370e829566cSChris Fraire break; 371e829566cSChris Fraire } finally { 372e829566cSChris Fraire ctags.reset(); 373e829566cSChris Fraire ctagsPool.release(ctags); 374e829566cSChris Fraire } 375e829566cSChris Fraire } 3760d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 3770d40e9d0SAdam Hornáček //not needed yet 3780d40e9d0SAdam Hornáček //annotation.writeTooltipMap(out); 3790d40e9d0SAdam Hornáček // SRCROOT is read with UTF-8 as a default. 3800d40e9d0SAdam Hornáček r = IOUtils.createBOMStrippedReader(in, 3810d40e9d0SAdam Hornáček StandardCharsets.UTF_8.name()); 382e393cb49SAdam Hornáček AnalyzerGuru.writeDumpedXref( 383a03922c4SAdam Hornáček request.getContextPath(), 384a03922c4SAdam Hornáček a, r, out, 385e393cb49SAdam Hornáček defs, annotation, project); 38657eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.IMAGE) { 3870d40e9d0SAdam Hornáček %></pre> 3881c830032SChris Fraire <img src="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %><%= Util.URIEncode(rev) %>"/> 3890d40e9d0SAdam Hornáček <pre><% 39057eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.HTML) { 3910d40e9d0SAdam Hornáček /** 3920d40e9d0SAdam Hornáček * For backward compatibility, read the 3930d40e9d0SAdam Hornáček * OpenGrok-produced document using the system 3940d40e9d0SAdam Hornáček * default charset. 3950d40e9d0SAdam Hornáček */ 3960d40e9d0SAdam Hornáček r = new InputStreamReader(in); 397e393cb49SAdam Hornáček /** 398e393cb49SAdam Hornáček * dumpXref() is also useful here for 399e393cb49SAdam Hornáček * translating links. 400e393cb49SAdam Hornáček */ 401e393cb49SAdam Hornáček Util.dumpXref(out, r, request.getContextPath()); 4020d40e9d0SAdam Hornáček } else { 4031c830032SChris Fraire %>Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %> 4041c830032SChris Fraire<%= Util.URIEncode(rev) %>"><%= basename %></a><% 4050d40e9d0SAdam Hornáček } 4060d40e9d0SAdam Hornáček } 4070d40e9d0SAdam Hornáček } catch (IOException e) { 408b5cf4968SChris Fraire LOGGER.log(Level.SEVERE, "Failed xref on-the-fly", e); 4090d40e9d0SAdam Hornáček } finally { 4100d40e9d0SAdam Hornáček if (r != null) { 411963a3f81SChris Fraire IOUtils.close(r); 412963a3f81SChris Fraire in = null; 4130d40e9d0SAdam Hornáček } 4140d40e9d0SAdam Hornáček if (in != null) { 415963a3f81SChris Fraire IOUtils.close(in); 416963a3f81SChris Fraire in = null; 4170d40e9d0SAdam Hornáček } 418e829566cSChris Fraire if (tempf != null) { 419e829566cSChris Fraire tempf.delete(); 420e829566cSChris Fraire } 4210d40e9d0SAdam Hornáček } 4220d40e9d0SAdam Hornáček %></pre> 4230d40e9d0SAdam Hornáček </div><% 4240d40e9d0SAdam Hornáček } else { 4250d40e9d0SAdam Hornáček %> 4260d40e9d0SAdam Hornáček <h3 class="error">Error reading file</h3><% 4270d40e9d0SAdam Hornáček if (error != null) { 4280d40e9d0SAdam Hornáček %> 4290d40e9d0SAdam Hornáček <p class="error"><%= error %></p><% 4300d40e9d0SAdam Hornáček } 4310d40e9d0SAdam Hornáček } 43257eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.IMAGE) { 4330d40e9d0SAdam Hornáček %> 4340d40e9d0SAdam Hornáček <div id="src"> 4351c830032SChris Fraire <img src="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %><%= Util.URIEncode(rev) %>" 4361c830032SChris Fraire alt="Image from Source Repository"/> 4370d40e9d0SAdam Hornáček </div><% 4380d40e9d0SAdam Hornáček } else { 4390d40e9d0SAdam Hornáček %> 4400d40e9d0SAdam Hornáček <div id="src"> 4411c830032SChris Fraire Download binary file, <a href="<%= rawPath %>?<%= QueryParameters.REVISION_PARAM_EQ %> 4421c830032SChris Fraire<%= Util.URIEncode(rev) %>"><%= basename %></a> 4430d40e9d0SAdam Hornáček </div><% 4440d40e9d0SAdam Hornáček } 4450d40e9d0SAdam Hornáček } 4460d40e9d0SAdam Hornáček } else { 4470d40e9d0SAdam Hornáček // requesting cross referenced file 4480d40e9d0SAdam Hornáček 44955774b8bSChris Fraire File xrefFile = cfg.findDataFile(); 4500d40e9d0SAdam Hornáček if (xrefFile != null) { 4510d40e9d0SAdam Hornáček%> 4520d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 4530d40e9d0SAdam Hornáček <pre><% 454e393cb49SAdam Hornáček boolean compressed = xrefFile.getName().endsWith(".gz"); 455e393cb49SAdam Hornáček Util.dumpXref(out, xrefFile, compressed, request.getContextPath()); 4560d40e9d0SAdam Hornáček %></pre> 4570d40e9d0SAdam Hornáček</div><% 45817c862aeSVladimir Kotal } else { 45917c862aeSVladimir Kotal%> 4605c4b57feSVladimir Kotal<p class="error">Failed to get xref file</p><% 4610d40e9d0SAdam Hornáček } 4620d40e9d0SAdam Hornáček } 4630d40e9d0SAdam Hornáček} 4640d40e9d0SAdam Hornáček/* ---------------------- list.jsp end --------------------- */ 4650d40e9d0SAdam Hornáček%><%@ 4660d40e9d0SAdam Hornáček 4670d40e9d0SAdam Hornáčekinclude file="foot.jspf" 4680d40e9d0SAdam Hornáček 4690d40e9d0SAdam Hornáček%> 470