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.WorkspacePermissions; import com.microsoft.tfs.core.clients.versioncontrol.Workstation; import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Workspace; import com.microsoft.tfs.core.clients.versioncontrol.workspacecache.WorkspaceInfo; import com.microsoft.tfs.core.config.persistence.PersistenceStoreProvider; import com.microsoft.tfs.jni.helpers.LocalHost; 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; public class DeleteWorkspaceCommand extends AbstractCallableCommand<Void, IOException> { private static final String DeletingTemplate = "Deleting workspaces named '%s' from computer '%s'..."; private static final String DeletedTemplate = "Deleted %d workspace(s) named '%s'."; private final String workspaceName; private final String computerName; public DeleteWorkspaceCommand(final ServerConfigurationProvider server, final String workspaceName) { this(server, workspaceName, null); } public DeleteWorkspaceCommand(final ServerConfigurationProvider server, final String workspaceName, final String computerName) { super(server); this.workspaceName = workspaceName; this.computerName = computerName; } public Callable<Void, IOException> getCallable() { return this; } public Void call() throws IOException { final Server server = createServer(); final MockableVersionControlClient vcc = server.getVersionControlClient(); final TaskListener listener = server.getListener(); final PrintStream logger = listener.getLogger(); final String computerName = (DeleteWorkspaceCommand.this.computerName == null) ? LocalHost.getShortName() : DeleteWorkspaceCommand.this.computerName; final String deletingMessage = String.format(DeletingTemplate, workspaceName, computerName); logger.println(deletingMessage); final WorkspacePermissions filter = WorkspacePermissions.NONE_OR_NOT_SUPPORTED; final Workspace[] workspaces = vcc.queryWorkspaces(workspaceName, null, computerName, filter); int numDeletions = 0; for (final Workspace innerWorkspace : workspaces) { vcc.deleteWorkspace(innerWorkspace); // work around a defect in the TFS SDK for Java // TODO: check if this workaround is still necessary after upgrading final WorkspaceInfo workspaceInfo = vcc.removeCachedWorkspace(workspaceName, VersionControlConstants.AUTHENTICATED_USER); if (workspaceInfo != null) { final TFSTeamProjectCollection tpc = vcc.getConnection(); final PersistenceStoreProvider provider = tpc.getPersistenceStoreProvider(); final Workstation currentWorkstation = Workstation.getCurrent(provider); currentWorkstation.saveConfigIfDirty(); } numDeletions++; } final String deletedMessage = String.format(DeletedTemplate, numDeletions, workspaceName); logger.println(deletedMessage); return null; } }