package com.perforce.p4http.demo.timeline;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mortbay.util.ajax.JSON;
/**
* Main servlet for handling depot timeline requests
*/
public class DepotTimelineServlet extends HttpServlet {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;
private static final String P4_PATH = "p4";
private static final String P4_SERVER = "public.perforce.com:1666";
private static final String P4_USER = "ksawicki";
private static final String WEB_LINK_START = "http://public.perforce.com:8080/@md=d&cd=//&c=Cf0@/";
private static final String WEB_LINK_END = "?ac=10";
private static final List<String> BASE_COMMAND = Arrays.asList(P4_PATH,
"-p", P4_SERVER, "-u", P4_USER);
/**
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
handleFiles(req, resp);
}
/**
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
private void handleFiles(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
Map<Object, Object> responseMap = new HashMap<Object, Object>();
String path = request.getParameter("path");
if (path != null) {
List<String> commands = new ArrayList<String>(BASE_COMMAND);
commands.add("changes");
commands.add(path);
ProcessBuilder builder = new ProcessBuilder(commands);
Process process = builder.start();
List<Object> events = new ArrayList<Object>();
responseMap.put("events", events);
List<String> changes = new ArrayList<String>();
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line = reader.readLine();
while (line != null) {
line = line.trim();
if (line.startsWith("Change ")) {
line = line.substring(7);
line = line.substring(0, line.indexOf(' '));
changes.add(line.trim());
}
line = reader.readLine();
}
reader.close();
process.waitFor();
List<String> describeCommands = new ArrayList<String>(
BASE_COMMAND);
describeCommands.add("describe");
describeCommands.add("-s");
describeCommands.addAll(changes);
builder = new ProcessBuilder(describeCommands);
process = builder.start();
reader = new BufferedReader(new InputStreamReader(process
.getInputStream()));
line = reader.readLine();
StringBuffer description = null;
Map<Object, Object> event = null;
while (line != null) {
if (line.startsWith("Change ")) {
description = new StringBuffer();
line = line.substring(7);
String user = line.substring(line.indexOf("by ") + 3);
user = user.substring(0, user.indexOf('@'));
String change = line.substring(0, line.indexOf(' '));
String date = line
.substring(line.lastIndexOf("on") + 2);
date = date.trim();
event = new HashMap<Object, Object>();
event.put("start", date);
event.put("title", change + " by " + user);
event.put("description", change);
event.put("link", WEB_LINK_START + change
+ WEB_LINK_END);
events.add(event);
} else if ((line.startsWith("Jobs fixed ...") || line
.startsWith("Affected files ..."))
&& (event != null && description != null)) {
event.put("description", description);
description = null;
} else if (description != null) {
description.append(line + " ");
}
line = reader.readLine();
}
reader.close();
process.waitFor();
} catch (InterruptedException e) {
}
}
String json = JSON.toString(responseMap);
response.getWriter().print(json);
response.setStatus(200);
response.setContentLength(json.length());
response.setContentType("application/json");
}
}