Author: maartenc
Date: Thu Oct 11 21:08:27 2012
New Revision: 1397312

URL: http://svn.apache.org/viewvc?rev=1397312&view=rev
Log:
Re-implemented IVY-1281 because current implementation had too much issues. 
(merged from trunk)

Modified:
    ant/ivy/core/branches/2.3.x/   (props changed)
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/DefaultResolutionCacheManager.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/ResolutionCacheManager.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/deliver/DeliverEngine.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultExtendsDescriptor.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/ExtendsDescriptor.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/publish/PublishEngine.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/settings/IvySettings.java
    
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java

Propchange: ant/ivy/core/branches/2.3.x/
------------------------------------------------------------------------------
  Merged /ant/ivy/core/trunk:r1396296

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/DefaultResolutionCacheManager.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/DefaultResolutionCacheManager.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/DefaultResolutionCacheManager.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/DefaultResolutionCacheManager.java
 Thu Oct 11 21:08:27 2012
@@ -18,13 +18,35 @@
 package org.apache.ivy.core.cache;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.ParseException;
+import java.util.Map;
+import java.util.Properties;
 
 import org.apache.ivy.core.IvyPatternHelper;
+import org.apache.ivy.core.RelativeUrlResolver;
+import org.apache.ivy.core.module.descriptor.ExtendsDescriptor;
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
+import org.apache.ivy.core.module.id.ModuleId;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.module.status.StatusManager;
+import org.apache.ivy.core.settings.IvySettings;
+import org.apache.ivy.plugins.IvySettingsAware;
+import org.apache.ivy.plugins.conflict.ConflictManager;
+import org.apache.ivy.plugins.matcher.PatternMatcher;
+import org.apache.ivy.plugins.namespace.Namespace;
+import org.apache.ivy.plugins.parser.ParserSettings;
+import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
+import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.util.FileUtil;
 
-public class DefaultResolutionCacheManager implements ResolutionCacheManager {
+public class DefaultResolutionCacheManager implements ResolutionCacheManager, 
IvySettingsAware {
+    
     private static final String DEFAULT_CACHE_RESOLVED_IVY_PATTERN = 
         "resolved-[organisation]-[module]-[revision].xml";
 
@@ -39,7 +61,9 @@ public class DefaultResolutionCacheManag
     
     private File basedir;
 
-    private String name = "resolution-cache"; 
+    private String name = "resolution-cache";
+
+    private IvySettings settings; 
 
     public DefaultResolutionCacheManager() {
     }
@@ -47,6 +71,10 @@ public class DefaultResolutionCacheManag
     public DefaultResolutionCacheManager(File basedir) {
         setBasedir(basedir);
     }
+    
+    public void setSettings(IvySettings settings) {
+        this.settings = settings;
+    }
 
     public File getResolutionCacheRoot() {
         return basedir;
@@ -110,6 +138,62 @@ public class DefaultResolutionCacheManag
             }
         });
     }
+    
+    public ModuleDescriptor getResolveModuleDescriptor(ModuleRevisionId mrid)
+            throws ParseException, IOException {
+        File ivyFile = getResolvedIvyFileInCache(mrid);
+        if (!ivyFile.exists()) {
+            throw new IllegalStateException("Ivy file not found in cache for " 
+ mrid + "!");
+        }
+
+        Properties paths = new Properties();
+
+        File parentsFile = 
getResolvedIvyPropertiesInCache(ModuleRevisionId.newInstance(mrid, 
mrid.getRevision() + "-parents"));
+        if (parentsFile.exists()) {
+            FileInputStream in = new FileInputStream(parentsFile);
+            paths.load(in);
+            in.close();
+        }
+        
+        ParserSettings pSettings = new CacheParserSettings(settings, paths);
+        
+        URL ivyFileURL = ivyFile.toURI().toURL();
+        return 
XmlModuleDescriptorParser.getInstance().parseDescriptor(pSettings, ivyFileURL, 
false);
+    }
+    
+    public void saveResolvedModuleDescriptor(ModuleDescriptor md) throws 
ParseException, IOException {
+        ModuleRevisionId mrevId = md.getResolvedModuleRevisionId();
+        File ivyFileInCache = getResolvedIvyFileInCache(mrevId);
+        md.toIvyFile(ivyFileInCache);
+        
+        Properties paths = new Properties();
+        saveLocalParents(mrevId, md, ivyFileInCache, paths);
+        
+        if (!paths.isEmpty()) {
+            File parentsFile = 
getResolvedIvyPropertiesInCache(ModuleRevisionId.newInstance(mrevId, 
mrevId.getRevision() + "-parents"));
+            FileOutputStream out = new FileOutputStream(parentsFile);
+            paths.store(out, null);
+            out.close();
+        }
+    }
+    
+    private void saveLocalParents(ModuleRevisionId baseMrevId, 
ModuleDescriptor md, File mdFile, Properties paths) throws ParseException, 
IOException {
+        ExtendsDescriptor[] parents = md.getInheritedDescriptors();
+        for (int i = 0; i < parents.length; i++) {
+            if (!parents[i].isLocal()) {
+                // we store only local parents in the cache!
+                continue;
+            }
+
+            ModuleDescriptor parent = parents[i].getParentMd();
+            ModuleRevisionId pRevId = ModuleRevisionId.newInstance(baseMrevId, 
baseMrevId.getRevision() + "-parent." + paths.size());
+            File parentFile = getResolvedIvyFileInCache(pRevId);
+            parent.toIvyFile(parentFile);
+            
+            paths.setProperty(mdFile.getName() + "|" + 
parents[i].getLocation(), parentFile.getAbsolutePath());
+            saveLocalParents(baseMrevId, parent, parentFile, paths);
+        }
+    }
 
     public String toString() {
         return name;
@@ -118,5 +202,88 @@ public class DefaultResolutionCacheManag
     public void clean() {
         FileUtil.forceDelete(getBasedir());
     }
-
+    
+    private static class CacheParserSettings implements ParserSettings {
+        
+        private ParserSettings delegate;
+        private Map parentPaths;
+        
+        public CacheParserSettings(ParserSettings delegate, Map parentPaths) {
+            this.delegate = delegate;
+            this.parentPaths = parentPaths;
+        }
+
+        public String substitute(String value) {
+            return delegate.substitute(value);
+        }
+
+        public Map substitute(Map strings) {
+            return delegate.substitute(strings);
+        }
+
+        public ResolutionCacheManager getResolutionCacheManager() {
+            return delegate.getResolutionCacheManager();
+        }
+
+        public ConflictManager getConflictManager(String name) {
+            return delegate.getConflictManager(name);
+        }
+
+        public PatternMatcher getMatcher(String matcherName) {
+            return delegate.getMatcher(matcherName);
+        }
+
+        public Namespace getNamespace(String namespace) {
+            return delegate.getNamespace(namespace);
+        }
+
+        public StatusManager getStatusManager() {
+            return delegate.getStatusManager();
+        }
+
+        public RelativeUrlResolver getRelativeUrlResolver() {
+            return new MapURLResolver(parentPaths, 
delegate.getRelativeUrlResolver());
+        }
+
+        public DependencyResolver getResolver(ModuleRevisionId mRevId) {
+            return delegate.getResolver(mRevId);
+        }
+
+        public File resolveFile(String filename) {
+            return delegate.resolveFile(filename);
+        }
+
+        public String getDefaultBranch(ModuleId moduleId) {
+            return delegate.getDefaultBranch(moduleId);
+        }
+
+        public Namespace getContextNamespace() {
+            return delegate.getContextNamespace();
+        }
+    }
+    
+    private static class MapURLResolver extends RelativeUrlResolver {
+        
+        private Map paths;
+        private RelativeUrlResolver delegate;
+        
+        private MapURLResolver(Map paths, RelativeUrlResolver delegate) {
+            this.paths = paths;
+            this.delegate = delegate;
+        }
+
+        public URL getURL(URL context, String url) throws 
MalformedURLException {
+            String path = context.getPath();
+            if (path.indexOf('/') >= 0) {
+                String file = path.substring(path.lastIndexOf('/') + 1);
+                
+                if (paths.containsKey(file + "|" + url)) {
+                    File result = new File(paths.get(file + "|" + 
url).toString());
+                    return result.toURI().toURL();
+                }
+            }
+            
+            return delegate.getURL(context, url);
+        }
+    }
 }

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/ResolutionCacheManager.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/ResolutionCacheManager.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/ResolutionCacheManager.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/cache/ResolutionCacheManager.java
 Thu Oct 11 21:08:27 2012
@@ -18,22 +18,30 @@
 package org.apache.ivy.core.cache;
 
 import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
 
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 
 public interface ResolutionCacheManager {
-    public abstract File getResolutionCacheRoot();
     
-    public abstract File getResolvedIvyFileInCache(ModuleRevisionId mrid);
-
-    public abstract File getResolvedIvyPropertiesInCache(ModuleRevisionId 
mrid);
+    File getResolutionCacheRoot();
+    
+    File getResolvedIvyFileInCache(ModuleRevisionId mrid);
+    
+    File getResolvedIvyPropertiesInCache(ModuleRevisionId mrid);
 
-    public abstract File getConfigurationResolveReportInCache(String 
resolveId, String conf);
+    File getConfigurationResolveReportInCache(String resolveId, String conf);
 
-    public abstract File[] getConfigurationResolveReportsInCache(final String 
resolveId);
+    File[] getConfigurationResolveReportsInCache(final String resolveId);
+    
+    ModuleDescriptor getResolveModuleDescriptor(ModuleRevisionId mrid) throws 
ParseException, IOException;
+    
+    void saveResolvedModuleDescriptor(ModuleDescriptor md) throws 
ParseException, IOException;
     
     /**
      * Cleans the whole cache.
      */
-    public void clean();
+    void clean();
 }

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/deliver/DeliverEngine.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/deliver/DeliverEngine.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/deliver/DeliverEngine.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/deliver/DeliverEngine.java
 Thu Oct 11 21:08:27 2012
@@ -40,6 +40,7 @@ import org.apache.ivy.plugins.parser.xml
 import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
 import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorUpdater;
 import org.apache.ivy.plugins.report.XmlReportParser;
+import org.apache.ivy.plugins.repository.Resource;
 import org.apache.ivy.util.ConfigurationUtils;
 import org.apache.ivy.util.Message;
 import org.xml.sax.SAXException;
@@ -107,27 +108,11 @@ public class DeliverEngine {
         destIvyPattern = settings.substitute(destIvyPattern);
 
         // 1) find the resolved module descriptor in cache
-        File ivyFile = getCache().getResolvedIvyFileInCache(mrid);
-        if (!ivyFile.exists()) {
-            throw new IllegalStateException("ivy file not found in cache for " 
+ mrid
-                    + ": please resolve dependencies before delivering (" + 
ivyFile + ")");
-        }
-        ModuleDescriptor md = null;
-        URL ivyFileURL = null;
-        try {
-            ivyFileURL = ivyFile.toURI().toURL();
-            md = 
XmlModuleDescriptorParser.getInstance().parseDescriptor(settings, ivyFileURL,
-                options.isValidate());
-            
md.setResolvedModuleRevisionId(ModuleRevisionId.newInstance(md.getModuleRevisionId(),
 
-                options.getPubBranch() == null ? mrid.getBranch() : 
options.getPubBranch(), 
-                revision));
-            md.setResolvedPublicationDate(options.getPubdate());
-        } catch (MalformedURLException e) {
-            throw new RuntimeException("malformed url obtained for file " + 
ivyFile, e);
-        } catch (ParseException e) {
-            throw new RuntimeException("bad ivy file in cache for " + mrid
-                    + ": please clean '" + ivyFile + "' and resolve again", e);
-        }
+        ModuleDescriptor md = getCache().getResolveModuleDescriptor(mrid);
+        
md.setResolvedModuleRevisionId(ModuleRevisionId.newInstance(md.getModuleRevisionId(),
 
+            options.getPubBranch() == null ? mrid.getBranch() : 
options.getPubBranch(), 
+            revision));
+        md.setResolvedPublicationDate(options.getPubdate());
 
         // 2) parse resolvedRevisions From properties file
         Map resolvedRevisions = new HashMap(); // Map (ModuleId -> String 
revision)
@@ -136,7 +121,7 @@ public class DeliverEngine {
         File ivyProperties = getCache().getResolvedIvyPropertiesInCache(mrid);
         if (!ivyProperties.exists()) {
             throw new IllegalStateException("ivy properties not found in cache 
for " + mrid
-                    + ": please resolve dependencies before delivering (" + 
ivyFile + ")");
+                    + "; please resolve dependencies before delivering!");
         }
         Properties props = new Properties();
         FileInputStream in = new FileInputStream(ivyProperties);
@@ -225,10 +210,10 @@ public class DeliverEngine {
             if (!resolvedBranches.isEmpty()) {
                 opts = opts.setResolvedBranches(resolvedBranches);
             }
-            XmlModuleDescriptorUpdater.update(ivyFileURL, publishedIvy, opts);
+            Resource res = md.getResource();
+            XmlModuleDescriptorUpdater.update(res.openStream(), res, 
publishedIvy, opts);
         } catch (SAXException ex) {
-            throw new RuntimeException("bad ivy file in cache for " + mrid
-                    + ": please clean '" + ivyFile + "' and resolve again", 
ex);
+            throw new RuntimeException("bad ivy file in cache for " + mrid, 
ex);
         }
 
         Message.verbose("\tdeliver done (" + (System.currentTimeMillis() - 
start) + "ms)");

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultExtendsDescriptor.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultExtendsDescriptor.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultExtendsDescriptor.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultExtendsDescriptor.java
 Thu Oct 11 21:08:27 2012
@@ -24,17 +24,22 @@ import org.apache.ivy.core.module.id.Mod
 
 public class DefaultExtendsDescriptor implements ExtendsDescriptor {
 
-    private ModuleRevisionId parentRevisionId;
-    private ModuleRevisionId resolvedParentRevisionId;
+    private ModuleDescriptor parent;
     private String location;
     private List extendsTypes;
+    private boolean local;
 
-    public DefaultExtendsDescriptor(ModuleRevisionId parentRevisionId,
-                                    ModuleRevisionId resolvedParentRevisionId,
-                                    String location, String[] types) {
-        this.parentRevisionId = parentRevisionId;
-        this.resolvedParentRevisionId = resolvedParentRevisionId;
+    public DefaultExtendsDescriptor(ModuleDescriptor parent,
+            String location, String[] types) {
+        this(parent, location, types, false);
+    }
+    
+    public DefaultExtendsDescriptor(ModuleDescriptor parent,
+                                    String location, String[] types, 
+                                    boolean local) {
+        this.parent = parent;
         this.location = location;
+        this.local = local;
         this.extendsTypes = new ArrayList(types.length);
         for (int i = 0; i < types.length; ++i) {
             extendsTypes.add(types[i]);
@@ -42,11 +47,15 @@ public class DefaultExtendsDescriptor im
     }
 
     public ModuleRevisionId getParentRevisionId() {
-        return parentRevisionId;
+        return parent.getModuleRevisionId();
     }
 
     public ModuleRevisionId getResolvedParentRevisionId() {
-        return resolvedParentRevisionId;
+        return parent.getResolvedModuleRevisionId();
+    }
+    
+    public ModuleDescriptor getParentMd() {
+        return parent;
     }
 
     public String getLocation() {
@@ -76,4 +85,8 @@ public class DefaultExtendsDescriptor im
     public boolean areDependenciesInherited() {
         return isAllInherited() || extendsTypes.contains("dependencies");
     }
+    
+    public boolean isLocal() {
+        return local;
+    }
 }

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
 Thu Oct 11 21:08:27 2012
@@ -153,9 +153,15 @@ public class DefaultModuleDescriptor imp
 
         ExtendsDescriptor[] ed = md.getInheritedDescriptors();
         for (int i = 0; i < ed.length; ++i) {
-            ModuleRevisionId mrid = t.transform(ed[i].getParentRevisionId());
-            ModuleRevisionId resolvedMrid = 
t.transform(ed[i].getResolvedParentRevisionId());
-            nmd.inheritedDescriptors.add(new DefaultExtendsDescriptor(mrid, 
resolvedMrid, ed[i]
+            ModuleDescriptor parentMd = ed[i].getParentMd();
+            DefaultModuleDescriptor parentNmd = new 
DefaultModuleDescriptor(parentMd.getParser(), parentMd.getResource());
+            parentNmd.revId = t.transform(parentMd.getModuleRevisionId());
+            parentNmd.resolvedRevId = 
t.transform(parentMd.getResolvedModuleRevisionId());
+            parentNmd.status = parentMd.getStatus();
+            parentNmd.publicationDate = parentMd.getPublicationDate();
+            parentNmd.resolvedPublicationDate = 
parentMd.getResolvedPublicationDate();
+            
+            nmd.inheritedDescriptors.add(new 
DefaultExtendsDescriptor(parentNmd, ed[i]
                     .getLocation(), ed[i].getExtendsTypes()));
         }
 

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/ExtendsDescriptor.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/ExtendsDescriptor.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/ExtendsDescriptor.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/module/descriptor/ExtendsDescriptor.java
 Thu Oct 11 21:08:27 2012
@@ -31,6 +31,8 @@ public interface ExtendsDescriptor {
      * {@link 
org.apache.ivy.core.module.descriptor.ModuleDescriptor#getResolvedModuleRevisionId()}
 }
      */
     public ModuleRevisionId getResolvedParentRevisionId();
+    
+    public ModuleDescriptor getParentMd();
 
     /**
      * If there is an explicit path to check for the parent descriptor, return 
it.
@@ -60,4 +62,6 @@ public interface ExtendsDescriptor {
 
     /** @return true if parent dependencies are inherited */
     public boolean areDependenciesInherited();
+    
+    public boolean isLocal();
 }

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/publish/PublishEngine.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/publish/PublishEngine.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/publish/PublishEngine.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/publish/PublishEngine.java
 Thu Oct 11 21:08:27 2012
@@ -90,31 +90,21 @@ public class PublishEngine {
         }
         ModuleRevisionId pubmrid = ModuleRevisionId.newInstance(
             mrid, options.getPubBranch(), options.getPubrevision());
-        File ivyFile;
+        
+        // let's find the resolved module descriptor
+        ModuleDescriptor md = null;
         if (options.getSrcIvyPattern() != null) {
-            ivyFile = 
settings.resolveFile(IvyPatternHelper.substitute(options.getSrcIvyPattern(),
-                DefaultArtifact.newIvyArtifact(pubmrid, new Date())));
+            File ivyFile = 
settings.resolveFile(IvyPatternHelper.substitute(options.getSrcIvyPattern(),
+                    DefaultArtifact.newIvyArtifact(pubmrid, new Date())));
             if (!ivyFile.exists()) {
                 throw new IllegalArgumentException("ivy file to publish not 
found for " + mrid
                         + ": call deliver before (" + ivyFile + ")");
             }
-        } else {
-            ResolutionCacheManager cacheManager = 
settings.getResolutionCacheManager();
-            ivyFile = cacheManager.getResolvedIvyFileInCache(mrid);
-            if (!ivyFile.exists()) {
-                throw new IllegalStateException("ivy file not found in cache 
for " + mrid
-                        + ": please resolve dependencies before publishing (" 
+ ivyFile + ")");
-            }
-        }
 
-        // let's find the resolved module descriptor
-        ModuleDescriptor md = null;
-        URL ivyFileURL = null;
-        try {
-            ivyFileURL = ivyFile.toURI().toURL();
-            md = 
XmlModuleDescriptorParser.getInstance().parseDescriptor(settings, ivyFileURL,
-                false);
-            if (options.getSrcIvyPattern() != null) {
+            URL ivyFileURL = ivyFile.toURI().toURL();
+            try {
+                md = 
XmlModuleDescriptorParser.getInstance().parseDescriptor(settings, ivyFileURL, 
false);
+                
                 if (options.isUpdate()) {
                     File tmp = File.createTempFile("ivy", ".xml");
                     tmp.deleteOnExit();
@@ -154,13 +144,17 @@ public class PublishEngine {
                             + md.getModuleRevisionId().getRevision()
                             + "). Use forcedeliver or update.");
                 }
-            } else {
-                md.setResolvedModuleRevisionId(pubmrid);
+            } catch (ParseException e) {
+                throw new IllegalStateException("bad ivy file for " + mrid + 
": " + ivyFile + ": " + e);
+            }
+        } else {
+            ResolutionCacheManager cacheManager = 
settings.getResolutionCacheManager();
+            try {
+                md = cacheManager.getResolveModuleDescriptor(mrid);
+            } catch (ParseException e) {
+                throw new IllegalStateException("bad ivy file in cache for " + 
mrid + ": " + e);
             }
-        } catch (MalformedURLException e) {
-            throw new RuntimeException("malformed url obtained for file " + 
ivyFile);
-        } catch (ParseException e) {
-            throw new IllegalStateException("bad ivy file for " + mrid + ": " 
+ ivyFile + ": " + e);
+            md.setResolvedModuleRevisionId(pubmrid);
         }
 
         DependencyResolver resolver = settings.getResolver(resolverName);

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/resolve/ResolveEngine.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/resolve/ResolveEngine.java
 Thu Oct 11 21:08:27 2012
@@ -240,13 +240,10 @@ public class ResolveEngine {
 
             // produce resolved ivy file and ivy properties in cache
             ResolutionCacheManager cacheManager = 
settings.getResolutionCacheManager();
-            File ivyFileInCache = cacheManager.getResolvedIvyFileInCache(md
-                    .getResolvedModuleRevisionId());
-            md.toIvyFile(ivyFileInCache);
+            cacheManager.saveResolvedModuleDescriptor(md);
 
             // we store the resolved dependencies revisions and statuses per 
asked dependency
-            // revision id,
-            // for direct dependencies only.
+            // revision id, for direct dependencies only.
             // this is used by the deliver task to resolve dynamic revisions 
to static ones
             File ivyPropertiesInCache = 
cacheManager.getResolvedIvyPropertiesInCache(
                         md.getResolvedModuleRevisionId());
@@ -324,7 +321,7 @@ public class ResolveEngine {
             FileOutputStream out = new FileOutputStream(ivyPropertiesInCache);
             props.store(out, md.getResolvedModuleRevisionId() + " resolved 
revisions");
             out.close();
-            Message.verbose("\tresolved ivy file produced in " + 
ivyFileInCache);
+            Message.verbose("\tresolved ivy file produced in cache");
 
             report.setResolveTime(System.currentTimeMillis() - start);
 

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java
 Thu Oct 11 21:08:27 2012
@@ -19,7 +19,6 @@ package org.apache.ivy.core.retrieve;
 
 import java.io.File;
 import java.io.IOException;
-import java.net.URL;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -48,10 +47,7 @@ import org.apache.ivy.core.module.id.Mod
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.report.ArtifactDownloadReport;
 import org.apache.ivy.core.resolve.ResolveOptions;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
 import org.apache.ivy.plugins.report.XmlReportParser;
-import org.apache.ivy.plugins.repository.url.URLResource;
 import org.apache.ivy.util.FileUtil;
 import org.apache.ivy.util.Message;
 
@@ -220,14 +216,8 @@ public class RetrieveEngine {
         String[] confs = options.getConfs();
         if (confs == null || (confs.length == 1 && "*".equals(confs[0]))) {
             try {
-                File ivyFile = getCache().getResolvedIvyFileInCache(mrid);
-                Message.verbose("no explicit confs given for retrieve, using 
ivy file: " + ivyFile);
-                URL ivySource = ivyFile.toURI().toURL();
-                URLResource res = new URLResource(ivySource);
-                ModuleDescriptorParser parser = 
ModuleDescriptorParserRegistry.getInstance()
-                        .getParser(res);
-                Message.debug("using " + parser + " to parse " + ivyFile);
-                ModuleDescriptor md = parser.parseDescriptor(settings, 
ivySource, false);
+                ModuleDescriptor md = 
getCache().getResolveModuleDescriptor(mrid);
+                Message.verbose("no explicit confs given for retrieve, using 
ivy file: " + md.getResource().getName());
                 confs = md.getConfigurationsNames();
                 options.setConfs(confs);
             } catch (IOException e) {

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/settings/IvySettings.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/settings/IvySettings.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/settings/IvySettings.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/core/settings/IvySettings.java
 Thu Oct 11 21:08:27 2012
@@ -1252,6 +1252,7 @@ public class IvySettings implements Sort
         if (resolutionCacheManager == null) {
             resolutionCacheManager 
                 = new 
DefaultResolutionCacheManager(getDefaultResolutionCacheBasedir());
+            init(resolutionCacheManager);
         }
         return resolutionCacheManager;
     }

Modified: 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java?rev=1397312&r1=1397311&r2=1397312&view=diff
==============================================================================
--- 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java
 (original)
+++ 
ant/ivy/core/branches/2.3.x/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java
 Thu Oct 11 21:08:27 2012
@@ -66,11 +66,12 @@ import org.apache.ivy.plugins.namespace.
 import org.apache.ivy.plugins.namespace.Namespace;
 import org.apache.ivy.plugins.parser.AbstractModuleDescriptorParser;
 import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
+import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
 import org.apache.ivy.plugins.parser.ParserSettings;
 import org.apache.ivy.plugins.repository.Resource;
+import org.apache.ivy.plugins.repository.file.FileResource;
 import org.apache.ivy.plugins.repository.url.URLResource;
 import org.apache.ivy.plugins.resolver.DependencyResolver;
-import org.apache.ivy.plugins.resolver.FileSystemResolver;
 import org.apache.ivy.util.FileUtil;
 import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.Message;
@@ -87,8 +88,6 @@ public class XmlModuleDescriptorParser e
     static final String[] DEPENDENCY_REGULAR_ATTRIBUTES = new String[] {"org", 
"name", "branch",
             "branchConstraint", "rev", "revConstraint", "force", "transitive", 
"changing", "conf"};
     
-    public static final String MODULE_INHERITANCE_REPOSITORY = 
"module-inheritance-repository";
-
     private static final XmlModuleDescriptorParser INSTANCE = new 
XmlModuleDescriptorParser();
 
     public static XmlModuleDescriptorParser getInstance() {
@@ -403,13 +402,23 @@ public class XmlModuleDescriptorParser e
             ModuleId parentMid = new ModuleId(parentOrganisation, 
parentModule);
             ModuleRevisionId parentMrid = new ModuleRevisionId(parentMid, 
parentRevision);
 
-
             //check on filesystem based on location attribute (for dev ONLY)
+            boolean local = false;
             try {
-                DependencyResolver parentResolver = 
checkParentModuleOnFilesystem(location, parentMrid);
-                if (parentResolver != null) {
-                    parent = 
resolveParentFromModuleInheritanceRepository(parentResolver, parentMrid);
+                parent = parseParentModuleOnFilesystem(location);
+                if (parent != null) {
+                    ModuleId foundMid = 
parent.getResolvedModuleRevisionId().getModuleId();
+                    if (!foundMid.equals(parentMid)) {
+                        // the filesystem contains a parent module with 
different organisation
+                        // or module name; ignore that parent module
+                        Message.info("Found a parent module with unexpected 
ModuleRevisionId at source location " 
+                                + location + "! Expected: " + parentMid + ". 
Found: " + foundMid 
+                                + ". This parent module will be ignored.");
+                        parent = null;
+                    }
                 }
+                
+                local = parent != null;
             } catch (IOException e) {
                 Message.warn("Unable to parse included ivy file " + location + 
": " 
                     + e.getMessage());
@@ -431,10 +440,10 @@ public class XmlModuleDescriptorParser e
             }
 
             DefaultExtendsDescriptor ed = new DefaultExtendsDescriptor(
-                    parent.getModuleRevisionId(),
-                    parent.getResolvedModuleRevisionId(),
+                    parent,
                     attributes.getValue("location"),
-                    (String[]) extendTypes.toArray(new 
String[extendTypes.size()]));
+                    (String[]) extendTypes.toArray(new 
String[extendTypes.size()]),
+                    local);
             getMd().addInheritedDescriptor(ed);
 
             mergeWithOtherModuleDescriptor(extendTypes, parent);
@@ -591,21 +600,19 @@ public class XmlModuleDescriptorParser e
         }
 
         /**
-         * Check if parent module is reachable using location attribute (for 
dev purpose).
-         * If parent module is reachable it will be registered in module 
inheritance repository 
+         * Returns the parent module using the location attribute (for dev 
purpose).
          * @param location a given location 
-         * @param parentMrid 
          * @throws IOException
          * @throws ParseException 
          */
-        protected DependencyResolver checkParentModuleOnFilesystem(String 
location, ModuleRevisionId parentMrid) throws IOException {
+        private ModuleDescriptor parseParentModuleOnFilesystem(String 
location) throws IOException, ParseException {
             if (!"file".equals(descriptorURL.getProtocol())) {
                 return null;
             }
             
             File file = new File(location);
             if (!file.isAbsolute()) {
-                URL url = new URL(descriptorURL, location);
+                URL url = 
settings.getRelativeUrlResolver().getURL(descriptorURL, location);
                 try {
                     file = new File(new URI(url.toExternalForm()));
                 } catch (URISyntaxException e) {
@@ -619,11 +626,9 @@ public class XmlModuleDescriptorParser e
                 return null;
             }
             
-            FileSystemResolver parentModuleResolver = new FileSystemResolver();
-            
parentModuleResolver.setName(getModuleInheritanceRepositoryParentResolverName(parentMrid));
-            parentModuleResolver.addIvyPattern(file.getAbsolutePath());
-            
parentModuleResolver.setSettings(IvyContext.getContext().getSettings());
-            return parentModuleResolver;
+            FileResource res = new FileResource(null, file);
+            ModuleDescriptorParser parser = 
ModuleDescriptorParserRegistry.getInstance().getParser(res);
+            return parser.parseDescriptor(getSettings(), file.toURL(), res, 
isValidate());
         }
 
         /**
@@ -654,34 +659,6 @@ public class XmlModuleDescriptorParser e
 
         }
 
-        /**
-         * Resolve parent module from module inheritance repository
-         * @param parentMrid a given {@link ModuleRevisionId} to find
-         * @return a {@link ModuleDescriptor} if found. Return null if no 
{@link ModuleDescriptor} was found
-         * @throws ParseException
-         */
-        protected ModuleDescriptor 
resolveParentFromModuleInheritanceRepository(DependencyResolver resolver, 
ModuleRevisionId parentMrid) throws ParseException {
-            Message.debug("Trying to resolve included ivy file from module 
inheritance repository " );
-            DependencyDescriptor dd = new 
DefaultDependencyDescriptor(parentMrid, true);
-            ResolveEngine engine = 
IvyContext.getContext().getIvy().getResolveEngine();
-            ResolveOptions options = new ResolveOptions();
-            //not sure we need to download parent module 
-            options.setDownload(false);
-            ResolveData data = new ResolveData(engine, options);
-
-            dd = NameSpaceHelper.toSystem(dd, 
getSettings().getContextNamespace());
-            ResolvedModuleRevision otherModule = resolver.getDependency(dd, 
data);
-            if (otherModule != null) {
-                return otherModule.getDescriptor();
-            } else {
-                return null;
-            }
-        }
-        
-        private static String 
getModuleInheritanceRepositoryParentResolverName(ModuleRevisionId parentMrid) {
-            return MODULE_INHERITANCE_REPOSITORY + "-" + parentMrid.toString();
-        }
-
         protected void publicationsStarted(Attributes attributes) {
             state = State.PUB;
             artifactsDeclared = true;


Reply via email to