package hudson.plugins.tfs.commands;
import com.microsoft.tfs.core.clients.versioncontrol.WorkspacePermissions;
import com.microsoft.tfs.jni.helpers.LocalHost;
import hudson.Util;
import hudson.model.TaskListener;
import hudson.plugins.tfs.model.MockableVersionControlClient;
import hudson.plugins.tfs.model.Server;
import hudson.plugins.tfs.model.Workspace;
import hudson.plugins.tfs.util.TextTableParser;
import hudson.remoting.Callable;
import org.apache.commons.lang.StringUtils;
import java.io.IOException;
import java.io.PrintStream;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
public class ListWorkspacesCommand extends AbstractCallableCommand<List<Workspace>, Exception> {
private static final String ListingWorkspacesTemplate = "Downloading list of workspaces from %s...";
private final String computer;
private final boolean shouldLogWorkspaces;
public interface WorkspaceFactory {
Workspace createWorkspace(String name, String computer, String owner, String comment);
}
public ListWorkspacesCommand(final ServerConfigurationProvider server) {
// TODO: shouldLogWorkspaces could be controlled by a property
this(server, null, false);
}
ListWorkspacesCommand(final ServerConfigurationProvider server, final String computer, final boolean shouldLogWorkspaces) {
super(server);
this.computer = computer;
this.shouldLogWorkspaces = shouldLogWorkspaces;
}
@Override
public Callable<List<Workspace>, Exception> getCallable() {
return this;
}
public List<Workspace> call() throws Exception {
final Server server = createServer();
final MockableVersionControlClient vcc = server.getVersionControlClient();
final TaskListener listener = server.getListener();
final PrintStream logger = listener.getLogger();
final String computerName = (computer != null) ? computer : LocalHost.getShortName();
final String listWorkspacesMessage = String.format(ListingWorkspacesTemplate, server.getUrl());
logger.println(listWorkspacesMessage);
final com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Workspace[] sdkWorkspaces
= vcc.queryWorkspaces(
null,
null,
computerName,
WorkspacePermissions.NONE_OR_NOT_SUPPORTED
);
final List<Workspace> result = new ArrayList<Workspace>(sdkWorkspaces.length);
for (final com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Workspace sdkWorkspace : sdkWorkspaces) {
final String name = sdkWorkspace.getName();
final String computer = sdkWorkspace.getComputer();
final String ownerName = sdkWorkspace.getOwnerName();
final String comment = Util.fixNull(sdkWorkspace.getComment());
final Workspace workspace = new Workspace(
name,
computer,
ownerName,
comment);
result.add(workspace);
}
if (shouldLogWorkspaces) {
log(result, logger);
}
return result;
}
public List<Workspace> parse(Reader consoleReader) throws IOException {
List<Workspace> list = new ArrayList<Workspace>();
TextTableParser parser = new TextTableParser(consoleReader, 1);
while (parser.nextRow()) {
Workspace workspace = new Workspace(
parser.getColumn(0),
parser.getColumn(2),
parser.getColumn(1),
Util.fixNull(parser.getColumn(3)));
list.add(workspace);
}
return list;
}
static void log(final List<Workspace> workspaces, final PrintStream logger) {
int maxName = "Workspace".length();
int maxOwner = "Owner".length();
int maxComputer = "Computer".length();
int maxComment = "Comment".length();
for (final Workspace workspace : workspaces) {
final String name = workspace.getName();
maxName = Math.max(maxName, name.length());
final String ownerName = workspace.getOwner();
maxOwner = Math.max(maxOwner, ownerName.length());
final String computer = workspace.getComputer();
maxComputer = Math.max(maxComputer, computer.length());
final String comment = workspace.getComment();
maxComment = Math.max(maxComment, comment.length());
}
final String template =
"%1$-" + maxName + "s %2$-" + maxOwner + "s %3$-" + maxComputer + "s %4$-" + maxComment + "s";
final String header = String.format(template, "Workspace", "Owner", "Computer", "Comment");
logger.println(header);
final String divider = String.format(template,
StringUtils.repeat("-", maxName),
StringUtils.repeat("-", maxOwner),
StringUtils.repeat("-", maxComputer),
StringUtils.repeat("-", maxComment));
logger.println(divider);
for (final Workspace workspace : workspaces) {
final String name = workspace.getName();
final String ownerName = workspace.getOwner();
final String computer = workspace.getComputer();
final String comment = workspace.getComment();
final String line = String.format(template, name, ownerName, computer, comment);
logger.println(line);
}
}
}