list.jsp revision 1368
f79d43bbe70a01454049b77d6f15f6369744959eStéphane Graber<%--
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano$Id$
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoCDDL HEADER START
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoThe contents of this file are subject to the terms of the
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoCommon Development and Distribution License (the "License").
9afe19d634946d50eab30e3b90cb5cebcde39eeaDaniel LezcanoYou may not use this file except in compliance with the License.
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoSee LICENSE.txt included in this distribution for the specific
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanolanguage governing permissions and limitations under the License.
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoWhen distributing Covered Code, include this CDDL HEADER in each
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanofile and include the License file at LICENSE.txt.
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoIf applicable, add the following below this CDDL HEADER, with the
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanofields enclosed by brackets "[]" replaced with your own identifying
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoinformation: Portions Copyright [yyyy] [name of copyright owner]
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoCDDL HEADER END
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoCopyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoPortions Copyright 2011 Jens Elkner.
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano--%><%@page import="org.opensolaris.opengrok.util.IOUtils"%>
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano<%@ page session="false" errorPage="error.jsp" import="
aa8d013ec5b09cd1cd904173d6234ef126eb2126Peter Simonsjava.io.BufferedInputStream,
99e4008cad9e959b683c6f48411fcf15a92be3b5Michel Normandjava.io.File,
10fba81b9d0221b8e47aa1e0b43236413b7d28dfMichel Normandjava.io.IOException,
99e4008cad9e959b683c6f48411fcf15a92be3b5Michel Normandjava.io.FileInputStream,
99e4008cad9e959b683c6f48411fcf15a92be3b5Michel Normandjava.io.InputStream,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanojava.io.InputStreamReader,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanojava.io.Reader,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanojava.text.Format,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanojava.text.SimpleDateFormat,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanojava.util.ArrayList,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanojava.util.List,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanojava.util.Set,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.analysis.AnalyzerGuru,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.analysis.Definitions,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.analysis.FileAnalyzer.Genre,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.analysis.FileAnalyzerFactory,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.history.Annotation,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.history.HistoryGuru,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.index.IgnoredNames,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.index.IndexDatabase,
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanoorg.opensolaris.opengrok.web.EftarFileReader"
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano%><%
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano{
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano // need to set it here since requesting parameters
b4578c5b380130a41a69b5b49c970157acaf1dbbDwight Engen if (request.getCharacterEncoding() == null) {
b4578c5b380130a41a69b5b49c970157acaf1dbbDwight Engen request.setCharacterEncoding("UTF-8");
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano }
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano cfg = PageConfig.get(request);
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano Annotation annotation = cfg.getAnnotation();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano if (annotation != null) {
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano float r = annotation.getWidestRevision() * 1.15f;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano float a = annotation.getWidestAuthor() * 1.15f;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano cfg.addHeaderData("<style type=\"text/css\">"
998dc19ad6f62fcc7722e596c8cbaa488a5a5e93dlezcano + ".blame .r { width: " + (r == 0 ? 6 : r) + "ex; } "
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano + ".blame .a { width: " + (a == 0 ? 6 : a) + "ex; } "
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano + "</style>");
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano }
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano}
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano%><%@include
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcanofile="mast.jsp"
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
10fba81b9d0221b8e47aa1e0b43236413b7d28dfMichel Normand%><%
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano/* ---------------------- list.jsp start --------------------- */
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano{
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano cfg = PageConfig.get(request);
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano String rev = cfg.getRequestedRevision();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano File resourceFile = cfg.getResourceFile();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano String path = cfg.getPath();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano String basename = resourceFile.getName();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano String rawPath = request.getContextPath() + Prefix.RAW_P + path;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano Reader r = null;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano if (cfg.isDir()) {
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano // valid resource is requested
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano // mast.jsp assures, that resourceFile is valid and not /
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano // see cfg.resourceNotAvailable()
f79d43bbe70a01454049b77d6f15f6369744959eStéphane Graber Project activeProject = Project.getProject(resourceFile);
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano String cookieValue = cfg.getRequestedProjectsAsString();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano if (activeProject != null) {
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano Set<String> projects = cfg.getRequestedProjects();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano if (!projects.contains(activeProject.getDescription())) {
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano projects.add(activeProject.getDescription());
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano // update cookie
99e4008cad9e959b683c6f48411fcf15a92be3b5Michel Normand cookieValue = cookieValue.length() == 0
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano ? activeProject.getDescription()
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano : activeProject.getDescription() + '/' + cookieValue;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano Cookie cookie = new Cookie("OpenGrokProject", cookieValue);
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano // TODO hmmm, projects.jspf doesn't set a path
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano cookie.setPath(request.getContextPath() + '/');
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano response.addCookie(cookie);
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano }
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano }
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano // directory listing
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano List<String> files = cfg.getResourceFileList();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano if (!files.isEmpty()) {
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano long now = System.currentTimeMillis();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano ArrayList<String> readMes = new ArrayList<String>();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano int offset = -1;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano EftarFileReader.FNode parentFNode = null;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano EftarFileReader desc = cfg.getEftarReader();
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano if (desc != null) {
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano parentFNode = desc.getNode(path);
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano if (parentFNode != null) {
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano offset = parentFNode.childOffset;
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano }
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano }
d823d5b966f49d975a09a8512d084389d6d7ffc7dlezcano%><table id="dirlist">
<thead>
<tr>
<th/>
<th>Name</th>
<th>Date</th>
<th>Size</th><%
if (offset > 0) {
%> <th><tt>Description</tt></th><%
}
%>
</tr>
</thead>
<tbody><%
IgnoredNames ignoredNames = cfg.getIgnoredNames();
Format dateFormatter = new SimpleDateFormat("dd-MMM-yyyy");
// upper directory
if (path.length() != 0) {
long lastm = resourceFile.getParentFile().lastModified();
%>
<tr>
<td><p class="r"/></td>
<td><b><a href="..">..</a></b></td>
<td><%= now-lastm < 86400000 ? "Today" : dateFormatter.format(lastm) %></td>
<td><%= Util.readableSize(resourceFile.getParentFile().length()) %></td><%
if (offset > 0) { %>
<td/><%
} %>
</tr><%
}
// entries
for (String file : files) {
if (ignoredNames.ignore(file)) {
continue;
}
File child = new File(resourceFile, file);
if ((file.startsWith("README") || file.endsWith("README")
|| file.startsWith("readme")) && child.isFile())
{
readMes.add(file);
}
boolean isDir = child.isDirectory();
long lastm = child.lastModified();
%>
<tr>
<td><p class="<%= isDir ? 'r' : 'p' %>"/></td>
<td><a href="<%= Util.URIEncodePath(file) %>"><%= isDir ? "<b>" + file + "</b>" : file %></a></td>
<td><%= now-lastm < 86400000 ? "Today" : dateFormatter.format(lastm) %></td>
<td><%= Util.readableSize(child.length()) %></td><%
if (offset > 0) {
String briefDesc = desc.getChildTag(parentFNode, file); %>
<td><%= briefDesc == null ? "" : briefDesc %></td><%
} %>
</tr><%
}
%>
</tbody>
</table>
<div id="src"><%
if (readMes.size() != 0) {
ArrayList<String> readMesImg = null;
File[] xrefs = cfg.findDataFiles(readMes);
for (int i=0; i < xrefs.length; i++) {
File readme = xrefs[i];
if (readme == null) { // no xref avail or outdated or img
readme = new File(resourceFile, readMes.get(i));
Genre g = AnalyzerGuru.getGenre(readme.getName());
if (g == null) {
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(readme));
g = AnalyzerGuru.getGenre(in);
} catch (Exception e) {
// ignore
} finally {
IOUtils.close(in);
}
}
if (g == Genre.IMAGE) {
if (readMesImg == null) {
readMesImg = new ArrayList<String>(3);
}
readMesImg.add(readme.getName());
continue;
} else if (g != Genre.HTML && g != Genre.PLAIN) {
continue;
}
// else dump
}
%>
<h3><%= readMes.get(i) %></h3>
<pre><%
Util.dump(out,readme, readme.getName().endsWith(".gz"));
%>
</pre><%
}
if (readMesImg != null) {
for (String image : readMesImg) {
%>
<h3><%= image %></h3>
<img src="<%= Util.URIEncodePath(rawPath + '/' + image) %>"/><%
}
}
%>
}
</div><%
}
// end of directory listing
} else if (rev.length() != 0) {
// requesting a previous revision
FileAnalyzerFactory a = AnalyzerGuru.find(basename);
Genre g = AnalyzerGuru.getGenre(a);
String error = null;
if (g == Genre.PLAIN|| g == Genre.HTML || g == null) {
InputStream in = null;
try {
in = HistoryGuru.getInstance()
.getRevision(resourceFile.getParent(), basename, rev.substring(2));
} catch (Exception e) {
// fall through to error message
error = e.getMessage();
}
if (in != null) {
try {
if (g == null) {
a = AnalyzerGuru.find(in);
g = AnalyzerGuru.getGenre(a);
}
if (g == Genre.DATA || g == Genre.XREFABLE
|| g == null)
{
%>
<div id="src">
Binary file [Click <a href="<%= Util.URIEncodePath(rawPath) %>?<%= rev
%>">here</a> to download]
</div><%
} else {
%>
<div id="src">
<span class="pagetitle"><%= basename %> revision <%=
rev.substring(2) %></span>
<pre><%
if (g == Genre.PLAIN) {
// We don't have any way to get definitions
// for old revisions currently.
Definitions defs = null;
Annotation annotation = cfg.getAnnotation();
//not needed yet
//annotation.writeTooltipMap(out);
r = new InputStreamReader(in);
AnalyzerGuru.writeXref(a, r, out, defs,
annotation, Project.getProject(resourceFile));
} else if (g == Genre.IMAGE) {
%></pre>
<img src="<%= Util.URIEncodePath(rawPath) %>?<%= rev %>"/>
<pre><%
} else if (g == Genre.HTML) {
r = new InputStreamReader(in);
Util.dump(out, r);
} else {
%> Click <a href="<%= Util.URIEncodePath(rawPath) %>?<%=
rev %>">download <%= basename %></a><%
}
}
} catch (IOException e) {
error = e.getMessage();
} finally {
if (r != null) {
try { r.close(); in = null;}
catch (Exception e) { /* ignore */ }
}
if (in != null) {
try { in.close(); }
catch (Exception e) { /* ignore */ }
}
}
%></pre>
</div><%
} else {
%>
<h3 class="error">Error reading file</h3><%
if (error != null) {
%>
<p class="error"><%= error %></p><%
}
}
} else if (g == Genre.IMAGE) {
%>
<div id="src">
<img src="<%= Util.URIEncodePath(rawPath) %>?<%= rev %>"/>
</div><%
} else {
%>
<div id="src">
Binary file [Click <a href="<%= Util.URIEncodePath(rawPath) %>?<%= rev
%>">here</a> to download]
</div><%
}
// end of previous revision list
} else {
// requesting cross referenced file
File xrefFile = null;
if (!cfg.annotate()) {
xrefFile = cfg.findDataFile();
}
if (xrefFile != null) {
%>
<div id="src">
<pre><%
Util.dump(out, xrefFile, xrefFile.getName().endsWith(".gz"));
%></pre>
</div><%
} else {
// annotate
BufferedInputStream bin =
new BufferedInputStream(new FileInputStream(resourceFile));
try {
FileAnalyzerFactory a = AnalyzerGuru.find(basename);
Genre g = AnalyzerGuru.getGenre(a);
if (g == null) {
a = AnalyzerGuru.find(bin);
g = AnalyzerGuru.getGenre(a);
}
if (g == Genre.IMAGE) {
%>
<div id="src">
<img src="<%= Util.URIEncodePath(rawPath) %>"/>
</div><%
} else if ( g == Genre.HTML) {
r = new InputStreamReader(bin);
Util.dump(out, r);
} else if (g == Genre.PLAIN) {
%>
<div id="src">
<pre><%
// We're generating xref for the latest revision, so we can
// find the definitions in the index.
Definitions defs = IndexDatabase.getDefinitions(resourceFile);
Annotation annotation = cfg.getAnnotation();
r = new InputStreamReader(bin);
AnalyzerGuru.writeXref(a, r, out, defs, annotation,
Project.getProject(resourceFile));
%></pre>
</div><%
} else {
%>
Click <a href="<%= Util.URIEncodePath(rawPath) %>">download <%= basename %></a><%
}
} finally {
if (r != null) {
try { r.close(); bin = null; }
catch (Exception e) { /* ignore */ }
}
if (bin != null) {
try { bin.close(); }
catch (Exception e) { /* ignore */ }
}
}
}
}
}
/* ---------------------- list.jsp end --------------------- */
%><%@
include file="foot.jspf"
%>