Submitted by: Rami Ojares git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276288 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -148,8 +148,9 @@ Peter Reilly | |||
| Phillip Wells | |||
| Pierre Delisle | |||
| Pierre Dittgen | |||
| Raphael Pierquin | |||
| R Handerson | |||
| Rami Ojares | |||
| Raphael Pierquin | |||
| Richard Evans | |||
| Rick Beton | |||
| Robert Anderson | |||
| @@ -32,6 +32,7 @@ import org.apache.tools.ant.BuildException; | |||
| public abstract class AbstractSshMessage { | |||
| private Session session; | |||
| private boolean verbose; | |||
| private LogListener listener = new LogListener() { | |||
| public void log(String message) { | |||
| // do nothing; | |||
| @@ -39,6 +40,14 @@ public abstract class AbstractSshMessage { | |||
| }; | |||
| public AbstractSshMessage(Session session) { | |||
| this(false, session); | |||
| } | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| public AbstractSshMessage(boolean verbose, Session session) { | |||
| this.verbose = verbose; | |||
| this.session = session; | |||
| } | |||
| @@ -114,4 +123,33 @@ public abstract class AbstractSshMessage { | |||
| + " Average Rate: " + format.format(totalLength / duration) | |||
| + " B/s"); | |||
| } | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| protected final boolean getVerbose() { | |||
| return verbose; | |||
| } | |||
| /* | |||
| * Track progress every 10% if 100kb < filesize < 1mb. For larger | |||
| * files track progress for every percent transmitted. | |||
| */ | |||
| protected final int trackProgress(int filesize, int totalLength, | |||
| int percentTransmitted) { | |||
| int percent = (int) Math.round(Math.floor((totalLength | |||
| / (double)filesize) | |||
| * 100)); | |||
| if (percent > percentTransmitted) { | |||
| if (filesize < 1048576 && (percent % 10 != 0)) { | |||
| // do not track between tenths | |||
| } else { | |||
| log("" + percent + "%"); | |||
| } | |||
| } | |||
| return percent; | |||
| } | |||
| } | |||
| @@ -40,6 +40,7 @@ public abstract class SSHBase extends Task implements LogListener { | |||
| private String knownHosts; | |||
| private int port = SSH_PORT; | |||
| private boolean failOnError = true; | |||
| private boolean verbose; | |||
| private SSHUserInfo userInfo; | |||
| /** | |||
| @@ -71,6 +72,20 @@ public abstract class SSHBase extends Task implements LogListener { | |||
| return failOnError; | |||
| } | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| public void setVerbose(boolean failure) { | |||
| verbose = failure; | |||
| } | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| public boolean getVerbose() { | |||
| return verbose; | |||
| } | |||
| /** | |||
| * Username known to remote host. | |||
| * | |||
| @@ -140,7 +140,7 @@ public class Scp extends SSHBase { | |||
| try { | |||
| session = openSession(); | |||
| ScpFromMessage message = | |||
| new ScpFromMessage(session, file, | |||
| new ScpFromMessage(getVerbose(), session, file, | |||
| getProject().resolveFile(toPath), | |||
| fromSshUri.endsWith("*")); | |||
| log("Receiving file: " + file); | |||
| @@ -169,7 +169,8 @@ public class Scp extends SSHBase { | |||
| } | |||
| if (!list.isEmpty()) { | |||
| session = openSession(); | |||
| ScpToMessage message = new ScpToMessage(session, list, file); | |||
| ScpToMessage message = new ScpToMessage(getVerbose(), session, | |||
| list, file); | |||
| message.setLogListener(this); | |||
| message.execute(); | |||
| } | |||
| @@ -188,8 +189,8 @@ public class Scp extends SSHBase { | |||
| try { | |||
| session = openSession(); | |||
| ScpToMessage message = | |||
| new ScpToMessage(session, getProject().resolveFile(fromPath), | |||
| file); | |||
| new ScpToMessage(getVerbose(), session, | |||
| getProject().resolveFile(fromPath), file); | |||
| message.setLogListener(this); | |||
| message.execute(); | |||
| } finally { | |||
| @@ -38,14 +38,25 @@ public class ScpFromMessage extends AbstractSshMessage { | |||
| private File localFile; | |||
| private boolean isRecursive = false; | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| public ScpFromMessage(boolean verbose, | |||
| Session session, | |||
| String aRemoteFile, | |||
| File aLocalFile, | |||
| boolean recursive) { | |||
| super(verbose, session); | |||
| this.remoteFile = aRemoteFile; | |||
| this.localFile = aLocalFile; | |||
| this.isRecursive = recursive; | |||
| } | |||
| public ScpFromMessage(Session session, | |||
| String aRemoteFile, | |||
| File aLocalFile, | |||
| boolean recursive) { | |||
| super(session); | |||
| this.remoteFile = aRemoteFile; | |||
| this.localFile = aLocalFile; | |||
| this.isRecursive = recursive; | |||
| this(false, session, aRemoteFile, aLocalFile, recursive); | |||
| } | |||
| public void execute() throws IOException, JSchException { | |||
| @@ -153,6 +164,14 @@ public class ScpFromMessage extends AbstractSshMessage { | |||
| int length; | |||
| int totalLength = 0; | |||
| long startTime = System.currentTimeMillis(); | |||
| // only track progress for files larger than 100kb in verbose mode | |||
| boolean trackProgress = getVerbose() && filesize > 102400; | |||
| // since filesize keeps on decreasing we have to store the | |||
| // initial filesize | |||
| int initFilesize = filesize; | |||
| int percentTransmitted = 0; | |||
| try { | |||
| while (true) { | |||
| length = in.read(buf, 0, | |||
| @@ -166,6 +185,12 @@ public class ScpFromMessage extends AbstractSshMessage { | |||
| if (filesize == 0) { | |||
| break; | |||
| } | |||
| if (trackProgress) { | |||
| percentTransmitted = trackProgress(initFilesize, | |||
| totalLength, | |||
| percentTransmitted); | |||
| } | |||
| } | |||
| } finally { | |||
| long endTime = System.currentTimeMillis(); | |||
| @@ -36,22 +36,50 @@ public class ScpToMessage extends AbstractSshMessage { | |||
| private String remotePath; | |||
| private List directoryList; | |||
| public ScpToMessage(Session session, | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| public ScpToMessage(boolean verbose, | |||
| Session session, | |||
| File aLocalFile, | |||
| String aRemotePath) { | |||
| super(session); | |||
| this(verbose, session, aRemotePath); | |||
| this.localFile = aLocalFile; | |||
| } | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| public ScpToMessage(boolean verbose, | |||
| Session session, | |||
| List aDirectoryList, | |||
| String aRemotePath) { | |||
| this(verbose, session, aRemotePath); | |||
| this.directoryList = aDirectoryList; | |||
| } | |||
| /** | |||
| * @since Ant 1.6.2 | |||
| */ | |||
| private ScpToMessage(boolean verbose, | |||
| Session session, | |||
| String aRemotePath) { | |||
| super(verbose, session); | |||
| this.remotePath = aRemotePath; | |||
| } | |||
| public ScpToMessage(Session session, | |||
| File aLocalFile, | |||
| String aRemotePath) { | |||
| this(false, session, aLocalFile, aRemotePath); | |||
| } | |||
| public ScpToMessage(Session session, | |||
| List aDirectoryList, | |||
| String aRemotePath) { | |||
| super(session); | |||
| this.directoryList = aDirectoryList; | |||
| this.remotePath = aRemotePath; | |||
| this(false, session, aDirectoryList, aRemotePath); | |||
| } | |||
| public void execute() throws IOException, JSchException { | |||
| @@ -150,6 +178,14 @@ public class ScpToMessage extends AbstractSshMessage { | |||
| byte[] buf = new byte[BUFFER_SIZE]; | |||
| long startTime = System.currentTimeMillis(); | |||
| int totalLength = 0; | |||
| // only track progress for files larger than 100kb in verbose mode | |||
| boolean trackProgress = getVerbose() && filesize > 102400; | |||
| // since filesize keeps on decreasing we have to store the | |||
| // initial filesize | |||
| int initFilesize = filesize; | |||
| int percentTransmitted = 0; | |||
| try { | |||
| log("Sending: " + localFile.getName() + " : " + localFile.length()); | |||
| while (true) { | |||
| @@ -159,6 +195,12 @@ public class ScpToMessage extends AbstractSshMessage { | |||
| } | |||
| out.write(buf, 0, len); | |||
| totalLength += len; | |||
| if (trackProgress) { | |||
| percentTransmitted = trackProgress(initFilesize, | |||
| totalLength, | |||
| percentTransmitted); | |||
| } | |||
| } | |||
| out.flush(); | |||
| sendAck(out); | |||