azkaban-aplcache
Changes
src/java/azkaban/project/ProjectManager.java 13(+12 -1)
src/java/azkaban/utils/JSONUtils.java 20(+20 -0)
src/web/css/azkaban.css 4(+4 -0)
src/web/js/azkaban.job.view.js 24(+2 -22)
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() {
src/java/azkaban/project/ProjectManager.java 13(+12 -1)
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;
}
src/java/azkaban/utils/JSONUtils.java 20(+20 -0)
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>
src/web/css/azkaban.css 4(+4 -0)
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%);
src/web/js/azkaban.job.view.js 24(+2 -22)
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() {
}