Index: model/org/eclipse/jdt/internal/core/JavaProject.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java,v --- model/org/eclipse/jdt/internal/core/JavaProject.java 8 Jul 2009 07:12:08 -0000 1.427 +++ model/org/eclipse/jdt/internal/core/JavaProject.java 26 Oct 2009 06:02:52 -0000 @@ -2565,7 +2565,9 @@ // resolve Class-Path: in manifest ClasspathEntry[] extraEntries = ((ClasspathEntry) resolvedEntry).resolvedChainedLibraries(); for (int j = 0, length2 = extraEntries.length; j < length2; j++) { - addToResult(rawEntry, extraEntries[j], result, resolvedEntries, externalFoldersManager); + if (!isLibraryOnRawClasspath(rawClasspath, extraEntries[j].getPath())) { + addToResult(rawEntry, extraEntries[j], result, resolvedEntries, externalFoldersManager); + } } } addToResult(rawEntry, resolvedEntry, result, resolvedEntries, externalFoldersManager); @@ -2607,7 +2609,9 @@ // resolve Class-Path: in manifest ClasspathEntry[] extraEntries = cEntry.resolvedChainedLibraries(); for (int k = 0, length2 = extraEntries.length; k < length2; k++) { - addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager); + if (!isLibraryOnRawClasspath(rawClasspath, extraEntries[k].getPath())) { + addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager); + } } } } @@ -2623,7 +2627,9 @@ // resolve Class-Path: in manifest ClasspathEntry[] extraEntries = ((ClasspathEntry) resolvedEntry).resolvedChainedLibraries(); for (int k = 0, length2 = extraEntries.length; k < length2; k++) { - addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager); + if (!isLibraryOnRawClasspath(rawClasspath, extraEntries[k].getPath())) { + addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager); + } } } @@ -2639,7 +2645,26 @@ return result; } - private void addToResult(IClasspathEntry rawEntry, IClasspathEntry resolvedEntry, ResolvedClasspath result, LinkedHashSet resolvedEntries, ExternalFoldersManager externalFoldersManager) { + private boolean isLibraryOnRawClasspath(IClasspathEntry[] rawClasspath, IPath entryPath) { + IPath workspaceRoot = ResourcesPlugin.getWorkspace().getRoot().getLocation(); + for (int index = 0; index < rawClasspath.length; index++) { + if (rawClasspath[index].getEntryKind() == IClasspathEntry.CPE_LIBRARY) { + if (rawClasspath[index].getPath().equals(entryPath) ) { + return true; + } + if (workspaceRoot.isPrefixOf(entryPath)) { + if (rawClasspath[index].getPath().equals( + entryPath.makeRelativeTo(workspaceRoot).makeAbsolute())) { + return true; + } + } + } + } + return false; + } + + private void addToResult(IClasspathEntry rawEntry, IClasspathEntry resolvedEntry, ResolvedClasspath result, + LinkedHashSet resolvedEntries, ExternalFoldersManager externalFoldersManager) { IPath resolvedPath; if (result.rawReverseMap.get(resolvedPath = resolvedEntry.getPath()) == null) { result.rawReverseMap.put(resolvedPath, rawEntry); Index: src/org/eclipse/jdt/core/tests/model/ClasspathTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathTests.java,v --- src/org/eclipse/jdt/core/tests/model/ClasspathTests.java 21 Aug 2009 05:17:28 -0000 1.203 +++ src/org/eclipse/jdt/core/tests/model/ClasspathTests.java 26 Oct 2009 06:03:49 -0000 @@ -5972,4 +5972,138 @@ } } +/** + * @bug 281551:[build path] Source attachments wrong for automatically added libraries + * @test that chained libraries that are already in the raw classpath are not added to the resolved + * classpath again + * + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=281551" + */ +public void test281551() throws Exception { + try { + IJavaProject p = createJavaProject("P"); + addLibrary(p, "lib1.jar", "lib1src.zip", new String[0], + new String[] { + "META-INF/MANIFEST.MF", + "Manifest-Version: 1.0\n" + + "Class-Path: lib2.jar\n", + }, + JavaCore.VERSION_1_4); + addLibrary(p, "lib2.jar", "lib2src.zip", new String[0], + new String[] { + "META-INF/MANIFEST.MF", + "Manifest-Version: 1.0\n" + + "Class-Path: \n", + }, + JavaCore.VERSION_1_4); + + ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(JavaCore.USER_LIBRARY_CONTAINER_ID); + String libraryName = "SWT"; + IPath containerPath = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID); + UserLibraryClasspathContainer containerSuggestion = new UserLibraryClasspathContainer(libraryName); + initializer.requestClasspathContainerUpdate(containerPath.append(libraryName), null, containerSuggestion); + + IFile jarFile = getFile("/P/lib1.jar"); + + // Modify user library + IEclipsePreferences preferences = new InstanceScope().getNode(JavaCore.PLUGIN_ID); + String propertyName = JavaModelManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"SWT"; + String jarFullPath = getWorkspaceRoot().getLocation().append(jarFile.getFullPath()).toString(); + + StringBuffer propertyValue = new StringBuffer("\r\n\r\n\r\n\r\n"); + preferences.put(propertyName, propertyValue.toString()); + preferences.flush(); + + IClasspathEntry[] entries = p.getRawClasspath(); + int length = entries.length; + System.arraycopy(entries, 0, entries = new IClasspathEntry[length+1], 0, length); + entries[length] = JavaCore.newContainerEntry(containerSuggestion.getPath()); + p.setRawClasspath(entries, null); + + assertClasspathEquals( + p.getResolvedClasspath(true), + "/P[CPE_SOURCE][K_SOURCE][isExported:false]\n" + + ""+ getExternalJCLPathString() + "[CPE_LIBRARY][K_BINARY][isExported:false]\n" + + "/P/lib1.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib1src.zip][isExported:true]\n" + + "/P/lib2.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib2src.zip][isExported:true]\n" + + ""+ getWorkspacePath() + "P\\lib1.jar[CPE_LIBRARY][K_BINARY][isExported:false]" + ); + + } finally { + deleteProject("P"); + } +} +/** + * @bug 281551:[build path] Source attachments wrong for automatically added libraries + * @test that jars directly added to a container are added to the raw classpath even when + * they are referenced in other jar files + * + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=281551" + */ +public void test281551a() throws Exception { + try { + IJavaProject p = createJavaProject("P"); + addLibrary(p, "lib1.jar", "lib1src.zip", new String[0], + new String[] { + "META-INF/MANIFEST.MF", + "Manifest-Version: 1.0\n" + + "Class-Path: lib2.jar\n", + }, + JavaCore.VERSION_1_4); + addLibrary(p, "lib2.jar", "lib2src.zip", new String[0], + new String[] { + "META-INF/MANIFEST.MF", + "Manifest-Version: 1.0\n" + + "Class-Path: \n", + }, + JavaCore.VERSION_1_4); + + ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(JavaCore.USER_LIBRARY_CONTAINER_ID); + String libraryName = "SWT"; + IPath containerPath = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID); + UserLibraryClasspathContainer containerSuggestion = new UserLibraryClasspathContainer(libraryName); + initializer.requestClasspathContainerUpdate(containerPath.append(libraryName), null, containerSuggestion); + + + IFile jarFile = getFile("/P/lib1.jar"); + + // Modify user library + IEclipsePreferences preferences = new InstanceScope().getNode(JavaCore.PLUGIN_ID); + String propertyName = JavaModelManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"SWT"; + String jarFullPath = getWorkspaceRoot().getLocation().append(jarFile.getFullPath()).toString(); + + StringBuffer propertyValue = new StringBuffer("\r\n\r\n"); + propertyValue.append("\r\n"); + + jarFile = getFile("/P/lib2.jar"); + jarFullPath = getWorkspaceRoot().getLocation().append(jarFile.getFullPath()).toString(); + + propertyValue.append("\r\n\r\n"); + System.out.println(propertyValue.toString()); + preferences.put(propertyName, propertyValue.toString()); + preferences.flush(); + + IClasspathEntry[] entries = p.getRawClasspath(); + int length = entries.length; + System.arraycopy(entries, 0, entries = new IClasspathEntry[length+1], 0, length); + entries[length] = JavaCore.newContainerEntry(containerSuggestion.getPath()); + p.setRawClasspath(entries, null); + + assertClasspathEquals( + p.getResolvedClasspath(true), + "/P[CPE_SOURCE][K_SOURCE][isExported:false]\n" + + ""+ getExternalJCLPathString() + "[CPE_LIBRARY][K_BINARY][isExported:false]\n" + + "/P/lib1.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib1src.zip][isExported:true]\n" + + "/P/lib2.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib2src.zip][isExported:true]\n" + + ""+ getWorkspacePath() + "P\\lib1.jar[CPE_LIBRARY][K_BINARY][isExported:false]\n" + + ""+ getWorkspacePath() + "P\\lib2.jar[CPE_LIBRARY][K_BINARY][isExported:false]" + ); + + } finally { + deleteProject("P"); + } +} + }