diff --git a/src/main/org/apache/tools/ant/taskdefs/CopyPath.java b/src/main/org/apache/tools/ant/taskdefs/CopyPath.java new file mode 100644 index 000000000..d62a2a12e --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/CopyPath.java @@ -0,0 +1,191 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.SourceFileScanner; +import org.apache.tools.ant.util.FileNameMapper; +import org.apache.tools.ant.types.Mapper; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.Reference; +import org.apache.tools.ant.types.FilterSetCollection; +import org.apache.tools.ant.types.FilterSet; + +import java.io.File; +import java.io.IOException; +import java.util.Enumeration; +import java.util.Vector; +import java.util.Hashtable; + +/** + * Copy the contents of a path to a destination, using the mapper of choice + * @since Ant 1.7 + * + * @ant.task category="filesystem" + */ + +public class CopyPath extends Task { + + private FileNameMapper mapper; + + private Path path; + + private File destDir; + protected FileUtils fileUtils; + private long granularity = 0; + protected boolean preserveLastModified = false; + + public CopyPath() { + fileUtils = FileUtils.getFileUtils(); + granularity = fileUtils.getFileTimestampGranularity(); + } + + public static final String ERROR_NO_DESTDIR = "No destDir specified"; + public static final String ERROR_NO_PATH = "No path specified"; + public static final String ERROR_NO_MAPPER = "No mapper specified"; + + public void setDestDir(File destDir) { + this.destDir = destDir; + } + + /** + * add a mapper + * @param newmapper + */ + public void add(FileNameMapper newmapper) { + if(mapper!=null) { + throw new BuildException("Only one mapper allowed"); + } + mapper=newmapper; + } + + + /** + * Set the path to be used when running the Java class. + * + * @param s an Ant Path object containing the path. + */ + public void setPath(Path s) { + createPath().append(s); + } + + /** + * Set the path to use by reference. + * + * @param r a reference to an existing path. + */ + public void setPathRef(Reference r) { + createPath().setRefid(r); + } + + /** + * Create a path. + * + * @return a path to be configured. + */ + public Path createPath() { + if (path == null) { + path = new Path(getProject()); + } + return path; + } + + public void setGranularity(long granularity) { + this.granularity = granularity; + } + + public void setPreserveLastModified(boolean preserveLastModified) { + this.preserveLastModified = preserveLastModified; + } + + /** + * Ensure we have a consistent and legal set of attributes, and set any + * internal flags necessary based on different combinations of attributes. + * + * @throws BuildException if an error occurs. + */ + protected void validateAttributes() throws BuildException { + if(destDir==null) { + throw new BuildException(ERROR_NO_DESTDIR); + } + if(mapper==null) { + throw new BuildException(ERROR_NO_MAPPER); + } + if(path==null) { + throw new BuildException(ERROR_NO_PATH); + } + } + + /** + * This is a very minimal derivative of the nomal copy logic. + * + * @throws BuildException if something goes wrong with the build. + */ + public void execute() throws BuildException { + validateAttributes(); + String[] sourceFiles = path.list(); + if (sourceFiles.length == 0) { + log("Path is empty", Project.MSG_VERBOSE); + return; + } + + for (int sources = 0; sources < sourceFiles.length; sources++) { + + String sourceFileName = sourceFiles[sources]; + File sourceFile=new File(sourceFileName); + String[] toFiles = (String[]) mapper.mapFileName(sourceFileName); + + for (int i = 0; i < toFiles.length; i++) { + String destFileName = toFiles[i]; + File destFile=new File(destDir,destFileName); + + + if (sourceFile.equals(destFile)) { + log("Skipping self-copy of " + sourceFileName, + Project.MSG_VERBOSE); + continue; + } + try { + log("Copying " + sourceFile + " to " + destFile, + Project.MSG_VERBOSE); + + fileUtils.copyFile(sourceFile, destFile, null, + null, false, + preserveLastModified, null, + null, getProject()); + } catch (IOException ioe) { + String msg = "Failed to copy " + + sourceFile + + " to " + + destFile + + " due to " + ioe.getMessage(); + if (destFile.exists() && !destFile.delete()) { + msg += " and I couldn't delete the corrupt " + destFile; + } + throw new BuildException(msg, ioe, getLocation()); + } + } + + } + + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties index 82b8c69c8..ec9281480 100644 --- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties +++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties @@ -82,6 +82,7 @@ nice=org.apache.tools.ant.taskdefs.Nice libraries=org.apache.tools.ant.taskdefs.repository.Libraries length=org.apache.tools.ant.taskdefs.Length clone=org.apache.tools.ant.taskdefs.Clone +copypath=org.apache.tools.ant.taskdefs.CopyPath # optional tasks image=org.apache.tools.ant.taskdefs.optional.image.Image