Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/commands/Command.java')
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/commands/Command.java722
1 files changed, 344 insertions, 378 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/commands/Command.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/commands/Command.java
index b48a66c16..e1499a61f 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/commands/Command.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/commands/Command.java
@@ -1,378 +1,344 @@
-package org.eclipse.team.internal.ccvs.core.commands;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.PrintStream;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.Client;
-import org.eclipse.team.internal.ccvs.core.Policy;
-import org.eclipse.team.internal.ccvs.core.connection.CVSServerException;
-import org.eclipse.team.internal.ccvs.core.requests.RequestSender;
-import org.eclipse.team.internal.ccvs.core.resources.api.IManagedFolder;
-import org.eclipse.team.internal.ccvs.core.resources.api.IManagedResource;
-import org.eclipse.team.internal.ccvs.core.response.ResponseDispatcher;
-import org.eclipse.team.internal.ccvs.core.util.Assert;
-
-/**
- * Abstract base class for the commands which implements the ICommand
- * interface so subclasses can be added to the CommandDispatcher.
- *
- * Also you do not need to use this class to implement commands
- * because the dispatcher makes use of ICommand only. However, all
- * the current command are derived from this class.
- */
-abstract class Command implements ICommand {
-
- private String[] globalOptions;
- private String[] localOptions;
- private String[] arguments;
-
- private IManagedFolder mRoot;
-
- protected final ResponseDispatcher responseDispatcher;
- protected final RequestSender requestSender;
-
- /**
- * The CommandDispatcher, the ResponseDispatcher and
- * the RequestSender are the three major objects in
- * the client.
- *
- * ResponseDispatcher is used to process the response form the server.
- * RequestSender is used to send requests to the server.
- */
- public Command(ResponseDispatcher responseDispatcher,
- RequestSender requestSender) {
-
- this.responseDispatcher = responseDispatcher;
- this.requestSender = requestSender;
- }
-
- /**
- * Execute the given command. Do so by invoking the sendRequestsToServer method.
- * Does handle the work with the progress-monitor.
- *
- * @see ICommand#execute(Connection, String[], String[], ICVSResource, OutputStream)
- */
- public void execute (
- String[] globalOptions,
- String[] localOptions,
- String[] arguments,
- IManagedFolder mRoot,
- IProgressMonitor monitor,
- PrintStream messageOut)
- throws CVSException {
-
- // Record the arguments so subclass can access them using the get methods
- this.mRoot = mRoot;
- this.globalOptions = globalOptions;
- this.localOptions = localOptions;
- this.arguments = arguments;
-
- try {
-
- monitor = Policy.monitorFor(monitor);
- monitor.beginTask(Policy.bind("Command.server"), 100);
- Policy.checkCanceled(monitor);
-
- // Send the options to the server (the command itself has to care
- // about the arguments)
- // It is questionable if this is going to stay here, because
- // NOTE: because why?
- sendGlobalOptions();
- sendLocalOptions();
-
- // Guess that set up contributes 20% of work.
- sendRequestsToServer(Policy.subMonitorFor(monitor, 20));
- Policy.checkCanceled(monitor);
-
- // Send all arguments to the server
- sendArguments();
- // Send the request name to the server
- requestSender.writeLine(getRequestName());
-
- try {
- // Processing responses contributes 70% of work.
- responseDispatcher.manageResponse(Policy.subMonitorFor(monitor, 70), mRoot, messageOut);
-
- } catch (CVSException e) {
- finished(false);
- throw e;
- }
- // Finished adds last 10% of work.
- finished(true);
- monitor.worked(10);
- } finally {
- monitor.done();
- }
-
- }
-
- /**
- * Abstract method to send the complete arguments of the command to the server.
- * The command itself is not sent here but in the execute method.
- */
- protected abstract void sendRequestsToServer(IProgressMonitor monitor) throws CVSException;
-
- /**
- * Called after command has been executed to allow subclasses to cleanup.
- * Default is to do nothing.
- */
- protected void finished(boolean success) throws CVSException {
- }
-
- /**
- * Sends the arguments to the server.
- */
- protected void sendArguments() throws CVSException {
- if (arguments == null) {
- return;
- }
- for (int i= 0; i < arguments.length; i++) {
- requestSender.sendArgument(arguments[i]);
- }
- }
-
- /**
- * Sends localOptions to the server.
- */
- protected void sendLocalOptions() throws CVSException {
- if (localOptions == null)
- return;
- for (int i= 0; i < localOptions.length; i++) {
- requestSender.sendArgument(localOptions[i]);
- }
- }
-
- /**
- * Sends the global options to the server.
- *
- * It is allowed for the globalOptions to have null-values so this
- * method has to cope with null-values in the array. Also, the
- * global options may be null at all.
- */
- protected void sendGlobalOptions() throws CVSException {
- if (globalOptions == null) {
- return;
- }
- for (int i= 0; i < globalOptions.length; i++) {
- if (globalOptions[i] != null) {
- requestSender.sendGlobalOption(globalOptions[i]);
- }
- }
- }
-
- /**
- * Send the homefolder as last thing before you send (eventually the
- * arguments and then) the command.
- *
- * lookLocal specifies whether the system tries to look into the
- * CVS properties for the folder.
- */
- protected void sendHomeFolder(boolean lookLocal) throws CVSException {
- if (lookLocal && mRoot.isCVSFolder()) {
- requestSender.sendDirectory(Client.CURRENT_LOCAL_FOLDER, mRoot.getRemoteLocation(mRoot));
- } else {
- requestSender.sendConstructedDirectory(Client.CURRENT_LOCAL_FOLDER, Client.CURRENT_REMOTE_FOLDER);
- }
- }
-
- /**
- * Send the homefolder as last thing before you send (eventually the
- * arguments and then) the command
- */
- protected void sendHomeFolder() throws CVSException {
- sendHomeFolder(true);
- }
-
- /**
- * Gets the getGlobalOptions
- * @return Returns a String[]
- */
- protected String[] getGlobalOptions() {
- return globalOptions;
- }
-
- /**
- * Gets the arguments
- * @return Returns a String[]
- */
- protected String[] getArguments() {
- return arguments;
- }
-
- /**
- * Gets the localOptions
- * @return Returns a String[]
- */
- protected String[] getLocalOptions() {
- return localOptions;
- }
-
- /**
- * getRoot returns the folder the client was called with.
- * (Sometimes that is not the folder you want to work with)
- *
- * @return Returns a ICVSResource
- */
- protected IManagedFolder getRoot() throws CVSException {
-
- if (!mRoot.isFolder()) {
- throw new CVSException(Policy.bind("Command.invalidRoot", new Object[] {mRoot.toString()}));
- }
-
- return mRoot;
- }
-
- /**
- * Takes all the arguments and gives them back as resources from the
- * root. This represents all the resources the client should work on.
- *
- * If there are no arguments gives the root folder back only.
- */
- protected IManagedResource[] getWorkResources() throws CVSException {
- return getWorkResources(0);
- }
-
- /**
- * Work like getWorkResources() but do not look at the first
- * skip elements when creating the resources (this is useful when
- * the first skip arguments of a command are not files but something
- * else)
- *
- * @see Command#getWorkResources()
- */
- protected IManagedResource[] getWorkResources(int skip) throws CVSException {
-
- IManagedResource[] result;
-
- Assert.isTrue(arguments.length >= skip);
-
- if (arguments.length == skip) {
- return new IManagedResource[]{mRoot};
- }
-
- result = new IManagedResource[arguments.length - skip];
-
- for (int i = skip; i<arguments.length; i++) {
- result[i - skip] = mRoot.getChild(arguments[i]);
- }
-
- return result;
- }
-
- /**
- * Get the resource that you are working with. This is a folder
- * most of the time, but could be a file on some operations as
- * well.
- *
- * It does also garantee that the WorkResource is a cvsFolder,
- * or (if it is a file) does live in a cvsFolder.
- *
- * This does not apply to every operation (e.g. would not work on a
- * checkout)
- *
- * @deprecated
- */
- protected IManagedResource getWorkResource(String relativeFolderPath) throws CVSException {
-
- IManagedResource workResource;
- IManagedFolder contextFolder;
-
- workResource = getRoot().getChild(relativeFolderPath);
-
- if (workResource.isFolder()) {
- contextFolder = (IManagedFolder)workResource;
- } else {
- contextFolder = workResource.getParent();
- }
-
- if (!contextFolder.isCVSFolder()) {
- throw new CVSException(Policy.bind("Command.invalidResource", new Object[] {contextFolder.toString()}));
- }
-
- return workResource;
- }
-
- /**
- * If mResource is a folder:<br>
- * Send all Directory under mResource as arguments to the server<br>
- * If mResource is a file:<br>
- * Send the file to the server<br>
- * <br>
- * Files that are changed are send with the content.
- *
- * @param modifiedOnly sends files that are modified only to the server
- * @param emptyFolders sends the folder-entrie even if there is no file
- to send in it
- */
- protected void sendFileStructure(IManagedResource mResource,
- IProgressMonitor monitor,
- boolean modifiedOnly,
- boolean emptyFolders) throws CVSException {
-
- FileStructureVisitor fsVisitor;
-
- fsVisitor = new FileStructureVisitor(requestSender,mRoot,monitor,modifiedOnly,emptyFolders);
-
- // FIXME: The accept should have an IProgressMonitor argment, not the above constructor
- mResource.accept(fsVisitor);
-
- }
-
- /**
- * Send an array of Resources.
- *
- * @see Command#sendFileStructure(IManagedResource,IProgressMonitor,boolean,boolean,boolean)
- */
- protected void sendFileStructure(IManagedResource[] mResources,
- IProgressMonitor monitor,
- boolean modifiedOnly,
- boolean emptyFolders) throws CVSException {
-
- for (int i=0; i<mResources.length; i++) {
- sendFileStructure(mResources[i],
- monitor,
- modifiedOnly,
- emptyFolders);
- }
- }
-
- /**
- * Checks that all the workResources are managed Resources.
- * (For folders we check isCVSFolder, because of a project-folder
- * that is not managed, because it is not registerd in the
- * parent-folder<br>
- * To be used this way: Assert.isTrue(allArgumentsManaged())
- *
- * @throws AssertionFailedException if not all the arguments are
- * managed
- */
- protected boolean allResourcesManaged() throws RuntimeException {
-
- IManagedResource[] mWorkResources;
-
- try {
- mWorkResources = getWorkResources();
-
- for (int i=0; i<mWorkResources.length; i++) {
- if (mWorkResources[i].isFolder()) {
- Assert.isTrue(((IManagedFolder) mWorkResources[i]).isCVSFolder());
- } else {
- Assert.isTrue(mWorkResources[i].isManaged());
- }
- }
- } catch (CVSException e) {
- Assert.isTrue(false);
- }
-
- return true;
- }
-
-}
-
+package org.eclipse.team.internal.ccvs.core.commands;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.io.PrintStream;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.team.internal.ccvs.core.CVSException;
+import org.eclipse.team.internal.ccvs.core.Client;
+import org.eclipse.team.internal.ccvs.core.Policy;
+import org.eclipse.team.internal.ccvs.core.requests.RequestSender;
+import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder;
+import org.eclipse.team.internal.ccvs.core.resources.ICVSResource;
+import org.eclipse.team.internal.ccvs.core.response.ResponseDispatcher;
+import org.eclipse.team.internal.ccvs.core.util.Assert;
+
+/**
+ * Abstract base class for the commands which implements the ICommand
+ * interface so subclasses can be added to the CommandDispatcher.
+ *
+ * Also you do not need to use this class to implement commands
+ * because the dispatcher makes use of ICommand only. However, all
+ * the current command are derived from this class.
+ */
+abstract class Command implements ICommand {
+
+ private String[] globalOptions;
+ private String[] localOptions;
+ private String[] arguments;
+
+ private ICVSFolder mRoot;
+
+ protected final ResponseDispatcher responseDispatcher;
+ protected final RequestSender requestSender;
+
+ /**
+ * The CommandDispatcher, the ResponseDispatcher and
+ * the RequestSender are the three major objects in
+ * the client.
+ *
+ * ResponseDispatcher is used to process the response form the server.
+ * RequestSender is used to send requests to the server.
+ */
+ public Command(ResponseDispatcher responseDispatcher,
+ RequestSender requestSender) {
+
+ this.responseDispatcher = responseDispatcher;
+ this.requestSender = requestSender;
+ }
+
+ /**
+ * Execute the given command. Do so by invoking the sendRequestsToServer method.
+ * Does handle the work with the progress-monitor.
+ *
+ * @see ICommand#execute(Connection, String[], String[], ICVSResource, OutputStream)
+ */
+ public void execute (
+ String[] globalOptions,
+ String[] localOptions,
+ String[] arguments,
+ ICVSFolder mRoot,
+ IProgressMonitor monitor,
+ PrintStream messageOut)
+ throws CVSException {
+
+ // Record the arguments so subclass can access them using the get methods
+ this.mRoot = mRoot;
+ this.globalOptions = globalOptions;
+ this.localOptions = localOptions;
+ this.arguments = arguments;
+
+ try {
+
+ monitor = Policy.monitorFor(monitor);
+ monitor.beginTask(Policy.bind("Command.server"), 100);
+ Policy.checkCanceled(monitor);
+
+ // Send the options to the server (the command itself has to care
+ // about the arguments)
+ // It is questionable if this is going to stay here, because
+ // NOTE: because why?
+ sendGlobalOptions();
+ sendLocalOptions();
+
+ // Guess that set up contributes 20% of work.
+ sendRequestsToServer(Policy.subMonitorFor(monitor, 20));
+ Policy.checkCanceled(monitor);
+
+ // Send all arguments to the server
+ sendArguments();
+ // Send the request name to the server
+ requestSender.writeLine(getRequestName());
+
+ try {
+ // Processing responses contributes 70% of work.
+ responseDispatcher.manageResponse(Policy.subMonitorFor(monitor, 70), mRoot, messageOut);
+
+ } catch (CVSException e) {
+ finished(false);
+ throw e;
+ }
+ // Finished adds last 10% of work.
+ finished(true);
+ monitor.worked(10);
+ } finally {
+ monitor.done();
+ }
+
+ }
+
+ /**
+ * Abstract method to send the complete arguments of the command to the server.
+ * The command itself is not sent here but in the execute method.
+ */
+ protected abstract void sendRequestsToServer(IProgressMonitor monitor) throws CVSException;
+
+ /**
+ * Called after command has been executed to allow subclasses to cleanup.
+ * Default is to do nothing.
+ */
+ protected void finished(boolean success) throws CVSException {
+ }
+
+ /**
+ * Sends the arguments to the server.
+ */
+ protected void sendArguments() throws CVSException {
+ if (arguments == null) {
+ return;
+ }
+ for (int i= 0; i < arguments.length; i++) {
+ requestSender.sendArgument(arguments[i]);
+ }
+ }
+
+ /**
+ * Sends localOptions to the server.
+ */
+ protected void sendLocalOptions() throws CVSException {
+ if (localOptions == null)
+ return;
+ for (int i= 0; i < localOptions.length; i++) {
+ requestSender.sendArgument(localOptions[i]);
+ }
+ }
+
+ /**
+ * Sends the global options to the server.
+ *
+ * It is allowed for the globalOptions to have null-values so this
+ * method has to cope with null-values in the array. Also, the
+ * global options may be null at all.
+ */
+ protected void sendGlobalOptions() throws CVSException {
+ if (globalOptions == null) {
+ return;
+ }
+ for (int i= 0; i < globalOptions.length; i++) {
+ if (globalOptions[i] != null) {
+ requestSender.sendGlobalOption(globalOptions[i]);
+ }
+ }
+ }
+
+ /**
+ * Send the homefolder as last thing before you send (eventually the
+ * arguments and then) the command.
+ *
+ * lookLocal specifies whether the system tries to look into the
+ * CVS properties for the folder.
+ */
+ protected void sendHomeFolder(boolean lookLocal) throws CVSException {
+ if (lookLocal && mRoot.isCVSFolder()) {
+ requestSender.sendDirectory(Client.CURRENT_LOCAL_FOLDER, mRoot.getRemoteLocation(mRoot));
+ } else {
+ requestSender.sendConstructedDirectory(Client.CURRENT_LOCAL_FOLDER, Client.CURRENT_REMOTE_FOLDER);
+ }
+ }
+
+ /**
+ * Send the homefolder as last thing before you send (eventually the
+ * arguments and then) the command
+ */
+ protected void sendHomeFolder() throws CVSException {
+ sendHomeFolder(true);
+ }
+
+ /**
+ * Gets the getGlobalOptions
+ * @return Returns a String[]
+ */
+ protected String[] getGlobalOptions() {
+ return globalOptions;
+ }
+
+ /**
+ * Gets the arguments
+ * @return Returns a String[]
+ */
+ protected String[] getArguments() {
+ return arguments;
+ }
+
+ /**
+ * Gets the localOptions
+ * @return Returns a String[]
+ */
+ protected String[] getLocalOptions() {
+ return localOptions;
+ }
+
+ /**
+ * getRoot returns the folder the client was called with.
+ * (Sometimes that is not the folder you want to work with)
+ *
+ * @return Returns a ICVSResource
+ */
+ protected ICVSFolder getRoot() throws CVSException {
+
+ if (!mRoot.isFolder()) {
+ throw new CVSException(Policy.bind("Command.invalidRoot", new Object[] {mRoot.toString()}));
+ }
+
+ return mRoot;
+ }
+
+ /**
+ * Takes all the arguments and gives them back as resources from the
+ * root. This represents all the resources the client should work on.
+ *
+ * If there are no arguments gives the root folder back only.
+ */
+ protected ICVSResource[] getWorkResources() throws CVSException {
+ return getWorkResources(0);
+ }
+
+ /**
+ * Work like getWorkResources() but do not look at the first
+ * skip elements when creating the resources (this is useful when
+ * the first skip arguments of a command are not files but something
+ * else)
+ *
+ * @see Command#getWorkResources()
+ */
+ /**
+ * Work like getWorkResources() but do not look at the first
+ * skip elements when creating the resources (this is useful when
+ * the first skip arguments of a command are not files but something
+ * else)
+ *
+ * @see Command#getWorkResources()
+ */
+ protected ICVSResource[] getWorkResources(int skip) throws CVSException {
+
+ ICVSResource[] result;
+
+ Assert.isTrue(arguments.length >= skip);
+
+ if (arguments.length == skip) {
+ result = new ICVSResource[]{mRoot};
+ } else {
+ result = new ICVSResource[arguments.length - skip];
+ for (int i = skip; i<arguments.length; i++) {
+ result[i - skip] = mRoot.getChild(arguments[i]);
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * If mResource is a folder:<br>
+ * Send all Directory under mResource as arguments to the server<br>
+ * If mResource is a file:<br>
+ * Send the file to the server<br>
+ * <br>
+ * Files that are changed are send with the content.
+ *
+ * @param modifiedOnly sends files that are modified only to the server
+ * @param emptyFolders sends the folder-entrie even if there is no file
+ to send in it
+ */
+ protected void sendFileStructure(ICVSResource mResource,
+ IProgressMonitor monitor,
+ boolean modifiedOnly,
+ boolean emptyFolders) throws CVSException {
+
+ FileStructureVisitor fsVisitor;
+
+ fsVisitor = new FileStructureVisitor(requestSender,mRoot,monitor,modifiedOnly,emptyFolders);
+
+ // FIXME: The accept should have an IProgressMonitor argment, not the above constructor
+ mResource.accept(fsVisitor);
+
+ }
+
+ /**
+ * Send an array of Resources.
+ *
+ * @see Command#sendFileStructure(ICVSResource,IProgressMonitor,boolean,boolean,boolean)
+ */
+ protected void sendFileStructure(ICVSResource[] mResources,
+ IProgressMonitor monitor,
+ boolean modifiedOnly,
+ boolean emptyFolders) throws CVSException {
+
+ checkArgumentsManaged(mResources);
+
+ for (int i=0; i<mResources.length; i++) {
+ sendFileStructure(mResources[i],
+ monitor,
+ modifiedOnly,
+ emptyFolders);
+ }
+ }
+
+ /**
+ * Checks that all the workResources are managed Resources.
+ * (For folders we check isCVSFolder, because of a project-folder
+ * that is not managed, because it is not registerd in the
+ * parent-folder<br>
+ *
+ * @throws CVSException if not all the arguments are
+ * managed
+ */
+ protected void checkArgumentsManaged(ICVSResource[] mWorkResources) throws CVSException {
+
+ for (int i=0; i<mWorkResources.length; i++) {
+ if (mWorkResources[i].isFolder()) {
+ if (!((ICVSFolder) mWorkResources[i]).isCVSFolder()) {
+ throw new CVSException("Argument " + mWorkResources[i].getName() + "is not managed");
+ }
+ } else {
+ if (!mWorkResources[i].isManaged()) {
+ throw new CVSException("Argument " + mWorkResources[i].getName() + "is not managed");
+ }
+ }
+ }
+ }
+}
+

Back to the top