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