Index: src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java =================================================================== --- src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java (revision 1515361) +++ src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java (working copy) @@ -23,11 +23,14 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.ParseException; import java.util.Date; import java.util.Enumeration; +import java.util.Iterator; import java.util.Map; import java.util.regex.Pattern; import java.util.zip.ZipEntry; @@ -39,6 +42,7 @@ import org.apache.ivy.core.module.descriptor.DefaultArtifact; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; +import org.apache.ivy.core.module.id.ArtifactRevisionId; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.module.id.ModuleRules; import org.apache.ivy.core.report.ArtifactDownloadReport; @@ -481,6 +485,9 @@ cdf.save(); } + private static final Pattern ARTIFACT_KEY_PATTERN = + Pattern.compile(".*:(.*)#(.*)#(.*)#(.*)\\.location"); + public ArtifactOrigin getSavedArtifactOrigin(Artifact artifact) { ModuleRevisionId mrid = artifact.getModuleRevisionId(); if (!lockMetadataArtifact(mrid)) { @@ -501,6 +508,48 @@ return ArtifactOrigin.unkwnown(artifact); } + // if the origin artifact has another extension (e.g. .pom) then make a synthetic + // origin artifact for it + if (!location.endsWith("." + artifact.getExt())) { + // try to find other cached artifact info with same location. This must be the + // origin. We must parse the key as we do not know for sure what the original + // artifact is named. + Iterator it = cdf.entrySet().iterator(); + String ownLocationKey = getLocationKey(artifact); + while (it.hasNext()) { + Map.Entry entry = (Map.Entry) it.next(); + if (entry.getValue().equals(location) + && !ownLocationKey.equals(entry.getKey())) { + // found a match, key is artifact:[name]#[type]#[ext]#[hashcode].location + java.util.regex.Matcher m = ARTIFACT_KEY_PATTERN.matcher( + (String) entry.getKey()); + if (m.matches()) { + String origName = m.group(1); + String origType = m.group(2); + String origExt = m.group(3); + + // first check: the type should end in .original + if (!origType.endsWith(".original")) { + continue; + } + + ArtifactRevisionId originArtifactId = ArtifactRevisionId.newInstance( + artifact.getModuleRevisionId(), origName, origType, origExt); + // second check: verify the hashcode of the cached artifact + if (m.group(4).equals("" + originArtifactId.hashCode())) { + try { + artifact = new DefaultArtifact(originArtifactId, + artifact.getPublicationDate(), new URL(location), true); + } catch (MalformedURLException e) { + Message.debug(e); + } + } + break; + } + } + } + } + ArtifactOrigin origin = new ArtifactOrigin(artifact, isLocal, location); if (lastChecked != null) { origin.setLastChecked(Long.valueOf(lastChecked)); @@ -675,6 +724,17 @@ madr.setSize(ivyFile.length()); madr.setArtifactOrigin( getSavedArtifactOrigin(depMD.getMetadataArtifact())); + if (madr.getArtifactOrigin().isExists()) { + if (madr.getArtifactOrigin().isLocal() + && madr.getArtifactOrigin().getArtifact().getUrl() != null) { + madr.setOriginalLocalFile( + new File(madr.getArtifactOrigin().getArtifact().getUrl().toURI())); + } else { + // find locally cached file + madr.setOriginalLocalFile( + getArchiveFileInCache(madr.getArtifactOrigin().getArtifact())); + } + } return new ResolvedModuleRevision( resolver, artResolver, depMD, madr); } else { Index: src/java/org/apache/ivy/core/install/InstallEngine.java =================================================================== --- src/java/org/apache/ivy/core/install/InstallEngine.java (revision 1515361) +++ src/java/org/apache/ivy/core/install/InstallEngine.java (working copy) @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.Date; +import org.apache.ivy.core.cache.ArtifactOrigin; import org.apache.ivy.core.module.descriptor.Configuration; import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; @@ -29,6 +30,7 @@ import org.apache.ivy.core.module.id.ModuleId; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.ArtifactDownloadReport; +import org.apache.ivy.core.report.MetadataArtifactDownloadReport; import org.apache.ivy.core.report.ResolveReport; import org.apache.ivy.core.resolve.DownloadOptions; import org.apache.ivy.core.resolve.IvyNode; @@ -153,11 +155,26 @@ } // publish metadata - File localIvyFile = dependencies[i] - .getModuleRevision().getReport().getLocalFile(); + MetadataArtifactDownloadReport artifactDownloadReport = dependencies[i] + .getModuleRevision().getReport(); + File localIvyFile = artifactDownloadReport.getLocalFile(); toResolver.publish( depmd.getMetadataArtifact(), localIvyFile, options.isOverwrite()); + if (artifactDownloadReport.getArtifactOrigin() != null + && artifactDownloadReport.getArtifactOrigin().isExists() + && !ArtifactOrigin.isUnknown(artifactDownloadReport.getArtifactOrigin()) + && artifactDownloadReport.getArtifactOrigin().getArtifact() != null + && artifactDownloadReport.getArtifactOrigin().getArtifact() + .getType().endsWith(".original") + && !artifactDownloadReport.getArtifactOrigin().getArtifact() + .getType().equals(depmd.getMetadataArtifact().getType()+".original")) { + // publish original metadata artifact, too, as it has a different type + toResolver.publish(artifactDownloadReport.getArtifactOrigin().getArtifact(), + artifactDownloadReport.getOriginalLocalFile(), + options.isOverwrite()); + } + // end module publish toResolver.commitPublishTransaction(); successfullyPublished = true; Index: test/repositories/ivysettings.xml =================================================================== --- test/repositories/ivysettings.xml (revision 1515361) +++ test/repositories/ivysettings.xml (working copy) @@ -35,6 +35,8 @@ + Index: test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java =================================================================== --- test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java (revision 1515361) +++ test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java (working copy) @@ -52,7 +52,11 @@ cacheManager.setBasedir(f); artifact = createArtifact("org", "module", "rev", "name", "type", "ext"); - origin = new ArtifactOrigin(artifact, true, "/some/where"); + + Artifact originArtifact = createArtifact("org", "module", "rev", "name", "pom.original", "pom"); + origin = new ArtifactOrigin(originArtifact, true, "file:/some/where.pom"); + + cacheManager.saveArtifactOrigin(originArtifact, origin); cacheManager.saveArtifactOrigin(artifact, origin); } @@ -66,6 +70,7 @@ public void testArtifactOrigin() { ArtifactOrigin found = cacheManager.getSavedArtifactOrigin(artifact); assertEquals(origin, found); + assertEquals("pom", found.getArtifact().getExt()); artifact = createArtifact("org", "module", "rev", "name", "type2", "ext"); found = cacheManager.getSavedArtifactOrigin(artifact); Index: test/java/org/apache/ivy/core/install/InstallTest.java =================================================================== --- test/java/org/apache/ivy/core/install/InstallTest.java (revision 1515361) +++ test/java/org/apache/ivy/core/install/InstallTest.java (working copy) @@ -23,6 +23,7 @@ import org.apache.ivy.Ivy; import org.apache.ivy.core.module.id.ModuleRevisionId; +import org.apache.ivy.core.report.ResolveReport; import org.apache.ivy.plugins.matcher.PatternMatcher; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Delete; @@ -52,6 +53,20 @@ assertFalse(new File("build/test/install/orgfailure/modfailure/modfailure-1.0.jar").exists()); } + public void testMaven() throws Exception { + Ivy ivy = Ivy.newInstance(); + ivy.configure(new File("test/repositories/ivysettings.xml")); + + ResolveReport rr = ivy.install(ModuleRevisionId.newInstance("org.apache", "test", "1.0"), ivy.getSettings() + .getDefaultResolver().getName(), "install", new InstallOptions()); + + assertTrue(new File("build/test/install/org.apache/test/ivy-1.0.xml").exists()); + assertTrue(new File("build/test/install/org.apache/test/test-1.0.jar").exists()); + + // the original descriptor is installed, too + assertTrue(new File("build/test/install/org.apache/test/test-1.0.pom").exists()); + } + public void testNoValidate() throws Exception { Ivy ivy = Ivy.newInstance(); ivy.configure(new File("test/repositories/ivysettings.xml"));