mast.jsp revision 958ccc55e275549e16df57f5ba425dce5d1c2b7b
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens<%--
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensCDDL HEADER START
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensThe contents of this file are subject to the terms of the
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensCommon Development and Distribution License (the "License").
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensYou may not use this file except in compliance with the License.
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensSee LICENSE.txt included in this distribution for the specific
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrenslanguage governing permissions and limitations under the License.
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensWhen distributing Covered Code, include this CDDL HEADER in each
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensfile and include the License file at LICENSE.txt.
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensIf applicable, add the following below this CDDL HEADER, with the
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensfields enclosed by brackets "[]" replaced with your own identifying
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensinformation: Portions Copyright [yyyy] [name of copyright owner]
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensCDDL HEADER END
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensCopyright 2009 Sun Microsystems, Inc. All rights reserved.
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensUse is subject to license terms.
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens--%><%@ page import = "javax.servlet.*,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens java.lang.*,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens javax.servlet.http.*,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens java.util.*,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens java.io.*,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens org.opensolaris.opengrok.index.*,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens org.opensolaris.opengrok.configuration.*,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens org.opensolaris.opengrok.web.EftarFileReader,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens org.opensolaris.opengrok.web.Util,
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens org.opensolaris.opengrok.history.HistoryGuru
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens "
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens %><%@ page session="false" %><%@ page errorPage="error.jsp"%><%
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensString context = request.getContextPath();
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensString servlet = request.getServletPath();
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensString reqURI = request.getRequestURI();
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensString path = request.getPathInfo();
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensif (path == null) path = "";
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensRuntimeEnvironment environment = RuntimeEnvironment.getInstance();
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensenvironment.setUrlPrefix(context + "/s?");
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensenvironment.register();
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensString rawSource = environment.getSourceRootPath();
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensString resourcePath = rawSource + path;
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensFile resourceFile = new File(resourcePath);
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensresourcePath = resourceFile.getAbsolutePath();
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensboolean valid = true;
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensboolean noHistory = true;
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensboolean noAnnotation = true;
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrensboolean annotate = false;
148434217c040ea38dc844384f6ba68d9b325906Matthew AhrensString basename = resourceFile.getName();
boolean isDir = false;
EftarFileReader ef = null;
String parent = null;
String parentBasename = resourceFile.getParentFile().getName();
IgnoredNames ignoredNames = environment.getIgnoredNames();
String uriEncodedName = Util.URIEncodePath(path);
if(resourcePath.length() < rawSource.length()
|| ignoredNames.ignore(path)
|| ignoredNames.ignore(parentBasename)
|| !resourcePath.startsWith(rawSource)) {
valid = false;
response.sendError(404);
return;
} else if (!resourceFile.canRead() && resourcePath.startsWith(rawSource)) {
String newPath = rawSource + "/on/" + path; //TODO do we still use "on" ???
File newFile = new File(newPath);
if(newFile.canRead()) {
if(newFile.isDirectory() && servlet.startsWith("/xref") && !path.endsWith("/")) {
response.sendRedirect(context + servlet + "/on" + path + "/");
} else {
response.sendRedirect(context + servlet + "/on" + path);
}
}
valid = false;
response.sendError(404);
return;
} else {
valid = true;
path = resourcePath.substring(rawSource.length());
if ("".equals(path)) {
path = "/";
}
if (File.separatorChar == '\\') {
path = path.replace('\\','/');
}
isDir = resourceFile.isDirectory();
if (isDir && !servlet.startsWith("/xref") && !servlet.startsWith("/hist")) { //if it is an existing directory perhaps people wanted directory xref
if(!reqURI.endsWith("/")) {
response.sendRedirect(context + "/xref" + path + "/");
} else {
response.sendRedirect(context + "/xref" + path);
}
} if (isDir && !reqURI.endsWith("/")) {
response.sendRedirect(context + servlet + path +"/");
} else {
long flast = resourceFile.lastModified();
String dtag = "";
if (request.getDateHeader("If-Modified-Since") >= flast ) {
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
valid = false;
} else {
response.setDateHeader("Last-Modified", flast);
int lastSlash = path.lastIndexOf('/');
parent = (lastSlash != -1) ? path.substring(0, lastSlash) : "";
int pLastSlash = parent.lastIndexOf('/');
parentBasename = pLastSlash != -1 ? parent.substring(pLastSlash+1) : parent;
noHistory = !HistoryGuru.getInstance().hasHistory(resourceFile);
noAnnotation = isDir ||
!HistoryGuru.getInstance().hasAnnotation(resourceFile);
annotate = !noAnnotation &&
Boolean.parseBoolean(request.getParameter("a"));
try{
ef = new EftarFileReader(environment.getDataRootPath() + "/index/dtags.eftar");
dtag = ef.get(path);
if(servlet.startsWith("/xr")) {
} else {
if(ef != null) {
try {
ef.close();
} catch (IOException e) {
} finally {
ef = null;
}
}
}
} catch (Exception e) {
dtag = "";
}
String pageTitle="Cross Reference: " + path;
%><%@ include file="httpheader.jspf" %><%//below style is for the fancy always on top search bar%>
<body style="overflow:hidden;">
<script type="text/javascript" src="<%=context%>/jquery-1.4.2.min.js"></script>
<script type="text/javascript">/* <![CDATA[ */
$().ready(function() {
if (!window.location.hash) {$('#content').focus();}
} );
/* ]]> */</script>
<% if (annotate) { %>
<script type="text/javascript" src="<%=context%>/jquery.tooltip-1.3.pack.js"></script>
<script type="text/javascript">/* <![CDATA[ */
function toggle_annotations() {
$("span").each(function() {
if (this.className == 'blame') {
this.className = 'blame-hidden';
} else if (this.className == 'blame-hidden') {
this.className = 'blame';
}
}
);
}
$().ready(function() {
$('a[id=r]').tooltip({
left: 5,
showURL: false
});
} );
/* ]]> */</script>
<% } %>
<div id="page">
<div id="whole_header" >
<form action="<%=context%>/search">
<div id="header"><%@ include file="pageheader.jspf" %>
<div id="pagetitle"><b id="filename">Cross Reference: <%=basename%></b><% if (dtag!=null & dtag!="") { %><br/><%=dtag%><% } %></div>
</div>
<div id="Masthead"><tt><a href="<%=context%>/xref/">xref</a>: <%=org.opensolaris.opengrok.web.Util.breadcrumbPath(context + "/xref", path)%></tt></div>
<div id="bar"><a href="<%=context%>" id="home">Home</a> |
<%
if (noHistory || servlet.startsWith("/hi")) {
%> <span class="c" id="history">History</span><%
} else {
%><a id="history" href="<%=context%>/history<%=path%>">History</a><%
}
if (noAnnotation) {
%> | <span class="c" id="annotate">Annotate</span><%
} else {
String rev = request.getParameter("r");
if (rev == null) {
rev = "";
} else if (rev.length() > 0) {
rev = "&r=" + rev;
}
if (Boolean.parseBoolean(request.getParameter("a"))) {
%> | <span id="toggle-annotate-by-javascript" style="display: none">
<a href="#" onclick="javascript:toggle_annotations(); return false;" title="Show or hide line annotation(commit revisions,authors)." >Annotate</a>
</span>
<span id="toggle-annotate">
<a href="<%=context%>/xref<%=path%><%
if (rev.length() > 0) {
%>?<%=rev%><%
} %>">Annotate</a></span>
<script type="text/javascript">
<!--
var toggle_js = document.getElementById('toggle-annotate-by-javascript');
var toggle_ss = document.getElementById('toggle-annotate');
toggle_js.style.display = 'inline';
toggle_ss.style.display = 'none';
// -->
</script> <%
} else {
%> | <a href="<%=context%>/xref<%=path%>?a=true<%=rev%>">Annotate</a><%
}
}
if (!isDir) {
if ( servlet.startsWith("/xr") ) {
%> | <a href="#" onclick="javascript:lntoggle();return false;" title="Show or hide line numbers (might be slower if file has more than 10 000 lines).">Line #</a><%
}
String rev = request.getParameter("r");
if (rev == null || rev.equals("")) {
%> | <a id="download" href="<%=context%>/raw<%=path%>">Download</a><%
} else {
%> | <a id="download" href="<%=context%>/raw<%=path%>?r=<%=rev%>">Download</a><%
}
}
Project proj = Project.getProject(resourceFile);
if (proj != null || !environment.hasProjects()) {
%> | <input id="search" name="q" class="q"/>
<input type="submit" value="Search" class="submit"/>
<%
if (proj != null) {
%><input type="hidden" name="project" value="<%=proj.getDescription()%>"/><%
}
if(isDir) {
if(path.length() > 0) {
%><input type="checkbox" name="path" value="<%=path%>"/> only in <b><%=path%></b><%
}
} else {
%><input type="checkbox" name="path" value="<%=parent%>"/> only in <b><%=parentBasename%></b><%
}
}
%>
</div></form></div>
<div id="content"><%
} // date check
} // not a directory redirect
}
%>