diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessageBySftp.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessageBySftp.java | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessageBySftp.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessageBySftp.java new file mode 100644 index 00000000..04f72d23 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessageBySftp.java @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.tools.ant.taskdefs.optional.ssh; + +import java.io.File; +import java.io.IOException; + +import org.apache.tools.ant.util.FileUtils; + +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpATTRS; +import com.jcraft.jsch.SftpException; +import com.jcraft.jsch.SftpProgressMonitor; + +/** + * A helper object representing an scp download. + */ +public class ScpFromMessageBySftp extends ScpFromMessage { + + private static final int HUNDRED_KILOBYTES = 102400; + + private String remoteFile; + private final File localFile; + private boolean isRecursive = false; + private boolean verbose = false; + + /** + * Constructor for ScpFromMessageBySftp. + * @param verbose if true log extra information + * @param session the Scp session to use + * @param aRemoteFile the remote file name + * @param aLocalFile the local file + * @param recursive if true use recursion + * @since Ant 1.7 + */ + public ScpFromMessageBySftp(final boolean verbose, + final Session session, + final String aRemoteFile, + final File aLocalFile, + final boolean recursive) { + this(verbose, session, aRemoteFile, aLocalFile, recursive, false); + } + + /** + * Constructor for ScpFromMessageBySftp. + * @param session the Scp session to use + * @param aRemoteFile the remote file name + * @param aLocalFile the local file + * @param recursive if true use recursion + */ + public ScpFromMessageBySftp(final Session session, + final String aRemoteFile, + final File aLocalFile, + final boolean recursive) { + this(false, session, aRemoteFile, aLocalFile, recursive); + } + + /** + * Constructor for ScpFromMessageBySftp. + * @param verbose if true log extra information + * @param session the Scp session to use + * @param aRemoteFile the remote file name + * @param aLocalFile the local file + * @param recursive if true use recursion + * @param preserveLastModified whether to preserve file + * modification times + * @since Ant 1.8.0 + */ + public ScpFromMessageBySftp(final boolean verbose, + final Session session, + final String aRemoteFile, + final File aLocalFile, + final boolean recursive, + final boolean preserveLastModified) { + super(verbose, session, aRemoteFile, aLocalFile, recursive, + preserveLastModified); + this.verbose = verbose; + this.remoteFile = aRemoteFile; + this.localFile = aLocalFile; + this.isRecursive = recursive; + } + + /** + * Carry out the transfer. + * @throws IOException on i/o errors + * @throws JSchException on errors detected by scp + */ + public void execute() throws IOException, JSchException { + final ChannelSftp channel = openSftpChannel(); + try { + channel.connect(); + try { + final SftpATTRS attrs = channel.stat(remoteFile); + if (attrs.isDir() && !remoteFile.endsWith("/")) { + remoteFile = remoteFile + "/"; + } + } catch (final SftpException ee) { + // Ignored + } + getDir(channel, remoteFile, localFile); + } catch (final SftpException e) { + final JSchException schException = new JSchException("Could not get '"+ remoteFile + +"' to '"+localFile+"' - " + +e.toString()); + schException.initCause(e); + throw schException; + } finally { + if (channel != null) { + channel.disconnect(); + } + } + log("done\n"); + } + + private void getDir(final ChannelSftp channel, + final String remoteFile, + final File localFile) throws IOException, SftpException { + String pwd = remoteFile; + if (remoteFile.lastIndexOf('/') != -1) { + if (remoteFile.length() > 1) { + pwd = remoteFile.substring(0, remoteFile.lastIndexOf('/')); + } + } + channel.cd(pwd); + if (!localFile.exists()) { + localFile.mkdirs(); + } + final java.util.Vector files = channel.ls(remoteFile); + final int size = files.size(); + for (int i = 0; i < size; i++) { + final ChannelSftp.LsEntry le = (ChannelSftp.LsEntry) files.elementAt(i); + final String name = le.getFilename(); + if (le.getAttrs().isDir()) { + if (name.equals(".") || name.equals("..")) { + continue; + } + getDir(channel, + channel.pwd() + "/" + name + "/", + new File(localFile, le.getFilename())); + } else { + getFile(channel, le, localFile); + } + } + channel.cd(".."); + } + + private void getFile(final ChannelSftp channel, + final ChannelSftp.LsEntry le, + File localFile) throws IOException, SftpException { + final String remoteFile = le.getFilename(); + if (!localFile.exists()) { + final String path = localFile.getAbsolutePath(); + final int i = path.lastIndexOf(File.pathSeparator); + if (i != -1) { + if (path.length() > File.pathSeparator.length()) { + new File(path.substring(0, i)).mkdirs(); + } + } + } + + if (localFile.isDirectory()) { + localFile = new File(localFile, remoteFile); + } + + final long startTime = System.currentTimeMillis(); + final long totalLength = le.getAttrs().getSize(); + + SftpProgressMonitor monitor = null; + final boolean trackProgress = getVerbose() && totalLength > HUNDRED_KILOBYTES; + if (trackProgress) { + monitor = getProgressMonitor(); + } + try { + log("Receiving: " + remoteFile + " : " + le.getAttrs().getSize()); + channel.get(remoteFile, localFile.getAbsolutePath(), monitor); + } finally { + final long endTime = System.currentTimeMillis(); + logStats(startTime, endTime, (int) totalLength); + } + if (getPreserveLastModified()) { + FileUtils.getFileUtils().setFileLastModified(localFile, + ((long) le.getAttrs() + .getMTime()) + * 1000); + } + } +} |