xref: /OpenGrok/opengrok-web/src/main/webapp/list.jsp (revision 0d40e9d0d07acb46ebe450cbc6042a9705a36e41)
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