aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessageBySftp.java
diff options
context:
space:
mode:
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.java205
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);
+ }
+ }
+}