Browse Source

utterly without documents or tests, a utility task to extract a path to a dir, by way of a mapper.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278270 13f79535-47bb-0310-9956-ffa450edef68
master
Steve Loughran 20 years ago
parent
commit
2836fb9414
2 changed files with 192 additions and 0 deletions
  1. +191
    -0
      src/main/org/apache/tools/ant/taskdefs/CopyPath.java
  2. +1
    -0
      src/main/org/apache/tools/ant/taskdefs/defaults.properties

+ 191
- 0
src/main/org/apache/tools/ant/taskdefs/CopyPath.java View File

@@ -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());
}
}

}

}
}

+ 1
- 0
src/main/org/apache/tools/ant/taskdefs/defaults.properties View File

@@ -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


Loading…
Cancel
Save