### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/ClassFileTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClassFileTests.java,v retrieving revision 1.29 diff -u -r1.29 ClassFileTests.java --- src/org/eclipse/jdt/core/tests/model/ClassFileTests.java 20 Mar 2007 11:18:53 -0000 1.29 +++ src/org/eclipse/jdt/core/tests/model/ClassFileTests.java 26 Sep 2007 16:43:22 -0000 @@ -12,6 +12,7 @@ import java.io.IOException; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; @@ -451,6 +452,38 @@ } /* + * Ensures that if a root folder (that has a jar like name) is opened, and then a Jar package fragment root created on this root folder, + * then attempting to open a class file in this folder doesn't throw a ClassCastException + * (regression test for bug 204652 "Open Type": ClassCastException in conjunction with a class folder) + */ +public void testJarLikeRootFolder() throws CoreException { + try { + IJavaProject p = createJavaProject("P1", new String[0], new String[] {"/P1/classFolder.jar"}, ""); + IFolder folder = createFolder("/P1/classFolder.jar/p"); + createFile("/P1/classFolder.jar/X.class", "p"); + + // populate cache with a valid package fragment root and a valid package fragment + IPackageFragment validPkg = p.getPackageFragmentRoot(folder.getParent()).getPackageFragment("p"); + validPkg.open(null); + + // create an invalid package fragment root and an invalid package fragment + IPackageFragment invalidPkg = p.getPackageFragmentRoot("/P1/classFolder.jar").getPackageFragment("p"); + + // ensure that the class fille cannot be opened with a valid excepption + IClassFile openable = invalidPkg.getClassFile("X.class"); + JavaModelException expected = null; + try { + openable.open(null); + } catch (JavaModelException e) { + expected = e; + } + assertExceptionEquals("Unexpected exception", "classFolder.jar [in P1] does not exist", expected); + } finally { + deleteProject("P1"); + } +} + +/* * Ensures that the parameter names of a binary method with source attached are correct. */ public void testParameterNames01() throws CoreException { #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/PackageFragmentRoot.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageFragmentRoot.java,v retrieving revision 1.125 diff -u -r1.125 PackageFragmentRoot.java --- model/org/eclipse/jdt/internal/core/PackageFragmentRoot.java 21 Sep 2007 13:16:47 -0000 1.125 +++ model/org/eclipse/jdt/internal/core/PackageFragmentRoot.java 26 Sep 2007 16:43:23 -0000 @@ -324,7 +324,7 @@ if (!(o instanceof PackageFragmentRoot)) return false; PackageFragmentRoot other = (PackageFragmentRoot) o; - return this.resource.equals(other.resource) && + return getResource().equals(other.getResource()) && this.parent.equals(other.parent); } @@ -441,8 +441,9 @@ } } public String getElementName() { - if (this.resource instanceof IFolder) - return ((IFolder) this.resource).getName(); + IResource res = getResource(); + if (res instanceof IFolder) + return ((IFolder) res).getName(); return ""; //$NON-NLS-1$ } /** @@ -703,7 +704,7 @@ } public int hashCode() { - return this.resource.hashCode(); + return getResource().hashCode(); } /** Index: model/org/eclipse/jdt/internal/core/ClassFile.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFile.java,v retrieving revision 1.136 diff -u -r1.136 ClassFile.java --- model/org/eclipse/jdt/internal/core/ClassFile.java 21 Sep 2007 13:16:47 -0000 1.136 +++ model/org/eclipse/jdt/internal/core/ClassFile.java 26 Sep 2007 16:43:23 -0000 @@ -18,6 +18,7 @@ import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -791,8 +792,14 @@ IStatus status = validateClassFile(); if (!status.isOK()) return status; - if (underlyingResource != null && !underlyingResource.isAccessible()) - return newDoesNotExistStatus(); + if (underlyingResource != null) { + if (!underlyingResource.isAccessible()) + return newDoesNotExistStatus(); + PackageFragmentRoot root; + if ((underlyingResource instanceof IFolder) && (root = getPackageFragmentRoot()).isArchive()) { // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=204652 + return root.newDoesNotExistStatus(); + } + } return JavaModelStatus.VERIFIED_OK; } }