blob: 29e064d9856c71c21de1e514759246cf7ffe9949 [file] [log] [blame]
/*****************************************************************************
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License Version
* 1.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is available at http://www.sun.com/
*
* The Original Code is the CVS Client Library.
* The Initial Developer of the Original Code is Robert Greig.
* Portions created by Robert Greig are Copyright (C) 2000.
* All Rights Reserved.
*
* Contributor(s): Robert Greig.
*****************************************************************************/
package org.netbeans.lib.cvsclient.command.add;
import org.jetbrains.annotations.NonNls;
import org.netbeans.lib.cvsclient.IClientEnvironment;
import org.netbeans.lib.cvsclient.IRequestProcessor;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.command.AbstractCommand;
import org.netbeans.lib.cvsclient.command.CommandException;
import org.netbeans.lib.cvsclient.command.IOCommandException;
import org.netbeans.lib.cvsclient.command.KeywordSubstitution;
import org.netbeans.lib.cvsclient.connection.AuthenticationException;
import org.netbeans.lib.cvsclient.event.ICvsListener;
import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry;
import org.netbeans.lib.cvsclient.event.IEventSender;
import org.netbeans.lib.cvsclient.file.AbstractFileObject;
import org.netbeans.lib.cvsclient.file.DirectoryObject;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.netbeans.lib.cvsclient.file.ICvsFileSystem;
import org.netbeans.lib.cvsclient.progress.IProgressViewer;
import org.netbeans.lib.cvsclient.progress.sending.DummyRequestsProgressHandler;
import org.netbeans.lib.cvsclient.request.CommandRequest;
import org.netbeans.lib.cvsclient.request.Requests;
import org.netbeans.lib.cvsclient.util.BugLog;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Adds a file or directory.
*
* When adding two directories, the following requests must be sent:
* Directory test3
* O:\CVS/compile/test3
* .............................
* Directory test2
* O:\CVS/compile/test2
* -----------------------------
* Directory .
* O:\CVS/compile
* -----------------------------
* Argument test3
* .............................
* Argument test2
* -----------------------------
* add
*
* When adding two files, the following requests must be sent:
* Directory test2
* O:\CVS/compile/test2
* ...............................
* Modified test2file.txt
* u=rw,g=r,o=r
* (Sending file: D:\test2\test2\test2file.txt)
* ---------------------------------------
* Directory test3
* O:\CVS/compile/test3
* .................................
* Modified test2file.txt
* u=rw,g=r,o=r
* (Sending file: D:\test2\test3\test2file.txt)
* -----------------------------------------
* Directory .
* O:\CVS/compile
* -----------------------------------------
* Argument test2/test2file.txt
* .....................................
* Argument test3/test2file.txt
* -------------------------------------
* add
*
* @author Robert Greig
*/
public final class AddCommand extends AbstractCommand {
// Fields =================================================================
private final Map repositoryPathToDirectoryObject = new HashMap();
private KeywordSubstitution keywordSubst;
// Setup ==================================================================
public AddCommand() {
}
// Implemented ============================================================
public boolean execute(IRequestProcessor requestProcessor, IEventSender eventManager, ICvsListenerRegistry listenerRegistry, IClientEnvironment clientEnvironment, IProgressViewer progressViewer)
throws CommandException, AuthenticationException {
BugLog.getInstance().assertTrue(getFileObjects().size() > 0, "No file specified.");
repositoryPathToDirectoryObject.clear();
final Requests requests;
try {
requests = new Requests(CommandRequest.ADD, clientEnvironment);
requests.addArgumentRequest(getKeywordSubst(), "-k");
for (AbstractFileObject abstractFileObject : getFileObjects()) {
addRequests(abstractFileObject, requests, requestProcessor, clientEnvironment);
}
requests.addLocalPathDirectoryRequest();
addArgumentRequests(requests);
}
catch (IOException ex) {
throw new IOCommandException(ex);
}
final ICvsListener parser = new AddParser(eventManager, clientEnvironment.getCvsFileSystem());
parser.registerListeners(listenerRegistry);
try {
final boolean result = requestProcessor.processRequests(requests, new DummyRequestsProgressHandler());
createCvsDirectories(clientEnvironment);
return result;
}
catch (IOException ex) {
throw new IOCommandException(ex);
}
finally {
repositoryPathToDirectoryObject.clear();
parser.unregisterListeners(listenerRegistry);
}
}
public String getCvsCommandLine() {
@NonNls final StringBuffer cvsCommandLine = new StringBuffer("add ");
cvsCommandLine.append(getCvsArguments());
appendFileArguments(cvsCommandLine);
return cvsCommandLine.toString();
}
public void resetCvsCommand() {
super.resetCvsCommand();
setKeywordSubst(null);
}
// Accessing ==============================================================
private KeywordSubstitution getKeywordSubst() {
return keywordSubst;
}
public void setKeywordSubst(KeywordSubstitution keywordSubst) {
this.keywordSubst = keywordSubst;
}
// Utils ==================================================================
private void createCvsDirectories(IClientEnvironment clientEnvironment) throws IOException {
for (AbstractFileObject abstractFileObject : getFileObjects()) {
if (!abstractFileObject.isDirectory()) {
continue;
}
clientEnvironment.getAdminWriter().directoryAdded((DirectoryObject)abstractFileObject, clientEnvironment.getCvsFileSystem());
}
}
private String getCvsArguments() {
@NonNls final StringBuilder toReturn = new StringBuilder();
if (getKeywordSubst() != null) {
toReturn.append("-k");
toReturn.append(getKeywordSubst().toString());
toReturn.append(" ");
}
return toReturn.toString();
}
private void addRequests(AbstractFileObject abstractFileObject, Requests requests, IRequestProcessor requestProcessor, IClientEnvironment clientEnvironment) throws IOException {
if (abstractFileObject.isDirectory()) {
addRequestsForDirectory((DirectoryObject)abstractFileObject, requests, requestProcessor, clientEnvironment);
}
else {
addRequestsForFile((FileObject)abstractFileObject, requests, clientEnvironment);
}
}
private void addRequestsForDirectory(DirectoryObject directoryObject, Requests requests, IRequestProcessor requestProcessor, IClientEnvironment clientEnvironment) {
final DirectoryObject parentDirectoryUnderCvsControl = addDirectoryRequestsUpToLocalDirectory(directoryObject, requests, requestProcessor, clientEnvironment);
if (parentDirectoryUnderCvsControl == null) {
return;
}
final String tag = clientEnvironment.getAdminReader().getStickyTagForDirectory(parentDirectoryUnderCvsControl, clientEnvironment.getCvsFileSystem());
requests.addStickyRequest(tag);
}
private DirectoryObject addDirectoryRequestsUpToLocalDirectory(DirectoryObject directoryObject, Requests requests, IRequestProcessor requestProcessor, IClientEnvironment clientEnvironment) {
final DirectoryObject parentDirectoryObject = directoryObject.getParent();
if (parentDirectoryObject == null) {
return null;
}
DirectoryObject parentDirectoryUnderCvsControl;
if (clientEnvironment.getAdminReader().hasCvsDirectory(parentDirectoryObject, clientEnvironment.getCvsFileSystem())) {
parentDirectoryUnderCvsControl = parentDirectoryObject;
requests.addDirectoryRequest(DirectoryObject.getRoot());
addDirectoryRequest(parentDirectoryUnderCvsControl, requests);
}
else {
parentDirectoryUnderCvsControl = addDirectoryRequestsUpToLocalDirectory(parentDirectoryObject, requests, requestProcessor, clientEnvironment);
if (parentDirectoryUnderCvsControl == null) {
parentDirectoryUnderCvsControl = parentDirectoryObject;
}
}
addDirectoryRequest(directoryObject, requests);
return parentDirectoryObject;
}
private static void addStickyRequest(DirectoryObject directoryObject, Requests requests, ICvsFileSystem cvsFileSystem, IClientEnvironment clientEnvironment) {
final String tag = clientEnvironment.getAdminReader().getStickyTagForDirectory(directoryObject, cvsFileSystem);
requests.addStickyRequest(tag);
}
private void addDirectoryRequest(DirectoryObject directoryObject, Requests requests) {
final String repositoryPath = requests.addDirectoryRequest(directoryObject);
repositoryPathToDirectoryObject.put(repositoryPath, directoryObject);
}
private void addRequestsForFile(FileObject fileObject, Requests requests, IClientEnvironment clientEnvironment) throws IOException {
final DirectoryObject parentDirectory = fileObject.getParent();
addDirectoryRequest(parentDirectory, requests);
addStickyRequest(parentDirectory, requests, clientEnvironment.getCvsFileSystem(), clientEnvironment);
final Entry entry = clientEnvironment.getAdminReader().getEntry(fileObject, clientEnvironment.getCvsFileSystem());
if (entry != null) {
requests.addEntryRequest(entry);
}
else {
requests.addIsModifiedRequest(fileObject);
}
}
}