From 6a6bf3879820971393828fcb751be6723d4ad4d2 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Tue, 31 Dec 2013 11:04:49 +0000 Subject: [PATCH] put some more effort into detecting duplicate imports. PR 55097 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1554400 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 12 ++-- .../apache/tools/ant/taskdefs/ImportTask.java | 55 +++++++++++++++---- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/WHATSNEW b/WHATSNEW index fe28cf9c0..72b4d4e44 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -8,10 +8,14 @@ Changes that could break older environments: Fixed bugs: ----------- -* / failed when the importing file was loaded from an - URI or a jar and it imported a file from the local file system via - an absolute path. - Bugzilla Report 50953 + * / failed when the importing file was loaded from an + URI or a jar and it imported a file from the local file system via + an absolute path. + Bugzilla Report 50953 + + * could import the same resource twice when imported via + different resource types. + Bugzilla Report 55097 Other changes: -------------- diff --git a/src/main/org/apache/tools/ant/taskdefs/ImportTask.java b/src/main/org/apache/tools/ant/taskdefs/ImportTask.java index 2234dd54b..d2191e8ca 100644 --- a/src/main/org/apache/tools/ant/taskdefs/ImportTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/ImportTask.java @@ -27,6 +27,7 @@ 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.URLProvider; import org.apache.tools.ant.types.resources.URLResource; import org.apache.tools.ant.types.resources.Union; import org.apache.tools.ant.util.FileUtils; @@ -182,17 +183,8 @@ public class ImportTask extends Task { } } - File importedFile = null; - FileProvider fp = importedResource.as(FileProvider.class); - if (fp != null) { - importedFile = fp.getFile(); - } - if (!isInIncludeMode() && - (importStack.contains(importedResource) - || (importedFile != null && importStack.contains(importedFile)) - ) - ) { + hasAlreadyBeenImported(importedResource, importStack)) { getProject().log( "Skipped already imported file:\n " + importedResource + "\n", Project.MSG_VERBOSE); @@ -280,6 +272,49 @@ public class ImportTask extends Task { return f.isAbsolute() && f.exists(); } + private boolean hasAlreadyBeenImported(Resource importedResource, + Vector importStack) { + File importedFile = null; + FileProvider fp = importedResource.as(FileProvider.class); + if (fp != null) { + importedFile = fp.getFile(); + } + URL importedURL = null; + URLProvider up = importedResource.as(URLProvider.class); + if (up != null) { + importedURL = up.getURL(); + } + for (Object o : importStack) { + if (isOneOf(o, importedResource, importedFile, importedURL)) { + return true; + } + } + return false; + } + + private boolean isOneOf(Object o, Resource importedResource, + File importedFile, URL importedURL) { + if (o.equals(importedResource) || o.equals(importedFile) + || o.equals(importedURL)) { + return true; + } + if (o instanceof Resource) { + if (importedFile != null) { + FileProvider fp = ((Resource) o).as(FileProvider.class); + if (fp != null && fp.getFile().equals(importedFile)) { + return true; + } + } + if (importedURL != null) { + URLProvider up = ((Resource) o).as(URLProvider.class); + if (up != null && up.getURL().equals(importedURL)) { + return true; + } + } + } + return false; + } + /** * Whether the task is in include (as opposed to import) mode. *