blob: 52b34ad36c8d9f6b2fc46ad5fa45a9588927a3f1 [file] [log] [blame]
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.googlesource.gerrit.plugins.branchnetwork.canvas;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Repository;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.httpd.GitWebConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.project.ProjectControl.Factory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class GitGraphServlet extends HttpServlet {
private static final long serialVersionUID = -822406714154950673L;
private static final int PROGRESS_BAR_WIDTH = 208;
private static final int PROGRESS_BAR_HEIGHT = 13;
private String canonicalPath;
private Factory projectControl;
private GitRepositoryManager repoManager;
private GitWebConfig gitWebConfig;
@Inject
public GitGraphServlet(@PluginName String pluginName,
@GerritServerConfig final Config gerritConfig, GitWebConfig gitWebConfig,
final ProjectControl.Factory projectControl,
final GitRepositoryManager repoManager)
throws MalformedURLException {
URL url =
new URL(gerritConfig.getString("gerrit", null, "canonicalWebUrl"));
String pathPrefix = "/";
if(url != null && url.getPath() != null) {
pathPrefix = url.getPath();
if(!pathPrefix.endsWith("/")) {
pathPrefix += "/";
}
}
this.canonicalPath =
String.format("%splugins/%s/", pathPrefix, pluginName);
this.projectControl = projectControl;
this.repoManager = repoManager;
this.gitWebConfig = gitWebConfig;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
try {
String repoName = req.getParameter("p");
if (repoName == null) {
resp.sendRedirect("Documentation/index.html");
return;
}
boolean naked = req.getParameter("naked") != null;
int width = getParam(req, "width", 920);
int height = getParam(req, "height", 600);
if (repoName.endsWith(".git")) {
repoName = repoName.substring(0, repoName.length() - 4);
}
final Project.NameKey nameKey = new Project.NameKey(repoName);
try {
projectControl.validateFor(nameKey);
} catch (NoSuchProjectException e) {
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
Repository repo = null;
try {
repo = repoManager.openRepository(nameKey);
} catch (RepositoryNotFoundException e) {
getServletContext().log("Cannot open repository", e);
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
} finally {
if (repo != null) {
repo.close();
}
}
String networkMetaUrl =
String.format("%1$snetwork_meta/%2$s/", canonicalPath, repoName);
String networkDataChunkUrl =
String.format("%1$snetwork_data_chunk/%2$s/?nethash=", canonicalPath,
repoName);
String commitUrlPattern =
gitWebConfig.getUrl()
+ gitWebConfig.getGitWebType().getRevision()
.replaceAll("\\$\\{project\\}", repoName)
.replaceAll("\\$\\{commit\\}", "{2}");
String projectPattern =
gitWebConfig.getUrl()
+ gitWebConfig.getGitWebType().getProject()
.replaceAll("\\$\\{project\\}", repoName);
commitUrlPattern =
(commitUrlPattern.startsWith("/") ? commitUrlPattern : "/"
+ commitUrlPattern);
projectPattern =
(projectPattern.startsWith("/") ? projectPattern : "/"
+ projectPattern);
String header =
"<html>\n" + "<head>\n" + "<style type=\"text/css\">\n"
+ "div#progress\n" + "{\n" + "position:absolute;\n" + "left:"
+ (width - PROGRESS_BAR_WIDTH) / 2
+ "px;\n"
+ "top:"
+ (height - PROGRESS_BAR_HEIGHT) / 2
+ "px;\n"
+ "z-index:-1;\n"
+ "}\n"
+ "div#graph\n"
+ "{\n"
+ "position:absolute;\n"
+ "left:0px;\n"
+ "top:0px;\n"
+ "z-index:0;\n"
+ "}\n"
+ "</style>\n"
+ "</head>\n"
+ "<body>\n"
+ "<div id=\"progress\" >"
+ "<img src=\""
+ canonicalPath
+ "static/progress_bar.gif\" />"
+ "</div>"
+ "<div id=\"graph\">";
String javaScript =
"<script type=\"text/javascript\" src=\"" + canonicalPath
+ "static/jquery-1.4.2.min.js\"></script>\n"
+ "<script type=\"text/javascript\" src=\"" + canonicalPath
+ "static/network.js\"></script>\n"
+ "<script type=\"text/javascript\">"
+ "$(document).ready( function() {\n"
+ "new NetworkCanvas('network-canvas', " + width + ", " + height
+ " , null, null, null,\n" + "'" + commitUrlPattern + "',\n"
+ "'" + projectPattern + "',\n" + "'" + networkMetaUrl + "',\n"
+ "'" + networkDataChunkUrl + "');\n" + "});\n" + "</script>\n";
String canvas =
"<canvas id=\"network-canvas\" width=\"" + width + "\" height=\""
+ height + "\" style=\"cursor: default; \"></canvas>";
String footer = "</div>" + "</body>\n" + "</html>\n";
out.println(naked ? (javaScript + canvas)
: (header + javaScript + canvas + footer));
} finally {
out.close();
}
}
private int getParam(HttpServletRequest req, String name, int defValue) {
String value = req.getParameter(name);
if (value != null) {
return Integer.parseInt(value);
} else {
return defValue;
}
}
}