/*
* (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.tag;
import java.io.EOFException;
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 tag command adds or deleted a tag to the specified files/directories.
*
* @author Thomas Singer
*/
public class TagCommand extends BasicCommand {
/**
* The event manager to use.
*/
private EventManager eventManager;
private boolean checkThatUnmodified;
private boolean deleteTag;
private boolean makeBranchTag;
private boolean overrideExistingTag;
private boolean matchHeadIfRevisionNotFound;
private String tag;
private String tagByDate;
private String tagByRevision;
/**
* Construct a new tag command.
*/
public TagCommand() {
}
/**
* Creates the TagBuilder.
*
* @param eventManager
* the event manager used to received cvs events
*/
@Override
public Builder createBuilder(EventManager eventManager) {
return new TagBuilder(eventManager, getLocalDirectory());
}
/**
* Returns true if checking for unmodified files is enabled.
*
* @deprecated
*/
@Deprecated
public boolean doesCheckThatUnmodified() {
return checkThatUnmodified;
}
/**
* Returns true if checking for unmodified files is enabled.
*/
public boolean isCheckThatUnmodified() {
return checkThatUnmodified;
}
/**
* Enabled the check for unmodified files.
*/
public void setCheckThatUnmodified(boolean checkThatUnmodified) {
this.checkThatUnmodified = checkThatUnmodified;
}
/**
* Returnes true if the tag should be deleted (otherwise added).
*
* @deprecated
*/
@Deprecated
public boolean doesDeleteTag() {
return deleteTag;
}
/**
* Returnes true if the tag should be deleted (otherwise added).
*/
public boolean isDeleteTag() {
return deleteTag;
}
/**
* Sets whether the tag should be deleted (true) or added (false).
*/
public void setDeleteTag(boolean deleteTag) {
this.deleteTag = deleteTag;
}
/**
* Returns true if the tag should be a branch tag.
*
* @deprecated
*/
@Deprecated
public boolean doesMakeBranchTag() {
return makeBranchTag;
}
/**
* Returns true if the tag should be a branch tag.
*/
public boolean isMakeBranchTag() {
return makeBranchTag;
}
/**
* Sets whether the tag should be a branch tag.
*/
public void setMakeBranchTag(boolean makeBranchTag) {
this.makeBranchTag = makeBranchTag;
}
/**
* Returns true to indicate that existing tag will be overridden.
*
* @deprecated
*/
@Deprecated
public boolean doesOverrideExistingTag() {
return overrideExistingTag;
}
/**
* Returns true to indicate that existing tag will be overridden.
*/
public boolean isOverrideExistingTag() {
return overrideExistingTag;
}
/**
* Sets whether existing tags should be overridden.
*/
public void setOverrideExistingTag(boolean overrideExistingTag) {
this.overrideExistingTag = overrideExistingTag;
}
public boolean isMatchHeadIfRevisionNotFound() {
return matchHeadIfRevisionNotFound;
}
public void setMatchHeadIfRevisionNotFound(boolean matchHeadIfRevisionNotFound) {
this.matchHeadIfRevisionNotFound = matchHeadIfRevisionNotFound;
}
/**
* Returns the tag that should be added or deleted.
*/
public String getTag() {
return tag;
}
/**
* Sets the tag that should be added or deleted.
*/
public void setTag(String tag) {
this.tag = tag;
}
/**
* Returns the latest date of a revision to be tagged.
*
* @return date value. the latest Revision not later ten date is tagged.
*/
public String getTagByDate() {
return tagByDate;
}
/**
* Sets the latest date of a revision to be tagged.
*
* @param tagDate
* New value of property tagDate.
*/
public void setTagByDate(String tagDate) {
tagByDate = tagDate;
}
/**
* Sets the latest date of a revision to be tagged. Can be both a number and a tag.
*
* @return Value of property tagRevision.
*/
public String getTagByRevision() {
return tagByRevision;
}
/**
* Sets the latest date of a revision to be tagged. Can be both a number and a tag.
*
* @param tagRevision
* New value of property tagRevision.
*/
public void setTagByRevision(String tagRevision) {
tagByRevision = tagRevision;
}
/**
* Execute the 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 eventManager) throws CommandException, AuthenticationException {
client.ensureConnection();
this.eventManager = eventManager;
super.execute(client, eventManager);
try {
requests.add(1, new ArgumentRequest(getTag()));
if (checkThatUnmodified) {
requests.add(1, new ArgumentRequest("-c")); // NOI18N
}
if (overrideExistingTag) {
requests.add(1, new ArgumentRequest("-F")); // NOI18N
}
if (matchHeadIfRevisionNotFound) {
requests.add(1, new ArgumentRequest("-f")); // NOI18N
}
if (makeBranchTag) {
requests.add(1, new ArgumentRequest("-b")); // NOI18N
}
if (deleteTag) {
requests.add(1, new ArgumentRequest("-d")); // NOI18N
}
if (tagByDate != null && tagByDate.length() > 0) {
requests.add(1, new ArgumentRequest("-D")); // NOI18N
requests.add(2, new ArgumentRequest(getTagByDate()));
}
if (tagByRevision != null && tagByRevision.length() > 0) {
requests.add(1, new ArgumentRequest("-r")); // NOI18N
requests.add(2, new ArgumentRequest(getTagByRevision()));
}
addRequestForWorkingDirectory(client);
addArgumentRequests();
addRequest(CommandRequest.TAG);
client.processRequests(requests);
} 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());
} finally {
requests.clear();
}
}
/**
* Called when server responses with "ok" or "error", (when the command finishes).
*/
@Override
public void commandTerminated(TerminationEvent e) {
if (builder != null) {
builder.outputDone();
}
}
/**
* This method returns how the tag command would looklike when typed on the command line.
*/
@Override
public String getCVSCommand() {
StringBuffer toReturn = new StringBuffer("tag "); // NOI18N
toReturn.append(getCVSArguments());
if (getTag() != null) {
toReturn.append(getTag());
toReturn.append(" "); // NOI18N
}
File[] files = getFiles();
if (files != null) {
for (int index = 0; index < files.length; index++) {
toReturn.append(files[index].getName());
toReturn.append(' ');
}
}
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 == 'c') {
setCheckThatUnmodified(true);
} else if (opt == 'd') {
setDeleteTag(true);
} else if (opt == 'F') {
setOverrideExistingTag(true);
} else if (opt == 'f') {
setMatchHeadIfRevisionNotFound(true);
} else if (opt == 'b') {
setMakeBranchTag(true);
} else if (opt == 'D') {
setTagByDate(optArg.trim());
} else if (opt == 'r') {
setTagByRevision(optArg.trim());
} else {
return false;
}
return true;
}
/**
* String returned by this method defines which options are available for this command.
*/
@Override
public String getOptString() {
return "RlcFfbdD:r:"; // 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);
setCheckThatUnmodified(false);
setDeleteTag(false);
setMakeBranchTag(false);
setOverrideExistingTag(false);
setMatchHeadIfRevisionNotFound(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();
if (!isRecursive()) {
toReturn.append("-l "); // NOI18N
}
if (isCheckThatUnmodified()) {
toReturn.append("-c "); // NOI18N
}
if (isOverrideExistingTag()) {
toReturn.append("-F "); // NOI18N
}
if (isMatchHeadIfRevisionNotFound()) {
toReturn.append("-f ");
}
if (isMakeBranchTag()) {
toReturn.append("-b "); // NOI18N
}
if (isDeleteTag()) {
toReturn.append("-d "); // NOI18N
}
if (getTagByRevision() != null && getTagByRevision().length() > 0) {
toReturn.append("-r "); // NOI18N
toReturn.append(getTagByRevision());
toReturn.append(" "); // NOI18N
}
if (getTagByDate() != null && getTagByDate().length() > 0) {
toReturn.append("-D "); // NOI18N
toReturn.append(getTagByDate());
toReturn.append(" "); // NOI18N
}
return toReturn.toString();
}
}