You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2009/04/28 12:15:47 UTC

svn commit: r769320 - in /ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse: CHANGES.txt src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java

Author: hibou
Date: Tue Apr 28 10:15:47 2009
New Revision: 769320

URL: http://svn.apache.org/viewvc?rev=769320&view=rev
Log:
IVYDE-176: on refresh, it will try to get further metadata from the cache to attach the sources

Modified:
    ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/CHANGES.txt
    ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java

Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/CHANGES.txt?rev=769320&r1=769319&r2=769320&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/CHANGES.txt (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/CHANGES.txt Tue Apr 28 10:15:47 2009
@@ -32,6 +32,7 @@
 - FIX: Error messages when setting path to ivy settings file covers what is being typed in (IVYDE-172)
 - FIX: ResolveAllAction does not resolve multiple IvyDE containers in a single project (IVYDE-175)
 - FIX: The sources/javadocs are not added for dependencies which don't have a fixed revision (IVYDE-174)
+- FIX: Refresh action is detaching javadoc and sources (IVYDE-176)
 
   version 2.0.0 beta1
 ==========================

Modified: ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java?rev=769320&r1=769319&r2=769320&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java (original)
+++ ant/ivy/ivyde/trunk/org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java Tue Apr 28 10:15:47 2009
@@ -25,7 +25,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -43,17 +42,21 @@
 import org.apache.ivy.core.event.resolve.EndResolveDependencyEvent;
 import org.apache.ivy.core.event.resolve.StartResolveDependencyEvent;
 import org.apache.ivy.core.module.descriptor.Artifact;
+import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.report.ArtifactDownloadReport;
 import org.apache.ivy.core.report.ResolveReport;
 import org.apache.ivy.core.resolve.DownloadOptions;
 import org.apache.ivy.core.resolve.IvyNode;
+import org.apache.ivy.core.resolve.ResolveData;
 import org.apache.ivy.core.resolve.ResolveOptions;
+import org.apache.ivy.core.resolve.ResolvedModuleRevision;
 import org.apache.ivy.core.retrieve.RetrieveOptions;
 import org.apache.ivy.plugins.report.XmlReportParser;
 import org.apache.ivy.plugins.repository.TransferEvent;
 import org.apache.ivy.plugins.repository.TransferListener;
+import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.util.Message;
 import org.apache.ivy.util.filter.ArtifactTypeFilter;
 import org.apache.ivyde.eclipse.IvyDEException;
@@ -172,11 +175,11 @@
         }
     }
 
-    private Map/* <ModuleRevisionId, IvyNode> */dependenciesAsMap(ResolveReport r) {
+    private Map/* <ModuleRevisionId, Artifact[]> */getArtifactsByDependency(ResolveReport r) {
         Map result = new HashMap();
         for (Iterator it = r.getDependencies().iterator(); it.hasNext();) {
             IvyNode node = (IvyNode) it.next();
-            result.put(node.getResolvedId(), node);
+            result.put(node.getResolvedId(), node.getDescriptor().getAllArtifacts());
         }
         return result;
     }
@@ -200,7 +203,7 @@
             return new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR, e.getMessage(), e);
         } catch (Throwable e) {
             return new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR, "Unexpected error ["
-                    + e.getClass().getCanonicalName() + "]: " + e.getMessage(), e);
+                    + e.getClass().getName() + "]: " + e.getMessage(), e);
         } finally {
             Thread.currentThread().setContextClassLoader(old);
         }
@@ -224,7 +227,7 @@
                     Thread.currentThread().setContextClassLoader(
                         IvyResolveJob.class.getClassLoader());
                     try {
-                        Map/* <ModuleRevisionId, IvyNode> */dependencies = Collections.EMPTY_MAP;
+                        Map/* <ModuleRevisionId, Artifact[]> */artifactsByDependency = new HashMap();
                         Set configurations = new HashSet();
                         configurations.addAll(conf.getConfs());
                         if (conf.getInheritedDoRetrieve()) {
@@ -257,6 +260,7 @@
                                         parser.parse(report);
                                         all.addAll(Arrays.asList(parser.getArtifactReports()));
                                         resolved = true;
+                                        findAllArtifactOnRefresh(parser, artifactsByDependency);
                                     } catch (ParseException e) {
                                         Message.info("\n\nIVYDE: Error while parsing the report "
                                                 + report
@@ -276,7 +280,7 @@
                                     ResolveReport r = ivy.resolve(md, resolveOption);
                                     all.addAll(Arrays.asList(r.getArtifactsReports(null, false)));
                                     confs = r.getConfigurations();
-                                    dependencies = dependenciesAsMap(r);
+                                    artifactsByDependency.putAll(getArtifactsByDependency(r));
                                     problemMessages.addAll(r.getAllProblemMessages());
                                     maybeRetrieve(md);
 
@@ -293,7 +297,7 @@
                                 false)));
                             confs = report.getConfigurations();
 
-                            dependencies = dependenciesAsMap(report);
+                            artifactsByDependency.putAll(getArtifactsByDependency(report));
 
                             if (monitor.isCanceled()) {
                                 status[0] = Status.CANCEL_STATUS;
@@ -305,7 +309,7 @@
 
                         warnIfDuplicates(all);
 
-                        classpathEntries[0] = artifacts2ClasspathEntries(all, dependencies);
+                        classpathEntries[0] = artifacts2ClasspathEntries(all, artifactsByDependency);
                     } catch (ParseException e) {
                         String errorMsg = "Error while parsing the ivy file " + conf.ivyXmlPath
                                 + "\n" + e.getMessage();
@@ -378,6 +382,36 @@
         }
     }
 
+    /**
+     * Populate the map of artifact. The map should be populated by metadata in cache as this is
+     * called in the refresh process.
+     * 
+     * @param parser
+     * @param artifactsByDependency
+     * @throws ParseException
+     */
+    private void findAllArtifactOnRefresh(XmlReportParser parser, Map/*
+                                                                      * <ModuleRevisionId,
+                                                                      * Artifact[]>
+                                                                      */artifactsByDependency)
+            throws ParseException {
+        ModuleRevisionId[] dependencyMrdis = parser.getDependencyRevisionIds();
+        for (int iDep = 0; iDep < dependencyMrdis.length; iDep++) {
+            DependencyResolver depResolver = ivy.getSettings().getResolver(dependencyMrdis[iDep]);
+            DefaultDependencyDescriptor depDescriptor = new DefaultDependencyDescriptor(
+                    dependencyMrdis[iDep], false);
+            ResolveOptions options = new ResolveOptions();
+            options.setRefresh(true);
+            options.setUseCacheOnly(true);
+            ResolvedModuleRevision dependency = depResolver.getDependency(depDescriptor,
+                new ResolveData(ivy.getResolveEngine(), options));
+            if (dependency != null) {
+                artifactsByDependency.put(dependencyMrdis[iDep], dependency.getDescriptor()
+                        .getAllArtifacts());
+            }
+        }
+    }
+
     private void setResolveStatus(IStatus status) {
         if (conf.javaProject != null) {
             IFile ivyFile = conf.javaProject.getProject().getFile(conf.ivyXmlPath);
@@ -471,10 +505,8 @@
         }
     }
 
-    private IClasspathEntry[] artifacts2ClasspathEntries(Collection all, Map/*
-                                                                             * <ModuleRevisionId,
-                                                                             * IvyNode>
-                                                                             */dependencies) {
+    private IClasspathEntry[] artifacts2ClasspathEntries(Collection all,
+            Map/* <ModuleRevisionId, Artifact[]> */artifactsByDependency) {
         IClasspathEntry[] classpathEntries;
         Collection paths = new LinkedHashSet();
 
@@ -486,8 +518,8 @@
                 paths.add(JavaCore.newProjectEntry(new Path(artifact.getName()), true));
             } else if (artifact.getLocalFile() != null && accept(artifact.getArtifact())) {
                 Path classpathArtifact = new Path(artifact.getLocalFile().getAbsolutePath());
-                Path sourcesArtifact = getSourcesArtifactPath(artifact, all, dependencies);
-                Path javadocArtifact = getJavadocArtifactPath(artifact, all, dependencies);
+                Path sourcesArtifact = getSourcesArtifactPath(artifact, all, artifactsByDependency);
+                Path javadocArtifact = getJavadocArtifactPath(artifact, all, artifactsByDependency);
                 paths.add(JavaCore.newLibraryEntry(classpathArtifact, getSourceAttachment(
                     classpathArtifact, sourcesArtifact), getSourceAttachmentRoot(classpathArtifact,
                     sourcesArtifact), null, getExtraAttribute(classpathArtifact, javadocArtifact),
@@ -501,7 +533,7 @@
     }
 
     private Path getSourcesArtifactPath(ArtifactDownloadReport adr, Collection all,
-            Map/* <ModuleRevisionId, IvyNode> */dependencies) {
+            Map/* <ModuleRevisionId, Artifact[]> */artifactsByDependency) {
         Artifact artifact = adr.getArtifact();
         monitor.subTask("searching sources for " + artifact);
         for (Iterator iter = all.iterator(); iter.hasNext();) {
@@ -516,9 +548,8 @@
         }
         // we haven't found source artifact in resolved artifacts,
         // let's look in the module declaring the artifact
-        IvyNode node = (IvyNode) dependencies.get(artifact.getId().getModuleRevisionId());
-        if (node != null) {
-            Artifact[] artifacts = node.getDescriptor().getAllArtifacts();
+        Artifact[] artifacts = (Artifact[]) artifactsByDependency.get(artifact.getId().getModuleRevisionId());
+        if (artifacts != null) {
             for (int i = 0; i < artifacts.length; i++) {
                 Artifact metaArtifact = artifacts[i];
                 if (isSourceArtifactName(artifact.getName(), metaArtifact.getName())
@@ -536,7 +567,7 @@
     }
 
     private Path getJavadocArtifactPath(ArtifactDownloadReport adr, Collection all,
-            Map/* <ModuleRevisionId, IvyNode> */dependencies) {
+            Map/* <ModuleRevisionId, Artifact[]> */artifactsByDependency) {
         Artifact artifact = adr.getArtifact();
         monitor.subTask("searching javadoc for " + artifact);
         for (Iterator iter = all.iterator(); iter.hasNext();) {
@@ -551,9 +582,8 @@
         }
         // we haven't found javadoc artifact in resolved artifacts,
         // let's look in the module declaring the artifact
-        IvyNode node = (IvyNode) dependencies.get(artifact.getId().getModuleRevisionId());
-        if (node != null) {
-            Artifact[] artifacts = node.getDescriptor().getAllArtifacts();
+        Artifact[] artifacts = (Artifact[]) artifactsByDependency.get(artifact.getId().getModuleRevisionId());
+        if (artifacts != null) {
             for (int i = 0; i < artifacts.length; i++) {
                 Artifact metaArtifact = artifacts[i];
                 if (isJavadocArtifactName(artifact.getName(), metaArtifact.getName())