scolebourne 2004/11/26 17:22:06
Modified: io/src/test/org/apache/commons/io FilenameUtilsTestCase.java
io/src/java/org/apache/commons/io FilenameUtils.java
Log:
Refactor normalize method, and simplify getPrefixLength
Revision Changes Path
1.21 +204 -216
jakarta-commons/io/src/test/org/apache/commons/io/FilenameUtilsTestCase.java
Index: FilenameUtilsTestCase.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/io/src/test/org/apache/commons/io/FilenameUtilsTestCase.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- FilenameUtilsTestCase.java 23 Nov 2004 00:04:29 -0000 1.20
+++ FilenameUtilsTestCase.java 27 Nov 2004 01:22:05 -0000 1.21
@@ -38,6 +38,7 @@
*/
public class FilenameUtilsTestCase extends FileBasedTestCase {
+ private static final String SEP = "" + File.separatorChar;
private static final boolean WINDOWS = (File.separatorChar == '\\');
private File testFile1;
@@ -80,8 +81,7 @@
FileUtils.deleteDirectory(getTestDirectory());
}
- // catPath
-
+ //-----------------------------------------------------------------------
public void testCatPath() {
// TODO StringIndexOutOfBoundsException thrown if file doesn't
contain slash.
// Is this acceptable?
@@ -93,96 +93,126 @@
assertEquals("C:\\a" + File.separator + "d",
FilenameUtils.catPath("C:\\a\\b\\c", "../d"));
}
- // resolveFile
-
- public void testResolveFileDotDot() throws Exception {
- File file = FilenameUtils.resolveFile(getTestDirectory(), "..");
- assertEquals(
- "Check .. operator",
- file,
- getTestDirectory().getParentFile());
- }
-
- public void testResolveFileDot() throws Exception {
- File file = FilenameUtils.resolveFile(getTestDirectory(), ".");
- assertEquals("Check . operator", file, getTestDirectory());
- }
-
- // normalize
-
+ //-----------------------------------------------------------------------
public void testNormalize() throws Exception {
- String[] src =
- {
- null,
- "",
- "/",
- "///",
- "/foo",
- "/foo//",
- "/./",
- "/foo/./",
- "/foo/./bar",
- "/foo/../bar",
- "/foo/../bar/../baz",
- "/foo/bar/../../baz",
- "/././",
- "/foo/./../bar",
- "/foo/.././bar/",
- "//foo//./bar",
- "/../",
- "/foo/../../",
- "../foo",
- "foo/../../bar",
- "foo/../bar" };
-
- String[] dest =
- {
- null,
- "",
- "/",
- "/",
- "/foo",
- "/foo/",
- "/",
- "/foo/",
- "/foo/bar",
- "/bar",
- "/baz",
- "/baz",
- "/",
- "/bar",
- "/bar/",
- "/foo/bar",
- null,
- null,
- null,
- null,
- "bar" };
-
- assertEquals("Oops, test writer goofed", src.length, dest.length);
-
- for (int i = 0; i < src.length; i++) {
- String destStr = FilenameUtils.separatorsToSystem(dest[i]);
- String resultStr = FilenameUtils.normalize(src[i]);
- assertEquals(
- "Check if '" + src[i] + "' normalized to '" + destStr + "',
was '" + resultStr + "'",
- destStr, resultStr);
- }
- }
-
- private String replaceAll(
- String text,
- String lookFor,
- String replaceWith) {
- StringBuffer sb = new StringBuffer(text);
- while (true) {
- int idx = sb.toString().indexOf(lookFor);
- if (idx < 0) {
- break;
- }
- sb.replace(idx, idx + lookFor.length(), replaceWith);
- }
- return sb.toString();
+ assertEquals(null, FilenameUtils.normalize(null));
+ assertEquals(null, FilenameUtils.normalize(":"));
+ assertEquals(null, FilenameUtils.normalize("1:\\a\\b\\c.txt"));
+ assertEquals(null, FilenameUtils.normalize("1:"));
+ assertEquals(null, FilenameUtils.normalize("1:a"));
+ assertEquals(null, FilenameUtils.normalize("\\\\\\a\\b\\c.txt"));
+ assertEquals(null, FilenameUtils.normalize("\\\\a"));
+ assertEquals(null, FilenameUtils.normalize("~"));
+ assertEquals(null, FilenameUtils.normalize("~user"));
+
+ assertEquals("a" + SEP + "b" + SEP + "c.txt",
FilenameUtils.normalize("a\\b/c.txt"));
+ assertEquals("" + SEP + "a" + SEP + "b" + SEP + "c.txt",
FilenameUtils.normalize("\\a\\b/c.txt"));
+ assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "c.txt",
FilenameUtils.normalize("C:\\a\\b/c.txt"));
+ assertEquals("" + SEP + "" + SEP + "server" + SEP + "a" + SEP + "b"
+ SEP + "c.txt", FilenameUtils.normalize("\\\\server\\a\\b/c.txt"));
+ assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "c.txt",
FilenameUtils.normalize("~\\a\\b/c.txt"));
+ assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "c.txt",
FilenameUtils.normalize("~user\\a\\b/c.txt"));
+
+ assertEquals("a" + SEP + "c", FilenameUtils.normalize("a/b/../c"));
+ assertEquals("c", FilenameUtils.normalize("a/b/../../c"));
+ assertEquals("c", FilenameUtils.normalize("a/b/../../c/"));
+ assertEquals(null, FilenameUtils.normalize("a/b/../../../c"));
+ assertEquals("a", FilenameUtils.normalize("a/b/.."));
+ assertEquals("a", FilenameUtils.normalize("a/b/../"));
+ assertEquals("", FilenameUtils.normalize("a/b/../.."));
+ assertEquals("", FilenameUtils.normalize("a/b/../../"));
+ assertEquals(null, FilenameUtils.normalize("a/b/../../.."));
+ assertEquals("a" + SEP + "d",
FilenameUtils.normalize("a/b/../c/../d"));
+ assertEquals("a" + SEP + "d",
FilenameUtils.normalize("a/b/../c/../d/"));
+ assertEquals("a" + SEP + "b" + SEP + "d",
FilenameUtils.normalize("a/b//d"));
+ assertEquals("a" + SEP + "b", FilenameUtils.normalize("a/b/././."));
+ assertEquals("a" + SEP + "b", FilenameUtils.normalize("a/b/./././"));
+ assertEquals("a", FilenameUtils.normalize("./a/"));
+ assertEquals("a", FilenameUtils.normalize("./a"));
+ assertEquals("", FilenameUtils.normalize("./"));
+ assertEquals("", FilenameUtils.normalize("."));
+ assertEquals(null, FilenameUtils.normalize("../a"));
+ assertEquals(null, FilenameUtils.normalize(".."));
+ assertEquals("", FilenameUtils.normalize(""));
+
+ assertEquals(SEP + "a" + SEP + "c",
FilenameUtils.normalize("/a/b/../c"));
+ assertEquals(SEP + "c", FilenameUtils.normalize("/a/b/../../c"));
+ assertEquals(null, FilenameUtils.normalize("/a/b/../../../c"));
+ assertEquals(SEP + "a", FilenameUtils.normalize("/a/b/.."));
+ assertEquals(SEP + "", FilenameUtils.normalize("/a/b/../.."));
+ assertEquals(null, FilenameUtils.normalize("/a/b/../../.."));
+ assertEquals(SEP + "a" + SEP + "d",
FilenameUtils.normalize("/a/b/../c/../d"));
+ assertEquals(SEP + "a" + SEP + "b" + SEP + "d",
FilenameUtils.normalize("/a/b//d"));
+ assertEquals(SEP + "a" + SEP + "b",
FilenameUtils.normalize("/a/b/././."));
+ assertEquals(SEP + "a", FilenameUtils.normalize("/./a"));
+ assertEquals(SEP + "", FilenameUtils.normalize("/./"));
+ assertEquals(SEP + "", FilenameUtils.normalize("/."));
+ assertEquals(null, FilenameUtils.normalize("/../a"));
+ assertEquals(null, FilenameUtils.normalize("/.."));
+ assertEquals(SEP + "", FilenameUtils.normalize("/"));
+
+ assertEquals("~" + SEP + "a" + SEP + "c",
FilenameUtils.normalize("~/a/b/../c"));
+ assertEquals("~" + SEP + "c",
FilenameUtils.normalize("~/a/b/../../c"));
+ assertEquals(null, FilenameUtils.normalize("~/a/b/../../../c"));
+ assertEquals("~" + SEP + "a", FilenameUtils.normalize("~/a/b/.."));
+ assertEquals("~" + SEP + "", FilenameUtils.normalize("~/a/b/../.."));
+ assertEquals(null, FilenameUtils.normalize("~/a/b/../../.."));
+ assertEquals("~" + SEP + "a" + SEP + "d",
FilenameUtils.normalize("~/a/b/../c/../d"));
+ assertEquals("~" + SEP + "a" + SEP + "b" + SEP + "d",
FilenameUtils.normalize("~/a/b//d"));
+ assertEquals("~" + SEP + "a" + SEP + "b",
FilenameUtils.normalize("~/a/b/././."));
+ assertEquals("~" + SEP + "a", FilenameUtils.normalize("~/./a"));
+ assertEquals("~" + SEP + "", FilenameUtils.normalize("~/./"));
+ assertEquals("~" + SEP + "", FilenameUtils.normalize("~/."));
+ assertEquals(null, FilenameUtils.normalize("~/../a"));
+ assertEquals(null, FilenameUtils.normalize("~/.."));
+ assertEquals("~" + SEP + "", FilenameUtils.normalize("~/"));
+
+ assertEquals("~user" + SEP + "a" + SEP + "c",
FilenameUtils.normalize("~user/a/b/../c"));
+ assertEquals("~user" + SEP + "c",
FilenameUtils.normalize("~user/a/b/../../c"));
+ assertEquals(null, FilenameUtils.normalize("~user/a/b/../../../c"));
+ assertEquals("~user" + SEP + "a",
FilenameUtils.normalize("~user/a/b/.."));
+ assertEquals("~user" + SEP + "",
FilenameUtils.normalize("~user/a/b/../.."));
+ assertEquals(null, FilenameUtils.normalize("~user/a/b/../../.."));
+ assertEquals("~user" + SEP + "a" + SEP + "d",
FilenameUtils.normalize("~user/a/b/../c/../d"));
+ assertEquals("~user" + SEP + "a" + SEP + "b" + SEP + "d",
FilenameUtils.normalize("~user/a/b//d"));
+ assertEquals("~user" + SEP + "a" + SEP + "b",
FilenameUtils.normalize("~user/a/b/././."));
+ assertEquals("~user" + SEP + "a",
FilenameUtils.normalize("~user/./a"));
+ assertEquals("~user" + SEP + "",
FilenameUtils.normalize("~user/./"));
+ assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/."));
+ assertEquals(null, FilenameUtils.normalize("~user/../a"));
+ assertEquals(null, FilenameUtils.normalize("~user/.."));
+ assertEquals("~user" + SEP + "", FilenameUtils.normalize("~user/"));
+
+ assertEquals("C:" + SEP + "a" + SEP + "c",
FilenameUtils.normalize("C:/a/b/../c"));
+ assertEquals("C:" + SEP + "c",
FilenameUtils.normalize("C:/a/b/../../c"));
+ assertEquals(null, FilenameUtils.normalize("C:/a/b/../../../c"));
+ assertEquals("C:" + SEP + "a", FilenameUtils.normalize("C:/a/b/.."));
+ assertEquals("C:" + SEP + "",
FilenameUtils.normalize("C:/a/b/../.."));
+ assertEquals(null, FilenameUtils.normalize("C:/a/b/../../.."));
+ assertEquals("C:" + SEP + "a" + SEP + "d",
FilenameUtils.normalize("C:/a/b/../c/../d"));
+ assertEquals("C:" + SEP + "a" + SEP + "b" + SEP + "d",
FilenameUtils.normalize("C:/a/b//d"));
+ assertEquals("C:" + SEP + "a" + SEP + "b",
FilenameUtils.normalize("C:/a/b/././."));
+ assertEquals("C:" + SEP + "a", FilenameUtils.normalize("C:/./a"));
+ assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/./"));
+ assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/."));
+ assertEquals(null, FilenameUtils.normalize("C:/../a"));
+ assertEquals(null, FilenameUtils.normalize("C:/.."));
+ assertEquals("C:" + SEP + "", FilenameUtils.normalize("C:/"));
+
+ assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "c",
FilenameUtils.normalize("//server/a/b/../c"));
+ assertEquals(SEP + SEP + "server" + SEP + "c",
FilenameUtils.normalize("//server/a/b/../../c"));
+ assertEquals(null,
FilenameUtils.normalize("//server/a/b/../../../c"));
+ assertEquals(SEP + SEP + "server" + SEP + "a",
FilenameUtils.normalize("//server/a/b/.."));
+ assertEquals(SEP + SEP + "server" + SEP + "",
FilenameUtils.normalize("//server/a/b/../.."));
+ assertEquals(null, FilenameUtils.normalize("//server/a/b/../../.."));
+ assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "d",
FilenameUtils.normalize("//server/a/b/../c/../d"));
+ assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b" + SEP +
"d", FilenameUtils.normalize("//server/a/b//d"));
+ assertEquals(SEP + SEP + "server" + SEP + "a" + SEP + "b",
FilenameUtils.normalize("//server/a/b/././."));
+ assertEquals(SEP + SEP + "server" + SEP + "a",
FilenameUtils.normalize("//server/./a"));
+ assertEquals(SEP + SEP + "server" + SEP + "",
FilenameUtils.normalize("//server/./"));
+ assertEquals(SEP + SEP + "server" + SEP + "",
FilenameUtils.normalize("//server/."));
+ assertEquals(null, FilenameUtils.normalize("//server/../a"));
+ assertEquals(null, FilenameUtils.normalize("//server/.."));
+ assertEquals(SEP + SEP + "server" + SEP + "",
FilenameUtils.normalize("//server/"));
}
//-----------------------------------------------------------------------
@@ -225,42 +255,31 @@
//-----------------------------------------------------------------------
public void testGetPrefixLength() {
assertEquals(-1, FilenameUtils.getPrefixLength(null));
- if (WINDOWS) {
- assertEquals(-1,
FilenameUtils.getPrefixLength("1:\\a\\b\\c.txt"));
- assertEquals(-1, FilenameUtils.getPrefixLength("1:"));
- assertEquals(-1, FilenameUtils.getPrefixLength("1:a"));
- assertEquals(-1,
FilenameUtils.getPrefixLength("\\\\\\a\\b\\c.txt"));
- assertEquals(-1, FilenameUtils.getPrefixLength("\\\\a"));
-
- assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt"));
- assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt"));
- assertEquals(3,
FilenameUtils.getPrefixLength("C:\\a\\b\\c.txt"));
- assertEquals(9,
FilenameUtils.getPrefixLength("\\\\server\\a\\b\\c.txt"));
-
- assertEquals(0, FilenameUtils.getPrefixLength("a/b/c.txt"));
- assertEquals(1, FilenameUtils.getPrefixLength("/a/b/c.txt"));
- assertEquals(3, FilenameUtils.getPrefixLength("C:/a/b/c.txt"));
- assertEquals(9,
FilenameUtils.getPrefixLength("//server/a/b/c.txt"));
-
- assertEquals(0, FilenameUtils.getPrefixLength("~/a/b/c.txt"));
- assertEquals(0,
FilenameUtils.getPrefixLength("~user/a/b/c.txt"));
- } else {
- assertEquals(-1, FilenameUtils.getPrefixLength("~"));
- assertEquals(-1, FilenameUtils.getPrefixLength("~user"));
-
- assertEquals(0, FilenameUtils.getPrefixLength("a/b/c.txt"));
- assertEquals(1, FilenameUtils.getPrefixLength("/a/b/c.txt"));
- assertEquals(2, FilenameUtils.getPrefixLength("~/a/b/c.txt"));
- assertEquals(6,
FilenameUtils.getPrefixLength("~user/a/b/c.txt"));
-
- assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt"));
- assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt"));
- assertEquals(2, FilenameUtils.getPrefixLength("~\\a\\b\\c.txt"));
- assertEquals(6,
FilenameUtils.getPrefixLength("~user\\a\\b\\c.txt"));
-
- assertEquals(0,
FilenameUtils.getPrefixLength("C:\\a\\b\\c.txt"));
- assertEquals(1,
FilenameUtils.getPrefixLength("\\\\server\\a\\b\\c.txt"));
- }
+ assertEquals(-1, FilenameUtils.getPrefixLength(":"));
+ assertEquals(-1, FilenameUtils.getPrefixLength("1:\\a\\b\\c.txt"));
+ assertEquals(-1, FilenameUtils.getPrefixLength("1:"));
+ assertEquals(-1, FilenameUtils.getPrefixLength("1:a"));
+ assertEquals(-1, FilenameUtils.getPrefixLength("\\\\\\a\\b\\c.txt"));
+ assertEquals(-1, FilenameUtils.getPrefixLength("\\\\a"));
+ assertEquals(-1, FilenameUtils.getPrefixLength("~"));
+ assertEquals(-1, FilenameUtils.getPrefixLength("~user"));
+
+ assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt"));
+ assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt"));
+ assertEquals(3, FilenameUtils.getPrefixLength("C:\\a\\b\\c.txt"));
+ assertEquals(9,
FilenameUtils.getPrefixLength("\\\\server\\a\\b\\c.txt"));
+
+ assertEquals(0, FilenameUtils.getPrefixLength("a/b/c.txt"));
+ assertEquals(1, FilenameUtils.getPrefixLength("/a/b/c.txt"));
+ assertEquals(3, FilenameUtils.getPrefixLength("C:/a/b/c.txt"));
+ assertEquals(9, FilenameUtils.getPrefixLength("//server/a/b/c.txt"));
+ assertEquals(2, FilenameUtils.getPrefixLength("~/a/b/c.txt"));
+ assertEquals(6, FilenameUtils.getPrefixLength("~user/a/b/c.txt"));
+
+ assertEquals(0, FilenameUtils.getPrefixLength("a\\b\\c.txt"));
+ assertEquals(1, FilenameUtils.getPrefixLength("\\a\\b\\c.txt"));
+ assertEquals(2, FilenameUtils.getPrefixLength("~\\a\\b\\c.txt"));
+ assertEquals(6, FilenameUtils.getPrefixLength("~user\\a\\b\\c.txt"));
}
public void testIndexOfLastSeparator() {
@@ -284,42 +303,31 @@
//-----------------------------------------------------------------------
public void testGetPrefix() {
assertEquals(null, FilenameUtils.getPrefix(null));
- if (WINDOWS) {
- assertEquals(null, FilenameUtils.getPrefix("1:\\a\\b\\c.txt"));
- assertEquals(null, FilenameUtils.getPrefix("1:"));
- assertEquals(null, FilenameUtils.getPrefix("1:a"));
- assertEquals(null, FilenameUtils.getPrefix("\\\\\\a\\b\\c.txt"));
- assertEquals(null, FilenameUtils.getPrefix("\\\\a"));
-
- assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt"));
- assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt"));
- assertEquals("C:\\", FilenameUtils.getPrefix("C:\\a\\b\\c.txt"));
- assertEquals("\\\\server\\",
FilenameUtils.getPrefix("\\\\server\\a\\b\\c.txt"));
-
- assertEquals("", FilenameUtils.getPrefix("a/b/c.txt"));
- assertEquals("/", FilenameUtils.getPrefix("/a/b/c.txt"));
- assertEquals("C:/", FilenameUtils.getPrefix("C:/a/b/c.txt"));
- assertEquals("//server/",
FilenameUtils.getPrefix("//server/a/b/c.txt"));
-
- assertEquals("", FilenameUtils.getPrefix("~/a/b/c.txt"));
- assertEquals("", FilenameUtils.getPrefix("~user/a/b/c.txt"));
- } else {
- assertEquals(null, FilenameUtils.getPrefix("~"));
- assertEquals(null, FilenameUtils.getPrefix("~user"));
-
- assertEquals("", FilenameUtils.getPrefix("a/b/c.txt"));
- assertEquals("/", FilenameUtils.getPrefix("/a/b/c.txt"));
- assertEquals("~/", FilenameUtils.getPrefix("~/a/b/c.txt"));
- assertEquals("~user/",
FilenameUtils.getPrefix("~user/a/b/c.txt"));
-
- assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt"));
- assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt"));
- assertEquals("~\\", FilenameUtils.getPrefix("~\\a\\b\\c.txt"));
- assertEquals("~user\\",
FilenameUtils.getPrefix("~user\\a\\b\\c.txt"));
-
- assertEquals("", FilenameUtils.getPrefix("C:\\a\\b\\c.txt"));
- assertEquals("\\",
FilenameUtils.getPrefix("\\\\server\\a\\b\\c.txt"));
- }
+ assertEquals(null, FilenameUtils.getPrefix(":"));
+ assertEquals(null, FilenameUtils.getPrefix("1:\\a\\b\\c.txt"));
+ assertEquals(null, FilenameUtils.getPrefix("1:"));
+ assertEquals(null, FilenameUtils.getPrefix("1:a"));
+ assertEquals(null, FilenameUtils.getPrefix("\\\\\\a\\b\\c.txt"));
+ assertEquals(null, FilenameUtils.getPrefix("\\\\a"));
+ assertEquals(null, FilenameUtils.getPrefix("~"));
+ assertEquals(null, FilenameUtils.getPrefix("~user"));
+
+ assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt"));
+ assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt"));
+ assertEquals("C:\\", FilenameUtils.getPrefix("C:\\a\\b\\c.txt"));
+ assertEquals("\\\\server\\",
FilenameUtils.getPrefix("\\\\server\\a\\b\\c.txt"));
+
+ assertEquals("", FilenameUtils.getPrefix("a/b/c.txt"));
+ assertEquals("/", FilenameUtils.getPrefix("/a/b/c.txt"));
+ assertEquals("C:/", FilenameUtils.getPrefix("C:/a/b/c.txt"));
+ assertEquals("//server/",
FilenameUtils.getPrefix("//server/a/b/c.txt"));
+ assertEquals("~/", FilenameUtils.getPrefix("~/a/b/c.txt"));
+ assertEquals("~user/", FilenameUtils.getPrefix("~user/a/b/c.txt"));
+
+ assertEquals("", FilenameUtils.getPrefix("a\\b\\c.txt"));
+ assertEquals("\\", FilenameUtils.getPrefix("\\a\\b\\c.txt"));
+ assertEquals("~\\", FilenameUtils.getPrefix("~\\a\\b\\c.txt"));
+ assertEquals("~user\\",
FilenameUtils.getPrefix("~user\\a\\b\\c.txt"));
}
public void testGetPath() {
@@ -329,32 +337,22 @@
assertEquals("a/b", FilenameUtils.getPath("a/b/c"));
assertEquals("a/b/c", FilenameUtils.getPath("a/b/c/"));
assertEquals("a\\b", FilenameUtils.getPath("a\\b\\c"));
- if (WINDOWS) {
- assertEquals(null, FilenameUtils.getPath("1:/a/b/c.txt"));
- assertEquals(null, FilenameUtils.getPath("1:"));
- assertEquals(null, FilenameUtils.getPath("1:a"));
- assertEquals(null, FilenameUtils.getPath("///a/b/c.txt"));
- assertEquals(null, FilenameUtils.getPath("//a"));
-
- assertEquals("a/b", FilenameUtils.getPath("a/b/c.txt"));
- assertEquals("a/b", FilenameUtils.getPath("/a/b/c.txt"));
- assertEquals("a/b", FilenameUtils.getPath("C:/a/b/c.txt"));
- assertEquals("a/b", FilenameUtils.getPath("//server/a/b/c.txt"));
-
- assertEquals("~/a/b", FilenameUtils.getPath("~/a/b/c.txt"));
- assertEquals("~user/a/b",
FilenameUtils.getPath("~user/a/b/c.txt"));
- } else {
- assertEquals(null, FilenameUtils.getPath("~"));
- assertEquals(null, FilenameUtils.getPath("~user"));
-
- assertEquals("a/b", FilenameUtils.getPath("a/b/c.txt"));
- assertEquals("a/b", FilenameUtils.getPath("/a/b/c.txt"));
- assertEquals("a/b", FilenameUtils.getPath("~/a/b/c.txt"));
- assertEquals("a/b", FilenameUtils.getPath("~user/a/b/c.txt"));
-
- assertEquals("C:/a/b", FilenameUtils.getPath("C:/a/b/c.txt"));
- assertEquals("/server/a/b",
FilenameUtils.getPath("//server/a/b/c.txt"));
- }
+
+ assertEquals(null, FilenameUtils.getPath(":"));
+ assertEquals(null, FilenameUtils.getPath("1:/a/b/c.txt"));
+ assertEquals(null, FilenameUtils.getPath("1:"));
+ assertEquals(null, FilenameUtils.getPath("1:a"));
+ assertEquals(null, FilenameUtils.getPath("///a/b/c.txt"));
+ assertEquals(null, FilenameUtils.getPath("//a"));
+ assertEquals(null, FilenameUtils.getPath("~"));
+ assertEquals(null, FilenameUtils.getPath("~user"));
+
+ assertEquals("a/b", FilenameUtils.getPath("a/b/c.txt"));
+ assertEquals("a/b", FilenameUtils.getPath("/a/b/c.txt"));
+ assertEquals("a/b", FilenameUtils.getPath("C:/a/b/c.txt"));
+ assertEquals("a/b", FilenameUtils.getPath("//server/a/b/c.txt"));
+ assertEquals("a/b", FilenameUtils.getPath("~/a/b/c.txt"));
+ assertEquals("a/b", FilenameUtils.getPath("~user/a/b/c.txt"));
}
public void testGetFullPath() {
@@ -364,32 +362,22 @@
assertEquals("a/b", FilenameUtils.getFullPath("a/b/c"));
assertEquals("a/b/c", FilenameUtils.getFullPath("a/b/c/"));
assertEquals("a\\b", FilenameUtils.getFullPath("a\\b\\c"));
- if (WINDOWS) {
- assertEquals(null, FilenameUtils.getFullPath("1:/a/b/c.txt"));
- assertEquals(null, FilenameUtils.getFullPath("1:"));
- assertEquals(null, FilenameUtils.getFullPath("1:a"));
- assertEquals(null, FilenameUtils.getFullPath("///a/b/c.txt"));
- assertEquals(null, FilenameUtils.getFullPath("//a"));
-
- assertEquals("a/b", FilenameUtils.getFullPath("a/b/c.txt"));
- assertEquals("/a/b", FilenameUtils.getFullPath("/a/b/c.txt"));
- assertEquals("C:/a/b",
FilenameUtils.getFullPath("C:/a/b/c.txt"));
- assertEquals("//server/a/b",
FilenameUtils.getFullPath("//server/a/b/c.txt"));
-
- assertEquals("~/a/b", FilenameUtils.getFullPath("~/a/b/c.txt"));
- assertEquals("~user/a/b",
FilenameUtils.getFullPath("~user/a/b/c.txt"));
- } else {
- assertEquals(null, FilenameUtils.getFullPath("~"));
- assertEquals(null, FilenameUtils.getFullPath("~user"));
-
- assertEquals("a/b", FilenameUtils.getFullPath("a/b/c.txt"));
- assertEquals("/a/b", FilenameUtils.getFullPath("/a/b/c.txt"));
- assertEquals("~/a/b", FilenameUtils.getFullPath("~/a/b/c.txt"));
- assertEquals("~user/a/b",
FilenameUtils.getFullPath("~user/a/b/c.txt"));
-
- assertEquals("C:/a/b",
FilenameUtils.getFullPath("C:/a/b/c.txt"));
- assertEquals("//server/a/b",
FilenameUtils.getFullPath("//server/a/b/c.txt"));
- }
+
+ assertEquals(null, FilenameUtils.getFullPath(":"));
+ assertEquals(null, FilenameUtils.getFullPath("1:/a/b/c.txt"));
+ assertEquals(null, FilenameUtils.getFullPath("1:"));
+ assertEquals(null, FilenameUtils.getFullPath("1:a"));
+ assertEquals(null, FilenameUtils.getFullPath("///a/b/c.txt"));
+ assertEquals(null, FilenameUtils.getFullPath("//a"));
+ assertEquals(null, FilenameUtils.getFullPath("~"));
+ assertEquals(null, FilenameUtils.getFullPath("~user"));
+
+ assertEquals("a/b", FilenameUtils.getFullPath("a/b/c.txt"));
+ assertEquals("/a/b", FilenameUtils.getFullPath("/a/b/c.txt"));
+ assertEquals("C:/a/b", FilenameUtils.getFullPath("C:/a/b/c.txt"));
+ assertEquals("//server/a/b",
FilenameUtils.getFullPath("//server/a/b/c.txt"));
+ assertEquals("~/a/b", FilenameUtils.getFullPath("~/a/b/c.txt"));
+ assertEquals("~user/a/b",
FilenameUtils.getFullPath("~user/a/b/c.txt"));
}
public void testGetName() {
1.29 +87 -142
jakarta-commons/io/src/java/org/apache/commons/io/FilenameUtils.java
Index: FilenameUtils.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/io/src/java/org/apache/commons/io/FilenameUtils.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- FilenameUtils.java 26 Nov 2004 19:18:28 -0000 1.28
+++ FilenameUtils.java 27 Nov 2004 01:22:05 -0000 1.29
@@ -16,9 +16,8 @@
package org.apache.commons.io;
import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
import java.util.ArrayList;
+import java.util.Collection;
/**
* Utility class that provides methods to manipulate filenames and filepaths.
@@ -112,22 +111,29 @@
* The input may contain separators in either Unix or Windows format.
* The output will contain separators in the format of the system.
* <p>
- * A double slash will be merged to a single slash (thus UNC names are
not handled).
- * A single dot path segment will be removed with no other effect.
+ * A trailing slash will be removed.
+ * A double slash will be merged to a single slash (but UNC names are
handled).
+ * A single dot path segment will be removed.
* A double dot will cause that path segment and the one before to be
removed.
* If the double dot has no parent path segment to work with,
<code>null</code>
* is returned.
* <pre>
- * /foo// --> /foo/
- * /foo/./ --> /foo/
- * /foo/../bar --> /bar
- * /foo/../bar/ --> /bar/
- * /foo/../bar/../baz --> /baz
- * //foo//./bar --> /foo/bar
- * /../ --> null
- * ../foo --> null
- * foo/../../bar --> null
- * foo/../bar --> bar
+ * /foo// --> /foo
+ * /foo/./ --> /foo
+ * /foo/../bar --> /bar
+ * /foo/../bar/ --> /bar
+ * /foo/../bar/../baz --> /baz
+ * //foo//./bar --> /foo/bar
+ * /../ --> null
+ * ../foo --> null
+ * foo/../../bar --> null
+ * foo/../bar --> bar
+ * //server/foo/../bar --> //server/bar
+ * //server/../bar --> null
+ * C:\foo\..\bar --> C:\bar
+ * C:\..\bar --> null
+ * ~/foo/../bar --> ~/bar
+ * ~/../bar --> null
* </pre>
*
* @param filename the filename to normalize, null returns null
@@ -137,23 +143,30 @@
if (filename == null) {
return null;
}
- char[] array = filename.toCharArray();
+ int size = filename.length();
+ if (size == 0) {
+ return filename;
+ }
int prefix = getPrefixLength(filename);
if (prefix < 0) {
return null;
}
- // TODO: Use prefix
+ char[] array = new char[size + 2]; // +1 for possible extra slash,
+2 for arraycopy
+ filename.getChars(0, filename.length(), array, 0);
- int size = array.length;
- // fix separators
+ // fix separators throughout
for (int i = 0; i < array.length; i++) {
if (array[i] == OTHER_SEPARATOR) {
array[i] = SYSTEM_SEPARATOR;
}
}
+ if (isSeparator(array[size - 1]) == false) {
+ array[size++] = SYSTEM_SEPARATOR;
+ }
+
// adjoining slashes
- for (int i = 1; i < size; i++) {
+ for (int i = prefix + 1; i < size; i++) {
if (array[i] == SYSTEM_SEPARATOR && array[i - 1] ==
SYSTEM_SEPARATOR) {
System.arraycopy(array, i, array, i - 1, size - i);
size--;
@@ -161,38 +174,44 @@
}
}
// dot slash
- for (int i = 2; i < size; i++) {
+ for (int i = prefix + 1; i < size; i++) {
if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == '.' &&
- array[i - 2] == SYSTEM_SEPARATOR) {
- System.arraycopy(array, i, array, i - 2, size - i);
+ (i == prefix + 1 || array[i - 2] == SYSTEM_SEPARATOR)) {
+ System.arraycopy(array, i + 1, array, i - 1, size - i);
size -=2;
i--;
}
}
// double dot slash
outer:
- for (int i = 2; i < size; i++) {
- if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == '.' &&
- array[i - 2] == '.' && (i == 2 || array[i - 3] ==
SYSTEM_SEPARATOR)) {
- if (i == 2) {
+ for (int i = prefix + 2; i < size; i++) {
+ if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == '.' &&
array[i - 2] == '.' &&
+ (i == prefix + 2 || array[i - 3] == SYSTEM_SEPARATOR)) {
+ if (i == prefix + 2) {
return null;
}
int j;
- for (j = i - 4 ; j >= 0; j--) {
+ for (j = i - 4 ; j >= prefix; j--) {
if (array[j] == SYSTEM_SEPARATOR) {
- System.arraycopy(array, i, array, j, size - i);
+ System.arraycopy(array, i + 1, array, j + 1, size -
i);
size -= (i - j);
i = j + 1;
continue outer;
}
}
- System.arraycopy(array, i + 1, array, 0, size - i - 1);
- size -= (i + 1);
- i = 1;
+ System.arraycopy(array, i + 1, array, prefix, size - i);
+ size -= (i + 1 - prefix);
+ i = prefix + 1;
}
}
- return new String(array, 0, size);
+ if (size <= 0) { // should never be less than 0
+ return "";
+ }
+ if (size <= prefix) { // should never be less than prefix
+ return new String(array, 0, size);
+ }
+ return new String(array, 0, size - 1);
}
/**
@@ -241,79 +260,6 @@
append(File.separator).append(pth).toString();
}
- /**
- * Resolve a file <code>filename</code> to it's canonical form. If
- * <code>filename</code> is relative (doesn't start with <code>/</code>),
- * it will be resolved relative to <code>baseFile</code>, otherwise it is
- * treated as a normal root-relative path.
- *
- * @param baseFile Where to resolve <code>filename</code> from, if
- * <code>filename</code> is relative.
- * @param filename Absolute or relative file path to resolve.
- * @return The canonical <code>File</code> of <code>filename</code>.
- */
- // KILL? Decide whether this is worth keeping?
- public static File resolveFile(File baseFile, String filename) {
- String filenm = filename;
- if ('/' != File.separatorChar) {
- filenm = filename.replace('/', File.separatorChar);
- }
-
- if ('\\' != File.separatorChar) {
- filenm = filename.replace('\\', File.separatorChar);
- }
-
- // deal with absolute files
- if (filenm.startsWith(File.separator)) {
- File file = new File(filenm);
-
- try {
- file = file.getCanonicalFile();
- } catch (IOException ioe) {
- // ignore
- }
-
- return file;
- }
- // FIXME: I'm almost certain this // removal is unnecessary, as
- // getAbsoluteFile() strips
- // them. However, I'm not sure about this UNC stuff. (JT)
- char[] chars = filename.toCharArray();
- StringBuffer sb = new StringBuffer();
-
- //remove duplicate file separators in succession - except
- //on win32 at start of filename as UNC filenames can
- //be \\AComputer\AShare\myfile.txt
- int start = 0;
- if ('\\' == File.separatorChar) {
- sb.append(filenm.charAt(0));
- start++;
- }
-
- for (int i = start; i < chars.length; i++) {
- boolean doubleSeparator =
- File.separatorChar == chars[i]
- && File.separatorChar == chars[i - 1];
-
- if (!doubleSeparator) {
- sb.append(chars[i]);
- }
- }
-
- filenm = sb.toString();
-
- //must be relative
- File file = (new File(baseFile, filenm)).getAbsoluteFile();
-
- try {
- file = file.getCanonicalFile();
- } catch ( IOException ioe) {
- ;
- }
-
- return file;
- }
-
//-----------------------------------------------------------------------
/**
* Converts all separators to the Unix separator of forward slash.
@@ -377,6 +323,8 @@
* ~/a/b/c.txt --> "~/" --> current user relative
* ~user/a/b/c.txt --> "~user/" --> named user relative
* </pre>
+ * Both sets of prefixes will be matched regardless of the system
+ * on which the code runs.
*
* @param filename the filename to find the prefix in, null returns -1
* @return the length of the prefix, -1 if invalid or null
@@ -389,37 +337,14 @@
if (len == 0) {
return 0;
}
- if (SYSTEM_SEPARATOR == WINDOWS_SEPARATOR) {
- char ch0 = filename.charAt(0);
- if (len == 1) {
- return (isSeparator(ch0) ? 1 : 0);
- } else {
- char ch1 = filename.charAt(1);
- if (ch1 == ':') {
- ch0 = Character.toUpperCase(ch0);
- if (ch0 < 'A' || ch0 > 'Z' || len == 2 ||
isSeparator(filename.charAt(2)) == false) {
- return -1;
- }
- return 3;
- } else if (isSeparator(ch0) && isSeparator(ch1)) {
- int posUnix = filename.indexOf(UNIX_SEPARATOR, 2);
- int posWin = filename.indexOf(WINDOWS_SEPARATOR, 2);
- if ((posUnix == -1 && posWin == -1) || posUnix == 2 ||
posWin == 2) {
- return -1;
- }
- posUnix = (posUnix == -1 ? posWin : posUnix);
- posWin = (posWin == -1 ? posUnix : posWin);
- return Math.min(posUnix, posWin) + 1;
- } else {
- return (isSeparator(ch0) ? 1 : 0);
- }
+ char ch0 = filename.charAt(0);
+ if (len == 1) {
+ if (ch0 == '~' || ch0 == ':') {
+ return -1;
}
+ return (isSeparator(ch0) ? 1 : 0);
} else {
- char ch0 = filename.charAt(0);
if (ch0 == '~') {
- if (len == 1) {
- return -1;
- }
int posUnix = filename.indexOf(UNIX_SEPARATOR, 1);
int posWin = filename.indexOf(WINDOWS_SEPARATOR, 1);
if (posUnix == -1 && posWin == -1) {
@@ -428,6 +353,24 @@
posUnix = (posUnix == -1 ? posWin : posUnix);
posWin = (posWin == -1 ? posUnix : posWin);
return Math.min(posUnix, posWin) + 1;
+ }
+ char ch1 = filename.charAt(1);
+ if (ch1 == ':') {
+ ch0 = Character.toUpperCase(ch0);
+ if (ch0 < 'A' || ch0 > 'Z' || len == 2 ||
isSeparator(filename.charAt(2)) == false) {
+ return -1;
+ }
+ return 3;
+
+ } else if (isSeparator(ch0) && isSeparator(ch1)) {
+ int posUnix = filename.indexOf(UNIX_SEPARATOR, 2);
+ int posWin = filename.indexOf(WINDOWS_SEPARATOR, 2);
+ if ((posUnix == -1 && posWin == -1) || posUnix == 2 ||
posWin == 2) {
+ return -1;
+ }
+ posUnix = (posUnix == -1 ? posWin : posUnix);
+ posWin = (posWin == -1 ? posUnix : posWin);
+ return Math.min(posUnix, posWin) + 1;
} else {
return (isSeparator(ch0) ? 1 : 0);
}
@@ -513,10 +456,11 @@
* This method will handle a file in either Unix or Windows format.
* The text before the last forward or backslash is returned.
* <pre>
- * ~/a/b/c.txt --> a/b
- * a.txt --> ""
- * a/b/c --> a/b
- * a/b/c/ --> a/b/c
+ * C:\a\b\c.txt --> a\b
+ * ~/a/b/c.txt --> a/b
+ * a.txt --> ""
+ * a/b/c --> a/b
+ * a/b/c/ --> a/b/c
* </pre>
*
* @param filename the filename to query, null returns null
@@ -544,10 +488,11 @@
* This method will handle a file in either Unix or Windows format.
* The text before the last forward or backslash is returned.
* <pre>
- * ~/a/b/c.txt --> ~/a/b
- * a.txt --> ""
- * a/b/c --> a/b
- * a/b/c/ --> a/b/c
+ * C:\a\b\c.txt --> C:\a\b
+ * ~/a/b/c.txt --> ~/a/b
+ * a.txt --> ""
+ * a/b/c --> a/b
+ * a/b/c/ --> a/b/c
* </pre>
*
* @param filename the filename to query, null returns null
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]