azkaban-aplcache

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>