package hudson.plugins.tfs.commands;
import java.io.PrintStream;
import com.microsoft.tfs.core.clients.versioncontrol.GetOptions;
import com.microsoft.tfs.core.clients.versioncontrol.events.GetEvent;
import com.microsoft.tfs.core.clients.versioncontrol.events.GetListener;
import com.microsoft.tfs.core.clients.versioncontrol.events.VersionControlEventEngine;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Workspace;
import com.microsoft.tfs.core.clients.versioncontrol.specs.version.LatestVersionSpec;
import com.microsoft.tfs.core.clients.versioncontrol.specs.version.VersionSpec;
import hudson.model.TaskListener;
import hudson.plugins.tfs.model.MockableVersionControlClient;
import hudson.plugins.tfs.model.Server;
import hudson.remoting.Callable;
public class GetFilesToWorkFolderCommand extends AbstractCallableCommand<Void, Exception> implements GetListener {
private static final String GettingTemplate = "Getting version '%s' to '%s'...";
private static final String GotTemplate = "Finished getting version '%s'. Retrieved %d resources.";
private final String workFolder;
private final String versionSpec;
private final boolean shouldLogEachGet;
private PrintStream logger;
private int getCount = 0;
public GetFilesToWorkFolderCommand(final ServerConfigurationProvider server, final String workFolder, final String versionSpec) {
this(server, workFolder, versionSpec, false);
// using shouldLogEachGet false as default, could be controlled by a config option at a later stage if desired, just adds noise to log though
}
public GetFilesToWorkFolderCommand(final ServerConfigurationProvider server, final String workFolder, final String versionSpec,
final boolean shouldLogEachGet) {
super(server);
this.workFolder = workFolder;
this.versionSpec = versionSpec;
this.shouldLogEachGet = shouldLogEachGet;
}
@Override
public Callable<Void, Exception> getCallable() {
return this;
}
void setLogger(final PrintStream logger) {
this.logger = logger;
}
public Void call() throws Exception {
final Server server = createServer();
final MockableVersionControlClient vcc = server.getVersionControlClient();
final TaskListener listener = server.getListener();
logger = listener.getLogger();
final VersionSpec getVersionSpec;
if (versionSpec != null) {
getVersionSpec = VersionSpec.parseSingleVersionFromSpec(versionSpec, null);
} else {
getVersionSpec = LatestVersionSpec.INSTANCE;
}
final String versionSpecString = RemoteChangesetVersionCommand.toString(getVersionSpec);
final String gettingMessage = String.format(GettingTemplate, versionSpecString, workFolder);
logger.println(gettingMessage);
final Workspace workspace = vcc.getWorkspace(workFolder);
final VersionControlEventEngine eventEngine = vcc.getEventEngine();
eventEngine.addGetListener(this);
workspace.get(getVersionSpec, GetOptions.NONE);
eventEngine.removeGetListener(this);
final String gotMessage = String.format(GotTemplate, versionSpecString, getCount);
logger.println(gotMessage);
return null;
}
public void onGet(final GetEvent getEvent) {
getCount++;
if (shouldLogEachGet) {
logger.println(getEvent.getTargetLocalItem());
}
}
}