in commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/UriParser.java [497:577]
public static FileType normalisePath(final StringBuilder path) throws FileSystemException {
FileType fileType = FileType.FOLDER;
if (path.length() == 0) {
return fileType;
}
// '/' or '.' or '..' or anyPath/..' or 'anyPath/.' should always be a path
if (path.charAt(path.length() - 1) != '/'
&& path.lastIndexOf("/..") != path.length() - 3
&& path.lastIndexOf("/.") != path.length() - 2
&& path.lastIndexOf("..") != 0
&& path.lastIndexOf(".") != 0
) {
fileType = FileType.FILE;
}
// Adjust separators
// fixSeparators(path);
// Determine the start of the first element
int startFirstElem = 0;
if (path.charAt(0) == SEPARATOR_CHAR) {
if (path.length() == 1) {
return fileType;
}
startFirstElem = 1;
}
// Iterate over each element
int startElem = startFirstElem;
int maxlen = path.length();
while (startElem < maxlen) {
// Find the end of the element
int endElem = startElem;
while (endElem < maxlen && path.charAt(endElem) != SEPARATOR_CHAR) {
endElem++;
}
final int elemLen = endElem - startElem;
if (elemLen == 0) {
// An empty element - axe it
path.deleteCharAt(endElem);
maxlen = path.length();
continue;
}
if (elemLen == 1 && path.charAt(startElem) == '.') {
// A '.' element - axe it
path.deleteCharAt(startElem);
maxlen = path.length();
continue;
}
if (elemLen == 2 && path.charAt(startElem) == '.' && path.charAt(startElem + 1) == '.') {
// A '..' element - remove the previous element
if (startElem == startFirstElem) {
// Previous element is missing
throw new FileSystemException("vfs.provider/invalid-relative-path.error");
}
// Find start of previous element
int pos = startElem - 2;
while (pos >= 0 && path.charAt(pos) != SEPARATOR_CHAR) {
pos--;
}
startElem = pos + 1;
path.delete(startElem, endElem + 1);
maxlen = path.length();
continue;
}
// A regular element
startElem = endElem + 1;
}
// Remove trailing separator
if (!VFS.isUriStyle() && maxlen > 1 && path.charAt(maxlen - 1) == SEPARATOR_CHAR) {
path.deleteCharAt(maxlen - 1);
}
return fileType;
}