blob: a38744b0d66959cdbf2eefc845ca807b4c786ec1 [file] [log] [blame]
package org.netbeans.lib.cvsclient.file;
import org.netbeans.lib.cvsclient.admin.IAdminReader;
import org.netbeans.lib.cvsclient.util.BugLog;
import java.io.File;
import java.io.IOException;
/**
* @author Thomas Singer
*/
public final class CvsFileSystem
implements ICvsFileSystem {
// Fields =================================================================
private final IFileSystem localFileSystem;
private final IFileSystem adminFileSystem;
private final String repository;
// Setup ==================================================================
public CvsFileSystem(File rootDirectory, String repository) {
this(rootDirectory, rootDirectory, repository);
}
public CvsFileSystem(File localRootDirectory, File adminRootDirectory, String repository) {
BugLog.getInstance().assertNotNull(localRootDirectory);
BugLog.getInstance().assertNotNull(adminRootDirectory);
BugLog.getInstance().assertNotNull(repository);
this.localFileSystem = new FileSystem(localRootDirectory);
this.adminFileSystem = new FileSystem(adminRootDirectory);
this.repository = FileUtils.ensureTrailingSlash(repository).replace('\\', '/');
}
// Implemented ============================================================
/**
* @param relativeLocalDirectoryPath ends with a trailing slash (e.g. "./" or "dir/" or "dir1/dir2")
* @param repositoryFilePath ends with a trailing slash, if it is a directory ("e.g. "module/" or "module/file.txt")
*/
public FileObject getFileObject(String relativeLocalDirectoryPath, String repositoryFilePath) {
BugLog.getInstance().assertTrue(!relativeLocalDirectoryPath.startsWith("/"), "relativeLocalDirectory '" + relativeLocalDirectoryPath + "' must not start with /");
BugLog.getInstance().assertTrue(relativeLocalDirectoryPath.endsWith("/"), "relativeLocalDirectory '" + relativeLocalDirectoryPath + "' must end with /");
BugLog.getInstance().assertTrue(!repositoryFilePath.endsWith("/"), "repositoryFilePath '" + repositoryFilePath + "' must not end with /");
BugLog.getInstance().assertTrue(repositoryFilePath.indexOf('/') >= 0, "repositoryFileName '" + repositoryFilePath + "' must contain a /");
if (relativeLocalDirectoryPath.equals("./")) { // NOI18N
relativeLocalDirectoryPath = "";
}
final String fileName = getFileNameFromRepositoryPath(repositoryFilePath);
return FileObject.createInstance('/' + relativeLocalDirectoryPath + fileName);
}
public DirectoryObject getDirectoryObject(String relativeLocalDirectoryPath, String repositoryDirectoryPath) {
BugLog.getInstance().assertTrue(!relativeLocalDirectoryPath.startsWith("/"), "relativeLocalDirectoryPath '" + relativeLocalDirectoryPath + "' must not start with /");
BugLog.getInstance().assertTrue(relativeLocalDirectoryPath.endsWith("/"), "relativeLocalDirectoryPath '" + relativeLocalDirectoryPath + "' must end with /");
BugLog.getInstance().assertTrue(repositoryDirectoryPath.endsWith("/"), "repositoryDirectoryPath '" + repositoryDirectoryPath + "' must end with /");
if (relativeLocalDirectoryPath.equals("./")) {
relativeLocalDirectoryPath = "";
}
return DirectoryObject.createInstance('/' + FileUtils.removeTrailingSlash(relativeLocalDirectoryPath));
}
public IFileSystem getLocalFileSystem() {
return localFileSystem;
}
public IFileSystem getAdminFileSystem() {
return adminFileSystem;
}
public String getRelativeRepositoryPath(String repositoryPath) {
if (repositoryPath.startsWith(repository)) {
String relativeRepositoryPath = repositoryPath.substring(repository.length());
relativeRepositoryPath = FileUtils.removeTrailingSlash(relativeRepositoryPath);
if (relativeRepositoryPath.length() == 0) {
relativeRepositoryPath = ".";
}
return relativeRepositoryPath;
} else {
return FileUtils.removeTrailingSlash(repositoryPath);
}
}
public String getRepositoryForDirectory(DirectoryObject directoryObject, IAdminReader adminReader) {
try {
return adminReader.getRepositoryForDirectory(directoryObject, repository, this);
}
catch (IOException ex) {
return FileUtils.removeTrailingSlash(repository) + directoryObject.getPath();
}
}
public FileObject unixFileNameToFileObject(String unixFileName) {
return FileObject.createInstance('/' + unixFileName);
}
// Utils ==================================================================
private static String getFileNameFromRepositoryPath(String repositoryFilePath) {
final int lastSlashIndex = repositoryFilePath.lastIndexOf('/');
return repositoryFilePath.substring(lastSlashIndex + 1);
}
}