diff options
Diffstat (limited to 'src/main/java/net/sf/antcontrib/property/PathToFileSet.java')
-rw-r--r-- | src/main/java/net/sf/antcontrib/property/PathToFileSet.java | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/main/java/net/sf/antcontrib/property/PathToFileSet.java b/src/main/java/net/sf/antcontrib/property/PathToFileSet.java new file mode 100644 index 0000000..d1231af --- /dev/null +++ b/src/main/java/net/sf/antcontrib/property/PathToFileSet.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved. + * + * 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 net.sf.antcontrib.property; + +import java.io.File; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.util.FileUtils; + +public class PathToFileSet + extends Task +{ + private File dir; + private String name; + private String pathRefId; + private boolean ignoreNonRelative = false; + + private static FileUtils fileUtils = FileUtils.newFileUtils(); + + public void setDir(File dir) { + this.dir = dir; + } + + public void setName(String name) { + this.name = name; + } + + public void setPathRefId(String pathRefId) { + this.pathRefId = pathRefId; + } + + public void setIgnoreNonRelative(boolean ignoreNonRelative) { + this.ignoreNonRelative = ignoreNonRelative; + } + + public void execute() { + if (dir == null) + throw new BuildException("missing dir"); + if (name == null) + throw new BuildException("missing name"); + if (pathRefId == null) + throw new BuildException("missing pathrefid"); + + if (! dir.isDirectory()) + throw new BuildException( + dir.toString() + " is not a directory"); + + Object path = getProject().getReference(pathRefId); + if (path == null) + throw new BuildException("Unknown reference " + pathRefId); + if (! (path instanceof Path)) + throw new BuildException(pathRefId + " is not a path"); + + + String[] sources = ((Path) path).list(); + + FileSet fileSet = new FileSet(); + fileSet.setProject(getProject()); + fileSet.setDir(dir); + String dirNormal = + fileUtils.normalize(dir.getAbsolutePath()).getAbsolutePath(); + if (! dirNormal.endsWith(File.separator)) { + dirNormal += File.separator; + } + + + boolean atLeastOne = false; + for (int i = 0; i < sources.length; ++i) { + File sourceFile = new File(sources[i]); + if (! sourceFile.exists()) + continue; + String relativeName = getRelativeName(dirNormal, sourceFile); + if (relativeName == null && !ignoreNonRelative) { + throw new BuildException( + sources[i] + " is not relative to " + dir.getAbsolutePath()); + } + if (relativeName == null) + continue; + fileSet.createInclude().setName(relativeName); + atLeastOne = true; + } + + if (! atLeastOne) { + // need to make an empty fileset + fileSet.createInclude().setName("a:b:c:d//THis si &&& not a file !!! "); + } + getProject().addReference(name, fileSet); + } + + private String getRelativeName(String dirNormal, File file) { + String fileNormal = + fileUtils.normalize(file.getAbsolutePath()).getAbsolutePath(); + if (! fileNormal.startsWith(dirNormal)) + return null; + return fileNormal.substring(dirNormal.length()); + } +} + |