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