From d500429a1d7a47da3bcd22880b53dce806ba9300 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] Refactored regex list command into a subclass

---
 src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java      |   51 ++++++-----------
 src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java     |    4 
 src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java      |   62 ++++++++++++++++++++
 src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java |    4 
 src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java           |   55 +++++++++---------
 src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java        |    4 
 6 files changed, 113 insertions(+), 67 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 3953433..4513626 100644
--- a/src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java
+++ b/src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java
@@ -1,54 +1,53 @@
+/*
+ * Copyright 2014 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package com.gitblit.transport.ssh.commands;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
-import com.gitblit.utils.StringUtils;
-
+/**
+ * Parent class of a list command.
+ * 
+ * @author James Moger
+ *
+ * @param <T>
+ */
 public abstract class ListCommand<T> extends SshCommand {
 
 	@Option(name = "--verbose", aliases = { "-v" }, usage = "verbose")
 	protected boolean verbose;
 
 	@Option(name = "--tabbed", aliases = { "-t" }, usage = "as tabbed output")
-	private boolean tabbed;
+	protected boolean tabbed;
 
-	@Argument(index = 0, metaVar = "REGEX", usage = "regex filter expression")
-	protected String regexFilter;
-	
 	private DateFormat df;
 
-	protected abstract List<T> getItems();
-	
-	protected abstract boolean matches(T t);
+	protected abstract List<T> getItems() throws UnloggedFailure;
 	
 	@Override
-	public void run() {
+	public void run() throws UnloggedFailure {
 		List<T> list = getItems();
-		List<T> filtered;
-		if (StringUtils.isEmpty(regexFilter)) {
-			// no regex filter 
-			filtered = list;
-		} else {
-			// regex filter the list
-			filtered = new ArrayList<T>();
-			for (T t : list) {
-				if (matches(t)) {
-					filtered.add(t);
-				}
-			}
-		}
-
 		if (tabbed) {
-			asTabbed(filtered);
+			asTabbed(list);
 		} else {
-			asTable(filtered);
+			asTable(list);
 		}
 	}
 
diff --git a/src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java b/src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java
new file mode 100644
index 0000000..1e25775
--- /dev/null
+++ b/src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2014 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.transport.ssh.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.kohsuke.args4j.Argument;
+
+import com.gitblit.utils.StringUtils;
+
+/**
+ * List command that accepts a regex filter parameter.
+ * 
+ * @author James Moger
+ *
+ * @param <T>
+ */
+public abstract class ListRegexCommand<T> extends ListCommand<T> {
+
+	@Argument(index = 0, metaVar = "REGEX", usage = "regex filter expression")
+	protected String regexFilter;
+	
+	protected abstract boolean matches(T t);
+	
+	@Override
+	public void run() throws UnloggedFailure {
+		List<T> list = getItems();
+		List<T> filtered;
+		if (StringUtils.isEmpty(regexFilter)) {
+			// no regex filter 
+			filtered = list;
+		} else {
+			// regex filter the list
+			filtered = new ArrayList<T>();
+			for (T t : list) {
+				if (matches(t)) {
+					filtered.add(t);
+				}
+			}
+		}
+
+		if (tabbed) {
+			asTabbed(filtered);
+		} else {
+			asTable(filtered);
+		}
+	}
+}
\ No newline at end of file
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 df878c4..500d6ae 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.ListCommand;
+import com.gitblit.transport.ssh.commands.ListRegexCommand;
 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 ListCommand<ProjectModel> {
+	public static class ListProjects extends ListRegexCommand<ProjectModel> {
 
 		@Override
 		protected List<ProjectModel> getItems() {
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 ae39500..4e42eef 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.ListCommand;
+import com.gitblit.transport.ssh.commands.ListRegexCommand;
 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 ListCommand<RepositoryModel> {
+	public static class ListRepositories extends ListRegexCommand<RepositoryModel> {
 
 		@Override
 		protected List<RepositoryModel> getItems() {
diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java
index b08fdfb..484121b 100644
--- a/src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java
+++ b/src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java
@@ -15,11 +15,9 @@
  */
 package com.gitblit.transport.ssh.gitblit;
 
-import java.text.SimpleDateFormat;
 import java.util.List;
 
 import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
 
 import com.gitblit.manager.IGitblit;
 import com.gitblit.models.RepositoryModel;
@@ -31,7 +29,7 @@
 import com.gitblit.tickets.TicketIndexer.Lucene;
 import com.gitblit.transport.ssh.commands.CommandMetaData;
 import com.gitblit.transport.ssh.commands.DispatchCommand;
-import com.gitblit.transport.ssh.commands.SshCommand;
+import com.gitblit.transport.ssh.commands.ListCommand;
 import com.gitblit.utils.FlipTable;
 import com.gitblit.utils.FlipTable.Borders;
 import com.gitblit.utils.StringUtils;
@@ -47,19 +45,13 @@
 	
 	/* List tickets */
 	@CommandMetaData(name = "list", aliases= { "ls" }, description = "List tickets")
-	public static class ListTickets extends SshCommand {
-
-		@Option(name = "--verbose", aliases = { "-v" }, usage = "verbose")
-		private boolean verbose;
-
-		@Option(name = "--tabbed", aliases = { "-t" }, usage = "as tabbed output")
-		private boolean tabbed;
+	public static class ListTickets extends ListCommand<QueryResult> {
 
 		@Argument(index = 0, metaVar = "REPOSITORY", usage = "repository")
 		protected String repository;
-
+		
 		@Override
-		public void run() throws UnloggedFailure {
+		protected List<QueryResult> getItems() throws UnloggedFailure {
 			IGitblit gitblit = getContext().getGitblit();
 			ITicketService tickets = gitblit.getTicketService();
 
@@ -81,14 +73,10 @@
 			
 			String query = qb.build();
 			List<QueryResult> list = tickets.queryFor(query, 0, 0, null, true);
-
-			if (tabbed) {
-				asTabbed(list);
-			} else {
-				asTable(list);
-			}
+			return list;
 		}
 
+		@Override
 		protected void asTable(List<QueryResult> list) {
 			boolean forRepo = !StringUtils.isEmpty(repository);
 			String[] headers;
@@ -110,41 +98,38 @@
 				}
 			}
 
-			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 			String[][] data = new String[list.size()][];
 			for (int i = 0; i < list.size(); i++) {
 				QueryResult q = list.get(i);
 
 				if (verbose) {
 					if (forRepo) {
-						data[i] = new String[] { "" + q.number, q.title, q.status.toString(), df.format(q.getDate()) };
+						data[i] = new String[] { "" + q.number, q.title, q.status.toString(), formatDate(q.getDate()) };
 					} else {
-						data[i] = new String[] { q.repository, "" + q.number, q.title, q.status.toString(), df.format(q.getDate()) };
+						data[i] = new String[] { q.repository, "" + q.number, q.title, q.status.toString(), formatDate(q.getDate()) };
 					}
 				} else {
 					if (forRepo) {
-						data[i] = new String[] { "" + q.number, q.title, q.status.toString(), df.format(q.getDate()) };
+						data[i] = new String[] { "" + q.number, q.title, q.status.toString(), formatDate(q.getDate()) };
 					} else {
-						data[i] = new String[] { q.repository, "" + q.number, q.title, q.status.toString(), df.format(q.getDate()) };
+						data[i] = new String[] { q.repository, "" + q.number, q.title, q.status.toString(), formatDate(q.getDate()) };
 					}
 				}
 			}
 			stdout.println(FlipTable.of(headers, data, Borders.BODY_HCOLS));
 		}
 
+		@Override
 		protected void asTabbed(List<QueryResult> list) {
-			String pattern;
 			if (verbose) {
-				pattern = "%s\t%s\t%s";
+				for (QueryResult q : list) {
+					outTabbed(q.repository, q.number, q.title, q.status.toString(),
+							formatDate(q.getDate()));
+				}
 			} else {
-				pattern = "%s";
-			}
-
-			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
-			for (QueryResult q : list) {
-				stdout.println(String.format(pattern,
-						q.repository, q.number, q.title, q.status.toString(),
-						df.format(q.getDate())));
+				for (QueryResult q : list) {
+					outTabbed(q.repository, q.number, q.title);
+				}
 			}
 		}
 	}
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 a0ca08f..14af7e7 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.ListCommand;
+import com.gitblit.transport.ssh.commands.ListRegexCommand;
 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 ListCommand<UserModel> {
+	public static class ListUsers extends ListRegexCommand<UserModel> {
 
 		@Override
 		protected List<UserModel> getItems() {

--
Gitblit v1.9.1