/*
* (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.history;
import java.util.LinkedList;
import java.util.List;
import org.netbeans.lib.cvsclient.ClientServices;
import org.netbeans.lib.cvsclient.command.Builder;
import org.netbeans.lib.cvsclient.command.Command;
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;
import org.netbeans.lib.cvsclient.request.RootRequest;
import org.netbeans.lib.cvsclient.request.UseUnchangedRequest;
/**
* The history command provides information history of activities in repository.
*
* @author Milos Kleint
*/
public class HistoryCommand extends Command {
/**
* The requests that are sent and processed.
*/
private final List requests = new LinkedList();
/**
* The event manager to use
*/
private EventManager eventManager;
/** Holds value of property forAllUsers. */
private boolean forAllUsers;
/** Holds value of property goBackToRecord. */
private String showBackToRecordContaining;
/** Holds value of property reportCommits. */
private boolean reportCommits;
/** Holds value of property sinceDate. */
private String sinceDate;
/** Holds value of property reportEverything. */
private boolean reportEverything;
/** Holds value of property lastEventOfProject. */
private boolean lastEventOfProject;
/** Holds value of property reportCheckout. */
private boolean reportCheckouts;
/** Holds value of property sinceRevision. */
private String sinceRevision;
/** Holds value of property reportTags. */
private boolean reportTags;
/** Holds value of property sinceTag. */
private String sinceTag;
/** Holds value of property forWorkingDirectory. */
private boolean forWorkingDirectory;
/** Holds value of property reportEventType. */
private String reportEventType;
/** Holds value of property timeZone. */
private String timeZone;
/** Holds value of property lastEventForFile. */
private String[] lastEventForFile;
/** Holds value of property reportOnModule. */
private String[] reportOnModule;
/** Holds value of property reportLastEventForModule. */
private String[] reportLastEventForModule;
/** Holds value of property forUsers. */
private String[] forUsers;
/**
* Construct a new history command
*/
public HistoryCommand() {
}
/**
* Create a builder for this command.
*
* @param eventMan
* the event manager used to receive events.
*/
public Builder createBuilder(EventManager eventMan) {
return null;
}
/**
* 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;
requests.clear();
super.execute(client, em);
try {
if (client.isFirstCommand()) {
requests.add(new RootRequest(client.getRepository()));
requests.add(new UseUnchangedRequest());
}
addBooleanArgument(requests, isForAllUsers(), "-a"); // NOI18N
addBooleanArgument(requests, isForWorkingDirectory(), "-w"); // NOI18N
addBooleanArgument(requests, isLastEventOfProject(), "-l"); // NOI18N
addBooleanArgument(requests, isReportCheckouts(), "-o"); // NOI18N
addBooleanArgument(requests, isReportCommits(), "-c"); // NOI18N
addBooleanArgument(requests, isReportEverything(), "-e"); // NOI18N
addBooleanArgument(requests, isReportTags(), "-T"); // NOI18N
addStringArgument(requests, getReportEventType(), "-x"); // NOI18N
addStringArgument(requests, getShowBackToRecordContaining(), "-b"); // NOI18N
addStringArgument(requests, getSinceDate(), "-D"); // NOI18N
addStringArgument(requests, getSinceRevision(), "-r"); // NOI18N
addStringArgument(requests, getSinceTag(), "-t"); // NOI18N
addStringArrayArgument(requests, getForUsers(), "-u"); // NOI18N
addStringArrayArgument(requests, getReportLastEventForModule(), "-n"); // NOI18N
addStringArrayArgument(requests, getReportOnModule(), "-m"); // NOI18N
addStringArrayArgument(requests, getLastEventForFile(), "-f"); // NOI18N
if (!isReportCheckouts() && !isReportCommits() && !isReportTags() && !isReportEverything() && getReportEventType() == null
&& getReportOnModule() == null) {
// this is the default switch if nothing else is specified.
addBooleanArgument(requests, true, "-c"); // NOI18N
}
if (getTimeZone() != null) {
addStringArgument(requests, getTimeZone(), "-z"); // NOI18N
} else {
addStringArgument(requests, "+0000", "-z"); // NOI18N
}
requests.add(CommandRequest.HISTORY);
client.processRequests(requests);
} catch (CommandException ex) {
throw ex;
} catch (Exception ex) {
throw new CommandException(ex, ex.getLocalizedMessage());
} finally {
requests.clear();
}
}
private void addStringArgument(List reqList, String property, String cvsSwitch) {
if (property != null) {
reqList.add(new ArgumentRequest(cvsSwitch));
reqList.add(new ArgumentRequest(property));
}
}
private void addStringArrayArgument(List reqList, String[] property, String cvsSwitch) {
if (property != null) {
for (int i = 0; i < property.length; i++) {
reqList.add(new ArgumentRequest(cvsSwitch));
reqList.add(new ArgumentRequest(property[i]));
}
}
}
private void addBooleanArgument(List reqList, boolean property, String cvsSwitch) {
if (property == true) {
reqList.add(new ArgumentRequest(cvsSwitch));
}
}
/**
* called when server responses with "ok" or "error", (when the command finishes)
*/
@Override
public void commandTerminated(TerminationEvent e) {
}
/**
* 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("history "); // NOI18N
toReturn.append(getCVSArguments());
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 == 'a') {
setForAllUsers(true);
} else if (opt == 'b') {
setShowBackToRecordContaining(optArg);
} else if (opt == 'c') {
setReportCommits(true);
} else if (opt == 'D') {
setSinceDate(optArg);
} else if (opt == 'e') {
setReportEverything(true);
} else if (opt == 'l') {
setLastEventOfProject(true);
} else if (opt == 'o') {
setReportCheckouts(true);
} else if (opt == 'r') {
setSinceRevision(optArg);
} else if (opt == 'T') {
setReportTags(true);
} else if (opt == 't') {
setSinceTag(optArg);
} else if (opt == 'w') {
setForWorkingDirectory(true);
} else if (opt == 'x') {
setReportEventType(optArg);
} else if (opt == 'z') {
setTimeZone(optArg);
} else if (opt == 'f') {
addLastEventForFile(optArg);
} else if (opt == 'm') {
addReportOnModule(optArg);
} else if (opt == 'n') {
addReportLastEventForModule(optArg);
} else if (opt == 'u') {
addForUsers(optArg);
} else {
return false;
}
return true;
}
/**
* String returned by this method defines which options are available for this particular command
*/
@Override
public String getOptString() {
return "ab:cD:ef:lm:n:or:Tt:u:wx:z:"; // 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() {
setForAllUsers(false);
setForUsers(null);
setForWorkingDirectory(false);
setLastEventForFile(null);
setLastEventOfProject(false);
setReportCheckouts(false);
setReportCommits(false);
setReportEventType(null);
setReportEverything(false);
setReportLastEventForModule(null);
setReportOnModule(null);
setReportTags(false);
setShowBackToRecordContaining(null);
setSinceDate(null);
setSinceRevision(null);
setSinceTag(null);
setTimeZone(null);
}
/**
* 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 (isForAllUsers()) {
toReturn.append("-a "); // NOI18N
}
if (isForWorkingDirectory()) {
toReturn.append("-w "); // NOI18N
}
if (isLastEventOfProject()) {
toReturn.append("-l "); // NOI18N
}
if (isReportCheckouts()) {
toReturn.append("-o "); // NOI18N
}
if (isReportCommits()) {
toReturn.append("-c "); // NOI18N
}
if (isReportEverything()) {
toReturn.append("-e "); // NOI18N
}
if (isReportTags()) {
toReturn.append("-T "); // NOI18N
}
if (getForUsers() != null) {
appendArrayToSwitches(toReturn, getForUsers(), "-u "); // NOI18N
}
if (getLastEventForFile() != null) {
appendArrayToSwitches(toReturn, getLastEventForFile(), "-f "); // NOI18N
}
if (getReportEventType() != null) {
toReturn.append("-x "); // NOI18N
toReturn.append(getReportEventType());
toReturn.append(" "); // NOI18N
}
if (getReportLastEventForModule() != null) {
appendArrayToSwitches(toReturn, getReportLastEventForModule(), "-n "); // NOI18N
}
if (getReportOnModule() != null) {
appendArrayToSwitches(toReturn, getReportOnModule(), "-m "); // NOI18N
}
if (getShowBackToRecordContaining() != null) {
toReturn.append("-b "); // NOI18N
toReturn.append(getShowBackToRecordContaining());
toReturn.append(" "); // NOI18N
}
if (getSinceDate() != null) {
toReturn.append("-D "); // NOI18N
toReturn.append(getSinceDate());
toReturn.append(" "); // NOI18N
}
if (getSinceRevision() != null) {
toReturn.append("-r "); // NOI18N
toReturn.append(getSinceRevision());
toReturn.append(" "); // NOI18N
}
if (getSinceTag() != null) {
toReturn.append("-t "); // NOI18N
toReturn.append(getSinceTag());
toReturn.append(" "); // NOI18N
}
if (getTimeZone() != null) {
toReturn.append("-z "); // NOI18N
toReturn.append(getTimeZone());
toReturn.append(" "); // NOI18N
}
return toReturn.toString();
}
private void appendArrayToSwitches(StringBuffer buff, String[] arr, String cvsSwitch) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
buff.append(cvsSwitch);
buff.append(arr[i]);
buff.append(" "); // NOI18N
}
}
/**
* Getter for property forAllUsers. (cvs switch -a)
*
* @return Value of property forAllUsers.
*/
public boolean isForAllUsers() {
return this.forAllUsers;
}
/**
* Setter for property forAllUsers. (cvs switch -a)
*
* @param forAllUsers
* New value of property forAllUsers.
*/
public void setForAllUsers(boolean forAllUsers) {
this.forAllUsers = forAllUsers;
}
/**
* Getter for property goBackToRecord. (cvs switch -b)
*
* @return Value of property goBackToRecord.
*/
public String getShowBackToRecordContaining() {
return this.showBackToRecordContaining;
}
/**
* Setter for property goBackToRecord. (cvs switch -b)
*
* @param goBackToRecord
* New value of property goBackToRecord.
*/
public void setShowBackToRecordContaining(String goBackToRecord) {
this.showBackToRecordContaining = goBackToRecord;
}
/**
* Getter for property reportCommits. (cvs switch -c)
*
* @return Value of property reportCommits.
*/
public boolean isReportCommits() {
return this.reportCommits;
}
/**
* Setter for property reportCommits. (cvs switch -b)
*
* @param reportCommits
* New value of property reportCommits.
*/
public void setReportCommits(boolean reportCommits) {
this.reportCommits = reportCommits;
}
/**
* Getter for property sinceDate. (cvs switch -D)
*
* @return Value of property sinceDate.
*/
public String getSinceDate() {
return this.sinceDate;
}
/**
* Setter for property sinceDate. (cvs switch -D)
*
* @param sinceDate
* New value of property sinceDate.
*/
public void setSinceDate(String sinceDate) {
this.sinceDate = sinceDate;
}
/**
* Getter for property reportEverything. (cvs switch -e)
*
* @return Value of property reportEverything.
*/
public boolean isReportEverything() {
return this.reportEverything;
}
/**
* Setter for property reportEverything. (cvs switch -e)
*
* @param reportEverything
* New value of property reportEverything.
*/
public void setReportEverything(boolean reportEverything) {
this.reportEverything = reportEverything;
}
/**
* Getter for property lastEventOfProject. (cvs switch -l)
*
* @return Value of property lastEventOfProject.
*/
public boolean isLastEventOfProject() {
return this.lastEventOfProject;
}
/**
* Setter for property lastEventOfProject. (cvs switch -l)
*
* @param lastEventOfProject
* New value of property lastEventOfProject.
*/
public void setLastEventOfProject(boolean lastEventOfProject) {
this.lastEventOfProject = lastEventOfProject;
}
/**
* Getter for property reportCheckout. (cvs switch -o)
*
* @return Value of property reportCheckout.
*/
public boolean isReportCheckouts() {
return this.reportCheckouts;
}
/**
* Setter for property reportCheckout. (cvs switch -o)
*
* @param reportCheckout
* New value of property reportCheckout.
*/
public void setReportCheckouts(boolean reportCheckout) {
this.reportCheckouts = reportCheckout;
}
/**
* Getter for property sinceRevision. (cvs switch -r)
*
* @return Value of property sinceRevision.
*/
public String getSinceRevision() {
return this.sinceRevision;
}
/**
* Setter for property sinceRevision. (cvs switch -r)
*
* @param sinceRevision
* New value of property sinceRevision.
*/
public void setSinceRevision(String sinceRevision) {
this.sinceRevision = sinceRevision;
}
/**
* Getter for property reportTags. (cvs switch -T)
*
* @return Value of property reportTags.
*/
public boolean isReportTags() {
return this.reportTags;
}
/**
* Setter for property reportTags. (cvs switch -T)
*
* @param reportTags
* New value of property reportTags.
*/
public void setReportTags(boolean reportTags) {
this.reportTags = reportTags;
}
/**
* Getter for property sinceTag. (cvs switch -t)
*
* @return Value of property sinceTag.
*/
public String getSinceTag() {
return this.sinceTag;
}
/**
* Setter for property sinceTag. (cvs switch -t)
*
* @param sinceTag
* New value of property sinceTag.
*/
public void setSinceTag(String sinceTag) {
this.sinceTag = sinceTag;
}
/**
* Getter for property forWorkingDirectory. (cvs switch -w)
*
* @return Value of property forWorkingDirectory.
*/
public boolean isForWorkingDirectory() {
return this.forWorkingDirectory;
}
/**
* Setter for property forWorkingDirectory. (cvs switch -w)
*
* @param forWorkingDirectory
* New value of property forWorkingDirectory.
*/
public void setForWorkingDirectory(boolean forWorkingDirectory) {
this.forWorkingDirectory = forWorkingDirectory;
}
/**
* Getter for property reportEventType. (cvs switch -x)
*
* @return Value of property reportEventType.
*/
public String getReportEventType() {
return this.reportEventType;
}
/**
* Setter for property reportEventType. (cvs switch -x)
*
* @param reportEventType
* New value of property reportEventType.
*/
public void setReportEventType(String reportEventType) {
this.reportEventType = reportEventType;
}
/**
* Getter for property timeZone. (cvs switch -z)
*
* @return Value of property timeZone.
*/
public String getTimeZone() {
return this.timeZone;
}
/**
* Setter for property timeZone. (cvs switch -z)
*
* @param timeZone
* New value of property timeZone.
*/
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
/**
* Getter for property lastEventForFile. (cvs switch -f)
*
* @return Value of property lastEventForFile.
*/
public String[] getLastEventForFile() {
return this.lastEventForFile;
}
/**
* Setter for property lastEventForFile. (cvs switch -f)
*
* @param lastEventForFile
* New value of property lastEventForFile.
*/
public void setLastEventForFile(String[] lastEventForFile) {
this.lastEventForFile = lastEventForFile;
}
public void addLastEventForFile(String newFile) {
this.lastEventForFile = addNewValue(this.lastEventForFile, newFile);
}
/**
* Getter for property reportOnModule. (cvs switch -m)
*
* @return Value of property reportOnModule.
*/
public String[] getReportOnModule() {
return this.reportOnModule;
}
/**
* Setter for property reportOnModule. (cvs switch -m)
*
* @param reportOnModule
* New value of property reportOnModule.
*/
public void setReportOnModule(String[] reportOnModule) {
this.reportOnModule = reportOnModule;
}
public void addReportOnModule(String newReportOnModule) {
this.reportOnModule = addNewValue(this.reportOnModule, newReportOnModule);
}
/**
* Getter for property reportLastEventForModule. (cvs switch -n)
*
* @return Value of property reportLastEventForModule.
*/
public String[] getReportLastEventForModule() {
return this.reportLastEventForModule;
}
/**
* Setter for property reportLastEventForModule. (cvs switch -n)
*
* @param reportLastEventForModule
* New value of property reportLastEventForModule.
*/
public void setReportLastEventForModule(String[] reportLastEventForModule) {
this.reportLastEventForModule = reportLastEventForModule;
}
public void addReportLastEventForModule(String newModule) {
this.reportLastEventForModule = addNewValue(this.reportLastEventForModule, newModule);
}
/**
* Getter for property forUsers. (cvs switch -u)
*
* @return Value of property forUsers.
*/
public String[] getForUsers() {
return this.forUsers;
}
/**
* Setter for property forUsers. (cvs switch -u)
*
* @param forUsers
* New value of property forUsers.
*/
public void setForUsers(String[] forUsers) {
this.forUsers = forUsers;
}
public void addForUsers(String forUser) {
this.forUsers = addNewValue(this.forUsers, forUser);
}
private String[] addNewValue(String[] arr, String newVal) {
if (arr == null) {
arr = new String[] { newVal };
return arr;
}
String[] newValue = new String[arr.length + 1];
for (int i = 0; i < arr.length; i++) {
newValue[i] = arr[i];
}
newValue[newValue.length] = newVal;
return newValue;
}
}