### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java,v retrieving revision 1.91 diff -u -r1.91 JavaProjectTests.java --- src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java 26 Feb 2008 10:11:57 -0000 1.91 +++ src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java 28 Feb 2008 16:27:12 -0000 @@ -1030,7 +1030,8 @@ Object[] resources = pkg.getNonJavaResources(); assertResourceTreeEquals( "unexpected non java resources", - "", + "META-INF\n" + + "test.txt", resources); } finally { deleteProject("P"); @@ -1192,7 +1193,8 @@ Object[] resources = root.getNonJavaResources(); assertResourceTreeEquals( "unexpected non java resources", - "", + "META-INF\n" + + "test.txt", resources); } finally { deleteProject("P"); Index: src/org/eclipse/jdt/core/tests/model/JavaElementDeltaTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaElementDeltaTests.java,v retrieving revision 1.81 diff -u -r1.81 JavaElementDeltaTests.java --- src/org/eclipse/jdt/core/tests/model/JavaElementDeltaTests.java 26 Feb 2008 10:11:58 -0000 1.81 +++ src/org/eclipse/jdt/core/tests/model/JavaElementDeltaTests.java 28 Feb 2008 16:27:12 -0000 @@ -855,6 +855,28 @@ */ public void testChangeExternalLibFolder4() throws CoreException { try { + createExternalFolder("externalLib"); + IJavaProject p = createJavaProject("P", new String[0], new String[] {getExternalFolderPath("externalLib")}, ""); + startDeltas(); + createExternalFile("externalLib/test.txt", "test"); + refresh(p); + assertDeltas( + "Unexpected delta", + "P[*]: {CHILDREN}\n" + + " "+ getExternalPath() + "externalLib[*]: {CONTENT}" + ); + } finally { + stopDeltas(); + deleteExternalFolder("externalLib"); + deleteProject("P"); + } +} + +/* + * Ensures that changing an external library folder referenced by a library entry and refreshing triggers the correct delta + */ +public void testChangeExternalLibFolder5() throws CoreException { + try { createExternalFolder("externalLib/p"); IJavaProject p = createJavaProject("P", new String[0], new String[] {getExternalFolderPath("externalLib")}, ""); startDeltas(); @@ -862,7 +884,9 @@ refresh(p); assertDeltas( "Unexpected delta", - "" + "P[*]: {CHILDREN}\n" + + " "+ getExternalPath() + "externalLib[*]: {CHILDREN}\n" + + " p[*]: {CONTENT}" ); } finally { stopDeltas(); Index: src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java,v retrieving revision 1.201 diff -u -r1.201 AbstractJavaModelTests.java --- src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java 27 Feb 2008 15:15:55 -0000 1.201 +++ src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java 28 Feb 2008 16:27:12 -0000 @@ -2553,9 +2553,16 @@ protected void sortResources(Object[] resources) { Util.Comparer comparer = new Util.Comparer() { public int compare(Object a, Object b) { - IResource resourceA = (IResource)a; - IResource resourceB = (IResource)b; - return resourceA.getFullPath().toString().compareTo(resourceB.getFullPath().toString()); } + if (a instanceof IResource) { + IResource resourceA = (IResource)a; + IResource resourceB = (IResource)b; + return resourceA.getFullPath().toString().compareTo(resourceB.getFullPath().toString()); + } else { + IJarEntryResource resourceA = (IJarEntryResource)a; + IJarEntryResource resourceB = (IJarEntryResource)b; + return resourceA.getFullPath().toString().compareTo(resourceB.getFullPath().toString()); + } + } }; Util.sort(resources, comparer); } #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java,v retrieving revision 1.39 diff -u -r1.39 PackageFragmentRootInfo.java --- model/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java 26 Feb 2008 10:11:46 -0000 1.39 +++ model/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java 28 Feb 2008 16:27:14 -0000 @@ -53,11 +53,10 @@ * * @exception JavaModelException The resource associated with this package fragment does not exist */ -static Object[] computeFolderNonJavaResources(JavaProject project, IContainer folder, char[][] inclusionPatterns, char[][] exclusionPatterns) throws JavaModelException { - if (ExternalFoldersManager.isExternal(folder.getFullPath())) - return NO_NON_JAVA_RESOURCES; - Object[] nonJavaResources = new IResource[5]; +static Object[] computeFolderNonJavaResources(IPackageFragmentRoot root, IContainer folder, char[][] inclusionPatterns, char[][] exclusionPatterns) throws JavaModelException { + IResource[] nonJavaResources = new IResource[5]; int nonJavaResourcesCounter = 0; + JavaProject project = (JavaProject) root.getJavaProject(); try { IClasspathEntry[] classpath = project.getResolvedClasspath(); IResource[] members = folder.members(); @@ -97,7 +96,13 @@ nonJavaResources[nonJavaResourcesCounter++] = member; } } - if (nonJavaResources.length != nonJavaResourcesCounter) { + if (ExternalFoldersManager.isExternal(folder.getFullPath())) { + IJarEntryResource[] jarEntryResources = new IJarEntryResource[nonJavaResourcesCounter]; + for (int i = 0; i < nonJavaResourcesCounter; i++) { + jarEntryResources[i] = new NonJavaResource(root, nonJavaResources[i]); + } + return jarEntryResources; + } else if (nonJavaResources.length != nonJavaResourcesCounter) { System.arraycopy(nonJavaResources, 0, (nonJavaResources = new IResource[nonJavaResourcesCounter]), 0, nonJavaResourcesCounter); } return nonJavaResources; @@ -108,7 +113,7 @@ /** * Compute the non-package resources of this package fragment root. */ -private Object[] computeNonJavaResources(IJavaProject project, IResource underlyingResource, PackageFragmentRoot handle) { +private Object[] computeNonJavaResources(IResource underlyingResource, PackageFragmentRoot handle) { Object[] nonJavaResources = NO_NON_JAVA_RESOURCES; try { // the underlying resource may be a folder or a project (in the case that the project folder @@ -116,7 +121,7 @@ if (underlyingResource.getType() == IResource.FOLDER || underlyingResource.getType() == IResource.PROJECT) { nonJavaResources = computeFolderNonJavaResources( - (JavaProject)project, + handle, (IContainer) underlyingResource, handle.fullInclusionPatternChars(), handle.fullExclusionPatternChars()); @@ -132,7 +137,7 @@ synchronized Object[] getNonJavaResources(IJavaProject project, IResource underlyingResource, PackageFragmentRoot handle) { Object[] nonJavaResources = this.fNonJavaResources; if (nonJavaResources == null) { - nonJavaResources = this.computeNonJavaResources(project, underlyingResource, handle); + nonJavaResources = this.computeNonJavaResources(underlyingResource, handle); this.fNonJavaResources = nonJavaResources; } return nonJavaResources; Index: model/org/eclipse/jdt/internal/core/PackageFragmentInfo.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageFragmentInfo.java,v retrieving revision 1.31 diff -u -r1.31 PackageFragmentInfo.java --- model/org/eclipse/jdt/internal/core/PackageFragmentInfo.java 10 May 2006 18:03:48 -0000 1.31 +++ model/org/eclipse/jdt/internal/core/PackageFragmentInfo.java 28 Feb 2008 16:27:14 -0000 @@ -43,7 +43,7 @@ try { this.nonJavaResources = PackageFragmentRootInfo.computeFolderNonJavaResources( - (JavaProject)rootHandle.getJavaProject(), + rootHandle, (IContainer)underlyingResource, rootHandle.fullInclusionPatternChars(), rootHandle.fullExclusionPatternChars()); Index: model/org/eclipse/jdt/internal/core/DeltaProcessor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java,v retrieving revision 1.313 diff -u -r1.313 DeltaProcessor.java --- model/org/eclipse/jdt/internal/core/DeltaProcessor.java 26 Feb 2008 10:11:46 -0000 1.313 +++ model/org/eclipse/jdt/internal/core/DeltaProcessor.java 28 Feb 2008 16:27:14 -0000 @@ -1584,16 +1584,14 @@ * */ private void nonJavaResourcesChanged(Openable element, IResourceDelta delta) throws JavaModelException { - if (ExternalFoldersManager.isExternal(delta.getFullPath())) - return; - // reset non-java resources if element was open if (element.isOpen()) { JavaElementInfo info = (JavaElementInfo)element.getElementInfo(); switch (element.getElementType()) { case IJavaElement.JAVA_MODEL : ((JavaModelInfo) info).nonJavaResources = null; - currentDelta().addResourceDelta(delta); + if (!ExternalFoldersManager.isExternal(delta.getFullPath())) + currentDelta().addResourceDelta(delta); return; case IJavaElement.JAVA_PROJECT : ((JavaProjectElementInfo) info).setNonJavaResources(null); @@ -1603,8 +1601,7 @@ PackageFragmentRoot projectRoot = (PackageFragmentRoot) project.getPackageFragmentRoot(project.getProject()); if (projectRoot.isOpen()) { - ((PackageFragmentRootInfo) projectRoot.getElementInfo()).setNonJavaResources( - null); + ((PackageFragmentRootInfo) projectRoot.getElementInfo()).setNonJavaResources(null); } break; case IJavaElement.PACKAGE_FRAGMENT : @@ -1621,7 +1618,8 @@ // don't use find after creating the delta as it can be null (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=63434) elementDelta = current.changed(element, IJavaElementDelta.F_CONTENT); } - elementDelta.addResourceDelta(delta); + if (!ExternalFoldersManager.isExternal(delta.getFullPath())) + elementDelta.addResourceDelta(delta); } /* * Returns the other root infos for the given path. Look in the old other roots table if kind is REMOVED. Index: model/org/eclipse/jdt/internal/core/NonJavaResource.java =================================================================== RCS file: model/org/eclipse/jdt/internal/core/NonJavaResource.java diff -N model/org/eclipse/jdt/internal/core/NonJavaResource.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ model/org/eclipse/jdt/internal/core/NonJavaResource.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.core; + +import java.io.InputStream; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.PlatformObject; +import org.eclipse.jdt.core.IJarEntryResource; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.internal.core.util.Util; + +public class NonJavaResource extends PlatformObject implements IJarEntryResource { + + private static final IJarEntryResource[] NO_CHILDREN = new IJarEntryResource[0]; + protected Object parent; + protected IResource resource; + + public NonJavaResource(Object parent, IResource resource) { + this.parent = parent; + this.resource = resource; + } + + public boolean equals(Object obj) { + if (! (obj instanceof NonJavaResource)) + return false; + NonJavaResource other = (NonJavaResource) obj; + return this.parent.equals(other.parent) && this.resource.equals(other.resource); + } + + public IJarEntryResource[] getChildren() { + if (this.resource instanceof IContainer) { + IResource[] members; + try { + members = ((IContainer) this.resource).members(); + } catch (CoreException e) { + Util.log(e, "Could not retrieve children of " + this.resource.getFullPath()); //$NON-NLS-1$ + return NO_CHILDREN; + } + int length = members.length; + if (length == 0) + return NO_CHILDREN; + IJarEntryResource[] children = new IJarEntryResource[length]; + for (int i = 0; i < length; i++) { + children[i] = new NonJavaResource(this, members[i]); + } + return children; + } + return NO_CHILDREN; + } + + public InputStream getContents() throws CoreException { + if (this.resource instanceof IFile) + return ((IFile) this.resource).getContents(); + return null; + } + + protected String getEntryName() { + String parentEntryName; + if (this.parent instanceof IPackageFragment) { + String elementName = ((IPackageFragment) this.parent).getElementName(); + parentEntryName = elementName.length() == 0 ? "" : elementName .replace('.', '/') + '/'; //$NON-NLS-1$ + } else if (this.parent instanceof IPackageFragmentRoot) { + parentEntryName = ""; //$NON-NLS-1$ + } else { + parentEntryName = ((NonJavaResource) this.parent).getEntryName() + '/'; + } + return parentEntryName + getName(); + } + + public IPath getFullPath() { + return new Path(getEntryName()).makeAbsolute(); + } + + public String getName() { + return this.resource.getName(); + } + + public IPackageFragmentRoot getPackageFragmentRoot() { + if (this.parent instanceof IPackageFragment) { + return (IPackageFragmentRoot) ((IPackageFragment) this.parent).getParent(); + } else if (this.parent instanceof IPackageFragmentRoot) { + return (IPackageFragmentRoot) this.parent; + } else { + return ((NonJavaResource) this.parent).getPackageFragmentRoot(); + } + } + + public Object getParent() { + return this.parent; + } + + public int hashCode() { + return Util.combineHashCodes(this.resource.hashCode(), this.parent.hashCode()); + } + + public boolean isFile() { + return this.resource instanceof IFile; + } + + public boolean isReadOnly() { + return true; + } + + public String toString() { + return "NonJavaResource["+getEntryName()+"]"; //$NON-NLS-1$ //$NON-NLS-2$ + } +}