blob: 9880232a9d11fff86cbe7de1242ad658d5de0023 [file] [log] [blame]
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.lib.cvsclient.file;
import org.netbeans.lib.cvsclient.util.BugLog;
import org.jetbrains.annotations.NonNls;
import java.io.File;
/**
* @author Thomas Singer
*/
public final class FileSystem
implements IFileSystem {
// Fields =================================================================
private final File rootDirectory;
private final String canonicalRootDirectoryName;
@NonNls private static final String OS_NAME_PARAMETER = "os.name";
@NonNls private static final String WINDOWS = "Windows";
// Setup ==================================================================
public FileSystem(File rootDirectory) {
BugLog.getInstance().assertNotNull(rootDirectory);
this.rootDirectory = rootDirectory;
this.canonicalRootDirectoryName = getCanonicalFileName(rootDirectory);
}
// Implemented ============================================================
public File getRootDirectory() {
return rootDirectory;
}
public File getFile(String relativeFileName) {
BugLog.getInstance().assertNotNull(relativeFileName);
return new File(rootDirectory, relativeFileName);
}
public File getFile(AbstractFileObject fileObject) {
BugLog.getInstance().assertNotNull(fileObject);
return new File(rootDirectory, fileObject.getPath().substring(1));
}
public FileObject getFileObject(File file) throws OutOfFileSystemException {
BugLog.getInstance().assertNotNull(file);
if (file.isDirectory()) {
throw new IllegalArgumentException(file + " isn't a file");
}
return FileObject.createInstance(getPath(file));
}
public DirectoryObject getDirectoryObject(File directory) throws OutOfFileSystemException {
BugLog.getInstance().assertNotNull(directory);
if (directory.isFile()) {
throw new IllegalArgumentException(directory + " isn't a directory");
}
return DirectoryObject.createInstance(getPath(directory));
}
// Utils ==================================================================
private String getPath(File file) throws OutOfFileSystemException {
final String canonicalFilePath = getCanonicalFileName(file);
if (!canonicalFilePath.startsWith(canonicalRootDirectoryName)) {
throw new OutOfFileSystemException(canonicalFilePath, canonicalRootDirectoryName);
}
final String filePath = file.getAbsolutePath();
int beginIndex = canonicalRootDirectoryName.length();
if (filePath.length() > beginIndex) {
beginIndex++;
}
return '/' + filePath.substring(beginIndex).replace('\\', '/');
}
private static String getCanonicalFileName(File file) {
String canonicalFileName = file.getAbsolutePath();
if (canonicalFileName.endsWith(File.separator)) {
canonicalFileName = canonicalFileName.substring(0, canonicalFileName.length() - 1);
}
if (System.getProperty(OS_NAME_PARAMETER).startsWith(WINDOWS)) {
return canonicalFileName.toLowerCase();
}
return canonicalFileName;
}
}