### Eclipse Workspace Patch 1.0 #P org.eclipse.core.resources Index: src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java,v retrieving revision 1.2 diff -u -r1.2 ResourceModelProvider.java --- src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java 30 Jan 2006 15:28:03 -0000 1.2 +++ src/org/eclipse/core/internal/resources/mapping/ResourceModelProvider.java 27 Mar 2006 17:49:12 -0000 @@ -10,8 +10,7 @@ *******************************************************************************/ package org.eclipse.core.internal.resources.mapping; -import java.util.HashSet; -import java.util.Set; +import java.util.*; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.mapping.*; @@ -25,28 +24,10 @@ */ public final class ResourceModelProvider extends ModelProvider { - private IResource[] getChildren(IContainer container, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException { - if (context instanceof RemoteResourceMappingContext) { - Set result = new HashSet(); - RemoteResourceMappingContext rrmc = (RemoteResourceMappingContext) context; - IResource[] remoteMembers = rrmc.fetchMembers(container, monitor); - for (int i = 0; i < remoteMembers.length; i++) { - IResource resource = remoteMembers[i]; - result.add(resource); - } - IResource[] localMembers = container.members(); - for (int i = 0; i < localMembers.length; i++) { - IResource resource = localMembers[i]; - result.add(resource); - } - } - return container.members(); - } - /* (non-Javadoc) * @see org.eclipse.core.resources.mapping.ModelProvider#getMappings(org.eclipse.core.resources.IResource, org.eclipse.core.resources.mapping.ResourceMappingContext, org.eclipse.core.runtime.IProgressMonitor) */ - public ResourceMapping[] getMappings(IResource resource, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException { + public ResourceMapping[] getMappings(IResource resource, ResourceMappingContext context, IProgressMonitor monitor) { return new ResourceMapping[] {new SimpleResourceMapping(resource)}; } @@ -69,12 +50,7 @@ if (resource.getType() == IResource.FILE) { result.add(resource); } else { - IResource[] children = getChildren((IContainer) resource, context, monitor); - for (int k = 0; k < children.length; k++) { - IResource child = children[k]; - if (child.getType() == IResource.FILE) - result.add(child); - } + result.add(new ShallowContainer((IContainer)resource)); } break; case IResource.DEPTH_ZERO : @@ -84,6 +60,16 @@ } } } - return getMappings((IResource[]) result.toArray(new IResource[result.size()]), context, monitor); + ResourceMapping[] mappings = new ResourceMapping[result.size()]; + int i = 0; + for (Iterator iter = result.iterator(); iter.hasNext();) { + Object element = iter.next(); + if (element instanceof IResource) { + mappings[i++] = new SimpleResourceMapping((IResource) element); + } else { + mappings[i++] = new ShallowResourceMapping((ShallowContainer)element); + } + } + return mappings; } } Index: src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java,v retrieving revision 1.11 diff -u -r1.11 SimpleResourceMapping.java --- src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java 26 Jan 2006 16:10:24 -0000 1.11 +++ src/org/eclipse/core/internal/resources/mapping/SimpleResourceMapping.java 27 Mar 2006 17:49:12 -0000 @@ -21,9 +21,7 @@ * @since 3.1 */ public class SimpleResourceMapping extends ResourceMapping { - public static final String MODEL_PROVIDER = ModelProvider.RESOURCE_MODEL_PROVIDER_ID; private final IResource resource; - private ResourceTraversal[] traversals; public SimpleResourceMapping(IResource resource) { this.resource = resource; @@ -39,6 +37,11 @@ IResource other = (IResource) object; return resource.getFullPath().isPrefixOf(other.getFullPath()); } + if (object instanceof ShallowContainer) { + ShallowContainer sc = (ShallowContainer) object; + IResource other = sc.getResource(); + return resource.getFullPath().isPrefixOf(other.getFullPath()); + } } return false; } @@ -51,7 +54,7 @@ } public String getModelProviderId() { - return MODEL_PROVIDER; + return ModelProvider.RESOURCE_MODEL_PROVIDER_ID; } /* (non-Javadoc) @@ -67,9 +70,9 @@ * Method declared on ResourceMapping. */ public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) { - if (traversals == null) { - traversals = new ResourceTraversal[] {new ResourceTraversal(new IResource[] {resource}, IResource.DEPTH_INFINITE, IResource.NONE)}; + if (resource.getType() == IResource.ROOT) { + return new ResourceTraversal[] {new ResourceTraversal(((IWorkspaceRoot)resource).getProjects(), IResource.DEPTH_INFINITE, IResource.NONE)}; } - return traversals; + return new ResourceTraversal[] {new ResourceTraversal(new IResource[] {resource}, IResource.DEPTH_INFINITE, IResource.NONE)}; } } Index: src/org/eclipse/core/internal/resources/mapping/ShallowContainer.java =================================================================== RCS file: src/org/eclipse/core/internal/resources/mapping/ShallowContainer.java diff -N src/org/eclipse/core/internal/resources/mapping/ShallowContainer.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/core/internal/resources/mapping/ShallowContainer.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2006 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.core.internal.resources.mapping; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.PlatformObject; + +/** + * A special model object used to represent shallow folders + */ +public class ShallowContainer extends PlatformObject { + + private IContainer container; + + public ShallowContainer(IContainer container) { + this.container = container; + } + + public IContainer getResource() { + return container; + } + + public boolean equals(Object obj) { + if (obj == this) + return true; + if (obj instanceof ShallowContainer) { + ShallowContainer other = (ShallowContainer) obj; + return other.getResource().equals(getResource()); + } + return false; + } + + public int hashCode() { + return getResource().hashCode(); + } + + public Object getAdapter(Class adapter) { + if (adapter == IResource.class || adapter == IContainer.class) + return container; + return super.getAdapter(adapter); + } + +} Index: src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java =================================================================== RCS file: src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java diff -N src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/core/internal/resources/mapping/ShallowResourceMapping.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2006 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.core.internal.resources.mapping; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.mapping.*; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * A resource mapping for a shallow container. + */ +public class ShallowResourceMapping extends ResourceMapping { + + private final ShallowContainer container; + + public ShallowResourceMapping(ShallowContainer container) { + this.container = container; + } + + public Object getModelObject() { + return container; + } + + public String getModelProviderId() { + return ModelProvider.RESOURCE_MODEL_PROVIDER_ID; + } + + public IProject[] getProjects() { + return new IProject[] { container.getResource().getProject() }; + } + + public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) { + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { container.getResource() }, IResource.DEPTH_ONE, IResource.NONE)}; + } + + public boolean contains(ResourceMapping mapping) { + if (mapping.getModelProviderId().equals(this.getModelProviderId())) { + Object object = mapping.getModelObject(); + IResource resource = container.getResource(); + // A shallow mapping only contains direct file children or equal shallow containers + if (object instanceof ShallowContainer) { + ShallowContainer sc = (ShallowContainer) object; + return sc.getResource().equals(resource); + } + if (object instanceof IResource) { + IResource other = (IResource) object; + return other.getType() == IResource.FILE + && resource.getFullPath().equals(other.getFullPath().removeLastSegments(1)); + } + } + return false; + } + +}