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]