azkaban-uncached

Details

diff --git a/src/java/azkaban/utils/LogSummary.java b/src/java/azkaban/utils/LogSummary.java
index 181442f..9d67e53 100644
--- a/src/java/azkaban/utils/LogSummary.java
+++ b/src/java/azkaban/utils/LogSummary.java
@@ -3,9 +3,16 @@ package azkaban.utils;
 import azkaban.utils.FileIOUtils.LogData;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class LogSummary {
+	private String command = null;
+	private List<String> classpath = new ArrayList<String>();
+	private List<String> params = new ArrayList<String>();
+	
 	private String[] statTableHeaders = null;
 	private List<String[]> statTableData = new ArrayList<String[]>();
 	
@@ -22,10 +29,39 @@ public class LogSummary {
 		data = data.replaceAll(".*? - ", "");
 		String[] lines = data.split("\n");
 		
+		parseCommand(lines);
 		parseJobSummary(lines);
 		parseJobStats(lines);
 	}
 
+	private void parseCommand(String[] lines) {
+		int commandStartIndex = -1;
+		for (int i = 0; i < lines.length; i++) {
+			if (lines[i].startsWith("Command: ")) {
+				commandStartIndex = i;
+				break;
+			}
+		}
+		
+		if (commandStartIndex != -1) {
+			command = lines[commandStartIndex].substring(9);
+			
+			// Parse classpath
+			Pattern p = Pattern.compile("(?:-cp|-classpath)\\s+(\\S+)");
+			Matcher m = p.matcher(command);
+			if (m.find()) {
+				classpath = Arrays.asList(m.group(1).split(":"));
+			}
+			
+			// Parse Pig params
+			p = Pattern.compile("-param\\s+(\\S+)");
+			m = p.matcher(command);
+			while (m.find()) {
+				params.add(m.group(1));
+			}
+		}
+	}
+	
 	private void parseJobSummary(String[] lines) {
 		int jobSummaryStartIndex = -1;
 		for (int i = 0; i < lines.length; i++) {
@@ -85,4 +121,16 @@ public class LogSummary {
 	public List<String[]> getSummaryTableData() {
 		return summaryTableData;
 	}
+	
+	public String getCommand() {
+		return command;
+	}
+
+	public List<String> getClasspath() {
+		return classpath;
+	}
+
+	public List<String> getParams() {
+		return params;
+	}
 }
diff --git a/src/java/azkaban/webapp/servlet/ExecutorServlet.java b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
index bfceaf7..75950af 100644
--- a/src/java/azkaban/webapp/servlet/ExecutorServlet.java
+++ b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
@@ -517,6 +517,9 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
 			LogData data = executorManager.getExecutionJobLog(exFlow, jobId, 0, Integer.MAX_VALUE, attempt);
 			
 			LogSummary summary = new LogSummary(data);
+			ret.put("command", summary.getCommand());
+			ret.put("classpath", summary.getClasspath());
+			ret.put("params", summary.getParams());
 			ret.put("summaryTableHeaders", summary.getSummaryTableHeaders());
 			ret.put("summaryTableData", summary.getSummaryTableData());
 			ret.put("statTableHeaders", summary.getStatTableHeaders());
diff --git a/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm b/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
index ce11145..b5a2a29 100644
--- a/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/jobsummarypage.vm
@@ -76,6 +76,10 @@
 
 			<div id="jobSummaryView" class="summaryView">
 				<br/>
+				<table id="commandTable">
+				</table>
+				
+				<br/>
 				<p>Job Summary
 					<table>
 						<thead id="summaryHeader">
@@ -86,7 +90,6 @@
 				</p>
 				
 				<br/>
-				
 				<p>Job Stats
 					<table>
 						<thead id="statsHeader">
diff --git a/src/web/js/azkaban.jobsummary.view.js b/src/web/js/azkaban.jobsummary.view.js
index 99a832e..9959502 100644
--- a/src/web/js/azkaban.jobsummary.view.js
+++ b/src/web/js/azkaban.jobsummary.view.js
@@ -45,13 +45,60 @@ azkaban.JobSummaryView = Backbone.View.extend({
 					console.log(data.error);
 				}
 				else {
-					self.renderTable(data.summaryTableHeaders, data.summaryTableData, "summary");
-					self.renderTable(data.statTableHeaders, data.statTableData, "stats");
+					self.renderCommandTable(data.command, data.classpath, data.params);
+					self.renderJobTable(data.summaryTableHeaders, data.summaryTableData, "summary");
+					self.renderJobTable(data.statTableHeaders, data.statTableData, "stats");
 				}
 			}
 		});
 	},
-	renderTable: function(headers, data, prefix) {
+	renderCommandTable: function(command, classpath, params) {
+		if (command) {
+			var commandTable = $("#commandTable");
+			var i;
+			
+			// Add row for command
+			var tr = document.createElement("tr");
+			var td = document.createElement("td");
+			$(td).append("<b>Command</b>");
+			$(tr).append(td);
+			td = document.createElement("td");
+			$(td).text(command);
+			$(tr).append(td);
+			commandTable.append(tr);
+			
+			// Add row for classpath
+			if (classpath && classpath.length > 0) {
+				tr = document.createElement("tr");
+				td = document.createElement("td");
+				$(td).append("<b>Classpath</b>");
+				$(tr).append(td);
+				td = document.createElement("td");
+				$(td).append(classpath[0]);
+				for (i = 1; i < classpath.length; i++) {
+					$(td).append("<br/>" + classpath[i]);
+				}
+				$(tr).append(td);
+				commandTable.append(tr);
+			}
+			
+			// Add row for params
+			if (params && params.length > 0) {
+				tr = document.createElement("tr");
+				td = document.createElement("td");
+				$(td).append("<b>Params</b>");
+				$(tr).append(td);
+				td = document.createElement("td");
+				$(td).append(params[0]);
+				for (i = 1; i < params.length; i++) {
+					$(td).append("<br/>" + params[i]);
+				}
+				$(tr).append(td);
+				commandTable.append(tr);
+			}
+		}
+	},
+	renderJobTable: function(headers, data, prefix) {
 		if (headers) {
 			// Add table headers
 			var header = $("#" + prefix + "Header");