| /******************************************************************************* |
| * Copyright (c) 2000, 2011 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ccvs.ui.actions; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.*; |
| import org.eclipse.core.resources.mapping.*; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.team.core.RepositoryProvider; |
| import org.eclipse.team.core.TeamException; |
| import org.eclipse.team.core.mapping.ISynchronizationScopeManager; |
| import org.eclipse.team.core.mapping.provider.SynchronizationScopeManager; |
| import org.eclipse.team.core.subscribers.Subscriber; |
| import org.eclipse.team.core.subscribers.SubscriberResourceMappingContext; |
| import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; |
| import org.eclipse.team.internal.ccvs.ui.CVSUIMessages; |
| import org.eclipse.team.internal.ccvs.ui.Policy; |
| import org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation; |
| import org.eclipse.team.internal.ui.Utils; |
| import org.eclipse.team.internal.ui.mapping.BuildScopeOperation; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * A specialized workspace actions that operates on resource traversals |
| * instead of resources/ |
| */ |
| public abstract class WorkspaceTraversalAction extends WorkspaceAction { |
| |
| /** |
| * Return the selected mappings that contain resources |
| * within a CVS managed project. |
| * @return the selected mappings that contain resources |
| * within a CVS managed project |
| */ |
| protected ResourceMapping[] getCVSResourceMappings() { |
| return getSelectedResourceMappings(CVSProviderPlugin.getTypeId()); |
| } |
| |
| private static ResourceTraversal[] getTraversals(IWorkbenchPart part, ISynchronizationScopeManager manager, IProgressMonitor monitor) throws CoreException { |
| try { |
| BuildScopeOperation op = new BuildScopeOperation(part, manager); |
| op.run(monitor); |
| return manager.getScope().getTraversals(); |
| } catch (InvocationTargetException e) { |
| throw TeamException.asTeamException(e); |
| } catch (InterruptedException e) { |
| throw new OperationCanceledException(); |
| } |
| } |
| |
| private static IResource[] getRootTraversalResources(ISynchronizationScopeManager manager, IProgressMonitor monitor) throws CoreException { |
| Set<IResource> result = new HashSet<>(); |
| ResourceTraversal[] traversals = getTraversals(null, manager, monitor); |
| for (int i = 0; i < traversals.length; i++) { |
| ResourceTraversal traversal = traversals[i]; |
| IResource[] resources = traversal.getResources(); |
| for (int k = 0; k < resources.length; k++) { |
| IResource resource = resources[k]; |
| if (RepositoryProvider.getProvider(resource.getProject(), CVSProviderPlugin.getTypeId()) != null) { |
| result.add(resource); |
| } |
| } |
| } |
| return result.toArray(new IResource[result.size()]); |
| } |
| |
| protected Subscriber getWorkspaceSubscriber() { |
| return CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(); |
| } |
| |
| public static IResource[] getResourcesToCompare(ResourceMapping[] mappings, Subscriber subscriber) throws InvocationTargetException { |
| ISynchronizationScopeManager manager = new SynchronizationScopeManager("", //$NON-NLS-1$ |
| mappings, SubscriberResourceMappingContext.createContext(subscriber), true); |
| try { |
| return getResourcesToCompare(manager); |
| } finally { |
| manager.dispose(); |
| } |
| } |
| |
| protected IResource[] getResourcesToCompare(final Subscriber subscriber) throws InvocationTargetException { |
| return getResourcesToCompare(getCVSResourceMappings(), subscriber); |
| } |
| |
| protected ResourceMappingContext getResourceMappingContext() { |
| return SubscriberResourceMappingContext.createContext(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber()); |
| } |
| |
| public static IResource[] getResourcesToCompare(final ISynchronizationScopeManager manager) 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 }; |
| try { |
| PlatformUI.getWorkbench().getProgressService().busyCursorWhile(monitor -> { |
| try { |
| resources[0] = getRootTraversalResources(manager, monitor); |
| } catch (CoreException e) { |
| throw new InvocationTargetException(e); |
| } |
| }); |
| } catch (InterruptedException e) { |
| // Canceled |
| return null; |
| } |
| return resources[0]; |
| } |
| |
| public static IResource[] getProjects(IResource[] resources) { |
| Set<IProject> projects = new HashSet<>(); |
| for (int i = 0; i < resources.length; i++) { |
| IResource resource = resources[i]; |
| projects.add(resource.getProject()); |
| } |
| return projects.toArray(new IResource[projects.size()]); |
| } |
| |
| /** |
| * |
| * @param mappings |
| * @return |
| * |
| * @deprecated need to find a better way to do this |
| */ |
| @Deprecated |
| public static boolean isLogicalModel(ResourceMapping[] mappings) { |
| for (int i = 0; i < mappings.length; i++) { |
| ResourceMapping mapping = mappings[i]; |
| if (! (mapping.getModelObject() instanceof IResource) ) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| protected IFile getSelectedFile() { |
| ResourceMapping[] mappings = getCVSResourceMappings(); |
| if (mappings.length == 1) { |
| IResource resource = Utils.getResource(mappings[0].getModelObject()); |
| if (resource != null && resource.getType() == IResource.FILE) |
| return (IFile)resource; |
| } |
| return null; |
| } |
| |
| protected boolean hasOutgoingChanges(final RepositoryProviderOperation operation) throws InvocationTargetException, InterruptedException { |
| final boolean[] hasChange = new boolean[] { false }; |
| PlatformUI.getWorkbench().getProgressService().run(true, true, monitor -> { |
| try { |
| monitor.beginTask(CVSUIMessages.WorkspaceTraversalAction_0, 100); |
| operation.buildScope(Policy.subMonitorFor(monitor, 50)); |
| hasChange[0] = CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber() |
| .hasLocalChanges(operation.getScope().getTraversals(), Policy.subMonitorFor(monitor, 50)); |
| } catch (CoreException e) { |
| throw new InvocationTargetException(e); |
| } finally { |
| monitor.done(); |
| } |
| }); |
| return hasChange[0]; |
| } |
| |
| /** |
| * Return the complete set of traversals to be targeted by the action |
| * including those that are included by consulting the models. |
| * |
| * @param monitor |
| * a progress monitor |
| * @return the complete set of traversals to be targeted by the action |
| * @throws CoreException |
| */ |
| protected ResourceTraversal[] getTraversals(IProgressMonitor monitor) throws CoreException { |
| SynchronizationScopeManager scopeManager = getScopeManager(); |
| try { |
| return getTraversals(getTargetPart(), scopeManager, monitor); |
| } finally { |
| scopeManager.dispose(); |
| } |
| } |
| |
| /** |
| * Return a scope manager that provides the scope for the action. |
| * @return a scope manager that provides the scope for the action |
| */ |
| protected SynchronizationScopeManager getScopeManager() { |
| return new SynchronizationScopeManager( |
| "", //$NON-NLS-1$ |
| getCVSResourceMappings(), |
| getResourceMappingContext(), true); |
| } |
| } |