| @@ -29,6 +29,11 @@ import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| import org.apache.tools.ant.types.Resource; | |||
| import org.apache.tools.ant.types.ResourceCollection; | |||
| import org.apache.tools.ant.types.resources.FileProvider; | |||
| import org.apache.tools.ant.types.resources.FileResource; | |||
| import org.apache.tools.ant.util.ResourceUtils; | |||
| import com.jcraft.jsch.JSchException; | |||
| import com.jcraft.jsch.Session; | |||
| @@ -49,7 +54,7 @@ public class Scp extends SSHBase { | |||
| private String fromUri; | |||
| private String toUri; | |||
| private boolean preserveLastModified = false; | |||
| private List fileSets = null; | |||
| private List<ResourceCollection> rcs = null; | |||
| private boolean isFromRemote, isToRemote; | |||
| private boolean isSftp = false; | |||
| private Integer fileMode, dirMode; | |||
| @@ -203,11 +208,20 @@ public class Scp extends SSHBase { | |||
| * | |||
| * @param set FileSet to send to remote host. | |||
| */ | |||
| public void addFileset(final FileSet set) { | |||
| if (fileSets == null) { | |||
| fileSets = new LinkedList(); | |||
| public void addFileset(FileSet set) { | |||
| add(set); | |||
| } | |||
| /** | |||
| * Adds a ResourceCollection of local files to transfer to remote host. | |||
| * @param set ResourceCollection to send to remote host. | |||
| * @since Ant 1.9.7 | |||
| */ | |||
| public void add(ResourceCollection res) { | |||
| if (rcs == null) { | |||
| rcs = new LinkedList<ResourceCollection>(); | |||
| } | |||
| fileSets.add(set); | |||
| rcs.add(res); | |||
| } | |||
| /** | |||
| @@ -219,7 +233,7 @@ public class Scp extends SSHBase { | |||
| super.init(); | |||
| this.toUri = null; | |||
| this.fromUri = null; | |||
| this.fileSets = null; | |||
| this.rcs = null; | |||
| } | |||
| /** | |||
| @@ -231,15 +245,15 @@ public class Scp extends SSHBase { | |||
| if (toUri == null) { | |||
| throw exactlyOne(TO_ATTRS); | |||
| } | |||
| if (fromUri == null && fileSets == null) { | |||
| if (fromUri == null && rcs == null) { | |||
| throw exactlyOne(FROM_ATTRS, "one or more nested filesets"); | |||
| } | |||
| try { | |||
| if (isFromRemote && !isToRemote) { | |||
| download(fromUri, toUri); | |||
| } else if (!isFromRemote && isToRemote) { | |||
| if (fileSets != null) { | |||
| upload(fileSets, toUri); | |||
| if (rcs != null) { | |||
| upload(rcs, toUri); | |||
| } else { | |||
| upload(fromUri, toUri); | |||
| } | |||
| @@ -299,18 +313,26 @@ public class Scp extends SSHBase { | |||
| } | |||
| } | |||
| private void upload(final List fileSet, final String toSshUri) | |||
| private void upload(final List<ResourceCollection> rcs, final String toSshUri) | |||
| throws IOException, JSchException { | |||
| final String file = parseUri(toSshUri); | |||
| Session session = null; | |||
| try { | |||
| final List list = new ArrayList(fileSet.size()); | |||
| for (final Iterator i = fileSet.iterator(); i.hasNext();) { | |||
| final FileSet set = (FileSet) i.next(); | |||
| final Directory d = createDirectory(set); | |||
| if (d != null) { | |||
| list.add(d); | |||
| final List<Directory> list = new ArrayList<Directory>(rcs.size()); | |||
| for (final Iterator<ResourceCollection> i = rcs.iterator(); i.hasNext();) { | |||
| final ResourceCollection rc = (ResourceCollection) i.next(); | |||
| if (rc instanceof FileSet && rc.isFilesystemOnly()) { | |||
| FileSet fs = (FileSet) rc; | |||
| final Directory d = createDirectory(fs); | |||
| if (d != null) { | |||
| list.add(d); | |||
| } | |||
| } else { | |||
| List<Directory> ds = createDirectoryCollection(rc); | |||
| if (ds !=null) { | |||
| list.addAll(ds); | |||
| } | |||
| } | |||
| } | |||
| if (!list.isEmpty()) { | |||
| @@ -453,6 +475,50 @@ public class Scp extends SSHBase { | |||
| return root; | |||
| } | |||
| private List<Directory> createDirectoryCollection(final ResourceCollection rc) { | |||
| // not a fileset or contains non-file resources | |||
| if (!rc.isFilesystemOnly()) { | |||
| throw new BuildException("Only FileSystem resources are supported."); | |||
| } | |||
| List<Directory> ds = new ArrayList<Directory>(); | |||
| for (Resource r : rc) { | |||
| if (!r.isExists()) { | |||
| throw new BuildException("Could not find resource " + r.toLongString() + " to scp."); | |||
| } | |||
| FileProvider fp = r.as(FileProvider.class); | |||
| if (fp == null) { | |||
| throw new BuildException("Resource " + r.toLongString() + " is not a file."); | |||
| } | |||
| FileResource fr = ResourceUtils.asFileResource(fp); | |||
| File baseDir = fr.getBaseDir(); | |||
| if (baseDir == null) { | |||
| throw new BuildException("basedir for resource " + r.toLongString() + " is undefined."); | |||
| } | |||
| // if the basedir is set, the name will be relative to that | |||
| String name = r.getName(); | |||
| Directory root = new Directory(baseDir); | |||
| Directory current = root; | |||
| File currentParent = baseDir; | |||
| final String[] path = Directory.getPath(name); | |||
| for (int i = 0; i < path.length; i++) { | |||
| final File file = new File(currentParent, path[i]); | |||
| if (file.isDirectory()) { | |||
| current.addDirectory(new Directory(file)); | |||
| current = current.getChild(file); | |||
| currentParent = current.getDirectory(); | |||
| } else if (file.isFile()) { | |||
| current.addFile(file); | |||
| } | |||
| } | |||
| ds.add(root); | |||
| } | |||
| return ds; | |||
| } | |||
| private void setFromUri(final String fromUri) { | |||
| if (this.fromUri != null) { | |||
| throw exactlyOne(FROM_ATTRS); | |||