You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by xa...@apache.org on 2007/12/05 03:51:03 UTC

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

Author: xavier
Date: Tue Dec  4 18:51:02 2007
New Revision: 601194

URL: http://svn.apache.org/viewvc?rev=601194&view=rev
Log:
IMPROVE: Simplify the resolve process (IVYDE-64) (thanks to Nicolas Lalevée) 

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

Modified: ant/ivy/ivyde/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/CHANGES.txt?rev=601194&r1=601193&r2=601194&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/CHANGES.txt (original)
+++ ant/ivy/ivyde/trunk/CHANGES.txt Tue Dec  4 18:51:02 2007
@@ -7,6 +7,7 @@
 
 - IMPROVE: enable 'Resolve all' action (IVYDE-42) (thanks to Thomas FRIOL)
 - IMPROVE: Support javadoc and sources even in modules where they are not declared (IVYDE-46)
+- IMPROVE: Simplify the resolve process (IVYDE-64) (thanks to Nicolas Lalevée) 
 
 - FIX: "Add Ivy library" not working in eclipse 3.3 (IVYDE-57)
 - FIX: Automatic javadoc attachment is not working (IVYDE-55)

Modified: ant/ivy/ivyde/trunk/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathContainer.java
URL: http://svn.apache.org/viewvc/ant/ivy/ivyde/trunk/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathContainer.java?rev=601194&r1=601193&r2=601194&view=diff
==============================================================================
--- ant/ivy/ivyde/trunk/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathContainer.java (original)
+++ ant/ivy/ivyde/trunk/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathContainer.java Tue Dec  4 18:51:02 2007
@@ -1,8 +1,6 @@
 package org.apache.ivyde.eclipse.cpcontainer;
 
-
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -29,7 +27,6 @@
 import org.apache.ivy.core.module.descriptor.Artifact;
 import org.apache.ivy.core.module.descriptor.DefaultArtifact;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.module.id.ModuleId;
 import org.apache.ivy.core.report.ResolveReport;
 import org.apache.ivy.core.resolve.ResolveOptions;
 import org.apache.ivy.core.retrieve.RetrieveOptions;
@@ -59,10 +56,8 @@
 import org.eclipse.jdt.internal.core.JavaModelManager;
 import org.eclipse.swt.widgets.Display;
 
-
 /**
- *   
- * 
+ * Eclipse classpath container that will contain the ivy resolved entries.
  */
 public class IvyClasspathContainer implements IClasspathContainer {
 
@@ -145,7 +140,7 @@
             Message.info("resolving dependencies of "+_ivyXmlFile); 
         	_monitor = monitor;
         	final IStatus[] status = new IStatus[1];
-        	final ClasspathItem[][] classpathItems = new ClasspathItem[1][];
+        	final IClasspathEntry[][] classpathEntries = new IClasspathEntry[1][];
 
         	Thread resolver = new Thread() {
         		public void run() {
@@ -154,123 +149,121 @@
 
         			_monitor.beginTask("resolving dependencies", 1000);
 					_monitor.setTaskName("resolving dependencies...");
-        			//context Classloader hook for commonlogging used by httpclient  
-        			ClassLoader old = Thread.currentThread().getContextClassLoader();
-        			List problemMessages = Collections.EMPTY_LIST;
-        			ModuleDescriptor md = null;
-        			try {
-        				Thread.currentThread().setContextClassLoader(IvyClasspathContainer.class.getClassLoader());
-        				final URL ivyURL = _ivyXmlFile.toURL();
-        				String[] confs;
-        				boolean resolved = false;
-        				try {
-
-        					if (_usePreviousResolveIfExist) {
-        						md = ModuleDescriptorParserRegistry.getInstance().parseDescriptor(_ivy.getSettings(), ivyURL, false);
-        						if (_confs.length == 1 && "*".equals(_confs[0])) {
-        							confs = md.getConfigurationsNames();
-        						} else {
-        							confs = _confs;
-        						}
-
-        						// we check if all required configurations have been resolved
-        						for (int i = 0; i < confs.length; i++) {
-        							File report = 
-        									_cacheMgr
-        									.getConfigurationResolveReportInCache(
-        											ResolveOptions.getDefaultResolveId(md), 
-        											confs[i]);
-        							if (!report.exists()) {
-        								// no resolve previously done for at least one conf... we do it now
-        								Message.info("\n\nIVY DE: previous resolve of " + md.getModuleRevisionId().getModuleId() + " doesn't contain enough data: resolving again\n");
-        								ResolveReport r = _ivy.resolve(ivyURL, new ResolveOptions().setConfs(_confs));
-        								resolved = true;
-        								confs = r.getConfigurations();
-                						//eventually do a retrieve
-                						if(IvyPlugin.shouldDoRetrieve(_javaProject)) {
-                							_monitor.setTaskName("retrieving dependencies in "+IvyPlugin.getFullRetrievePatternHerited(_javaProject));
-                							_ivy.retrieve(
-                									md.getModuleRevisionId(), 
-                									IvyPlugin.getFullRetrievePatternHerited(_javaProject), 
-                									new RetrieveOptions().setConfs(confs));
-                						}
-        								break;
-        							}
-        						}
-        					} else {
-        						Message.info("\n\nIVYDE: calling resolve on " + ivyURL + "\n");
-        						ResolveReport report = _ivy.resolve(ivyURL, new ResolveOptions().setConfs(_confs));
-        						problemMessages = report.getAllProblemMessages();
-        						confs = report.getConfigurations();
-        						md = report.getModuleDescriptor();
-        						resolved = true;
-
-        						if (_monitor.isCanceled()) {
-        							status[0] = Status.CANCEL_STATUS;
-        							return;
-        						}
-        						// call retrieve if required
-        						if(IvyPlugin.shouldDoRetrieve(_javaProject)) {
-        							_monitor.setTaskName("retrieving dependencies in "+IvyPlugin.getFullRetrievePatternHerited(_javaProject));
-        							_ivy.retrieve(
-        									md.getModuleRevisionId(), 
-        									IvyPlugin.getFullRetrievePatternHerited(_javaProject),
-        									new RetrieveOptions().setConfs(confs));
-        						}
-        					}
-        				} catch (FileNotFoundException e) {
-        					String errorMsg = "ivy file not found: "+_ivyXmlFile+"\nPlease configure your IvyDE ClasspathContainer properly";
-            				Message.error(errorMsg);
-							status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR, errorMsg, e);
-        					return;
-        				} catch (ParseException e) {
-        					String errorMsg = "parse exception in: "+_ivyXmlFile+"\n"+e.getMessage();
-            				Message.error(errorMsg);
-							status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR, errorMsg, e);
-        					return;
-        				} finally {
-        					Thread.currentThread().setContextClassLoader(old);
-        				}
-        				ModuleId mid = md.getModuleRevisionId().getModuleId();
 
-        				try {
-        					if (!resolved) {
-        						Message.info("\n\nIVY DE: using cached data of previous resolve of "+md.getModuleRevisionId().getModuleId()+"\n");
-        					}
-        					classpathItems[0] = parseResolvedConfs(confs, mid);
-        				} catch (Exception ex) {
-        					if (!resolved) {
-        						//maybe this is a problem with the cache, we retry with an actual resolve
-        						Message.info("\n\nIVYDE: tryed to build classpath from cache, but files seemed to be corrupted... trying with an actual resolve");
-        						ResolveReport report = _ivy.resolve(ivyURL, new ResolveOptions().setConfs(_confs));
-        						classpathItems[0] = parseResolvedConfs(report.getConfigurations(), mid);
-        					}
-        				}
-        			} catch (Exception e) {
-        				String errorMsg = "An internal error occured while resolving dependencies of "+_ivyXmlFile+"\nPlease see eclipse error log and IvyConsole for details";
-        				Message.error(errorMsg);
-						status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR, errorMsg, e);
-        				return;
-        			} finally {
-        				_monitor.done();
-            			_ivy.getEventManager().removeIvyListener(IvyResolveJob.this);
-        			}
-        			
+        			URL ivyURL;
+                    try {
+                        ivyURL = _ivyXmlFile.toURL();
+                    } catch (MalformedURLException e) {
+                        status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR,
+                                "The path of ivy.xml is not a valid URL", e);
+                        return;
+                    }
+
+                    String[] confs;
+                    Collection all;
+                    List problemMessages;
+                    ModuleDescriptor md;
+
+                    //context Classloader hook for commonlogging used by httpclient  
+                    ClassLoader old = Thread.currentThread().getContextClassLoader();
+                    Thread.currentThread().setContextClassLoader(IvyClasspathContainer.class.getClassLoader());
+                    try {
+
+                        if (_usePreviousResolveIfExist) {
+                            md = ModuleDescriptorParserRegistry.getInstance().parseDescriptor(_ivy.getSettings(),
+                                    ivyURL, false);
+                            if (_confs.length == 1 && "*".equals(_confs[0])) {
+                                confs = md.getConfigurationsNames();
+                            } else {
+                                confs = _confs;
+                            }
+
+                            all = new LinkedHashSet();
+
+                            problemMessages = new ArrayList();
+                            // we check if all required configurations have been
+                            // resolved
+                            for (int i = 0; i < confs.length; i++) {
+                                File report = _cacheMgr.getConfigurationResolveReportInCache(ResolveOptions
+                                        .getDefaultResolveId(md), confs[i]);
+                                boolean resolved = false;
+                                if (report.exists()) {
+                                    // found a report, try to parse it.
+                                    try {
+                                        XmlReportParser parser = new XmlReportParser();
+                                        parser.parse(report);
+                                        all.addAll(Arrays.asList(parser.getArtifacts()));
+                                        resolved = true;
+                                    } catch (ParseException e) {
+                                        Message.info("\n\nIVYDE: Error while parsing the report " 
+                                        		+ report + ". Falling back by doing a resolve again.");
+                                        // it fails, so let's try resolving
+                                    }
+                                }
+                                if (!resolved) {
+                                    // no resolve previously done for at least
+                                    // one conf... we do it now
+                                    Message.info("\n\nIVYDE: previous resolve of "
+                                            + md.getModuleRevisionId().getModuleId()
+                                            + " doesn't contain enough data: resolving again\n");
+                                    ResolveReport r = _ivy.resolve(ivyURL, new ResolveOptions().setConfs(_confs));
+                                    all.addAll(r.getArtifacts());
+                                    confs = r.getConfigurations();
+                                    problemMessages.addAll(r.getAllProblemMessages());
+                                    maybeRetrieve(md, confs);
+
+                                    break;
+                                }
+                            }
+                        } else {
+                            Message.info("\n\nIVYDE: calling resolve on " + ivyURL + "\n");
+                            ResolveReport report = _ivy.resolve(ivyURL, new ResolveOptions().setConfs(_confs));
+                            problemMessages = report.getAllProblemMessages();
+                            all = report.getArtifacts();
+                            confs = report.getConfigurations();
+                            md = report.getModuleDescriptor();
+
+                            if (_monitor.isCanceled()) {
+                                status[0] = Status.CANCEL_STATUS;
+                                return;
+                            }
+
+                            maybeRetrieve(md, confs);
+                        }
+
+                        classpathEntries[0] = artifacts2ClasspathEntries(all);
+                    } catch (ParseException e) {
+                        String errorMsg = "Error while parsing the ivy file " + _ivyXmlFile + "\n" + e.getMessage();
+                        Message.error(errorMsg);
+                        status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR, errorMsg, e);
+                        return;
+                    } catch (IOException e) {
+                        String errorMsg = "Error while resolving the artifacts for " + _ivyXmlFile + "\n" + e.getMessage();
+                        Message.error(errorMsg);
+                        status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR, errorMsg, e);
+                        return;
+                    } finally {
+                        Thread.currentThread().setContextClassLoader(old);
+                        _monitor.done();
+                        _ivy.getEventManager().removeIvyListener(IvyResolveJob.this);
+                    }
+
 	    			if (!problemMessages.isEmpty()) {
 	    				StringBuffer problems = new StringBuffer();
 	    				for (Iterator iter = problemMessages.iterator(); iter.hasNext();) {
 							String msg = (String) iter.next();
 							problems.append(msg).append("\n");
 						}
-	    				status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR, "Impossible to resolve dependencies of "+md.getModuleRevisionId()+":\n"+problems+"\nSee IvyConsole for further details", null);
-	    				return;
-	    			} else {
-	    				status[0] = Status.OK_STATUS;
+	    				status[0] = new Status(Status.ERROR, IvyPlugin.ID, Status.ERROR, 
+	    						"Impossible to resolve dependencies of "+md.getModuleRevisionId()
+	    						+":\n"+problems+"\nSee IvyConsole for further details", null);
 	    				return;
 	    			}
+
+	    			status[0] = Status.OK_STATUS;
         		}
         	};
-        	
+
         	try {
         		resolver.start();
         		while (true) {
@@ -291,7 +284,7 @@
         			}
         		}
         		if (status[0] == Status.OK_STATUS) {
-	    			updateClasspathEntries(_usePreviousResolveIfExist, _notify, classpathItems[0]);
+	    			updateClasspathEntries(_notify, classpathEntries[0]);
         		}
         		return status[0];
         	} finally {
@@ -300,41 +293,41 @@
 				}
                 IvyPlugin.log(IStatus.INFO, "resolved dependencies of "+_ivyXmlFile, null); 
         	}
-        	
-
         }
 
-		private ClasspathItem[] parseResolvedConfs(String[] confs, ModuleId mid) throws ParseException, IOException {
-			ClasspathItem[] classpathItems;
-            Collection all = new LinkedHashSet();
-            String resolveId = ResolveOptions.getDefaultResolveId(mid);
-            for (int i = 0; i < confs.length; i++) {
-            	XmlReportParser parser = new XmlReportParser();
-            	File report = _cacheMgr.getConfigurationResolveReportInCache(resolveId, confs[i]);
-            	parser.parse(report);
-                Artifact[] artifacts = parser.getArtifacts();
-                all.addAll(Arrays.asList(artifacts));
+        private void maybeRetrieve(ModuleDescriptor md, String[] confs) throws IOException {
+            // call retrieve if required
+            if (IvyPlugin.shouldDoRetrieve(_javaProject)) {
+                _monitor.setTaskName("retrieving dependencies in "
+                        + IvyPlugin.getFullRetrievePatternHerited(_javaProject));
+                _ivy.retrieve(md.getModuleRevisionId(), IvyPlugin.getFullRetrievePatternHerited(_javaProject),
+                        new RetrieveOptions().setConfs(confs));
             }
-            Collection files = new LinkedHashSet();
+        }
+
+        private IClasspathEntry[] artifacts2ClasspathEntries(Collection all) {
+			IClasspathEntry[] classpathEntries;
+            Collection paths = new LinkedHashSet();
             for (Iterator iter = all.iterator(); iter.hasNext();) {
                 Artifact artifact = (Artifact)iter.next();
                 if (IvyPlugin.accept(_javaProject, artifact)) {
-                	File sourcesArtifact = getSourcesArtifact(artifact, all);
-                	File javadocArtifact = getJavadocArtifact(artifact, all);
-                	files.add(new ClasspathItem(
-                			_cacheMgr.getArchiveFileInCache(artifact),
-                			sourcesArtifact, 
-                			javadocArtifact
-                		));
+                    Path classpathArtifact = new Path(_cacheMgr.getArchiveFileInCache(artifact).getAbsolutePath()); 
+                	Path sourcesArtifact = getSourcesArtifactPath(artifact, all);
+                	Path javadocArtifact = getJavadocArtifactPath(artifact, all);
+                	paths.add(JavaCore.newLibraryEntry(classpathArtifact, 
+                	        getSourceAttachment(classpathArtifact, sourcesArtifact), 
+                	        getSourceAttachmentRoot(classpathArtifact, sourcesArtifact),
+                	        ClasspathEntry.NO_ACCESS_RULES,
+                	        getExtraAttribute(classpathArtifact, javadocArtifact),
+                	        false));
                 }
             }
-            classpathItems = (ClasspathItem[])files.toArray(new ClasspathItem[files.size()]);
+            classpathEntries = (IClasspathEntry[]) paths.toArray(new IClasspathEntry[paths.size()]);
             
-            return classpathItems;
+            return classpathEntries;
         }
 
-		private File getSourcesArtifact(Artifact artifact, Collection all)
-		{
+		private Path getSourcesArtifactPath(Artifact artifact, Collection all) {
     		_monitor.subTask("searching sources for "+artifact);
             for (Iterator iter = all.iterator(); iter.hasNext();) {
                 Artifact a = (Artifact)iter.next();
@@ -342,18 +335,17 @@
                 		a.getId().getRevision().equals(artifact.getId().getRevision()) &&
                 		IvyPlugin.isSources(_javaProject, a))
                 {
-                	return _cacheMgr.getArchiveFileInCache(a);
+                	return new Path(_cacheMgr.getArchiveFileInCache(a).getAbsolutePath());
                 }
             }
             if (IvyPlugin.shouldTestNonDeclaredSources(_javaProject)) {
-            	return getMetaArtifact(artifact, "source", "sources");
+            	return getMetaArtifactPath(artifact, "source", "sources");
             } else {
             	return null;
             }
 		}
 
-		private File getJavadocArtifact(Artifact artifact, Collection all)
-		{
+		private Path getJavadocArtifactPath(Artifact artifact, Collection all) {
     		_monitor.subTask("searching javadoc for "+artifact);
 			for (Iterator iter = all.iterator(); iter.hasNext();) {
 				Artifact a = (Artifact)iter.next();
@@ -362,19 +354,21 @@
 						a.getId().equals(artifact.getId()) &&
 						IvyPlugin.isJavadoc(_javaProject, a))
 				{
-					return _cacheMgr.getArchiveFileInCache(a);
+					return new Path(_cacheMgr.getArchiveFileInCache(a).getAbsolutePath());
 				}
 			}
 			if (IvyPlugin.shouldTestNonDeclaredSources(_javaProject)) {
-            	return getMetaArtifact(artifact, "javadoc", "javadoc");
+            	return getMetaArtifactPath(artifact, "javadoc", "javadoc");
 			} else {
             	return null;
             }
 		}
 
-		private File getMetaArtifact(Artifact artifact, String metaType, String metaClassifier) {
-			// meta artifact (source or javadoc) not found in resolved artifacts, 
-			// try to see if a non declared one is available
+		/**
+		 * meta artifact (source or javadoc) not found in resolved artifacts,
+		 * try to see if a non declared one is available
+		 */
+		private Path getMetaArtifactPath(Artifact artifact, String metaType, String metaClassifier) {
 			Map extraAtt = new HashMap(artifact.getExtraAttributes());
 			extraAtt.put("classifier", metaClassifier);
 			Artifact metaArtifact = new DefaultArtifact(
@@ -392,14 +386,14 @@
 			File metaArtifactFile = _cacheMgr.getArchiveFileInCache(metaArtifact, null);
 			File attempt = new File(metaArtifactFile.getAbsolutePath()+".notfound");
 			if (metaArtifactFile.exists()) {
-				return metaArtifactFile;
+				return new Path(metaArtifactFile.getAbsolutePath());
 			} else if (attempt.exists()) {
 				return null;
 			} else {
 				Message.info("checking "+metaType+" for "+artifact);
 				_ivy.getResolveEngine().download(metaArtifact, _cacheMgr, false);
 				if (metaArtifactFile.exists()) {
-					return metaArtifactFile;
+					return new Path(metaArtifactFile.getAbsolutePath());
 				} else {
 					// source artifact not found, we store this information to avoid other attempts later
 					Message.info(metaType+" not found for "+artifact);
@@ -413,32 +407,47 @@
 				}
 			}
 		}
-    }
-    
-    public class ClasspathItem
-    {
-    	private File classpathArtifact;
-    	private File sourcesArtifact;
-    	private File javadocArtifact;
-    	
-    	public ClasspathItem(File classpathArtifact, File sourcesArtifact, File javadocArtifact)
-    	{
-    		this.classpathArtifact = classpathArtifact;
-    		this.sourcesArtifact = sourcesArtifact;
-    		this.javadocArtifact = javadocArtifact;
-    	}
-    	
-    	public Path getClasspathArtifactPath() {
-    		return new Path(classpathArtifact.getAbsolutePath());
-    	}
-    	
-    	public Path getSourcesArtifactPath() {
-    		return (sourcesArtifact != null) ? new Path(sourcesArtifact.getAbsolutePath()) : null;
-    	}
-
-    	public Path getJavadocArtifactPath() {
-    		return (javadocArtifact != null) ? new Path(javadocArtifact.getAbsolutePath()) : null;
-    	}
+
+		private IPath getSourceAttachment(Path classpathArtifact, Path sourcesArtifact) {
+            IPath sourceAttachment = IvyPlugin.getDefault().getPackageFragmentExtraInfo().getSourceAttachment(
+                    classpathArtifact);
+            if (sourceAttachment == null) {
+                sourceAttachment = sourcesArtifact;
+            }
+            return sourceAttachment;
+        }
+
+        private IPath getSourceAttachmentRoot(Path classpathArtifact, Path sourcesArtifact) {
+            IPath sourceAttachment = IvyPlugin.getDefault().getPackageFragmentExtraInfo().getSourceAttachmentRoot(
+                    classpathArtifact);
+            if (sourceAttachment == null && sourcesArtifact != null) {
+                sourceAttachment = sourcesArtifact;
+            }
+            return sourceAttachment;
+        }
+
+        private IClasspathAttribute[] getExtraAttribute(Path classpathArtifact, Path javadocArtifact) {
+            List result = new ArrayList();
+            URL url = IvyPlugin.getDefault().getPackageFragmentExtraInfo().getDocAttachment(classpathArtifact);
+
+            if (url == null) {
+                try {
+                    Path path = javadocArtifact;
+                    if (path != null) {
+                        url = new URL("jar:" + path.toFile().toURI().toURL().toExternalForm() + "!/");
+                    }
+                } catch (MalformedURLException e) {
+                    // ignored
+                }
+            }
+
+            if (url != null) {
+                result.add(new ClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, url
+                        .toExternalForm()));
+            }
+            return (IClasspathAttribute[]) result.toArray(new IClasspathAttribute[result.size()]);
+        }
+
     }
 
     public static final String IVY_CLASSPATH_CONTAINER_ID = "org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER";
@@ -571,64 +580,15 @@
     }
 
 
-    private void updateClasspathEntries(final boolean usePreviousResolveIfExist, boolean notify, final ClasspathItem[] classpathItems) {
-    	IClasspathEntry[] entries;
-    	if(classpathItems != null) {
-	        entries = new IClasspathEntry[ classpathItems.length ];
-	        
-	        for( int i=0; i<classpathItems.length; i++ ) {
-	            Path path = classpathItems[ i ].getClasspathArtifactPath();
-	            entries[ i ] = JavaCore.newLibraryEntry(path, 
-	                                                    getSourceAttachment(classpathItems[ i ]), 
-	                                                    getSourceAttachmentRoot(classpathItems[ i ]),
-	                                                    ClasspathEntry.NO_ACCESS_RULES,
-	                                                    getExtraAttribute(classpathItems[ i ]),
-	                                                    false);
-	        }
-    	} else {
+    private void updateClasspathEntries(boolean notify, final IClasspathEntry[] classpathEntries) {
+        IClasspathEntry[] entries;
+        if (classpathEntries != null) {
+            entries = classpathEntries;
+        } else {
             entries = new IClasspathEntry[0];
-    	}
-    	setClasspathEntries(entries, notify);
-    }
-
-    private IPath getSourceAttachment(ClasspathItem classpathItem) {
-    	IPath sourceAttachment = IvyPlugin.getDefault().getPackageFragmentExtraInfo().getSourceAttachment(classpathItem.getClasspathArtifactPath());
-    	if (sourceAttachment == null)
-    		sourceAttachment = classpathItem.getSourcesArtifactPath();
-    		
-    	return sourceAttachment;
-    }
-    
-    private IPath getSourceAttachmentRoot(ClasspathItem classpathItem) {
-    	IPath sourceAttachment = IvyPlugin.getDefault().getPackageFragmentExtraInfo().getSourceAttachmentRoot(classpathItem.getClasspathArtifactPath());
-    	if (sourceAttachment == null)
-    		sourceAttachment = classpathItem.getSourcesArtifactPath();
-    		
-    	return sourceAttachment;
-    }
-
-    private IClasspathAttribute[] getExtraAttribute(ClasspathItem classpathItem) {
-        List result  = new ArrayList();
-        URL url = IvyPlugin.getDefault().getPackageFragmentExtraInfo().getDocAttachment(classpathItem.getClasspathArtifactPath());
-        
-        if (url == null) {
-        	try {
-        		Path path = classpathItem.getJavadocArtifactPath();
-        		if (path != null) {
-        			url = new URL("jar:"+path.toFile().toURI().toURL().toExternalForm()+"!/");
-        		}
-        	} catch (MalformedURLException e) {
-        		// ignored
-        	}
-        }
-        	
-        if(url != null) {
-        	result.add(new ClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, url.toExternalForm()));
         }
-        return (IClasspathAttribute[]) result.toArray(new IClasspathAttribute[result.size()]);
+        setClasspathEntries(entries, notify);
     }
-
-
 
     private void setClasspathEntries(final IClasspathEntry[] entries, final boolean notify) {
         Display.getDefault().asyncExec(new Runnable() {