### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.builder Index: src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java,v retrieving revision 1.51 diff -u -r1.51 BuildpathTests.java --- src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java 9 Oct 2008 11:55:22 -0000 1.51 +++ src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java 3 Dec 2008 06:00:59 -0000 @@ -17,6 +17,7 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jdt.core.*; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; @@ -54,6 +55,45 @@ return jdkLevelProblem.toString(); } +// https://bugs.eclipse.org/bugs/show_bug.cgi?id=232816, mention container name in diagnostic, +// so the connection is more obvious in error messages. +public void testInaccessibleUserLibrary() throws Exception { + + // Create new user library "SomeUserLibrary" + ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(JavaCore.USER_LIBRARY_CONTAINER_ID); + String libraryName = "SomeUserLibrary"; + IPath containerPath = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID); + UserLibraryClasspathContainer containerSuggestion = new UserLibraryClasspathContainer(libraryName); + initializer.requestClasspathContainerUpdate(containerPath.append(libraryName), null, containerSuggestion); + + // Create java project + IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ + + // Modify user library + IEclipsePreferences preferences = new InstanceScope().getNode(JavaCore.PLUGIN_ID); + String propertyName = JavaModelManager.CP_USERLIBRARY_PREFERENCES_PREFIX+"SomeUserLibrary"; + StringBuffer propertyValue = new StringBuffer("\r\n\r\n\r\n\r\n"); + preferences.put(propertyName, propertyValue.toString()); + preferences.flush(); + + + IClasspathEntry[] entries = env.getJavaProject(projectPath).getRawClasspath(); + int length = entries.length; + System.arraycopy(entries, 0, entries = new IClasspathEntry[length+1], 0, length); + entries[length] = JavaCore.newContainerEntry(containerSuggestion.getPath()); + env.getJavaProject(projectPath).setRawClasspath(entries, null); + + expectingOnlySpecificProblemsFor(projectPath, + new Problem[] { + new Problem("Build path", "Project 'Project' is missing required library: 'C:\\non\\existent\\bogus\\library.jar' (contained in 'SomeUserLibrary')", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ + } + ); + +} + public void testClasspathFileChange() throws JavaModelException { // create project with src folder, and alternate unused src2 folder IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ #P org.eclipse.jdt.core.tests.model 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 retrieving revision 1.193 diff -u -r1.193 ClasspathTests.java --- src/org/eclipse/jdt/core/tests/model/ClasspathTests.java 28 Oct 2008 21:25:36 -0000 1.193 +++ src/org/eclipse/jdt/core/tests/model/ClasspathTests.java 3 Dec 2008 06:01:06 -0000 @@ -2341,7 +2341,7 @@ setClasspath(p, new IClasspathEntry[] {JavaCore.newContainerEntry(new Path("org.eclipse.jdt.core.tests.model.TEST_CONTAINER"))}); assertMarkers( "Unexpected markers", - "Project \'P\' is missing required library: \'"+ getExternalPath() + "nonExisting.jar\'", + "Project \'P\' is missing required library: \'"+ getExternalPath() + "nonExisting.jar\' (contained in 'Test container')", p); } finally { deleteProject("P"); #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/ClasspathEntry.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java,v retrieving revision 1.109 diff -u -r1.109 ClasspathEntry.java --- model/org/eclipse/jdt/internal/core/ClasspathEntry.java 28 Oct 2008 21:25:29 -0000 1.109 +++ model/org/eclipse/jdt/internal/core/ClasspathEntry.java 3 Dec 2008 06:01:24 -0000 @@ -1745,6 +1745,10 @@ * @return a java model status describing the problem related to this classpath entry if any, a status object with code IStatus.OK if the entry is fine */ public static IJavaModelStatus validateClasspathEntry(IJavaProject project, IClasspathEntry entry, boolean checkSourceAttachment, boolean referredByContainer){ + return validateClasspathEntry(project, entry, null, checkSourceAttachment, referredByContainer); + } + + private static IJavaModelStatus validateClasspathEntry(IJavaProject project, IClasspathEntry entry, IClasspathContainer entryContainer, boolean checkSourceAttachment, boolean referredByContainer){ IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IPath path = entry.getPath(); @@ -1796,7 +1800,7 @@ if (description == null) description = path.makeRelative().toString(); return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CP_CONTAINER_ENTRY, project, path); } - IJavaModelStatus containerEntryStatus = validateClasspathEntry(project, containerEntry, checkSourceAttachment, true/*referred by container*/); + IJavaModelStatus containerEntryStatus = validateClasspathEntry(project, containerEntry, container, checkSourceAttachment, true/*referred by container*/); if (!containerEntryStatus.isOK()){ return containerEntryStatus; } @@ -1825,7 +1829,7 @@ } // get validation status - IJavaModelStatus status = validateClasspathEntry(project, entry, checkSourceAttachment, false/*not referred by container*/); + IJavaModelStatus status = validateClasspathEntry(project, entry, null, checkSourceAttachment, false/*not referred by container*/); if (!status.isOK()) return status; // return deprecation status if any @@ -1846,8 +1850,8 @@ // do not validate entries from Class-Path: in manifest // (these entries are considered optional since the user cannot act on them) // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=252392 - - IJavaModelStatus status = validateLibraryEntry(path, project, checkSourceAttachment ? entry.getSourceAttachmentPath() : null, entryPathMsg); + String containerName = entryContainer != null ? entryContainer.getDescription() : null; + IJavaModelStatus status = validateLibraryEntry(path, project, containerName, checkSourceAttachment ? entry.getSourceAttachmentPath() : null, entryPathMsg); if (!status.isOK()) return status; break; @@ -1916,7 +1920,9 @@ return JavaModelStatus.VERIFIED_OK; } - private static IJavaModelStatus validateLibraryEntry(IPath path, IJavaProject project, IPath sourceAttachment, String entryPathMsg) { + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=232816, now we have the facility to include a container + // name in diagnostics. + private static IJavaModelStatus validateLibraryEntry(IPath path, IJavaProject project, String containerName, IPath sourceAttachment, String entryPathMsg) { if (path.isAbsolute() && !path.isEmpty()) { Object target = JavaModel.getTarget(path, true); if (target != null && !JavaCore.IGNORE.equals(project.getOption(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, true))) { @@ -1955,11 +1961,19 @@ } else { boolean isExternal = path.getDevice() != null || !ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0)).exists(); if (isExternal) { - return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CLASSPATH, Messages.bind(Messages.classpath_unboundLibrary, new String[] {path.toOSString(), project.getElementName()})); + if (containerName != null) { + return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CLASSPATH, Messages.bind(Messages.classpath_unboundLibraryInContainer, new String[] {path.toOSString(), containerName, project.getElementName()})); + } else { + return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CLASSPATH, Messages.bind(Messages.classpath_unboundLibrary, new String[] {path.toOSString(), project.getElementName()})); + } } else { if (entryPathMsg == null) entryPathMsg = project.getElementName().equals(path.segment(0)) ? path.removeFirstSegments(1).makeRelative().toString() : path.toString(); - return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CLASSPATH, Messages.bind(Messages.classpath_unboundLibrary, new String[] {entryPathMsg, project.getElementName()})); + if (containerName != null) { + return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CLASSPATH, Messages.bind(Messages.classpath_unboundLibraryInContainer, new String[] {entryPathMsg, containerName, project.getElementName()})); + } else { + return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CLASSPATH, Messages.bind(Messages.classpath_unboundLibrary, new String[] {entryPathMsg, project.getElementName()})); + } } } } else { Index: model/org/eclipse/jdt/internal/core/util/messages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/messages.properties,v retrieving revision 1.73 diff -u -r1.73 messages.properties --- model/org/eclipse/jdt/internal/core/util/messages.properties 10 Oct 2008 07:28:57 -0000 1.73 +++ model/org/eclipse/jdt/internal/core/util/messages.properties 3 Dec 2008 06:01:25 -0000 @@ -155,6 +155,7 @@ classpath_mustEndWithSlash = End exclusion filter ''{0}'' with / to fully exclude ''{1}'' classpath_unboundContainerPath = Unbound classpath container: ''{0}'' in project ''{1}'' classpath_unboundLibrary = Project ''{1}'' is missing required library: ''{0}'' +classpath_unboundLibraryInContainer = Project ''{2}'' is missing required library: ''{0}'' (contained in ''{1}'') classpath_unboundProject = Project ''{1}'' is missing required Java project: ''{0}'' classpath_settingOutputLocationProgress = Setting output location for: ''{0}'' classpath_settingProgress = Setting classpath for: {0} Index: model/org/eclipse/jdt/internal/core/util/Messages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Messages.java,v retrieving revision 1.24 diff -u -r1.24 Messages.java --- model/org/eclipse/jdt/internal/core/util/Messages.java 10 Oct 2008 07:28:57 -0000 1.24 +++ model/org/eclipse/jdt/internal/core/util/Messages.java 3 Dec 2008 06:01:25 -0000 @@ -159,6 +159,7 @@ public static String classpath_mustEndWithSlash; public static String classpath_unboundContainerPath; public static String classpath_unboundLibrary; + public static String classpath_unboundLibraryInContainer; public static String classpath_unboundProject; public static String classpath_settingOutputLocationProgress; public static String classpath_settingProgress;