/* * (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.annotate; import java.util.Iterator; import java.util.LinkedList; import java.util.List; 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.ModuleExpansionEvent; 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.DirectoryRequest; import org.netbeans.lib.cvsclient.request.ExpandModulesRequest; import org.netbeans.lib.cvsclient.request.RootRequest; /** * The rannotate command is similar to anootate, but doens't operate on currently checked out sources. * * * @author MIlos Kleint */ public class RannotateCommand extends BasicCommand { /** * 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(); /** * Use head revision if a revision meeting criteria set by switches -r/-D (tag/date) is not found. */ private boolean useHeadIfNotFound; /** * equals the -D switch of command line cvs. */ private String annotateByDate; /** * Equals the -r switch of command-line cvs. */ private String annotateByRevision; /** * Holds value of property headerAndDescOnly. */ private boolean headerAndDescOnly; public RannotateCommand() { resetCVSCommand(); } /** * Set the modules to export. * * @param theModules * the names of the modules to export */ public void setModule(String module) { modules.add(module); } /** * clears the list of modules for export. */ public void clearModules() { this.modules.clear(); } /** * Set the modules to export. * * @param theModules * the names of the modules to export */ public void setModules(String[] modules) { clearModules(); if (modules == null) { return; } 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; } private void processExistingModules(String localPath) { if (expandedModules.size() == 0) { return; } String[] directories = new String[expandedModules.size()]; directories = (String[]) expandedModules.toArray(directories); setModules(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 */ @Override public void execute(ClientServices client, EventManager em) throws CommandException, AuthenticationException { client.ensureConnection(); requests = new LinkedList(); if (client.isFirstCommand()) { requests.add(new RootRequest(client.getRepository())); } for (Iterator it = modules.iterator(); it.hasNext();) { String module = (String) it.next(); requests.add(new ArgumentRequest(module)); } expandedModules.clear(); requests.add(new DirectoryRequest(".", client.getRepository())); // NOI18N 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); } /** * This is called when the server has responded to an expand-modules request. */ @Override 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 { // processExistingModules(client.getLocalPath()); super.execute(client, em); // // moved modules code to the end of the other arguments --GAR // if (!isRecursive()) { requests.add(1, new ArgumentRequest("-l")); // NOI18N } if (useHeadIfNotFound) { requests.add(1, new ArgumentRequest("-f")); // NOI18N } if (annotateByDate != null && annotateByDate.length() > 0) { requests.add(1, new ArgumentRequest("-D")); // NOI18N requests.add(2, new ArgumentRequest(getAnnotateByDate())); } if (annotateByRevision != null && annotateByRevision.length() > 0) { requests.add(1, new ArgumentRequest("-r")); // NOI18N requests.add(2, new ArgumentRequest(getAnnotateByRevision())); } 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.RANNOTATE); try { client.processRequests(requests); requests.clear(); } catch (CommandException ex) { throw ex; } catch (Exception ex) { throw new CommandException(ex, ex.getLocalizedMessage()); } } @Override public String getCVSCommand() { StringBuffer toReturn = new StringBuffer("rannotate "); // NOI18N toReturn.append(getCVSArguments()); if (modules != null && modules.size() > 0) { for (Iterator it = modules.iterator(); it.hasNext();) { String module = (String) it.next(); toReturn.append(module); toReturn.append(' '); } } else { String localizedMsg = CommandException.getLocalMessage("ExportCommand.moduleEmpty.text"); // NOI18N toReturn.append(" "); // NOI18N toReturn.append(localizedMsg); } return toReturn.toString(); } @Override public String getCVSArguments() { StringBuffer toReturn = new StringBuffer(""); // NOI18N if (!isRecursive()) { toReturn.append("-l "); // NOI18N } if (getAnnotateByRevision() != null) { toReturn.append("-r "); // NOI18N toReturn.append(getAnnotateByRevision()); toReturn.append(" "); // NOI18N } if (getAnnotateByDate() != null) { toReturn.append("-D "); // NOI18N toReturn.append(getAnnotateByDate()); toReturn.append(" "); // NOI18N } if (isUseHeadIfNotFound()) { toReturn.append("-f "); // NOI18N } return toReturn.toString(); } @Override public boolean setCVSCommand(char opt, String optArg) { if (opt == 'R') { setRecursive(true); } else if (opt == 'l') { setRecursive(false); } else if (opt == 'r') { setAnnotateByRevision(optArg); } else if (opt == 'D') { setAnnotateByDate(optArg); } else if (opt == 'f') { setUseHeadIfNotFound(true); } else { return false; } return true; } @Override public void resetCVSCommand() { setRecursive(true); setAnnotateByDate(null); setAnnotateByRevision(null); setUseHeadIfNotFound(false); } /** * String returned by this method defines which options are available for this particular command */ @Override public String getOptString() { return "Rlr:D:f"; // NOI18N } /** * Create a builder for this command. * * @param eventMan * the event manager used to receive events. */ @Override public Builder createBuilder(EventManager eventMan) { return new AnnotateBuilder(eventMan, this); } /** * 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 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 annotateByDate. * * @return Value of property annotateByDate. */ public String getAnnotateByDate() { return annotateByDate; } /** * Setter for property annotateByDate. * * @param annotateByDate * New value of property annotateByDate. */ public void setAnnotateByDate(String annotateByDate) { this.annotateByDate = annotateByDate; } /** * Getter for property annotateByRevision. * * @return Value of property annotateByRevision. */ public String getAnnotateByRevision() { return annotateByRevision; } /** * Setter for property annotateByRevision. * * @param annotateByRevision * New value of property annotateByRevision. */ public void setAnnotateByRevision(String annotateByRevision) { this.annotateByRevision = annotateByRevision; } }