blob: 86a46476a97ec6f8854108cb66c79100709103fd [file] [log] [blame]
package org.eclipse.team.internal.ccvs.core.commands;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.HashSet;
import java.util.Set;
import org.eclipse.team.internal.ccvs.core.util.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.requests.RequestSender;
import org.eclipse.team.internal.ccvs.core.resources.api.IManagedFile;
import org.eclipse.team.internal.ccvs.core.resources.api.IManagedFolder;
/**
* This is a visitor that is specially created for the add-command.<br>
* It traverses the file-structure in the other direction, so that
* all the parents are send until a parent is found that should allready
* be known by the to the root are send.<br>
* The visitor remembers the folders it has allready been to and does not
* send them again (if possible).
*/
public class AddStructureVisitor extends AbstractStructureVisitor {
private boolean forceSend = false;
private Set visitedFolders = new HashSet();
private IManagedFolder lastVisitedFolder;
private IManagedFolder mRoot;
private RequestSender requestSender;
/**
* Constructor for AddStructureVisitor.
* @param requestSender
* @param mRoot
* @param monitor
*/
public AddStructureVisitor(
RequestSender requestSender,
IManagedFolder mRoot,
IProgressMonitor monitor) {
super(requestSender, mRoot, monitor);
this.mRoot = mRoot;
this.requestSender = requestSender;
}
/**
* @see IManagedVisitor#visitFile(IManagedFile)
*/
public void visitFile(IManagedFile mFile) throws CVSException {
if (!mFile.getParent().equals(lastVisitedFolder)) {
forceSend = true;
mFile.getParent().accept(this);
}
// We just send the fact, that the file is modified
// not the data, we do not need it.
requestSender.sendIsModified(mFile.getName());
}
/**
* @see IManagedVisitor#visitFolder(IManagedFolder)
*/
public void visitFolder(IManagedFolder mFolder) throws CVSException {
Assert.isNotNull(mFolder);
// Save the status wheter we want to send
// this folder in every case
boolean alreadyVisited;
boolean forceSend = this.forceSend;
this.forceSend = false;
alreadyVisited = visitedFolders.contains(mFolder);
if (!mFolder.equals(mRoot) && !alreadyVisited) {
mFolder.getParent().accept(this);
}
if (forceSend || !alreadyVisited) {
visitedFolders.add(mFolder);
lastVisitedFolder = mFolder;
sendFolder(mFolder,false);
}
}
}