diff options
author | Michael Valenta | 2005-10-12 17:16:04 +0000 |
---|---|---|
committer | Michael Valenta | 2005-10-12 17:16:04 +0000 |
commit | 5d365b9600e134b3f994eb1cb952bb4baf476639 (patch) | |
tree | 88734b426161091bc92198ae4d0964807141416d | |
parent | 1de29af75867854cef5643d879949c6947902b50 (diff) | |
download | eclipse.platform.team-5d365b9600e134b3f994eb1cb952bb4baf476639.tar.gz eclipse.platform.team-5d365b9600e134b3f994eb1cb952bb4baf476639.tar.xz eclipse.platform.team-5d365b9600e134b3f994eb1cb952bb4baf476639.zip |
Refactored Input to use new context API and added input to operations
14 files changed, 445 insertions, 359 deletions
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java index 353830cc6..2cf849a93 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java @@ -12,6 +12,7 @@ package org.eclipse.team.core.synchronize; import java.util.*; +import org.eclipse.core.internal.resources.mapping.ResourceTraversal; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.team.internal.core.Messages; @@ -350,4 +351,29 @@ public class SyncInfoTree extends SyncInfoSet { return (IResource[]) children.toArray(new IResource[children.size()]); } + /** + * Return the sync info contained in this set that are contained + * in the given traversals. + * @param traversals the traversals + * @return the sync info contained in this set that are contained + * in the given traversals + * @since 3.2 + */ + public SyncInfo[] getSyncInfos(ResourceTraversal[] traversals) { + SyncInfoSet set = new SyncInfoSet(); + for (int i = 0; i < traversals.length; i++) { + ResourceTraversal traversal = traversals[i]; + IResource[] resources = traversal.getResources(); + for (int j = 0; j < resources.length; j++) { + IResource resource = resources[j]; + SyncInfo[] infos = getSyncInfos(resource, traversal.getDepth()); + for (int k = 0; k < infos.length; k++) { + SyncInfo info = infos[k]; + set.add(info); + } + } + } + return set.getSyncInfos(); + } + } diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberResourceMappingContext.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberResourceMappingContext.java index a919edb80..dce825159 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberResourceMappingContext.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberResourceMappingContext.java @@ -10,17 +10,29 @@ *******************************************************************************/ package org.eclipse.team.internal.core.subscribers; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; -import org.eclipse.core.internal.resources.mapping.*; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; +import org.eclipse.core.internal.resources.mapping.RemoteResourceMappingContext; +import org.eclipse.core.internal.resources.mapping.ResourceTraversal; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceStatus; +import org.eclipse.core.resources.IStorage; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.team.core.TeamException; import org.eclipse.team.core.subscribers.Subscriber; import org.eclipse.team.core.synchronize.SyncInfo; import org.eclipse.team.core.synchronize.SyncInfoFilter; import org.eclipse.team.core.variants.IResourceVariant; -import org.eclipse.team.internal.core.*; +import org.eclipse.team.internal.core.Messages; +import org.eclipse.team.internal.core.Policy; +import org.eclipse.team.internal.core.TeamPlugin; /** * A resource mapping context that provides the client access to the remote state @@ -126,7 +138,7 @@ public class SubscriberResourceMappingContext extends RemoteResourceMappingConte this.autoRefresh = autoRefresh; } - /* (non-Javadoc) + /* (non-Javadoc) * @see org.eclipse.core.internal.resources.mapping.RemoteResourceMappingContext#hasRemoteChange(org.eclipse.core.resources.IResource, org.eclipse.core.runtime.IProgressMonitor) */ public final boolean hasRemoteChange(IResource resource, IProgressMonitor monitor) throws CoreException { diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UpdateModelAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UpdateModelAction.java index 22be7fd43..2302a1f18 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UpdateModelAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UpdateModelAction.java @@ -17,10 +17,9 @@ import org.eclipse.core.internal.resources.mapping.ResourceMapping; import org.eclipse.core.resources.mapping.ModelProvider; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; -import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; -import org.eclipse.team.internal.core.subscribers.SubscriberResourceMappingContext; import org.eclipse.team.ui.mapping.IMergeContext; import org.eclipse.team.ui.mapping.IResourceMappingManualMerger; +import org.eclipse.team.ui.mapping.IResourceMappingOperationInput; import org.eclipse.team.ui.mapping.ResourceMappingMergeOperation; import org.eclipse.team.ui.synchronize.ResourceMappingScope; import org.eclipse.ui.IWorkbenchPart; @@ -34,12 +33,12 @@ public class UpdateModelAction extends WorkspaceTraversalAction { private class CVSMergeOperation extends ResourceMappingMergeOperation { - protected CVSMergeOperation(IWorkbenchPart part, ResourceMapping[] mappings) { - super(part, mappings); + protected CVSMergeOperation(IWorkbenchPart part, IResourceMappingOperationInput input) { + super(part, input); } - protected IMergeContext buildMergeContext(ModelProvider provider, ResourceMapping[] mappings, ResourceMappingScope scope, IProgressMonitor monitor) { - return CVSMergeContext.createContext(mappings, scope, monitor); + protected IMergeContext buildMergeContext(ResourceMappingScope scope, IProgressMonitor monitor) { + return CVSMergeContext.createContext(scope.getResourceMappings(), scope, monitor); } protected IResourceMappingManualMerger getDefaultManualMerger() { @@ -47,14 +46,6 @@ public class UpdateModelAction extends WorkspaceTraversalAction { return null; } - protected RemoteResourceMappingContext getAncestorContext() { - return SubscriberResourceMappingContext.getCheckInContext(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber()); - } - - protected RemoteResourceMappingContext getRemoteContext() { - return SubscriberResourceMappingContext.getUpdateContext(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber()); - } - } /* @@ -72,9 +63,9 @@ public class UpdateModelAction extends WorkspaceTraversalAction { } public void execute(IAction action) throws InterruptedException, InvocationTargetException { - new CVSMergeOperation(getTargetPart(), getCVSResourceMappings()).run(); + new CVSMergeOperation(getTargetPart(), getOperationInput()).run(); } - + public String getId() { return "org.eclipse.team.cvs.ui.modelupdate"; } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceTraversalAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceTraversalAction.java index e1206716a..840829c91 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceTraversalAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceTraversalAction.java @@ -11,23 +11,29 @@ package org.eclipse.team.internal.ccvs.ui.actions; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; -import org.eclipse.core.internal.resources.mapping.*; -import org.eclipse.core.resources.*; -import org.eclipse.core.resources.mapping.IModelProviderDescriptor; -import org.eclipse.core.resources.mapping.ModelProvider; -import org.eclipse.core.runtime.*; +import org.eclipse.core.internal.resources.mapping.ResourceMapping; +import org.eclipse.core.internal.resources.mapping.ResourceMappingContext; +import org.eclipse.core.internal.resources.mapping.ResourceTraversal; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.ltk.core.refactoring.RefactoringStatus; -import org.eclipse.ltk.core.refactoring.participants.*; import org.eclipse.team.core.RepositoryProvider; import org.eclipse.team.core.subscribers.Subscriber; import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; import org.eclipse.team.internal.core.subscribers.SubscriberResourceMappingContext; import org.eclipse.team.internal.ui.dialogs.AdditionalMappingsDialog; +import org.eclipse.team.ui.mapping.IResourceMappingOperationInput; +import org.eclipse.team.ui.mapping.ResourceMappingOperationInput; +import org.eclipse.team.ui.mapping.SimpleResourceMappingOperationInput; import org.eclipse.team.ui.mapping.TeamViewerContext; import org.eclipse.ui.PlatformUI; @@ -46,14 +52,20 @@ public abstract class WorkspaceTraversalAction extends WorkspaceAction { */ protected ResourceMapping[] getCVSResourceMappings() { ResourceMapping[] selectedMappings = getSelectedResourceMappings(CVSProviderPlugin.getTypeId()); - ResourceMapping[] allMappings = convertToParticipantMappings(selectedMappings); - return showAllMappings(selectedMappings, allMappings); + try { + IResourceMappingOperationInput input = new ResourceMappingOperationInput(selectedMappings, ResourceMappingContext.LOCAL_CONTEXT); + input.buildInput(new NullProgressMonitor()); + if (input.hasAdditionalMappings()) { + ResourceMapping[] allMappings = input.getInputMappings(); + return showAllMappings(selectedMappings, allMappings); + } + } catch (CoreException e) { + CVSUIPlugin.log(e); + } + return selectedMappings; } private ResourceMapping[] showAllMappings(final ResourceMapping[] selectedMappings, final ResourceMapping[] allMappings) { - if (isEqualArrays(selectedMappings, allMappings)) - return allMappings; - final boolean[] canceled = new boolean[] { false }; getShell().getDisplay().syncExec(new Runnable() { public void run() { @@ -70,104 +82,6 @@ public abstract class WorkspaceTraversalAction extends WorkspaceAction { return allMappings; } - private boolean isEqualArrays(ResourceMapping[] selectedMappings, ResourceMapping[] allMappings) { - if (selectedMappings.length != allMappings.length) - return false; - for (int i = 0; i < allMappings.length; i++) { - ResourceMapping mapping = allMappings[i]; - boolean matchFound = false; - for (int j = 0; j < selectedMappings.length; j++) { - ResourceMapping selected = selectedMappings[j]; - if (selected.equals(mapping)) { - matchFound = true; - break; - } - } - if (!matchFound) return false; - } - return true; - } - - /* - * Use the registered teamParticpants to determine if additional mappings should be included - * in the operation. - */ - public static ResourceMapping[] convertToParticipantMappings(ResourceMapping[] selectedMappings) { - try { - Map result = new HashMap(); - // TODO: Result drops original selection - IResource[] resources= getResources(selectedMappings); - IModelProviderDescriptor[] descriptors = ModelProvider.getModelProviderDescriptors(); - for (int i = 0; i < descriptors.length; i++) { - IModelProviderDescriptor descriptor = descriptors[i]; - ResourceMapping[] mappings = descriptor.getMappings(resources, getNatures(selectedMappings), new ResourceMappingContext[] { ResourceMappingContext.LOCAL_CONTEXT}, new NullProgressMonitor()); - for (int j = 0; j < mappings.length; j++) { - ResourceMapping mapping = mappings[j]; - result.put(mapping.getModelObject(), mapping); - } - } - return (ResourceMapping[]) result.values().toArray(new ResourceMapping[result.size()]); - } catch (CoreException e) { - CVSUIPlugin.log(e); - } - return selectedMappings; - } - - private static IResource[] getResources(ResourceMapping[] selectedMappings) throws CoreException { - Set result = new HashSet(); - for (int i = 0; i < selectedMappings.length; i++) { - ResourceMapping mapping = selectedMappings[i]; - ResourceTraversal[] traversals = mapping.getTraversals(ResourceMappingContext.LOCAL_CONTEXT, new NullProgressMonitor()); - for (int j = 0; j < traversals.length; j++) { - ResourceTraversal traversal = traversals[j]; - IResource[] resources = traversal.getResources(); - if (traversal.getDepth() == IResource.DEPTH_INFINITE) { - result.addAll(Arrays.asList(resources)); - } else if (traversal.getDepth() == IResource.DEPTH_ONE) { - for (int k = 0; k < resources.length; k++) { - IResource resource = resources[k]; - if (resource.getType() == IResource.FILE) { - result.add(resource); - } else { - IResource[] members = ((IContainer)resource).members(); - for (int index = 0; index < members.length; index++) { - IResource member = members[index]; - if (member.getType() == IResource.FILE) { - result.add(member); - } - } - } - } - } else { - for (int k = 0; k < resources.length; k++) { - IResource resource = resources[k]; - if (resource.getType() == IResource.FILE) { - result.add(resource); - } - } - } - } - } - return (IResource[]) result.toArray(new IResource[result.size()]); - } - - private static String[] getNatures(ResourceMapping[] selectedMappings) { - Set result = new HashSet(); - for (int i = 0; i < selectedMappings.length; i++) { - ResourceMapping mapping = selectedMappings[i]; - IProject[] projects = mapping.getProjects(); - for (int j = 0; j < projects.length; j++) { - IProject project = projects[j]; - try { - result.addAll(Arrays.asList(project.getDescription().getNatureIds())); - } catch (CoreException e) { - CVSUIPlugin.log(e); - } - } - } - return (String[]) result.toArray(new String[result.size()]); - } - protected static IResource[] getRootTraversalResources(ResourceMapping[] mappings, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException { List result = new ArrayList(); for (int i = 0; i < mappings.length; i++) { @@ -195,7 +109,15 @@ public abstract class WorkspaceTraversalAction extends WorkspaceAction { return getResourcesToCompare(getCVSResourceMappings(), subscriber); } - public static IResource[] getResourcesToCompare(final ResourceMapping[] mappings, final Subscriber subscriber) throws InvocationTargetException { + protected ResourceMappingContext getResourceMappingContext() { + return SubscriberResourceMappingContext.getCompareContext(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber()); + } + + protected SimpleResourceMappingOperationInput getOperationInput() { + return new SimpleResourceMappingOperationInput(getSelectedResourceMappings(CVSProviderPlugin.getTypeId()), getResourceMappingContext()); + } + + public static IResource[] getResourcesToCompare(final ResourceMapping[] mappings, final Subscriber subscriber) throws InvocationTargetException { // Determine what resources need to be synchronized. // Use a resource mapping context to include any relevant remote resources final IResource[][] resources = new IResource[][] { null }; diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java index 0e0ffa19b..c32cf30d8 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java @@ -71,17 +71,13 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { */ public static String getLabel(ResourceMapping mapping) { Object o = null; - try { - o = mapping.getModelProvider().getAdapter(INavigatorContentExtensionFactory.class); - if (o instanceof INavigatorContentExtensionFactory) { - INavigatorContentExtensionFactory factory = (INavigatorContentExtensionFactory) o; - ILabelProvider labelProvider = factory.getLabelProvider(); - String text = labelProvider.getText(mapping); - labelProvider.dispose(); // TODO should keep label provider around - return text; - } - } catch (CoreException e) { - TeamUIPlugin.log(e); + o = mapping.getModelProvider().getAdapter(INavigatorContentExtensionFactory.class); + if (o instanceof INavigatorContentExtensionFactory) { + INavigatorContentExtensionFactory factory = (INavigatorContentExtensionFactory) o; + ILabelProvider labelProvider = factory.getLabelProvider(); + String text = labelProvider.getText(mapping); + labelProvider.dispose(); // TODO should keep label provider around + return text; } o = mapping; IWorkbenchAdapter workbenchAdapter = getWorkbenchAdapter((IAdaptable)o); diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java index 9941166fe..c05d9934f 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java @@ -10,35 +10,63 @@ *******************************************************************************/ package org.eclipse.team.internal.ui.mapping; +import org.eclipse.core.internal.resources.mapping.ResourceMapping; +import org.eclipse.core.internal.resources.mapping.ResourceTraversal; +import org.eclipse.core.resources.mapping.ModelProvider; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.core.synchronize.SyncInfo; +import org.eclipse.team.core.synchronize.SyncInfoTree; import org.eclipse.team.internal.ui.Policy; import org.eclipse.team.ui.mapping.IMergeContext; import org.eclipse.team.ui.mapping.IResourceMappingMerger; +import org.eclipse.team.ui.mapping.IResourceMappingOperationInput; import org.eclipse.team.ui.mapping.MergeStatus; -import org.eclipse.team.ui.synchronize.ResourceMappingScope; /** * A default merger that delegates the merge to the merge context. */ public class DefaultResourceMappingMerger implements IResourceMappingMerger { + private final ModelProvider provider; + private final IResourceMappingOperationInput input; + + public DefaultResourceMappingMerger(ModelProvider provider, IResourceMappingOperationInput input) { + this.provider = provider; + this.input = input; + } + public IStatus merge(IMergeContext mergeContext, IProgressMonitor monitor) throws CoreException { try { + SyncInfoTree tree = getSetToMerge(mergeContext); monitor.beginTask(null, 100); - IStatus status = mergeContext.merge(mergeContext.getSyncInfoTree(), Policy.subMonitorFor(monitor, 75)); + IStatus status = mergeContext.merge(tree, Policy.subMonitorFor(monitor, 75)); return covertFilesToMappings(status, mergeContext); } finally { monitor.done(); } } + private SyncInfoTree getSetToMerge(IMergeContext mergeContext) { + ResourceMapping[] mappings = input.getMappings(provider); + SyncInfoTree result = new SyncInfoTree(); + for (int i = 0; i < mappings.length; i++) { + ResourceMapping mapping = mappings[i]; + ResourceTraversal[] traversals = input.getTraversal(mapping); + SyncInfo[] infos = mergeContext.getSyncInfoTree().getSyncInfos(traversals); + for (int j = 0; j < infos.length; j++) { + SyncInfo info = infos[j]; + result.add(info); + } + } + return result; + } + private IStatus covertFilesToMappings(IStatus status, IMergeContext mergeContext) { if (status.getCode() == MergeStatus.CONFLICTS) { // In general, we can't say which mapping failed so return them all - // TODO: Should not assume that we are dealing with a resource mapping scope - return new MergeStatus(status.getPlugin(), status.getMessage(), ((ResourceMappingScope)mergeContext.getScope()).getResourceMappings()); + return new MergeStatus(status.getPlugin(), status.getMessage(), input.getMappings(provider)); } return status; } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/IResourceMappingOperationInput.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/IResourceMappingOperationInput.java new file mode 100644 index 000000000..7e28afbaa --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/IResourceMappingOperationInput.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 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.team.ui.mapping; + +import org.eclipse.core.internal.resources.mapping.ResourceMapping; +import org.eclipse.core.internal.resources.mapping.ResourceTraversal; +import org.eclipse.core.resources.mapping.ModelProvider; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * Interface which defines the protocol for translating + * a set of <code>ResourceMapping</code> objects representing + * a view selection into the complete set of resources to + * be operated on. + * <p> + * This interface is not intended to be implemented by clients + * @see org.eclipse.core.internal.resources.mapping.ResourceMapping + * @since 3.2 + */ +public interface IResourceMappingOperationInput { + + /** + * Return the set of mappings that were selected + * when the operation was launched. These mappings + * are used to seed the input determination process. + * @return the set of mappings that were selected + * when the operation was launched + */ + public ResourceMapping[] getSeedMappings(); + + /** + * Calculate the set of mappings to be operated on. + * This method must be called before <code>getInputMappings</code> + * or <code>getInputTraversals</code>. + * + * @param monitor a progress monitor + * @throws CoreException + */ + public void buildInput(IProgressMonitor monitor) throws CoreException; + + /** + * Return the complete set of mappings to be operated on. + * This method should only be invoked after <code>buildInput</code> + * is called. + * @return the complete set of mappings to be operated on + */ + public ResourceMapping[] getInputMappings(); + + /** + * Return the set of traversals that cover the input + * resource mappings. + * This method should only be invoked after <code>buildInput</code> + * is called. + * @return the complete set of mappings to be operated on + */ + public ResourceTraversal[] getInputTraversals(); + + /** + * Return the traversals that cover the given mapping. + * @param mapping a resource mapping being operated on + * @return the traversals that cover the given resource mapping + * (or <code>null</code> if the mapping is not contained in the input) + */ + public ResourceTraversal[] getTraversal(ResourceMapping mapping); + + /** + * Return whether the input has additional mappings added to the + * seed mappings. + * This method should only be invoked after <code>buildInput</code> + * is called. + * @return whether the input has additional mappings added to the + * seed mappings + */ + public boolean hasAdditionalMappings(); + + public ModelProvider[] getModelProviders(); + + public ResourceMapping[] getMappings(ModelProvider provider); +} diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingCheckinOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingCheckinOperation.java index 745458c14..85fb91140 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingCheckinOperation.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingCheckinOperation.java @@ -12,7 +12,6 @@ package org.eclipse.team.ui.mapping; import java.lang.reflect.InvocationTargetException; -import org.eclipse.core.internal.resources.mapping.ResourceMapping; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ui.IWorkbenchPart; @@ -73,8 +72,8 @@ import org.eclipse.ui.IWorkbenchPart; */ public abstract class ResourceMappingCheckinOperation extends ResourceMappingOperation { - protected ResourceMappingCheckinOperation(IWorkbenchPart part, ResourceMapping[] mappings) { - super(part, mappings); + protected ResourceMappingCheckinOperation(IWorkbenchPart part, IResourceMappingOperationInput input) { + super(part, input); } protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingLoadOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingLoadOperation.java index 951934811..7d0f724de 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingLoadOperation.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingLoadOperation.java @@ -40,8 +40,8 @@ import org.eclipse.ui.IWorkbenchPart; */ public class ResourceMappingLoadOperation extends ResourceMappingOperation { - protected ResourceMappingLoadOperation(IWorkbenchPart part, ResourceMapping[] mappings) { - super(part, mappings); + protected ResourceMappingLoadOperation(IWorkbenchPart part, IResourceMappingOperationInput input) { + super(part, input); } protected void execute(IProgressMonitor monitor) diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingMergeOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingMergeOperation.java index a1a625dba..c5dd63c4d 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingMergeOperation.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingMergeOperation.java @@ -105,12 +105,9 @@ import org.eclipse.ui.IWorkbenchPart; * the merge at the level selected and not involve participants. */ public abstract class ResourceMappingMergeOperation extends ResourceMappingOperation { - - private Map providerToMappings; - private Map providerToTraversalsMap; - protected ResourceMappingMergeOperation(IWorkbenchPart part, ResourceMapping[] mappings) { - super(part, mappings); + protected ResourceMappingMergeOperation(IWorkbenchPart part, IResourceMappingOperationInput input) { + super(part, input); } /* (non-Javadoc) @@ -118,88 +115,27 @@ public abstract class ResourceMappingMergeOperation extends ResourceMappingOpera */ protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { - Map contexts = buildMergeContexts(monitor); - for (Iterator iter = contexts.keySet().iterator(); iter.hasNext();) { - ModelProvider provider = (ModelProvider) iter.next(); - performMerge(provider, (IMergeContext)contexts.get(provider), monitor); + IMergeContext context = buildMergeContext(monitor); + ModelProvider[] providers = getInput().getModelProviders(); + for (int i = 0; i < providers.length; i++) { + ModelProvider provider = providers[i]; + performMerge(provider, context, monitor); } } catch (CoreException e) { throw new InvocationTargetException(e); } } - private Map buildMergeContexts(IProgressMonitor monitor) throws CoreException { - Map providerToMappings = getProviderToMappingsMap(); - Map result = new HashMap(); - for (Iterator iter = providerToMappings.keySet().iterator(); iter.hasNext();) { - ModelProvider provider = (ModelProvider) iter.next(); - List list = (List)providerToMappings.get(provider); - ResourceMapping[] providerMappings = (ResourceMapping[]) list.toArray(new ResourceMapping[list.size()]); - ResourceMappingScope scope = buildMergeContextScope(provider, providerMappings, monitor); - IMergeContext context = buildMergeContext(provider, providerMappings, scope, monitor); - result.put(provider, context); - } - return result; + private IMergeContext buildMergeContext(IProgressMonitor monitor) throws CoreException { + ResourceMappingScope scope = buildMergeContextScope(monitor); + IMergeContext context = buildMergeContext(scope, monitor); + return context; } - private ResourceMappingScope buildMergeContextScope(ModelProvider provider, ResourceMapping[] providerMappings, IProgressMonitor monitor) throws CoreException { - RemoteResourceMappingContext context = getRemoteContext(); - ResourceTraversal[] remoteTraversals = provider.getTraversals(providerMappings, context, monitor); - RemoteResourceMappingContext ancestorContext = getAncestorContext(); - ResourceTraversal[] ancestorTraversals = provider.getTraversals(providerMappings, context, monitor); - ResourceTraversal[] traversals = combineTraversals(remoteTraversals, ancestorTraversals); - return new ResourceMappingScope("TODO: Provide mapping scope description", providerMappings, traversals); + private ResourceMappingScope buildMergeContextScope(IProgressMonitor monitor) throws CoreException { + return new ResourceMappingScope("TODO: Provide mapping scope description", getInput().getInputMappings(), getInput().getInputTraversals()); } - private ResourceTraversal[] combineTraversals(ResourceTraversal[] remoteTraversals, ResourceTraversal[] ancestorTraversals) { - Set zero = new HashSet(); - Set shallow = new HashSet(); - Set deep = new HashSet(); - for (int i = 0; i < ancestorTraversals.length; i++) { - ResourceTraversal traversal = ancestorTraversals[i]; - switch (traversal.getDepth()) { - case IResource.DEPTH_ZERO: - zero.addAll(Arrays.asList(traversal.getResources())); - break; - case IResource.DEPTH_ONE: - shallow.addAll(Arrays.asList(traversal.getResources())); - break; - case IResource.DEPTH_INFINITE: - deep.addAll(Arrays.asList(traversal.getResources())); - break; - } - } - for (int i = 0; i < remoteTraversals.length; i++) { - ResourceTraversal traversal = remoteTraversals[i]; - switch (traversal.getDepth()) { - case IResource.DEPTH_ZERO: - zero.addAll(Arrays.asList(traversal.getResources())); - break; - case IResource.DEPTH_ONE: - shallow.addAll(Arrays.asList(traversal.getResources())); - break; - case IResource.DEPTH_INFINITE: - deep.addAll(Arrays.asList(traversal.getResources())); - break; - } - } - List result = new ArrayList(); - if (!zero.isEmpty()) { - result.add(new ResourceTraversal((IResource[]) zero.toArray(new IResource[zero.size()]), IResource.DEPTH_ZERO, IResource.NONE)); - } - if (!shallow.isEmpty()) { - result.add(new ResourceTraversal((IResource[]) shallow.toArray(new IResource[shallow.size()]), IResource.DEPTH_ONE, IResource.NONE)); - } - if (!deep.isEmpty()) { - result.add(new ResourceTraversal((IResource[]) deep.toArray(new IResource[deep.size()]), IResource.DEPTH_INFINITE, IResource.NONE)); - } - return (ResourceTraversal[]) result.toArray(new ResourceTraversal[result.size()]); - } - - protected abstract RemoteResourceMappingContext getAncestorContext(); - - protected abstract RemoteResourceMappingContext getRemoteContext(); - /** * Build and initialize a merge context for the given mappings. * The mappings will all be from the given provider or one @@ -209,50 +145,7 @@ public abstract class ResourceMappingMergeOperation extends ResourceMappingOpera * @param monitor a progress monitor * @return a merge context for merging the mappings */ - protected abstract IMergeContext buildMergeContext(ModelProvider provider, ResourceMapping[] mappings, ResourceMappingScope scope, IProgressMonitor monitor); - - private Map getProviderToMappingsMap() throws CoreException { - if (providerToMappings == null) { - Map result = new HashMap(); - ResourceMapping[] mappings = getMappings(); - for (int i = 0; i < mappings.length; i++) { - ResourceMapping mapping = mappings[i]; - ModelProvider provider = mapping.getModelProvider(); - List l = (List)result.get(provider); - if (l == null) { - l = new ArrayList(); - result.put(provider, l); - } - l.add(mapping); - } - providerToMappings = result; - } - return providerToMappings; - } - - protected void buildInput(IProgressMonitor monitor) throws InvocationTargetException { - try { - promptToIncludeAdditionalMappings(); - buildProviderToTraversalMap(monitor); - // TODO Determine the projection of the selection onto resources - } catch (CoreException e) { - throw new InvocationTargetException(e); - } - - super.buildInput(monitor); - } - - private void promptToIncludeAdditionalMappings() throws CoreException { - Map providerToMappings = getProviderToMappingsMap(); - // TODO Auto-generated method stub - - } - - private Map buildProviderToTraversalMap(IProgressMonitor monitor) { - // TODO Auto-generated method stub - providerToTraversalsMap = new HashMap(); - return null; - } + protected abstract IMergeContext buildMergeContext(ResourceMappingScope scope, IProgressMonitor monitor); /** * Merge all the mappings that come from the given provider. By default, @@ -273,6 +166,7 @@ public abstract class ResourceMappingMergeOperation extends ResourceMappingOpera } else { if (status.getCode() == MergeStatus.CONFLICTS) { MergeStatus ms = (MergeStatus)status; + // TODO: Perhaps should be delayed until all models are attempted performManualMerge(provider, ms.getConflictingMappings(), mergeContext, Policy.subMonitorFor(monitor, 5)); } else { throw new TeamException(status); @@ -300,7 +194,6 @@ public abstract class ResourceMappingMergeOperation extends ResourceMappingOpera } protected void performManualMerge(ModelProvider provider, ResourceMapping[] conflictingMappings, IMergeContext mergeContext, IProgressMonitor monitor) throws CoreException { -// mergeContext.restrictTo(conflictingMappings, monitor); IResourceMappingManualMerger merger = getManualMerger(provider); merger.performManualMerge(getPart(), mergeContext, monitor); } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperation.java index b0f4b3fce..2f430a992 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperation.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperation.java @@ -62,7 +62,7 @@ import org.eclipse.ui.IWorkbenchPart; */ public abstract class ResourceMappingOperation extends TeamOperation { - private ResourceMapping[] mappings; + private final IResourceMappingOperationInput input; private static IResource[] getResources(ResourceMapping[] selectedMappings) throws CoreException { Set result = new HashSet(); @@ -101,34 +101,22 @@ public abstract class ResourceMappingOperation extends TeamOperation { } return (IResource[]) result.toArray(new IResource[result.size()]); } - - private static String[] getNatures(ResourceMapping[] selectedMappings) { - Set result = new HashSet(); - for (int i = 0; i < selectedMappings.length; i++) { - ResourceMapping mapping = selectedMappings[i]; - IProject[] projects = mapping.getProjects(); - for (int j = 0; j < projects.length; j++) { - IProject project = projects[j]; - try { - result.addAll(Arrays.asList(project.getDescription().getNatureIds())); - } catch (CoreException e) { - TeamUIPlugin.log(e); - } - } - } - return (String[]) result.toArray(new String[result.size()]); - } - protected ResourceMappingOperation(IWorkbenchPart part, ResourceMapping[] mappings) { + /** + * Create a resource mapping based operation + * @param part the workspace part from which the operation was launched + * @param input the input to the operation (which must have already been built by + * invoking <code>buildInput</code>. + */ + protected ResourceMappingOperation(IWorkbenchPart part, IResourceMappingOperationInput input) { super(part); - this.mappings = mappings; + this.input = input; } public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { buildInput(monitor); execute(monitor); - } /** @@ -137,16 +125,17 @@ public abstract class ResourceMappingOperation extends TeamOperation { * @param monitor */ protected void buildInput(IProgressMonitor monitor) throws InvocationTargetException { - + try { + input.buildInput(monitor); + // TODO: Prompt user if input changed + } catch (CoreException e) { + throw new InvocationTargetException(e); + } } protected abstract void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException; - public ResourceMapping[] getMappings() { - return mappings; - } - /** * Return the auto-merger associated with the given model provider * view the adaptable mechanism. @@ -161,7 +150,7 @@ public abstract class ResourceMappingOperation extends TeamOperation { if (o instanceof IResourceMappingMerger) { return (IResourceMappingMerger) o; } - return new DefaultResourceMappingMerger(); + return new DefaultResourceMappingMerger(provider, getInput()); } /** @@ -179,5 +168,9 @@ public abstract class ResourceMappingOperation extends TeamOperation { * TODO: Early stages */ protected abstract IResourceMappingManualMerger getDefaultManualMerger(); + + public IResourceMappingOperationInput getInput() { + return input; + } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperationInput.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperationInput.java index 4247b620c..297fe7add 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperationInput.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/ResourceMappingOperationInput.java @@ -67,47 +67,14 @@ import org.eclipse.team.internal.ui.TeamUIPlugin; * </ol> * @since 3.2 */ -public class ResourceMappingOperationInput { +public class ResourceMappingOperationInput extends SimpleResourceMappingOperationInput { - private final ResourceMapping[] inputMappings; - private final ResourceMappingContext[] contexts; private final Map inputMappingsToResources = new HashMap(); private final Map targetMappingsToResources = new HashMap(); - - protected static ResourceTraversal[] combineTraversals(ResourceTraversal[] allTraversals) { - Set zero = new HashSet(); - Set shallow = new HashSet(); - Set deep = new HashSet(); - for (int i = 0; i < allTraversals.length; i++) { - ResourceTraversal traversal = allTraversals[i]; - switch (traversal.getDepth()) { - case IResource.DEPTH_ZERO: - zero.addAll(Arrays.asList(traversal.getResources())); - break; - case IResource.DEPTH_ONE: - shallow.addAll(Arrays.asList(traversal.getResources())); - break; - case IResource.DEPTH_INFINITE: - deep.addAll(Arrays.asList(traversal.getResources())); - break; - } - } - List result = new ArrayList(); - if (!zero.isEmpty()) { - result.add(new ResourceTraversal((IResource[]) zero.toArray(new IResource[zero.size()]), IResource.DEPTH_ZERO, IResource.NONE)); - } - if (!shallow.isEmpty()) { - result.add(new ResourceTraversal((IResource[]) shallow.toArray(new IResource[shallow.size()]), IResource.DEPTH_ONE, IResource.NONE)); - } - if (!deep.isEmpty()) { - result.add(new ResourceTraversal((IResource[]) deep.toArray(new IResource[deep.size()]), IResource.DEPTH_INFINITE, IResource.NONE)); - } - return (ResourceTraversal[]) result.toArray(new ResourceTraversal[result.size()]); - } + private boolean hasAdditionalMappings; - public ResourceMappingOperationInput(ResourceMapping[] mappings, ResourceMappingContext[] contexts) { - this.inputMappings = mappings; - this.contexts = contexts; + public ResourceMappingOperationInput(ResourceMapping[] mappings, ResourceMappingContext context) { + super(mappings, context); } public void buildInput(IProgressMonitor monitor) throws CoreException { @@ -119,6 +86,21 @@ public class ResourceMappingOperationInput { newResources = addToTargetMappingToResourceMap(targetMappings, Policy.subMonitorFor(monitor, IProgressMonitor.UNKNOWN)); targetMappings = internalGetMappingsFromProviders((IResource[]) newResources.toArray(new IResource[newResources.size()]), getAffectedNatures(targetMappings), Policy.subMonitorFor(monitor, IProgressMonitor.UNKNOWN)); } while (!newResources.isEmpty()); + hasAdditionalMappings = internalHasAdditionalMappings(); + } + + private boolean internalHasAdditionalMappings() { + ResourceMapping[] inputMappings = getSeedMappings(); + if (inputMappings .length == targetMappingsToResources.size()) { + for (int i = 0; i < inputMappings.length; i++) { + ResourceMapping mapping = inputMappings[i]; + if (!targetMappingsToResources.containsKey(mapping)) { + return false; + } + } + return true; + } + return false; } private String[] getAffectedNatures(Set targetMappings) { @@ -143,7 +125,7 @@ public class ResourceMappingOperationInput { IModelProviderDescriptor[] descriptors = ModelProvider.getModelProviderDescriptors(); for (int i = 0; i < descriptors.length; i++) { IModelProviderDescriptor descriptor = descriptors[i]; - ResourceMapping[] mappings = descriptor.getMappings(resources, affectedNatures, contexts, monitor); + ResourceMapping[] mappings = descriptor.getMappings(resources, affectedNatures, getContext(), monitor); result.addAll(Arrays.asList(mappings)); } return result; @@ -154,7 +136,7 @@ public class ResourceMappingOperationInput { for (Iterator iter = targetMappings.iterator(); iter.hasNext();) { ResourceMapping mapping = (ResourceMapping) iter.next(); if (!targetMappingsToResources.containsKey(mapping)) { - ResourceTraversal[] traversals = getTraversals(mapping, Policy.subMonitorFor(monitor, 100)); + ResourceTraversal[] traversals = mapping.getTraversals(getContext(), Policy.subMonitorFor(monitor, 100)); targetMappingsToResources.put(mapping, traversals); newResources.addAll(internalGetResources(traversals)); } @@ -177,28 +159,39 @@ public class ResourceMappingOperationInput { } private void buildInputMappingToResourcesMap(IProgressMonitor monitor) throws CoreException { + ResourceMapping[] inputMappings = getSeedMappings(); monitor.beginTask(null, inputMappings.length * 100); for (int i = 0; i < inputMappings.length; i++) { ResourceMapping mapping = inputMappings[i]; - ResourceTraversal[] traversals = getTraversals(mapping, Policy.subMonitorFor(monitor, 100)); + ResourceTraversal[] traversals = mapping.getTraversals(getContext(), Policy.subMonitorFor(monitor, 100)); inputMappingsToResources.put(mapping, traversals); } monitor.done(); } - private ResourceTraversal[] getTraversals(ResourceMapping mapping, IProgressMonitor monitor) throws CoreException { - try { - monitor.beginTask(null, contexts.length * 100); - List traversals = new ArrayList(); - for (int i = 0; i < contexts.length; i++) { - ResourceMappingContext context = contexts[i]; - traversals.addAll(Arrays.asList(mapping.getTraversals(context, Policy.subMonitorFor(monitor, 100)))); - Policy.checkCanceled(monitor); + public ResourceMapping[] getInputMappings() { + return (ResourceMapping[]) targetMappingsToResources.keySet().toArray(new ResourceMapping[targetMappingsToResources.size()]); + } + + public ResourceTraversal[] getInputTraversals() { + Collection values = targetMappingsToResources.values(); + List result = new ArrayList(); + for (Iterator iter = values.iterator(); iter.hasNext();) { + ResourceTraversal[] traversals = (ResourceTraversal[]) iter.next(); + for (int i = 0; i < traversals.length; i++) { + ResourceTraversal traversal = traversals[i]; + result.add(traversal); } - return combineTraversals((ResourceTraversal[]) traversals.toArray(new ResourceTraversal[traversals.size()])); - } finally { - monitor.done(); } + return combineTraversals((ResourceTraversal[]) result.toArray(new ResourceTraversal[result.size()])); + } + + public ResourceTraversal[] getTraversal(ResourceMapping mapping) { + return (ResourceTraversal[])targetMappingsToResources.get(mapping); + } + + public boolean hasAdditionalMappings() { + return hasAdditionalMappings; } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SimpleResourceMappingOperationInput.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SimpleResourceMappingOperationInput.java new file mode 100644 index 000000000..18af00086 --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SimpleResourceMappingOperationInput.java @@ -0,0 +1,149 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 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.team.ui.mapping; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.internal.resources.mapping.ResourceMapping; +import org.eclipse.core.internal.resources.mapping.ResourceMappingContext; +import org.eclipse.core.internal.resources.mapping.ResourceTraversal; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.mapping.ModelProvider; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.internal.core.subscribers.SubscriberResourceMappingContext; +import org.eclipse.team.internal.ui.Policy; + +/** + * A simple implementation of an operation input that + * does not transform the input. + * @since 3.2 + */ +public class SimpleResourceMappingOperationInput implements + IResourceMappingOperationInput { + + private ResourceMapping[] mappings; + private ResourceMappingContext context; + private Map mappingToTraversalsMap = new HashMap(); + + public SimpleResourceMappingOperationInput(ResourceMapping[] mappings, ResourceMappingContext context) { + this.mappings = mappings; + this.context = context; + } + + public ResourceMapping[] getSeedMappings() { + return mappings; + } + + public void buildInput(IProgressMonitor monitor) throws CoreException { + buildInputMappingToTraversalsMap(monitor); + } + + public ResourceMapping[] getInputMappings() { + return mappings; + } + + public ResourceTraversal[] getInputTraversals() { + Collection values = mappingToTraversalsMap.values(); + List result = new ArrayList(); + for (Iterator iter = values.iterator(); iter.hasNext();) { + ResourceTraversal[] traversals = (ResourceTraversal[]) iter.next(); + for (int i = 0; i < traversals.length; i++) { + ResourceTraversal traversal = traversals[i]; + result.add(traversal); + } + } + return combineTraversals((ResourceTraversal[]) result.toArray(new ResourceTraversal[result.size()])); + } + + public ResourceTraversal[] getTraversal(ResourceMapping mapping) { + return (ResourceTraversal[])mappingToTraversalsMap.get(mapping); + } + + public boolean hasAdditionalMappings() { + return false; + } + + private void buildInputMappingToTraversalsMap(IProgressMonitor monitor) throws CoreException { + monitor.beginTask(null, mappings.length * 100); + for (int i = 0; i < mappings.length; i++) { + ResourceMapping mapping = mappings[i]; + ResourceTraversal[] traversals = mapping.getTraversals(context, Policy.subMonitorFor(monitor, 100)); + mappingToTraversalsMap.put(mapping, traversals); + } + monitor.done(); + } + + protected static ResourceTraversal[] combineTraversals(ResourceTraversal[] allTraversals) { + Set zero = new HashSet(); + Set shallow = new HashSet(); + Set deep = new HashSet(); + for (int i = 0; i < allTraversals.length; i++) { + ResourceTraversal traversal = allTraversals[i]; + switch (traversal.getDepth()) { + case IResource.DEPTH_ZERO: + zero.addAll(Arrays.asList(traversal.getResources())); + break; + case IResource.DEPTH_ONE: + shallow.addAll(Arrays.asList(traversal.getResources())); + break; + case IResource.DEPTH_INFINITE: + deep.addAll(Arrays.asList(traversal.getResources())); + break; + } + } + List result = new ArrayList(); + if (!zero.isEmpty()) { + result.add(new ResourceTraversal((IResource[]) zero.toArray(new IResource[zero.size()]), IResource.DEPTH_ZERO, IResource.NONE)); + } + if (!shallow.isEmpty()) { + result.add(new ResourceTraversal((IResource[]) shallow.toArray(new IResource[shallow.size()]), IResource.DEPTH_ONE, IResource.NONE)); + } + if (!deep.isEmpty()) { + result.add(new ResourceTraversal((IResource[]) deep.toArray(new IResource[deep.size()]), IResource.DEPTH_INFINITE, IResource.NONE)); + } + return (ResourceTraversal[]) result.toArray(new ResourceTraversal[result.size()]); + } + + public ModelProvider[] getModelProviders() { + Set result = new HashSet(); + ResourceMapping[] mappings = getInputMappings(); + for (int i = 0; i < mappings.length; i++) { + ResourceMapping mapping = mappings[i]; + result.add(mapping.getModelProvider()); + } + return (ModelProvider[]) result.toArray(new ModelProvider[result.size()]); + } + + public ResourceMappingContext getContext() { + return context; + } + + public ResourceMapping[] getMappings(ModelProvider provider) { + Set result = new HashSet(); + ResourceMapping[] mappings = getInputMappings(); + for (int i = 0; i < mappings.length; i++) { + ResourceMapping mapping = mappings[i]; + if (mapping.getModelProviderId().equals(provider.getDescriptor().getId())) { + result.add(mapping); + } + } + return (ResourceMapping[]) result.toArray(new ResourceMapping[result.size()]); + } +} diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/TeamViewerContext.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/TeamViewerContext.java index 291003e71..b875319c0 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/TeamViewerContext.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/TeamViewerContext.java @@ -46,11 +46,7 @@ public class TeamViewerContext implements ITeamViewerContext { Set providers = new HashSet(); for (int i = 0; i < mappings.length; i++) { ResourceMapping mapping = mappings[i]; - try { - providers.add(mapping.getModelProvider()); - } catch (CoreException e) { - TeamUIPlugin.log(e); - } + providers.add(mapping.getModelProvider()); } return (ModelProvider[]) providers.toArray(new ModelProvider[providers.size()]); } |