azkaban-aplcache

Details

diff --git a/src/java/azkaban/project/FileProjectLoader.java b/src/java/azkaban/project/FileProjectLoader.java
index f93337b..eb59751 100644
--- a/src/java/azkaban/project/FileProjectLoader.java
+++ b/src/java/azkaban/project/FileProjectLoader.java
@@ -8,7 +8,9 @@ import azkaban.utils.Props;
 
 public class FileProjectLoader implements ProjectLoader {
 
-    public FileProjectLoader(Props props) {}
+    public FileProjectLoader(Props props) {
+    	
+    }
     
     @Override
     public Map<String, Project> loadAllProjects() {
diff --git a/src/java/azkaban/project/ProjectManager.java b/src/java/azkaban/project/ProjectManager.java
index 9532148..ddc0ea3 100644
--- a/src/java/azkaban/project/ProjectManager.java
+++ b/src/java/azkaban/project/ProjectManager.java
@@ -26,7 +26,18 @@ public class ProjectManager {
     	return projects.get(name);
     }
     
-    public Project createProjects(String projectName, User creator) {
+    public Project createProjects(String projectName, String description, User creator) throws ProjectManagerException {
+    	if (projectName == null || projectName.trim().isEmpty()) {
+    		throw new ProjectManagerException("Project name cannot be empty.");
+    	}
+    	else if (description == null || description.trim().isEmpty()) {
+    		throw new ProjectManagerException("Description cannot be empty.");
+    	}
+    	else if (creator == null) {
+    		throw new ProjectManagerException("Valid creator user must be set.");
+    	}
+    	
+    	
     	return null;
     }
     
diff --git a/src/java/azkaban/utils/JSONUtils.java b/src/java/azkaban/utils/JSONUtils.java
new file mode 100644
index 0000000..46bec48
--- /dev/null
+++ b/src/java/azkaban/utils/JSONUtils.java
@@ -0,0 +1,20 @@
+package azkaban.utils;
+
+import org.codehaus.jackson.map.ObjectMapper;
+
+public class JSONUtils {
+	/**
+	 * Prevent the instantiation of this helper class.
+	 */
+	private JSONUtils() {
+	}
+	
+	public static String toJSON(Object obj) {
+		ObjectMapper mapper = new ObjectMapper();
+		try {
+			return mapper.writeValueAsString(obj);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+}
diff --git a/src/java/azkaban/webapp/AzkabanWebServer.java b/src/java/azkaban/webapp/AzkabanWebServer.java
index cf5a2c5..ff174aa 100644
--- a/src/java/azkaban/webapp/AzkabanWebServer.java
+++ b/src/java/azkaban/webapp/AzkabanWebServer.java
@@ -186,6 +186,7 @@ public class AzkabanWebServer {
         	}
 
         } else {
+        	logger.info("By default, using FileProjectLoader");
         	loader = new FileProjectLoader(props);
         }
 
diff --git a/src/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java b/src/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
index 48a5bdf..3344603 100644
--- a/src/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
+++ b/src/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
@@ -18,7 +18,9 @@ package azkaban.webapp.servlet;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
@@ -34,6 +36,7 @@ import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
+import azkaban.utils.JSONUtils;
 import azkaban.utils.Props;
 import azkaban.webapp.AzkabanWebServer;
 import azkaban.webapp.session.Session;
@@ -41,7 +44,7 @@ import azkaban.webapp.session.Session;
 /**
  * Base Servlet for pages
  */
-public class AbstractAzkabanServlet extends HttpServlet {
+public abstract class AbstractAzkabanServlet extends HttpServlet {
     private static final DateTimeFormatter ZONE_FORMATTER = DateTimeFormat.forPattern("z");
     private static final String AZKABAN_SUCCESS_MESSAGE = "azkaban.success.message";
     private static final String AZKABAN_FAILURE_MESSAGE = "azkaban.failure.message";
@@ -103,7 +106,7 @@ public class AbstractAzkabanServlet extends HttpServlet {
      */
     public String getParam(HttpServletRequest request, String name) throws ServletException {
         String p = request.getParameter(name);
-        if (p == null || p.equals("")) throw new ServletException("Missing required parameter '" + name + "'.");
+        if (p == null) throw new ServletException("Missing required parameter '" + name + "'.");
         else return p;
     }
 
@@ -301,4 +304,20 @@ public class AbstractAzkabanServlet extends HttpServlet {
             return app;
         }
     }
+    
+    public static String createJsonResponse(String status, String message, String action, Map<String, Object> params) {
+    	HashMap<String,Object> response = new HashMap<String,Object>();
+    	response.put("status", status);
+    	if (message != null) {
+    		response.put("message", message);
+    	}
+    	if (action != null) {
+    		response.put("action", action);
+    	}
+    	if (params != null) {
+    		response.putAll(params);
+    	}
+    	
+    	return JSONUtils.toJSON(response);
+    }
 }
diff --git a/src/java/azkaban/webapp/servlet/IndexServlet.java b/src/java/azkaban/webapp/servlet/IndexServlet.java
index 2a699df..a460782 100644
--- a/src/java/azkaban/webapp/servlet/IndexServlet.java
+++ b/src/java/azkaban/webapp/servlet/IndexServlet.java
@@ -24,6 +24,8 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.log4j.Logger;
 
+import azkaban.project.ProjectManager;
+import azkaban.project.ProjectManagerException;
 import azkaban.webapp.session.Session;
 
 /**
@@ -45,7 +47,16 @@ public class IndexServlet extends LoginAbstractAzkabanServlet {
     protected void handlePost(HttpServletRequest req, HttpServletResponse resp, Session session)
             throws ServletException, IOException {
         if(hasParam(req, "action")) {
-
+        	String action = getParam(req, "action");
+        	if (action.equals("create")) {
+        		String project = getParam(req, "project");
+        		String description = getParam(req, "description");
+        		ProjectManager manager = this.getApplication().getProjectManager();
+        		try {
+					manager.createProjects(project, description, session.getUser());
+				} catch (ProjectManagerException e) {
+				}
+        	}
         }
         else {
             resp.sendRedirect(req.getContextPath());
diff --git a/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java b/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
index 95d283f..1c915d8 100644
--- a/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
+++ b/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
@@ -113,14 +113,22 @@ public abstract class LoginAbstractAzkabanServlet extends
                 }
             } else {
                 Session session = getSessionFromRequest(req);
-                handlePost(req, resp, session);
+                if (session == null) {
+                	handleLogin(req, resp, "Invalid session");
+                } else {
+                	handlePost(req, resp, session);
+                }
             }
         } else {
             Session session = getSessionFromRequest(req);
-            handlePost(req, resp, session);
+            if (session == null) {
+                handleLogin(req, resp);
+            } else {
+            	handlePost(req, resp, session);
+            }
         }
     }
-
+    
     /** 
      * The get request is handed off to the implementor after the user is logged in.
      * 
diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index cba5478..77cf86f 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -2,6 +2,8 @@ package azkaban.webapp.servlet;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.Writer;
+import java.util.HashMap;
 
 
 import javax.servlet.ServletConfig;
@@ -12,6 +14,9 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.log4j.Logger;
 
 import azkaban.project.ProjectManager;
+import azkaban.project.ProjectManagerException;
+import azkaban.user.User;
+import azkaban.utils.JSONUtils;
 import azkaban.webapp.session.Session;
 
 public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
@@ -40,13 +45,43 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
     	if (hasParam(req, "action")) {
     		String action = getParam(req, "action");
             if (action.equals("create")) {
-            	
+            	handleCreate(req, resp, session);
             }    		
     	}
 
     }
     
-    private void handleCreate() {
+    private void handleCreate(HttpServletRequest req, HttpServletResponse resp,
+            Session session) throws ServletException {
     	
+//    	String projectName = hasParam(req, "name") ? getParam(req, "name") : null;
+//    	String projectDescription = hasParam(req, "description") ? getParam(req, "description") : null;
+//    	logger.info("Create project " + projectName);
+//    	
+//    	User user = session.getUser();
+//    	HashMap<String, Object> responseObj = new HashMap<String, Object>();
+//    	String status = null;
+//    	String redirect = null;
+//    	String message = null;
+//
+//    	try {
+//			manager.createProjects(projectName, projectDescription, user);
+//			status = "success";
+//			redirect = "manager?project=" + projectName;
+//		} catch (ProjectManagerException e) {
+//			message = e.getMessage();
+//			status = "error";
+//		}
+//    	
+//    	String response = createJsonResponse(status, message, redirect, null);
+//    	try {
+//			Writer write = resp.getWriter();
+//			write.append(response);
+//			write.flush();
+//    	} catch (IOException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		}
     }
+
 }
diff --git a/src/java/azkaban/webapp/servlet/velocity/index.vm b/src/java/azkaban/webapp/servlet/velocity/index.vm
index eb227ac..06987e7 100644
--- a/src/java/azkaban/webapp/servlet/velocity/index.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/index.vm
@@ -44,20 +44,20 @@
     <h3>Create Project</h3>
       <div id="errorMsg" class="box-error-message">$errorMsg</div>
       <div class="message">
-
-          <fieldset>
-            <dl>
-              <dt><label for="path">Project Name</label></dt>
-              <dd><input id="path" name="project" type="text" size="20" title="The project name."/>
-              </dd>
-              <dt>Description</dt>
-              <dd><textarea id="description" name="description" rows="2" cols="40"></textarea></dd>
-
-              <input name="action" type="hidden" value="create" />
-              <input name="redirect" type="hidden" value="$!context/" />
-            </dl>
-          </fieldset>
-
+		  <form id="deployform" method="post" action="$!context">
+	          <fieldset>
+	            <dl>
+	              <dt><label for="path">Project Name</label></dt>
+	              <dd><input id="path" name="project" type="text" size="20" title="The project name."/>
+	              </dd>
+	              <dt>Description</dt>
+	              <dd><textarea id="description" name="description" rows="2" cols="40"></textarea></dd>
+	
+	              <input name="action" type="hidden" value="create" />
+	              <input name="redirect" type="hidden" value="$!context/" />
+	            </dl>
+	          </fieldset>
+		  </form>
       </div>
       <div class="actions">
         <a class="yes btn2" id="create-btn" href="#">Create Project</a>
diff --git a/src/web/css/azkaban.css b/src/web/css/azkaban.css
index 66ef942..345775b 100644
--- a/src/web/css/azkaban.css
+++ b/src/web/css/azkaban.css
@@ -13,6 +13,10 @@ body {
   font-family: Helvetica, Arial, Sans-Serif;
 }
 
+textarea {
+	border: 2px inset;
+}
+
 .header {
   background-image: -o-linear-gradient(bottom, rgb(56,56,56) 33%, rgb(73,73,73) 66%);
   background-image: -moz-linear-gradient(bottom, rgb(56,56,56) 33%, rgb(73,73,73) 66%);
diff --git a/src/web/js/azkaban.job.view.js b/src/web/js/azkaban.job.view.js
index 633489f..b89abfb 100644
--- a/src/web/js/azkaban.job.view.js
+++ b/src/web/js/azkaban.job.view.js
@@ -63,28 +63,8 @@ azkaban.CreateProjectView= Backbone.View.extend({
     $("#errorMsg").hide();
   },
   handleCreateProject : function(evt) {
-	  // First make sure we can upload
-	  var projectName = $('#path').val();
-	  var description = $('#description').val();
-	  if (projectName == "") {
-	    $("#errorMsg").text("ERROR: Empty Project Name.");
-	    $("#errorMsg").slideDown("fast");
-	  }
-	  else {
-	     console.log("Deploying");
-	     $.ajax({
-	     	async: "false",
-	     	url: "manager",
-	     	dataType: "json",
-	     	type: "POST",
-	     	data: {action:"create", name:projectName, description:description},
-	     	success: function(data) {console.log("success");}
-	     });
-	     	
-	     
-	    //window.location = "manager";
-	     //$("#deployform").submit();
-  	  }
+     console.log("Deploying");
+	 $("#deployform").submit();
   },
   render: function() {
   }