From 1c7917fa526925c672d4e5dd336d5b93aa51e6a5 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 10 Apr 2014 18:58:10 -0400
Subject: [PATCH] Add --json flag to the list command for outputing JSON

---
 src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java     |    8 ++--
 src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java |    8 ++--
 src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java           |   31 ++++++++++++---
 src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java        |    8 ++--
 src/main/java/com/gitblit/transport/ssh/commands/ListFilterCommand.java     |   28 ++++++++------
 5 files changed, 53 insertions(+), 30 deletions(-)

diff --git a/src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java b/src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java
index 4513626..8d4ddc3 100644
--- a/src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java
+++ b/src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java
@@ -22,9 +22,11 @@
 
 import org.kohsuke.args4j.Option;
 
+import com.gitblit.utils.JsonUtils;
+
 /**
  * Parent class of a list command.
- * 
+ *
  * @author James Moger
  *
  * @param <T>
@@ -34,27 +36,40 @@
 	@Option(name = "--verbose", aliases = { "-v" }, usage = "verbose")
 	protected boolean verbose;
 
-	@Option(name = "--tabbed", aliases = { "-t" }, usage = "as tabbed output")
+	@Option(name = "--tabbed", usage = "generate tabbed-text output")
 	protected boolean tabbed;
+
+	@Option(name = "--json", usage = "generate JSON output")
+	protected boolean json;
 
 	private DateFormat df;
 
 	protected abstract List<T> getItems() throws UnloggedFailure;
-	
+
+	protected void validateOutputFormat() throws UnloggedFailure {
+		if (tabbed && json) {
+			throw new UnloggedFailure(1, "Please specify --tabbed OR --json, not both!");
+		}
+	}
+
 	@Override
 	public void run() throws UnloggedFailure {
+		validateOutputFormat();
+
 		List<T> list = getItems();
 		if (tabbed) {
 			asTabbed(list);
+		} else if (json) {
+			asJSON(list);
 		} else {
 			asTable(list);
 		}
 	}
 
 	protected abstract void asTable(List<T> list);
-	
+
 	protected abstract void asTabbed(List<T> list);
-	
+
 	protected void outTabbed(Object... values) {
 		StringBuilder pattern = new StringBuilder();
 		for (int i = 0; i < values.length; i++) {
@@ -63,7 +78,11 @@
 		pattern.setLength(pattern.length() - 1);
 		stdout.println(String.format(pattern.toString(), values));
 	}
-	
+
+	protected void asJSON(List<T> list) {
+		stdout.println(JsonUtils.toJsonString(list));
+	}
+
 	protected String formatDate(Date date) {
 		if (df == null) {
 			df = new SimpleDateFormat("yyyy-MM-dd");
diff --git a/src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java b/src/main/java/com/gitblit/transport/ssh/commands/ListFilterCommand.java
similarity index 71%
rename from src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java
rename to src/main/java/com/gitblit/transport/ssh/commands/ListFilterCommand.java
index 1e25775..4cc0983 100644
--- a/src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java
+++ b/src/main/java/com/gitblit/transport/ssh/commands/ListFilterCommand.java
@@ -23,31 +23,33 @@
 import com.gitblit.utils.StringUtils;
 
 /**
- * List command that accepts a regex filter parameter.
- * 
+ * List command that accepts a filter parameter.
+ *
  * @author James Moger
  *
  * @param <T>
  */
-public abstract class ListRegexCommand<T> extends ListCommand<T> {
+public abstract class ListFilterCommand<T> extends ListCommand<T> {
 
-	@Argument(index = 0, metaVar = "REGEX", usage = "regex filter expression")
-	protected String regexFilter;
-	
-	protected abstract boolean matches(T t);
-	
+	@Argument(index = 0, metaVar = "FILTER", usage = "filter expression")
+	private String filter;
+
+	protected abstract boolean matches(String filter, T t);
+
 	@Override
 	public void run() throws UnloggedFailure {
+		validateOutputFormat();
+
 		List<T> list = getItems();
 		List<T> filtered;
-		if (StringUtils.isEmpty(regexFilter)) {
-			// no regex filter 
+		if (StringUtils.isEmpty(filter)) {
+			// no filter
 			filtered = list;
 		} else {
-			// regex filter the list
+			// filter the list
 			filtered = new ArrayList<T>();
 			for (T t : list) {
-				if (matches(t)) {
+				if (matches(filter, t)) {
 					filtered.add(t);
 				}
 			}
@@ -55,6 +57,8 @@
 
 		if (tabbed) {
 			asTabbed(filtered);
+		} else if (json) {
+			asJSON(filtered);
 		} else {
 			asTable(filtered);
 		}
diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java
index 1984ebc..97076ad 100644
--- a/src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java
+++ b/src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java
@@ -22,7 +22,7 @@
 import com.gitblit.models.UserModel;
 import com.gitblit.transport.ssh.commands.CommandMetaData;
 import com.gitblit.transport.ssh.commands.DispatchCommand;
-import com.gitblit.transport.ssh.commands.ListRegexCommand;
+import com.gitblit.transport.ssh.commands.ListFilterCommand;
 import com.gitblit.utils.FlipTable;
 import com.gitblit.utils.FlipTable.Borders;
 
@@ -36,7 +36,7 @@
 
 	/* List projects */
 	@CommandMetaData(name = "list", aliases= { "ls" }, description = "List projects")
-	public static class ListProjects extends ListRegexCommand<ProjectModel> {
+	public static class ListProjects extends ListFilterCommand<ProjectModel> {
 
 		@Override
 		protected List<ProjectModel> getItems() {
@@ -48,8 +48,8 @@
 		}
 
 		@Override
-		protected boolean matches(ProjectModel p) {
-			return p.name.matches(regexFilter);
+		protected boolean matches(String filter, ProjectModel p) {
+			return p.name.matches(filter);
 		}
 
 		@Override
diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java
index 4798c6d..4be60ab 100644
--- a/src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java
+++ b/src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java
@@ -22,7 +22,7 @@
 import com.gitblit.models.UserModel;
 import com.gitblit.transport.ssh.commands.CommandMetaData;
 import com.gitblit.transport.ssh.commands.DispatchCommand;
-import com.gitblit.transport.ssh.commands.ListRegexCommand;
+import com.gitblit.transport.ssh.commands.ListFilterCommand;
 import com.gitblit.utils.ArrayUtils;
 import com.gitblit.utils.FlipTable;
 import com.gitblit.utils.FlipTable.Borders;
@@ -38,7 +38,7 @@
 
 	/* List repositories */
 	@CommandMetaData(name = "list", aliases = { "ls" }, description = "List repositories")
-	public static class ListRepositories extends ListRegexCommand<RepositoryModel> {
+	public static class ListRepositories extends ListFilterCommand<RepositoryModel> {
 
 		@Override
 		protected List<RepositoryModel> getItems() {
@@ -49,8 +49,8 @@
 		}
 
 		@Override
-		protected boolean matches(RepositoryModel r) {
-			return r.name.matches(regexFilter);
+		protected boolean matches(String filter, RepositoryModel r) {
+			return r.name.matches(filter);
 		}
 
 		@Override
diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java
index c4fac3e..bed966d 100644
--- a/src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java
+++ b/src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java
@@ -25,7 +25,7 @@
 import com.gitblit.models.UserModel;
 import com.gitblit.transport.ssh.commands.CommandMetaData;
 import com.gitblit.transport.ssh.commands.DispatchCommand;
-import com.gitblit.transport.ssh.commands.ListRegexCommand;
+import com.gitblit.transport.ssh.commands.ListFilterCommand;
 import com.gitblit.transport.ssh.commands.SshCommand;
 import com.gitblit.utils.FlipTable;
 import com.gitblit.utils.FlipTable.Borders;
@@ -96,7 +96,7 @@
 	}
 
 	@CommandMetaData(name = "list", aliases= { "ls" }, description = "List users")
-	public static class ListUsers extends ListRegexCommand<UserModel> {
+	public static class ListUsers extends ListFilterCommand<UserModel> {
 
 		@Override
 		protected List<UserModel> getItems() {
@@ -106,8 +106,8 @@
 		}
 
 		@Override
-		protected boolean matches(UserModel u) {
-			return u.username.matches(regexFilter);
+		protected boolean matches(String filter, UserModel u) {
+			return u.username.matches(filter);
 		}
 
 		@Override

--
Gitblit v1.9.1