### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/SourceMapper.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java,v retrieving revision 1.134 diff -u -r1.134 SourceMapper.java --- model/org/eclipse/jdt/internal/core/SourceMapper.java 21 Apr 2008 08:55:58 -0000 1.134 +++ model/org/eclipse/jdt/internal/core/SourceMapper.java 24 Apr 2008 10:57:04 -0000 @@ -354,11 +354,10 @@ final HashSet firstLevelPackageNames = new HashSet(); boolean containsADefaultPackage = false; + String sourceLevel = null; + String complianceLevel = null; if (root.isArchive()) { JarPackageFragmentRoot jarPackageFragmentRoot = (JarPackageFragmentRoot) root; - IJavaProject project = jarPackageFragmentRoot.getJavaProject(); - String sourceLevel = null; - String complianceLevel = null; JavaModelManager manager = JavaModelManager.getJavaModelManager(); ZipFile zip = null; try { @@ -372,6 +371,7 @@ String firstLevelPackageName = entryName.substring(0, index); if (!firstLevelPackageNames.contains(firstLevelPackageName)) { if (sourceLevel == null) { + IJavaProject project = root.getJavaProject(); sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true); complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true); } @@ -400,7 +400,16 @@ for (int i = 0, max = members.length; i < max; i++) { IResource member = members[i]; if (member.getType() == IResource.FOLDER) { - firstLevelPackageNames.add(member.getName()); + if (sourceLevel == null) { + IJavaProject project = root.getJavaProject(); + sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true); + complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true); + } + String firstLevelPackageName = member.getName(); + IStatus status = JavaConventions.validatePackageName(firstLevelPackageName, sourceLevel, complianceLevel); + if (status.isOK() || status.getSeverity() == IStatus.WARNING) { + firstLevelPackageNames.add(firstLevelPackageName); + } } else if (Util.isClassFileName(member.getName())) { containsADefaultPackage = true; } #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java,v retrieving revision 1.54 diff -u -r1.54 AttachSourceTests.java --- src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java 21 Apr 2008 08:55:55 -0000 1.54 +++ src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java 24 Apr 2008 10:57:05 -0000 @@ -444,7 +444,41 @@ "}", type.getSource()); } finally { - deleteExternalResource("src227813"); + deleteExternalResource("externalFolder/src227813"); + deleteProject("P"); + } +} +/* + * Ensures that root paths are correctly detected when attaching an external source folder that contains a META-INF folder to an external library folder. + * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=228639 ) + */ +public void testExternalFolder5() throws Exception { + try { + String externalFolder = getExternalFolder(); + String[] pathsAndContents = + new String[] { + "p/X.java", + "package p;\n" + + "public class X {\n" + + "}" + }; + org.eclipse.jdt.core.tests.util.Util.createSourceDir(pathsAndContents, externalFolder + "/src228639/src"); + createExternalFolder("externalFolder/src228639/META-INF"); + createExternalFolder("externalFolder/lib/META-INF"); + + String externalLib = externalFolder + "/lib"; + IJavaProject javaProject = createJavaProject("P", new String[0], new String[] {externalLib}, ""); + IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(externalLib); + attachSource(root, externalFolder + "/src228639", ""); + IType type = root.getPackageFragment("p").getClassFile("X.class").getType(); + assertSourceEquals( + "Unexpected source", + "public class X {\n" + + "}", + type.getSource()); + } finally { + deleteExternalResource("externalFolder/src228639"); + deleteExternalResource("externalFolder/lib/META-INF"); deleteProject("P"); } }