diff --git a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectServlet.java b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectServlet.java
index da82e13..bf52ce1 100644
--- a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectServlet.java
+++ b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectServlet.java
@@ -17,6 +17,8 @@
package azkaban.webapp.servlet;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletConfig;
@@ -33,6 +35,7 @@ import azkaban.user.Permission;
import azkaban.user.Role;
import azkaban.user.User;
import azkaban.user.UserManager;
+import azkaban.utils.Pair;
import azkaban.webapp.AzkabanWebServer;
/**
@@ -65,20 +68,117 @@ public class ProjectServlet extends LoginAbstractAzkabanServlet {
@Override
protected void handleGet(HttpServletRequest req, HttpServletResponse resp,
Session session) throws ServletException, IOException {
- if (hasParam(req, "doaction")) {
- if (getParam(req, "doaction").equals("search")) {
- String searchTerm = getParam(req, "searchterm");
- if (!searchTerm.equals("") && !searchTerm.equals(".*")) {
- handleFilter(req, resp, session, searchTerm);
- return;
- }
+
+ ProjectManager manager =
+ ((AzkabanWebServer) getApplication()).getProjectManager();
+
+ if (hasParam(req, "ajax")) {
+ handleAjaxAction(req, resp, session, manager);
+ } else if (hasParam(req, "doaction")) {
+ handleDoAction(req, resp, session);
+ } else {
+ handlePageRender(req, resp, session, manager);
+ }
+ }
+
+ /**
+ * ProjectServlet class now handles ajax requests. It returns a
+ * @SimplifiedProject object: information regarding projects, and information
+ * regarding user and project association
+ *
+ * @param req
+ * @param resp
+ * @param session
+ * @param manager
+ * @throws ServletException
+ * @throws IOException
+ */
+ private void handleAjaxAction(HttpServletRequest req,
+ HttpServletResponse resp, Session session, ProjectManager manager)
+ throws ServletException, IOException {
+
+ String ajaxName = getParam(req, "ajax");
+ HashMap<String, Object> ret = new HashMap<String, Object>();
+
+ if (ajaxName.equals("fetchallprojects")) {
+ List<Project> projects = manager.getProjects();
+ List<SimplifiedProject> simplifiedProjects =
+ toSimplifiedProjects(projects);
+ ret.put("projects", simplifiedProjects);
+ } else if (ajaxName.equals("fetchuserprojects")) {
+ handleFetchUserProjects(req, session, manager, ret);
+ }
+
+ this.writeJSON(resp, ret);
+ }
+
+ /**
+ * We know the intention of API call is to return project ownership based on
+ * given user. <br>
+ * If user provides an user name, the method honors it <br>
+ * If user provides an empty user name, the user defaults to the session user<br>
+ * If user does not provide the user param, the user also defaults to the
+ * session user<br>
+ *
+ * @param req
+ * @param session
+ * @param manager
+ * @param ret
+ * @throws ServletException
+ */
+ private void handleFetchUserProjects(HttpServletRequest req, Session session,
+ ProjectManager manager, HashMap<String, Object> ret)
+ throws ServletException {
+ User user = null;
+
+ // if key "user" is specified, follow this logic
+ if (hasParam(req, "user")) {
+ String userParam = getParam(req, "user");
+ if (userParam.isEmpty()) {
+ user = session.getUser();
+ } else {
+ user = new User(userParam);
}
+ } else {
+ // if key "user" is not specified, default to the session user
+ user = session.getUser();
}
+ List<Project> projects = manager.getUserProjects(user);
+ List<SimplifiedProject> simplifiedProjects = toSimplifiedProjects(projects);
+ ret.put("projects", simplifiedProjects);
+ }
+
+ /**
+ * A simple helper method that converts a List<Project> to List<SimplifiedProject>
+ *
+ * @param projects
+ * @return
+ */
+ private List<SimplifiedProject> toSimplifiedProjects(List<Project> projects) {
+ List<SimplifiedProject> simplifiedProjects = new ArrayList<>();
+ for (Project p : projects) {
+ SimplifiedProject sp =
+ new SimplifiedProject(p.getId(), p.getName(),
+ p.getLastModifiedUser(), p.getCreateTimestamp(),
+ p.getUserPermissions(), p.getGroupPermissions());
+ simplifiedProjects.add(sp);
+ }
+ return simplifiedProjects;
+ }
+
+ /**
+ * Renders the user homepage that users see when they log in
+ *
+ * @param req
+ * @param resp
+ * @param session
+ * @param manager
+ */
+ private void handlePageRender(HttpServletRequest req,
+ HttpServletResponse resp, Session session, ProjectManager manager) {
User user = session.getUser();
- ProjectManager manager =
- ((AzkabanWebServer) getApplication()).getProjectManager();
Page page =
newPage(req, resp, session, "azkaban/webapp/servlet/velocity/index.vm");
@@ -103,6 +203,17 @@ public class ProjectServlet extends LoginAbstractAzkabanServlet {
page.render();
}
+ private void handleDoAction(HttpServletRequest req, HttpServletResponse resp,
+ Session session) throws ServletException {
+ if (getParam(req, "doaction").equals("search")) {
+ String searchTerm = getParam(req, "searchterm");
+ if (!searchTerm.equals("") && !searchTerm.equals(".*")) {
+ handleFilter(req, resp, session, searchTerm);
+ return;
+ }
+ }
+ }
+
private void handleFilter(HttpServletRequest req, HttpServletResponse resp,
Session session, String searchTerm) {
User user = session.getUser();
@@ -143,4 +254,85 @@ public class ProjectServlet extends LoginAbstractAzkabanServlet {
return false;
}
+
+ /**
+ * This class is used to represent a simplified project, which can be returned
+ * to end users via REST API. This is done in consideration that the API
+ * caller only wants certain project level information regarding a project,
+ * but does not want every flow and every job inside that project.
+ *
+ * @author jyu
+ *
+ */
+ private class SimplifiedProject {
+ private int projectId;
+ private String projectName;
+ private String createdBy;
+ private long createdTime;
+ private List<Pair<String, Permission>> userPermissions;
+ private List<Pair<String, Permission>> groupPermissions;
+
+ public SimplifiedProject(int projectId, String projectName,
+ String createdBy, long createdTime,
+ List<Pair<String, Permission>> userPermissions,
+ List<Pair<String, Permission>> groupPermissions) {
+ this.projectId = projectId;
+ this.projectName = projectName;
+ this.createdBy = createdBy;
+ this.createdTime = createdTime;
+ this.userPermissions = userPermissions;
+ this.groupPermissions = groupPermissions;
+ }
+
+ public int getProjectId() {
+ return projectId;
+ }
+
+ public void setProjectId(int projectId) {
+ this.projectId = projectId;
+ }
+
+ public String getProjectName() {
+ return projectName;
+ }
+
+ public void setProjectName(String projectName) {
+ this.projectName = projectName;
+ }
+
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ public void setCreatedBy(String createdBy) {
+ this.createdBy = createdBy;
+ }
+
+ public long getCreatedTime() {
+ return createdTime;
+ }
+
+ public void setCreatedTime(long createdTime) {
+ this.createdTime = createdTime;
+ }
+
+ public List<Pair<String, Permission>> getUserPermissions() {
+ return userPermissions;
+ }
+
+ public void setUserPermissions(
+ List<Pair<String, Permission>> userPermissions) {
+ this.userPermissions = userPermissions;
+ }
+
+ public List<Pair<String, Permission>> getGroupPermissions() {
+ return groupPermissions;
+ }
+
+ public void setGroupPermissions(
+ List<Pair<String, Permission>> groupPermissions) {
+ this.groupPermissions = groupPermissions;
+ }
+
+ }
}