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); } }