|
|
/*******************************************************************************
* Copyright (c) 2000, 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.team.internal.ccvs.ui.actions;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.team.core.RepositoryProvider;
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.core.mapping.CompoundResourceTraversal;
import org.eclipse.team.internal.ui.Utils;
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());
}
protected static ResourceTraversal[] getTraversals(ResourceMapping[] mappings, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
CompoundResourceTraversal traversal = new CompoundResourceTraversal();
for (int i = 0; i < mappings.length; i++) {
ResourceMapping mapping = mappings[i];
ResourceTraversal[] traversals = mapping.getTraversals(context, monitor);
traversal.addTraversals(traversals);
}
return traversal.asTraversals();
}
private static IResource[] getRootTraversalResources(ResourceMapping[] mappings, ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
Set result = new HashSet();
ResourceTraversal[] traversals = getTraversals(mappings, context, 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 (IResource[]) result.toArray(new IResource[result.size()]);
}
protected Subscriber getWorkspaceSubscriber() {
return CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber();
}
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 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 };
try {
PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
resources[0] = getRootTraversalResources(
mappings,
SubscriberResourceMappingContext.createContext(subscriber),
monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
});
} catch (InterruptedException e) {
// Canceled
return null;
}
return resources[0];
}
public static IResource[] getProjects(IResource[] resources) {
Set projects = new HashSet();
for (int i = 0; i < resources.length; i++) {
IResource resource = resources[i];
projects.add(resource.getProject());
}
return (IResource[]) projects.toArray(new IResource[projects.size()]);
}
/**
*
* @param mappings
* @return
*
* @deprecated need to find a better way to do this
*/
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, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
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];
}
}
|