import org.kohsuke.args4j.Option;
+import com.gitblit.utils.JsonUtils;
+
/**
* Parent class of a list command.
- *
+ *
* @author James Moger
*
* @param <T>
@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++) {
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");
--- /dev/null
+/*
+ * 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
+++ /dev/null
-/*
- * 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
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;
/* 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() {
}
@Override
- protected boolean matches(ProjectModel p) {
- return p.name.matches(regexFilter);
+ protected boolean matches(String filter, ProjectModel p) {
+ return p.name.matches(filter);
}
@Override
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;
/* 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() {
}
@Override
- protected boolean matches(RepositoryModel r) {
- return r.name.matches(regexFilter);
+ protected boolean matches(String filter, RepositoryModel r) {
+ return r.name.matches(filter);
}
@Override
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;
}
@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() {
}
@Override
- protected boolean matches(UserModel u) {
- return u.username.matches(regexFilter);
+ protected boolean matches(String filter, UserModel u) {
+ return u.username.matches(filter);
}
@Override