/* * (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; import java.io.File; import org.netbeans.lib.cvsclient.ClientServices; import org.netbeans.lib.cvsclient.connection.AuthenticationException; import org.netbeans.lib.cvsclient.event.BinaryMessageEvent; import org.netbeans.lib.cvsclient.event.CVSListener; import org.netbeans.lib.cvsclient.event.EventManager; import org.netbeans.lib.cvsclient.event.FileAddedEvent; import org.netbeans.lib.cvsclient.event.FileInfoEvent; import org.netbeans.lib.cvsclient.event.FileRemovedEvent; import org.netbeans.lib.cvsclient.event.FileToRemoveEvent; import org.netbeans.lib.cvsclient.event.FileUpdatedEvent; import org.netbeans.lib.cvsclient.event.MessageEvent; import org.netbeans.lib.cvsclient.event.ModuleExpansionEvent; import org.netbeans.lib.cvsclient.event.TerminationEvent; /** * All commands must extend this class. A command is essentially a collection of requests that make up what is logically known as a CVS * command (from a user's perspective). Commands correspond to operations the user can perform with CVS, for example checkout a module or * perform a diff on two file versions.<br> * Commands are automatically added as CVS event listeners. They can act on particular events and perhaps fire new events. * * @author Robert Greig */ public abstract class Command implements CVSListener, Cloneable { /** * The local directory from which the command is being run. This gives us the ability to construct a full pathname for the file which we * are processing. The information from the responses alone is not enough. */ protected String localDirectory; /** * The global options. */ private GlobalOptions globalOptions; private boolean failed = false; private String displayName; /** * 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 * @param e * the event manager. The command can use this to fire events if necessary - for example, while parsing status responses. * @return Whether the execution was successfull */ public void execute(ClientServices client, EventManager eventManager) throws CommandException, CommandAbortedException, AuthenticationException { setLocalDirectory(client.getLocalPath()); this.globalOptions = client.getGlobalOptions(); } /** * 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 */ public abstract String getCVSCommand(); /** * Returns the arguments of the command in the command-line style. Similar to getCVSCommand() however without the files and command's * name. */ public abstract String getCVSArguments(); /** * 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 */ public abstract boolean setCVSCommand(char opt, String optArg); /** * Resets all switches in the command to the default behaviour. After calling this method, the command should behave defaultly. */ public abstract void resetCVSCommand(); /** * Returns a String that defines which options are available for this particular command. */ public abstract String getOptString(); /** * This method just calls the Object.clone() and makes it public. */ @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException ex) { return null; } } public boolean hasFailed() { return failed; } /** * Called when the server wants to send a message to be displayed to the user. The message is only for information purposes and clients * can choose to ignore these messages if they wish. * * @param e * the event */ @Override public void messageSent(MessageEvent e) { if (e.isError() && e.getSource() instanceof org.netbeans.lib.cvsclient.response.ErrorResponse || e.getSource() == this) { // We need to ignore ErrorMessageResponse failed = true; } } @Override public void messageSent(BinaryMessageEvent e) { } /** * Called when a file has been added. * * @param e * the event */ @Override public void fileAdded(FileAddedEvent e) { } /** * Called when a file is going to be removed. * * @param e * the event */ @Override public void fileToRemove(FileToRemoveEvent e) { } /** * Called when a file is removed. * * @param e * the event */ @Override public void fileRemoved(FileRemovedEvent e) { } /** * Called when a file has been updated. * * @param e * the event */ @Override public void fileUpdated(FileUpdatedEvent e) { } /** * Called when file status information has been received. */ @Override public void fileInfoGenerated(FileInfoEvent e) { } /** * Called when server responses with "ok" or "error", (when the command finishes). */ @Override public void commandTerminated(TerminationEvent e) { } /** * This is called when the servers has responded to an expand-modules request. */ @Override public void moduleExpanded(ModuleExpansionEvent e) { } /** * Returns the local path the command is associated with. */ public final String getLocalDirectory() { return localDirectory; } /** * Returns the local path the command is associated with. * * @deprecated Please use the getLocalDirectory() method instead. */ @Deprecated public final String getLocalPath() { return localDirectory; } /** * Get the global options. */ public final GlobalOptions getGlobalOptions() { return globalOptions; } /** * Returns the relative path of the specified file (relative to the set local path). Backward slashes will be replaced by forward * slashes. */ public final String getRelativeToLocalPathInUnixStyle(File file) { String filePath = file.getAbsolutePath(); int startIndex = localDirectory.length() + 1; if (startIndex >= filePath.length()) { return "."; // NOI18N } String relativePath = filePath.substring(startIndex); return relativePath.replace('\\', '/'); } /** * Sets the local directory for the command. */ protected final void setLocalDirectory(String localDirectory) { this.localDirectory = localDirectory; } /** * Returns the trimmed version of the specified String s. The returned String is null if the specified String is null or contains only * white spaces. */ protected static final String getTrimmedString(String s) { if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return s; } /** * Defines prefered display name or <code>null</code>. Localized string should highlight command purpose (use verb in gerund). E.g. * <code>UpdateCommand</code> used to refresh statuses should be named "Refreshing Status" rather than "cvs -N update", "Updating" or * "Status Refresh". */ public void setDisplayName(String name) { this.displayName = name; } /** * Returns localized name describing command purpose or <code>null</code>. * * @see #getCVSCommand() */ public String getDisplayName() { return displayName; } }