This isn't actually so important for URLResolver itself, which can be
replaced with the FileSystem resolver at will -- but without this patch,
one can't get the unique behavior of the IBiblio resolver combined with
useOrigin.

Feedback appreciated.
Index: src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
===================================================================
--- src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java       
(revision 1540780)
+++ src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java       
(working copy)
@@ -863,10 +863,11 @@
                 try {
                     ResolvedResource artifactRef = 
resourceResolver.resolve(artifact);
                     if (artifactRef != null) {
+                        String localName = 
artifactRef.getResource().getLocalName();
                         origin = new ArtifactOrigin(
                             artifact,
                             artifactRef.getResource().isLocal(),
-                            artifactRef.getResource().getName());
+                            localName != null ? localName : 
artifactRef.getResource().getName());
                         if (useOrigin && artifactRef.getResource().isLocal()) {
                             saveArtifactOrigin(artifact, origin);
                             archiveFile = getArchiveFileInCache(artifact, 
origin);
Index: src/java/org/apache/ivy/core/cache/ArtifactOrigin.java
===================================================================
--- src/java/org/apache/ivy/core/cache/ArtifactOrigin.java      (revision 
1540780)
+++ src/java/org/apache/ivy/core/cache/ArtifactOrigin.java      (working copy)
@@ -72,6 +72,12 @@
         Checks.checkNotNull(location, "location");
         this.artifact = artifact;
         this.isLocal = isLocal;
+        if(this.isLocal) {
+            if(location.startsWith("file:")) {
+                location = location.substring("file:".length());
+            }
+            Checks.checkAbsolute(location, "");
+        }
         this.location = location;
     }
 
Index: src/java/org/apache/ivy/plugins/repository/vfs/VfsResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/vfs/VfsResource.java     
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/vfs/VfsResource.java     
(working copy)
@@ -201,6 +201,14 @@
         return getName().startsWith("file:");
     }
 
+    public String getLocalName() {
+        String name = getName();
+        if(name.startsWith("file:")) {
+            return name.substring("file:".length());
+        }
+        return null;
+    }
+
     public InputStream openStream() throws IOException {
         return getContent().getInputStream();
     }
Index: src/java/org/apache/ivy/plugins/repository/url/URLResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/url/URLResource.java     
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/url/URLResource.java     
(working copy)
@@ -17,20 +17,23 @@
  */
 package org.apache.ivy.plugins.repository.url;
 
+import org.apache.ivy.plugins.repository.Resource;
+import org.apache.ivy.util.url.URLHandler.URLInfo;
+import org.apache.ivy.util.url.URLHandlerRegistry;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 
-import org.apache.ivy.plugins.repository.Resource;
-import org.apache.ivy.util.url.URLHandlerRegistry;
-import org.apache.ivy.util.url.URLHandler.URLInfo;
-
 public class URLResource implements Resource {
     private URL url;
 
     private boolean init = false;
 
+    /** whether file:// URLs are local */
+    private boolean localIfFileUrl = true;
+
     private long lastModified;
 
     private long contentLength;
@@ -41,10 +44,22 @@
         this.url = url;
     }
 
+    public URLResource(URL url, boolean localIfFileUrl) {
+        this(url);
+        this.localIfFileUrl = localIfFileUrl;
+    }
+
     public String getName() {
         return url.toExternalForm();
     }
 
+    public String getLocalName() {
+        if(isLocal()) {
+            return url.getPath();
+        }
+        return null;
+    }
+
     public Resource clone(String cloneName) {
         try {
             return new URLResource(new URL(cloneName));
@@ -91,8 +106,16 @@
         return getName();
     }
 
+    public void setLocalIfFileUrl(boolean value) {
+        localIfFileUrl = value;
+    }
+
+    public boolean getLocalIfFileUrl() {
+        return localIfFileUrl;
+    }
+
     public boolean isLocal() {
-        return false;
+        return localIfFileUrl && "file".equals(url.getProtocol());
     }
 
     public InputStream openStream() throws IOException {
Index: src/java/org/apache/ivy/plugins/repository/url/URLRepository.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/url/URLRepository.java   
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/url/URLRepository.java   
(working copy)
@@ -17,18 +17,6 @@
  */
 package org.apache.ivy.plugins.repository.url;
 
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
 import org.apache.ivy.plugins.repository.AbstractRepository;
 import org.apache.ivy.plugins.repository.RepositoryCopyProgressListener;
 import org.apache.ivy.plugins.repository.Resource;
@@ -36,20 +24,29 @@
 import org.apache.ivy.util.FileUtil;
 import org.apache.ivy.util.url.ApacheURLLister;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.*;
+
 public class URLRepository extends AbstractRepository {
     private RepositoryCopyProgressListener progress = new 
RepositoryCopyProgressListener(this);
 
     private Map resourcesCache = new HashMap();
 
+    private boolean localIfFileUrl = true;
+
     public Resource getResource(String source) throws IOException {
         Resource res = (Resource) resourcesCache.get(source);
         if (res == null) {
-            res = new URLResource(new URL(source));
+            res = new URLResource(new URL(source), localIfFileUrl);
             resourcesCache.put(source, res);
         }
         return res;
     }
-    
+
     public void get(String source, File destination) throws IOException {
         fireTransferInitiated(getResource(source), TransferEvent.REQUEST_GET);
         try {
@@ -138,4 +135,12 @@
         return null;
     }
 
+    public void setLocalIfFileUrl(boolean value) {
+        localIfFileUrl = value;
+    }
+
+    public boolean getLocalIfFileUrl() {
+        return localIfFileUrl;
+    }
+
 }
Index: src/java/org/apache/ivy/plugins/repository/LazyResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/LazyResource.java        
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/LazyResource.java        
(working copy)
@@ -62,6 +62,10 @@
         return name;
     }
 
+    public String getLocalName() {
+        return null;
+    }
+
     public boolean isLocal() {
         checkInit();
         return local;
Index: src/java/org/apache/ivy/plugins/repository/BasicResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/BasicResource.java       
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/BasicResource.java       
(working copy)
@@ -60,6 +60,10 @@
         return this.name;
     }
 
+    public String getLocalName() {
+        return null;
+    }
+
     public boolean isLocal() {
         return this.local;
     }
Index: src/java/org/apache/ivy/plugins/repository/sftp/SFTPResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/sftp/SFTPResource.java   
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/sftp/SFTPResource.java   
(working copy)
@@ -44,6 +44,10 @@
         return path;
     }
 
+    public String getLocalName() {
+        return null;
+    }
+
     public Resource clone(String cloneName) {
         return new SFTPResource(repository, cloneName);
     }
Index: src/java/org/apache/ivy/plugins/repository/jar/JarResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/jar/JarResource.java     
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/jar/JarResource.java     
(working copy)
@@ -42,6 +42,10 @@
         return path;
     }
 
+    public String getLocalName() {
+        return null;
+    }
+
     public long getLastModified() {
         return entry.getTime();
     }
Index: src/java/org/apache/ivy/plugins/repository/file/FileResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/file/FileResource.java   
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/file/FileResource.java   
(working copy)
@@ -38,6 +38,10 @@
         return file.getPath();
     }
 
+    public String getLocalName() {
+        return file.getPath();
+    }
+
     public Resource clone(String cloneName) {
         return new FileResource(repository, repository.getFile(cloneName));
     }
Index: src/java/org/apache/ivy/plugins/repository/ssh/SshResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/ssh/SshResource.java     
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/ssh/SshResource.java     
(working copy)
@@ -115,6 +115,10 @@
         return uri;
     }
 
+    public String getLocalName() {
+        return null;
+    }
+
     public String toString() {
         StringBuffer buffer = new StringBuffer();
         buffer.append("SshResource:");
Index: src/java/org/apache/ivy/plugins/repository/ResourceHelper.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/ResourceHelper.java      
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/repository/ResourceHelper.java      
(working copy)
@@ -17,13 +17,12 @@
  */
 package org.apache.ivy.plugins.repository;
 
+import org.apache.ivy.plugins.repository.url.URLResource;
+import org.apache.ivy.util.Message;
+
 import java.io.File;
 import java.net.MalformedURLException;
 
-import org.apache.ivy.plugins.repository.file.FileResource;
-import org.apache.ivy.plugins.repository.url.URLResource;
-import org.apache.ivy.util.Message;
-
 public final class ResourceHelper {
     
     private ResourceHelper() {
@@ -37,9 +36,11 @@
         if (res == null || f == null) {
             return false;
         }
-        if (res instanceof FileResource) {
-            return new File(res.getName()).equals(f);
-        } else if (res instanceof URLResource) {
+        String localName = res.getLocalName();
+        if(localName != null) {
+            return new File(localName).equals(f);
+        }
+        if (res instanceof URLResource) {
             try {
                 return 
f.toURI().toURL().toExternalForm().equals(res.getName());
             } catch (MalformedURLException e) {
Index: src/java/org/apache/ivy/plugins/repository/Resource.java
===================================================================
--- src/java/org/apache/ivy/plugins/repository/Resource.java    (revision 
1540780)
+++ src/java/org/apache/ivy/plugins/repository/Resource.java    (working copy)
@@ -53,6 +53,13 @@
     public String getName();
 
     /**
+     * Get a local filesystem name to refer to the resource. Only valid if 
isLocal() returns true.
+     *
+     * @return local filesystem name for the resource.
+     */
+    public String getLocalName();
+
+    /**
      * Get the date the resource was last modified
      * 
      * @return A <code>long</code> value representing the time the file was 
last modified,
Index: src/java/org/apache/ivy/plugins/resolver/packager/BuiltFileResource.java
===================================================================
--- src/java/org/apache/ivy/plugins/resolver/packager/BuiltFileResource.java    
(revision 1540780)
+++ src/java/org/apache/ivy/plugins/resolver/packager/BuiltFileResource.java    
(working copy)
@@ -50,6 +50,10 @@
     public String getName() {
         return file.toURI().toString();
     }
+    
+    public String getLocalName() {
+        return null;
+    }
 
     public Resource clone(String name) {
         return new BuiltFileResource(new File(name));
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
For additional commands, e-mail: dev-h...@ant.apache.org

Reply via email to