]> source.dussan.org Git - gitblit.git/commitdiff
Add --json flag to the list command for outputing JSON
authorJames Moger <james.moger@gitblit.com>
Sun, 23 Mar 2014 20:29:48 +0000 (16:29 -0400)
committerJames Moger <james.moger@gitblit.com>
Thu, 10 Apr 2014 22:58:10 +0000 (18:58 -0400)
src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java
src/main/java/com/gitblit/transport/ssh/commands/ListFilterCommand.java [new file with mode: 0644]
src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java [deleted file]
src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java
src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java
src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java

index 45136262203722918dfc13905a3e2518d05bbb6c..8d4ddc3cbe16dd55508d527098e6eaf1871cb424 100644 (file)
@@ -22,9 +22,11 @@ import java.util.List;
 
 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 @@ 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")
+       @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 @@ public abstract class ListCommand<T> extends SshCommand {
                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/ListFilterCommand.java b/src/main/java/com/gitblit/transport/ssh/commands/ListFilterCommand.java
new file mode 100644 (file)
index 0000000..4cc0983
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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 filter parameter.
+ *
+ * @author James Moger
+ *
+ * @param <T>
+ */
+public abstract class ListFilterCommand<T> extends ListCommand<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(filter)) {
+                       // no filter
+                       filtered = list;
+               } else {
+                       // filter the list
+                       filtered = new ArrayList<T>();
+                       for (T t : list) {
+                               if (matches(filter, t)) {
+                                       filtered.add(t);
+                               }
+                       }
+               }
+
+               if (tabbed) {
+                       asTabbed(filtered);
+               } else if (json) {
+                       asJSON(filtered);
+               } else {
+                       asTable(filtered);
+               }
+       }
+}
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java b/src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java
deleted file mode 100644 (file)
index 1e25775..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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
index 1984ebcc7fcb4b2fb787d70fdb98919138e58cd1..97076adfe6d9e29b5b940f87b79ccf1d0732cc4c 100644 (file)
@@ -22,7 +22,7 @@ import com.gitblit.models.ProjectModel;
 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 @@ public class ProjectsDispatcher extends DispatchCommand {
 
        /* 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 @@ public class ProjectsDispatcher extends DispatchCommand {
                }
 
                @Override
-               protected boolean matches(ProjectModel p) {
-                       return p.name.matches(regexFilter);
+               protected boolean matches(String filter, ProjectModel p) {
+                       return p.name.matches(filter);
                }
 
                @Override
index 4798c6d7e523a8bd73a04df3e6db85a9f85a5c1a..4be60abcfbd175138d88d9a484e6d5568e387920 100644 (file)
@@ -22,7 +22,7 @@ import com.gitblit.models.RepositoryModel;
 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 @@ public class RepositoriesDispatcher extends DispatchCommand {
 
        /* 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 @@ public class RepositoriesDispatcher extends DispatchCommand {
                }
 
                @Override
-               protected boolean matches(RepositoryModel r) {
-                       return r.name.matches(regexFilter);
+               protected boolean matches(String filter, RepositoryModel r) {
+                       return r.name.matches(filter);
                }
 
                @Override
index c4fac3ea91fcb5ba7409349ed9cec3fd68180610..bed966da8eac8866cc885b607c24173aca5566f0 100644 (file)
@@ -25,7 +25,7 @@ import com.gitblit.models.TeamModel;
 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 @@ public class UsersDispatcher extends DispatchCommand {
        }
 
        @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 @@ public class UsersDispatcher extends DispatchCommand {
                }
 
                @Override
-               protected boolean matches(UserModel u) {
-                       return u.username.matches(regexFilter);
+               protected boolean matches(String filter, UserModel u) {
+                       return u.username.matches(filter);
                }
 
                @Override