James Moger
2014-03-22 d500429a1d7a47da3bcd22880b53dce806ba9300
Refactored regex list command into a subclass
1 files added
5 files modified
180 ■■■■■ changed files
src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java 55 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java 62 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java 51 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java 4 ●●●● patch | view | raw | blame | history
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);
        }
    }
src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java
New file
@@ -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);
        }
    }
}
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() {
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() {
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);
                }
            }
        }
    }
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() {