10d40e9d0SAdam Hornáček<%-- 20d40e9d0SAdam Hornáček$Id$ 30d40e9d0SAdam Hornáček 40d40e9d0SAdam HornáčekCDDL HEADER START 50d40e9d0SAdam Hornáček 60d40e9d0SAdam HornáčekThe contents of this file are subject to the terms of the 70d40e9d0SAdam HornáčekCommon Development and Distribution License (the "License"). 80d40e9d0SAdam HornáčekYou may not use this file except in compliance with the License. 90d40e9d0SAdam Hornáček 100d40e9d0SAdam HornáčekSee LICENSE.txt included in this distribution for the specific 110d40e9d0SAdam Hornáčeklanguage governing permissions and limitations under the License. 120d40e9d0SAdam Hornáček 130d40e9d0SAdam HornáčekWhen distributing Covered Code, include this CDDL HEADER in each 140d40e9d0SAdam Hornáčekfile and include the License file at LICENSE.txt. 150d40e9d0SAdam HornáčekIf applicable, add the following below this CDDL HEADER, with the 160d40e9d0SAdam Hornáčekfields enclosed by brackets "[]" replaced with your own identifying 170d40e9d0SAdam Hornáčekinformation: Portions Copyright [yyyy] [name of copyright owner] 180d40e9d0SAdam Hornáček 190d40e9d0SAdam HornáčekCDDL HEADER END 200d40e9d0SAdam Hornáček 2156f072caSAdam HornáčekCopyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. 220d40e9d0SAdam HornáčekPortions Copyright 2011 Jens Elkner. 23*5c931ce8SChris FrairePortions Copyright (c) 2017-2020, Chris Fraire <cfraire@me.com>. 240d40e9d0SAdam Hornáček 250d40e9d0SAdam Hornáček--%> 260d40e9d0SAdam Hornáček<%@page errorPage="error.jsp" import=" 270d40e9d0SAdam Hornáčekjava.io.BufferedInputStream, 280d40e9d0SAdam Hornáčekjava.io.FileInputStream, 290d40e9d0SAdam Hornáčekjava.io.InputStream, 300d40e9d0SAdam Hornáčekjava.io.InputStreamReader, 310d40e9d0SAdam Hornáčekjava.io.Reader, 320d40e9d0SAdam Hornáčekjava.net.URLEncoder, 330d40e9d0SAdam Hornáčekjava.nio.charset.StandardCharsets, 340d40e9d0SAdam Hornáčekjava.util.List, 3552dccac1SChris Frairejava.util.Locale, 36e829566cSChris Frairejava.util.logging.Level, 37e829566cSChris Frairejava.util.logging.Logger, 38*5c931ce8SChris Frairejava.util.Set, 39*5c931ce8SChris 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, 47686556f2SAdam Hornáčekorg.opengrok.indexer.index.IndexDatabase, 48e829566cSChris Fraireorg.opengrok.indexer.logger.LoggerFactory, 49686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryEntry, 50686556f2SAdam Hornáčekorg.opengrok.indexer.search.DirectoryExtraReader, 51686556f2SAdam Hornáčekorg.opengrok.indexer.search.FileExtra, 52686556f2SAdam Hornáčekorg.opengrok.indexer.util.FileExtraZipper, 537d004396SChris Fraireorg.opengrok.indexer.util.ForbiddenSymlinkException, 54e829566cSChris Fraireorg.opengrok.indexer.util.ObjectPool, 55686556f2SAdam Hornáčekorg.opengrok.indexer.util.IOUtils, 5656f072caSAdam Hornáčekorg.opengrok.web.DirectoryListing, 57686556f2SAdam Hornáčekorg.opengrok.indexer.web.SearchHelper" 5857eefa47SKryštof Tulinger%> 5957eefa47SKryštof Tulinger<% 6055774b8bSChris Frairefinal String DUMMY_REVISION = "unknown"; 6155774b8bSChris Fraire 620d40e9d0SAdam Hornáček{ 630d40e9d0SAdam Hornáček // need to set it here since requesting parameters 640d40e9d0SAdam Hornáček if (request.getCharacterEncoding() == null) { 650d40e9d0SAdam Hornáček request.setCharacterEncoding("UTF-8"); 660d40e9d0SAdam Hornáček } 670d40e9d0SAdam Hornáček 680d40e9d0SAdam Hornáček PageConfig cfg = PageConfig.get(request); 690d40e9d0SAdam Hornáček cfg.checkSourceRootExistence(); 700d40e9d0SAdam Hornáček 7155774b8bSChris Fraire String rev = cfg.getRequestedRevision(); 7255774b8bSChris Fraire if (!cfg.isDir() && rev.length() == 0) { 7355774b8bSChris Fraire /* 7455774b8bSChris Fraire * Get the latest revision and redirect so that the revision number 7555774b8bSChris Fraire * appears in the URL. 7655774b8bSChris Fraire */ 7755774b8bSChris Fraire String location = cfg.getRevisionLocation(cfg.getLatestRevision()); 7855774b8bSChris Fraire if (location != null) { 7955774b8bSChris Fraire response.sendRedirect(location); 8055774b8bSChris Fraire return; 8155774b8bSChris Fraire } 8255774b8bSChris Fraire if (!cfg.getEnv().isGenerateHtml()) { 8355774b8bSChris Fraire /* 8455774b8bSChris Fraire * Economy mode is on and failed to get the last revision 8555774b8bSChris Fraire * (presumably running with history turned off). Use dummy 8655774b8bSChris Fraire * revision string so that xref can be generated from the resource 8755774b8bSChris Fraire * file directly. 8855774b8bSChris Fraire */ 8955774b8bSChris Fraire location = cfg.getRevisionLocation(DUMMY_REVISION); 9055774b8bSChris Fraire response.sendRedirect(location); 9155774b8bSChris Fraire return; 9255774b8bSChris Fraire } 9355774b8bSChris Fraire } 9455774b8bSChris Fraire 950d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 960d40e9d0SAdam Hornáček if (annotation != null) { 970d40e9d0SAdam Hornáček int r = annotation.getWidestRevision(); 980d40e9d0SAdam Hornáček int a = annotation.getWidestAuthor(); 990d40e9d0SAdam Hornáček cfg.addHeaderData("<style type=\"text/css\">" 1000d40e9d0SAdam Hornáček + ".blame .r { width: " + (r == 0 ? 6 : Math.ceil(r * 0.7)) + "em; } " 1010d40e9d0SAdam Hornáček + ".blame .a { width: " + (a == 0 ? 6 : Math.ceil(a * 0.7)) + "em; } " 1020d40e9d0SAdam Hornáček + "</style>"); 1030d40e9d0SAdam Hornáček } 1040d40e9d0SAdam Hornáček} 1050d40e9d0SAdam Hornáček%><%@include 1060d40e9d0SAdam Hornáček 1070d40e9d0SAdam Hornáčekfile="mast.jsp" 1080d40e9d0SAdam Hornáček 1090d40e9d0SAdam Hornáček%><script type="text/javascript">/* <![CDATA[ */ 1100d40e9d0SAdam Hornáčekdocument.pageReady.push(function() { pageReadyList();}); 1110d40e9d0SAdam Hornáček/* ]]> */</script> 1120d40e9d0SAdam Hornáček<% 1130d40e9d0SAdam Hornáček/* ---------------------- list.jsp start --------------------- */ 1140d40e9d0SAdam Hornáček{ 115e829566cSChris Fraire final Logger LOGGER = LoggerFactory.getLogger(getClass()); 116e829566cSChris Fraire 1170d40e9d0SAdam Hornáček PageConfig cfg = PageConfig.get(request); 1180d40e9d0SAdam Hornáček String rev = cfg.getRequestedRevision(); 119e393cb49SAdam Hornáček Project project = cfg.getProject(); 1200d40e9d0SAdam Hornáček 121e393cb49SAdam Hornáček String navigateWindowEnabled = project != null ? Boolean.toString( 122e393cb49SAdam Hornáček project.isNavigateWindowEnabled()) : "false"; 1230d40e9d0SAdam Hornáček File resourceFile = cfg.getResourceFile(); 1240d40e9d0SAdam Hornáček String path = cfg.getPath(); 1250d40e9d0SAdam Hornáček String basename = resourceFile.getName(); 1260d40e9d0SAdam Hornáček String rawPath = request.getContextPath() + Prefix.DOWNLOAD_P + path; 1270d40e9d0SAdam Hornáček Reader r = null; 1280d40e9d0SAdam Hornáček if (cfg.isDir()) { 1290d40e9d0SAdam Hornáček // valid resource is requested 1300d40e9d0SAdam Hornáček // mast.jsp assures, that resourceFile is valid and not / 1310d40e9d0SAdam Hornáček // see cfg.resourceNotAvailable() 1320d40e9d0SAdam Hornáček String cookieValue = cfg.getRequestedProjectsAsString(); 133*5c931ce8SChris Fraire String projectName = null; 134e393cb49SAdam Hornáček if (project != null) { 135*5c931ce8SChris Fraire projectName = project.getName(); 1360d40e9d0SAdam Hornáček Set<String> projects = cfg.getRequestedProjects(); 137*5c931ce8SChris Fraire if (!projects.contains(projectName)) { 138*5c931ce8SChris Fraire projects.add(projectName); 1390d40e9d0SAdam Hornáček // update cookie 140*5c931ce8SChris Fraire cookieValue = cookieValue.length() == 0 ? projectName : 141*5c931ce8SChris Fraire projectName + ',' + cookieValue; 1420d40e9d0SAdam Hornáček Cookie cookie = new Cookie(PageConfig.OPEN_GROK_PROJECT, URLEncoder.encode(cookieValue, "utf-8")); 1430d40e9d0SAdam Hornáček // TODO hmmm, projects.jspf doesn't set a path 1440d40e9d0SAdam Hornáček cookie.setPath(request.getContextPath() + '/'); 1450d40e9d0SAdam Hornáček response.addCookie(cookie); 1460d40e9d0SAdam Hornáček } 1470d40e9d0SAdam Hornáček } 1480d40e9d0SAdam Hornáček // requesting a directory listing 1490d40e9d0SAdam Hornáček DirectoryListing dl = new DirectoryListing(cfg.getEftarReader()); 1500d40e9d0SAdam Hornáček List<String> files = cfg.getResourceFileList(); 1510d40e9d0SAdam Hornáček if (!files.isEmpty()) { 1520d40e9d0SAdam Hornáček List<FileExtra> extras = null; 1530d40e9d0SAdam Hornáček SearchHelper searchHelper = cfg.prepareInternalSearch(); 154*5c931ce8SChris Fraire /* 155*5c931ce8SChris Fraire * N.b. searchHelper.destroy() is called via 156*5c931ce8SChris Fraire * WebappListener.requestDestroyed() on presence of the following 157*5c931ce8SChris Fraire * REQUEST_ATTR. 158*5c931ce8SChris Fraire */ 1590d40e9d0SAdam Hornáček request.setAttribute(SearchHelper.REQUEST_ATTR, searchHelper); 160*5c931ce8SChris Fraire if (project != null) { 161e393cb49SAdam Hornáček searchHelper.prepareExec(project); 162*5c931ce8SChris Fraire } else { 163*5c931ce8SChris Fraire //noinspection Convert2Diamond 164*5c931ce8SChris Fraire searchHelper.prepareExec(new TreeSet<String>()); 165*5c931ce8SChris Fraire } 1660d40e9d0SAdam Hornáček 1670d40e9d0SAdam Hornáček if (searchHelper.searcher != null) { 168*5c931ce8SChris Fraire DirectoryExtraReader extraReader = new DirectoryExtraReader(); 1697d004396SChris Fraire String primePath = path; 1707d004396SChris Fraire try { 171*5c931ce8SChris Fraire primePath = searchHelper.getPrimeRelativePath(projectName, path); 1727d004396SChris Fraire } catch (IOException | ForbiddenSymlinkException ex) { 1737d004396SChris Fraire LOGGER.log(Level.WARNING, String.format( 1747d004396SChris Fraire "Error getting prime relative for %s", path), ex); 1757d004396SChris Fraire } 1767d004396SChris Fraire extras = extraReader.search(searchHelper.searcher, primePath); 1770d40e9d0SAdam Hornáček } 1780d40e9d0SAdam Hornáček 1790d40e9d0SAdam Hornáček FileExtraZipper zipper = new FileExtraZipper(); 1800d40e9d0SAdam Hornáček List<DirectoryEntry> entries = zipper.zip(resourceFile, files, 1810d40e9d0SAdam Hornáček extras); 1820d40e9d0SAdam Hornáček 1830d40e9d0SAdam Hornáček List<String> readMes = dl.extraListTo( 1840d40e9d0SAdam Hornáček Util.URIEncodePath(request.getContextPath()), 1850d40e9d0SAdam Hornáček resourceFile, out, path, entries); 1860d40e9d0SAdam Hornáček File[] catfiles = cfg.findDataFiles(readMes); 1870d40e9d0SAdam Hornáček for (int i=0; i < catfiles.length; i++) { 1880d40e9d0SAdam Hornáček if (catfiles[i] == null) { 1890d40e9d0SAdam Hornáček continue; 1900d40e9d0SAdam Hornáček } 1910d40e9d0SAdam Hornáček%> 1920d40e9d0SAdam Hornáček<% 19352dccac1SChris Fraire String lcName = readMes.get(i).toLowerCase(Locale.ROOT); 1940d40e9d0SAdam Hornáček if (lcName.endsWith(".md") || lcName.endsWith(".markdown")) { 1950d40e9d0SAdam Hornáček %><div id="src<%=i%>" data-markdown> 1960d40e9d0SAdam Hornáček <div class="markdown-heading"> 1970d40e9d0SAdam Hornáček <h3><%= readMes.get(i) %></h3> 1980d40e9d0SAdam Hornáček </div> 1990d40e9d0SAdam Hornáček <div class="markdown-content" 2000d40e9d0SAdam Hornáček data-markdown-download="<%= request.getContextPath() + Prefix.DOWNLOAD_P + Util.URIEncodePath(cfg.getPath() + readMes.get(i)) %>"> 2010d40e9d0SAdam Hornáček </div> 2020d40e9d0SAdam Hornáček <pre data-markdown-original><% 2030d40e9d0SAdam Hornáček Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz")); 2040d40e9d0SAdam Hornáček %></pre> 2050d40e9d0SAdam Hornáček </div> 2060d40e9d0SAdam Hornáček<% } else { %> 2070d40e9d0SAdam Hornáček <h3><%= readMes.get(i) %></h3> 2080d40e9d0SAdam Hornáček <div id="src<%=i%>"> 2090d40e9d0SAdam Hornáček <pre><% 2100d40e9d0SAdam Hornáček Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz")); 2110d40e9d0SAdam Hornáček %></pre> 2120d40e9d0SAdam Hornáček </div> 2130d40e9d0SAdam Hornáček<% 2140d40e9d0SAdam Hornáček } 2150d40e9d0SAdam Hornáček 2160d40e9d0SAdam Hornáček } 2170d40e9d0SAdam Hornáček } 218a03922c4SAdam Hornáček } else if (rev.length() != 0) { 219a03922c4SAdam Hornáček // requesting a revision 22055774b8bSChris Fraire File xrefFile; 221ee13dbaeSChris Fraire if (cfg.isLatestRevision(rev) && 222ee13dbaeSChris Fraire (xrefFile = cfg.findDataFile()) != null) { 223a03922c4SAdam Hornáček if (cfg.annotate()) { 2240d40e9d0SAdam Hornáček // annotate 2250d40e9d0SAdam Hornáček BufferedInputStream bin = 2260d40e9d0SAdam Hornáček new BufferedInputStream(new FileInputStream(resourceFile)); 2270d40e9d0SAdam Hornáček try { 22857eefa47SKryštof Tulinger AnalyzerFactory a = AnalyzerGuru.find(basename); 22957eefa47SKryštof Tulinger AbstractAnalyzer.Genre g = AnalyzerGuru.getGenre(a); 2300d40e9d0SAdam Hornáček if (g == null) { 2310d40e9d0SAdam Hornáček a = AnalyzerGuru.find(bin); 2320d40e9d0SAdam Hornáček g = AnalyzerGuru.getGenre(a); 2330d40e9d0SAdam Hornáček } 23457eefa47SKryštof Tulinger if (g == AbstractAnalyzer.Genre.IMAGE) { 2350d40e9d0SAdam Hornáček%> 2360d40e9d0SAdam Hornáček<div id="src"> 2370d40e9d0SAdam Hornáček <img src="<%= rawPath %>"/> 2380d40e9d0SAdam Hornáček</div><% 23957eefa47SKryštof Tulinger } else if ( g == AbstractAnalyzer.Genre.HTML) { 2400d40e9d0SAdam Hornáček /** 2410d40e9d0SAdam Hornáček * For backward compatibility, read the OpenGrok-produced 2420d40e9d0SAdam Hornáček * document using the system default charset. 2430d40e9d0SAdam Hornáček */ 2440d40e9d0SAdam Hornáček r = new InputStreamReader(bin); 245e393cb49SAdam Hornáček // dumpXref() is also useful here for translating links. 246e393cb49SAdam Hornáček Util.dumpXref(out, r, request.getContextPath()); 24757eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.PLAIN) { 2480d40e9d0SAdam Hornáček%> 2490d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 2500d40e9d0SAdam Hornáček <pre><% 2510d40e9d0SAdam Hornáček // We're generating xref for the latest revision, so we can 2520d40e9d0SAdam Hornáček // find the definitions in the index. 2530d40e9d0SAdam Hornáček Definitions defs = IndexDatabase.getDefinitions(resourceFile); 2540d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 2550d40e9d0SAdam Hornáček // SRCROOT is read with UTF-8 as a default. 2560d40e9d0SAdam Hornáček r = IOUtils.createBOMStrippedReader(bin, 2570d40e9d0SAdam Hornáček StandardCharsets.UTF_8.name()); 258e393cb49SAdam Hornáček AnalyzerGuru.writeDumpedXref(request.getContextPath(), a, 259e393cb49SAdam Hornáček r, out, defs, annotation, project); 2600d40e9d0SAdam Hornáček %></pre> 2610d40e9d0SAdam Hornáček</div><% 2620d40e9d0SAdam Hornáček } else { 2630d40e9d0SAdam Hornáček%> 2640d40e9d0SAdam HornáčekClick <a href="<%= rawPath %>">download <%= basename %></a><% 2650d40e9d0SAdam Hornáček } 2660d40e9d0SAdam Hornáček } finally { 2670d40e9d0SAdam Hornáček if (r != null) { 2680d40e9d0SAdam Hornáček try { r.close(); bin = null; } 2690d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 2700d40e9d0SAdam Hornáček } 2710d40e9d0SAdam Hornáček if (bin != null) { 2720d40e9d0SAdam Hornáček try { bin.close(); } 2730d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 2740d40e9d0SAdam Hornáček } 2750d40e9d0SAdam Hornáček } 276a03922c4SAdam Hornáček 277a03922c4SAdam Hornáček } else { 2780d40e9d0SAdam Hornáček%> 2790d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 2800d40e9d0SAdam Hornáček <pre><% 281e393cb49SAdam Hornáček boolean compressed = xrefFile.getName().endsWith(".gz"); 282e393cb49SAdam Hornáček Util.dumpXref(out, xrefFile, compressed, 283e393cb49SAdam Hornáček request.getContextPath()); 2840d40e9d0SAdam Hornáček %></pre> 2850d40e9d0SAdam Hornáček</div><% 2860d40e9d0SAdam Hornáček } 2870d40e9d0SAdam Hornáček } else { 288f3e7c6e8SVladimir Kotal // requesting a previous revision or needed to generate xref on the fly (economy mode). 28957eefa47SKryštof Tulinger AnalyzerFactory a = AnalyzerGuru.find(basename); 290e829566cSChris Fraire Genre g = AnalyzerGuru.getGenre(a); 2910d40e9d0SAdam Hornáček String error = null; 292e829566cSChris Fraire if (g == Genre.PLAIN || g == Genre.HTML || g == null) { 2930d40e9d0SAdam Hornáček InputStream in = null; 294e829566cSChris Fraire File tempf = null; 2950d40e9d0SAdam Hornáček try { 29617c862aeSVladimir Kotal if (rev.equals(DUMMY_REVISION)) { 29717c862aeSVladimir Kotal in = new FileInputStream(resourceFile); 29817c862aeSVladimir Kotal } else { 299e829566cSChris Fraire tempf = File.createTempFile("ogtags", basename); 300e829566cSChris Fraire if (HistoryGuru.getInstance().getRevision(tempf, 301e829566cSChris Fraire resourceFile.getParent(), basename, rev)) { 302e829566cSChris Fraire in = new BufferedInputStream( 303e829566cSChris Fraire new FileInputStream(tempf)); 304e829566cSChris Fraire } else { 305e829566cSChris Fraire tempf.delete(); 306e829566cSChris Fraire tempf = null; 307e829566cSChris Fraire } 30817c862aeSVladimir Kotal } 3090d40e9d0SAdam Hornáček } catch (Exception e) { 3100d40e9d0SAdam Hornáček // fall through to error message 3110d40e9d0SAdam Hornáček error = e.getMessage(); 312e829566cSChris Fraire if (tempf != null) { 313e829566cSChris Fraire tempf.delete(); 314e829566cSChris Fraire tempf = null; 315e829566cSChris Fraire } 3160d40e9d0SAdam Hornáček } 3170d40e9d0SAdam Hornáček if (in != null) { 3180d40e9d0SAdam Hornáček try { 3190d40e9d0SAdam Hornáček if (g == null) { 320e829566cSChris Fraire a = AnalyzerGuru.find(in, basename); 3210d40e9d0SAdam Hornáček g = AnalyzerGuru.getGenre(a); 3220d40e9d0SAdam Hornáček } 32357eefa47SKryštof Tulinger if (g == AbstractAnalyzer.Genre.DATA || g == AbstractAnalyzer.Genre.XREFABLE || g == null) { 3240d40e9d0SAdam Hornáček %> 3250d40e9d0SAdam Hornáček <div id="src"> 3260d40e9d0SAdam Hornáček Binary file [Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">here</a> to download] 3270d40e9d0SAdam Hornáček </div><% 3280d40e9d0SAdam Hornáček } else { 3290d40e9d0SAdam Hornáček %> 3300d40e9d0SAdam Hornáček <div id="src"> 3310d40e9d0SAdam Hornáček <pre><% 33257eefa47SKryštof Tulinger if (g == AbstractAnalyzer.Genre.PLAIN) { 3330d40e9d0SAdam Hornáček Definitions defs = null; 334e829566cSChris Fraire ObjectPool<Ctags> ctagsPool = cfg.getEnv(). 335e829566cSChris Fraire getIndexerParallelizer().getCtagsPool(); 336e829566cSChris Fraire int tries = 2; 337e829566cSChris Fraire while (cfg.getEnv().isWebappCtags()) { 338e829566cSChris Fraire Ctags ctags = ctagsPool.get(); 339e829566cSChris Fraire try { 340e829566cSChris Fraire ctags.setTabSize(project != null ? 341e829566cSChris Fraire project.getTabSize() : 0); 342e829566cSChris Fraire defs = ctags.doCtags(tempf.getPath()); 343e829566cSChris Fraire break; 344e829566cSChris Fraire } catch (InterruptedException ex) { 345e829566cSChris Fraire if (--tries > 0) { 346e829566cSChris Fraire LOGGER.log(Level.WARNING, 347e829566cSChris Fraire "doCtags() interrupted--{0}", 348e829566cSChris Fraire ex.getMessage()); 349e829566cSChris Fraire continue; 350e829566cSChris Fraire } 351e829566cSChris Fraire LOGGER.log(Level.WARNING, "doCtags()", ex); 352e829566cSChris Fraire break; 353e829566cSChris Fraire } catch (Exception ex) { 354e829566cSChris Fraire LOGGER.log(Level.WARNING, "doCtags()", ex); 355e829566cSChris Fraire break; 356e829566cSChris Fraire } finally { 357e829566cSChris Fraire ctags.reset(); 358e829566cSChris Fraire ctagsPool.release(ctags); 359e829566cSChris Fraire } 360e829566cSChris Fraire } 3610d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 3620d40e9d0SAdam Hornáček //not needed yet 3630d40e9d0SAdam Hornáček //annotation.writeTooltipMap(out); 3640d40e9d0SAdam Hornáček // SRCROOT is read with UTF-8 as a default. 3650d40e9d0SAdam Hornáček r = IOUtils.createBOMStrippedReader(in, 3660d40e9d0SAdam Hornáček StandardCharsets.UTF_8.name()); 367e393cb49SAdam Hornáček AnalyzerGuru.writeDumpedXref( 368a03922c4SAdam Hornáček request.getContextPath(), 369a03922c4SAdam Hornáček a, r, out, 370e393cb49SAdam Hornáček defs, annotation, project); 37157eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.IMAGE) { 3720d40e9d0SAdam Hornáček %></pre> 3730d40e9d0SAdam Hornáček <img src="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>"/> 3740d40e9d0SAdam Hornáček <pre><% 37557eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.HTML) { 3760d40e9d0SAdam Hornáček /** 3770d40e9d0SAdam Hornáček * For backward compatibility, read the 3780d40e9d0SAdam Hornáček * OpenGrok-produced document using the system 3790d40e9d0SAdam Hornáček * default charset. 3800d40e9d0SAdam Hornáček */ 3810d40e9d0SAdam Hornáček r = new InputStreamReader(in); 382e393cb49SAdam Hornáček /** 383e393cb49SAdam Hornáček * dumpXref() is also useful here for 384e393cb49SAdam Hornáček * translating links. 385e393cb49SAdam Hornáček */ 386e393cb49SAdam Hornáček Util.dumpXref(out, r, request.getContextPath()); 3870d40e9d0SAdam Hornáček } else { 3880d40e9d0SAdam Hornáček %> Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">download <%= basename %></a><% 3890d40e9d0SAdam Hornáček } 3900d40e9d0SAdam Hornáček } 3910d40e9d0SAdam Hornáček } catch (IOException e) { 3920d40e9d0SAdam Hornáček error = e.getMessage(); 3930d40e9d0SAdam Hornáček } finally { 3940d40e9d0SAdam Hornáček if (r != null) { 3950d40e9d0SAdam Hornáček try { r.close(); in = null;} 3960d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 3970d40e9d0SAdam Hornáček } 3980d40e9d0SAdam Hornáček if (in != null) { 3990d40e9d0SAdam Hornáček try { in.close(); } 4000d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 4010d40e9d0SAdam Hornáček } 402e829566cSChris Fraire if (tempf != null) { 403e829566cSChris Fraire tempf.delete(); 404e829566cSChris Fraire } 4050d40e9d0SAdam Hornáček } 4060d40e9d0SAdam Hornáček %></pre> 4070d40e9d0SAdam Hornáček </div><% 4080d40e9d0SAdam Hornáček } else { 4090d40e9d0SAdam Hornáček %> 4100d40e9d0SAdam Hornáček <h3 class="error">Error reading file</h3><% 4110d40e9d0SAdam Hornáček if (error != null) { 4120d40e9d0SAdam Hornáček %> 4130d40e9d0SAdam Hornáček <p class="error"><%= error %></p><% 4140d40e9d0SAdam Hornáček } 4150d40e9d0SAdam Hornáček } 41657eefa47SKryštof Tulinger } else if (g == AbstractAnalyzer.Genre.IMAGE) { 4170d40e9d0SAdam Hornáček %> 4180d40e9d0SAdam Hornáček <div id="src"> 4190d40e9d0SAdam Hornáček <img src="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>"/> 4200d40e9d0SAdam Hornáček </div><% 4210d40e9d0SAdam Hornáček } else { 4220d40e9d0SAdam Hornáček %> 4230d40e9d0SAdam Hornáček <div id="src"> 4240d40e9d0SAdam Hornáček Binary file [Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">here</a> to download] 4250d40e9d0SAdam Hornáček </div><% 4260d40e9d0SAdam Hornáček } 4270d40e9d0SAdam Hornáček } 4280d40e9d0SAdam Hornáček } else { 4290d40e9d0SAdam Hornáček // requesting cross referenced file 4300d40e9d0SAdam Hornáček 43155774b8bSChris Fraire File xrefFile = cfg.findDataFile(); 4320d40e9d0SAdam Hornáček if (xrefFile != null) { 4330d40e9d0SAdam Hornáček%> 4340d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 4350d40e9d0SAdam Hornáček <pre><% 436e393cb49SAdam Hornáček boolean compressed = xrefFile.getName().endsWith(".gz"); 437e393cb49SAdam Hornáček Util.dumpXref(out, xrefFile, compressed, request.getContextPath()); 4380d40e9d0SAdam Hornáček %></pre> 4390d40e9d0SAdam Hornáček</div><% 44017c862aeSVladimir Kotal } else { 44117c862aeSVladimir Kotal%> 4425c4b57feSVladimir Kotal<p class="error">Failed to get xref file</p><% 4430d40e9d0SAdam Hornáček } 4440d40e9d0SAdam Hornáček } 4450d40e9d0SAdam Hornáček} 4460d40e9d0SAdam Hornáček/* ---------------------- list.jsp end --------------------- */ 4470d40e9d0SAdam Hornáček%><%@ 4480d40e9d0SAdam Hornáček 4490d40e9d0SAdam Hornáčekinclude file="foot.jspf" 4500d40e9d0SAdam Hornáček 4510d40e9d0SAdam Hornáček%> 452