|
What this is
Other links
The source code
/*****************************************************************************
* 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.checkout;
import java.io.*;
import java.util.*;
import org.netbeans.lib.cvsclient.*;
import org.netbeans.lib.cvsclient.command.*;
import org.netbeans.lib.cvsclient.command.update.*;
import org.netbeans.lib.cvsclient.connection.*;
import org.netbeans.lib.cvsclient.event.*;
import org.netbeans.lib.cvsclient.request.*;
/**
* The checkout command.
* This handles the sending of the requests and the processing of the responses
* from the server.
*
* @author Robert Greig
*/
public class CheckoutCommand extends BasicCommand
implements TemporaryFileCreator {
private static final String UPDATING = ": Updating "; // NOI18N
/**
* A store of potentially empty directories. When a directory has a file
* in it, it is removed from this set. This set allows the prune option
* to be implemented.
*/
private final Set emptyDirectories = new HashSet();
/**
* The modules to checkout. These names are unexpanded and will be passed
* to a module-expansion request.
*/
private final List modules = new LinkedList();
/**
* The expanded modules.
*/
private final List expandedModules = new LinkedList();
/**
* Will force the checkout command to display only a list of modules.
*/
private boolean showModules;
/**
* if set, will display just a list of modules with statuses.
*/
private boolean showModulesWithStatus;
/**
* if set, will redirect the output of the command to standard output.
*/
private boolean pipeToOutput;
/**
* Whether to prune directories, i.e. remove any directories that do not
* contain any files. This is the -P option in command-line CVS.
*/
private boolean pruneDirectories;
/**
* Resets any sticky tags/dates/options imposed on the updated file(s).
*/
private boolean resetStickyOnes;
/**
* Use head revision if a revision meeting criteria set by switches -r/-D
* (tag/date) is not found.
*/
private boolean useHeadIfNotFound;
/**
* Don't shorten module paths if -d specified.
*/
private boolean notShortenPaths;
/**
* Forces a checkout of a revision that was current at specified date.
*/
private String checkoutByDate;
/**
* Forces a checkout of specified revision. Can be a number/tag/branch
*/
private String checkoutByRevision;
/**
* performs checkout to specified directory other then the module.
*/
private String checkoutDirectory;
/**
* Use this keyword substitution for the command.
* does not include the -k switch part.
*/
private KeywordSubstitutionOptions keywordSubst;
/**
* Do not run module program (if any).
*/
private boolean notRunModuleProgram;
/**
* Construct a new checkout command.
* @param recursive whether to do a recursive checkout
* @param modules an array of modules names to checkout
*/
public CheckoutCommand(boolean recursive, String[] modules) {
resetCVSCommand();
setRecursive(recursive);
setModules(modules);
}
/**
* Construct a new checkout command.
* @param recursive whether to do a recursive checkout
* @param module the module to checkout
*/
public CheckoutCommand(boolean recursive, String module) {
resetCVSCommand();
setRecursive(recursive);
setModule(module);
}
/**
* Construct a checkout command, with default values for options.
*/
public CheckoutCommand() {
resetCVSCommand();
setRecursive(true);
}
/**
* Set the modules to checkout.
* @param theModules the names of the modules to checkout
*/
public void setModule(String module) {
modules.add(module);
}
/**
* clears the list of modules for checkout.
*/
public void clearModules() {
this.modules.clear();
}
/**
* Set the modules to checkout.
* @param theModules the names of the modules to checkout
*/
public void setModules(String[] modules) {
clearModules();
for (int i = 0; i < modules.length; i++) {
String module = modules[i];
this.modules.add(module);
}
}
public String[] getModules() {
String[] mods = new String[modules.size()];
mods = (String[])modules.toArray(mods);
return mods;
}
/**
* Handle modules that are already checked out. We check whether a
* module has been checked out and if so we add it to the list of
* directories that the superclass must send Modified requests for etc.
*/
private void processExistingModules(String localPath) {
if (expandedModules.size() == 0) {
return;
}
List list = new ArrayList(expandedModules.size());
for (Iterator it = expandedModules.iterator(); it.hasNext();) {
String moduleName = (String)it.next();
if (moduleName.equals(".")) { //NOI18N
list.add(new File(localPath));
break;
}
File moduleDir = null;
final File moduleFile = new File(localPath, moduleName);
if (moduleFile.isFile()) {
moduleDir = moduleFile.getParentFile();
}
else {
moduleDir = moduleFile;
}
final File moduleCVSDir = new File(moduleDir, "CVS/Repository"); //NOI18N
if (moduleCVSDir.exists()) {
list.add(moduleFile);
}
}
File[] directories = new File[list.size()];
directories = (File[])list.toArray(directories);
setFiles(directories);
}
/**
* Execute this command.
* @param client the client services object that provides any necessary
* services to this command, including the ability to actually process
* all the requests
*/
public void execute(ClientServices client, EventManager em)
throws CommandException, AuthenticationException {
client.ensureConnection();
requests = new LinkedList();
if (client.isFirstCommand()) {
requests.add(new RootRequest(client.getRepository()));
}
if (showModules || showModulesWithStatus) {
// we need to initialize the builder first (is done in BuildableCommand.execute()
// but we can't run it because of teh BasicCommand's execute and
// it's feature that adds the files request to the request list.
if (builder == null && !isBuilderSet()) {
builder = createBuilder(em);
}
// special handling for -c -s switches.
if (showModules) {
requests.add(new ArgumentRequest("-c")); //NOI18N
}
if (showModulesWithStatus) {
requests.add(new ArgumentRequest("-s")); //NOI18N
}
requests.add(CommandRequest.CHECKOUT);
try {
client.processRequests(requests);
requests.clear();
}
catch (CommandException ex) {
throw ex;
}
catch (EOFException ex) {
throw new CommandException(ex, CommandException.getLocalMessage("CommandException.EndOfFile", null)); //NOI18N
}
catch (Exception ex) {
throw new CommandException(ex, ex.getLocalizedMessage());
}
return;
}
for (Iterator it = modules.iterator(); it.hasNext();) {
String module = (String)it.next();
requests.add(new ArgumentRequest(module));
}
expandedModules.clear();
requests.add(new ExpandModulesRequest());
try {
client.processRequests(requests);
}
catch (CommandException ex) {
throw ex;
}
catch (Exception ex) {
throw new CommandException(ex, ex.getLocalizedMessage());
}
requests.clear();
postExpansionExecute(client, em);
}
/**
* The result from this command is used only when the getFiles() returns null or empty array.
* in such a case and when this method returns true, it is assumed the localpath should be taken
* as the 'default' file for the building of requests.
* in checkout we operate with modules rather then files. This produces problems in the following situation.
* If you have something already checked out and want to checkout another module that is not checked out yet,
* then there's nothing to be translated from modules to files. and in such a case the localpathis assumed,
* which includes non-relevant already checked out directories..
*/
protected boolean assumeLocalPathWhenUnspecified() {
return false;
}
/**
* This is called when the server has responded to an expand-modules
* request.
*/
public void moduleExpanded(ModuleExpansionEvent e) {
expandedModules.add(e.getModule());
}
/**
* Execute this command
* @param client the client services object that provides any necessary
* services to this command, including the ability to actually process
* all the requests
*/
private void postExpansionExecute(ClientServices client, EventManager em)
throws CommandException, AuthenticationException {
// we first test whether the modules specified actually exist
// checked out already. If so, we must work something like an update
// command and send modified files to the server.
processExistingModules(client.getLocalPath());
// the sending of the Modified requests and so on is handled in the
// superclass.
super.execute(client, em);
//
// moved modules code to the end of the other arguments --GAR
//
final int FIRST_INDEX = 0;
final int SECOND_INDEX = 1;
if (!isRecursive()) {
requests.add(FIRST_INDEX, new ArgumentRequest("-l")); //NOI18N
}
if (pipeToOutput) {
requests.add(FIRST_INDEX, new ArgumentRequest("-p")); //NOI18N
}
if (resetStickyOnes) {
requests.add(FIRST_INDEX, new ArgumentRequest("-A")); //NOI18N
}
if (useHeadIfNotFound) {
requests.add(FIRST_INDEX, new ArgumentRequest("-f")); //NOI18N
}
if (notShortenPaths) {
requests.add(FIRST_INDEX, new ArgumentRequest("-N")); //NOI18N
}
if (notRunModuleProgram) {
requests.add(FIRST_INDEX, new ArgumentRequest("-n")); //NOI18N
}
if (checkoutByDate != null && checkoutByDate.length() > 0) {
requests.add(FIRST_INDEX, new ArgumentRequest("-D")); //NOI18N
requests.add(SECOND_INDEX, new ArgumentRequest(getCheckoutByDate()));
}
if (checkoutByRevision != null && checkoutByRevision.length() > 0) {
requests.add(FIRST_INDEX, new ArgumentRequest("-r")); //NOI18N
requests.add(SECOND_INDEX, new ArgumentRequest(getCheckoutByRevision()));
}
if (checkoutDirectory != null && (!checkoutDirectory.equals(""))) {
requests.add(FIRST_INDEX, new ArgumentRequest("-d")); //NOI18N
requests.add(SECOND_INDEX, new ArgumentRequest(getCheckoutDirectory()));
}
if (getKeywordSubst() != null) {
requests.add(new ArgumentRequest("-k" + getKeywordSubst())); //NOI18N
}
// Note that modules might be null and still be valid because
// for -c, -s switches no module has to be selected
// You might also think that we should pass in expandedModules here
// but according to the spec that would be wrong because of the -d
// flag.
for (Iterator it = modules.iterator(); it.hasNext();) {
String module = (String)it.next();
requests.add(new ArgumentRequest(module));
}
requests.add(new DirectoryRequest(".", client.getRepository())); //NOI18N
requests.add(CommandRequest.CHECKOUT);
try {
client.processRequests(requests);
if (pruneDirectories) {
pruneEmptyDirectories();
}
requests.clear();
}
catch (CommandException ex) {
throw ex;
}
catch (Exception ex) {
throw new CommandException(ex, ex.getLocalizedMessage());
}
}
/**
* Getter for property showModules.
* @return Value of property showModules.
*/
public boolean isShowModules() {
return showModules;
}
/**
* Setter for property showModules.
* @param showModules New value of property showModules.
*/
public void setShowModules(boolean showModules) {
this.showModules = showModules;
}
/**
* Getter for property showModulesWithStatus.
* @return Value of property showModulesWithStatus.
*/
public boolean isShowModulesWithStatus() {
return showModulesWithStatus;
}
/**
* Setter for property showModulesWithStatus.
* @param showModulesWithStatus New value of property showModulesWithStatus.
*/
public void setShowModulesWithStatus(boolean showModulesWithStatus) {
this.showModulesWithStatus = showModulesWithStatus;
}
/**
* Set whether to prune directories.
* This is the -P option in the command-line CVS.
*/
public void setPruneDirectories(boolean pruneDirectories) {
this.pruneDirectories = pruneDirectories;
}
/**
* Get whether to prune directories.
* @return true if directories should be removed if they contain no files,
* false otherwise.
*/
public boolean getPruneDirectories() {
return pruneDirectories;
}
/**
* Getter for property pipeToOutput.
* @return Value of property pipeToOutput.
*/
public boolean isPipeToOutput() {
return pipeToOutput;
}
/**
* Setter for property pipeToOutput.
* @param pipeToOutput New value of property pipeToOutput.
*/
public void setPipeToOutput(boolean pipeToOutput) {
this.pipeToOutput = pipeToOutput;
}
/**
* Getter for property resetStickyOnes.
* @return Value of property resetStickyOnes.
*/
public boolean isResetStickyOnes() {
return resetStickyOnes;
}
/**
* Setter for property resetStickyOnes.
* @param resetStickyOnes New value of property resetStickyOnes.
*/
public void setResetStickyOnes(boolean resetStickyOnes) {
this.resetStickyOnes = resetStickyOnes;
}
/**
* Getter for property useHeadIfNotFound.
* @return Value of property useHeadIfNotFound.
*/
public boolean isUseHeadIfNotFound() {
return useHeadIfNotFound;
}
/**
* Setter for property useHeadIfNotFound.
* @param useHeadIfNotFound New value of property useHeadIfNotFound.
*/
public void setUseHeadIfNotFound(boolean useHeadIfNotFound) {
this.useHeadIfNotFound = useHeadIfNotFound;
}
/**
* Getter for property notShortenPaths.
* @return Value of property notShortenPaths.
*/
public boolean isNotShortenPaths() {
return notShortenPaths;
}
/**
* Setter for property notShortenPaths.
* @param notShortenPaths New value of property notShortenPaths.
*/
public void setNotShortenPaths(boolean notShortenPaths) {
this.notShortenPaths = notShortenPaths;
}
/**
* Getter for property notRunModuleProgram.
* @return Value of property notRunModuleProgram.
*/
public boolean isNotRunModuleProgram() {
return notRunModuleProgram;
}
/**
* Setter for property notRunModuleProgram.
* @param notRunModuleProgram New value of property notRunModuleProgram.
*/
public void setNotRunModuleProgram(boolean notRunModuleProgram) {
this.notRunModuleProgram = notRunModuleProgram;
}
/**
* Getter for property checkoutByDate.
* @return Value of property checkoutByDate.
*/
public String getCheckoutByDate() {
return checkoutByDate;
}
/**
* Setter for property checkoutByDate.
* @param checkoutByDate New value of property checkoutByDate.
*/
public void setCheckoutByDate(String checkoutByDate) {
this.checkoutByDate = checkoutByDate;
}
/**
* Getter for property checkoutByRevision.
* @return Value of property checkoutByRevision.
*/
public String getCheckoutByRevision() {
return checkoutByRevision;
}
/**
* Setter for property checkoutByRevision.
* @param checkoutByRevision New value of property checkoutByRevision.
*/
public void setCheckoutByRevision(String checkoutByRevision) {
this.checkoutByRevision = checkoutByRevision;
}
/** Getter for property checkoutDirectory.
* @return Value of property checkoutDirectory.
*/
public String getCheckoutDirectory() {
return this.checkoutDirectory;
}
/** Setter for property checkoutDirectory.
* @param checkoutDirectory New value of property checkoutDirectory.
*/
public void setCheckoutDirectory(String checkoutDirectory) {
this.checkoutDirectory = checkoutDirectory;
}
/**
* Getter for property keywordSubst.
* @return Value of property keywordSubst.
*/
public KeywordSubstitutionOptions getKeywordSubst() {
return keywordSubst;
}
/**
* Setter for property keywordSubst.
* @param keywordSubst New value of property keywordSubst.
*/
public void setKeywordSubst(KeywordSubstitutionOptions keywordSubst) {
this.keywordSubst = keywordSubst;
}
public Builder createBuilder(EventManager eventMan) {
if (isShowModules() || isShowModulesWithStatus()) {
return new ModuleListBuilder(eventMan, this);
}
if (isPipeToOutput()) {
return new PipedFilesBuilder(eventMan, this, this);
}
return new UpdateBuilder(eventMan, getLocalDirectory());
}
public File createTempFile(String filename) throws IOException {
File temp = File.createTempFile("cvs", ".dff", getGlobalOptions().getTempDir()); //NOI18N
return temp;
}
/**
* This method returns how the command would looklike when typed on the command line.
* Each command is responsible for constructing this information.
* @returns
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.