blob: cca94ac3110a2d278ec2c8fee6a09264edbe2fed [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;
/**
* Thiz represents a relative file name relative to an root entry (normally directory).
*
* @author Thomas Singer
*/
public abstract class AbstractFileObject {
// Abstract ===============================================================
public abstract boolean isDirectory();
// Fields =================================================================
private final String path;
// Setup ==================================================================
protected AbstractFileObject(String path) {
BugLog.getInstance().assertNotNull(path);
BugLog.getInstance().assertTrue(path.startsWith("/"), "'" + path + "' must start with a /");
BugLog.getInstance().assertTrue(path.length() == 1 || !path.endsWith("/"), "'" + path + "' must end with a /");
this.path = path;
}
// Implemented ============================================================
public final String toString() {
return path;
}
public final int hashCode() {
return path.hashCode();
}
public final boolean equals(Object obj) {
if (obj == null || obj.getClass() != getClass()) {
return false;
}
final AbstractFileObject abstractFileObject = (AbstractFileObject)obj;
return path.equals(abstractFileObject.path);
}
// Accessing ==============================================================
public final String getName() {
final int lastSlashIndex = path.lastIndexOf('/');
if (lastSlashIndex < 0) {
return path;
}
return path.substring(lastSlashIndex + 1);
}
public final String getPath() {
return path;
}
public final DirectoryObject getParent() {
if (isRoot()) {
return null;
}
final int lastSlashIndex = path.lastIndexOf('/');
if (lastSlashIndex == 0) {
return DirectoryObject.getRoot();
}
return DirectoryObject.createInstance(path.substring(0, lastSlashIndex));
}
public final String getParentPath() {
if (isRoot()) {
return null;
}
final int lastSlashIndex = path.lastIndexOf('/');
if (lastSlashIndex == 0) {
return "/";
}
return path.substring(0, lastSlashIndex);
}
public final String toUnixPath() {
final String pathWithoutLeadingSlash = getPath().substring(1);
if (pathWithoutLeadingSlash.length() == 0) {
return ".";
}
return pathWithoutLeadingSlash;
}
public final boolean isRoot() {
return path.equals("/");
}
public static DirectoryObject getCommonDirectory(AbstractFileObject abstractFileObject1, AbstractFileObject abstractFileObject2) {
final String parentPath1 = getDirectory(abstractFileObject1).getPath();
final String parentPath2 = getDirectory(abstractFileObject2).getPath();
final int parentPathLength1 = parentPath1.length();
final int parentPathLength2 = parentPath2.length();
final int length = Math.min(parentPathLength1, parentPathLength2);
int lastSlashIndex = 1;
for (int i = 1; i < length; i++) {
final char chr1 = parentPath1.charAt(i);
final char chr2 = parentPath2.charAt(i);
if (chr1 != chr2) {
return DirectoryObject.createInstance(parentPath1.substring(0, lastSlashIndex));
}
if (chr1 == '/') {
lastSlashIndex = i;
}
}
if (parentPathLength1 == parentPathLength2) {
return DirectoryObject.createInstance(parentPath1);
}
if (parentPathLength1 > parentPathLength2) {
if (parentPath1.charAt(parentPathLength2) == '/') {
return DirectoryObject.createInstance(parentPath2);
}
return DirectoryObject.createInstance(parentPath1.substring(0, lastSlashIndex));
}
else {
if (parentPath2.charAt(parentPathLength1) == '/') {
return DirectoryObject.createInstance(parentPath1);
}
return DirectoryObject.createInstance(parentPath1.substring(0, lastSlashIndex));
}
}
private static DirectoryObject getDirectory(AbstractFileObject abstractFileObject) {
if (abstractFileObject.isDirectory()) {
return (DirectoryObject)abstractFileObject;
}
return abstractFileObject.getParent();
}
}