/*
 * 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;


    /**
     * Disable the cache
     *
     * @param  nocache  The new noCache value
     */
    public void setNoCache(boolean nocache) {
        noCache = nocache;
    }


    /**
     * Disable compression
     *
     * @param  nocompress  The new noCompress value
     */
    public void setNoCompress(boolean nocompress) {
        noCompress = nocompress;
    }


    /**
     * Set the directory where soscmd(.exe) is located
     *
     * @param  dir  The new sosCmd value
     */
    public final void setSosCmd(String dir) {
        sosCmdDir = Project.translatePath(dir);
    }


    /**
     * Set the username to use to access SOS.
     *
     * @param  username  The new username value
     */
    public final void setUsername(String username) {
        sosUsername = username;
    }


    /**
     * Set the password to use to access SOS.
     *
     * @param  password  The new password value
     */
    public final void setPassword(String password) {
        sosPassword = password;
    }


    /**
     * Set the path to the item in SOS to operate on.
     * <p>
     * To avoid the "$$" in th build file we add it here
     *
     * @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.
     *
     * @param  vssServerPath  The new vssServerPath value
     */
    public final void setVssServerPath(String vssServerPath) {
        this.vssServerPath = vssServerPath;
    }


    /**
     * Set the path of soshome
     *
     * @param  sosHome  The new sosHome value
     */
    public final void setSosHome(String sosHome) {
        this.sosHome = sosHome;
    }


    /**
     * Set the address & port of SourceOffSite Server
     *
     * @param  sosServerPath  The new sosServerPath value
     */
    public final void setSosServerPath(String sosServerPath) {
        this.sosServerPath = sosServerPath;
    }


    /**
     * Set the local path.
     *
     * @param  path  The new localPath value
     */
    public void setLocalPath(Path path) {
        localPath = path.toString();
    }


    /**
     * Set the filename to get from SOS
     *
     * @param  filename  The new file value
     */
    public final void setFile(String filename) {
        this.filename = filename;
    }


    /**
     * Set behaviour verbose or quiet
     *
     * @param  verbose  The new verbose value
     */
    public void setVerbose(boolean verbose) {
        this.verbose = verbose;
    }


    /**
     * Set behaviour recursive or non-recursive
     *
     * @param  recursive  The new recursive value
     */
    public void setRecursive(boolean recursive) {
        this.recursive = recursive;
    }


    /**
     * Set the stored version string
     *
     * @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 get
     *
     * @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);
        }
    }
}

