View | Details | Raw Unified | Return to bug 281551 | Differences between
and this patch

Collapse All | Expand All

(-)model/org/eclipse/jdt/internal/core/JavaProject.java (-4 / +29 lines)
Lines 2565-2571 Link Here
2565
							// resolve Class-Path: in manifest
2565
							// resolve Class-Path: in manifest
2566
							ClasspathEntry[] extraEntries = ((ClasspathEntry) resolvedEntry).resolvedChainedLibraries();
2566
							ClasspathEntry[] extraEntries = ((ClasspathEntry) resolvedEntry).resolvedChainedLibraries();
2567
							for (int j = 0, length2 = extraEntries.length; j < length2; j++) {
2567
							for (int j = 0, length2 = extraEntries.length; j < length2; j++) {
2568
								addToResult(rawEntry, extraEntries[j], result, resolvedEntries, externalFoldersManager);
2568
								if (!isLibraryOnRawClasspath(rawClasspath, extraEntries[j].getPath())) {
2569
									addToResult(rawEntry, extraEntries[j], result, resolvedEntries, externalFoldersManager);
2570
								}
2569
							}
2571
							}
2570
						}
2572
						}
2571
						addToResult(rawEntry, resolvedEntry, result, resolvedEntries, externalFoldersManager);
2573
						addToResult(rawEntry, resolvedEntry, result, resolvedEntries, externalFoldersManager);
Lines 2607-2613 Link Here
2607
								// resolve Class-Path: in manifest
2609
								// resolve Class-Path: in manifest
2608
								ClasspathEntry[] extraEntries = cEntry.resolvedChainedLibraries();
2610
								ClasspathEntry[] extraEntries = cEntry.resolvedChainedLibraries();
2609
								for (int k = 0, length2 = extraEntries.length; k < length2; k++) {
2611
								for (int k = 0, length2 = extraEntries.length; k < length2; k++) {
2610
									addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager);
2612
									if (!isLibraryOnRawClasspath(rawClasspath, extraEntries[k].getPath())) {
2613
										addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager);
2614
									}
2611
								}
2615
								}
2612
							}
2616
							}
2613
						}
2617
						}
Lines 2623-2629 Link Here
2623
						// resolve Class-Path: in manifest
2627
						// resolve Class-Path: in manifest
2624
						ClasspathEntry[] extraEntries = ((ClasspathEntry) resolvedEntry).resolvedChainedLibraries();
2628
						ClasspathEntry[] extraEntries = ((ClasspathEntry) resolvedEntry).resolvedChainedLibraries();
2625
						for (int k = 0, length2 = extraEntries.length; k < length2; k++) {
2629
						for (int k = 0, length2 = extraEntries.length; k < length2; k++) {
2626
							addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager);
2630
							if (!isLibraryOnRawClasspath(rawClasspath, extraEntries[k].getPath())) {
2631
								addToResult(rawEntry, extraEntries[k], result, resolvedEntries, externalFoldersManager);
2632
							}
2627
						}
2633
						}
2628
					}
2634
					}
2629
2635
Lines 2639-2645 Link Here
2639
		return result;
2645
		return result;
2640
	}
2646
	}
2641
2647
2642
	private void addToResult(IClasspathEntry rawEntry, IClasspathEntry resolvedEntry, ResolvedClasspath result, LinkedHashSet resolvedEntries, ExternalFoldersManager externalFoldersManager) {
2648
	private boolean isLibraryOnRawClasspath(IClasspathEntry[] rawClasspath, IPath entryPath) {
2649
		IPath workspaceRoot = ResourcesPlugin.getWorkspace().getRoot().getLocation();
2650
		for (int index = 0; index < rawClasspath.length; index++) {
2651
			if (rawClasspath[index].getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
2652
				if (rawClasspath[index].getPath().equals(entryPath) ) {
2653
					return true;
2654
				}
2655
				if (workspaceRoot.isPrefixOf(entryPath)) {
2656
					if (rawClasspath[index].getPath().equals(
2657
							entryPath.makeRelativeTo(workspaceRoot).makeAbsolute())) {
2658
						return true;
2659
					}
2660
				}
2661
			}
2662
		}
2663
		return false;
2664
	}
2665
	
2666
	private void addToResult(IClasspathEntry rawEntry, IClasspathEntry resolvedEntry, ResolvedClasspath result,
2667
			LinkedHashSet resolvedEntries, ExternalFoldersManager externalFoldersManager) {
2643
		IPath resolvedPath;
2668
		IPath resolvedPath;
2644
		if (result.rawReverseMap.get(resolvedPath = resolvedEntry.getPath()) == null) {
2669
		if (result.rawReverseMap.get(resolvedPath = resolvedEntry.getPath()) == null) {
2645
			result.rawReverseMap.put(resolvedPath, rawEntry);
2670
			result.rawReverseMap.put(resolvedPath, rawEntry);
(-)src/org/eclipse/jdt/core/tests/model/ClasspathTests.java (+134 lines)
Lines 5972-5975 Link Here
5972
	}
5972
	}
5973
}
5973
}
5974
5974
5975
/**
5976
 * @bug 281551:[build path] Source attachments wrong for automatically added libraries 
5977
 * @test that chained libraries that are already in the raw classpath are not added to the resolved 
5978
 * 		classpath again 
5979
 * 
5980
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=281551"
5981
 */
5982
public void test281551() throws Exception {
5983
	try {
5984
		IJavaProject p = createJavaProject("P");
5985
		addLibrary(p, "lib1.jar", "lib1src.zip", new String[0], 
5986
				new String[] {
5987
					"META-INF/MANIFEST.MF",
5988
					"Manifest-Version: 1.0\n" +
5989
					"Class-Path: lib2.jar\n",
5990
				},
5991
				JavaCore.VERSION_1_4);		
5992
		addLibrary(p, "lib2.jar", "lib2src.zip", new String[0], 
5993
				new String[] {
5994
					"META-INF/MANIFEST.MF",
5995
					"Manifest-Version: 1.0\n" +
5996
					"Class-Path: \n",
5997
				},
5998
				JavaCore.VERSION_1_4);
5999
		
6000
		ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(JavaCore.USER_LIBRARY_CONTAINER_ID);
6001
		String libraryName = "SWT";
6002
		IPath containerPath = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID);
6003
		UserLibraryClasspathContainer containerSuggestion = new UserLibraryClasspathContainer(libraryName);
6004
		initializer.requestClasspathContainerUpdate(containerPath.append(libraryName), null, containerSuggestion);
6005
6006
		IFile jarFile = getFile("/P/lib1.jar");
6007
6008
		// Modify user library
6009
		IEclipsePreferences preferences = new InstanceScope().getNode(JavaCore.PLUGIN_ID);
6010
		String propertyName = JavaModelManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"SWT";
6011
		String jarFullPath = getWorkspaceRoot().getLocation().append(jarFile.getFullPath()).toString();
6012
6013
		StringBuffer propertyValue = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<userlibrary systemlibrary=\"false\" version=\"1\">\r\n<archive");
6014
		propertyValue.append(" path=\""+jarFullPath);
6015
		propertyValue.append("\"/>\r\n</userlibrary>\r\n");
6016
		preferences.put(propertyName, propertyValue.toString());
6017
		preferences.flush();
6018
		
6019
		IClasspathEntry[] entries = p.getRawClasspath();
6020
		int length = entries.length;
6021
		System.arraycopy(entries, 0, entries = new IClasspathEntry[length+1], 0, length);
6022
		entries[length] = JavaCore.newContainerEntry(containerSuggestion.getPath());
6023
		p.setRawClasspath(entries, null);
6024
		
6025
		assertClasspathEquals(
6026
				p.getResolvedClasspath(true),
6027
				"/P[CPE_SOURCE][K_SOURCE][isExported:false]\n" + 
6028
				""+ getExternalJCLPathString() + "[CPE_LIBRARY][K_BINARY][isExported:false]\n" + 
6029
				"/P/lib1.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib1src.zip][isExported:true]\n" + 
6030
				"/P/lib2.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib2src.zip][isExported:true]\n" + 
6031
				""+ getWorkspacePath() + "P\\lib1.jar[CPE_LIBRARY][K_BINARY][isExported:false]"
6032
		);
6033
		
6034
	} finally {
6035
		deleteProject("P");
6036
	}
6037
}
6038
/**
6039
 * @bug 281551:[build path] Source attachments wrong for automatically added libraries 
6040
 * @test that jars directly added to a container are added to the raw classpath even when 
6041
 * they are referenced in other jar files
6042
 * 
6043
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=281551"
6044
 */
6045
public void test281551a() throws Exception {
6046
	try {
6047
		IJavaProject p = createJavaProject("P");
6048
		addLibrary(p, "lib1.jar", "lib1src.zip", new String[0], 
6049
				new String[] {
6050
					"META-INF/MANIFEST.MF",
6051
					"Manifest-Version: 1.0\n" +
6052
					"Class-Path: lib2.jar\n",
6053
				},
6054
				JavaCore.VERSION_1_4);		
6055
		addLibrary(p, "lib2.jar", "lib2src.zip", new String[0], 
6056
				new String[] {
6057
					"META-INF/MANIFEST.MF",
6058
					"Manifest-Version: 1.0\n" +
6059
					"Class-Path: \n",
6060
				},
6061
				JavaCore.VERSION_1_4);
6062
		
6063
		ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(JavaCore.USER_LIBRARY_CONTAINER_ID);
6064
		String libraryName = "SWT";
6065
		IPath containerPath = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID);
6066
		UserLibraryClasspathContainer containerSuggestion = new UserLibraryClasspathContainer(libraryName);
6067
		initializer.requestClasspathContainerUpdate(containerPath.append(libraryName), null, containerSuggestion);
6068
6069
		
6070
		IFile jarFile = getFile("/P/lib1.jar");
6071
6072
		// Modify user library
6073
		IEclipsePreferences preferences = new InstanceScope().getNode(JavaCore.PLUGIN_ID);
6074
		String propertyName = JavaModelManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"SWT";
6075
		String jarFullPath = getWorkspaceRoot().getLocation().append(jarFile.getFullPath()).toString();
6076
6077
		StringBuffer propertyValue = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<userlibrary systemlibrary=\"false\" version=\"1\">\r\n");
6078
		propertyValue.append("<archive path=\""+jarFullPath+"\" />\r\n");
6079
		
6080
		jarFile = getFile("/P/lib2.jar");
6081
		jarFullPath = getWorkspaceRoot().getLocation().append(jarFile.getFullPath()).toString();
6082
		
6083
		propertyValue.append("<archive path=\""+jarFullPath+"\"/>\r\n</userlibrary>\r\n");
6084
		System.out.println(propertyValue.toString());
6085
		preferences.put(propertyName, propertyValue.toString());
6086
		preferences.flush();
6087
		
6088
		IClasspathEntry[] entries = p.getRawClasspath();
6089
		int length = entries.length;
6090
		System.arraycopy(entries, 0, entries = new IClasspathEntry[length+1], 0, length);
6091
		entries[length] = JavaCore.newContainerEntry(containerSuggestion.getPath());
6092
		p.setRawClasspath(entries, null);
6093
		
6094
		assertClasspathEquals(
6095
				p.getResolvedClasspath(true),
6096
				"/P[CPE_SOURCE][K_SOURCE][isExported:false]\n" + 
6097
				""+ getExternalJCLPathString() + "[CPE_LIBRARY][K_BINARY][isExported:false]\n" + 
6098
				"/P/lib1.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib1src.zip][isExported:true]\n" + 
6099
				"/P/lib2.jar[CPE_LIBRARY][K_BINARY][sourcePath:/P/lib2src.zip][isExported:true]\n" + 
6100
				""+ getWorkspacePath() + "P\\lib1.jar[CPE_LIBRARY][K_BINARY][isExported:false]\n" + 
6101
				""+ getWorkspacePath() + "P\\lib2.jar[CPE_LIBRARY][K_BINARY][isExported:false]"
6102
		);
6103
		
6104
	} finally {
6105
		deleteProject("P");
6106
	}
6107
}
6108
5975
}
6109
}

Return to bug 281551