@@ -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"); |
@@ -23,31 +23,33 @@ import org.kohsuke.args4j.Argument; | |||
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 = "FILTER", usage = "filter expression") | |||
private String filter; | |||
protected abstract boolean matches(String filter, T 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 { | |||
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 @@ public abstract class ListRegexCommand<T> extends ListCommand<T> { | |||
if (tabbed) { | |||
asTabbed(filtered); | |||
} else if (json) { | |||
asJSON(filtered); | |||
} else { | |||
asTable(filtered); | |||
} |
@@ -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 |
@@ -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 |
@@ -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 |