/*
* (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;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.command.CommandAbortedException;
import org.netbeans.lib.cvsclient.command.CommandException;
import org.netbeans.lib.cvsclient.command.GlobalOptions;
import org.netbeans.lib.cvsclient.connection.AuthenticationException;
import org.netbeans.lib.cvsclient.file.FileHandler;
import org.netbeans.lib.cvsclient.request.UnconfiguredRequestException;
import org.netbeans.lib.cvsclient.response.ResponseException;
import org.netbeans.lib.cvsclient.util.IgnoreFileFilter;
/**
* Clients that provide the ability to execute commands must implement this interface. All commands use this interface to get details about
* the environment in which it is being run, and to perform administrative functions such as obtaining Entry lines for specified files.
*
* @author Robert Greig
*/
public interface ClientServices {
/**
* Process all the requests.
*
* @param requests
* the requets to process
*/
void processRequests(List requests) throws IOException, UnconfiguredRequestException, ResponseException, CommandAbortedException;
/**
* Get the repository used for this connection.
*
* @return the repository, for example /home/bob/cvs
*/
String getRepository();
/**
* Get the repository path for a given directory, for example in the directory /home/project/foo/bar, the repository directory might be
* /usr/cvs/foo/bar. The repository directory is commonly stored in the file
*
* <pre>
* Repository
* </pre>
*
* in the CVS directory on the client. (This is the case in the standard CVS command-line tool)
*
* @param directory
* the directory
*/
String getRepositoryForDirectory(String directory) throws IOException;
/**
* Semantically equivalent to {@link #getRepositoryForDirectory(String)} but does not try to recover from missing CVS/Repository file.
*
* @param directory
* the directory to get repository for
* @return repository path that corresponds to the given local working directory or null if local directory is not versioned or does not
* exist
* @throws IOException
* if the repository cannot be determined by reading CVS/Repository file
*/
String getRepositoryForDirectory(File directory) throws IOException;
/**
* Get the local path that the command is executing in.
*
* @return the local path
*/
String getLocalPath();
/**
* Get the Entry for the specified file, if one exists.
*
* @param file
* the file
*
* @throws IOException
* if the Entries file cannot be read
*/
Entry getEntry(File file) throws IOException;
/**
* Get the entries for a specified directory.
*
* @param directory
* the directory for which to get the entries
*
* @return an iterator of Entry objects
*/
Iterator getEntries(File directory) throws IOException;
/**
* Create or update the administration files for a particular file This will create the CVS directory if necessary, and the Root and
* Repository files if necessary. It will also update the Entries file with the new entry
*
* @param localDirectory
* the local directory, relative to the directory in which the command was given, where the file in question lives
* @param entry
* the entry object for that file
*
* @throws IOException
* if there is an error writing the files
*/
void updateAdminData(String localDirectory, String repositoryPath, Entry entry) throws IOException;
/**
* Get all the files contained within a given directory that are <b>known to CVS</b>.
*
* @param directory
* the directory to look in
*
* @return a set of all files.
*/
Set getAllFiles(File directory) throws IOException;
/**
* Returns true if no command was sent before. This is used, because the server rejects some doubled commands.
*/
boolean isFirstCommand();
/**
* Set whether this is the first command. Normally you do not need to set this yourself - after execution the first command will have
* set this to false.
*/
void setIsFirstCommand(boolean first);
/**
* Removes the Entry for the specified file.
*/
void removeEntry(File file) throws IOException;
/**
* Sets the specified IgnoreFileFilter to use to ignore non-cvs files. TS, 2001-11-23: really needed in the interface (it's never used)?
*/
void setIgnoreFileFilter(IgnoreFileFilter filter);
/**
* Returns the IgnoreFileFilter used to ignore non-cvs files. TS, 2001-11-23: really needed in the interface (it's never used)?
*/
IgnoreFileFilter getIgnoreFileFilter();
/**
* Returnes true to indicate, that the file specified by directory and nonCvsFile should be ignored.
*/
boolean shouldBeIgnored(File directory, String nonCvsFile);
//
// allow the user of the Client to define the FileHandlers
//
/**
* Set the uncompressed file handler.
*/
void setUncompressedFileHandler(FileHandler handler);
/**
* Set the handler for Gzip data.
*/
void setGzipFileHandler(FileHandler handler);
/**
* Checks for presence of CVS/Tag file and returns it's value.
*
* @return the value of CVS/Tag file for the specified directory null if file doesn't exist
*/
String getStickyTagForDirectory(File directory);
/**
* Ensures, that the connection is open.
*
* @throws AuthenticationException
* if it wasn't possible to connect
*/
void ensureConnection() throws AuthenticationException;
/**
* Returns the wrappers map associated with the CVS server The map is valid only after the connection is established
*/
Map getWrappersMap() throws CommandException;
/**
* Get the global options that are set to this client. Individual commands can get the global options via this method.
*/
GlobalOptions getGlobalOptions();
/**
* Tests for existence of the given file. Normally this method delegates to File.exists() but it may also return true for files that
* exists only virtually (in memory). Is such case the file/directory will not exist on disk but its metadata will be available via
* getEntries() methods.
*
* @param file
* file to test for existence
* @return true if the file exists, false otherwise
*/
boolean exists(File file);
/**
* Tests whether command execution should be aborted. Commands are encouraged to regulary poll this value if they expect to block for a
* long time in their code.
*
* @return true if currently running command should abort, false otherwise
*/
boolean isAborted();
}