blob: 69eced645548c8feb1fe2433b33b726f33c83910 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.optional.sos;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Execute;
import org.apache.tools.ant.taskdefs.LogStreamHandler;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.Path;
/**
* A base class for creating tasks for executing commands on SourceOffSite.
* <p>
* The class extends the 'exec' task as it operates by executing the soscmd(.exe) program
* supplied with SOS. By default the task expects soscmd(.exe) to be in the path,
* you can override this be specifying the sosdir attribute.
* </p>
* <p>
* This class provides set and get methods for the following attributes
* <br> 'vssserverpath'
* <br> 'sosserverpath'
* <br> 'vsspath'
* <br> 'projectpath'
* <br> 'username'
* <br> 'password'
* <br> 'soscmddir'
* <br> 'file'
* <br> 'soshome'
* <br> 'localpath"
* <br> 'comment'
* <br> 'label'
* <br> 'version'
* <br> 'recursive'
* <br> 'verbose'
* <br> 'nocache'
* <br> 'nocompression'
* <br>
* It also contains constants for the flags that can be passed to SOS.
* <p>
* These tasks were inspired by the VSS tasks
*
* @author <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
*/
public abstract class SOS extends Task {
private String sosCmdDir = null;
private String sosUsername = null;
private String sosPassword = "";
private String projectPath = null;
private String vssServerPath = null;
private String sosServerPath = null;
private String sosHome = null;
private String localPath = null;
private String version = null;
private String label = null;
private String comment = null;
private String filename = null;
private boolean noCompress = false;
private boolean noCache = false;
private boolean recursive = false;
private boolean verbose = false;
/**
* flag to disable the cache when set;
* optional needed if SOSHOME is set as an environment variable.
*
* @param nocache The new noCache value
*/
public void setNoCache(boolean nocache) {
noCache = nocache;
}
/**
* Flag that disables compression when set; optional, default
*
* @param nocompress true to disable compression
*/
public void setNoCompress(boolean nocompress) {
noCompress = nocompress;
}
/**
* Set the directory where soscmd(.exe) is located;
* optional, soscmd must be on the path if omitted.
*
* @param dir The new sosCmd value
*/
public final void setSosCmd(String dir) {
sosCmdDir = Project.translatePath(dir);
}
/**
* Set the SourceSafe username; required.
*
* @param username The new username value
*/
public final void setUsername(String username) {
sosUsername = username;
}
/**
* Set the SourceSafe password; optional.
*
* @param password The new password value
*/
public final void setPassword(String password) {
sosPassword = password;
}
/**
* Set the SourceSafe project path without the "$" prefix; required
*
* @param projectpath The new projectPath value
*/
public final void setProjectPath(String projectpath) {
projectPath = SOSCmd.PROJECT_PREFIX + projectpath;
}
/**
* Set the path to the location of the ss.ini file;
* required.
*
* @param vssServerPath The new vssServerPath value
*/
public final void setVssServerPath(String vssServerPath) {
this.vssServerPath = vssServerPath;
}
/**
* The path to the SourceOffSite home directory
*
* @param sosHome The new sosHome value
*/
public final void setSosHome(String sosHome) {
this.sosHome = sosHome;
}
/**
* Set the address and port of SourceOffSite Server,
* eg. 192.168.0.1:8888 ; required.
*
* @param sosServerPath The new sosServerPath value
*/
public final void setSosServerPath(String sosServerPath) {
this.sosServerPath = sosServerPath;
}
/**
* Override the working directory and get to the specified path; optional.
*
* @param path The new localPath value
*/
public void setLocalPath(Path path) {
localPath = path.toString();
}
/**
* Set the Filename to act upon; optional.
* If no file is specified then the tasks
* act upon the project
*
* @param filename The new file value
*/
public final void setFile(String filename) {
this.filename = filename;
}
/**
* Enable verbose output; optional, default false
*
* @param verbose The new verbose value
*/
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
/**
* Flag to recursively apply the action (not valid
* on all SOS tasks ); optional, default false
*
* @param recursive The new recursive value
*/
public void setRecursive(boolean recursive) {
this.recursive = recursive;
}
/**
* Set the a version number to get -
* only works with the SOSGet on a file; optional.
*
* @param version The new version value
*/
public void setVersion(String version) {
this.version = version;
}
/**
* Set the labeled version to operate on in SourceSafe
*
* @param label The new label value
*/
public void setLabel(String label) {
this.label = label;
}
/**
* Set the comment to apply to all files being labelled;
* optional, only valid in SOSLabel
*
* @param comment The new comment value
*/
public void setComment(String comment) {
this.comment = comment;
}
/**
* Get the executable to run. Add the path if it was specifed in the build file
*
* @return String the executable to run
*/
public String getSosCommand() {
if (sosCmdDir == null) {
return SOSCmd.COMMAND_SOS_EXE;
} else {
return sosCmdDir + File.separator + SOSCmd.COMMAND_SOS_EXE;
}
}
/**
* Get the comment
* @return String if it was set, null if not
*/
public String getComment() {
return comment;
}
/**
* Get the version
* @return String if it was set, null if not
*/
public String getVersion() {
return version;
}
/**
* Get the label
* @return String if it was set, null if not
*/
public String getLabel() {
return label;
}
/**
* Get the username
* @return String if it was set, null if not
*/
public String getUsername() {
return sosUsername;
}
/**
* Get the password
* @return String empty string if it wans't set
*/
public String getPassword() {
return sosPassword;
}
/**
* Get the project path
* @return String if it was set, null if not
*/
public String getProjectPath() {
return projectPath;
}
/**
* Get the VSS server path
* @return String if it was set, null if not
*/
public String getVssServerPath() {
return vssServerPath;
}
/**
* Get the SOS home directory
* @return String if it was set, null if not
*/
public String getSosHome() {
return sosHome;
}
/**
* Get the SOS serve path
* @return String if it was set, null if not
*/
public String getSosServerPath() {
return sosServerPath;
}
/**
* Get the filename to be acted upon
* @return String if it was set, null if not
*/
public String getFilename() {
return filename;
}
/**
* Get the NoCompress flag
*
* @return String the 'nocompress' Flag if the attribute was 'true', otherwise an empty string
*/
public String getNoCompress() {
if (!noCompress) {
return "";
} else {
return SOSCmd.FLAG_NO_COMPRESSION;
}
}
/**
* Get the NoCache flag
*
* @return String the 'nocache' Flag if the attribute was 'true', otherwise an empty string
*/
public String getNoCache() {
if (!noCache) {
return "";
} else {
return SOSCmd.FLAG_NO_CACHE;
}
}
/**
* Get the 'verbose' Flag
*
* @return String the 'verbose' Flag if the attribute was 'true', otherwise an empty string
*/
public String getVerbose() {
if (!verbose) {
return "";
} else {
return SOSCmd.FLAG_VERBOSE;
}
}
/**
* Get the 'recursive' Flag
*
* @return String the 'recursive' Flag if the attribute was 'true', otherwise an empty string
*/
public String getRecursive() {
if (!recursive) {
return "";
} else {
return SOSCmd.FLAG_RECURSION;
}
}
/**
* Builds and returns the working directory.
* <p>
* The localpath is created if it didn't exist
*
* @return String the absolute path of the working directory
*/
public String getLocalPath() {
if (localPath == null) {
return project.getBaseDir().getAbsolutePath();
} else {
// make sure localDir exists, create it if it doesn't
File dir = project.resolveFile(localPath);
if (!dir.exists()) {
boolean done = dir.mkdirs();
if (!done) {
String msg = "Directory " + localPath + " creation was not " +
"successful for an unknown reason";
throw new BuildException(msg, location);
}
project.log("Created dir: " + dir.getAbsolutePath());
}
return dir.getAbsolutePath();
}
}
/**
* Execute the created command line
*
* @param cmd Description of Parameter
* @return int the exit code
* @throws BuildException
*/
protected int run(Commandline cmd) {
try {
Execute exe = new Execute(new LogStreamHandler(this,
Project.MSG_INFO,
Project.MSG_WARN));
exe.setAntRun(project);
exe.setWorkingDirectory(project.getBaseDir());
exe.setCommandline(cmd.getCommandline());
return exe.execute();
} catch (java.io.IOException e) {
throw new BuildException(e, location);
}
}
}