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"));