blob: a2c4cad22736e2bb38da4fb5a9b0aa020d4d18fa [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 NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.lib.cvsclient.command.reservedcheckout;
import org.netbeans.lib.cvsclient.IClientEnvironment;
import org.netbeans.lib.cvsclient.IRequestProcessor;
import org.netbeans.lib.cvsclient.JavaCvsSrcBundle;
import org.netbeans.lib.cvsclient.connection.AuthenticationException;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.command.*;
import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry;
import org.netbeans.lib.cvsclient.event.IEventSender;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.netbeans.lib.cvsclient.progress.IProgressViewer;
import org.netbeans.lib.cvsclient.progress.RangeProgressViewer;
import org.netbeans.lib.cvsclient.progress.sending.FileStateRequestsProgressHandler;
import org.netbeans.lib.cvsclient.request.CommandRequest;
import org.netbeans.lib.cvsclient.request.Requests;
import org.jetbrains.annotations.NonNls;
import java.io.IOException;
/**
* @author Thomas Singer
*/
public final class EditCommand extends AbstractCommand {
// Fields =================================================================
private boolean checkThatUnedited;
private boolean forceEvenIfEdited;
private Watch temporaryWatch;
private boolean editors;
// Setup ==================================================================
public EditCommand() {
}
// Implemented ============================================================
public boolean execute(IRequestProcessor requestProcessor, IEventSender eventSender, ICvsListenerRegistry listenerRegistry, IClientEnvironment clientEnvironment, IProgressViewer progressViewer) throws CommandException,
AuthenticationException {
final ICvsFiles cvsFiles;
try {
cvsFiles = scanFileSystem(clientEnvironment);
}
catch (IOException ex) {
throw new IOCommandException(ex);
}
if (isCheckThatUnedited()) {
editors = true;
final Requests requests = new Requests(CommandRequest.EDITORS, clientEnvironment);
addFileRequests(cvsFiles, requests, clientEnvironment);
requests.addLocalPathDirectoryRequest();
addArgumentRequests(requests);
final EditEditorsMessageParser parser = new EditEditorsMessageParser(clientEnvironment.getCvsRoot().getUser());
parser.registerListeners(listenerRegistry);
try {
final RangeProgressViewer editorsProgressViewer = new RangeProgressViewer(progressViewer, 0.0, 0.5);
requestProcessor.processRequests(requests, FileStateRequestsProgressHandler.create(editorsProgressViewer, cvsFiles));
}
finally {
parser.unregisterListeners(listenerRegistry);
}
if (parser.isFilesEdited()) {
final String message = JavaCvsSrcBundle.message("cannot.edit.files.they.are.edited.error.message");
eventSender.notifyMessageListeners(message.getBytes(),true, false);
return false;
}
progressViewer = new RangeProgressViewer(progressViewer, 0.5, 1.0);
}
editors = false;
final Requests requests = new Requests(CommandRequest.NOOP, clientEnvironment);
addFileRequests(cvsFiles, requests, clientEnvironment);
requests.addArgumentRequest(isCheckThatUnedited(), "-c");
requests.addArgumentRequest(isForceEvenIfEdited(), "-f");
requests.addLocalPathDirectoryRequest();
return requestProcessor.processRequests(requests, FileStateRequestsProgressHandler.create(progressViewer, cvsFiles));
}
protected void addRequestForFile(FileObject fileObject, Entry entry, boolean fileExists, Requests requests, IClientEnvironment clientEnvironment) {
if (editors) {
super.addRequestForFile(fileObject, entry, fileExists, requests, clientEnvironment);
return;
}
if (!fileExists || entry == null) {
return;
}
requests.addNotifyRequest(fileObject, "E", Watch.getWatchString(getTemporaryWatch()));
try {
clientEnvironment.getAdminWriter().editFile(fileObject, entry, clientEnvironment.getCvsFileSystem(), clientEnvironment.getFileReadOnlyHandler());
}
catch (IOException ex) {
// ignore
}
}
/**
* This method returns how the tag command would looklike when typed on the command line.
*/
public String getCvsCommandLine() {
@NonNls final StringBuffer cvsCommandLine = new StringBuffer("edit ");
cvsCommandLine.append(getCvsArguments());
appendFileArguments(cvsCommandLine);
return cvsCommandLine.toString();
}
/**
* Resets all switches in the command.
* After calling this method, the command should have no switches defined
* and should behave defaultly.
*/
public void resetCvsCommand() {
super.resetCvsCommand();
setRecursive(true);
setCheckThatUnedited(false);
setForceEvenIfEdited(true);
setTemporaryWatch(null);
}
// Accessing ==============================================================
/**
* Returns the arguments of the command in the command-line style.
* Similar to getCVSCommand() however without the files and command's name
*/
private String getCvsArguments() {
@NonNls final StringBuilder cvsArguments = new StringBuilder();
if (!isRecursive()) {
cvsArguments.append("-l ");
}
return cvsArguments.toString();
}
/**
* Returns whether to check for unedited files.
*/
private boolean isCheckThatUnedited() {
return checkThatUnedited;
}
/**
* Sets whether to check for unedited files.
* This is cvs' -c option.
*/
public final void setCheckThatUnedited(boolean checkThatUnedited) {
this.checkThatUnedited = checkThatUnedited;
}
/**
* Returns whether the edit is forces even if the files are edited.
*/
private boolean isForceEvenIfEdited() {
return forceEvenIfEdited;
}
/**
* Sets whether the edit is forces even if the files are edited.
* This is cvs' -f option.
*/
public final void setForceEvenIfEdited(boolean forceEvenIfEdited) {
this.forceEvenIfEdited = forceEvenIfEdited;
}
/**
* Returns the temporary watch.
*/
private Watch getTemporaryWatch() {
return temporaryWatch;
}
/**
* Sets the temporary watch.
* This is cvs' -a option.
*/
public final void setTemporaryWatch(Watch temporaryWatch) {
this.temporaryWatch = temporaryWatch;
}
}