diff --git a/src/main/org/apache/tools/ant/taskdefs/ImportTask.java b/src/main/org/apache/tools/ant/taskdefs/ImportTask.java index 710b024e8..30f0da718 100644 --- a/src/main/org/apache/tools/ant/taskdefs/ImportTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/ImportTask.java @@ -23,10 +23,14 @@ import org.apache.tools.ant.ProjectHelper; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; 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.types.resources.Union; import org.apache.tools.ant.util.FileUtils; import java.io.File; +import java.util.Iterator; import java.util.Vector; /** @@ -59,9 +63,13 @@ public class ImportTask extends Task { private boolean optional; private String targetPrefix; private String prefixSeparator = "."; - private Resource resource = null; + private final Union resources = new Union(); private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + public ImportTask() { + resources.setCache(true); + } + /** * sets the optional attribute * @@ -107,14 +115,14 @@ public class ImportTask extends Task { * * @since Ant 1.8.0 */ - public void add(Resource r) { - resource = r; + public void add(ResourceCollection r) { + resources.add(r); } public void execute() { - if (file == null && resource == null) { + if (file == null && resources.size() == 0) { throw new BuildException("import requires file attribute or" - + " nested resource"); + + " at least one nested resource"); } if (getOwningTarget() == null || !"".equals(getOwningTarget().getName())) { @@ -142,19 +150,27 @@ public class ImportTask extends Task { throw new BuildException("Unable to get location of import task"); } - Resource importedResource = resource; - File importedFile = null; - if (resource == null) { + Union resourcesToImport = new Union(getProject(), resources); + if (file != null) { - File buildFile = new File(getLocation().getFileName()).getAbsoluteFile(); + File buildFile = + new File(getLocation().getFileName()).getAbsoluteFile(); - // Paths are relative to the build file they're imported from, - // *not* the current directory (same as entity includes). + // Paths are relative to the build file they're imported from, + // *not* the current directory (same as entity includes). - File buildFileParent = new File(buildFile.getParent()); - importedFile = FILE_UTILS.resolveFile(buildFileParent, file); - importedResource = new FileResource(importedFile); + File buildFileParent = new File(buildFile.getParent()); + File importedFile = FILE_UTILS.resolveFile(buildFileParent, file); + resources.add(new FileResource(importedFile)); } + for (Iterator i = resourcesToImport.iterator(); i.hasNext(); ) { + importResource(helper, (Resource) i.next()); + } + } + + private void importResource(ProjectHelper helper, + Resource importedResource) { + Vector importStack = helper.getImportStack(); getProject().log("Importing file " + importedResource + " from " + getLocation().getFileName(), Project.MSG_VERBOSE); @@ -171,6 +187,12 @@ public class ImportTask extends Task { } } + File importedFile = null; + FileProvider fp = (FileProvider) importedResource.as(FileProvider.class); + if (fp != null) { + importedFile = fp.getFile(); + } + if (!isInIncludeMode() && (importStack.contains(importedResource) || (importedFile != null && importStack.contains(importedFile))