/******************************************************************************* * Copyright (c) 2010, Cloudsmith Inc. * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the copyright holder * listed above, as the Initial Contributor under such license. The text of * such license is available at www.eclipse.org. ******************************************************************************/ package org.eclipse.buckminster.team; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.mapping.ResourceTraversal; import org.eclipse.team.core.RepositoryProvider; /** * A helper class dividing resources associated with a single * {@link RepositoryProvider} by depth. Based on (in fact almost identical to): * <code>org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation.TraversalMapEntry</code> * * @author michal.ruzicka@cloudsmith.com * */ class ProviderResources { // The provider for this entry private RepositoryProvider provider; // Files are always shallow private List<IResource> files = new ArrayList<IResource>(); // Not sure what to do with zero depth folders but we'll record them private List<IResource> zeroFolders = new ArrayList<IResource>(); // Non-recursive folder private List<IResource> shallowFolders = new ArrayList<IResource>(); // Recursive folders private List<IResource> deepFolders = new ArrayList<IResource>(); public ProviderResources(RepositoryProvider provider) { this.provider = provider; } /** * Add the resources from the traversal to the entry. * * @param traversal * the traversal */ public void add(ResourceTraversal traversal) { for (IResource resource : traversal.getResources()) { if (resource.getProject().equals(provider.getProject())) { if (resource.getType() == IResource.FILE) { files.add(resource); } else { switch (traversal.getDepth()) { case IResource.DEPTH_ZERO: zeroFolders.add(resource); break; case IResource.DEPTH_ONE: shallowFolders.add(resource); break; case IResource.DEPTH_INFINITE: deepFolders.add(resource); break; default: deepFolders.add(resource); } } } } } /** * Add the resources from the traversals to the entry. * * @param traversals * the traversals */ public void add(ResourceTraversal[] traversals) { for (ResourceTraversal traversal : traversals) { add(traversal); } } /** * Return the resources to be included in a deep operation. If there are no * shallow folders, this will include any files. * * @return */ public IResource[] getDeepResources() { if (deepFolders.isEmpty()) return new IResource[0]; if (!shallowFolders.isEmpty()) return deepFolders.toArray(new IResource[deepFolders.size()]); List<IResource> result = new ArrayList<IResource>(); result.addAll(deepFolders); result.addAll(files); return result.toArray(new IResource[result.size()]); } /** * Return the folders that are depth zero. */ public IResource[] getNontraversedFolders() { return zeroFolders.toArray(new IResource[zeroFolders.size()]); } /** * Return the repository provider for this map entry. * * @return the provider for this entry */ public RepositoryProvider getProvider() { return provider; } /** * Return the resources that can be included in a shallow operation. Include * files with the shallow resources if there are shallow folders or if there * are no shallow or deep folders. * * @return the resources that can be included in a shallow operation */ public IResource[] getShallowResources() { if (shallowFolders.isEmpty() && deepFolders.isEmpty() && !files.isEmpty()) { return files.toArray(new IResource[files.size()]); } if (!shallowFolders.isEmpty()) { if (files.isEmpty()) return shallowFolders.toArray(new IResource[shallowFolders.size()]); List<IResource> result = new ArrayList<IResource>(); result.addAll(shallowFolders); result.addAll(files); return result.toArray(new IResource[result.size()]); } return new IResource[0]; } }