Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
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.operations;
 
 import java.util.List;
 import java.util.Set;
 
This method checks out one or more remote folders from the same repository into an existing project or folder in the workspace. The target project must either be shared with the same repository or it must not be shared with any repository
 
 public class CheckoutIntoOperation extends CheckoutOperation {
 
 	private boolean recursive;
 	private String localFolderName;

Constructor which takes a set of remote folders and the local folder into which the folders should be loaded.
 
 	public CheckoutIntoOperation(IWorkbenchPart partICVSRemoteFolder[] remoteFoldersIContainer localFolderboolean recursive) {
 		super(partremoteFolders);
 		this. = recursive;
 		this. = CVSWorkspaceRoot.getCVSFolderFor(localFolder);
 	}

Constructor which takes a single remote folder and the target local folder.
 
 	public CheckoutIntoOperation(IWorkbenchPart partICVSRemoteFolder remoteFolderIContainer localFolderboolean recursive) {
 		this(partnew ICVSRemoteFolder[] { remoteFolder }, localFolder.getParent(), recursive);
 		this. = localFolder.getName();
 	}
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ccvs.ui.operations.CheckoutOperation#getTaskName()
 	 */
 	protected String getTaskName() {
 		ICVSRemoteFolder[] remoteFolders = getRemoteFolders();
 		String localFolderName = ""//$NON-NLS-1$
 		localFolderName = getLocalFolder().getIResource().getFullPath().toString();
 		return NLS.bind(.new String[] { new Integer(remoteFolders.length).toString(), localFolderName });  
 	}

Returns:
 
 	public ICVSFolder getLocalFolder() {
 		return ;
 	}

Returns:
 
 	public boolean isRecursive() {
 		return ;
 	}
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ccvs.ui.operations.CheckoutOperation#checkout(org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder, org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	protected IStatus checkout(final ICVSRemoteFolder folderIProgressMonitor monitorthrows CVSException {
 		final IStatus[] result = new IStatus[] { null };
 		try {
 			// Wrap in a workspace runnable to avoid auto-build.
 			// This is necessary because CVS has a POST_BUILD
 			// listener that will clear the sync info from
 			// orphaned (i.e. unmanaged) subtrees and we will
 			// purposely create some which we subsequently manage
 			// from their parent (see manageFolders())
			ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
				public void run(IProgressMonitor monitorthrows CoreException {
					result[0] = checkout(foldergetLocalFolder(), isRecursive(), monitor);
				}
			}, getSchedulingRule(), 0, monitor);
catch (CoreException e) {
			result[0] = CVSException.wrapException(e).getStatus();
		}
		return result[0];
	}
	/* (non-Javadoc)
	 * @see org.eclipse.team.internal.ccvs.ui.operations.CheckoutOperation#checkout(org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder[], org.eclipse.core.runtime.IProgressMonitor)
	 */
	protected void checkout(final ICVSRemoteFolder[] foldersIProgressMonitor monitorthrows CVSException {
		// Batch sync info changes with the CVS synchronizer to optimize cache writing
		EclipseSynchronizer.getInstance().run(getSchedulingRule(), new ICVSRunnable() {
			public void run(IProgressMonitor monitorthrows CVSException {
				monitor.beginTask(null, 100);
				try {
					//	Obtain a scheduling rule on the projects were about to overwrite
					CheckoutIntoOperation.super.checkout(folders, Policy.subMonitorFor(monitor, 90));
finally {
					monitor.done();
				}
			}
		}, Policy.monitorFor(monitor));
	}
	/*
	 * Prepare the local folders to receive the remote folders. If localFolderName is not null, then
	 * if will be the only target folder of the checkout. Otherwise, the remote folder
	 * could expand to multiple local folders witinb the given parent folder.
	 */
	private ICVSFolder[] prepareLocalFolders(Session sessionICVSRemoteFolder remoteFolderICVSFolder parentFolderString localFolderNameIProgressMonitor monitorthrows CVSException {
		Set targetFolderSet = new HashSet();
		monitor.beginTask(null, 30);
		if (localFolderName == null) {
			// Determine which local folders will be afected
			IStatus status = ..execute(sessionnew String[] { remoteFolder.getRepositoryRelativePath()}, Policy.subMonitorFor(monitor, 10));
			if (status.getCode() == .) {
				addError(status);
				return null;
			}
			// Convert the module expansions to target folders
			String[] expansions = session.getModuleExpansions();
			for (int j = 0; j < expansions.lengthj++) {
				String childPath = new Path(nullexpansions[j]).segment(0);
				ICVSResource resource = parentFolder.getChild(childPath);
				if (resource != null && !resource.isFolder()) {
					// The target folder conflicts with an existing file
					return null;
				}
				targetFolderSet.add(parentFolder.getFolder(childPath));
			}
else {
			targetFolderSet.add(parentFolder.getFolder(localFolderName));
		}
		final ICVSFolder[] targetFolders = (ICVSFolder[]) targetFolderSet.toArray(new ICVSFolder[targetFolderSet.size()]);
		// Ensure that the checkout will not conflict with existing resources
		IStatus status = validateTargetFolders(remoteFoldertargetFolders, Policy.subMonitorFor(monitor, 10));
		if (!status.isOK()) {
			addError(status);
			return null;
		}
		// Prepare the target projects to receive resources
		status = scrubFolders(remoteFoldertargetFolders, Policy.subMonitorFor(monitor, 10));
		// return the target projects if the scrub succeeded
		if (status.isOK()) {
			return targetFolders;
else {
			addError(status);
			return null;
		}
	}
	/*
	 * Ensure that the new folders will not conflict with existing folders (even those that are pruned).
	 */
	private IStatus validateTargetFolders(ICVSRemoteFolder remoteFolderICVSFolder[] targetFoldersIProgressMonitor monitorthrows CVSException {
		for (int i = 0; i < targetFolders.lengthi++) {
			ICVSFolder targetFolder = targetFolders[i];
			FolderSyncInfo localInfo = targetFolder.getFolderSyncInfo();
			FolderSyncInfo remoteInfo = remoteFolder.getFolderSyncInfo();
			if (!remoteInfo.isSameMapping(localInfo)) {
				if (localInfo != null ) {
					if (isRemoteChildOfParent(targetFolder)) {
						// if the local folder is child of it's parent remotely (i.e. path of child is parent/child)
						// then the remote cannot be loaded.
						String message;
						if (targetFolder.exists()) {
							message = NLS.bind(.new String[] { remoteFolder.getName(), targetFolder.getIResource().getFullPath().toString() }); 
else {
							message = NLS.bind(.new String[] { remoteFolder.getName(), targetFolder.getFolderSyncInfo().getRepository() }); 
						}
						return new CVSStatus(.message);
					}
				}
				// Verify that no other folders in the local workspace are mapped to the remote folder
				IStatus status = validateUniqueMapping(remoteFoldertargetFolder, Policy.subMonitorFor(monitor, 10));
				if (!status.isOK()) return status;
			}
		}
		return ;
	}
	/*
	 * Return true if the given local folder is a direct descendant of it's local parent in 
	 * the repository as well
	 */
	private boolean isRemoteChildOfParent(ICVSFolder targetFolderthrows CVSException {
		FolderSyncInfo localInfo = targetFolder.getFolderSyncInfo();
		if (localInfo == nullreturn false;
		FolderSyncInfo parentInfo = targetFolder.getParent().getFolderSyncInfo();
		if (parentInfo == nullreturn false;
		IPath childPath = new Path(nulllocalInfo.getRepository());
		IPath parentPath = new Path(nullparentInfo.getRepository());
		return parentPath.isPrefixOf(childPath);
	}

Parameters:
targetFolder
Returns:
	private IContainer getLocalRoot(ICVSFolder targetFolderthrows CVSException {
		return targetFolder.getIResource().getProject();
	}
	/*
	 * Ensure that there is no equivalent mapping alreay in the local workspace
	 */
	private IStatus validateUniqueMapping(final ICVSRemoteFolder remoteFolderfinal ICVSFolder targetFolderIProgressMonitor iProgressMonitorthrows CVSException {
		final IContainer root = getLocalRoot(targetFolder);
		final FolderSyncInfo remoteInfo = remoteFolder.getFolderSyncInfo();
			// We can't really check the mapping ahead of time
			// so we'll let the operation continue
			return ;
		}
		ICVSFolder cvsFolder = CVSWorkspaceRoot.getCVSFolderFor(root);
		try {
			cvsFolder.accept(new ICVSResourceVisitor() {
				public void visitFile(ICVSFile filethrows CVSException {
					// do nothing
				}
				public void visitFolder(ICVSFolder folderthrows CVSException {
					if (!folder.isCVSFolder()) return;
					IResource resource = folder.getIResource();
					if (resource == nullreturn;
					if (info.isSameMapping(remoteInfo)) {
                        	remoteFolder.getName(), 
                        	targetFolder.getIResource().getFullPath().toString(),
                        	resource.getFullPath().toString()
                        })));
					}
					folder.acceptChildren(this);
				}
			});
catch (CVSException e) {
			return e.getStatus();
		}
		return ;
	}
	/*
	 * Purge the local contents of the given folders
	 */
	private IStatus scrubFolders(ICVSRemoteFolder remoteFolderICVSFolder[] targetFoldersIProgressMonitor monitorthrows CVSException {
		monitor.beginTask(null, 100 * targetFolders.length);
		// Prompt first before any work is done
		if (targetFolders.length > 1) {
		}
		for (int i=0;i<targetFolders.length;i++) {
			ICVSFolder targetFolder = targetFolders[i];
			if (needsPromptForOverwrite(targetFolder, Policy.subMonitorFor(monitor, 50)) && !promptToOverwrite(targetFolder)) {
				return new CVSStatus(., NLS.bind(.new String[] { remoteFolder.getName() })); 
			}
		}
		for (int i = 0; i < targetFolders.lengthi++) {
			IStatus status = scrubFolder(targetFolders[i], Policy.subMonitorFor(monitor, 50));
			if (!status.isOK()) return status;
		}
		monitor.done();
		return ;
	}
	private boolean needsPromptForOverwrite(ICVSFolder targetFolderIProgressMonitor monitorthrows CVSException {
		return targetFolder.isModified(monitor);
	}
	private boolean promptToOverwrite(ICVSFolder folder) {
			folder.getIResource()); 
	}
	private IStatus scrubFolder(ICVSFolder folderIProgressMonitor monitorthrows CVSException {
		if (folder.exists() || folder.isCVSFolder()) {
			// Unmanage first so we don't get outgoing deletions
			folder.unmanage(Policy.subMonitorFor(monitor, 50));
			if (folder.exists()) folder.delete();
		}
		return ;
	}
	/* private */ IStatus checkout(final ICVSRemoteFolder remoteFolderICVSFolder parentFolderboolean recurseIProgressMonitor monitorthrows CVSException {
		// Open a connection session to the repository
		monitor.beginTask(null, 100);
		ICVSRepositoryLocation repository = remoteFolder.getRepository();
		Session session = new Session(repositoryparentFolder);
		try {
			session.open(Policy.subMonitorFor(monitor, 5), false /* read-only */);
			// Determine which local folders will be affected
			String localName = ;
			if (localName == null) {
				IPath path = new Path(nullremoteFolder.getRepositoryRelativePath());
				if (path.segmentCount() > 1) {
					localName = path.lastSegment();
				}
			}
			ICVSFolder[] targetFolders = prepareLocalFolders(sessionremoteFolderparentFolderlocalName, Policy.subMonitorFor(monitor, 5));
			if (targetFolders == null) {
				// an error occured and has been added to the operation's error list
				return getLastError();
			}
			// Add recurse option
			List localOptions = new ArrayList();
			if (!recurse)
				localOptions.add(.);
			if (localName != null) {
				localOptions.add(Checkout.makeDirectoryNameOption(localName));
			}
			// Prune empty directories if pruning enabled
			if (CVSProviderPlugin.getPlugin().getPruneEmptyDirectories()) 
			// Add the options related to the CVSTag
			CVSTag tag = remoteFolder.getTag();
			if (tag == null) {
				// A null tag in a remote resource indicates HEAD
				tag = .;
			}
			localOptions.add(Update.makeTagOption(tag));
			// Perform the checkout
			IStatus status = ..execute(session,
				(LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]),
				new String[] { remoteFolder.getRepositoryRelativePath() },
				null,
				Policy.subMonitorFor(monitor, 80));
			if (!status.isOK()) {
				return status;
			}
			manageFolders(targetFoldersrepository.getLocation(false));
			return ;
finally {
			session.close();
		}
	}
	private void manageFolders(ICVSFolder[] targetFoldersString rootthrows CVSException {
		for (int i = 0; i < targetFolders.lengthi++) {
			manageFolder(targetFolders[i], root);
		}
	}
	private static void manageFolder(ICVSFolder folderString rootthrows CVSException {
		// Ensure that the parent is a CVS folder
		ICVSFolder parent = folder.getParent();
		if (!parent.isCVSFolder()) {
			IResource resource = parent.getIResource();
			if (resource.getType() != .) {
				manageFolder(parentroot);
			}
		}
		// reset the folder sync info so it will be managed by it's parent
	}
	/*
	 * Bring the provided projects into the workspace
	 */
	private static void refreshRoot(IContainer rootIProgressMonitor monitorthrows CVSException {
			try {
				IProject project = root.getProject();
				CVSTeamProvider provider = (CVSTeamProvider)RepositoryProvider.getProvider(project, CVSProviderPlugin.getTypeId());
				if (provider == null) {
					ICVSFolder folder = CVSWorkspaceRoot.getCVSFolderFor(project);
					if (folder.isCVSFolder()) {
						// Register the project with Team
						RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
						// TODO: This should be somewhere else
						provider = (CVSTeamProvider)RepositoryProvider.getProvider(project, CVSProviderPlugin.getTypeId());
						provider.setWatchEditEnabled(CVSProviderPlugin.getPlugin().isWatchEditEnabled());
					}
				}
catch (TeamException e) {
				throw CVSException.wrapException(e);
			}
	}
	/* (non-Javadoc)
	 * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#getSchedulingRule()
	 */
		//use the modfiy rule for the time being
		//TODO: Just lock the project not the entire workspace (so can't use modifyRule)
		//since the project already exists 
		 IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
		 return ruleFactory.modifyRule(tempProject);
	}
New to GrepCode? Check out our FAQ X