Author: bodewig
Date: Tue Dec 31 11:04:49 2013
New Revision: 1554400

URL: http://svn.apache.org/r1554400
Log:
put some more effort into detecting duplicate imports.  PR 55097

Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ImportTask.java

Modified: ant/core/trunk/WHATSNEW
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1554400&r1=1554399&r2=1554400&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Tue Dec 31 11:04:49 2013
@@ -8,10 +8,14 @@ Changes that could break older environme
 Fixed bugs:
 -----------
 
-* <import>/<include> 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
+ * <import>/<include> 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
+
+ * <import> could import the same resource twice when imported via
+   different resource types.
+   Bugzilla Report 55097
 
 Other changes:
 --------------

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ImportTask.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ImportTask.java?rev=1554400&r1=1554399&r2=1554400&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ImportTask.java 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ImportTask.java Tue 
Dec 31 11:04:49 2013
@@ -27,6 +27,7 @@ import org.apache.tools.ant.types.Resour
 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<Object> 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.
      *


Reply via email to