package hudson.plugins.tfs.commands;
import com.microsoft.tfs.core.TFSTeamProjectCollection;
import com.microsoft.tfs.core.clients.versioncontrol.VersionControlConstants;
import com.microsoft.tfs.core.clients.versioncontrol.WorkspaceLocation;
import com.microsoft.tfs.core.clients.versioncontrol.WorkspaceOptions;
import com.microsoft.tfs.core.clients.versioncontrol.path.LocalPath;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.RecursionType;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.WorkingFolder;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.WorkingFolderType;
import hudson.model.TaskListener;
import hudson.plugins.tfs.model.MockableVersionControlClient;
import hudson.plugins.tfs.model.Server;
import hudson.remoting.Callable;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class NewWorkspaceCommand extends AbstractCallableCommand<Void, Exception> {
private static final WorkingFolder[] EMPTY_WORKING_FOLDER_ARRAY = new WorkingFolder[0];
private static final String CloakingTemplate = "Cloaking '%s' in workspace '%s'...";
private static final String CreatingTemplate = "Creating workspace '%s' owned by '%s'...";
private static final String CreatedTemplate = "Created workspace '%s'.";
private static final String MappingTemplate = "Mapping '%s' to local folder '%s' in workspace '%s'...";
private final String workspaceName;
private final String serverPath;
private final Collection<String> cloakedPaths;
private final String localPath;
public NewWorkspaceCommand(final ServerConfigurationProvider server, final String workspaceName, final String serverPath, Collection<String> cloakedPaths, final String localPath) {
super(server);
this.workspaceName = workspaceName;
this.serverPath = serverPath;
this.cloakedPaths = cloakedPaths;
this.localPath = localPath;
}
public Callable<Void, Exception> getCallable() {
return this;
}
public Void call() throws IOException {
final Server server = createServer();
final MockableVersionControlClient vcc = server.getVersionControlClient();
final TFSTeamProjectCollection connection = vcc.getConnection();
final TaskListener listener = server.getListener();
final PrintStream logger = listener.getLogger();
final String userName = server.getUserName();
final String creatingMessage = String.format(CreatingTemplate, workspaceName, userName);
logger.println(creatingMessage);
WorkingFolder[] foldersToMap = null;
if (serverPath != null && localPath != null) {
final String mappingMessage = String.format(MappingTemplate, serverPath, localPath, workspaceName);
logger.println(mappingMessage);
final List<WorkingFolder> folderList = new ArrayList<WorkingFolder>();
folderList.add(new WorkingFolder(serverPath, LocalPath.canonicalize(localPath), WorkingFolderType.MAP, RecursionType.FULL));
for (final String cloakedPath : cloakedPaths) {
final String cloakingMessage = String.format(CloakingTemplate, cloakedPath, workspaceName);
logger.println(cloakingMessage);
folderList.add(new WorkingFolder(cloakedPath, null, WorkingFolderType.CLOAK));
}
foldersToMap = folderList.toArray(EMPTY_WORKING_FOLDER_ARRAY);
}
updateCache(connection);
// TODO: we might need to delete a previous workspace that had another name
vcc.createWorkspace(
foldersToMap,
workspaceName,
VersionControlConstants.AUTHENTICATED_USER,
VersionControlConstants.AUTHENTICATED_USER,
null /* TODO: set comment to something nice/useful */,
WorkspaceLocation.SERVER /* TODO: pull request #33 adds LOCAL support */,
WorkspaceOptions.NONE
);
final String createdMessage = String.format(CreatedTemplate, workspaceName);
logger.println(createdMessage);
return null;
}
}