azkaban-aplcache

Add json expansion.

7/3/2012 2:57:36 AM

Details

diff --git a/src/java/azkaban/flow/Edge.java b/src/java/azkaban/flow/Edge.java
index 2c69d82..3ac653b 100644
--- a/src/java/azkaban/flow/Edge.java
+++ b/src/java/azkaban/flow/Edge.java
@@ -73,6 +73,7 @@ public class Edge {
 	}
 	
 	public static Edge fromObject(Object obj) {
+		@SuppressWarnings("unchecked")
 		HashMap<String, Object> edgeObj = (HashMap<String,Object>)obj;
 		
 		String source = (String)edgeObj.get("source");
diff --git a/src/java/azkaban/flow/Flow.java b/src/java/azkaban/flow/Flow.java
index f85b2d6..c0d2fba 100644
--- a/src/java/azkaban/flow/Flow.java
+++ b/src/java/azkaban/flow/Flow.java
@@ -8,10 +8,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import azkaban.project.ProjectManager;
-import azkaban.project.ResourceLoader;
-import azkaban.utils.Props;
-
 public class Flow {
 	public enum State {
 		READY, RUNNING, RUNNING_WITH_FAILURE, FAILED, SUCCEEDED
@@ -82,6 +78,14 @@ public class Flow {
 		return endNodes;
 	}
 	
+	public Set<Edge> getInEdges(String id) {
+		return inEdges.get(id);
+	}
+	
+	public Set<Edge> getOutEdges(String id) {
+		return outEdges.get(id);
+	}
+	
 	public void addAllNodes(Collection<Node> nodes) {
 		for (Node node: nodes) {
 			addNode(node);
diff --git a/src/java/azkaban/flow/Node.java b/src/java/azkaban/flow/Node.java
index 6819720..97320e4 100644
--- a/src/java/azkaban/flow/Node.java
+++ b/src/java/azkaban/flow/Node.java
@@ -4,10 +4,6 @@ import java.awt.geom.Point2D;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.net.ssl.SSLEngineResult.Status;
-
-import azkaban.utils.Props;
-
 public class Node {
 	public enum State {
 		FAILED, SUCCEEDED, RUNNING, WAITING, IGNORED
diff --git a/src/java/azkaban/project/Project.java b/src/java/azkaban/project/Project.java
index ee4e9f9..316b11b 100644
--- a/src/java/azkaban/project/Project.java
+++ b/src/java/azkaban/project/Project.java
@@ -1,10 +1,7 @@
 package azkaban.project;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 
diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index 890c0e3..1c964ff 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -7,6 +7,8 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Writer;
 import java.security.AccessControlException;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -26,7 +28,9 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.log4j.Logger;
 
+import azkaban.flow.Edge;
 import azkaban.flow.Flow;
+import azkaban.flow.Node;
 import azkaban.project.Project;
 import azkaban.project.ProjectManager;
 import azkaban.project.ProjectManagerException;
@@ -40,6 +44,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 	private static final long serialVersionUID = 1;
 	private static final Logger logger = Logger.getLogger(ProjectManagerServlet.class);
 	private static final int DEFAULT_UPLOAD_DISK_SPOOL_SIZE = 20 * 1024 * 1024;
+	private static final NodeLevelComparator NODE_LEVEL_COMPARATOR = new NodeLevelComparator();
 	
 	private ProjectManager manager;
 	private MultipartParser multipartParser;
@@ -62,7 +67,10 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 	@Override
 	protected void handleGet(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
 		if ( hasParam(req, "project") ) {
-			if (hasParam(req, "flow")) {
+			if (hasParam(req, "json")) {
+				handleJSONAction(req, resp, session);
+			}
+			else if (hasParam(req, "flow")) {
 				handleFlowPage(req, resp, session);
 			}
 			else {
@@ -96,6 +104,63 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 		}
 	}
 
+	private void handleJSONAction(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
+		String projectName = getParam(req, "project");
+		User user = session.getUser();
+		
+		HashMap<String, Object> ret = new HashMap<String, Object>();
+		ret.put("project", projectName);
+		
+		Project project = null;
+		try {
+			project = manager.getProject(projectName, user);
+		} catch (Exception e) {
+			ret.put("error", e.getMessage());
+			this.writeJSON(resp, ret);
+			return;
+		}
+
+		String jsonName = getParam(req, "json");
+		if (jsonName.equals("expandflow")) {
+			String flowId = getParam(req, "flow");
+			Flow flow = project.getFlow(flowId);
+
+			ArrayList<Node> flowNodes = new ArrayList<Node>(flow.getNodes());
+			Collections.sort(flowNodes, NODE_LEVEL_COMPARATOR);
+
+			ArrayList<Object> nodeList = new ArrayList<Object>();
+			for (Node node: flowNodes) {
+				HashMap<String, Object> nodeObj = new HashMap<String, Object>();
+				nodeObj.put("id", node.getId());
+				
+				ArrayList<String> dependencies = new ArrayList<String>();
+				Collection<Edge> collection = flow.getInEdges(node.getId());
+				if (collection != null) {
+					for (Edge edge: collection) {
+						dependencies.add(edge.getSourceId());
+					}
+				}
+				
+				ArrayList<String> dependents = new ArrayList<String>();
+				collection = flow.getOutEdges(node.getId());
+				if (collection != null) {
+					for (Edge edge: collection) {
+						dependents.add(edge.getTargetId());
+					}
+				}
+				
+				nodeObj.put("dependencies", dependencies);
+				nodeObj.put("dependents", dependents);
+				nodeObj.put("level", node.getLevel());
+				nodeList.add(nodeObj);
+			}
+			
+			ret.put("nodes", nodeList);
+		}
+		
+		this.writeJSON(resp, ret);
+	}
+	
 	private void handleFlowPage(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException {
 		Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/flowpage.vm");
 		String projectName = getParam(req, "project");
@@ -238,4 +303,10 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 		return unzipped;
 	}
 
+	private static class NodeLevelComparator implements Comparator<Node> {
+		@Override
+		public int compare(Node node1, Node node2) {
+			return node1.getLevel() - node2.getLevel();
+		}
+	}
 }
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
index 2f945a2..3b2d236 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
@@ -16,6 +16,8 @@
 			var timezone = "${timezone}";
 			var errorMessage = "${error_message}";
 			var successMessage = "${success_message}";
+			
+			var projectId = "$project.name";
 		</script>
 	</head>
 	<body>
@@ -71,7 +73,7 @@
 #foreach($flow in $flows)
 						<tr class="row">
 							<td class="tb-name">
-								<div class="jobfolder expand" onclick="expandFlow(this)" id="${flow.id}">
+								<div class="jobfolder expand" id="${flow.id}">
 									<span class="state-icon"></span>
 									<a href="${context}/manager?flow=${flow.id}">${flow.id}</a>
 								</div>
diff --git a/src/web/js/azkaban.project.view.js b/src/web/js/azkaban.project.view.js
index 89c6bfd..24b008c 100644
--- a/src/web/js/azkaban.project.view.js
+++ b/src/web/js/azkaban.project.view.js
@@ -37,7 +37,33 @@ azkaban.UploadProjectView= Backbone.View.extend({
     $("#errorMsg").hide();
   },
   handleCreateProject : function(evt) {
-	$("#upload-form").submit();
+    $("#upload-form").submit();
+  },
+  render: function() {
+  }
+});
+
+var flowTableView;
+azkaban.FlowTableView= Backbone.View.extend({
+  events : {
+    "click .jobfolder": "expandFlowProject"
+  },
+  initialize : function(settings) {
+
+  },
+  expandFlowProject : function(evt) {
+    var targetId = evt.currentTarget.id;
+    var requestURL = contextURL + "/manager";
+
+    // projectId is available
+    $.get(
+      requestURL,
+      {"project": projectId, "json":"expandflow", "flow":targetId},
+      function(data) {
+        console.log("Success");
+      },
+      "json"
+    );
   },
   render: function() {
   }
@@ -46,6 +72,7 @@ azkaban.UploadProjectView= Backbone.View.extend({
 $(function() {
 	projectView = new azkaban.ProjectView({el:$( '#all-jobs-content'), successMsg: successMessage, errorMsg: errorMessage });
 	uploadView = new azkaban.UploadProjectView({el:$('#upload-project')});
+	flowTableView = new azkaban.FlowTableView({el:$('#flow-tabs')});
 	// Setting up the project tabs
 
 });