1*0d40e9d0SAdam Hornáček<%-- 2*0d40e9d0SAdam Hornáček$Id$ 3*0d40e9d0SAdam Hornáček 4*0d40e9d0SAdam HornáčekCDDL HEADER START 5*0d40e9d0SAdam Hornáček 6*0d40e9d0SAdam HornáčekThe contents of this file are subject to the terms of the 7*0d40e9d0SAdam HornáčekCommon Development and Distribution License (the "License"). 8*0d40e9d0SAdam HornáčekYou may not use this file except in compliance with the License. 9*0d40e9d0SAdam Hornáček 10*0d40e9d0SAdam HornáčekSee LICENSE.txt included in this distribution for the specific 11*0d40e9d0SAdam Hornáčeklanguage governing permissions and limitations under the License. 12*0d40e9d0SAdam Hornáček 13*0d40e9d0SAdam HornáčekWhen distributing Covered Code, include this CDDL HEADER in each 14*0d40e9d0SAdam Hornáčekfile and include the License file at LICENSE.txt. 15*0d40e9d0SAdam HornáčekIf applicable, add the following below this CDDL HEADER, with the 16*0d40e9d0SAdam Hornáčekfields enclosed by brackets "[]" replaced with your own identifying 17*0d40e9d0SAdam Hornáčekinformation: Portions Copyright [yyyy] [name of copyright owner] 18*0d40e9d0SAdam Hornáček 19*0d40e9d0SAdam HornáčekCDDL HEADER END 20*0d40e9d0SAdam Hornáček 21*0d40e9d0SAdam HornáčekCopyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. 22*0d40e9d0SAdam HornáčekPortions Copyright 2011 Jens Elkner. 23*0d40e9d0SAdam HornáčekPortions Copyright (c) 2017, Chris Fraire <cfraire@me.com>. 24*0d40e9d0SAdam Hornáček 25*0d40e9d0SAdam Hornáček--%> 26*0d40e9d0SAdam Hornáček<%@page errorPage="error.jsp" import=" 27*0d40e9d0SAdam Hornáčekjava.io.BufferedInputStream, 28*0d40e9d0SAdam Hornáčekjava.io.BufferedReader, 29*0d40e9d0SAdam Hornáčekjava.io.FileInputStream, 30*0d40e9d0SAdam Hornáčekjava.io.FileReader, 31*0d40e9d0SAdam Hornáčekjava.io.InputStream, 32*0d40e9d0SAdam Hornáčekjava.io.InputStreamReader, 33*0d40e9d0SAdam Hornáčekjava.io.Reader, 34*0d40e9d0SAdam Hornáčekjava.net.URLEncoder, 35*0d40e9d0SAdam Hornáčekjava.nio.charset.StandardCharsets, 36*0d40e9d0SAdam Hornáčekjava.util.ArrayList, 37*0d40e9d0SAdam Hornáčekjava.util.Arrays, 38*0d40e9d0SAdam Hornáčekjava.util.List, 39*0d40e9d0SAdam Hornáčekjava.util.Set, 40*0d40e9d0SAdam Hornáčekjava.util.logging.Level, 41*0d40e9d0SAdam Hornáčekjava.util.zip.GZIPInputStream, 42*0d40e9d0SAdam Hornáčekjavax.servlet.http.HttpServletResponse, 43*0d40e9d0SAdam Hornáček 44*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.analysis.AnalyzerGuru, 45*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.analysis.Definitions, 46*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.analysis.FileAnalyzer.Genre, 47*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.analysis.FileAnalyzerFactory, 48*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.history.Annotation, 49*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.index.IndexDatabase, 50*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.search.DirectoryEntry, 51*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.search.DirectoryExtraReader, 52*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.search.FileExtra, 53*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.util.FileExtraZipper, 54*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.util.IOUtils, 55*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.web.DirectoryListing, 56*0d40e9d0SAdam Hornáčekorg.opensolaris.opengrok.web.SearchHelper" 57*0d40e9d0SAdam Hornáček%><% 58*0d40e9d0SAdam Hornáček{ 59*0d40e9d0SAdam Hornáček // need to set it here since requesting parameters 60*0d40e9d0SAdam Hornáček if (request.getCharacterEncoding() == null) { 61*0d40e9d0SAdam Hornáček request.setCharacterEncoding("UTF-8"); 62*0d40e9d0SAdam Hornáček } 63*0d40e9d0SAdam Hornáček 64*0d40e9d0SAdam Hornáček PageConfig cfg = PageConfig.get(request); 65*0d40e9d0SAdam Hornáček cfg.checkSourceRootExistence(); 66*0d40e9d0SAdam Hornáček 67*0d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 68*0d40e9d0SAdam Hornáček if (annotation != null) { 69*0d40e9d0SAdam Hornáček int r = annotation.getWidestRevision(); 70*0d40e9d0SAdam Hornáček int a = annotation.getWidestAuthor(); 71*0d40e9d0SAdam Hornáček cfg.addHeaderData("<style type=\"text/css\">" 72*0d40e9d0SAdam Hornáček + ".blame .r { width: " + (r == 0 ? 6 : Math.ceil(r * 0.7)) + "em; } " 73*0d40e9d0SAdam Hornáček + ".blame .a { width: " + (a == 0 ? 6 : Math.ceil(a * 0.7)) + "em; } " 74*0d40e9d0SAdam Hornáček + "</style>"); 75*0d40e9d0SAdam Hornáček } 76*0d40e9d0SAdam Hornáček} 77*0d40e9d0SAdam Hornáček%><%@include 78*0d40e9d0SAdam Hornáček 79*0d40e9d0SAdam Hornáčekfile="mast.jsp" 80*0d40e9d0SAdam Hornáček 81*0d40e9d0SAdam Hornáček%><script type="text/javascript">/* <![CDATA[ */ 82*0d40e9d0SAdam Hornáčekdocument.pageReady.push(function() { pageReadyList();}); 83*0d40e9d0SAdam Hornáček/* ]]> */</script> 84*0d40e9d0SAdam Hornáček<% 85*0d40e9d0SAdam Hornáček/* ---------------------- list.jsp start --------------------- */ 86*0d40e9d0SAdam Hornáček{ 87*0d40e9d0SAdam Hornáček PageConfig cfg = PageConfig.get(request); 88*0d40e9d0SAdam Hornáček String rev = cfg.getRequestedRevision(); 89*0d40e9d0SAdam Hornáček 90*0d40e9d0SAdam Hornáček String navigateWindowEnabled = cfg.getProject() != null 91*0d40e9d0SAdam Hornáček ? Boolean.toString(cfg.getProject().isNavigateWindowEnabled()) 92*0d40e9d0SAdam Hornáček : "false"; 93*0d40e9d0SAdam Hornáček File resourceFile = cfg.getResourceFile(); 94*0d40e9d0SAdam Hornáček String path = cfg.getPath(); 95*0d40e9d0SAdam Hornáček String basename = resourceFile.getName(); 96*0d40e9d0SAdam Hornáček String rawPath = request.getContextPath() + Prefix.DOWNLOAD_P + path; 97*0d40e9d0SAdam Hornáček Reader r = null; 98*0d40e9d0SAdam Hornáček if (cfg.isDir()) { 99*0d40e9d0SAdam Hornáček // valid resource is requested 100*0d40e9d0SAdam Hornáček // mast.jsp assures, that resourceFile is valid and not / 101*0d40e9d0SAdam Hornáček // see cfg.resourceNotAvailable() 102*0d40e9d0SAdam Hornáček Project activeProject = Project.getProject(resourceFile); 103*0d40e9d0SAdam Hornáček String cookieValue = cfg.getRequestedProjectsAsString(); 104*0d40e9d0SAdam Hornáček if (activeProject != null) { 105*0d40e9d0SAdam Hornáček Set<String> projects = cfg.getRequestedProjects(); 106*0d40e9d0SAdam Hornáček if (!projects.contains(activeProject.getName())) { 107*0d40e9d0SAdam Hornáček projects.add(activeProject.getName()); 108*0d40e9d0SAdam Hornáček // update cookie 109*0d40e9d0SAdam Hornáček cookieValue = cookieValue.length() == 0 110*0d40e9d0SAdam Hornáček ? activeProject.getName() 111*0d40e9d0SAdam Hornáček : activeProject.getName() + ',' + cookieValue; 112*0d40e9d0SAdam Hornáček Cookie cookie = new Cookie(PageConfig.OPEN_GROK_PROJECT, URLEncoder.encode(cookieValue, "utf-8")); 113*0d40e9d0SAdam Hornáček // TODO hmmm, projects.jspf doesn't set a path 114*0d40e9d0SAdam Hornáček cookie.setPath(request.getContextPath() + '/'); 115*0d40e9d0SAdam Hornáček response.addCookie(cookie); 116*0d40e9d0SAdam Hornáček } 117*0d40e9d0SAdam Hornáček } 118*0d40e9d0SAdam Hornáček // requesting a directory listing 119*0d40e9d0SAdam Hornáček DirectoryListing dl = new DirectoryListing(cfg.getEftarReader()); 120*0d40e9d0SAdam Hornáček List<String> files = cfg.getResourceFileList(); 121*0d40e9d0SAdam Hornáček if (!files.isEmpty()) { 122*0d40e9d0SAdam Hornáček List<FileExtra> extras = null; 123*0d40e9d0SAdam Hornáček if (activeProject != null) { 124*0d40e9d0SAdam Hornáček SearchHelper searchHelper = cfg.prepareInternalSearch(); 125*0d40e9d0SAdam Hornáček // N.b. searchHelper.destroy() is called via 126*0d40e9d0SAdam Hornáček // WebappListener.requestDestroyed() on presence of the 127*0d40e9d0SAdam Hornáček // following REQUEST_ATTR. 128*0d40e9d0SAdam Hornáček request.setAttribute(SearchHelper.REQUEST_ATTR, searchHelper); 129*0d40e9d0SAdam Hornáček searchHelper.prepareExec(activeProject); 130*0d40e9d0SAdam Hornáček 131*0d40e9d0SAdam Hornáček if (searchHelper.searcher != null) { 132*0d40e9d0SAdam Hornáček DirectoryExtraReader extraReader = 133*0d40e9d0SAdam Hornáček new DirectoryExtraReader(); 134*0d40e9d0SAdam Hornáček extras = extraReader.search(searchHelper.searcher, path); 135*0d40e9d0SAdam Hornáček } 136*0d40e9d0SAdam Hornáček } 137*0d40e9d0SAdam Hornáček 138*0d40e9d0SAdam Hornáček FileExtraZipper zipper = new FileExtraZipper(); 139*0d40e9d0SAdam Hornáček List<DirectoryEntry> entries = zipper.zip(resourceFile, files, 140*0d40e9d0SAdam Hornáček extras); 141*0d40e9d0SAdam Hornáček 142*0d40e9d0SAdam Hornáček List<String> readMes = dl.extraListTo( 143*0d40e9d0SAdam Hornáček Util.URIEncodePath(request.getContextPath()), 144*0d40e9d0SAdam Hornáček resourceFile, out, path, entries); 145*0d40e9d0SAdam Hornáček File[] catfiles = cfg.findDataFiles(readMes); 146*0d40e9d0SAdam Hornáček for (int i=0; i < catfiles.length; i++) { 147*0d40e9d0SAdam Hornáček if (catfiles[i] == null) { 148*0d40e9d0SAdam Hornáček continue; 149*0d40e9d0SAdam Hornáček } 150*0d40e9d0SAdam Hornáček%> 151*0d40e9d0SAdam Hornáček<% 152*0d40e9d0SAdam Hornáček String lcName = readMes.get(i).toLowerCase(); 153*0d40e9d0SAdam Hornáček if (lcName.endsWith(".md") || lcName.endsWith(".markdown")) { 154*0d40e9d0SAdam Hornáček %><div id="src<%=i%>" data-markdown> 155*0d40e9d0SAdam Hornáček <div class="markdown-heading"> 156*0d40e9d0SAdam Hornáček <h3><%= readMes.get(i) %></h3> 157*0d40e9d0SAdam Hornáček </div> 158*0d40e9d0SAdam Hornáček <div class="markdown-content" 159*0d40e9d0SAdam Hornáček data-markdown-download="<%= request.getContextPath() + Prefix.DOWNLOAD_P + Util.URIEncodePath(cfg.getPath() + readMes.get(i)) %>"> 160*0d40e9d0SAdam Hornáček </div> 161*0d40e9d0SAdam Hornáček <pre data-markdown-original><% 162*0d40e9d0SAdam Hornáček Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz")); 163*0d40e9d0SAdam Hornáček %></pre> 164*0d40e9d0SAdam Hornáček </div> 165*0d40e9d0SAdam Hornáček<% } else { %> 166*0d40e9d0SAdam Hornáček <h3><%= readMes.get(i) %></h3> 167*0d40e9d0SAdam Hornáček <div id="src<%=i%>"> 168*0d40e9d0SAdam Hornáček <pre><% 169*0d40e9d0SAdam Hornáček Util.dump(out, catfiles[i], catfiles[i].getName().endsWith(".gz")); 170*0d40e9d0SAdam Hornáček %></pre> 171*0d40e9d0SAdam Hornáček </div> 172*0d40e9d0SAdam Hornáček<% 173*0d40e9d0SAdam Hornáček } 174*0d40e9d0SAdam Hornáček 175*0d40e9d0SAdam Hornáček } 176*0d40e9d0SAdam Hornáček } 177*0d40e9d0SAdam Hornáček } else if (cfg.annotate()) { 178*0d40e9d0SAdam Hornáček // annotate 179*0d40e9d0SAdam Hornáček BufferedInputStream bin = 180*0d40e9d0SAdam Hornáček new BufferedInputStream(new FileInputStream(resourceFile)); 181*0d40e9d0SAdam Hornáček try { 182*0d40e9d0SAdam Hornáček FileAnalyzerFactory a = AnalyzerGuru.find(basename); 183*0d40e9d0SAdam Hornáček Genre g = AnalyzerGuru.getGenre(a); 184*0d40e9d0SAdam Hornáček if (g == null) { 185*0d40e9d0SAdam Hornáček a = AnalyzerGuru.find(bin); 186*0d40e9d0SAdam Hornáček g = AnalyzerGuru.getGenre(a); 187*0d40e9d0SAdam Hornáček } 188*0d40e9d0SAdam Hornáček if (g == Genre.IMAGE) { 189*0d40e9d0SAdam Hornáček%> 190*0d40e9d0SAdam Hornáček<div id="src"> 191*0d40e9d0SAdam Hornáček <img src="<%= rawPath %>"/> 192*0d40e9d0SAdam Hornáček</div><% 193*0d40e9d0SAdam Hornáček } else if ( g == Genre.HTML) { 194*0d40e9d0SAdam Hornáček /** 195*0d40e9d0SAdam Hornáček * For backward compatibility, read the OpenGrok-produced 196*0d40e9d0SAdam Hornáček * document using the system default charset. 197*0d40e9d0SAdam Hornáček */ 198*0d40e9d0SAdam Hornáček r = new InputStreamReader(bin); 199*0d40e9d0SAdam Hornáček Util.dump(out, r); 200*0d40e9d0SAdam Hornáček } else if (g == Genre.PLAIN) { 201*0d40e9d0SAdam Hornáček%> 202*0d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 203*0d40e9d0SAdam Hornáček <pre><% 204*0d40e9d0SAdam Hornáček // We're generating xref for the latest revision, so we can 205*0d40e9d0SAdam Hornáček // find the definitions in the index. 206*0d40e9d0SAdam Hornáček Definitions defs = IndexDatabase.getDefinitions(resourceFile); 207*0d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 208*0d40e9d0SAdam Hornáček // SRCROOT is read with UTF-8 as a default. 209*0d40e9d0SAdam Hornáček r = IOUtils.createBOMStrippedReader(bin, 210*0d40e9d0SAdam Hornáček StandardCharsets.UTF_8.name()); 211*0d40e9d0SAdam Hornáček AnalyzerGuru.writeXref(a, r, out, defs, annotation, 212*0d40e9d0SAdam Hornáček Project.getProject(resourceFile)); 213*0d40e9d0SAdam Hornáček %></pre> 214*0d40e9d0SAdam Hornáček</div><% 215*0d40e9d0SAdam Hornáček } else { 216*0d40e9d0SAdam Hornáček%> 217*0d40e9d0SAdam HornáčekClick <a href="<%= rawPath %>">download <%= basename %></a><% 218*0d40e9d0SAdam Hornáček } 219*0d40e9d0SAdam Hornáček } finally { 220*0d40e9d0SAdam Hornáček if (r != null) { 221*0d40e9d0SAdam Hornáček try { r.close(); bin = null; } 222*0d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 223*0d40e9d0SAdam Hornáček } 224*0d40e9d0SAdam Hornáček if (bin != null) { 225*0d40e9d0SAdam Hornáček try { bin.close(); } 226*0d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 227*0d40e9d0SAdam Hornáček } 228*0d40e9d0SAdam Hornáček } 229*0d40e9d0SAdam Hornáček } else if (rev.length() != 0) { 230*0d40e9d0SAdam Hornáček // requesting a revision 231*0d40e9d0SAdam Hornáček if (cfg.isLatestRevision(rev)) { 232*0d40e9d0SAdam Hornáček File xrefFile = cfg.findDataFile(); 233*0d40e9d0SAdam Hornáček if (xrefFile != null) { 234*0d40e9d0SAdam Hornáček%> 235*0d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 236*0d40e9d0SAdam Hornáček <pre><% 237*0d40e9d0SAdam Hornáček Util.dump(out, xrefFile, xrefFile.getName().endsWith(".gz")); 238*0d40e9d0SAdam Hornáček %></pre> 239*0d40e9d0SAdam Hornáček</div><% 240*0d40e9d0SAdam Hornáček } 241*0d40e9d0SAdam Hornáček } else { 242*0d40e9d0SAdam Hornáček // requesting a previous revision 243*0d40e9d0SAdam Hornáček FileAnalyzerFactory a = AnalyzerGuru.find(basename); 244*0d40e9d0SAdam Hornáček Genre g = AnalyzerGuru.getGenre(a); 245*0d40e9d0SAdam Hornáček String error = null; 246*0d40e9d0SAdam Hornáček if (g == Genre.PLAIN|| g == Genre.HTML || g == null) { 247*0d40e9d0SAdam Hornáček InputStream in = null; 248*0d40e9d0SAdam Hornáček try { 249*0d40e9d0SAdam Hornáček in = HistoryGuru.getInstance() 250*0d40e9d0SAdam Hornáček .getRevision(resourceFile.getParent(), basename, rev); 251*0d40e9d0SAdam Hornáček } catch (Exception e) { 252*0d40e9d0SAdam Hornáček // fall through to error message 253*0d40e9d0SAdam Hornáček error = e.getMessage(); 254*0d40e9d0SAdam Hornáček } 255*0d40e9d0SAdam Hornáček if (in != null) { 256*0d40e9d0SAdam Hornáček try { 257*0d40e9d0SAdam Hornáček if (g == null) { 258*0d40e9d0SAdam Hornáček a = AnalyzerGuru.find(in); 259*0d40e9d0SAdam Hornáček g = AnalyzerGuru.getGenre(a); 260*0d40e9d0SAdam Hornáček } 261*0d40e9d0SAdam Hornáček if (g == Genre.DATA || g == Genre.XREFABLE 262*0d40e9d0SAdam Hornáček || g == null) 263*0d40e9d0SAdam Hornáček { 264*0d40e9d0SAdam Hornáček %> 265*0d40e9d0SAdam Hornáček <div id="src"> 266*0d40e9d0SAdam Hornáček Binary file [Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">here</a> to download] 267*0d40e9d0SAdam Hornáček </div><% 268*0d40e9d0SAdam Hornáček } else { 269*0d40e9d0SAdam Hornáček %> 270*0d40e9d0SAdam Hornáček <div id="src"> 271*0d40e9d0SAdam Hornáček <pre><% 272*0d40e9d0SAdam Hornáček if (g == Genre.PLAIN) { 273*0d40e9d0SAdam Hornáček // We don't have any way to get definitions 274*0d40e9d0SAdam Hornáček // for old revisions currently. 275*0d40e9d0SAdam Hornáček Definitions defs = null; 276*0d40e9d0SAdam Hornáček Annotation annotation = cfg.getAnnotation(); 277*0d40e9d0SAdam Hornáček //not needed yet 278*0d40e9d0SAdam Hornáček //annotation.writeTooltipMap(out); 279*0d40e9d0SAdam Hornáček // SRCROOT is read with UTF-8 as a default. 280*0d40e9d0SAdam Hornáček r = IOUtils.createBOMStrippedReader(in, 281*0d40e9d0SAdam Hornáček StandardCharsets.UTF_8.name()); 282*0d40e9d0SAdam Hornáček AnalyzerGuru.writeXref(a, r, out, defs, 283*0d40e9d0SAdam Hornáček annotation, Project.getProject(resourceFile)); 284*0d40e9d0SAdam Hornáček } else if (g == Genre.IMAGE) { 285*0d40e9d0SAdam Hornáček %></pre> 286*0d40e9d0SAdam Hornáček <img src="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>"/> 287*0d40e9d0SAdam Hornáček <pre><% 288*0d40e9d0SAdam Hornáček } else if (g == Genre.HTML) { 289*0d40e9d0SAdam Hornáček /** 290*0d40e9d0SAdam Hornáček * For backward compatibility, read the 291*0d40e9d0SAdam Hornáček * OpenGrok-produced document using the system 292*0d40e9d0SAdam Hornáček * default charset. 293*0d40e9d0SAdam Hornáček */ 294*0d40e9d0SAdam Hornáček r = new InputStreamReader(in); 295*0d40e9d0SAdam Hornáček Util.dump(out, r); 296*0d40e9d0SAdam Hornáček } else { 297*0d40e9d0SAdam Hornáček %> Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">download <%= basename %></a><% 298*0d40e9d0SAdam Hornáček } 299*0d40e9d0SAdam Hornáček } 300*0d40e9d0SAdam Hornáček } catch (IOException e) { 301*0d40e9d0SAdam Hornáček error = e.getMessage(); 302*0d40e9d0SAdam Hornáček } finally { 303*0d40e9d0SAdam Hornáček if (r != null) { 304*0d40e9d0SAdam Hornáček try { r.close(); in = null;} 305*0d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 306*0d40e9d0SAdam Hornáček } 307*0d40e9d0SAdam Hornáček if (in != null) { 308*0d40e9d0SAdam Hornáček try { in.close(); } 309*0d40e9d0SAdam Hornáček catch (Exception e) { /* ignore */ } 310*0d40e9d0SAdam Hornáček } 311*0d40e9d0SAdam Hornáček } 312*0d40e9d0SAdam Hornáček %></pre> 313*0d40e9d0SAdam Hornáček </div><% 314*0d40e9d0SAdam Hornáček } else { 315*0d40e9d0SAdam Hornáček %> 316*0d40e9d0SAdam Hornáček <h3 class="error">Error reading file</h3><% 317*0d40e9d0SAdam Hornáček if (error != null) { 318*0d40e9d0SAdam Hornáček %> 319*0d40e9d0SAdam Hornáček <p class="error"><%= error %></p><% 320*0d40e9d0SAdam Hornáček } 321*0d40e9d0SAdam Hornáček } 322*0d40e9d0SAdam Hornáček } else if (g == Genre.IMAGE) { 323*0d40e9d0SAdam Hornáček %> 324*0d40e9d0SAdam Hornáček <div id="src"> 325*0d40e9d0SAdam Hornáček <img src="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>"/> 326*0d40e9d0SAdam Hornáček </div><% 327*0d40e9d0SAdam Hornáček } else { 328*0d40e9d0SAdam Hornáček %> 329*0d40e9d0SAdam Hornáček <div id="src"> 330*0d40e9d0SAdam Hornáček Binary file [Click <a href="<%= rawPath %>?r=<%= Util.URIEncode(rev) %>">here</a> to download] 331*0d40e9d0SAdam Hornáček </div><% 332*0d40e9d0SAdam Hornáček } 333*0d40e9d0SAdam Hornáček } 334*0d40e9d0SAdam Hornáček } else { 335*0d40e9d0SAdam Hornáček // requesting cross referenced file 336*0d40e9d0SAdam Hornáček File xrefFile = null; 337*0d40e9d0SAdam Hornáček 338*0d40e9d0SAdam Hornáček // Get the latest revision and redirect so that the revision number 339*0d40e9d0SAdam Hornáček // appears in the URL. 340*0d40e9d0SAdam Hornáček String location = cfg.getLatestRevisionLocation(); 341*0d40e9d0SAdam Hornáček if (location != null) { 342*0d40e9d0SAdam Hornáček response.sendRedirect(location); 343*0d40e9d0SAdam Hornáček return; 344*0d40e9d0SAdam Hornáček } else { 345*0d40e9d0SAdam Hornáček xrefFile = cfg.findDataFile(); 346*0d40e9d0SAdam Hornáček } 347*0d40e9d0SAdam Hornáček 348*0d40e9d0SAdam Hornáček if (xrefFile != null) { 349*0d40e9d0SAdam Hornáček%> 350*0d40e9d0SAdam Hornáček<div id="src" data-navigate-window-enabled="<%= navigateWindowEnabled %>"> 351*0d40e9d0SAdam Hornáček <pre><% 352*0d40e9d0SAdam Hornáček Util.dump(out, xrefFile, xrefFile.getName().endsWith(".gz")); 353*0d40e9d0SAdam Hornáček %></pre> 354*0d40e9d0SAdam Hornáček</div><% 355*0d40e9d0SAdam Hornáček } 356*0d40e9d0SAdam Hornáček } 357*0d40e9d0SAdam Hornáček} 358*0d40e9d0SAdam Hornáček/* ---------------------- list.jsp end --------------------- */ 359*0d40e9d0SAdam Hornáček%><%@ 360*0d40e9d0SAdam Hornáček 361*0d40e9d0SAdam Hornáčekinclude file="foot.jspf" 362*0d40e9d0SAdam Hornáček 363*0d40e9d0SAdam Hornáček%> 364