/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.netbeans.lib.cvsclient.command.diff; import java.io.File; import org.netbeans.lib.cvsclient.ClientServices; import org.netbeans.lib.cvsclient.command.BasicCommand; import org.netbeans.lib.cvsclient.command.Builder; import org.netbeans.lib.cvsclient.command.CommandException; import org.netbeans.lib.cvsclient.connection.AuthenticationException; import org.netbeans.lib.cvsclient.event.EventManager; import org.netbeans.lib.cvsclient.event.TerminationEvent; import org.netbeans.lib.cvsclient.request.ArgumentRequest; import org.netbeans.lib.cvsclient.request.CommandRequest; /** * The status command looks up the status of files in the repository * * @author Robert Greig */ public class DiffCommand extends BasicCommand { /** * The event manager to use */ protected EventManager eventManager; /** * Holds value of property beforeDate. */ private String beforeDate1; /** * Holds value of property firstRevision. */ private String revision1; /** * Holds value of property secondRevision. */ private String revision2; /** * Holds value of property beforeDate2. */ private String beforeDate2; /** * Keyword substitution. The -k switch in command line cvs. */ private String keywordSubst; /** Holds value of property ignoreAllWhitespace. */ private boolean ignoreAllWhitespace; /** Holds value of property ignoreBlankLines. */ private boolean ignoreBlankLines; /** Holds value of property ignoreCase. */ private boolean ignoreCase; /** Holds value of property ignoreSpaceChange. */ private boolean ignoreSpaceChange; /** Holds value of property contextDiff. */ private boolean contextDiff; /** Holds value of property unifiedDiff. */ private boolean unifiedDiff; /** * Construct a new diff command */ public DiffCommand() { } /** * Create a builder for this command. * * @param eventMan * the event manager used to receive events. */ @Override public Builder createBuilder(EventManager eventMan) { if (isContextDiff() || isUnifiedDiff()) { return null; } return new SimpleDiffBuilder(eventMan, this); } /** * Execute a command * * @param client * the client services object that provides any necessary services to this command, including the ability to actually process * all the requests. */ @Override public void execute(ClientServices client, EventManager em) throws CommandException, AuthenticationException { client.ensureConnection(); eventManager = em; super.execute(client, em); try { // parameters come now.. addRDSwitches(); if (getKeywordSubst() != null && !getKeywordSubst().equals("")) { // NOI18N requests.add(new ArgumentRequest("-k" + getKeywordSubst())); // NOI18N } addArgumentRequest(isIgnoreAllWhitespace(), "-w"); // NOI18N addArgumentRequest(isIgnoreBlankLines(), "-B"); // NOI18N addArgumentRequest(isIgnoreSpaceChange(), "-b"); // NOI18N addArgumentRequest(isIgnoreCase(), "-i"); // NOI18N addArgumentRequest(isContextDiff(), "-c"); // NOI18N addArgumentRequest(isUnifiedDiff(), "-u"); // NOI18N addRequestForWorkingDirectory(client); addArgumentRequests(); addRequest(CommandRequest.DIFF); client.processRequests(requests); } catch (CommandException ex) { throw ex; } catch (Exception ex) { throw new CommandException(ex, ex.getLocalizedMessage()); } finally { requests.clear(); } } /** * includes the logic of setting the -r and -D switches to the diff command */ private void addRDSwitches() { if (getRevision2() != null) { requests.add(1, new ArgumentRequest("-r")); // NOI18N requests.add(2, new ArgumentRequest(getRevision2())); } else { if (getBeforeDate2() != null) { requests.add(1, new ArgumentRequest("-D " + getBeforeDate2())); // NOI18N } } // -r switch has precendence over the -d switch - is that right?? if (getRevision1() != null) { requests.add(1, new ArgumentRequest("-r")); // NOI18N requests.add(2, new ArgumentRequest(getRevision1())); } else { if (getBeforeDate1() != null) { requests.add(1, new ArgumentRequest("-D " + getBeforeDate1())); // NOI18N } else { // when neither revision nor flag is set for the command, it is assumed // that the second parameters are not set either.. return; } } } /** * called when server responses with "ok" or "error", (when the command finishes) */ @Override public void commandTerminated(TerminationEvent e) { if (builder != null) { builder.outputDone(); } } /** * Getter for property beforeDate. * * @return Value of property beforeDate. */ public String getBeforeDate1() { return beforeDate1; } /** * Setter for property beforeDate. * * @param beforeDate * New value of property beforeDate. */ public void setBeforeDate1(String beforeDate) { this.beforeDate1 = beforeDate; } /** * Getter for property firstRevision. * * @return Value of property firstRevision. */ public String getRevision1() { return revision1; } /** * Setter for property firstRevision. * * @param firstRevision * New value of property firstRevision. */ public void setRevision1(String firstRevision) { revision1 = firstRevision; } /** * Getter for property secondRevision. * * @return Value of property secondRevision. */ public String getRevision2() { return revision2; } /** * Setter for property secondRevision. * * @param secondRevision * New value of property secondRevision. */ public void setRevision2(String secondRevision) { this.revision2 = secondRevision; } /** * Getter for property beforeDate2. * * @return Value of property beforeDate2. */ public String getBeforeDate2() { return beforeDate2; } /** * Setter for property beforeDate2. * * @param beforeDate2 * New value of property beforeDate2. */ public void setBeforeDate2(String beforeDate2) { this.beforeDate2 = beforeDate2; } /** * Getter for property keywordSubst. * * @return Value of property keywordSubst. */ public String getKeywordSubst() { return keywordSubst; } /** * Setter for property keywordSubst. * * @param keywordSubst * New value of property keywordSubst. */ public void setKeywordSubst(String keywordSubst) { this.keywordSubst = keywordSubst; } /** * This method returns how the command would looklike when typed on the command line. Each command is responsible for constructing this * information. * * @returns <command's name> [<parameters>] files/dirs. Example: checkout -p CvsCommand.java * */ @Override public String getCVSCommand() { StringBuffer toReturn = new StringBuffer("diff "); // NOI18N toReturn.append(getCVSArguments()); File[] files = getFiles(); if (files != null) { for (int index = 0; index < files.length; index++) { toReturn.append(files[index].getName() + " "); // NOI18N } } return toReturn.toString(); } /** * takes the arguments and sets the command. To be mainly used for automatic settings (like parsing the .cvsrc file) * * @return true if the option (switch) was recognized and set */ @Override public boolean setCVSCommand(char opt, String optArg) { if (opt == 'R') { setRecursive(true); } else if (opt == 'l') { setRecursive(false); } else if (opt == 'r') { if (getRevision1() == null) { setRevision1(optArg); } else { setRevision2(optArg); } } else if (opt == 'D') { if (getBeforeDate1() == null) { setBeforeDate1(optArg); } else { setBeforeDate2(optArg); } } else if (opt == 'k') { setKeywordSubst(optArg); } else if (opt == 'w') { setIgnoreAllWhitespace(true); } else if (opt == 'b') { setIgnoreSpaceChange(true); } else if (opt == 'B') { setIgnoreBlankLines(true); } else if (opt == 'i') { setIgnoreCase(true); } else if (opt == 'c') { setContextDiff(true); } else if (opt == 'u') { setUnifiedDiff(true); } else { return false; } return true; } /** * String returned by this method defines which options are available for this particular command */ @Override public String getOptString() { return "Rlr:D:k:wBbicu"; // NOI18N } /** * resets all switches in the command. After calling this method, the command should have no switches defined and should behave * defaultly. */ @Override public void resetCVSCommand() { setRecursive(true); setRevision1(null); setRevision2(null); setBeforeDate1(null); setBeforeDate2(null); setKeywordSubst(null); setIgnoreAllWhitespace(false); setIgnoreBlankLines(false); setIgnoreCase(false); setIgnoreSpaceChange(false); setContextDiff(false); setUnifiedDiff(false); } /** * Returns the arguments of the command in the command-line style. Similar to getCVSCommand() however without the files and command's * name */ @Override public String getCVSArguments() { StringBuffer toReturn = new StringBuffer(""); // NOI18N if (getKeywordSubst() != null && getKeywordSubst().length() > 0) { toReturn.append("-k" + getKeywordSubst() + " "); // NOI18N } if (!isRecursive()) { toReturn.append("-l "); // NOI18N } if (getRevision1() != null) { toReturn.append("-r " + getRevision1() + " "); // NOI18N } if (getBeforeDate1() != null) { toReturn.append("-D " + getBeforeDate1() + " "); // NOI18N } if (getRevision2() != null) { toReturn.append("-r " + getRevision2() + " "); // NOI18N } if (getBeforeDate2() != null) { toReturn.append("-D " + getBeforeDate2() + " "); // NOI18N } if (isIgnoreAllWhitespace()) { toReturn.append("-w "); // NOI18N } if (isIgnoreBlankLines()) { toReturn.append("-B "); // NOI18N } if (isIgnoreCase()) { toReturn.append("-i "); // NOI18N } if (isIgnoreSpaceChange()) { toReturn.append("-b "); // NOI18N } if (isContextDiff()) { toReturn.append("-c ");// NOI18N } if (isUnifiedDiff()) { toReturn.append("-u ");// NOI18N } return toReturn.toString(); } /** * true if all the whitespace differences should be ignored. (-w) * * @return Value of property ignoreAllWhitespace. */ public boolean isIgnoreAllWhitespace() { return this.ignoreAllWhitespace; } /** * Setter for property ignoreAllWhitespace. true if all the whitespace differences should be ignored. (-w) * * @param ignoreAllWhitespace * New value of property ignoreAllWhitespace. */ public void setIgnoreAllWhitespace(boolean ignoreAllWhitespace) { this.ignoreAllWhitespace = ignoreAllWhitespace; } /** * Getter for property ignoreBlankLines. * * @return Value of property ignoreBlankLines. */ public boolean isIgnoreBlankLines() { return this.ignoreBlankLines; } /** * Setter for property ignoreBlankLines. * * @param ignoreBlankLines * New value of property ignoreBlankLines. */ public void setIgnoreBlankLines(boolean ignoreBlankLines) { this.ignoreBlankLines = ignoreBlankLines; } /** * Getter for property ignoreCase. * * @return Value of property ignoreCase. */ public boolean isIgnoreCase() { return this.ignoreCase; } /** * Setter for property ignoreCase. * * @param ignoreCase * New value of property ignoreCase. */ public void setIgnoreCase(boolean ignoreCase) { this.ignoreCase = ignoreCase; } /** * Getter for property ignoreSpaceChange. * * @return Value of property ignoreSpaceChange. */ public boolean isIgnoreSpaceChange() { return this.ignoreSpaceChange; } /** * Setter for property ignoreSpaceChange. * * @param ignoreSpaceChange * New value of property ignoreSpaceChange. */ public void setIgnoreSpaceChange(boolean ignoreSpaceChange) { this.ignoreSpaceChange = ignoreSpaceChange; } /** * equals to the -c switch of cvs Getter for property contextDiff. * * @return Value of property contextDiff. */ public boolean isContextDiff() { return this.contextDiff; } /** * equals to the -c switch of cvs Setter for property contextDiff. * * @param contextDiff * New value of property contextDiff. */ public void setContextDiff(boolean contextDiff) { this.contextDiff = contextDiff; } /** * equals to the -u switch of cvs Getter for property unifiedDiff. * * @return Value of property unifiedDiff. */ public boolean isUnifiedDiff() { return this.unifiedDiff; } /** * equals to the -u switch of cvs. Setter for property unifiedDiff. * * @param unifiedDiff * New value of property unifiedDiff. */ public void setUnifiedDiff(boolean unifiedDiff) { this.unifiedDiff = unifiedDiff; } }