Works fine on Fedora 10, ext2, ext3 and ntfs mounted with ntfs-3g (fuseblk) For the mounted ntfs partition I had to use CaseSensitive.
Maarten On Thu, Mar 5, 2009 at 10:39 AM, Emmanuel Lecharny <elecha...@apache.org>wrote: > Works fine on my Mac OS X 10.4/Java 5 > > On Wed, Mar 4, 2009 at 11:13 PM, Niklas Gustavsson <nik...@protocol7.com> > wrote: > > On Mon, Mar 2, 2009 at 4:54 PM, Niklas Gustavsson <nik...@protocol7.com> > wrote: > >> Let me whip up a prototype and we can test it on the available > platforms. > > > > Alright, here's a prototype that I would much appreciate if all of you > > would take the time to test. First of all, you need to set the > > FILE_SYSTEM_TYPE to the correct value (this is only used for > > verification in the tests). On case sensitive file systems (most of > > the *nix file systems), this should be set to > > FileSystemType.CaseSensitive. On NTFS it should be set to > > CaseInsensitiveMissingAsTrue, and on case-insensitive HFS to > > CaseInsensitiveMissingAsFalse. It would be very interesting to have > > this code tested on other file systems. If you do, please report the > > file system and the test results. > > > > /niklas > > > > package org.apache.ftpserver.filesystem.nativefs.impl; > > > > import java.io.File; > > import java.io.FilenameFilter; > > import java.io.IOException; > > > > import junit.framework.TestCase; > > > > public class FileEqualsTest extends TestCase { > > > > private enum FileSystemType { > > CaseSensitive, > > // non-existing files with different casing are equal > > // e.g. NTFS > > CaseInsensitiveMissingAsTrue, > > // non-existing files with different casing are non-equal > > // e.g. HFS > > CaseInsensitiveMissingAsFalse > > }; > > > > private static final FileSystemType FILE_SYSTEM_TYPE = > > FileSystemType.CaseSensitive; > > > > private boolean isCaseSensitive() { > > return FILE_SYSTEM_TYPE == FileSystemType.CaseSensitive; > > } > > > > private boolean isCaseInsensitive() { > > return FILE_SYSTEM_TYPE != FileSystemType.CaseSensitive; > > } > > > > @Override > > protected void setUp() throws Exception { > > System.out.println("File system type: " + FILE_SYSTEM_TYPE); > > super.setUp(); > > } > > > > public void testSimple() throws IOException { > > File f1 = new File("foo"); > > assertTrue(f1.createNewFile()); > > File f2 = new File("foo"); > > > > assertTrue(equals(f1, f2)); > > } > > > > public void testNonExistingButSimple() { > > File f1 = new File("foo"); > > File f2 = new File("foo"); > > > > assertTrue(equals(f1, f2)); > > } > > > > public void testDifferentCase() throws IOException { > > File f1 = new File("foo"); > > assertTrue(f1.createNewFile()); > > File f2 = new File("FOO"); > > > > // if this succeeds, we have two different files > > assertEquals(isCaseSensitive(), f2.createNewFile()); > > > > assertEquals(isCaseInsensitive(), equals(f1, f2)); > > } > > > > public void testDifferentCaseNonExisting() throws IOException { > > File f1 = new File("foo"); > > File f2 = new File("FOO"); > > > > assertEquals(FILE_SYSTEM_TYPE == > > FileSystemType.CaseInsensitiveMissingAsTrue, equals(f1, f2)); > > } > > > > public void testSameNameDifferentParent() throws IOException { > > File f1 = new File("foo"); > > assertTrue(f1.createNewFile()); > > File dir2 = new File("dir"); > > assertTrue(dir2.mkdir()); > > File f2 = new File(dir2, "foo"); > > assertTrue(f2.createNewFile()); > > > > assertFalse(equals(f1, f2)); > > } > > > > public boolean equals(final File f1, final File f2) { > > if (f1 == null || f2 == null) { > > return false; > > } > > > > if (f1.equals(f2)) { > > // file equals, valid on all file systems > > return true; > > } else { > > boolean f1Exists = f1.exists(); > > boolean f2Exists = f2.exists(); > > > > if (f1.getName().equalsIgnoreCase(f2.getName())) { > > // same name, do both exist? > > if (f1Exists && f2Exists) { > > // both files exists, do they have the same parent? > > > > // TODO should we use canonical or absolute path? > > File f1Parent = f1.getAbsoluteFile().getParentFile(); > > File f2Parent = f2.getAbsoluteFile().getParentFile(); > > > > if (f1Parent != null && f2Parent != null) { > > if (equals(f1Parent, f2Parent)) { > > // okay, if we got here, the parents are the > same, > > // the file names are the same and both files > exists > > // let's check if there are multiple files > > or only one in the parent > > // with that name > > > > > > // choosing either parent should be fine, > > they are equal > > String[] files = f1Parent > > .list(new FilenameFilter() { > > public boolean accept(File > > dir, String name) { > > return > name.equalsIgnoreCase(f1 > > .getName()); > > } > > }); > > > > if (files.length == 1) { > > // exactly one file matched the name, > > the files must be equal > > return true; > > } else if (files.length > 1) { > > return false; > > } else { > > // no file matching, must be a bug > somewhere > > throw new RuntimeException("Should not > happen"); > > } > > } else { > > // different parents, return false > > return false; > > } > > } else if (f1Parent == null && f2Parent == null) { > > // no parents, we can do nothing more and thus > > have to return false > > return false; > > } else { > > // different parents > > return false; > > } > > } else if (!f1Exists && !f2Exists) { > > // none of the file exists, we can only trust the > > equals result (which by now must be false) > > return false; > > } else { > > // only one of the files exists, return false > > return false; > > } > > } else { > > // file names not equal > > return false; > > } > > } > > } > > > > @Override > > protected void tearDown() throws Exception { > > new File("foo").delete(); > > new File("FOO").delete(); > > new File("dir/foo").delete(); > > new File("dir").delete(); > > } > > > > } > > > > > > -- > Regards, > Cordialement, > Emmanuel Lécharny > www.iktek.com >