diff --git a/WHATSNEW b/WHATSNEW index 155382501..c7dfce9da 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -18,8 +18,15 @@ Changes that could break older environments: * The Reference class now has a project field that will get used (if set) in preference to the passed in project, when - dereferencing the reference. - Bugzilla Report 25777. + dereferencing the reference. Bugzilla Report 25777. + +* On DOS and Netware, filenames beginning with a drive letter + and followed by a colon but with no directory separator following + the colon are no longer (incorrectly) accepted as absolute pathnames + by FileUtils.normalize() and FileUtils.isAbsolutePath(). Netware + volumes can still be specified without an intervening separator. + UNC pathnames on Windows must include a server and share name, i.e. + "\\a\b" to be considered valid absolute paths. Fixed bugs: ----------- @@ -47,6 +54,9 @@ Fixed bugs: * Create signjar's helper ExecTask instance directly rather than by typedef discovery mechanisms. Bugzilla report 33433. +* FileUtils.resolveFile() promised to return absolute files but + did not always do so. + Other changes: -------------- diff --git a/src/main/org/apache/tools/ant/util/FileUtils.java b/src/main/org/apache/tools/ant/util/FileUtils.java index b47a4efd6..01d3f24ae 100644 --- a/src/main/org/apache/tools/ant/util/FileUtils.java +++ b/src/main/org/apache/tools/ant/util/FileUtils.java @@ -664,71 +664,99 @@ public class FileUtils { /** * Interpret the filename as a file relative to the given file * unless the filename already represents an absolute filename. + * Differs from new File(file, filename) in that + * the resulting File's path will always be a normalized, + * absolute pathname. Also, if it is determined that + * filename is context-relative, file + * will be discarded and the reference will be resolved using + * available context/state information about the filesystem. * * @param file the "reference" file for relative paths. This * instance must be an absolute file and must not contain * "./" or "../" sequences (same for \ instead * of /). If it is null, this call is equivalent to - * new java.io.File(filename). + * new java.io.File(filename).getAbsoluteFile(). * * @param filename a file name. * - * @return an absolute file that doesn't contain "./" or - * "../" sequences and uses the correct separator for - * the current platform. + * @return an absolute file. + * @throws java.lang.NullPointerException if filename is null. */ public File resolveFile(File file, String filename) { - filename = filename.replace('/', File.separatorChar) - .replace('\\', File.separatorChar); - - // deal with absolute files - if (isAbsolutePath(filename)) { - return normalize(filename); - } - if (file == null) { - return new File(filename); - } - File helpFile = new File(file.getAbsolutePath()); - StringTokenizer tok = new StringTokenizer(filename, File.separator); - while (tok.hasMoreTokens()) { - String part = tok.nextToken(); - if (part.equals("..")) { - helpFile = helpFile.getParentFile(); - if (helpFile == null) { - String msg = "The file or path you specified (" - + filename + ") is invalid relative to " - + file.getPath(); - throw new BuildException(msg); + if (!isAbsolutePath(filename)) { + char sep = File.separatorChar; + filename = filename.replace('/', sep).replace('\\', sep); + if (isContextRelativePath(filename)) { + file = null; + // on cygwin, our current directory can be a UNC; + // assume user.dir is absolute or all hell breaks loose... + String udir = System.getProperty("user.dir"); + if (filename.charAt(0) == sep && udir.charAt(0) == sep) { + filename = dissect(udir)[0] + filename.substring(1); } - } else if (part.equals(".")) { - // Do nothing here - } else { - helpFile = new File(helpFile, part); } + filename = new File(file, filename).getAbsolutePath(); } - return new File(helpFile.getAbsolutePath()); + return normalize(filename); + } + + /** + * On DOS and NetWare, the evaluation of certain file + * specifications is context-dependent. These are filenames + * beginning with a single separator (relative to current root directory) + * and filenames with a drive specification and no intervening separator + * (relative to current directory of the specified root). + * @param filename the filename to evaluate. + * @return true if the filename is relative to system context. + * @throws java.lang.NullPointerException if filename is null. + * @since Ant 1.7 + */ + public static boolean isContextRelativePath(String filename) { + if (!(onDos || onNetWare) || filename.length() == 0) { + return false; + } + char sep = File.separatorChar; + filename = filename.replace('/', sep).replace('\\', sep); + char c = filename.charAt(0); + int len = filename.length(); + return (c == sep && (len == 1 || filename.charAt(1) != sep)) + || (Character.isLetter(c) && len > 1 + && filename.indexOf(':') == 1 + && (len == 2 || filename.charAt(2) != sep)); } /** * Verifies that the specified filename represents an absolute path. + * Differs from new java.io.File("filename").isAbsolute() in that a path + * beginning with a double file separator--signifying a Windows UNC--must + * at minimum match "\\a\b" to be considered an absolute path. * @param filename the filename to be checked. * @return true if the filename represents an absolute path. + * @throws java.lang.NullPointerException if filename is null. + * @since Ant 1.6.3 */ public static boolean isAbsolutePath(String filename) { - if (filename.startsWith(File.separator)) { - // common for all os - return true; + int len = filename.length(); + if (len == 0) { + return false; } - if (onDos && filename.length() >= 2 - && Character.isLetter(filename.charAt(0)) - && filename.charAt(1) == ':') { - // Actually on windows the : must be followed by a \ for - // the path to be absolute, else the path is relative - // to the current working directory on that drive. - // (Every drive may have another current working directory) - return true; + char sep = File.separatorChar; + filename = filename.replace('/', sep).replace('\\', sep); + char c = filename.charAt(0); + if (!(onDos || onNetWare)) { + return (c == sep); } - return (onNetWare && filename.indexOf(":") > -1); + if (c == sep) { + if (!(onDos && len > 4 && filename.charAt(1) == sep)) { + return false; + } + int nextsep = filename.indexOf(sep, 2); + return nextsep > 2 && nextsep + 1 < len; + } + int colon = filename.indexOf(':'); + return (Character.isLetter(c) && colon == 1 + && filename.length() > 2 && filename.charAt(2) == sep) + || (onNetWare && colon > 0); } /** @@ -748,78 +776,23 @@ public class FileUtils { * @param path the path to be normalized. * @return the normalized version of the path. * - * @throws java.lang.NullPointerException if the file path is - * equal to null. + * @throws java.lang.NullPointerException if path is null. */ - public File normalize(String path) { - String orig = path; - - path = path.replace('/', File.separatorChar) - .replace('\\', File.separatorChar); - - // make sure we are dealing with an absolute path - int colon = path.indexOf(":"); - - if (!isAbsolutePath(path)) { - String msg = path + " is not an absolute path"; - throw new BuildException(msg); - } - boolean dosWithDrive = false; - String root = null; - // Eliminate consecutive slashes after the drive spec - if ((onDos && path.length() >= 2 - && Character.isLetter(path.charAt(0)) - && path.charAt(1) == ':') - || (onNetWare && colon > -1)) { - - dosWithDrive = true; - - char[] ca = path.replace('/', '\\').toCharArray(); - StringBuffer sbRoot = new StringBuffer(); - for (int i = 0; i < colon; i++) { - sbRoot.append(Character.toUpperCase(ca[i])); - } - sbRoot.append(':'); - if (colon + 1 < path.length()) { - sbRoot.append(File.separatorChar); - } - root = sbRoot.toString(); - - // Eliminate consecutive slashes after the drive spec - StringBuffer sbPath = new StringBuffer(); - for (int i = colon + 1; i < ca.length; i++) { - if ((ca[i] != '\\') - || (ca[i] == '\\' && ca[i - 1] != '\\')) { - sbPath.append(ca[i]); - } - } - path = sbPath.toString().replace('\\', File.separatorChar); - } else { - if (path.length() == 1) { - root = File.separator; - path = ""; - } else if (path.charAt(1) == File.separatorChar) { - // UNC drive - root = File.separator + File.separator; - path = path.substring(2); - } else { - root = File.separator; - path = path.substring(1); - } - } + public File normalize(final String path) { Stack s = new Stack(); - s.push(root); - StringTokenizer tok = new StringTokenizer(path, File.separator); + String[] dissect = dissect(path); + s.push(dissect[0]); + + StringTokenizer tok = new StringTokenizer(dissect[1], File.separator); while (tok.hasMoreTokens()) { String thisToken = tok.nextToken(); if (".".equals(thisToken)) { continue; } else if ("..".equals(thisToken)) { if (s.size() < 2) { - throw new BuildException("Cannot resolve path " + orig); - } else { - s.pop(); + throw new BuildException("Cannot resolve path " + path); } + s.pop(); } else { // plain component s.push(thisToken); } @@ -833,11 +806,53 @@ public class FileUtils { } sb.append(s.elementAt(i)); } - path = sb.toString(); - if (dosWithDrive) { - path = path.replace('/', '\\'); + return new File(sb.toString()); + } + + /** + * Dissect the specified absolute path. + * @param path the path to dissect. + * @return String[] {root, remaining path}. + * @throws java.lang.NullPointerException if path is null. + */ + public String[] dissect(String path) { + char sep = File.separatorChar; + path = path.replace('/', sep).replace('\\', sep); + + // make sure we are dealing with an absolute path + if (!isAbsolutePath(path)) { + throw new BuildException(path + " is not an absolute path"); + } + String root = null; + int colon = path.indexOf(':'); + if (colon > 0 && (onDos || onNetWare)) { + + int next = colon + 1; + root = path.substring(0, next).toUpperCase(); + char[] ca = path.toCharArray(); + root += sep; + //remove the initial separator; the root has it. + next = (ca[next] == sep) ? next + 1 : next; + + StringBuffer sbPath = new StringBuffer(); + // Eliminate consecutive slashes after the drive spec: + for (int i = next; i < ca.length; i++) { + if (ca[i] != sep || ca[i - 1] != sep) { + sbPath.append(ca[i]); + } + } + path = sbPath.toString(); + } else if (path.length() > 1 && path.charAt(1) == sep) { + // UNC drive + int nextsep = path.indexOf(sep, 2); + nextsep = path.indexOf(sep, nextsep + 1); + root = (nextsep > 2) ? path.substring(0, nextsep + 1) : path; + path = path.substring(root.length()); + } else { + root = File.separator; + path = path.substring(1); } - return new File(path); + return new String[] {root, path}; } /** @@ -1213,22 +1228,16 @@ public class FileUtils { * @since Ant 1.6 */ public String toURI(String path) { - boolean isDir = (new File(path)).isDirectory(); + boolean isDir = new File(path).isDirectory(); StringBuffer sb = new StringBuffer("file:"); - // catch exception if normalize thinks this is not an absolute path - try { - path = normalize(path).getAbsolutePath(); - sb.append("//"); - // add an extra slash for filesystems with drive-specifiers - if (!path.startsWith(File.separator)) { - sb.append("/"); - } - } catch (BuildException e) { - // relative path + path = resolveFile(null, path).getPath(); + sb.append("//"); + // add an extra slash for filesystems with drive-specifiers + if (!path.startsWith(File.separator)) { + sb.append("/"); } - path = path.replace('\\', '/'); CharacterIterator iter = new StringCharacterIterator(path); diff --git a/src/testcases/org/apache/tools/ant/ProjectTest.java b/src/testcases/org/apache/tools/ant/ProjectTest.java index 3f60f935b..8524f3f35 100644 --- a/src/testcases/org/apache/tools/ant/ProjectTest.java +++ b/src/testcases/org/apache/tools/ant/ProjectTest.java @@ -48,7 +48,7 @@ public class ProjectTest extends TestCase { public void setUp() { p = new Project(); p.init(); - root = new File(File.separator).getAbsolutePath(); + root = new File(File.separator).getAbsolutePath().toUpperCase(); mbl = new MockBuildListener(p); } @@ -67,15 +67,11 @@ public class ProjectTest extends TestCase { * This test has been a starting point for moving the code to FileUtils. */ public void testResolveFile() { - /* - * Start with simple absolute file names. - */ - assertEquals(File.separator, - p.resolveFile("/", null).getPath()); - assertEquals(File.separator, - p.resolveFile("\\", null).getPath()); - if (Os.isFamily("netware") || Os.isFamily("dos")) { + assertEqualsIgnoreDriveCase(localize(File.separator), + p.resolveFile("/", null).getPath()); + assertEqualsIgnoreDriveCase(localize(File.separator), + p.resolveFile("\\", null).getPath()); /* * throw in drive letters */ @@ -97,19 +93,27 @@ public class ProjectTest extends TestCase { assertEquals(driveSpec + "\\", p.resolveFile(driveSpec + "\\\\\\\\\\\\", null).getPath()); } else { + /* + * Start with simple absolute file names. + */ + assertEquals(File.separator, + p.resolveFile("/", null).getPath()); + assertEquals(File.separator, + p.resolveFile("\\", null).getPath()); /* * drive letters are not used, just to be considered as normal * part of a name */ String driveSpec = "C:"; - assertEquals(driveSpec, + String udir = System.getProperty("user.dir") + File.separatorChar; + assertEquals(udir + driveSpec, p.resolveFile(driveSpec + "/", null).getPath()); - assertEquals(driveSpec, + assertEquals(udir + driveSpec, p.resolveFile(driveSpec + "\\", null).getPath()); String driveSpecLower = "c:"; - assertEquals(driveSpecLower, + assertEquals(udir + driveSpecLower, p.resolveFile(driveSpecLower + "/", null).getPath()); - assertEquals(driveSpecLower, + assertEquals(udir + driveSpecLower, p.resolveFile(driveSpecLower + "\\", null).getPath()); } /* @@ -142,6 +146,24 @@ public class ProjectTest extends TestCase { return path.replace('\\', File.separatorChar).replace('/', File.separatorChar); } + /** + * convenience method + * the drive letter is in lower case under cygwin + * calling this method allows tests where FileUtils.normalize + * is called via resolveFile to pass under cygwin + */ + private void assertEqualsIgnoreDriveCase(String s1, String s2) { + if ((Os.isFamily("dos") || Os.isFamily("netware")) + && s1.length() >= 1 && s2.length() >= 1) { + StringBuffer sb1 = new StringBuffer(s1); + StringBuffer sb2 = new StringBuffer(s2); + sb1.setCharAt(0, Character.toUpperCase(s1.charAt(0))); + sb2.setCharAt(0, Character.toUpperCase(s2.charAt(0))); + assertEquals(sb1.toString(), sb2.toString()); + } else { + assertEquals(s1, s2); + } + } private void assertTaskDefFails(final Class taskClass, final String message) { diff --git a/src/testcases/org/apache/tools/ant/taskdefs/DirnameTest.java b/src/testcases/org/apache/tools/ant/taskdefs/DirnameTest.java index bedb038ce..b95243843 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/DirnameTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/DirnameTest.java @@ -19,6 +19,7 @@ package org.apache.tools.ant.taskdefs; import java.io.File; import org.apache.tools.ant.BuildFileTest; +import org.apache.tools.ant.taskdefs.condition.Os; /** */ @@ -45,6 +46,9 @@ public class DirnameTest extends BuildFileTest { } public void test4() { + if (Os.isFamily("netware") || Os.isFamily("dos")) { + return; + } executeTarget("test4"); String filesep = System.getProperty("file.separator"); String expected = filesep + "usr" + filesep + "local"; diff --git a/src/testcases/org/apache/tools/ant/types/PathTest.java b/src/testcases/org/apache/tools/ant/types/PathTest.java index 6e9693b0c..e0d95cc08 100644 --- a/src/testcases/org/apache/tools/ant/types/PathTest.java +++ b/src/testcases/org/apache/tools/ant/types/PathTest.java @@ -60,8 +60,9 @@ public class PathTest extends TestCase { assertEquals("\\a", l[0]); assertEquals("\\b", l[1]); } else { - assertEquals(":\\a", l[0].substring(1)); - assertEquals(":\\b", l[1].substring(1)); + String base = new File(File.separator).getAbsolutePath().toUpperCase(); + assertEquals(base + "a", l[0]); + assertEquals(base + "b", l[1]); } } @@ -99,8 +100,9 @@ public class PathTest extends TestCase { assertEquals("\\a", l[0]); assertEquals("\\b", l[1]); } else { - assertEquals(":\\a", l[0].substring(1)); - assertEquals(":\\b", l[1].substring(1)); + String base = new File(File.separator).getAbsolutePath().toUpperCase(); + assertEquals(base + "a", l[0]); + assertEquals(base + "b", l[1]); } p = new Path(project, "c:\\test"); @@ -307,9 +309,10 @@ public class PathTest extends TestCase { assertEquals("\\b", l[1]); assertEquals("\\c", l[2]); } else { - assertEquals(":\\a", l[0].substring(1)); - assertEquals(":\\b", l[1].substring(1)); - assertEquals(":\\c", l[2].substring(1)); + String base = new File(File.separator).getAbsolutePath().toUpperCase(); + assertEquals(base + "a", l[0]); + assertEquals(base + "b", l[1]); + assertEquals(base + "c", l[2]); } } @@ -366,7 +369,8 @@ public class PathTest extends TestCase { Path p = new Path(project, "/a:/a"); String[] l = p.list(); assertEquals("1 after construction", 1, l.length); - p.setLocation(new File(File.separatorChar+"a")); + String base = new File(File.separator).getAbsolutePath().toUpperCase(); + p.setLocation(new File(base, "a")); l = p.list(); assertEquals("1 after setLocation", 1, l.length); p.setPath("\\a;/a"); diff --git a/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java b/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java index 8dbe3df61..a5da6914e 100644 --- a/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java +++ b/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java @@ -101,15 +101,19 @@ public class FileUtilsTest extends TestCase { } public void testResolveFile() { - /* - * Start with simple absolute file names. - */ - assertEquals(File.separator, - FILE_UTILS.resolveFile(null, "/").getPath()); - assertEquals(File.separator, - FILE_UTILS.resolveFile(null, "\\").getPath()); - - if (Os.isFamily("dos")) { + if (!(Os.isFamily("dos") || Os.isFamily("netware"))) { + /* + * Start with simple absolute file names. + */ + assertEquals(File.separator, + FILE_UTILS.resolveFile(null, "/").getPath()); + assertEquals(File.separator, + FILE_UTILS.resolveFile(null, "\\").getPath()); + } else { + assertEqualsIgnoreDriveCase(localize(File.separator), + FILE_UTILS.resolveFile(null, "/").getPath()); + assertEqualsIgnoreDriveCase(localize(File.separator), + FILE_UTILS.resolveFile(null, "\\").getPath()); /* * throw in drive letters */ @@ -130,7 +134,8 @@ public class FileUtilsTest extends TestCase { FILE_UTILS.resolveFile(null, driveSpec + "/////").getPath()); assertEquals(driveSpec + "\\", FILE_UTILS.resolveFile(null, driveSpec + "\\\\\\\\\\\\").getPath()); - } else if (Os.isFamily("netware")) { + } + if (Os.isFamily("netware")) { /* * throw in NetWare volume names */ @@ -151,19 +156,20 @@ public class FileUtilsTest extends TestCase { FILE_UTILS.resolveFile(null, driveSpec + "/////").getPath()); assertEquals(driveSpec, FILE_UTILS.resolveFile(null, driveSpec + "\\\\\\\\\\\\").getPath()); - } else { + } else if (!(Os.isFamily("dos"))) { /* * drive letters must be considered just normal filenames. */ String driveSpec = "C:"; - assertEquals(driveSpec, + String udir = System.getProperty("user.dir"); + assertEquals(udir + File.separator + driveSpec, FILE_UTILS.resolveFile(null, driveSpec + "/").getPath()); - assertEquals(driveSpec, + assertEquals(udir + File.separator + driveSpec, FILE_UTILS.resolveFile(null, driveSpec + "\\").getPath()); String driveSpecLower = "c:"; - assertEquals(driveSpecLower, + assertEquals(udir + File.separator + driveSpecLower, FILE_UTILS.resolveFile(null, driveSpecLower + "/").getPath()); - assertEquals(driveSpecLower, + assertEquals(udir + File.separator + driveSpecLower, FILE_UTILS.resolveFile(null, driveSpecLower + "\\").getPath()); } @@ -197,21 +203,37 @@ public class FileUtilsTest extends TestCase { } public void testNormalize() { - /* - * Start with simple absolute file names. - */ - assertEquals(File.separator, - FILE_UTILS.normalize("/").getPath()); - assertEquals(File.separator, - FILE_UTILS.normalize("\\").getPath()); + if (!(Os.isFamily("dos") || Os.isFamily("netware"))) { + /* + * Start with simple absolute file names. + */ + assertEquals(File.separator, + FILE_UTILS.normalize("/").getPath()); + assertEquals(File.separator, + FILE_UTILS.normalize("\\").getPath()); + } else { + try { + FILE_UTILS.normalize("/").getPath(); + fail("normalized \"/\" on dos or netware"); + } catch (Exception e) { + } + try { + FILE_UTILS.normalize("\\").getPath(); + fail("normalized \"\\\" on dos or netware"); + } catch (Exception e) { + } + } if (Os.isFamily("dos")) { /* * throw in drive letters */ String driveSpec = "C:"; - assertEquals(driveSpec, - FILE_UTILS.normalize(driveSpec).getPath()); + try { + FILE_UTILS.normalize(driveSpec).getPath(); + fail(driveSpec + " is not an absolute path"); + } catch (Exception e) { + } assertEquals(driveSpec + "\\", FILE_UTILS.normalize(driveSpec + "/").getPath()); assertEquals(driveSpec + "\\", @@ -313,7 +335,7 @@ public class FileUtilsTest extends TestCase { } File f = FILE_UTILS.resolveFile(null, "a"); - assertEquals(f, new File("a")); + assertEquals(f, new File("a").getAbsoluteFile()); } /** @@ -390,10 +412,12 @@ public class FileUtilsTest extends TestCase { new File("c:\\foo\\bar"))); assertEquals("bar", FILE_UTILS.removeLeadingPath(new File("c:\\foo\\"), new File("c:\\foo\\bar"))); - assertEqualsIgnoreDriveCase(FILE_UTILS.normalize("/bar").getAbsolutePath(), - FILE_UTILS.removeLeadingPath(new File("/foo"), new File("/bar"))); - assertEqualsIgnoreDriveCase(FILE_UTILS.normalize("/foobar").getAbsolutePath(), - FILE_UTILS.removeLeadingPath(new File("/foo"), new File("/foobar"))); + if (!(Os.isFamily("dos") || Os.isFamily("netware"))) { + assertEquals(FILE_UTILS.normalize("/bar").getAbsolutePath(), + FILE_UTILS.removeLeadingPath(new File("/foo"), new File("/bar"))); + assertEquals(FILE_UTILS.normalize("/foobar").getAbsolutePath(), + FILE_UTILS.removeLeadingPath(new File("/foo"), new File("/foobar"))); + } // bugzilla report 19979 assertEquals("", FILE_UTILS.removeLeadingPath(new File("/foo/bar"), new File("/foo/bar"))); @@ -419,8 +443,9 @@ public class FileUtilsTest extends TestCase { */ public void testToURI() { String dosRoot = null; - if (Os.isFamily("dos")) { - dosRoot = System.getProperty("user.dir").charAt(0) + ":/"; + if (Os.isFamily("dos") || Os.isFamily("netware")) { + dosRoot = Character.toUpperCase( + System.getProperty("user.dir").charAt(0)) + ":/"; } else { @@ -457,11 +482,11 @@ public class FileUtilsTest extends TestCase { if (Os.isFamily("dos")) { assertEqualsIgnoreDriveCase("C:\\foo", FILE_UTILS.fromURI("file:///c:/foo")); } - assertEqualsIgnoreDriveCase(localize("/foo"), FILE_UTILS.fromURI("file:///foo")); + assertEqualsIgnoreDriveCase(File.separator + "foo", FILE_UTILS.fromURI("file:///foo")); assertEquals("." + File.separator + "foo", FILE_UTILS.fromURI("file:./foo")); - assertEqualsIgnoreDriveCase(localize("/foo bar"), FILE_UTILS.fromURI("file:///foo%20bar")); - assertEqualsIgnoreDriveCase(localize("/foo#bar"), FILE_UTILS.fromURI("file:///foo%23bar")); + assertEquals(File.separator + "foo bar", FILE_UTILS.fromURI("file:///foo%20bar")); + assertEquals(File.separator + "foo#bar", FILE_UTILS.fromURI("file:///foo%23bar")); } public void testModificationTests() { @@ -493,6 +518,7 @@ public class FileUtilsTest extends TestCase { path = root + path.substring(1); return path.replace('\\', File.separatorChar).replace('/', File.separatorChar); } + /** * convenience method * normalize brings the drive in uppercase @@ -500,14 +526,15 @@ public class FileUtilsTest extends TestCase { * calling this method allows tests where normalize is called to pass under cygwin */ private void assertEqualsIgnoreDriveCase(String s1, String s2) { - if (Os.isFamily("dos") && s1.length()>=1 && s2.length()>=1) { - StringBuffer sb1= new StringBuffer(s1); - StringBuffer sb2= new StringBuffer(s2); - sb1.setCharAt(0,Character.toUpperCase(s1.charAt(0))); - sb2.setCharAt(0,Character.toUpperCase(s2.charAt(0))); - assertEquals(sb1.toString(),sb2.toString()); - } else { - assertEquals(s1,s2); + if ((Os.isFamily("dos") || Os.isFamily("netware")) + && s1.length() > 0 && s2.length() > 0) { + StringBuffer sb1 = new StringBuffer(s1); + StringBuffer sb2 = new StringBuffer(s2); + sb1.setCharAt(0, Character.toUpperCase(s1.charAt(0))); + sb2.setCharAt(0, Character.toUpperCase(s2.charAt(0))); + assertEquals(sb1.toString(), sb2.toString()); + } else { + assertEquals(s1, s2); } } }