/*
* (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.admin;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import org.netbeans.lib.cvsclient.command.GlobalOptions;
/**
* Handles the maintaining and reading of administration information on the local machine. The standard CVS client does this by putting
* various files in a CVS directory underneath each checked-out directory. How the files are laid out and managed is not specified by the
* protocol document.
* <P>
* Hence it is envisaged that, eventually, a client could add additional files for higher performance or even change the mechanism for
* storing the information completely.
*
* @author Robert Greig
*/
public interface AdminHandler {
/**
* 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 where the file in question lives (the absolute path). Must not end with a slash.
* @param repositoryPath
* the path of the file in the repository
* @param entry
* the entry object for that file
* @param globalOptions
* the global command options
*/
void updateAdminData(String localDirectory, String repositoryPath, Entry entry, GlobalOptions globalOptions) throws IOException;
/**
* 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;
/**
* Set the Entry for the specified file
*
* @param file
* the file
* @param entry
* the new entry
* @throws IOException
* if an error occurs writing the details
*/
void setEntry(File file, Entry entry) throws IOException;
/**
* 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
* @param the
* repository path on the server, e.g. /home/bob/cvs. Must not end with a slash.
*/
String getRepositoryForDirectory(String directory, String repository) throws IOException;
/**
* Remove the Entry for the specified file
*
* @param file
* the file whose entry is to be removed
* @throws IOException
* if an error occurs writing the Entries file
*/
void removeEntry(File file) 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;
/**
* Checks for presence of CVS/Tag file and returns it's value.
*
* @return the value of CVS/Tag file for the specified directory (including leading "T") null if file doesn't exist
*/
String getStickyTagForDirectory(File directory);
/**
* 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);
}