Details
diff --git a/src/java/azkaban/executor/ExecutorManager.java b/src/java/azkaban/executor/ExecutorManager.java
index a48a9c3..819d17b 100644
--- a/src/java/azkaban/executor/ExecutorManager.java
+++ b/src/java/azkaban/executor/ExecutorManager.java
@@ -20,6 +20,8 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
@@ -37,6 +39,7 @@ import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.log4j.Logger;
import azkaban.executor.ExecutableFlow.Status;
+import azkaban.executor.ExecutorManager.ExecutionReference;
import azkaban.flow.Flow;
import azkaban.utils.ExecutableFlowLoader;
import azkaban.utils.JSONUtils;
@@ -175,16 +178,26 @@ public class ExecutorManager {
return execFlows;
}
- public List<ExecutionReference> getFlowHistory(int numResults, int skip) {
+ public List<ExecutionReference> getFlowHistory(String rePattern, int numResults, int skip) {
ArrayList<ExecutionReference> searchFlows = new ArrayList<ExecutionReference>();
+ Pattern pattern;
+ try {
+ pattern = Pattern.compile(rePattern, Pattern.CASE_INSENSITIVE);
+ } catch (PatternSyntaxException e) {
+ logger.error("Bad regex pattern " + rePattern);
+ return searchFlows;
+ }
+
for (ExecutableFlow flow: runningFlows.values()) {
if (skip > 0) {
skip--;
}
else {
ExecutionReference ref = new ExecutionReference(flow);
- searchFlows.add(ref);
+ if(pattern.matcher(ref.getFlowId()).find() ) {
+ searchFlows.add(ref);
+ }
if (searchFlows.size() == numResults) {
Collections.sort(searchFlows);
return searchFlows;
@@ -220,7 +233,9 @@ public class ExecutorManager {
else {
try {
ExecutionReference ref = ExecutionReference.readFromDirectory(listArchivePartitions[i]);
- searchFlows.add(ref);
+ if(pattern.matcher(ref.getFlowId()).find() ) {
+ searchFlows.add(ref);
+ }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -1010,4 +1025,6 @@ public class ExecutorManager {
return (Long)obj;
}
+
+
}
diff --git a/src/java/azkaban/project/FileProjectManager.java b/src/java/azkaban/project/FileProjectManager.java
index 4f7875c..96cd717 100644
--- a/src/java/azkaban/project/FileProjectManager.java
+++ b/src/java/azkaban/project/FileProjectManager.java
@@ -18,6 +18,8 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
@@ -214,6 +216,30 @@ public class FileProjectManager implements ProjectManager {
}
return array;
}
+
+ @Override
+ public List<Project> getUserProjectsByRe(User user, final String rePattern) {
+ ArrayList<Project> array = new ArrayList<Project>();
+ Pattern pattern;
+ try {
+ pattern = Pattern.compile(rePattern, Pattern.CASE_INSENSITIVE);
+ } catch (PatternSyntaxException e) {
+ logger.error("Bad regex pattern " + rePattern);
+ return array;
+ }
+
+
+ for (Project project : projects.values()) {
+ Permission perm = project.getUserPermission(user);
+
+ if (perm != null && (perm.isPermissionSet(Type.ADMIN) || perm.isPermissionSet(Type.READ))) {
+ if(pattern.matcher(project.getName()).find() ) {
+ array.add(project);
+ }
+ }
+ }
+ return array;
+ }
@Override
public List<Project> getProjects() {
@@ -635,4 +661,5 @@ public class FileProjectManager implements ProjectManager {
private String projectLogFileName(String projectName) {
return "_project." + projectName + ".log";
}
+
}
\ No newline at end of file
diff --git a/src/java/azkaban/project/ProjectManager.java b/src/java/azkaban/project/ProjectManager.java
index de8d2e6..8896605 100644
--- a/src/java/azkaban/project/ProjectManager.java
+++ b/src/java/azkaban/project/ProjectManager.java
@@ -15,6 +15,8 @@ public interface ProjectManager {
public List<Project> getUserProjects(User user);
+ public List<Project> getUserProjectsByRe(User user, String searchTerm);
+
public List<Project> getProjects();
public void commitProject(String name) throws ProjectManagerException;
@@ -36,4 +38,6 @@ public interface ProjectManager {
public void copyProjectSourceFilesToDirectory(Project project, File directory) throws ProjectManagerException;
public void getProjectLogs(String projectId, long tailBytes, long skipBytes, Writer writer) throws IOException;
+
+
}
\ No newline at end of file
diff --git a/src/java/azkaban/webapp/servlet/HistoryServlet.java b/src/java/azkaban/webapp/servlet/HistoryServlet.java
index 393c8bd..4ffb6f3 100644
--- a/src/java/azkaban/webapp/servlet/HistoryServlet.java
+++ b/src/java/azkaban/webapp/servlet/HistoryServlet.java
@@ -34,7 +34,7 @@ public class HistoryServlet extends LoginAbstractAzkabanServlet {
pageNum = 1;
}
- List<ExecutionReference> history = executorManager.getFlowHistory(pageSize, (pageNum - 1)*pageSize);
+ List<ExecutionReference> history = executorManager.getFlowHistory(".*", pageSize, (pageNum - 1)*pageSize);
page.add("flowHistory", history);
page.add("size", pageSize);
page.add("page", pageNum);
@@ -66,7 +66,55 @@ public class HistoryServlet extends LoginAbstractAzkabanServlet {
@Override
protected void handlePost(HttpServletRequest req, HttpServletResponse resp,
Session session) throws ServletException, IOException {
- // TODO Auto-generated method stub
+ if (hasParam(req, "action")) {
+ String action = getParam(req, "action");
+ if (action.equals("search")) {
+ String searchTerm = getParam(req, "searchterm");
+ if(!searchTerm.equals("") && !searchTerm.equals(".*")) {
+ Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/historypage.vm");
+ int pageNum = getIntParam(req, "page", 1);
+ int pageSize = getIntParam(req, "size", 16);
+
+ if (pageNum < 0) {
+ pageNum = 1;
+ }
+
+ List<ExecutionReference> history = executorManager.getFlowHistory(searchTerm, pageSize, (pageNum - 1)*pageSize);
+ page.add("flowHistory", history);
+ page.add("size", pageSize);
+ page.add("page", pageNum);
+ page.add("search_term", searchTerm);
+
+ if (pageNum == 1) {
+ page.add("previous", new PageSelection(1, pageSize, true, false));
+ }
+ page.add("next", new PageSelection(pageNum + 1, pageSize, false, false));
+ // Now for the 5 other values.
+ int pageStartValue = 1;
+ if (pageNum > 3) {
+ pageStartValue = pageNum - 2;
+ }
+
+ page.add("page1", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
+ pageStartValue++;
+ page.add("page2", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
+ pageStartValue++;
+ page.add("page3", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
+ pageStartValue++;
+ page.add("page4", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
+ pageStartValue++;
+ page.add("page5", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
+ pageStartValue++;
+
+ page.render();
+ }
+ else resp.sendRedirect(req.getRequestURL().toString());
+ }
+ else resp.sendRedirect(req.getRequestURL().toString());
+ }
+ else {
+ resp.sendRedirect(req.getRequestURL().toString());
+ }
}
diff --git a/src/java/azkaban/webapp/servlet/IndexServlet.java b/src/java/azkaban/webapp/servlet/IndexServlet.java
index 596aab2..0e84edd 100644
--- a/src/java/azkaban/webapp/servlet/IndexServlet.java
+++ b/src/java/azkaban/webapp/servlet/IndexServlet.java
@@ -62,11 +62,34 @@ 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")) {
-
+ if (action.equals("search")) {
+
+ String searchTerm = getParam(req, "searchterm");
+
+ if(!searchTerm.equals("") && !searchTerm.equals(".*")) {
+ User user = session.getUser();
+ ProjectManager manager = this.getApplication().getProjectManager();
+ Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/index.vm");
+ if (hasParam(req, "all")) {
+ //do nothing special if one asks for 'ALL' projects
+ List<Project> projects = manager.getProjects();
+ page.add("allProjects", "");
+ page.add("projects", projects);
+ }
+ else {
+ List<Project> projects = manager.getUserProjectsByRe(user, searchTerm);
+ page.add("projects", projects);
+ page.add("search_term", searchTerm);
+ }
+
+ page.render();
+ }
+ else resp.sendRedirect(req.getRequestURL().toString());
}
- } else {
- resp.sendRedirect(req.getContextPath());
+ else resp.sendRedirect(req.getRequestURL().toString());
+ }
+ else {
+ resp.sendRedirect(req.getRequestURL().toString());
}
}
}
diff --git a/src/java/azkaban/webapp/servlet/velocity/historypage.vm b/src/java/azkaban/webapp/servlet/velocity/historypage.vm
index 3e90bbe..4373199 100644
--- a/src/java/azkaban/webapp/servlet/velocity/historypage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/historypage.vm
@@ -26,10 +26,10 @@
<div id="all-jobs-content">
<div class="section-hd">
<h2>History</h2>
- <form method="get">
+ <form id="search-form" method="post">
<input type="hidden" name="action" value="search">
- <input type="submit" value="Search" class="search-btn">
- <input id="searchtextbox" type="text" placeholder="by job name or wildcard" value="" class="search-input" name="job">
+ <input type="submit" value="Quick Search" class="search-btn">
+ <input id="searchtextbox" type="text" placeholder="by flow name containing ..." value=#if($search_term) ${search_term} #else "" #end class="search-input" name="searchterm">
</form>
</div>
</div>
diff --git a/src/java/azkaban/webapp/servlet/velocity/index.vm b/src/java/azkaban/webapp/servlet/velocity/index.vm
index b7ddc9b..d78c9f2 100644
--- a/src/java/azkaban/webapp/servlet/velocity/index.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/index.vm
@@ -41,10 +41,10 @@
<h4><a href="${context}/?all">All Projects</a></h4>
</div>
#end
- <form method="get">
+ <form id="search-form" method="post">
<input type="hidden" name="action" value="search">
- <input type="submit" value="Search" class="search-btn">
- <input id="searchtextbox" type="text" placeholder="by job name or wildcard" value="" class="search-input" name="job">
+ <input type="submit" value="Quick Search" class="search-btn">
+ <input id="searchtextbox" type="text" placeholder="by project name containing ..." value=#if($search_term) ${search_term} #else "" #end class="search-input" name="searchterm">
</form>
<a id="create-project-btn" class="btn1 createproject" href="#">Create Project</a>